From a2f1b72204b57ba6336bd5c59dc52b5b49a66662 Mon Sep 17 00:00:00 2001 From: Yiffy Dev Date: Wed, 30 Oct 2024 10:59:43 +0500 Subject: [PATCH 001/184] initial os release. I really expect SO much bugs, guys. good luck =) --- .gitignore | 4 + Cargo.lock | 1476 ++++++++++++++++++++ Cargo.toml | 80 ++ LICENSE | 0 README.md | 589 ++++++++ examples/define-styles/Cargo.lock | 1483 ++++++++++++++++++++ examples/define-styles/Cargo.toml | 9 + examples/define-styles/src/lib.rs | 104 ++ examples/leptos-axum/.gitignore | 14 + examples/leptos-axum/Cargo.toml | 67 + examples/leptos-axum/LICENSE | 24 + examples/leptos-axum/README.md | 90 ++ examples/leptos-axum/build.rs | 11 + examples/leptos-axum/public/favicon.ico | Bin 0 -> 15406 bytes examples/leptos-axum/src/lib.rs | 10 + examples/leptos-axum/src/main.rs | 38 + examples/leptos-axum/src/routes/home.rs | 33 + examples/leptos-axum/src/routes/home.scss | 12 + examples/leptos-axum/src/routes/mod.rs | 1 + examples/leptos-axum/src/shell.rs | 43 + examples/use-styles/Cargo.lock | 1491 +++++++++++++++++++++ examples/use-styles/Cargo.toml | 24 + examples/use-styles/assets/prelude.css | 4 + examples/use-styles/build.rs | 22 + examples/use-styles/src/main.rs | 17 + examples/use-styles/src/main.sass | 12 + sabry_build/Cargo.toml | 28 + sabry_build/src/buildmagic.rs | 305 +++++ sabry_build/src/filevisit.rs | 51 + sabry_build/src/lib.rs | 3 + sabry_intrnl/Cargo.toml | 28 + sabry_intrnl/src/compiler/mod.rs | 120 ++ sabry_intrnl/src/config/manifest.rs | 44 + sabry_intrnl/src/config/mod.rs | 253 ++++ sabry_intrnl/src/lib.rs | 4 + sabry_intrnl/src/scoper/hash.rs | 97 ++ sabry_intrnl/src/scoper/mod.rs | 423 ++++++ sabry_intrnl/src/syntax/mod.rs | 226 ++++ sabry_procmacro/Cargo.toml | 22 + sabry_procmacro/src/lib.rs | 117 ++ sabry_procmacro_impl/Cargo.toml | 26 + sabry_procmacro_impl/src/impls/mod.rs | 202 +++ sabry_procmacro_impl/src/impls/sassy.rs | 68 + sabry_procmacro_impl/src/impls/styly.rs | 209 +++ sabry_procmacro_impl/src/impls/usey.rs | 71 + sabry_procmacro_impl/src/lib.rs | 4 + src/lib.rs | 6 + 47 files changed, 7965 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 examples/define-styles/Cargo.lock create mode 100644 examples/define-styles/Cargo.toml create mode 100644 examples/define-styles/src/lib.rs create mode 100644 examples/leptos-axum/.gitignore create mode 100644 examples/leptos-axum/Cargo.toml create mode 100644 examples/leptos-axum/LICENSE create mode 100644 examples/leptos-axum/README.md create mode 100644 examples/leptos-axum/build.rs create mode 100644 examples/leptos-axum/public/favicon.ico create mode 100644 examples/leptos-axum/src/lib.rs create mode 100644 examples/leptos-axum/src/main.rs create mode 100644 examples/leptos-axum/src/routes/home.rs create mode 100644 examples/leptos-axum/src/routes/home.scss create mode 100644 examples/leptos-axum/src/routes/mod.rs create mode 100644 examples/leptos-axum/src/shell.rs create mode 100644 examples/use-styles/Cargo.lock create mode 100644 examples/use-styles/Cargo.toml create mode 100644 examples/use-styles/assets/prelude.css create mode 100644 examples/use-styles/build.rs create mode 100644 examples/use-styles/src/main.rs create mode 100644 examples/use-styles/src/main.sass create mode 100644 sabry_build/Cargo.toml create mode 100644 sabry_build/src/buildmagic.rs create mode 100644 sabry_build/src/filevisit.rs create mode 100644 sabry_build/src/lib.rs create mode 100644 sabry_intrnl/Cargo.toml create mode 100644 sabry_intrnl/src/compiler/mod.rs create mode 100644 sabry_intrnl/src/config/manifest.rs create mode 100644 sabry_intrnl/src/config/mod.rs create mode 100644 sabry_intrnl/src/lib.rs create mode 100644 sabry_intrnl/src/scoper/hash.rs create mode 100644 sabry_intrnl/src/scoper/mod.rs create mode 100644 sabry_intrnl/src/syntax/mod.rs create mode 100644 sabry_procmacro/Cargo.toml create mode 100644 sabry_procmacro/src/lib.rs create mode 100644 sabry_procmacro_impl/Cargo.toml create mode 100644 sabry_procmacro_impl/src/impls/mod.rs create mode 100644 sabry_procmacro_impl/src/impls/sassy.rs create mode 100644 sabry_procmacro_impl/src/impls/styly.rs create mode 100644 sabry_procmacro_impl/src/impls/usey.rs create mode 100644 sabry_procmacro_impl/src/lib.rs create mode 100644 src/lib.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f276f31 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +**/target +rust-toolchain.toml +.vscode +.profile diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..80d7a63 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1476 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "anstream" +version = "0.6.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" + +[[package]] +name = "cc" +version = "1.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "codemap" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "const_format" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.2", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.85", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "grass" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" +dependencies = [ + "clap", + "getrandom", + "grass_compiler", +] + +[[package]] +name = "grass_compiler" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" +dependencies = [ + "codemap", + "indexmap", + "lasso", + "once_cell", + "phf 0.11.2", + "rand", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lasso" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.161" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" + +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" +dependencies = [ + "ahash 0.8.11", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom", + "itertools", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "paste", + "pathdiff", + "rayon", + "serde", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + +[[package]] +name = "parcel_selectors" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" +dependencies = [ + "bitflags", + "cssparser", + "fxhash", + "log", + "phf 0.10.1", + "phf_codegen", + "precomputed-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" +dependencies = [ + "base64-simd", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "raffia" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" +dependencies = [ + "raffia_macro", + "smallvec", +] + +[[package]] +name = "raffia_macro" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" +dependencies = [ + "heck", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "sabry" +version = "0.0.1" +dependencies = [ + "sabry_build", + "sabry_intrnl", + "sabry_procmacro", +] + +[[package]] +name = "sabry_build" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "sabry_intrnl", + "sabry_procmacro_impl", + "syn 2.0.85", + "thiserror", + "walkdir", +] + +[[package]] +name = "sabry_intrnl" +version = "0.0.1" +dependencies = [ + "base64", + "blake3", + "const_format", + "grass", + "lightningcss", + "proc-macro2", + "raffia", + "regex", + "serde", + "syn 2.0.85", + "thiserror", + "toml", +] + +[[package]] +name = "sabry_procmacro" +version = "0.0.1" +dependencies = [ + "sabry_procmacro_impl", +] + +[[package]] +name = "sabry_procmacro_impl" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "raffia", + "regex", + "sabry_intrnl", + "syn 2.0.85", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "serde" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "serde_json" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..c31dc20 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,80 @@ +[workspace] +resolver = "2" +members = [ + "sabry_procmacro", + "sabry_procmacro_impl", + "sabry_intrnl", +] +exclude = [ + "examples" +] + +[workspace.dependencies] +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1"} +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1"} +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1"} +sabry_build = {path = "sabry_build", version = "0.0.1"} + +syn = {version = "^2.0"} +quote = {version = "^1.0"} +proc-macro2 = {version = "^1.0"} +raffia = {version = "^0.9"} +regex = {version = "^1.11"} +grass = {version = "^0.13"} +lightningcss = {version = "1.0.0-alpha.59"} +blake3 = {version = "^1.5"} +base64 = {version = "^0.22"} +const_format = {version = "^0.2"} + +thiserror = {version = "^1.0"} +serde = {version = "^1.0"} +toml = {version = "^0.8"} + + +[workspace.package] +version = "0.0.1" +edition = "2021" +rust-version = "1.82" +authors = ["Svyatoslav Pushkarev "] +license = "MIT" +publish = true + +[package] +name = "sabry" +description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust." +keywords = ["web", "sass", "scss", "macro"] +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true +publish.workspace = true + +[dependencies] +sabry_procmacro = {workspace = true, optional = true} +sabry_build = {workspace = true, optional = true} +sabry_intrnl = {workspace = true} + +[features] +default = ["scss"] +procmacro = [ + "dep:sabry_procmacro" +] +sass = [ + "procmacro", + "sabry_procmacro/sass", + "sabry_intrnl/sass", + "sabry_build/sass" +] +scss = [ + "procmacro", + "sabry_procmacro/scss", + "sabry_intrnl/scss", + "sabry_build/scss" +] +build = [ + "dep:sabry_build" +] +net-files = [ + "sabry_build/net-files" +] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e969449 --- /dev/null +++ b/README.md @@ -0,0 +1,589 @@ +# 🧙🏻 SABRY - Syntactically Awesome, But RustY + +**Y**et another **R**usty **B**oilerplate-free **A**gnostic **S**tyling crate, which brings your SASS/SCSS style into Rust. Written by a fox this time. + +\* sabry isn't "syntactically awesome", it refers to SASS abbr expansion. + +> **Project status** - early, good enough for my team's non-critical "for-fun" pre-production, on demand. WIP features have no ETA. I'm pretty happy with ergonomics and taste of the crate, and I'll do my best to keep DX the way it is between minor versions - but there's no guarantee on backwards-compatibility and no refunds if something breaks. +> +> "master" branch is what's currently on crates.io +> +> each version ever been on crates.io (except the latest release) is available in "r_x.x.x" branch +> +> the latest-trashy state is in the "window" branch + +At first, I'll show how this crate "tastes". With SABRY, its in your power to: + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with modules, with feature flags, etc. Say "bye" to manual copying, cli-tools and consts. + +```rust +sassy!(tokens {@mixin colored{color: red;}}); +``` + + +📦 +
+ +Code your SASS in separate files to get proper syntax highlighting, or do sass-in-the-rust to keep things in one place + +```rust +styly!(component {.btn {color: green;}}); +styly!(extras "src/components/extras.scss"); +``` + + +:3 +
+ +Depend on styles with cargo, at build time, which brings all the rusty sweeties in: versions, updates, cratesio, local registries, workspaces, etc. + +```toml +[build-dependencies] +tgk_brandstyle = {version = "0.0.1", features = ["utils"]} +``` + + +🦀 +
+ +`@use` your style-crates in sass code *naturally* + +```rust +styly!(breadcumb { + @use 'tokens'; + .scope {@include tokens.badge(primary);} +}) +``` + + +🪄 +
+ +Keep things as private and modular as you wish + +```rust +styly!(pub cats "src/sections/cats/style.scss"); +styly!(dogs {#howl {border: none;}}) + +/// something like render function +{ +
+
    +
    +} +``` + +
    +^_^ +
    + +Compile all the sweet SASS/SCSS into the optimized CSS bundle, ship it in CSS shunks or even include the compiled style into the binary + +```rust +styly!(cssbundle {.c1 {color: white;}}) +styly!(const binary {.c2 {color: black;}}) +``` + + +🏗️ +
    + +Sabry will gladly: + +- scope and hash your styles, so they won't conflict, with amazing [raffia](https://crates.io/crates/raffia) parser +- compile SASS/SCSS into CSS with [grass](https://crates.io/crates/grass) +- optimize produced CSS with [lightningcss](https://crates.io/crates/lightningcss) +- prepare ready CSS bundle and put it wherever you wish +- include CSS into the build artifact - if you really want it + +Also, just about everything is pub-available in this crate - Sabry is ready for experiments. + + +## Usage + +Feel free to check out examples: + +|[crate of styles](./examples//define-styles/)|[style usage](./examples/use-styles/)|[leptox-axum with sabry](./examples/leptos-axum)| +|-|-|-| + +### Create a crate full of arbitrary SASS + +The only need is the dependency + +```toml +#Cargo.toml + +[dependencies] +sabry = {version = "0.0.1"} +``` +And a proc-macro +```rust +// lib.rs +use sabry::sassy; + +sassy!(mixins "assets/mixins.scss"); +sassy!(styles { + $primary-color: black; + @mixin colored($col: primary) { + @if $col == primary { + color: $primary-color; + } @else { + color: $col; + } + } +}); +``` +Now you can build and see two ready for export macros: `mixins!` and `styles!`. +These are usefull on their own, as invocation of `mixins!()` or `styles!()` - both shall give you the code literal. + +However there's more sweet use case for them, which is covered below. + +### Write scoped styles + +Depend on sabry +```toml +# Cargo.toml + +[dependencies] +sabry = {version = "0.0.1"} +``` +And create a style scope wherever you want: +```rust +// breadcumblist.rs +use sabry::styly; + +styly!(const styles { + .cumbs { + display: flex; + &__list { + display: flex; + } + } + #wolf { + color: white; + } +}); + +fn render() -> HtmlElement { + div().class(styles::cumbs).chain( + ul().class(styles::_list(styles::cumbs)) + ).chain( + span().id(styles::thewolf) + ) +} +``` +> That `const` usage is covered in the [following](#constant-styly-scopes) section. In this example we dont invoke sabry build-magic, so, to be as close to real life as possible, I used a const. + +Every selector, if that does make sense, now available for you as a member of `styles` scope. In this example - `styles::cumbs`, `styles::thewolf` and `styles::_list()`. More about scoping and member names you can read [here](#styly-scopes). + +### Use styles earlier created in another crate + +The combination of previous two, with some additional work to do and some extra sugar to enjoy. + +Sabry is needed as both dependency and build-dependency. +To be able to compile all styles sabry also needs the *build* feature flag: +```toml +# Cargo.toml + +[dependencies] +sabry = {version = "0.0.1"} + +[build-dependencies] +sabry = {version = "0.0.1", features = ["build"]} +``` +> If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. + +Then you have to tell sabry when code should be compiled. We'll do this in *build.rs* file. +```rust +// build.rs +use shared_styles::{mixins, styles}; + +fn main(){ + sabry::buildy( + sabry::usey!( + mixins!(), + styles!() + ) + ).expect("Failed to build sabry styles"); +} +``` +`buildy` is the entry function of sabry build-time process. The handy `usey!` macro will do just proper handling of our style-macros for it. + +Now lets get back to the code and use the mixin defined in another crate: +```rust +// breadcumblist.rs +use sabry::styly; + +styly!(styles { + @use "mixins"; + .cumbs { + display: flex; + &__list { + display: flex; + } + } + #wolf { + @include mixins.colored(white); + } +}); + +fn render() -> HtmlElement { + div().class(styles::cumbs).chain( + ul().class(styles::_list(styles::cumbs)) + ).chain( + span().id(styles::thewolf) + ) +} +``` +So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` function call is now accessible with simple and natural `@use "mixins"` SASS rule! + +## Configuration + +Sabry configuration lives in `[package.metadata.sabry]` table of the manifest file. + +All configurations are optional, but with default configuration sabry won't produce any CSS files. + +Full example, close to defaults: +```toml +# Cargo.toml + +[package.metadata.sabry] +css.bundle = "target/static/style.css" +css.bundle_prelude = ["assets/prelude.css"] +css.scopes = "target/statis/scopes/" +css.minify = true + +sass.intermediate_dir = "target/.sabry/sass" +sass.module_name_collision = "merge" +sass.modules = ["assets/sass/mod1.scss"] +sass.scanroot = "src" + +hash.size = 6 +hash.collision = "error" +hash.use_scope_name = true +hash.use_code_size = true +hash.use_item_names = false +hash.use_code_text = false + +[package.metadata.sabry.lightningcss.targets] +chrome = "120" +safari = "13.2" +ie = "6" +``` + +### `sabry.css` + +**bundle** *(no default)* - file path ro write CSS bundle into relative to project root + +**bundle_prelude** *(no default)* - collection of CSS files, relative to the project root, which content will be inserted before the compiled style into the *bundle* file if any + +**scopes** *(no default)* - dir path to put separate CSS for every scope into relative to project root + +**minify** *(default true)* - print compressed CSS output and do the lightningcss thing + +### `sabry.sass` + +**intermediate_dir** *(default "target/.sabry/sass")* - file to put SASS/SCSS modules into so they are available with `@use` in code + +**scanroot** *(default "src")* - root directory to start scanning "rs" files from. Used in build function + +**modules** *(no default)* - collection of SASS/SCSS files, relative to the project root, which should be available as modules as well + +**module_name_collision** *(default "merge")* - how to handle similary named modules. + +*merge* - merge content + +*error* - break building process with an error + +### `sabry.hash` + +**size** *(default 6)* - size of hash in bytes. Feel free to increase/decrease. + +**use_scope_name** *(default true)* - wether to use scope identifier to calculate hash + +**use_code_size** *(default true)* - wether to use scope code size to calculate hash + +**use_item_names** *(default false)* - wether to use all scoped item idents to calculate hash + +**use_code_text** *(default false)* - wether to use the scope code text to calculate hash + +**collision** *(default "ignore")* - how to handle similarity of generated hashes + +*ignore* - dont do anything + +*error* - break building process with an error + +### `sabry.lightningcss.targets` + +Does require `css.minify` to be *true*. + +Empty by default. + +Available keys: chrome, firefox, edge, safari, saf_ios, samsung, android, ie + +Value - minimal browser version to support in "M.m.p" format, where: + +- *M* - major +- *m* - minor +- *p* - patch + +For example `{ie = "9", saf_ios = "13.2"}` will try to generate CSS supported on both IE 9 and Safari-on-ios 13.2 + +## Detailed guide + +### Style definition with `sassy!` + +The `sassy!` macro is available with *procmacro* feature which is enabled by default. + +It does accept the following syntax: `$name(:$syntax)? ({ $code })|($filename)`, where + +- *$name* is any identifier valid for `macro_rules!` +- *$syntax* is either `sass` or `scss` +- *$code* is valid arbitrary style code in specified syntax +- *$filename* is a string literal which contains path to the file relative to package root + +Examples: +```rust +sassy!(module1 {$primary-color: red;}); +sassy!(module2 "src/assets/module2.scss"); +sassy!(module3:sass "src/assets/module3.sass"); +// works, but there are catches. +sassy!(module4:sass { + =colored + color: red +}); +``` + +You may omit the syntax specifier - sabry uses SCSS as the default one. + +The given code to `sassy!` is not checked to be valid code in given syntax (wip). + +> SASS support inside of rust files is experimental. If you do want to use SASS tabbed syntax - consider to use files path instead of sass-in-rust option. + +### Scoping with `styly!` + +The `styly!` macro is available with *procmacro* feature flag which is enabled by default. + +It does accept the following syntax: `pub? const? $ident(:$syntax)? ({ $code })|($filename)`, where + +- *pub* is explained [here](#public-styly-scopes) +- *const* is explained [here](#constant-styly-scopes) +- *$ident* is any identifier valid for `mod` +- *$syntax* is either `sass` or `scss` +- *$code* is arbitrary style code valid with given syntax +- *$filename* is a string literal which contains path to the file relative to package root + +Examples +```rust +styly!(fox {.fur {color: red; &-dark {color: black;}}}) +styly!(pub fox {.fur {color: red; &-dark {color: black;}}}) +styly!(pub const fox:sass { + .fur + color: red + &-dark + color: black +}) +``` +Every of those calls will produce the styling scope as a module. Differences are explained right below. + +In general the scope does look like this: +```rust +const FOX: &str = "J9k_s9"; +mod fox { + pub const fur: &str = "J9k_s9 fur"; + pub fn _dark(c: &str) -> String {format!("{c}-dark")} +} +``` + +#### Styly scopes + +Styly macro itself does not generate the scope. It is done in the `sabry_intrnl::scoper`. However, as a result, you will have the following: + +- `const` with the UPPER_CASE name of the scope, which contains its hash +- `mod` with exact scope name which is the scope you're going to use + - for simple selectors, like `.fur` you will have a const members with hashed original selectors to use wherever you need a class/id/etc. + - for parent-selectors like `&-dark` you will have a non-const function, which will create matching the selector from any other. + +You can read more about scoping and hashing in the [scoping](#scoping) section. + +#### Public styly scopes + +By default generated `mod` is private. You can make both mod and wrapper style constant public by adding the `pub` to macro call: + +```rust +styly!(pub whatever "src/assets/whatever.scss"); +``` + +#### Constant styly scopes + +As you've seen above, scope doe not contain any style code by itself. That's the use case i advise mostly. + +However you could still compile styles into the artifact by simply adding the `const` to the macro call: + +```rust +styly!(const scope "src/assets/scope.scss"); +``` +Which results in following: +```rust +const SCOPE: &str = /* scope hash */; +const SCOPE_CSS: &str = /* compiled from src/assets/scope.scss */; +mod scope {/* selector collection */} +``` + +> **There is a catch** | with the `const` modifier macro must compile CSS at compile-time. That results in several game changers: +> +> *First*. You could avoid the "build magic". Sabry will just compile given styles with procmacro at compile time. +> +> *Second*. If you `@use` something inside of constant-flavored scope, you can only success if sabry *did the build magic before compilation of that macro call*. So you still can compile the styles into the artifact and enjoy mixins from other crates, but, in general, you are going to receive some false-positives from editor. +> +> Worth of notice: sabry will still include const-flavored styles into the CSS bundle during build time. + +### Building with `buildy` and `usey!` + +The `buildy` function is available with *build* feature which needs to be enabled explicitly. + +This function accepts an iterator of pairs: (file_name, code) in form of `(String, String)` type. File name should have an extension, so grass can infere syntax during CSS compilation. + +Each of those pairs is processed as a file which sabry needs to write into +the configured `intermediate_dir` and then passed into the CSS compiler. + +You could, for example, define the module "mixin_a": +```rust +buildy(vec![("mixin_a".to_string(), "@mixin a(){}".to_string())]); +``` + +However there's a usey macro, which handles this for you: +```rust +buildy( + usey!(mixins!(), utils!()) +); +``` + +The `usey!` macro accepts the following syntax: +`#($macro,)*`, where + +- *$macro* is a macro which handles three expansions: + - `() => { $code }` + - `(name) => { $name }` + - `(syntax) => { $syntax }` + +Where for the *$macro*: + +- *$code* is a source code of style as a string literal +- *$name* is a name of module without extension as a string literal +- *$syntax* is either "sass" or "scss" + + +Exactly this kind of macros is produced by [`sassy!`](#style-definition-with-sassy). + +### Scoping + +Sabry handles scoping by restriction or mutation of existing selectors +with the hash. Hash is calculated for the entire scope by the [`styly!`](#scoping-with-styly) macro. + +Currently the following types of selectors are scoped: + +- class +- id +- SASS parent selectors (see below, there is a catch) +- tagname (see below, there is a catch) + +Sabry does not make difference between top-level and nested selectors, +also selector complexity isn't taken into account: sabry simply walks through all compound selectors +and apply scoping for supported ones. + +Different selector types are scoped differently: + +- class selectors are restricted with scope hash: `.class` -> `.HASH.class` +- id selector are mutated with scope hash: `#id` -> `#id-HASH` +- tagname selectors are changed into indirect descendance: `div` -> `.HASH div` + +> **There is a catch** | currently tagname selectors are scoped with indirect descendancy +> hash restriction. That means - if you do use tagnames in scoped stylesheets, you have to wrap your markdown +> with `SCOPE` class generated by `styly!` macro. +> +> Also if there are nested tagname selectors - sabry won't take this into account and you'll +> have to wrap them with `SCOPE` class as well + +As for **SASS parent selectors**: they are currently handled in different way. Instead of +walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: + +```rust +styly!(scope { + .cls1 { + &-dark {} + } +}); +``` +is something like +```rust +const SCOPE: &str = "Ut8CskJ"; +mod scope { + pub const cls1: &str = "Ut8CskJ cls1"; + pub fn _dark(c: &str) -> String {format!("{c}-dark")} +} +``` + +So you still can get the scoped variant of `cls1-dark` class: `scope::_dark(scope::cls1)`. + +This isn't very handy, also isn't strict enough, and is a high-priority subject to change. wip. + +## WIP + +*(sorted by my own priority)*, "dones" are excluded + +- [] Crates of styled components - currently the only way to create them seems to be const styly. + - [] CSS support +- [] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. +- [] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. + +## Contributions + +Any contributions are always welcome! + +If you find this crate usefull, wanna stick with it in some project, but do miss some +features - feel free to submit a PR. + +> If you'd like to fork for the PR - please, use the "window" branch, not the "master". + +If you encounter any bugs/problems or have use case where things dont work as they should +for the latest version - please, open an issue! + +If you'd like to lend a paw - feel free to check the [WIP](#wip) section out, or to search for "TODO" comments. + +## MSRV + +Sabry passes its own tests on 1.82 nightly. + +There *were* some strange parsing issues reports on *stable* channel, seems to be fixed. idk. + +## License + +MIT. diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock new file mode 100644 index 0000000..963559d --- /dev/null +++ b/examples/define-styles/Cargo.lock @@ -0,0 +1,1483 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "anstream" +version = "0.6.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" + +[[package]] +name = "cc" +version = "1.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "codemap" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "const_format" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.2", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.85", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + +[[package]] +name = "define-styles" +version = "0.0.0" +dependencies = [ + "sabry", +] + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "grass" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" +dependencies = [ + "clap", + "getrandom", + "grass_compiler", +] + +[[package]] +name = "grass_compiler" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" +dependencies = [ + "codemap", + "indexmap", + "lasso", + "once_cell", + "phf 0.11.2", + "rand", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lasso" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.161" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" + +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" +dependencies = [ + "ahash 0.8.11", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom", + "itertools", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "paste", + "pathdiff", + "rayon", + "serde", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + +[[package]] +name = "parcel_selectors" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" +dependencies = [ + "bitflags", + "cssparser", + "fxhash", + "log", + "phf 0.10.1", + "phf_codegen", + "precomputed-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" +dependencies = [ + "base64-simd", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "raffia" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" +dependencies = [ + "raffia_macro", + "smallvec", +] + +[[package]] +name = "raffia_macro" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" +dependencies = [ + "heck", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "sabry" +version = "0.0.1" +dependencies = [ + "sabry_build", + "sabry_intrnl", + "sabry_procmacro", +] + +[[package]] +name = "sabry_build" +version = "0.0.0" +dependencies = [ + "proc-macro2", + "sabry_intrnl", + "sabry_procmacro_impl", + "syn 2.0.85", + "thiserror", + "walkdir", +] + +[[package]] +name = "sabry_intrnl" +version = "0.0.0" +dependencies = [ + "base64", + "blake3", + "const_format", + "grass", + "lightningcss", + "proc-macro2", + "raffia", + "regex", + "serde", + "syn 2.0.85", + "thiserror", + "toml", +] + +[[package]] +name = "sabry_procmacro" +version = "0.0.0" +dependencies = [ + "sabry_procmacro_impl", +] + +[[package]] +name = "sabry_procmacro_impl" +version = "0.0.0" +dependencies = [ + "proc-macro2", + "quote", + "raffia", + "regex", + "sabry_intrnl", + "syn 2.0.85", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "serde" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "serde_json" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml new file mode 100644 index 0000000..496ecd3 --- /dev/null +++ b/examples/define-styles/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "define-styles" +version = "0.0.0" +edition = "2021" +rust-version = "1.82" +publish = false + +[dependencies] +sabry = {path = "../../", features = ["sass"]} diff --git a/examples/define-styles/src/lib.rs b/examples/define-styles/src/lib.rs new file mode 100644 index 0000000..bdf62c3 --- /dev/null +++ b/examples/define-styles/src/lib.rs @@ -0,0 +1,104 @@ +use sabry::sassy; + +sassy!(utils { + @mixin flex($direction, $align, $justify, $gap: .5rem) { + display: flex; + list-style: none; + gap: $gap; + flex-direction: $direction; + + @if $align == start{ + align-items: flex-start; + } + @else if $align == end{ + align-items: flex-end; + } + @else{ + align-items: $align; + } + + @if $justify == start { + justify-content: flex-start; + } + @else if $justify == end { + justify-content: flex-end; + } + @else { + justify-content: $justify; + } + } +}); + +sassy!(theme { + $thm-surface-primary: #2b2a29; + $thm-surface-secondary: #6C6C6C; + $thm-surface-tertiary: #4C4C4C; + $thm-surface-accent: #B0CB1F; + + $thm-text-primary: #ffffff; + $thm-text-secondary: #ffffff; + $thm-text-tertiary: #ffffff; + $thm-text-accent: #B0CB1F; + + @mixin surface($style: primary) { + @if $style == primary { + @include txt(primary); + background-color: $thm-surface-primary; + } + @else if $style == secondary { + @include txt(secondary); + background-color: $thm-surface-secondary; + } + @else if $style == accent { + @include txt; + background-color: $thm-surface-accent; + } + } + + @mixin txt($style: primary) { + @if $style == primary { + font-weight: 500; + color: $thm-text-primary; + } + @else if $style == secondary { + font-weight: 400; + color: $thm-text-secondary; + } + @else if $style == tertiary { + font-weight: 400; + color: $thm-text-tertiary; + } + @else if $style == accent { + font-weight: 500; + color: $thm-text-accent; + } + } +}); + +sassy!(tokens { + @use "theme"; + + @mixin clickable($style: accent, $scale: 1.2, $clickscale: 0.9){ + @if $style == accent{ + @include theme.surface(accent); + } + @else if $style == secondary { + @include theme.surface(secondary); + } + + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: #00000000; + transition: transform .07s, filter .07s; + &:hover{ + transform: scale($scale); + } + &:focus-visible { + outline: 2px solid #fff; + } + &:active { + filter: brightness(.9); + transform: scale($clickscale); + } + } +}); diff --git a/examples/leptos-axum/.gitignore b/examples/leptos-axum/.gitignore new file mode 100644 index 0000000..6985cf1 --- /dev/null +++ b/examples/leptos-axum/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml new file mode 100644 index 0000000..7033f16 --- /dev/null +++ b/examples/leptos-axum/Cargo.toml @@ -0,0 +1,67 @@ +[package] +name = "leptos-axum-sabry" +version = "0.1.0" +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +leptos = { version = "0.7.0-gamma3" } +leptos_axum = { version = "0.7.0-gamma3", optional = true } +leptos_meta = { version = "0.7.0-gamma3" } +leptos_router = { version = "0.7.0-gamma3" } +axum = { version = "0.7", optional = true } +console_error_panic_hook = "0.1" +tokio = { version = "1", features = ["rt-multi-thread"], optional = true } +tower = { version = "0.4", optional = true } +tower-http = { version = "0.5", features = ["fs"], optional = true } +wasm-bindgen = "=0.2.93" +thiserror = "1" +tracing = { version = "0.1", optional = true } +http = "1" + +# sabry with sass +sabry = {path = "../../", features = ["sass"]} + +[build-dependencies] +# sabry for build with sass +sabry = {path = "../../", features = ["build", "sass"]} +# lets depend on our styles +define-styles = {path = "../define-styles"} + +[features] +hydrate = ["leptos/hydrate"] +ssr = [ + "dep:axum", + "dep:tokio", + "dep:tower", + "dep:tower-http", + "dep:leptos_axum", + "leptos/ssr", + "leptos_meta/ssr", + "leptos_router/ssr", + "dep:tracing", +] + +[package.metadata.sabry] +css.minify = true +# We'll use bundle for leptos +css.bundle = "target/.sabry/target/bundle.css" + +[package.metadata.leptos] +output-name = "leptos-axum" +site-root = "target/site" +site-pkg-dir = "pkg" +# Sabry-generated bundle for leptos +style-file = "target/.sabry/target/bundle.css" +assets-dir = "public" +site-addr = "127.0.0.1:3000" +reload-port = 3001 +browserquery = "defaults" +env = "DEV" +bin-features = ["ssr"] +bin-default-features = false +lib-features = ["hydrate"] +lib-default-features = false diff --git a/examples/leptos-axum/LICENSE b/examples/leptos-axum/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/examples/leptos-axum/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/examples/leptos-axum/README.md b/examples/leptos-axum/README.md new file mode 100644 index 0000000..e5d3c4a --- /dev/null +++ b/examples/leptos-axum/README.md @@ -0,0 +1,90 @@ + + + Leptos Logo + + +# Leptos Axum Starter Template + +This is a template for use with the [Leptos](https://github.com/leptos-rs/leptos) web framework and the [cargo-leptos](https://github.com/akesson/cargo-leptos) tool using [Axum](https://github.com/tokio-rs/axum). + +## Creating your template repo + +If you don't have `cargo-leptos` installed you can install it with + +```bash +cargo install cargo-leptos --locked +``` + +Then run +```bash +cargo leptos new --git https://github.com/leptos-rs/start-axum-0.7 +``` + +to generate a new project template. + +```bash +cd leptos-axum +``` + +to go to your newly created project. +Feel free to explore the project structure, but the best place to start with your application code is in `src/app.rs`. +Addtionally, Cargo.toml may need updating as new versions of the dependencies are released, especially if things are not working after a `cargo update`. + +## Running your project + +```bash +cargo leptos watch +``` + +## Installing Additional Tools + +By default, `cargo-leptos` uses `nightly` Rust, `cargo-generate`, and `sass`. If you run into any trouble, you may need to install one or more of these tools. + +1. `rustup toolchain install nightly --allow-downgrade` - make sure you have Rust nightly +2. `rustup target add wasm32-unknown-unknown` - add the ability to compile Rust to WebAssembly +3. `cargo install cargo-generate` - install `cargo-generate` binary (should be installed automatically in future) +4. `npm install -g sass` - install `dart-sass` (should be optional in future + +## Compiling for Release +```bash +cargo leptos build --release +``` + +Will generate your server binary in target/server/release and your site package in target/site + +## Testing Your Project +```bash +cargo leptos end-to-end +``` + +```bash +cargo leptos end-to-end --release +``` + +Cargo-leptos uses Playwright as the end-to-end test tool. +Tests are located in end2end/tests directory. + +## Executing a Server on a Remote Machine Without the Toolchain +After running a `cargo leptos build --release` the minimum files needed are: + +1. The server binary located in `target/server/release` +2. The `site` directory and all files within located in `target/site` + +Copy these files to your remote server. The directory structure should be: +```text +leptos-axum +site/ +``` +Set the following environment variables (updating for your project as needed): +```text +LEPTOS_OUTPUT_NAME="leptos-axum" +LEPTOS_SITE_ROOT="site" +LEPTOS_SITE_PKG_DIR="pkg" +LEPTOS_SITE_ADDR="127.0.0.1:3000" +LEPTOS_RELOAD_PORT="3001" +``` +Finally, run the server binary. + +## Licensing + +This template itself is released under the Unlicense. You should replace the LICENSE for your own application with an appropriate license if you plan to release it publicly. diff --git a/examples/leptos-axum/build.rs b/examples/leptos-axum/build.rs new file mode 100644 index 0000000..be74188 --- /dev/null +++ b/examples/leptos-axum/build.rs @@ -0,0 +1,11 @@ +use define_styles::{theme, utils, tokens}; + +fn main(){ + sabry::buildy( + sabry::usey!( + utils!(), + theme!(), + tokens!() + ) + ).expect("Failed to build with sabry"); +} diff --git a/examples/leptos-axum/public/favicon.ico b/examples/leptos-axum/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2ba8527cb12f5f28f331b8d361eef560492d4c77 GIT binary patch literal 15406 zcmeHOd3aPs5`TblWD*3D%tXPJ#q(n!z$P=3gCjvf#a)E}a;Uf>h{pmVih!a-5LVO` zB?JrzEFicD0wRLo0iPfO372xnkvkzFlRHB)lcTnNZ}KK@US{UKN#b8?e_zkLy1RZ= zT~*y(-6IICgf>E_P6A)M3(wvl2qr-gx_5Ux-_uzT*6_Q&ee1v9B?vzS3&K5IhO2N5 z$9ukLN<`G>$$|GLnga~y%>f}*j%+w@(ixVUb^1_Gjoc;(?TrD3m2)RduFblVN)uy; zQAEd^T{5>-YYH%|Kv{V^cxHMBr1Ik7Frht$imC`rqx@5*| z+OqN!xAjqmaU=qR$uGDMa7p!W9oZ+64($4xDk^FyFQ<_9Z`(;DLnB<;LLJD1<&vnZ zo0(>zIkQTse}qNMb6+i`th54(3pKm8;UAJ<_BULR*Z=m5FU7jiW(&#l+}WkHZ|e@1 z`pm;Q^pCuLUQUrnQ(hPM10pSSHQS=Bf8DqG1&!-B!oQQ|FuzLruL1w(+g<8&znyI? zzX-}?SwUvNjEuT?7uUOy{Fb@xKklpj+jdYM^IK9}NxvLRZd{l9FHEQJ4IO~q%4I0O zAN|*8x^nIU4Giw?f*tmNx=7H)2-Zn?J^B6SgpcW3ZXV_57Sn%Mtfr_=w|sYpAhdJT zcKo6Z*oIOU(az~3$LOEWm9Q)dYWMA}T7L23MVGqrcA%4H)+^`+=j+Hh8CTCnnG2Rh zgcXVW%F8$R9)6}f=NQiLPt8qt3xNUQI>Q*)H1lzk<&n?XR-f}tc&9V0H0lhGqHJ^N zN%h(9-Of2_)!Xk{qdIkU>1%mk%I_Id1!MU*yq&&>)Q+!L^t&-2mW9Xq7g9C@* zl&PKJ&su2L+iku?Te?Pf?k3tUK){Bj_gb&aPo8Ago^XI~mRTd(5{&^tf1)!-lSMha z@$~ae!r(~`=p&|mMxy2EiZQ6FvXb(1avS*`Pj%$)*?vwceGKHmHnl`v&fEQ_Wh+G) zEPQ^3&oV%}%;zF`AM|S%d>pM@1}33PN5*4SewROk_K$n^i8QjaYiRzwG8#OvVIF|{x85wH+?*P*%)woI zR538k@=(E`V;p1UwA|fqSh`$n_t;Sz4T)`_s~pRR4lbmWWSdxa-FqLZ%fLT)Bh?iye?COx~mO1wkn5)HNMg7`8~ z25VJhz&3Z7`M>6luJrEw$Jikft+6SxyIh?)PU1?DfrKMGC z=3T;;omE4H`PWqF8?0*dOA3o9y@~WK`S}{?tIHquEw?v`M^D%Lobpdrp%3}1=-&qk zqAtb1px-1Fy6}E8IUg4s%8B0~P<P5C;de%@n~XnDKF@fr$a+^@$^P|>vlw($aSK2lRtLt~8tRb`I0 znfI!G?K|<5ry*gk>y56rZy0NkK6)))6Mg1=K?7yS9p+#1Ij=W*%5Rt-mlc;#MOnE9 zoi`-+6oj@)`gq2Af!B+9%J#K9V=ji2dj2<_qaLSXOCeqQ&<0zMSb$5mAi;HU=v`v<>NYk}MbD!ewYVB+N-ctzn=l&bTwv)*7 zmY<+Y@SBbtl9PPk$HTR?ln@(T92XjTRj0Mx|Mzl;lW>Su_y^~fh?8(L?oz8h!cCpb zZG-OY=NJ3{>r*`U<(J%#zjFT-a9>u6+23H{=d(utkgqt7@^)C;pkb)fQ|Q=*8*SyT z;otKe+f8fEp)ZacKZDn3TNzs>_Kx+g*c_mr8LBhr8GnoEmAQk#%sR52`bdbW8Ms$!0u2bdt=T-lK3JbDW`F(Urt%Ob2seiN>7U`YN}aOdIiCC;eeufJC#m3S z9#|l2c?G@t*hH5y^76jkv)rs4H+;oiTuY5FQwRMN_7NUqeiD|b&RyxPXQz|3qC(_> zZJMwjC4F!1m2INXqzisQ4X^w=>&(+Ecdu&~IWEMn7f*YcYI&eWI(6hI#f114%aymM zyhlG6{q>XN7(LyGiMAS&qijR%d2rV|>AUT_sE&EKUSTCM26>aKzNxk0?K|utOcxl# zxIOwM#O!!H+QzbX*&p=QuKe4y;bS>&StQOE5AEGg_ubk8{;1yOVAJfE_Js-lL7rr9 z)CEuFIlkApj~uV^zJK7KocjT=4B zJP(}0x}|A7C$$5gIp>KBPZ|A#2Ew;$#g9Fk)r;Q~?G$>x<+JM)J3u>j zi68K=I;ld`JJ?Nq+^_B?C+Q%+x#m{9JF$tbaDeNIep%=^#>KHGtg=L)>m z_J&vaZTs2{qP!4Gdw5u5Kcf}5R4(q}Lebx%(J$7l*Q`Il#pCTM%!`y5y*-~zIVs}D z9;t+(xmV~R65^ZQXe+<5{$QW0O8MT~a{kdFLR)nfRMA9L(YU>x*DTltN#m-2km zC;T`cfb{c`mcx(z7o_a8bYJn8_^dz4Cq!DZ37{P6uF{@#519UWK1{>(9sZB1I^6MmNc39MJ-_|)!S8vO+O3&$MulU3Gc z_W{N*B(yneyl-oN_MKaJ{CZ6dv-~^8uPbLSh&0jfV@EfA{2Dc!_rOyfx`R0T@LonA z<*%O?-aa_Wm-z$s@K(ex7UhM0-?9C=PkYdk&d2n((E4>&(f4D`fOQY%CURMMyJyU` zVeJBAId&StHjw76tnwSqZs3e0683`L{a3k9JYdg#(ZVw4J`&CkV-2LFaDE1Z?CehVy%vZx$tM3tTax8E@2;N^QTrPcI?Ob8uK!DM0_sfE6ks2M?iw zPS4{(k-PF*-oY>S!d9;L+|xdTtLen9B2LvpL4k;#ScB< z$NP_7j~7)5eXuoYEk*dK_rSz9yT_C4B{r~^#^o}-VQI=Y?01|$aa!a7=UEm$|DsQQ zfLK1qmho2@)nwA?$1%T6jwO2HZ({6&;`s|OQOxI4S8*Hw=Qp!b(gNJR%SAj&wGa>^&2@x)Vj zhd^WfzJ^b0O{E^q82Pw({uT`E`MT2WnZ02{E%t*yRPN>?W>0vU^4@Vyh4;mLj918c z*s*papo?<}cQM{5lcgZScx}?usg{mS!KkH9U%@|^_33?{FI{1ss+8kXyFY&5M-e~f zM$){FF;_+z3sNJ)Er~{Beux$fEl{R4|7WKcpEsGtK57f+H0DJ$hI;U;JtF>+lG@sV zQI_;bQ^7XIJ>Bs?C32b1v;am;P4GUqAJ#zOHv}4SmV|xXX6~O9&e_~YCCpbT>s$`! k<4FtN!5 impl IntoView { + // Creates a reactive value to update the button + let count = RwSignal::new(0); + let on_click = move |_| *count.write() += 1; + + view! { +
    +

    "Welcome to Leptos!"

    + + "DISCLAIMER:" +

    "This isn't a design example! Its just proof of sabry's capabilities."

    +

    "Plz dont make websites/apps which look like this page :D"

    +
    + } +} diff --git a/examples/leptos-axum/src/routes/home.scss b/examples/leptos-axum/src/routes/home.scss new file mode 100644 index 0000000..67e7ec1 --- /dev/null +++ b/examples/leptos-axum/src/routes/home.scss @@ -0,0 +1,12 @@ +@use "tokens"; +@use "utils"; +@use "theme"; + +.btn { + @include tokens.clickable(accent); +} + +.table { + @include utils.flex(column, center, center); + @include theme.surface(primary); +} diff --git a/examples/leptos-axum/src/routes/mod.rs b/examples/leptos-axum/src/routes/mod.rs new file mode 100644 index 0000000..9b86bcf --- /dev/null +++ b/examples/leptos-axum/src/routes/mod.rs @@ -0,0 +1 @@ +pub mod home; diff --git a/examples/leptos-axum/src/shell.rs b/examples/leptos-axum/src/shell.rs new file mode 100644 index 0000000..125c90d --- /dev/null +++ b/examples/leptos-axum/src/shell.rs @@ -0,0 +1,43 @@ +use leptos::prelude::*; +use leptos_meta::{provide_meta_context, MetaTags, Stylesheet, Title}; +use leptos_router::{ + components::{Route, Router, Routes}, + StaticSegment, +}; + +use crate::routes; + +pub fn shell(options: LeptosOptions) -> impl IntoView { + view! { + + + + + + + + + + + + + + } +} + +#[component] +pub fn App() -> impl IntoView { + provide_meta_context(); + + view! { + + + <Router> + <main> + <Routes fallback=|| "Page not found.".into_view()> + <Route path=StaticSegment("") view=routes::home::Route/> + </Routes> + </main> + </Router> + } +} diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock new file mode 100644 index 0000000..7e7c03c --- /dev/null +++ b/examples/use-styles/Cargo.lock @@ -0,0 +1,1491 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "anstream" +version = "0.6.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" + +[[package]] +name = "cc" +version = "1.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "codemap" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "const_format" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.2", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.85", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + +[[package]] +name = "define-styles" +version = "0.0.0" +dependencies = [ + "sabry", +] + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "grass" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" +dependencies = [ + "clap", + "getrandom", + "grass_compiler", +] + +[[package]] +name = "grass_compiler" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" +dependencies = [ + "codemap", + "indexmap", + "lasso", + "once_cell", + "phf 0.11.2", + "rand", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lasso" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.161" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" + +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" +dependencies = [ + "ahash 0.8.11", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom", + "itertools", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "paste", + "pathdiff", + "rayon", + "serde", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + +[[package]] +name = "parcel_selectors" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" +dependencies = [ + "bitflags", + "cssparser", + "fxhash", + "log", + "phf 0.10.1", + "phf_codegen", + "precomputed-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" +dependencies = [ + "base64-simd", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "raffia" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" +dependencies = [ + "raffia_macro", + "smallvec", +] + +[[package]] +name = "raffia_macro" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" +dependencies = [ + "heck", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "sabry" +version = "0.0.1" +dependencies = [ + "sabry_build", + "sabry_intrnl", + "sabry_procmacro", +] + +[[package]] +name = "sabry_build" +version = "0.0.0" +dependencies = [ + "proc-macro2", + "sabry_intrnl", + "sabry_procmacro_impl", + "syn 2.0.85", + "thiserror", + "walkdir", +] + +[[package]] +name = "sabry_intrnl" +version = "0.0.0" +dependencies = [ + "base64", + "blake3", + "const_format", + "grass", + "lightningcss", + "proc-macro2", + "raffia", + "regex", + "serde", + "syn 2.0.85", + "thiserror", + "toml", +] + +[[package]] +name = "sabry_procmacro" +version = "0.0.0" +dependencies = [ + "sabry_procmacro_impl", +] + +[[package]] +name = "sabry_procmacro_impl" +version = "0.0.0" +dependencies = [ + "proc-macro2", + "quote", + "raffia", + "regex", + "sabry_intrnl", + "syn 2.0.85", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "serde" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "serde_json" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "use-styles" +version = "0.0.0" +dependencies = [ + "define-styles", + "sabry", +] + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml new file mode 100644 index 0000000..77c0ca6 --- /dev/null +++ b/examples/use-styles/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "use-styles" +version = "0.0.0" +edition = "2021" +rust-version = "1.82" +publish = false + +[dependencies] +sabry = {path = "../../", features = ["sass"]} + +[build-dependencies] +sabry = {path = "../../", features = ["build", "sass"]} +define-styles = {path = "../define-styles"} + +[package.metadata.sabry] +css.bundle = "target/static/style.css" +css.scopes = "target/static/styles/" +css.bundle_prelude = ["assets/prelude.css"] + +hash.size = 6 +hash.collision = "error" + +[package.metadata.sabry.lightningcss] +targets = {chrome = "120", firefox = "120", ie = "8"} diff --git a/examples/use-styles/assets/prelude.css b/examples/use-styles/assets/prelude.css new file mode 100644 index 0000000..b889e82 --- /dev/null +++ b/examples/use-styles/assets/prelude.css @@ -0,0 +1,4 @@ +html { + box-sizing: border-box; + font-size: 10px; +} diff --git a/examples/use-styles/build.rs b/examples/use-styles/build.rs new file mode 100644 index 0000000..88a9998 --- /dev/null +++ b/examples/use-styles/build.rs @@ -0,0 +1,22 @@ +use define_styles::{theme, tokens, utils as utils_dup}; +use sabry::{sassy, usey}; + +// This module will have the same name as define_styles_example::utils +// and sabry is configured to merge them +sassy!(utils { + @mixin nonclickable(){ + display: none; + } +}); + +fn main(){ + /* Declare modules to use with sabry */ + sabry::buildy( + usey!( + theme!(), + tokens!(), + utils_dup!(), + utils!() + ) + ).expect("Failed to build sabry styles"); +} diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs new file mode 100644 index 0000000..6751b2c --- /dev/null +++ b/examples/use-styles/src/main.rs @@ -0,0 +1,17 @@ +use sabry::styly; + +styly!(pub const bundlemod { + @use "tokens"; + .someth { + @include tokens.clickable; + background-color: black; + } +}); + +styly!(pub const filemod:sass "src/main.sass"); + +fn main(){ + println!("someth class codemod styles: {}", bundlemod::someth); + println!("someth class filemod styles: {}", filemod::someth); + println!("Thats how we used the styles! Good luck!!"); +} diff --git a/examples/use-styles/src/main.sass b/examples/use-styles/src/main.sass new file mode 100644 index 0000000..38596ed --- /dev/null +++ b/examples/use-styles/src/main.sass @@ -0,0 +1,12 @@ +@use "tokens" + +.someth + @include tokens.clickable + background: white + &-dark + background: none + border: 1px solid black + &[value] + &::after + content: "valued" + color: green diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml new file mode 100644 index 0000000..05d7609 --- /dev/null +++ b/sabry_build/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "sabry_build" +description = "Sabry build magic as a separate crate" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true + +[dependencies] +sabry_intrnl = {workspace = true} +sabry_procmacro_impl = {workspace = true} +proc-macro2 = {workspace = true, features = ["span-locations"]} +syn = {workspace = true, features = ["visit", "derive", "parsing", "full"]} +thiserror = {workspace = true} + +walkdir = {version = "^2.5"} + +[features] +sass = [ + "sabry_procmacro_impl/sass", + "sabry_intrnl/sass" +] +scss = [ + "sabry_procmacro_impl/scss", + "sabry_intrnl/scss" +] +net-files = [] diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs new file mode 100644 index 0000000..c3e6439 --- /dev/null +++ b/sabry_build/src/buildmagic.rs @@ -0,0 +1,305 @@ +use std::{ + collections::HashSet, + convert::Infallible, + fs::{self, OpenOptions}, + io::{self, Write}, + path::PathBuf, + str::FromStr, vec, +}; + +use sabry_intrnl::{ + compiler::{CompilerAdapter, SabryCompilerError}, + config::{ + manifest::ManifestError, + BehavHashCollision, BehavSassModCollision, SabryConfig, + }, + scoper::{hash::ScopeHash, ArbitraryScope, ScopeError}, +}; +use sabry_procmacro_impl::impls::styly; +use walkdir::WalkDir; + +use crate::filevisit::{self, FileVisitError}; + +type ModuleName = String; +type ModuleCode = String; +type StyleModule = (ModuleName, ModuleCode); +type BuilderResult = Result<(), SabryBuildError>; + +pub fn buildy(inline_side_modules: impl IntoIterator<Item = StyleModule>) -> BuilderResult { + println!("🧙: This is probably the stderr. Something went wrong:"); + + let config = SabryConfig::require()?; + let mut builder = SabryBuilder::new(config); + + println!("🧙 loading preludes"); + builder.load_preludes()?; + + println!("🧙 loading `buildy` modules"); + for (name, code) in inline_side_modules { + builder.load_side_module(name, code)?; + } + + println!("🧙 loading this crate"); + builder.load_styles_from_this_crate()?; + + println!("🧙 compiling CSS"); + builder.compile_everything()?; + + println!("🧙 writing an output"); + builder.generate_output()?; + + Ok(()) +} + +pub struct SabryBuilder { + config: SabryConfig, + css_compiler: CompilerAdapter, + state: SabryBuildState, +} + +//🧙 +impl SabryBuilder { + pub fn new(config: SabryConfig) -> Self { + let css_compiler = CompilerAdapter::new(config.clone()); + Self { + config, + css_compiler, + state: SabryBuildState::default(), + } + } + + /// Write all the loaded CSS + /// + /// - Bundle file (if configured) + /// - Scope chunks (if out-dir is configured) + pub fn generate_output(&mut self) -> BuilderResult { + // warn on empty loaded_css_modules + if self.state.loaded_css_modules.is_empty() { + println!("🧙 sabry didn't compile any CSS. Perhaps the crate has no styles? Lets write some!\nAlso you should check that you do use `styly!` macro properly - at the top level as an item."); + } + + if let Some(scope_dir) = &self.config.css.scopes { + println!("🧙 writing CSS files for each of loaded scopes into {scope_dir}"); + + fs::create_dir_all(scope_dir)?; + for (scope, code) in &self.state.loaded_css_modules { + let scope_path = format!("{}/{}.css", scope_dir, scope); + fs::write(scope_path, code)?; + } + } + + if let Some(bundle_file) = &self.config.css.bundle { + println!("🧙 writing merged CSS for the entire crate into {bundle_file}"); + + let path = PathBuf::from_str(bundle_file)?; + + if let Some(dir) = path.parent() { + fs::create_dir_all(dir)?; + } + + // remove the file to write new fresh tasty CSS + let _ = fs::remove_file(&path); + // and then reopen it + let mut file = OpenOptions::new() + .create_new(true) + .append(true) + .open(path)?; + + for (_, code) in &self.state.loaded_css_modules { + write!(file, " {}", self.state.css_prelude)?; + write!(file, " {code}")?; + } + } + + Ok(()) + } + + /// Compile all the loaded styles, SASS/SCSS/CSS, without actually writing them. + pub fn compile_everything(&mut self) -> BuilderResult { + // warn on empty known_side_modules and loaded_stylyses + if self.state.known_side_modules.is_empty() { + println!("🧙 sabry didn't load any side modules"); + } + if self.state.loaded_stylyses.is_empty() { + println!("🧙 sabry didn't load any usable styles"); + } + + for styly in &self.state.loaded_stylyses { + let scope = ArbitraryScope::from_source( + styly.syntax.into(), + styly.scope.clone(), + styly.code.code(), + )? + .hashed(&self.config.hash)?; + + match self.config.hash.collision { + BehavHashCollision::Ignore => {} + BehavHashCollision::Error => { + if self.state.known_scope_hashes.contains(&scope.hash) { + return Err(SabryBuildError::HashCollision { + scope: scope.original_scope.name.to_string(), + }); + } + self.state.known_scope_hashes.insert(scope.hash.clone()); + } + } + + let css = self.css_compiler.compile_module( + scope.original_scope.adapter().syntax.into(), + &scope.hashed_code, + )?; + self.state + .loaded_css_modules + .push((scope.original_scope.name.to_string(), css)); + } + + Ok(()) + } + + /// Visit all the source files in the current crate and look for code that may affect building process: + /// + /// - `styly!` macro calls + /// + /// Only files with an **.rs** extension are visited. + /// + /// All the gathered info is loaded into state + pub fn load_styles_from_this_crate(&mut self) -> BuilderResult { + println!("🧙 scanning the crate"); + + let root = WalkDir::new(&self.config.sass.scanroot); + + for entry in root { + let entry = entry?; + let metadata = entry.metadata()?; + + if metadata.is_file() { + let entry_path = entry.path(); + let ext = entry_path.extension().unwrap_or_default(); + if ext == "rs" { + let visitor = filevisit::visit_file(entry_path)?; + self.state.loaded_stylyses.extend(visitor.found_stylys); + } + } else if metadata.is_symlink() { + println!( + "🧙 sabry won't go through symlinks currently ('{}' is a symlink)", + entry.path().to_string_lossy() + ) + } + } + + Ok(()) + } + + /// Load up configured preludes as side modules + pub fn load_preludes(&mut self) -> BuilderResult { + // load sass modules from config + let mut modules: Vec<StyleModule> = vec![]; + if let Some(sass_pre) = &self.config.sass.modules { + for pre in sass_pre { + let pre_path = PathBuf::from_str(pre)?; + let pre_name = pre_path + .file_name() + .ok_or(SabryBuildError::FileName())? + .to_string_lossy() + .to_string(); + let code = fs::read_to_string(pre_path)?; + modules.push((pre_name, code)); + } + } + for (name, code) in modules { + self.load_side_module(name, code)?; + } + + // load css preludes + if let Some(css_pre) = &self.config.css.bundle_prelude { + for pre in css_pre { + let code = fs::read_to_string(pre)?; + self.state.css_prelude.push_str(&code); + } + } + + Ok(()) + } + + /// Load up the SASS module by its `name` and fill the according file by its `code` as-is + /// + /// Module "loading" is simply a file creation. File is created in the configured `intermediate_dir` + /// directory. + /// + /// Module `name` is not suffixed with syntax/extensions/whatever so it already should have necessary file extensions. + /// + /// This function will not overwrite the module file. Never. + /// + pub fn load_side_module(&mut self, name: ModuleName, code: ModuleCode) -> BuilderResult { + println!("🧙 loading side module '{}'", &name); + + let module_file_path = format!("{}/{}", &self.config.sass.intermediate_dir, &name); + let mut open_options = OpenOptions::new(); + let mut open_options = open_options.write(true); + + // prematurelly remove module file if the module is not yet known to be loaded + if !self.state.known_side_modules.contains(&name) { + let _ = fs::remove_file(&module_file_path); + } + + open_options = if self.state.known_side_modules.contains(&name) { + match &self.config.sass.module_name_collision { + BehavSassModCollision::Error => { + return Err(SabryBuildError::ModuleCollision { module: name }) + } + BehavSassModCollision::Merge => { + println!("🧙 sabry found duplicate module name '{name}': merging code, as configured"); + open_options.append(true) + } + } + } else { + open_options.create(true) + }; + + fs::create_dir_all(&self.config.sass.intermediate_dir)?; + let mut module_file = open_options.open(module_file_path)?; + + write!(module_file, "\n{code}\n")?; + + self.state.known_side_modules.insert(name); + + Ok(()) + } +} + +#[derive(Default)] +pub struct SabryBuildState { + known_scope_hashes: HashSet<ScopeHash>, + known_side_modules: HashSet<ModuleName>, + loaded_stylyses: Vec<styly::MacroSyntax>, + loaded_css_modules: Vec<StyleModule>, + css_prelude: String, +} + +#[derive(Debug, thiserror::Error)] +pub enum SabryBuildError { + #[error("Filesystem error")] + Fs(#[from] io::Error), + #[error("Failed to walk through the crate")] + CrateWalk(#[from] walkdir::Error), + #[error("Failed to load side SASS module")] + LoadSass(), + #[error( + "Module with the similar name was already loaded, and sabry is configured to raise an error" + )] + ModuleCollision { module: ModuleName }, + #[error("Sabry cant understand the file")] + FileVisit(#[from] FileVisitError), + #[error("Syntax of style can not be parsed")] + SyntaxParse(#[from] ScopeError), + #[error("Another scope has the same hash, and sabry is configured to raise an error. Try to adjust config, increase hash size, or change the style code")] + HashCollision { scope: ModuleName }, + #[error("Something's wrong with file path")] + Path(#[from] Infallible), + #[error("File name wasnt determined properly")] + FileName(), + #[error("Failed to compile CSS")] + CssCompile(#[from] SabryCompilerError), + #[error("Failed to load config/manifest")] + Manifest(#[from] ManifestError), +} diff --git a/sabry_build/src/filevisit.rs b/sabry_build/src/filevisit.rs new file mode 100644 index 0000000..2844469 --- /dev/null +++ b/sabry_build/src/filevisit.rs @@ -0,0 +1,51 @@ +use std::{fs, io, path::Path}; + +use proc_macro2::TokenStream; +use sabry_procmacro_impl::impls::styly; +use syn::{spanned::Spanned, visit::Visit}; + +#[derive(Debug, thiserror::Error)] +pub enum FileVisitError { + #[error("Could not read file")] + Read(#[from] io::Error), + #[error("styly! macro found, yet invalid")] + Styly(#[from] syn::Error), +} + +/// Visit file, returning either [StylyVisitor] or error +pub fn visit_file(path: &Path) -> Result<StylyVisitor, FileVisitError> { + let content = fs::read_to_string(path)?; + let code_file = syn::parse_file(&content)?; + + let mut styly_visitor = StylyVisitor { + found_stylys: vec![], + }; + styly_visitor.visit_file(&code_file); + + Ok(styly_visitor) +} + +/// Syn Visitor, which will look at every `styly!` macro, +/// parse its input tokenstream and avaluate it, capturing [styly::MacroSyntax] result +/// +/// ## Panics +/// +/// If either macro body is not a [TokenStream], or [styly::parse_macro_syntax] is not [Ok] +#[derive(Debug)] +pub struct StylyVisitor { + pub found_stylys: Vec<styly::MacroSyntax>, +} + +impl<'ast> Visit<'ast> for StylyVisitor { + fn visit_item_macro(&mut self, node: &'ast syn::ItemMacro) { + if node.mac.path.get_ident().is_some_and(|i| i == "styly") { + let body = node.mac.parse_body::<TokenStream>().unwrap_or_else(|_| { + panic!("could not parse `styly!` macro at {:?}", node.mac.span()) + }); + let macro_data = styly::parse_macro_syntax(body).unwrap_or_else(|_| { + panic!("could not parse `styly!` macro at {:?}", node.mac.span()) + }); + self.found_stylys.push(macro_data); + } + } +} diff --git a/sabry_build/src/lib.rs b/sabry_build/src/lib.rs new file mode 100644 index 0000000..180dbd0 --- /dev/null +++ b/sabry_build/src/lib.rs @@ -0,0 +1,3 @@ +pub mod buildmagic; +pub mod filevisit; +pub use buildmagic::*; diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml new file mode 100644 index 0000000..5bf56e5 --- /dev/null +++ b/sabry_intrnl/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "sabry_intrnl" +description = "Sabry internal, yet still public library" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true + +[dependencies] +raffia = {workspace = true} +grass = {workspace = true} +lightningcss = {workspace = true} +blake3 = {workspace = true} +base64 = {workspace = true} + +syn = {workspace = true} +proc-macro2 = {workspace = true} +regex = {workspace = true} +const_format = {workspace = true} + +serde = {workspace = true, features = ["derive"]} +toml = {workspace = true} +thiserror = {workspace = true} + +[features] +sass = [] +scss = [] diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs new file mode 100644 index 0000000..0c2df2b --- /dev/null +++ b/sabry_intrnl/src/compiler/mod.rs @@ -0,0 +1,120 @@ +use lightningcss::{printer::PrinterOptions, stylesheet::MinifyOptions, targets::Targets}; + +use crate::config::SabryConfig; + +/// Convenience wrapper on Grass and Lightningcss +pub struct CompilerAdapter { + config: SabryConfig, +} + +impl CompilerAdapter { + pub fn new(config: SabryConfig) -> Self { + Self { config } + } + + pub fn compile_module( + &self, + syntax: CompilerSyntax, + code: &str, + ) -> Result<String, SabryCompilerError> { + let options = grass::Options::from(&self.config).input_syntax(syntax.into()); + + let mut css = grass::from_string(code, &options)?; + + if self.config.css.minify { + //its lightningcss time! + let mut lightsheet = match lightningcss::stylesheet::StyleSheet::parse( + &css, + lightningcss::stylesheet::ParserOptions::default(), + ) { + Ok(s) => s, + Err(_) => return Err(SabryCompilerError::Lightningcss()), + }; + + let targets = Targets { + browsers: Some(self.config.lightningcss.targets.clone().into()), + ..Default::default() + }; + + let printer_options = PrinterOptions { + minify: self.config.css.minify, + targets, + ..Default::default() + }; + + let minify_options = MinifyOptions { + targets, + ..Default::default() + }; + + if lightsheet.minify(minify_options).is_err() { + return Err(SabryCompilerError::Lightningcss()); + } + + css = match lightsheet.to_css(printer_options) { + Ok(c) => { + drop(lightsheet); + c.code + } + Err(_) => return Err(SabryCompilerError::Lightningcss()), + }; + } + + Ok(css) + } +} + +impl From<&SabryConfig> for grass::Options<'_> { + fn from(config: &SabryConfig) -> Self { + let mut options = grass::Options::default(); + options = options.style(if config.css.minify { + grass::OutputStyle::Compressed + } else { + grass::OutputStyle::Expanded + }); + options = options.load_path(&config.sass.intermediate_dir); + + options + } +} + +#[derive(Debug, thiserror::Error)] +pub enum SabryCompilerError { + #[error("Could not compile into CSS with grass")] + GrassCompile(#[from] Box<grass::Error>), + #[error("Could not parse compiled CSS with lightningcss")] + Lightningcss(), +} + +/// Unification wrapper over all the Syntax enums +#[derive(Clone, Copy)] +pub enum CompilerSyntax { + #[cfg(feature = "sass")] + Sass, + #[cfg(feature = "scss")] + Scss, +} + +impl From<raffia::Syntax> for CompilerSyntax { + fn from(value: raffia::Syntax) -> Self { + match value { + #[cfg(feature = "sass")] + raffia::Syntax::Sass => Self::Sass, + #[cfg(feature = "scss")] + raffia::Syntax::Scss => Self::Scss, + // TODO: fallbacky error-prone + _ => Self::Scss, + } + } +} + +impl From<CompilerSyntax> for grass::InputSyntax { + fn from(value: CompilerSyntax) -> Self { + match value { + #[cfg(feature = "scss")] + CompilerSyntax::Scss => Self::Scss, + #[cfg(feature = "sass")] + CompilerSyntax::Sass => Self::Sass, + } + } +} diff --git a/sabry_intrnl/src/config/manifest.rs b/sabry_intrnl/src/config/manifest.rs new file mode 100644 index 0000000..ac0700f --- /dev/null +++ b/sabry_intrnl/src/config/manifest.rs @@ -0,0 +1,44 @@ +use std::{env, fs, io}; + +use serde::Deserialize; + +use super::SabryConfig; + +pub const MANIFEST: &str = "Cargo.toml"; +pub const MANIFEST_DIR_ENV: &str = "CARGO_MANIFEST_DIR"; + +pub fn read_manifest() -> Result<ValuableManifest, ManifestError> { + let manpath = format!("{}/{MANIFEST}", env::var(MANIFEST_DIR_ENV)?); + + Ok(toml::de::from_str(&fs::read_to_string(manpath)?)?) +} + +#[derive(Debug, thiserror::Error)] +pub enum ManifestError { + #[error("Could not read manifest path from env")] + ManifestDirEnv(#[from] env::VarError), + #[error("Could not read manifest file")] + ManifestRead(#[from] io::Error), + #[error("Could not deserialize manifest")] + ManifestDe(#[from] toml::de::Error), +} + +/// Manifest structure that makes sense for sabry +#[derive(Deserialize, Default)] +pub struct ValuableManifest { + pub package: Option<ValuableManifestPkg>, +} + +/// Manifest \[package.metadata\] structure that makes sense for sabry +#[derive(Deserialize, Default)] +pub struct ValuableManifestPkg { + pub metadata: Option<ValuableManifestPkgMeta>, +} + +/// Manifest \[package.metadata.sabry\] structure that makes sense for sabry +/// +/// Which is basically [SabryConfig] +#[derive(Deserialize, Default)] +pub struct ValuableManifestPkgMeta { + pub sabry: Option<SabryConfig>, +} diff --git a/sabry_intrnl/src/config/mod.rs b/sabry_intrnl/src/config/mod.rs new file mode 100644 index 0000000..0903929 --- /dev/null +++ b/sabry_intrnl/src/config/mod.rs @@ -0,0 +1,253 @@ +pub mod manifest; +use manifest::{ManifestError, ValuableManifest}; +use serde::Deserialize; + +/// Sabry configuration, as it is from package.metadata.sabry +#[derive(Default, Deserialize, Clone)] +pub struct SabryConfig { + #[serde(default = "SabryCssConfig::default")] + pub css: SabryCssConfig, + #[serde(default = "SabrySassConfig::default")] + pub sass: SabrySassConfig, + #[serde(default = "SabryHashConfig::default")] + pub hash: SabryHashConfig, + #[serde(default = "SabryGrassConfig::default")] + pub grass: SabryGrassConfig, + #[serde(default = "SabryLightCssConfig::default")] + pub lightningcss: SabryLightCssConfig, +} + +impl SabryConfig { + /// Require sabry configuration for the current project from every place in the code + pub fn require() -> Result<Self, ManifestError> { + let manifest = manifest::read_manifest()?; + Ok(Self::from(&manifest)) + } +} + +impl From<&ValuableManifest> for SabryConfig { + fn from(value: &ValuableManifest) -> Self { + value + .package + .as_ref() + .and_then(|p| p.metadata.as_ref()) + .and_then(|m| m.sabry.as_ref()) + .map_or(Self::default(), |sbr| sbr.clone()) + } +} + +/// Sabry `css` configuration table +#[derive(Deserialize, Clone)] +pub struct SabryCssConfig { + pub bundle: Option<String>, + pub scopes: Option<String>, + pub bundle_prelude: Option<Vec<String>>, + #[serde(default = "SabryCssConfig::default_minify")] + pub minify: bool, +} + +impl SabryCssConfig { + fn default_minify() -> bool { + true + } +} + +impl Default for SabryCssConfig { + fn default() -> Self { + Self { + bundle: None, + scopes: None, + bundle_prelude: None, + minify: Self::default_minify(), + } + } +} + +/// Sabry `sass` configuration table +/// +/// (SASS/SCSS related config) +#[derive(Deserialize, Clone)] +pub struct SabrySassConfig { + #[serde(default = "SabrySassConfig::default_scanroot")] + pub scanroot: String, + pub modules: Option<Vec<String>>, + #[serde(default = "SabrySassConfig::default_intermediate_dir")] + pub intermediate_dir: String, + #[serde(default = "SabrySassConfig::default_module_name_collision")] + pub module_name_collision: BehavSassModCollision, +} + +impl SabrySassConfig { + fn default_scanroot() -> String { + "src".into() + } + fn default_intermediate_dir() -> String { + "target/.sabry/sass".into() + } + fn default_module_name_collision() -> BehavSassModCollision { + BehavSassModCollision::default() + } +} + +impl Default for SabrySassConfig { + fn default() -> Self { + Self { + scanroot: Self::default_scanroot(), + modules: None, + intermediate_dir: Self::default_intermediate_dir(), + module_name_collision: Self::default_module_name_collision(), + } + } +} + +/// Sabry `hash` configuration table +#[derive(Deserialize, Clone)] +pub struct SabryHashConfig { + #[serde(default = "SabryHashConfig::default_size")] + pub size: usize, + #[serde(default = "SabryHashConfig::default_collision")] + pub collision: BehavHashCollision, + #[serde(default = "SabryHashConfig::default_use_scope_name")] + pub use_scope_name: bool, + #[serde(default = "SabryHashConfig::default_use_item_names")] + pub use_item_names: bool, + #[serde(default = "SabryHashConfig::default_use_code_size")] + pub use_code_size: bool, + #[serde(default = "SabryHashConfig::default_use_code_text")] + pub use_code_text: bool, +} + +impl SabryHashConfig { + fn default_size() -> usize { + 6 + } + fn default_collision() -> BehavHashCollision { + BehavHashCollision::default() + } + fn default_use_scope_name() -> bool { + true + } + fn default_use_item_names() -> bool { + false + } + fn default_use_code_size() -> bool { + true + } + fn default_use_code_text() -> bool { + false + } +} + +impl Default for SabryHashConfig { + fn default() -> Self { + Self { + size: Self::default_size(), + collision: Self::default_collision(), + use_scope_name: Self::default_use_scope_name(), + use_code_size: Self::default_use_code_size(), + use_code_text: Self::default_use_code_text(), + use_item_names: Self::default_use_item_names(), + } + } +} + +/// [grass] specific configuration for sabry +#[derive(Default, Deserialize, Clone)] +pub struct SabryGrassConfig {} + +/// [lightningcss] specific configuration for sabry +#[derive(Default, Deserialize, Clone)] +pub struct SabryLightCssConfig { + pub targets: SabryLightTargets, +} + +/// \[package.metadata.sabry.lightningcss.targets\] configuration. +/// +/// This is a convenience layer under [lightningcss::targets::Browsers] structure accepted +/// by lightningcss. +/// +/// This structure is a part of [SabryConfig], which faces developer with more convenient +/// `safari = "13.2"` syntax. +#[derive(Default, Deserialize, Clone)] +pub struct SabryLightTargets { + pub android: Option<String>, + pub chrome: Option<String>, + pub edge: Option<String>, + pub firefox: Option<String>, + pub ie: Option<String>, + pub ios_saf: Option<String>, + pub opera: Option<String>, + pub safari: Option<String>, + pub samsung: Option<String>, +} + +impl SabryLightTargets { + pub fn parse_ver(ver: &str) -> u32 { + let mut vercode: u32 = 0; + let vers = ver.split('.'); + for (i, dig) in vers.into_iter().enumerate() { + let dignum = dig + .parse::<u32>() + .unwrap_or_else(|_| panic!("Invalid browser specifier: '{dig}'")); + + let shift = 16 - 8 * i; + vercode |= dignum << shift; + } + vercode + } +} + +impl From<SabryLightTargets> for lightningcss::targets::Browsers { + fn from(value: SabryLightTargets) -> Self { + Self { + android: value.android.map(|s| SabryLightTargets::parse_ver(&s)), + chrome: value.chrome.map(|s| SabryLightTargets::parse_ver(&s)), + edge: value.edge.map(|s| SabryLightTargets::parse_ver(&s)), + firefox: value.firefox.map(|s| SabryLightTargets::parse_ver(&s)), + ie: value.ie.map(|s| SabryLightTargets::parse_ver(&s)), + ios_saf: value.ios_saf.map(|s| SabryLightTargets::parse_ver(&s)), + opera: value.opera.map(|s| SabryLightTargets::parse_ver(&s)), + safari: value.safari.map(|s| SabryLightTargets::parse_ver(&s)), + samsung: value.samsung.map(|s| SabryLightTargets::parse_ver(&s)), + } + } +} + +/// \[package.metadata.sabry.sass\].module_name_collision option +#[derive(Deserialize, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum BehavSassModCollision { + Merge, + Error, +} + +impl Default for BehavSassModCollision { + fn default() -> Self { + Self::Merge + } +} + +/// \[package.metadata.sabry.hash\].collision option +#[derive(Deserialize, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum BehavHashCollision { + Error, + Ignore, +} + +impl Default for BehavHashCollision { + fn default() -> Self { + Self::Ignore + } +} + +#[cfg(test)] +mod test { + use super::{manifest, SabryConfig}; + + #[test] + fn empty_manifest_still_worth_a_read() { + let manifest = manifest::read_manifest().unwrap(); + let _conf = SabryConfig::from(&manifest); + } +} diff --git a/sabry_intrnl/src/lib.rs b/sabry_intrnl/src/lib.rs new file mode 100644 index 0000000..ec12902 --- /dev/null +++ b/sabry_intrnl/src/lib.rs @@ -0,0 +1,4 @@ +pub mod compiler; +pub mod config; +pub mod scoper; +pub mod syntax; diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs new file mode 100644 index 0000000..9f8a9e4 --- /dev/null +++ b/sabry_intrnl/src/scoper/hash.rs @@ -0,0 +1,97 @@ +use base64::Engine; + +use crate::config::SabryHashConfig; + +use super::ArbitraryScope; + +/// Convenience wrapper for String-being-a-hash +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ScopeHash(String); + +impl ScopeHash { + pub fn new(scope: &ArbitraryScope, config: &SabryHashConfig) -> Self { + let mut hasher = blake3::Hasher::new(); + + if config.use_scope_name { + hasher.update(scope.name.to_string().as_bytes()); + } + if config.use_code_text { + hasher.update(scope.adapter().source().as_bytes()); + } + if config.use_code_size { + hasher.update(&scope.adapter().source().len().to_ne_bytes()); + } + if config.use_item_names { + let classes = scope.adapter().class_selectors(); + let ids = scope.adapter().id_selectors(); + //# types/tags dont participate + //# child-parent dont participate + + let merged_items = classes + .iter() + .map(|s| &s.name) + .chain(ids.iter().map(|i| &i.name)) + .map(|ident| ident.as_literal()) + .filter_map(|mbl| mbl.map(|l| l.raw)) + .collect::<String>(); + + hasher.update(merged_items.as_bytes()); + } + + let size = if config.size >= blake3::OUT_LEN { + blake3::OUT_LEN + } else { + config.size + }; + + let hash = hasher.finalize(); + let hash = hash.as_bytes(); + + //? This isn't right. "size" is size of hash in symbols. + // naaah, its fine :D (Dan) + let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(&hash[..size]); + + Self(hash) + } + + pub fn as_str(&self) -> &str { + &self.0 + } + + #[cfg(test)] + pub fn test_init(v: String) -> Self { + Self(v) + } +} + +#[cfg(test)] +mod test { + use syn::Ident; + + use crate::{config::SabryHashConfig, scoper::ArbitraryScope}; + + use super::ScopeHash; + + #[test] + fn hash_matches() { + let source = ".cls1{color:red; &-dark{color: black} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; + + let scope1 = ArbitraryScope::from_source( + raffia::Syntax::Scss, + syn::parse_str::<Ident>("lasifudm").unwrap(), + source, + ) + .unwrap(); + let hash1 = ScopeHash::new(&scope1, &SabryHashConfig::default()); + + let scope2 = ArbitraryScope::from_source( + raffia::Syntax::Scss, + syn::parse_str::<Ident>("lasifudm").unwrap(), + source, + ) + .unwrap(); + let hash2 = ScopeHash::new(&scope2, &SabryHashConfig::default()); + + assert_eq!(hash1, hash2); + } +} diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs new file mode 100644 index 0000000..824aed7 --- /dev/null +++ b/sabry_intrnl/src/scoper/mod.rs @@ -0,0 +1,423 @@ +use hash::ScopeHash; +use raffia::Spanned; +use regex::Regex; + +use crate::{config::SabryHashConfig, syntax::StylesheetAdapter}; + +pub mod hash; + +#[derive(Debug, thiserror::Error)] +pub enum ScopeError { + #[error("Raffia reports parse error")] + Raffia(raffia::error::ErrorKind), +} + +impl From<raffia::error::Error> for ScopeError { + fn from(value: raffia::error::Error) -> Self { + Self::Raffia(value.kind) + } +} + +/// Struct which represents arbitrary style scope with known style syntax and name identifier +pub struct ArbitraryScope<'s> { + /// Ident name for the current scope + pub name: syn::Ident, + adapter: StylesheetAdapter<'s>, +} + +impl<'s> ArbitraryScope<'s> { + /// Parse given source code with given syntax and assign given name + pub fn from_source( + syntax: raffia::Syntax, + name: syn::Ident, + source: &'s str, + ) -> Result<Self, ScopeError> { + Ok(Self { + adapter: StylesheetAdapter::new(source, syntax)?, + name, + }) + } + + /// Consume arbitrary scope and create a [HashedScope] in its basis + /// + /// This function calls [HashedScope::new] under the hood + pub fn hashed(self, config: &SabryHashConfig) -> Result<HashedScope<'s>, ScopeError> { + let hash = ScopeHash::new(&self, config); + HashedScope::new(hash, self) + } + + /// Borrow the underlying [StylesheetAdapter] + pub fn adapter(&self) -> &StylesheetAdapter<'s> { + &self.adapter + } +} + +/// Hashed scope which holds hashed style code, +/// vector of hashed selectors and the calculated hash itself. +/// +/// Construction with [HashedScope::new] consumes [ArbitraryScope] and does all the job +pub struct HashedScope<'s> { + /// Original arbitrary scope + pub original_scope: ArbitraryScope<'s>, + /// Hashed style code + pub hashed_code: String, + /// Collection of hashed selectors + pub hashed_selectors: Vec<HashedSelector>, + + /// Given hash to the scope + pub hash: ScopeHash, +} + +impl<'s> HashedScope<'s> { + /// Consume [ArbitraryScope], + /// calculate the hash, + /// hash all the supported selectors + /// and construct hashed source code + /// + /// Heavy operation. + pub fn new(hash: ScopeHash, scope: ArbitraryScope<'s>) -> Result<Self, ScopeError> { + let origin_code = scope.adapter().source(); + let mut hashed_code = String::with_capacity(scope.adapter().source().len()); + + // get classes + let classes = scope.adapter().class_selectors(); + let classes = classes.iter().map(|c| HashedSelector::from_class(&hash, c)); + + // get ids + let ids = scope.adapter().id_selectors(); + let ids = ids.iter().map(|c| HashedSelector::from_id(&hash, c)); + + // get tags + let tags = scope.adapter().type_selectors(); + let tags = tags + .iter() + .filter_map(|t| t.as_tag_name()) + .map(|c| HashedSelector::from_tag(&hash, c)); + + let mut hashed_selectors = classes.chain(ids).chain(tags).collect::<Vec<_>>(); + + // sorting by span start is important because of how hashed code construction works + hashed_selectors.sort_by(|a, b| { + let astart = a.sel.as_arbitrary().span.start; + let bstart = b.sel.as_arbitrary().span.start; + + astart.cmp(&bstart) + }); + + let mut last_term_span: usize = 0; + for sel in &hashed_selectors { + let span = sel.sel.as_arbitrary().span.clone(); + hashed_code.push_str(&origin_code[last_term_span..span.start]); + hashed_code.push_str(&sel.css_ident); + last_term_span = span.end; + } + hashed_code.push_str(&origin_code[last_term_span..]); + + Ok(Self { + original_scope: scope, + hashed_code, + hashed_selectors, + hash, + }) + } +} + +/// Struct which represents hashed selector inside of [HashedScope]. +/// +/// Does not hold information about hash itself, as meant to be inside of scope. +pub struct HashedSelector { + /// Basic unrelated to hash info about this selector + pub sel: ScopedSelector, + /// CSS-ish identifier for this selector, which matches what's in the hashed style code + pub css_ident: String, + /// HTML-ish identifier for this selector, which will match [Self::css_ident] in browser + pub html_ident: Option<String>, +} + +impl HashedSelector { + /// Construct the [HashedSelector], with given hash and parsed class selector + pub fn from_class(hash: &ScopeHash, sel: &raffia::ast::ClassSelector) -> Self { + let sel = ScopedSelector::from_class(sel); + let css_ident = Self::make_hashed_css(&sel, hash); + let html_ident = Self::make_hashed_html(&sel, hash); + + Self { + sel, + css_ident, + html_ident, + } + } + + /// Construct the [HashedSelector], with given hash and parsed id selector + pub fn from_id(hash: &ScopeHash, sel: &raffia::ast::IdSelector) -> Self { + let sel = ScopedSelector::from_id(sel); + let css_ident = Self::make_hashed_css(&sel, hash); + let html_ident = Self::make_hashed_html(&sel, hash); + + Self { + sel, + css_ident, + html_ident, + } + } + + /// Construct the [HashedSelector], with given hash and parsed tagname selector + pub fn from_tag(hash: &ScopeHash, sel: &raffia::ast::TagNameSelector) -> Self { + let sel = ScopedSelector::from_tag(sel); + let css_ident = Self::make_hashed_css(&sel, hash); + let html_ident = Self::make_hashed_html(&sel, hash); + + Self { + sel, + css_ident, + html_ident, + } + } + + /// Transform this selector into hashed version for CSS-ish language + /// + /// Cooperates with the [HashedSelector::make_hashed_html], so + /// whats this function returns will be usable in HTML with to_hashed_html_def() + pub fn make_hashed_css(value: &ScopedSelector, hash: &ScopeHash) -> String { + match value { + // Class scoping is done with class composition + ScopedSelector::Class(a) => { + format!("{}.{}", hash.as_str(), a.ident) + } + // As we dont want to use two HTML props for a single ID, + // ID scoping is done with id modification + ScopedSelector::Id(a) => { + format!("{}-{}", hash.as_str(), a.ident) + } + ScopedSelector::Tag(a) => { + format!(".{} {}", hash.as_str(), a.ident) + } + } + } + + /// Transform this selector into hashed version valid for HTML-ish insertion + /// + /// Cooperates with the [HashedSelector::make_hashed_css], so + /// whats this function returns will be usable in CSS with to_hashed_code() + /// + /// Not every hashed selector is presentable for HTML-ish use: like `div`, in that case + /// returns [None] + pub fn make_hashed_html(value: &ScopedSelector, hash: &ScopeHash) -> Option<String> { + match value { + // Class scoping is done with class composition + ScopedSelector::Class(a) => Some(format!("{} {}", hash.as_str(), a.ident)), + // As we dont want to use two HTML props for a single ID, + // ID scoping is done with id modification + ScopedSelector::Id(a) => Some(format!("{}-{}", hash.as_str(), a.ident)), + ScopedSelector::Tag(_) => None, + } + } +} + +/// Just any unary CSS-ish selector +pub struct ArbitrarySelector { + /// CSS-ish identifier + pub ident: String, + /// Span in original CSS code where it comes from + pub span: raffia::Span, +} + +/// Any unary CSS-ish selector, that's able to be scoped, and then hashed +pub enum ScopedSelector { + Class(ArbitrarySelector), + Id(ArbitrarySelector), + Tag(ArbitrarySelector), +} + +impl ScopedSelector { + /// Borrow the underlying [ArbitrarySelector] + pub fn as_arbitrary(&self) -> &ArbitrarySelector { + match self { + Self::Class(a) => a, + Self::Id(a) => a, + Self::Tag(a) => a, + } + } + + /// Generate rusty member ident based on selector type and CSS ident + pub fn gen_rusty_ident(&self) -> syn::Ident { + let basic = apply_basic_rusty_member_gen_rules(&self.as_arbitrary().ident); + + let ready = match self { + Self::Class(_) => basic, + Self::Id(_) => { + format!("the{basic}") + } + Self::Tag(_) => { + format!("any{basic}") + } + }; + + syn::parse_str::<syn::Ident>(&ready).expect("BUG: formed ident is not Rust Ident") + } + + /// Construct this from class selector + pub fn from_class(s: &raffia::ast::ClassSelector) -> Self { + let lit = s + .name + .as_literal() + .expect("BUG: class selector is not a literal"); + Self::Class(ArbitrarySelector { + ident: lit.raw.to_string(), + span: lit.span().clone(), + }) + } + + /// Construct this from id selector + pub fn from_id(s: &raffia::ast::IdSelector) -> Self { + let lit = s + .name + .as_literal() + .expect("BUG: id selector is not a literal"); + Self::Id(ArbitrarySelector { + ident: lit.raw.to_string(), + span: lit.span().clone(), + }) + } + + /// Construct this from tagname selector + pub fn from_tag(s: &raffia::ast::TagNameSelector) -> Self { + let lit = s + .name + .name + .as_literal() + .expect("BUG: tag selector is not a literal"); + Self::Tag(ArbitrarySelector { + ident: lit.raw.to_string(), + span: lit.span().clone(), + }) + } +} + +fn apply_basic_rusty_member_gen_rules(source: &str) -> String { + let omit_regex = Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") + .expect("BUG: can not build omition regex for rusty member generation"); + + // omit forbidden chars + let cleaned = omit_regex.replace_all(source, "").to_string(); + + // other not-so-obvious rules + let mut target = String::with_capacity(cleaned.len()); + let mut next_uppercase: bool = false; + for (i, c) in cleaned.chars().enumerate() { + // first gidit is prepended with 'n' + if i == 0 && c.is_numeric() { + target.push('n'); + target.push(c); + continue; + } + // dash is omitted and next is uppercase if may be + if c == '-' { + next_uppercase = true; + continue; + } + target.push(if next_uppercase { + next_uppercase = false; + c.to_ascii_uppercase() + } else { + c + }); + } + target +} + +#[cfg(test)] +mod test { + use std::collections::HashSet; + + use syn::Ident; + + use crate::{ + config::SabryHashConfig, + scoper::{hash::ScopeHash, HashedScope}, + }; + + use super::ArbitraryScope; + + #[test] + fn scope_hash_codegen() { + let code = + ".cls1{color:red; &-dark{color: black;} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; + let hash = ScopeHash::test_init("F2kf8nMs".into()); + + let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; + let expect_selector_htmls = HashSet::from([ + "F2kf8nMs cls1".to_string(), + "F2kf8nMs-id1".to_string(), + "F2kf8nMs cls3".to_string(), + "F2kf8nMs-id2".to_string(), + "".to_string(), // comes from `div` which has no html hashed code, still want to check presense + ]); + + let scope = ArbitraryScope::from_source( + raffia::Syntax::Scss, + syn::parse_str("scope1").unwrap(), + code, + ) + .unwrap(); + let scope = HashedScope::new(hash, scope).unwrap(); + let scope_selector_htmls = scope + .hashed_selectors + .iter() + .map(|hs| hs.html_ident.clone().unwrap_or_default()) + .collect::<HashSet<_>>(); + + // check that original is untouched + assert_eq!(code, scope.original_scope.adapter().source()); + // check that hashed matches what we expect + assert_eq!(expect_code, scope.hashed_code); + // check that HTML selector hashed code matches what we expect + assert_eq!(expect_selector_htmls, scope_selector_htmls); + } + + #[test] + fn rusty_idents() { + let code = " +.cls-1{ + color:red; + &-dark{ + color: black; + } + #id-1 { + color:green; + } + .-txt-of { + color:blue; + } +} +.-c_ls3#4id{ + color: black; +}"; + let expect_ident_names = HashSet::from([ + "cls1".to_string(), + "theid1".to_string(), + "c_ls3".to_string(), + "then4id".to_string(), + "txtOf".to_string(), + ]); + + let hash_cfg = SabryHashConfig::default(); + let scope = ArbitraryScope::from_source( + raffia::Syntax::Scss, + syn::parse_str::<Ident>("scope2oiej").unwrap(), + code, + ) + .unwrap() + .hashed(&hash_cfg) + .unwrap(); + + let sels = scope + .hashed_selectors + .iter() + .map(|s| s.sel.gen_rusty_ident()) + .map(|i| i.to_string()) + .collect::<HashSet<_>>(); + + assert_eq!(expect_ident_names, sels); + } +} diff --git a/sabry_intrnl/src/syntax/mod.rs b/sabry_intrnl/src/syntax/mod.rs new file mode 100644 index 0000000..a52d7d6 --- /dev/null +++ b/sabry_intrnl/src/syntax/mod.rs @@ -0,0 +1,226 @@ +use raffia::{ + ast::{ + ClassSelector, CompoundSelector, IdSelector, NestingSelector, SimpleSelector, Statement, + Stylesheet, TypeSelector, + }, + ParserBuilder, Syntax, +}; + +/// Convenience wrapper for [Stylesheet] +pub struct StylesheetAdapter<'s> { + pub syntax: Syntax, + source: &'s str, + stylesheet: Stylesheet<'s>, +} + +impl<'s> StylesheetAdapter<'s> { + pub fn new(source: &'s str, syntax: Syntax) -> Result<Self, raffia::error::Error> { + Ok(Self { + stylesheet: ParserBuilder::new(source) + .ignore_comments() + .syntax(syntax) + .build() + .parse()?, + syntax, + source, + }) + } + + pub fn source(&self) -> &str { + self.source + } + + pub fn selectors(&self) -> Vec<CompoundSelector<'s>> { + Self::selectors_of(self.stylesheet.statements.iter().cloned()).collect() + } + + pub fn class_selectors(&self) -> Vec<ClassSelector<'s>> { + self.selectors_by(|c| c.as_class().cloned()) + } + + pub fn id_selectors(&self) -> Vec<IdSelector<'s>> { + self.selectors_by(|c| c.as_id().cloned()) + } + + pub fn type_selectors(&self) -> Vec<TypeSelector<'s>> { + self.selectors_by(|c| c.as_type().cloned()) + } + + pub fn nesting_selectors(&self) -> Vec<NestingSelector<'s>> { + self.selectors_by(|c| c.as_nesting().cloned()) + } + + /// Return collected [Vec] of owned values modulo `T`, filtered by `F`. + /// + /// This is preferred way to apply custom filtering on selectors over + /// `selectors().iter().filter_map()` + /// as it does not allocate intermediate vector + pub fn selectors_by<T, F>(&self, form: F) -> Vec<T> + where + F: FnMut(SimpleSelector<'s>) -> Option<T>, + { + Self::selectors_of(self.stylesheet.statements.iter().cloned()) + .flat_map(|cs| cs.children) + .filter_map(form) + .collect() + } + + fn selectors_of( + c: impl Iterator<Item = Statement<'s>>, + ) -> impl Iterator<Item = CompoundSelector<'s>> { + // Hello. Its Dan. + // Im not proud of this, + // but more effective implementation + // was SO unreadable and SO infected with lifetimes + // I suck at those things + + // For everyone trying to make this MORE OPTIMAL: + // increment the hour-counter and post your name here: + // 4 - Danik + // 5 - Yiffy + // 8 - Danik + c.filter_map(|s| s.as_qualified_rule().cloned()) + .flat_map(|q| { + let thissels = q + .selector + .selectors + .iter() + .flat_map(|sel| &sel.children) + .filter_map(|sc| sc.as_compound_selector()) + .cloned(); + + let blockstmt = q.block.statements.iter().cloned(); + Self::selectors_of(blockstmt) + .chain(thissels) + .collect::<Vec<_>>() + }) + } +} + +#[cfg(test)] +mod test { + use std::collections::HashSet; + + use raffia::Spanned; + + use super::StylesheetAdapter; + + #[test] + fn sels() { + let source_scss = " +.r1{ + .r2.r3 { + color: red; + } + &-rod { + color: red; + &[value] { + color: red; + } + } +} +div#id2 { + & > span.seled { + color: red; + & + ul#id2[attr] { + color: red; + } + & + .uled[attr] { + color: red; + } + } + &::after{ + color: red; + } +} + "; + let source_sass = " +.r1 + .r2.r3 + color: red + &-rod + color: red + &[value] + color: red +div#id2 + & > span.seled + color: red + & + ul#id2[attr] + color: red + & + .uled[attr] + color: red + &::after + color: red + "; + let expect_classes = HashSet::from(["r2", "r3", "r1", "uled", "seled"]); + let expect_ids = HashSet::from(["id2", "id2"]); + let expect_tags = HashSet::from(["ul", "div", "span"]); + + //scss + let adp = StylesheetAdapter::new(source_scss, raffia::Syntax::Scss).unwrap(); + + let classes = adp + .class_selectors() + .iter() + .filter_map(|c| c.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + let ids = adp + .id_selectors() + .iter() + .filter_map(|i| i.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + let tags = adp + .type_selectors() + .iter() + .filter_map(|t| t.as_tag_name()) + .filter_map(|t| t.name.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + assert_eq!(expect_classes, classes); + assert_eq!(expect_ids, ids); + assert_eq!(expect_tags, tags); + + //sass + let adp = StylesheetAdapter::new(source_sass, raffia::Syntax::Sass).unwrap(); + + let classes = adp + .class_selectors() + .iter() + .filter_map(|c| c.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + let ids = adp + .id_selectors() + .iter() + .filter_map(|i| i.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + let tags = adp + .type_selectors() + .iter() + .filter_map(|t| t.as_tag_name()) + .filter_map(|t| t.name.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + assert_eq!(expect_classes, classes); + assert_eq!(expect_ids, ids); + assert_eq!(expect_tags, tags); + } + + #[test] + fn rename_class() { + let scss = ".cls1{color:red; .cls2{color:green;}}"; + let newname = "cls203-jg7ihgjhftyfhjh"; + let expect = ".cls1{color:red; .cls203-jg7ihgjhftyfhjh{color:green;}}"; + + let adp = StylesheetAdapter::new(scss, raffia::Syntax::Scss).unwrap(); + let classes = adp.class_selectors(); + let target_class = classes[0].clone(); + + let span = target_class.name.span(); + let renamed = format!("{}{}{}", &scss[..span.start], newname, &scss[span.end..]); + assert_eq!(renamed, expect); + } +} diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml new file mode 100644 index 0000000..1ca3d35 --- /dev/null +++ b/sabry_procmacro/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "sabry_procmacro" +description = "Sabry proc-macro declarations" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true + +[lib] +proc-macro = true + +[dependencies] +sabry_procmacro_impl = {workspace = true} + +[features] +sass = [ + "sabry_procmacro_impl/sass" +] +scss = [ + "sabry_procmacro_impl/scss" +] diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs new file mode 100644 index 0000000..d5ede42 --- /dev/null +++ b/sabry_procmacro/src/lib.rs @@ -0,0 +1,117 @@ +use proc_macro::TokenStream; +use sabry_procmacro_impl::impls::{ + sassy::sassy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, +}; + +/// Macro that makes sass code rusty. +/// +/// Accepts arbitrary (yet valid) sass(wip)/scss code and +/// makes it available as rust macro +/// +/// ## Usage +/// +/// ```ignore +/// sassy!(scssmodule { +/// /* SCSS */ +/// }); +/// sassy!(sassmodule:sass { +/// /* SASS (WIP) */ +/// }); +/// sassy!(scssmod2:scss { +/// /* SCSS */ +/// }); +/// ``` +/// Or read code from file +/// ```ignore +/// sassy!(filemodule "src/styles/a.scss"); +/// sassy!(filemodule:sass "src/styles/b.sass"); +/// ``` +/// +/// \[SCSS syntax requires 'scss' feature\] +/// \[SASS syntax requires 'sass' feature (WIP)\] +/// +#[proc_macro] +pub fn sassy(input: TokenStream) -> TokenStream { + sassy_macro_impl(input.into()).into() +} + +/// Macro that brings sass code into app +/// +/// Accepts arbitrary (yet valid) sass(wip)/scss code +/// and creates public/private module with scoped(hashed) +/// selector members. +/// +/// Feel free to use it with qualified path, but dont alias it with `use sabry::styly as whetever`. +/// +/// ## Usage +/// +/// Write style in rusty code (rust-analyzer wont autocomplete your scope members) +/// ```ignore +/// styly!(scope1 { +/// /* SCSS */ +/// }); +/// styly!(scope2:sass { +/// /* SASS (WIP) */ +/// }); +/// styly!(scope3:scss { +/// /* SCSS */ +/// }); +/// styly!(pub scope4 { +/// /* SCSS which is available as <mod>::scope4 */ +/// }); +/// styly!(const scope5 { +/// /* SCSS which wount be bundled, instead SCOPE5_STYLE constant is introduced with CSS */ +/// }); +/// styly!(pub const scope6 { +/// /* SCSS, which is like 'const scope5' but publically available like 'pub scope4'*/ +/// }); +/// ``` +/// Or use SCSS file and get syntax highlighting and autocompletion: +/// ```ignore +/// styly!(penguin "src/components/penguin.scss"); +/// styly!(pub page "src/routes/page.scss"); +/// styly!(pub const embed:sass "src/embedded.sass"); +/// ``` +/// +/// \[SCSS syntax requires 'scss' feature\] +/// \[SASS syntax requires 'sass' feature (WIP)\] +/// +/// ### About `const` scope +/// +/// Const-flavored styly macro will generate SCOPENAME_CSS constant available in runtime, which contains +/// compiled CSS. Note, that only possibility to `@use` something - is to have sabry as build time, so that const styly +/// macro could read all modules. +/// +/// ### Not meant to be used, yet still available +/// +/// ```ignore +/// styly!(notascope { +/// /* produces machine-readable invalid rust code */ +/// }#); +/// ``` +#[proc_macro] +pub fn styly(input: TokenStream) -> TokenStream { + styly_macro_impl(input.into()).into() +} + +/// Macro that brings external sass code into app +/// +/// Intended to be used in tandem with `sabry::buildy` function in `build.rs` file +/// +/// ## Usage +/// +/// ```ignore +/// use sharedstyles::tokens; +/// use brandstyle::tokens as brand_tokens; +/// +/// usey!( +/// brandstyle::theme!(), +/// tokens!(), +/// brand_tokens!(), +/// ); +/// ``` +/// +#[proc_macro] +pub fn usey(input: TokenStream) -> TokenStream { + usey_macro_impl(input.into()).into() +} diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml new file mode 100644 index 0000000..c5e0e5b --- /dev/null +++ b/sabry_procmacro_impl/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "sabry_procmacro_impl" +description = "Sabry proc-macro internals reusable outside of proc-macro context" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true + +[dependencies] +sabry_intrnl = {workspace = true} + +proc-macro2 = {workspace = true, features = ["span-locations"]} +syn = {workspace = true, features = ["parsing"]} +quote = {workspace = true} +regex = {workspace = true} + +raffia = {workspace = true} + +[features] +sass = [ + "sabry_intrnl/sass" +] +scss = [ + "sabry_intrnl/scss" +] diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs new file mode 100644 index 0000000..e5f9cc5 --- /dev/null +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -0,0 +1,202 @@ +use std::{fmt::Debug, fs}; + +use proc_macro2::{Span, TokenStream}; +use quote::{quote, ToTokens, TokenStreamExt}; +use sabry_intrnl::compiler::CompilerSyntax; +use syn::{braced, parse::Parse, spanned::Spanned, Ident, LitStr, Token}; + +pub mod sassy; +pub mod styly; +pub mod usey; + +/// Macro input for arbitrary style code +/// +/// Also supports string literal token instead of braces, +/// in which mode will look for relative file +/// +/// Does not work nice with rust-analyzer though +#[derive(Clone, Debug)] +pub struct ArbitraryStyleBlock { + code: String, + span: Span, +} + +impl ArbitraryStyleBlock { + pub fn span(&self) -> Span { + self.span + } + + pub fn code(&self) -> &str { + &self.code + } +} + +impl Parse for ArbitraryStyleBlock { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let (code, span) = if let Ok(path_tok) = input.parse::<LitStr>() { + let path = path_tok.value(); + + let iofile = match fs::read(&path) { + Ok(bf) => bf, + Err(_) => return Err(syn::Error::new(path_tok.span(), format!("Could not read file '{path}'. Perhaps its relative? Thats not currently supported :("))) + }; + let code = String::from_utf8_lossy(&iofile).to_string(); + + (code, path_tok.span()) + } else { + // Does not work on stable! + // We're on nightly though + // So what? + // Then is works. + let _s; + braced!(_s in input); + let stream = _s.parse::<TokenStream>()?; + + let c = match stream.span().source_text() { + Some(stx) => stx, + // TODO: rust-analyzer does fall into this even if all is fine + None => "".to_string(), //return Err(syn::Error::new(stream.span(), "Source code expected")), + }; + + (c, stream.span()) + }; + + Ok(Self { code, span }) + } +} + +#[allow(clippy::to_string_trait_impl)] +impl ToString for ArbitraryStyleBlock { + fn to_string(&self) -> String { + self.code.clone() + } +} + +#[derive(Clone, Copy)] +pub enum ArbitraryStyleSyntax { + #[cfg(feature = "scss")] + Scss, + #[cfg(feature = "sass")] + Sass, +} + +impl From<ArbitraryStyleSyntax> for CompilerSyntax { + fn from(value: ArbitraryStyleSyntax) -> Self { + match value { + #[cfg(feature = "sass")] + ArbitraryStyleSyntax::Sass => Self::Sass, + #[cfg(feature = "scss")] + ArbitraryStyleSyntax::Scss => Self::Scss, + } + } +} + +impl ToTokens for ArbitraryStyleSyntax { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + #[cfg(feature = "sass")] + Self::Sass => tokens.append_all(quote! {"sass"}), + #[cfg(feature = "scss")] + Self::Scss => tokens.append_all(quote! {"scss"}), + } + } +} + +impl Parse for ArbitraryStyleSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + match input.parse::<Token![:]>() { + Ok(_) => { /* Syntax is set */ } + Err(_) => { + /* Syntax is not set, falling to default */ + return Ok(Self::default()); + } + } + let ident = input.parse::<Ident>()?; + + match ident.to_string().as_str() { + #[cfg(feature = "sass")] + "sass" => Ok(Self::Sass), + #[cfg(feature = "scss")] + "scss" => Ok(Self::Scss), + _ => Err(syn::Error::new( + ident.span(), + format!( + "Available syntax are `sass` (WIP) and `scss`, each of them requires feature flag. Omit to use default {:?} syntax", + Self::default() + ), + )), + } + } +} + +impl Debug for ArbitraryStyleSyntax { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let name = match self { + #[cfg(feature = "sass")] + Self::Sass => "sass", + #[cfg(feature = "scss")] + Self::Scss => "scss", + }; + write!(f, "{name}") + } +} + +impl Default for ArbitraryStyleSyntax { + #[cfg(feature = "scss")] + fn default() -> Self { + Self::Scss + } + + #[cfg(all(feature = "sass", not(feature = "scss")))] + fn default() -> Self { + Self::Sass + } +} + +impl From<ArbitraryStyleSyntax> for raffia::Syntax { + fn from(value: ArbitraryStyleSyntax) -> Self { + match value { + #[cfg(feature = "sass")] + ArbitraryStyleSyntax::Sass => Self::Sass, + #[cfg(feature = "scss")] + ArbitraryStyleSyntax::Scss => Self::Scss, + } + } +} + +#[cfg(test)] +mod test { + #[cfg(feature = "sass")] + #[test] + fn arbitrary_style_block_sass() { + use super::ArbitraryStyleBlock; + + let code = "#a + co:d + .sel + di: pi + .sel,div > sel + f: \"into\""; + let braced_code = format!("{{{code}}}"); + let block = syn::parse_str::<ArbitraryStyleBlock>(&braced_code).unwrap(); + + assert_eq!(code, block.code); + } + + #[cfg(feature = "scss")] + #[test] + fn arbitrary_style_block_scss() { + use super::ArbitraryStyleBlock; + + let code = "#a { + c:r; + } + .b.c{ + c:\"into\"; + }"; + let braced_code = format!("{{{code}}}"); + let block = syn::parse_str::<ArbitraryStyleBlock>(&braced_code).unwrap(); + + assert_eq!(code, block.code) + } +} diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs new file mode 100644 index 0000000..6221449 --- /dev/null +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -0,0 +1,68 @@ +use proc_macro2::TokenStream; +use quote::quote; +use syn::{parse::Parse, Ident}; + +use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; + +/// Syntax: +/// `#ident(:$syntax)? { $code }` +/// +/// `$syntax`: sass/scss +/// +/// `$code`: intended to be valid based on $syntax +pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { + let MacroSyntax { + ident, + syntax: mode, + code, + } = match syn::parse2::<MacroSyntax>(input) { + Ok(m) => m, + Err(e) => return e.to_compile_error(), + }; + + let sourcesass = code.to_string(); + let identname = ident.to_string(); + let macro_doc = format!("Arbitrary {:?} code declared with `sassy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); + + quote! { + #[doc = #macro_doc] + #[macro_export] + macro_rules! #ident { + () => {#sourcesass}; + (module) => {#identname}; + (syntax) => {#mode}; + } + } +} + +pub struct MacroSyntax { + ident: Ident, + syntax: ArbitraryStyleSyntax, + code: ArbitraryStyleBlock, +} + +impl Parse for MacroSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + #[cfg(feature = "sass")] + use regex::Regex; + + let ident = input.parse::<Ident>()?; + let mode = input.parse::<ArbitraryStyleSyntax>()?; + let mut code = input.parse::<ArbitraryStyleBlock>()?; + + // this is because of how parsing works. Need to find more elegant way though + // TODO: find a more elegant way + code.code = Regex::new("\n ").expect("BUG: failed to build regex for indentation SASS").replace_all(&code.code, "\n").to_string(); + + Ok(Self { + ident, + syntax: mode, + code, + }) + } +} + +#[cfg(test)] +mod test { + +} diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs new file mode 100644 index 0000000..9d6b0ed --- /dev/null +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -0,0 +1,209 @@ +use proc_macro2::{Span, TokenStream}; +use quote::quote; +use sabry_intrnl::{ + compiler::CompilerAdapter, + config::SabryConfig, + scoper::{ArbitraryScope, ScopedSelector}, +}; +use syn::{parse::Parse, Ident, Token}; + +use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; + +/// Syntax: +/// `pub? #ident(:$syntax)? { $code } \#?` +/// +/// `$syntax`: sass/scss +/// +/// `$code`: intended to be valid based on $syntax +/// +/// `pub` modifier makes scope public +/// +/// `const` modifier completely changes the behaviour of styling, and +/// makes CSS exposed as constant +/// +/// `#` shebang generates machine-readable and well-parsible but invalid rust code for building purposes +/// instead of scope module. +/// +/// The machine-readable output may also be forced by use `machine_readable: true` arg on `parse_macro_syntax` function +/// without modifying tokenstream +pub fn styly_macro_impl(input: TokenStream) -> TokenStream { + let config = match SabryConfig::require() { + Ok(c) => c, + Err(e) => { + return syn::Error::new( + Span::call_site(), + format!( + "Could not read sabry configuration required by this macro: {:?}", + e + ), + ) + .to_compile_error() + } + }; + let ms = match parse_macro_syntax(input) { + Ok(ms) => ms, + Err(e) => return e.to_compile_error(), + }; + + let scope = match ArbitraryScope::from_source(ms.syntax.into(), ms.scope.clone(), &ms.code.code) + { + Ok(s) => match s.hashed(&config.hash) { + Ok(hs) => Ok(hs), + Err(e) => Err(e), + }, + Err(e) => Err(e), + }; + let scope = match scope { + Ok(s) => s, + Err(e) => { + return syn::Error::new( + Span::call_site(), + format!("Could not generate scope: {:?}", e), + ) + .to_compile_error() + } + }; + + match ms.generator { + ScopeGenerator::Module { public, constant } => { + let scope_hash = scope.hash.as_str(); + let scope_ident = scope.original_scope.name; + let scope_wrapper_ident = + syn::parse_str::<Ident>(&scope_ident.to_string().to_uppercase()) + .expect("BUG: We just converted valid Ident to string and uppercased"); + let scope_vis = if public { + quote! {pub} + } else { + quote! {} + }; + + let scope_members = scope + .hashed_selectors + .iter() + .filter_map(|hs| { + hs.html_ident.clone().map(|html| { + let name = match hs.sel { + ScopedSelector::Class(_) => "class", + ScopedSelector::Id(_) => "id", + ScopedSelector::Tag(_) => "tagname", + }; + + (name, hs.sel.gen_rusty_ident(), html, hs.css_ident.clone()) + }) + }) + .map(|(name, ident, html, css)| { + let docs = format!("'{}' {}. CSS selector '{}'", ident, name, css); + quote! { + #[doc = #docs] + #[allow(non_upper_case_globals)] + pub const #ident : &str = #html ; + } + }); + + let mod_docs = format!( + "'{}' style scope. The wrapper class for scoped tagnames is {}", + &scope_ident, &scope_wrapper_ident + ); + let wrp_docs = format!("wrapper class for '{}' scope. If you have any tagname selectors - they should live as children of element with this class applied.", &scope_ident); + + if constant { + let compiler = CompilerAdapter::new(config.clone()); + let css = match compiler.compile_module(ms.syntax.into(), &ms.code.code) { + Ok(c) => c, + Err(e) => { + return syn::Error::new( + ms.code.span, + format!("Could not compile const inline: {e:?}"), + ) + .to_compile_error() + } + }; + + let const_docs = format!("The compiled CSS style for {} scope", &scope_ident); + let const_wrapper_ident = syn::parse_str::<Ident>( + format!("{}_CSS", &scope_ident.to_string().to_uppercase()).as_str(), + ) + .expect("BUG: We just converted valid Ident to string and uppercased"); + + quote! { + #[doc = #const_docs] + #scope_vis const #const_wrapper_ident: &str = #css ; + #[doc = #wrp_docs] + #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; + #[doc = #mod_docs] + #scope_vis mod #scope_ident { + #(#scope_members)* + } + } + } else { + quote! { + #[doc = #wrp_docs] + #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; + #[doc = #mod_docs] + #scope_vis mod #scope_ident { + #(#scope_members)* + } + } + } + } + ScopeGenerator::MachineReadable => { + quote! {} + } + } +} + +// reusable function, that does not return tokenstream for machine-processing at build time +pub fn parse_macro_syntax(input: TokenStream) -> Result<MacroSyntax, syn::Error> { + syn::parse2::<MacroSyntax>(input) +} + +#[derive(Debug)] +pub enum ScopeGenerator { + Module { public: bool, constant: bool }, + MachineReadable, +} + +impl Parse for ScopeGenerator { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let public = input.parse::<Token![pub]>().is_ok(); + let constant = input.parse::<Token![const]>().is_ok(); + + // would be nice to implement compile-time CSS compilation to const + // with `const` modifier, so I'll leave it this way for now + let this = Self::Module { public, constant }; + + Ok(this) + } +} + +#[derive(Debug)] +pub struct MacroSyntax { + /// The way macro should be expanded + pub generator: ScopeGenerator, + /// Scope identifier + pub scope: Ident, + /// Used stytax + pub syntax: ArbitraryStyleSyntax, + /// Style code, either from rust or read from file + pub code: ArbitraryStyleBlock, +} + +impl Parse for MacroSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let mut generator = input.parse::<ScopeGenerator>()?; + let scope = input.parse::<Ident>()?; + let syntax = input.parse::<ArbitraryStyleSyntax>()?; + let code = input.parse::<ArbitraryStyleBlock>()?; + + if input.parse::<Token![#]>().is_ok() { + generator = ScopeGenerator::MachineReadable + } + + Ok(Self { + generator, + scope, + syntax, + code, + }) + } +} diff --git a/sabry_procmacro_impl/src/impls/usey.rs b/sabry_procmacro_impl/src/impls/usey.rs new file mode 100644 index 0000000..730bb4e --- /dev/null +++ b/sabry_procmacro_impl/src/impls/usey.rs @@ -0,0 +1,71 @@ +use proc_macro2::TokenStream; +use quote::quote; +use syn::{parse::Parse, punctuated::Punctuated, Macro, Token}; + +/// Syntax: +/// `#(pub? #macro,)*` +pub fn usey_macro_impl(input: TokenStream) -> TokenStream { + let MacroSyntax { stylecalls } = match syn::parse2(input) { + Ok(ms) => ms, + Err(e) => return e.to_compile_error(), + }; + + let stylecall_pairs = stylecalls + .iter() + .map(|c| c.to_contract_pair("__sabry_pub_module")); + + quote! { + vec![ + #(#stylecall_pairs,)* + ] + } +} + +#[derive(Clone)] +pub struct StyleCall { + vis_pub: bool, + call: Macro, +} + +impl StyleCall { + pub fn to_contract_pair(&self, pub_module: &str) -> TokenStream { + let call_code = &self.call; + let call_path = &self.call.path; + let call_bang = &self.call.bang_token; + // the following calls are expected by macro genereted by `sassy!` + let call_syntax = quote! {#call_path #call_bang (syntax)}; + let call_file = quote! {#call_path #call_bang (module)}; + + if self.vis_pub { + quote! { + (format!("{}.{}", #pub_module, #call_syntax), #call_code .to_string()) + } + } else { + quote! { + (format!("{}.{}", #call_file, #call_syntax), #call_code .to_string()) + } + } + } +} + +impl Parse for StyleCall { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let vis_pub = input.parse::<Token![pub]>().is_ok(); + let call = input.parse::<Macro>()?; + + Ok(Self { vis_pub, call }) + } +} + +pub struct MacroSyntax { + stylecalls: Vec<StyleCall>, +} + +impl Parse for MacroSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let calls = Punctuated::<StyleCall, Token![,]>::parse_separated_nonempty(input)?; + + let stylecalls = calls.iter().cloned().collect(); + Ok(Self { stylecalls }) + } +} diff --git a/sabry_procmacro_impl/src/lib.rs b/sabry_procmacro_impl/src/lib.rs new file mode 100644 index 0000000..daad739 --- /dev/null +++ b/sabry_procmacro_impl/src/lib.rs @@ -0,0 +1,4 @@ +// Moving this to separate crate, cuz I don't wanna to reimplement that parsing again for build magic +// Also, because I can. + +pub mod impls; diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..71317c6 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,6 @@ +#![doc = include_str!("../README.md")] + +#[cfg(feature = "build")] +pub use sabry_build::*; +#[cfg(feature = "procmacro")] +pub use sabry_procmacro::*; From 241423ae06f4f9527c01b94a323522318b38eb36 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 11:18:04 +0500 Subject: [PATCH 002/184] Create cbt.yml Hmm. Never used those. Its time to try --- .github/workflows/cbt.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/cbt.yml diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml new file mode 100644 index 0000000..e649dab --- /dev/null +++ b/.github/workflows/cbt.yml @@ -0,0 +1,23 @@ +name: cargo basic build-test + +on: + push: + pull_request: + +env: + CARGO_TERM_COLOR: always + +jobs: + build_and_test: + name: Sabry - latest + runs-on: ubuntu-latest + strategy: + matrix: + toolchain: + - stable + - nightly + steps: + - uses: actions/checkout@v4 + - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} + - run: cargo build --verbose + - run: cargo test --verbose -all --all-features From 23c0651e7facc7d015d146b6203cb5d98e16d6f2 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 11:21:16 +0500 Subject: [PATCH 003/184] this is gonna take MANY commits :D --- .github/workflows/cbt.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index e649dab..baa6f55 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -2,7 +2,9 @@ name: cargo basic build-test on: push: + branches: ["window", "master"] pull_request: + branches: ["window"] env: CARGO_TERM_COLOR: always From 05f627e45ba4007fede7bae4115a5242ffd65656 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 16:33:50 +0500 Subject: [PATCH 004/184] first-approach implementation of nesting selectors --- examples/use-styles/Cargo.lock | 8 +++--- examples/use-styles/src/main.rs | 4 +++ sabry_intrnl/src/scoper/mod.rs | 2 +- sabry_procmacro_impl/src/impls/styly.rs | 33 +++++++++++++++++++++++-- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 7e7c03c..00f3e98 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -1003,7 +1003,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.0" +version = "0.0.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,7 +1015,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.0" +version = "0.0.1" dependencies = [ "base64", "blake3", @@ -1033,14 +1033,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.0" +version = "0.0.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.0" +version = "0.0.1" dependencies = [ "proc-macro2", "quote", diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 6751b2c..6cdf59d 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -5,6 +5,9 @@ styly!(pub const bundlemod { .someth { @include tokens.clickable; background-color: black; + &-dark { + background-color: white; + } } }); @@ -13,5 +16,6 @@ styly!(pub const filemod:sass "src/main.sass"); fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); + println!("someth-dark selector will be: {}", bundlemod::_dark(bundlemod::someth)); println!("Thats how we used the styles! Good luck!!"); } diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 824aed7..658e8f0 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -294,7 +294,7 @@ impl ScopedSelector { } } -fn apply_basic_rusty_member_gen_rules(source: &str) -> String { +pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { let omit_regex = Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") .expect("BUG: can not build omition regex for rusty member generation"); diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 9d6b0ed..56a977c 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -3,7 +3,7 @@ use quote::quote; use sabry_intrnl::{ compiler::CompilerAdapter, config::SabryConfig, - scoper::{ArbitraryScope, ScopedSelector}, + scoper::{apply_basic_rusty_member_gen_rules, ArbitraryScope, ScopedSelector}, }; use syn::{parse::Parse, Ident, Token}; @@ -67,7 +67,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { match ms.generator { ScopeGenerator::Module { public, constant } => { let scope_hash = scope.hash.as_str(); - let scope_ident = scope.original_scope.name; + let scope_ident = scope.original_scope.name.clone(); let scope_wrapper_ident = syn::parse_str::<Ident>(&scope_ident.to_string().to_uppercase()) .expect("BUG: We just converted valid Ident to string and uppercased"); @@ -77,6 +77,33 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { quote! {} }; + let nests = scope.original_scope.adapter().nesting_selectors(); + let special_nesting_members = nests + .iter() + .filter_map(|ns| { + ns.suffix.clone().and_then(|s| { + let interp = s + .as_sass_interpolated() + .and_then(|i| i.elements.first()) + .and_then(|e| e.as_static()) + .and_then(|s| Some(s.raw.to_string())); + + interp + }) + }) + .map(|s| { + let ident = apply_basic_rusty_member_gen_rules(&s); + let fnident = syn::parse_str::<Ident>(format!("_{ident}").as_str()) + .expect("BUG: invalid ident for nesting selector formed"); + let formatstr = format!("{{c}}{}", &s); + let doc = format!("Nesting selector. Originated from '&{s}'"); + + quote! { + #[doc = #doc] + pub fn #fnident(c: &str) -> String {format!(#formatstr)} + } + }); + let scope_members = scope .hashed_selectors .iter() @@ -133,6 +160,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { #[doc = #mod_docs] #scope_vis mod #scope_ident { #(#scope_members)* + #(#special_nesting_members)* } } } else { @@ -142,6 +170,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { #[doc = #mod_docs] #scope_vis mod #scope_ident { #(#scope_members)* + #(#special_nesting_members)* } } } From 097ef122e708647cd5fe28229d403bb088fcf4b1 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 16:41:45 +0500 Subject: [PATCH 005/184] ensure generated hash is safe --- examples/use-styles/src/main.rs | 4 ++-- sabry_intrnl/src/scoper/hash.rs | 3 ++- sabry_procmacro_impl/src/impls/styly.rs | 3 +-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 6cdf59d..6472b0e 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -5,7 +5,7 @@ styly!(pub const bundlemod { .someth { @include tokens.clickable; background-color: black; - &-dark { + &__dark { background-color: white; } } @@ -16,6 +16,6 @@ styly!(pub const filemod:sass "src/main.sass"); fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); - println!("someth-dark selector will be: {}", bundlemod::_dark(bundlemod::someth)); + //println!("someth-dark selector will be: {}", bundlemod::_dark(bundlemod::someth)); println!("Thats how we used the styles! Good luck!!"); } diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index 9f8a9e4..4188a39 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -2,7 +2,7 @@ use base64::Engine; use crate::config::SabryHashConfig; -use super::ArbitraryScope; +use super::{apply_basic_rusty_member_gen_rules, ArbitraryScope}; /// Convenience wrapper for String-being-a-hash #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -50,6 +50,7 @@ impl ScopeHash { //? This isn't right. "size" is size of hash in symbols. // naaah, its fine :D (Dan) let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(&hash[..size]); + let hash = apply_basic_rusty_member_gen_rules(&hash); Self(hash) } diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 56a977c..4a157d2 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -85,8 +85,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { let interp = s .as_sass_interpolated() .and_then(|i| i.elements.first()) - .and_then(|e| e.as_static()) - .and_then(|s| Some(s.raw.to_string())); + .and_then(|e| e.as_static().map(|s| s.raw.to_string())); interp }) From af571e077883b057b069e67ac1be56767340c173 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 16:51:03 +0500 Subject: [PATCH 006/184] oops, make readme to pass tests --- README.md | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index e969449..7d90fc0 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ At first, I'll show how this crate "tastes". With SABRY, its in your power to: Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with modules, with feature flags, etc. Say "bye" to manual copying, cli-tools and consts. -```rust +```rust,ignore sassy!(tokens {@mixin colored{color: red;}}); ``` @@ -34,7 +34,7 @@ sassy!(tokens {@mixin colored{color: red;}}); Code your SASS in separate files to get proper syntax highlighting, or do sass-in-the-rust to keep things in one place -```rust +```rust,ignore styly!(component {.btn {color: green;}}); styly!(extras "src/components/extras.scss"); ``` @@ -64,7 +64,7 @@ tgk_brandstyle = {version = "0.0.1", features = ["utils"]} `@use` your style-crates in sass code *naturally* -```rust +```rust,ignore styly!(breadcumb { @use 'tokens'; .scope {@include tokens.badge(primary);} @@ -81,7 +81,7 @@ styly!(breadcumb { Keep things as private and modular as you wish -```rust +```rust,ignore styly!(pub cats "src/sections/cats/style.scss"); styly!(dogs {#howl {border: none;}}) @@ -103,7 +103,7 @@ styly!(dogs {#howl {border: none;}}) Compile all the sweet SASS/SCSS into the optimized CSS bundle, ship it in CSS shunks or even include the compiled style into the binary -```rust +```rust,ignore styly!(cssbundle {.c1 {color: white;}}) styly!(const binary {.c2 {color: black;}}) ``` @@ -144,7 +144,7 @@ The only need is the dependency sabry = {version = "0.0.1"} ``` And a proc-macro -```rust +```rust,ignore // lib.rs use sabry::sassy; @@ -175,7 +175,7 @@ Depend on sabry sabry = {version = "0.0.1"} ``` And create a style scope wherever you want: -```rust +```rust,ignore // breadcumblist.rs use sabry::styly; @@ -221,7 +221,7 @@ sabry = {version = "0.0.1", features = ["build"]} > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. Then you have to tell sabry when code should be compiled. We'll do this in *build.rs* file. -```rust +```rust,ignore // build.rs use shared_styles::{mixins, styles}; @@ -237,7 +237,7 @@ fn main(){ `buildy` is the entry function of sabry build-time process. The handy `usey!` macro will do just proper handling of our style-macros for it. Now lets get back to the code and use the mixin defined in another crate: -```rust +```rust,ignore // breadcumblist.rs use sabry::styly; @@ -370,7 +370,7 @@ It does accept the following syntax: `$name(:$syntax)? ({ $code })|($filename)`, - *$filename* is a string literal which contains path to the file relative to package root Examples: -```rust +```rust,ignore sassy!(module1 {$primary-color: red;}); sassy!(module2 "src/assets/module2.scss"); sassy!(module3:sass "src/assets/module3.sass"); @@ -401,7 +401,7 @@ It does accept the following syntax: `pub? const? $ident(:$syntax)? ({ $code })| - *$filename* is a string literal which contains path to the file relative to package root Examples -```rust +```rust,ignore styly!(fox {.fur {color: red; &-dark {color: black;}}}) styly!(pub fox {.fur {color: red; &-dark {color: black;}}}) styly!(pub const fox:sass { @@ -414,7 +414,7 @@ styly!(pub const fox:sass { Every of those calls will produce the styling scope as a module. Differences are explained right below. In general the scope does look like this: -```rust +```rust,ignore const FOX: &str = "J9k_s9"; mod fox { pub const fur: &str = "J9k_s9 fur"; @@ -437,7 +437,7 @@ You can read more about scoping and hashing in the [scoping](#scoping) section. By default generated `mod` is private. You can make both mod and wrapper style constant public by adding the `pub` to macro call: -```rust +```rust,ignore styly!(pub whatever "src/assets/whatever.scss"); ``` @@ -447,11 +447,11 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: -```rust +```rust,ignore styly!(const scope "src/assets/scope.scss"); ``` Which results in following: -```rust +```rust,ignore const SCOPE: &str = /* scope hash */; const SCOPE_CSS: &str = /* compiled from src/assets/scope.scss */; mod scope {/* selector collection */} @@ -475,12 +475,12 @@ Each of those pairs is processed as a file which sabry needs to write into the configured `intermediate_dir` and then passed into the CSS compiler. You could, for example, define the module "mixin_a": -```rust +```rust,ignore buildy(vec![("mixin_a".to_string(), "@mixin a(){}".to_string())]); ``` However there's a usey macro, which handles this for you: -```rust +```rust,ignore buildy( usey!(mixins!(), utils!()) ); @@ -535,7 +535,7 @@ Different selector types are scoped differently: As for **SASS parent selectors**: they are currently handled in different way. Instead of walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: -```rust +```rust,ignore styly!(scope { .cls1 { &-dark {} @@ -543,7 +543,7 @@ styly!(scope { }); ``` is something like -```rust +```rust,ignore const SCOPE: &str = "Ut8CskJ"; mod scope { pub const cls1: &str = "Ut8CskJ cls1"; @@ -561,6 +561,7 @@ This isn't very handy, also isn't strict enough, and is a high-priority subject - [] Crates of styled components - currently the only way to create them seems to be const styly. - [] CSS support +- [] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance - [] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. - [] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. From c133b84ffcf14dc88613681c875efbc28d25e12e Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 17:09:21 +0500 Subject: [PATCH 007/184] we should keep dependencies independent from workspace --- Cargo.lock | 1 + Cargo.toml | 13 ------------- examples/use-styles/Cargo.lock | 1 + sabry_build/Cargo.toml | 6 +++--- sabry_intrnl/Cargo.toml | 26 +++++++++++++------------- sabry_procmacro_impl/Cargo.toml | 11 +++++------ 6 files changed, 23 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 80d7a63..1907822 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1016,6 +1016,7 @@ dependencies = [ "grass", "lightningcss", "proc-macro2", + "quote", "raffia", "regex", "serde", diff --git a/Cargo.toml b/Cargo.toml index c31dc20..3af3f66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,20 +15,7 @@ sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1"} sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1"} sabry_build = {path = "sabry_build", version = "0.0.1"} -syn = {version = "^2.0"} -quote = {version = "^1.0"} -proc-macro2 = {version = "^1.0"} -raffia = {version = "^0.9"} -regex = {version = "^1.11"} -grass = {version = "^0.13"} -lightningcss = {version = "1.0.0-alpha.59"} -blake3 = {version = "^1.5"} -base64 = {version = "^0.22"} -const_format = {version = "^0.2"} -thiserror = {version = "^1.0"} -serde = {version = "^1.0"} -toml = {version = "^0.8"} [workspace.package] diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 00f3e98..8bc46bd 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -1023,6 +1023,7 @@ dependencies = [ "grass", "lightningcss", "proc-macro2", + "quote", "raffia", "regex", "serde", diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index 05d7609..d6ff640 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -10,10 +10,10 @@ license.workspace = true [dependencies] sabry_intrnl = {workspace = true} sabry_procmacro_impl = {workspace = true} -proc-macro2 = {workspace = true, features = ["span-locations"]} -syn = {workspace = true, features = ["visit", "derive", "parsing", "full"]} -thiserror = {workspace = true} +syn = {version = "^2.0", features = ["visit", "derive", "parsing", "full"]} +proc-macro2 = {version = "^1.0", features = ["span-locations"]} +thiserror = {version = "^1.0"} walkdir = {version = "^2.5"} [features] diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 5bf56e5..412f6f5 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -8,20 +8,20 @@ authors.workspace = true license.workspace = true [dependencies] -raffia = {workspace = true} -grass = {workspace = true} -lightningcss = {workspace = true} -blake3 = {workspace = true} -base64 = {workspace = true} +syn = {version = "^2.0"} +quote = {version = "^1.0"} +proc-macro2 = {version = "^1.0"} +raffia = {version = "^0.9"} +regex = {version = "^1.11"} +grass = {version = "^0.13"} +lightningcss = {version = "1.0.0-alpha.59"} +blake3 = {version = "^1.5"} +base64 = {version = "^0.22"} +const_format = {version = "^0.2"} -syn = {workspace = true} -proc-macro2 = {workspace = true} -regex = {workspace = true} -const_format = {workspace = true} - -serde = {workspace = true, features = ["derive"]} -toml = {workspace = true} -thiserror = {workspace = true} +thiserror = {version = "^1.0"} +serde = {version = "^1.0", features = ["derive"]} +toml = {version = "^0.8"} [features] sass = [] diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index c5e0e5b..dbac87d 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -10,12 +10,11 @@ license.workspace = true [dependencies] sabry_intrnl = {workspace = true} -proc-macro2 = {workspace = true, features = ["span-locations"]} -syn = {workspace = true, features = ["parsing"]} -quote = {workspace = true} -regex = {workspace = true} - -raffia = {workspace = true} +syn = {version = "^2.0", features = ["parsing"]} +quote = {version = "^1.0"} +proc-macro2 = {version = "^1.0", features = ["span-locations"]} +raffia = {version = "^0.9"} +regex = {version = "^1.11"} [features] sass = [ From 4fb3b5db7f7b1c1f6f9a0955205b530c27f65568 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 17:12:23 +0500 Subject: [PATCH 008/184] oops, fix regex :D --- sabry_procmacro_impl/src/impls/sassy.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index 6221449..6e89732 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -1,6 +1,7 @@ use proc_macro2::TokenStream; use quote::quote; use syn::{parse::Parse, Ident}; +use regex::Regex; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -43,9 +44,6 @@ pub struct MacroSyntax { impl Parse for MacroSyntax { fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { - #[cfg(feature = "sass")] - use regex::Regex; - let ident = input.parse::<Ident>()?; let mode = input.parse::<ArbitraryStyleSyntax>()?; let mut code = input.parse::<ArbitraryStyleBlock>()?; From ffcebf33762ed7cfb2ff7cbc017a405c584e585a Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 17:15:40 +0500 Subject: [PATCH 009/184] im still learning to write actions --- .github/workflows/cbt.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index baa6f55..aed0fdd 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -22,4 +22,4 @@ jobs: - uses: actions/checkout@v4 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - run: cargo build --verbose - - run: cargo test --verbose -all --all-features + - run: cargo test --verbose --all --all-features From 75981d83a7937d414a716ea714705e6d8b2eee9b Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 17:42:26 +0500 Subject: [PATCH 010/184] drop redundant feature flags, as behavour is consistent between sass syntax types --- Cargo.toml | 14 +------------- examples/define-styles/Cargo.toml | 2 +- examples/leptos-axum/Cargo.toml | 4 ++-- examples/use-styles/Cargo.toml | 4 ++-- sabry_build/Cargo.toml | 8 -------- sabry_intrnl/Cargo.toml | 2 -- sabry_intrnl/src/compiler/mod.rs | 6 ------ sabry_procmacro/Cargo.toml | 6 ------ sabry_procmacro_impl/Cargo.toml | 6 ------ sabry_procmacro_impl/src/impls/mod.rs | 20 -------------------- 10 files changed, 6 insertions(+), 66 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3af3f66..9bab5e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,22 +43,10 @@ sabry_build = {workspace = true, optional = true} sabry_intrnl = {workspace = true} [features] -default = ["scss"] +default = ["procmacro"] procmacro = [ "dep:sabry_procmacro" ] -sass = [ - "procmacro", - "sabry_procmacro/sass", - "sabry_intrnl/sass", - "sabry_build/sass" -] -scss = [ - "procmacro", - "sabry_procmacro/scss", - "sabry_intrnl/scss", - "sabry_build/scss" -] build = [ "dep:sabry_build" ] diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml index 496ecd3..4e80fbe 100644 --- a/examples/define-styles/Cargo.toml +++ b/examples/define-styles/Cargo.toml @@ -6,4 +6,4 @@ rust-version = "1.82" publish = false [dependencies] -sabry = {path = "../../", features = ["sass"]} +sabry = {path = "../../"} diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 7033f16..1b30dbb 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -23,11 +23,11 @@ tracing = { version = "0.1", optional = true } http = "1" # sabry with sass -sabry = {path = "../../", features = ["sass"]} +sabry = {path = "../../"} [build-dependencies] # sabry for build with sass -sabry = {path = "../../", features = ["build", "sass"]} +sabry = {path = "../../", features = ["build"]} # lets depend on our styles define-styles = {path = "../define-styles"} diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml index 77c0ca6..29e0a32 100644 --- a/examples/use-styles/Cargo.toml +++ b/examples/use-styles/Cargo.toml @@ -6,10 +6,10 @@ rust-version = "1.82" publish = false [dependencies] -sabry = {path = "../../", features = ["sass"]} +sabry = {path = "../../"} [build-dependencies] -sabry = {path = "../../", features = ["build", "sass"]} +sabry = {path = "../../", features = ["build"]} define-styles = {path = "../define-styles"} [package.metadata.sabry] diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index d6ff640..c8f8a81 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -17,12 +17,4 @@ thiserror = {version = "^1.0"} walkdir = {version = "^2.5"} [features] -sass = [ - "sabry_procmacro_impl/sass", - "sabry_intrnl/sass" -] -scss = [ - "sabry_procmacro_impl/scss", - "sabry_intrnl/scss" -] net-files = [] diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 412f6f5..457d28f 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -24,5 +24,3 @@ serde = {version = "^1.0", features = ["derive"]} toml = {version = "^0.8"} [features] -sass = [] -scss = [] diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 0c2df2b..7b20556 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -89,18 +89,14 @@ pub enum SabryCompilerError { /// Unification wrapper over all the Syntax enums #[derive(Clone, Copy)] pub enum CompilerSyntax { - #[cfg(feature = "sass")] Sass, - #[cfg(feature = "scss")] Scss, } impl From<raffia::Syntax> for CompilerSyntax { fn from(value: raffia::Syntax) -> Self { match value { - #[cfg(feature = "sass")] raffia::Syntax::Sass => Self::Sass, - #[cfg(feature = "scss")] raffia::Syntax::Scss => Self::Scss, // TODO: fallbacky error-prone _ => Self::Scss, @@ -111,9 +107,7 @@ impl From<raffia::Syntax> for CompilerSyntax { impl From<CompilerSyntax> for grass::InputSyntax { fn from(value: CompilerSyntax) -> Self { match value { - #[cfg(feature = "scss")] CompilerSyntax::Scss => Self::Scss, - #[cfg(feature = "sass")] CompilerSyntax::Sass => Self::Sass, } } diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 1ca3d35..70df668 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -14,9 +14,3 @@ proc-macro = true sabry_procmacro_impl = {workspace = true} [features] -sass = [ - "sabry_procmacro_impl/sass" -] -scss = [ - "sabry_procmacro_impl/scss" -] diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index dbac87d..499f1ce 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -17,9 +17,3 @@ raffia = {version = "^0.9"} regex = {version = "^1.11"} [features] -sass = [ - "sabry_intrnl/sass" -] -scss = [ - "sabry_intrnl/scss" -] diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index e5f9cc5..c2420e2 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -74,18 +74,14 @@ impl ToString for ArbitraryStyleBlock { #[derive(Clone, Copy)] pub enum ArbitraryStyleSyntax { - #[cfg(feature = "scss")] Scss, - #[cfg(feature = "sass")] Sass, } impl From<ArbitraryStyleSyntax> for CompilerSyntax { fn from(value: ArbitraryStyleSyntax) -> Self { match value { - #[cfg(feature = "sass")] ArbitraryStyleSyntax::Sass => Self::Sass, - #[cfg(feature = "scss")] ArbitraryStyleSyntax::Scss => Self::Scss, } } @@ -94,9 +90,7 @@ impl From<ArbitraryStyleSyntax> for CompilerSyntax { impl ToTokens for ArbitraryStyleSyntax { fn to_tokens(&self, tokens: &mut TokenStream) { match self { - #[cfg(feature = "sass")] Self::Sass => tokens.append_all(quote! {"sass"}), - #[cfg(feature = "scss")] Self::Scss => tokens.append_all(quote! {"scss"}), } } @@ -114,9 +108,7 @@ impl Parse for ArbitraryStyleSyntax { let ident = input.parse::<Ident>()?; match ident.to_string().as_str() { - #[cfg(feature = "sass")] "sass" => Ok(Self::Sass), - #[cfg(feature = "scss")] "scss" => Ok(Self::Scss), _ => Err(syn::Error::new( ident.span(), @@ -132,9 +124,7 @@ impl Parse for ArbitraryStyleSyntax { impl Debug for ArbitraryStyleSyntax { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let name = match self { - #[cfg(feature = "sass")] Self::Sass => "sass", - #[cfg(feature = "scss")] Self::Scss => "scss", }; write!(f, "{name}") @@ -142,23 +132,15 @@ impl Debug for ArbitraryStyleSyntax { } impl Default for ArbitraryStyleSyntax { - #[cfg(feature = "scss")] fn default() -> Self { Self::Scss } - - #[cfg(all(feature = "sass", not(feature = "scss")))] - fn default() -> Self { - Self::Sass - } } impl From<ArbitraryStyleSyntax> for raffia::Syntax { fn from(value: ArbitraryStyleSyntax) -> Self { match value { - #[cfg(feature = "sass")] ArbitraryStyleSyntax::Sass => Self::Sass, - #[cfg(feature = "scss")] ArbitraryStyleSyntax::Scss => Self::Scss, } } @@ -166,7 +148,6 @@ impl From<ArbitraryStyleSyntax> for raffia::Syntax { #[cfg(test)] mod test { - #[cfg(feature = "sass")] #[test] fn arbitrary_style_block_sass() { use super::ArbitraryStyleBlock; @@ -183,7 +164,6 @@ mod test { assert_eq!(code, block.code); } - #[cfg(feature = "scss")] #[test] fn arbitrary_style_block_scss() { use super::ArbitraryStyleBlock; From a5f4451177b80726e294c865e92a657f86e8f5ef Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 17:51:49 +0500 Subject: [PATCH 011/184] micro: set repistory for packages micro: fmt micro: set repistory for packages micro: release.toml micro: prepare for crates publish. Im crazy micro: prepare for crates publish. Im crazy micro: prepare for crates publish. Im crazy micro: prepare for crates publish. Im crazy micro: prepare for crates publish. Im crazy --- Cargo.lock | 10 +-- Cargo.toml | 15 ++--- examples/leptos-axum/README.md | 86 +------------------------ release.toml | 8 +++ sabry_build/Cargo.toml | 1 + sabry_build/README.md | 8 +++ sabry_build/src/buildmagic.rs | 8 +-- sabry_build/src/lib.rs | 2 + sabry_intrnl/Cargo.toml | 1 + sabry_intrnl/README.md | 8 +++ sabry_intrnl/src/lib.rs | 2 + sabry_procmacro/Cargo.toml | 1 + sabry_procmacro/README.md | 8 +++ sabry_procmacro/src/lib.rs | 2 + sabry_procmacro_impl/Cargo.toml | 1 + sabry_procmacro_impl/README.md | 8 +++ sabry_procmacro_impl/src/impls/sassy.rs | 11 ++-- sabry_procmacro_impl/src/lib.rs | 2 + 18 files changed, 74 insertions(+), 108 deletions(-) create mode 100644 release.toml create mode 100644 sabry_build/README.md create mode 100644 sabry_intrnl/README.md create mode 100644 sabry_procmacro/README.md create mode 100644 sabry_procmacro_impl/README.md diff --git a/Cargo.lock b/Cargo.lock index 1907822..74b0b99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -987,7 +987,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1" +version = "0.0.0" dependencies = [ "sabry_build", "sabry_intrnl", @@ -996,7 +996,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1" +version = "0.0.0" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1008,7 +1008,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1" +version = "0.0.0" dependencies = [ "base64", "blake3", @@ -1027,14 +1027,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1" +version = "0.0.0" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1" +version = "0.0.0" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 9bab5e4..7bce3ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,19 +10,17 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1"} -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1"} -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1"} -sabry_build = {path = "sabry_build", version = "0.0.1"} - - - +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.0"} +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.0"} +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.0"} +sabry_build = {path = "sabry_build", version = "0.0.0"} [workspace.package] -version = "0.0.1" +version = "0.0.0" edition = "2021" rust-version = "1.82" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] +repository = "https://github.com/yiffyrusdev/sabry" license = "MIT" publish = true @@ -30,6 +28,7 @@ publish = true name = "sabry" description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust." keywords = ["web", "sass", "scss", "macro"] +repository.workspace = true version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/examples/leptos-axum/README.md b/examples/leptos-axum/README.md index e5d3c4a..bbfcf13 100644 --- a/examples/leptos-axum/README.md +++ b/examples/leptos-axum/README.md @@ -3,88 +3,4 @@ <img src="https://raw.githubusercontent.com/leptos-rs/leptos/main/docs/logos/Leptos_logo_RGB.svg" alt="Leptos Logo"> </picture> -# Leptos Axum Starter Template - -This is a template for use with the [Leptos](https://github.com/leptos-rs/leptos) web framework and the [cargo-leptos](https://github.com/akesson/cargo-leptos) tool using [Axum](https://github.com/tokio-rs/axum). - -## Creating your template repo - -If you don't have `cargo-leptos` installed you can install it with - -```bash -cargo install cargo-leptos --locked -``` - -Then run -```bash -cargo leptos new --git https://github.com/leptos-rs/start-axum-0.7 -``` - -to generate a new project template. - -```bash -cd leptos-axum -``` - -to go to your newly created project. -Feel free to explore the project structure, but the best place to start with your application code is in `src/app.rs`. -Addtionally, Cargo.toml may need updating as new versions of the dependencies are released, especially if things are not working after a `cargo update`. - -## Running your project - -```bash -cargo leptos watch -``` - -## Installing Additional Tools - -By default, `cargo-leptos` uses `nightly` Rust, `cargo-generate`, and `sass`. If you run into any trouble, you may need to install one or more of these tools. - -1. `rustup toolchain install nightly --allow-downgrade` - make sure you have Rust nightly -2. `rustup target add wasm32-unknown-unknown` - add the ability to compile Rust to WebAssembly -3. `cargo install cargo-generate` - install `cargo-generate` binary (should be installed automatically in future) -4. `npm install -g sass` - install `dart-sass` (should be optional in future - -## Compiling for Release -```bash -cargo leptos build --release -``` - -Will generate your server binary in target/server/release and your site package in target/site - -## Testing Your Project -```bash -cargo leptos end-to-end -``` - -```bash -cargo leptos end-to-end --release -``` - -Cargo-leptos uses Playwright as the end-to-end test tool. -Tests are located in end2end/tests directory. - -## Executing a Server on a Remote Machine Without the Toolchain -After running a `cargo leptos build --release` the minimum files needed are: - -1. The server binary located in `target/server/release` -2. The `site` directory and all files within located in `target/site` - -Copy these files to your remote server. The directory structure should be: -```text -leptos-axum -site/ -``` -Set the following environment variables (updating for your project as needed): -```text -LEPTOS_OUTPUT_NAME="leptos-axum" -LEPTOS_SITE_ROOT="site" -LEPTOS_SITE_PKG_DIR="pkg" -LEPTOS_SITE_ADDR="127.0.0.1:3000" -LEPTOS_RELOAD_PORT="3001" -``` -Finally, run the server binary. - -## Licensing - -This template itself is released under the Unlicense. You should replace the LICENSE for your own application with an appropriate license if you plan to release it publicly. +This is an example of sabry with leptos-axum, made with [leptos-axum sterter template](https://github.com/leptos-rs/start-axum) diff --git a/release.toml b/release.toml new file mode 100644 index 0000000..d60c78b --- /dev/null +++ b/release.toml @@ -0,0 +1,8 @@ +allow-branch = ["master"] +sign-commit = true +sign-tag = true +target = "x86_64-unknown-linux-gnu" + +pre-release-replacements = [ + {file="README.md", search='sabry = {\s?version = "[0-9a-z\-\.]*"(?<rest>.*)\s?}', replace='sabry = { version = "{{version}}" $rest}'}, +] diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index c8f8a81..526a350 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -2,6 +2,7 @@ name = "sabry_build" description = "Sabry build magic as a separate crate" version.workspace = true +repository.workspace = true edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/sabry_build/README.md b/sabry_build/README.md new file mode 100644 index 0000000..51da6c9 --- /dev/null +++ b/sabry_build/README.md @@ -0,0 +1,8 @@ +sabry_build is an internal-ish part of the sabry lib, you should probably start from [here](https://crates.io/crates/sabry) + +There is very low probability, that you should depend on this crate, instead do: + +```rust,ignore +[dependencies] +sabry = {version = "0.0.1"} +``` diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index c3e6439..f9abcf7 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -4,15 +4,13 @@ use std::{ fs::{self, OpenOptions}, io::{self, Write}, path::PathBuf, - str::FromStr, vec, + str::FromStr, + vec, }; use sabry_intrnl::{ compiler::{CompilerAdapter, SabryCompilerError}, - config::{ - manifest::ManifestError, - BehavHashCollision, BehavSassModCollision, SabryConfig, - }, + config::{manifest::ManifestError, BehavHashCollision, BehavSassModCollision, SabryConfig}, scoper::{hash::ScopeHash, ArbitraryScope, ScopeError}, }; use sabry_procmacro_impl::impls::styly; diff --git a/sabry_build/src/lib.rs b/sabry_build/src/lib.rs index 180dbd0..ecac97d 100644 --- a/sabry_build/src/lib.rs +++ b/sabry_build/src/lib.rs @@ -1,3 +1,5 @@ +#![doc = include_str!("../README.md")] + pub mod buildmagic; pub mod filevisit; pub use buildmagic::*; diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 457d28f..19d7f51 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -2,6 +2,7 @@ name = "sabry_intrnl" description = "Sabry internal, yet still public library" version.workspace = true +repository.workspace = true edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md new file mode 100644 index 0000000..7c3e17d --- /dev/null +++ b/sabry_intrnl/README.md @@ -0,0 +1,8 @@ +sabry_intrnl is an internal-ish part of the sabry lib, you should probably start from [here](https://crates.io/crates/sabry) + +There is very low probability, that you should depend on this crate, instead do: + +```rust,ignore +[dependencies] +sabry = {version = "0.0.1"} +``` diff --git a/sabry_intrnl/src/lib.rs b/sabry_intrnl/src/lib.rs index ec12902..495a300 100644 --- a/sabry_intrnl/src/lib.rs +++ b/sabry_intrnl/src/lib.rs @@ -1,3 +1,5 @@ +#![doc = include_str!("../README.md")] + pub mod compiler; pub mod config; pub mod scoper; diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 70df668..932a3d2 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -2,6 +2,7 @@ name = "sabry_procmacro" description = "Sabry proc-macro declarations" version.workspace = true +repository.workspace = true edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md new file mode 100644 index 0000000..6de0068 --- /dev/null +++ b/sabry_procmacro/README.md @@ -0,0 +1,8 @@ +sabry_procmacro is an internal-ish part of the sabry lib, you should probably start from [here](https://crates.io/crates/sabry) + +There is very low probability, that you should depend on this crate, instead do: + +```rust,ignore +[dependencies] +sabry = {version = "0.0.1"} +``` diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index d5ede42..b05f1d9 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -1,3 +1,5 @@ +#![doc = include_str!("../README.md")] + use proc_macro::TokenStream; use sabry_procmacro_impl::impls::{ sassy::sassy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index 499f1ce..b170930 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -2,6 +2,7 @@ name = "sabry_procmacro_impl" description = "Sabry proc-macro internals reusable outside of proc-macro context" version.workspace = true +repository.workspace = true edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md new file mode 100644 index 0000000..eb13d81 --- /dev/null +++ b/sabry_procmacro_impl/README.md @@ -0,0 +1,8 @@ +sabry_procmacro_impl is an internal-ish part of the sabry lib, you should probably start from [here](https://crates.io/crates/sabry) + +There is very low probability, that you should depend on this crate, instead do: + +```rust,ignore +[dependencies] +sabry = {version = "0.0.1"} +``` diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index 6e89732..16fe436 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -1,7 +1,7 @@ use proc_macro2::TokenStream; use quote::quote; -use syn::{parse::Parse, Ident}; use regex::Regex; +use syn::{parse::Parse, Ident}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -50,7 +50,10 @@ impl Parse for MacroSyntax { // this is because of how parsing works. Need to find more elegant way though // TODO: find a more elegant way - code.code = Regex::new("\n ").expect("BUG: failed to build regex for indentation SASS").replace_all(&code.code, "\n").to_string(); + code.code = Regex::new("\n ") + .expect("BUG: failed to build regex for indentation SASS") + .replace_all(&code.code, "\n") + .to_string(); Ok(Self { ident, @@ -61,6 +64,4 @@ impl Parse for MacroSyntax { } #[cfg(test)] -mod test { - -} +mod test {} diff --git a/sabry_procmacro_impl/src/lib.rs b/sabry_procmacro_impl/src/lib.rs index daad739..8bc1266 100644 --- a/sabry_procmacro_impl/src/lib.rs +++ b/sabry_procmacro_impl/src/lib.rs @@ -1,3 +1,5 @@ +#![doc = include_str!("../README.md")] + // Moving this to separate crate, cuz I don't wanna to reimplement that parsing again for build magic // Also, because I can. From cf03ff206d00b4a69eab8d12c442de98c86d78bf Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 18:35:14 +0500 Subject: [PATCH 012/184] chore: Release --- Cargo.lock | 10 +++++----- Cargo.toml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 74b0b99..91a3997 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -987,7 +987,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "sabry_build", "sabry_intrnl", @@ -996,7 +996,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1008,7 +1008,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "base64", "blake3", @@ -1027,14 +1027,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 7bce3ff..d244cf6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.0"} -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.0"} -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.0"} -sabry_build = {path = "sabry_build", version = "0.0.0"} +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-alpha.1" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-alpha.1" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-alpha.1" } +sabry_build = {path = "sabry_build", version = "0.0.1-alpha.1" } [workspace.package] -version = "0.0.0" +version = "0.0.1-alpha.1" edition = "2021" rust-version = "1.82" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From dc6d3f118a3309d6a3409b4ea857f0495737106d Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 19:41:37 +0500 Subject: [PATCH 013/184] fix awfull typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d90fc0..775a6dc 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ Also, just about everything is pub-available in this crate - Sabry is ready for Feel free to check out examples: -|[crate of styles](./examples//define-styles/)|[style usage](./examples/use-styles/)|[leptox-axum with sabry](./examples/leptos-axum)| +|[crate of styles](./examples//define-styles/)|[style usage](./examples/use-styles/)|[leptos-axum with sabry](./examples/leptos-axum)| |-|-|-| ### Create a crate full of arbitrary SASS From e4c27f7caed11e3582018200bf5943a8c556581d Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 06:06:00 +0500 Subject: [PATCH 014/184] wow, nice badges --- LICENSE | 21 +++++++++++++++++++++ README.md | 24 ++++++++++++++---------- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/LICENSE b/LICENSE index e69de29..c63862d 100644 --- a/LICENSE +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Svyatoslav Pushkarev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 775a6dc..ea37bb7 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ > > the latest-trashy state is in the "window" branch +[![Crates.io](https://img.shields.io/crates/v/sabry.svg)](https://crates.io/crates/sabry) +[![Docs.rs](https://img.shields.io/docsrs/sabry/latest.svg)](https://docs.rs/sabry) +[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/yiffyrusdev/sabry/blob/master/LICENSE) + At first, I'll show how this crate "tastes". With SABRY, its in your power to: <table> @@ -65,7 +69,7 @@ tgk_brandstyle = {version = "0.0.1", features = ["utils"]} `@use` your style-crates in sass code *naturally* ```rust,ignore -styly!(breadcumb { +styly!(breadbadge { @use 'tokens'; .scope {@include tokens.badge(primary);} }) @@ -176,11 +180,11 @@ sabry = {version = "0.0.1"} ``` And create a style scope wherever you want: ```rust,ignore -// breadcumblist.rs +// breadbadgelist.rs use sabry::styly; styly!(const styles { - .cumbs { + .badges { display: flex; &__list { display: flex; @@ -192,8 +196,8 @@ styly!(const styles { }); fn render() -> HtmlElement { - div().class(styles::cumbs).chain( - ul().class(styles::_list(styles::cumbs)) + div().class(styles::badges).chain( + ul().class(styles::_list(styles::badges)) ).chain( span().id(styles::thewolf) ) @@ -201,7 +205,7 @@ fn render() -> HtmlElement { ``` > That `const` usage is covered in the [following](#constant-styly-scopes) section. In this example we dont invoke sabry build-magic, so, to be as close to real life as possible, I used a const. -Every selector, if that does make sense, now available for you as a member of `styles` scope. In this example - `styles::cumbs`, `styles::thewolf` and `styles::_list()`. More about scoping and member names you can read [here](#styly-scopes). +Every selector, if that does make sense, now available for you as a member of `styles` scope. In this example - `styles::badges`, `styles::thewolf` and `styles::_list()`. More about scoping and member names you can read [here](#styly-scopes). ### Use styles earlier created in another crate @@ -238,12 +242,12 @@ fn main(){ Now lets get back to the code and use the mixin defined in another crate: ```rust,ignore -// breadcumblist.rs +// breadbadgelist.rs use sabry::styly; styly!(styles { @use "mixins"; - .cumbs { + .badges { display: flex; &__list { display: flex; @@ -255,8 +259,8 @@ styly!(styles { }); fn render() -> HtmlElement { - div().class(styles::cumbs).chain( - ul().class(styles::_list(styles::cumbs)) + div().class(styles::badges).chain( + ul().class(styles::_list(styles::badges)) ).chain( span().id(styles::thewolf) ) From f1c6d39893a19033188c586f45557358a26e08cc Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 08:07:24 +0500 Subject: [PATCH 015/184] more comprehensive error messages on file load --- sabry_procmacro_impl/src/impls/mod.rs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index c2420e2..a6876d8 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -1,4 +1,4 @@ -use std::{fmt::Debug, fs}; +use std::{fmt::Debug, fs, path::PathBuf, str::FromStr}; use proc_macro2::{Span, TokenStream}; use quote::{quote, ToTokens, TokenStreamExt}; @@ -36,9 +36,28 @@ impl Parse for ArbitraryStyleBlock { let (code, span) = if let Ok(path_tok) = input.parse::<LitStr>() { let path = path_tok.value(); - let iofile = match fs::read(&path) { + let path = match PathBuf::from_str(&path) { + Ok(p) => p, + Err(_) => { + return Err(syn::Error::new( + path_tok.span(), + format!("Could not read {} as a path: Infallible", path), + )) + } + }; + let fullpath = match path.canonicalize() { + Ok(cp) => cp, + Err(e) => { + return Err(syn::Error::new( + path_tok.span(), + format!("Could not use path {path:?}: {:?}", e.kind()), + )) + } + }; + + let iofile = match fs::read(&fullpath) { Ok(bf) => bf, - Err(_) => return Err(syn::Error::new(path_tok.span(), format!("Could not read file '{path}'. Perhaps its relative? Thats not currently supported :("))) + Err(_) => return Err(syn::Error::new(path_tok.span(), format!("Could not read file at {fullpath:?}"))) }; let code = String::from_utf8_lossy(&iofile).to_string(); From c188c47f3955894cf08d0378b54f5966a6bf8bf1 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 08:07:43 +0500 Subject: [PATCH 016/184] example with files --- examples/define-styles/Cargo.lock | 50 +++------------------------ examples/define-styles/src/lib.rs | 2 ++ examples/define-styles/src/style.scss | 5 +++ 3 files changed, 12 insertions(+), 45 deletions(-) create mode 100644 examples/define-styles/src/style.scss diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index 963559d..ce5f0bc 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -994,28 +994,15 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1" +version = "0.0.1-alpha.1" dependencies = [ - "sabry_build", "sabry_intrnl", "sabry_procmacro", ] -[[package]] -name = "sabry_build" -version = "0.0.0" -dependencies = [ - "proc-macro2", - "sabry_intrnl", - "sabry_procmacro_impl", - "syn 2.0.85", - "thiserror", - "walkdir", -] - [[package]] name = "sabry_intrnl" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "base64", "blake3", @@ -1023,6 +1010,7 @@ dependencies = [ "grass", "lightningcss", "proc-macro2", + "quote", "raffia", "regex", "serde", @@ -1033,14 +1021,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "proc-macro2", "quote", @@ -1050,15 +1038,6 @@ dependencies = [ "syn 2.0.85", ] -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -1290,16 +1269,6 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1361,15 +1330,6 @@ version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys", -] - [[package]] name = "windows-sys" version = "0.59.0" diff --git a/examples/define-styles/src/lib.rs b/examples/define-styles/src/lib.rs index bdf62c3..d53f80c 100644 --- a/examples/define-styles/src/lib.rs +++ b/examples/define-styles/src/lib.rs @@ -1,5 +1,7 @@ use sabry::sassy; +sassy!(style "src/style.scss"); + sassy!(utils { @mixin flex($direction, $align, $justify, $gap: .5rem) { display: flex; diff --git a/examples/define-styles/src/style.scss b/examples/define-styles/src/style.scss new file mode 100644 index 0000000..d60a314 --- /dev/null +++ b/examples/define-styles/src/style.scss @@ -0,0 +1,5 @@ +@use "theme" as *; + +.codeblock { + background: $thm-surface-primary; +} From 5e1f16a4d71c31c8229f28856f09a55007c3de77 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 08:55:00 +0500 Subject: [PATCH 017/184] introduce lepty-scoping, which is more effective and more nice - especially with leptos --- .github/workflows/cbt.yml | 3 +- Cargo.lock | 1 + Cargo.toml | 3 + README.md | 69 +++++++++++++++++++++ examples/leptos-axum/Cargo.toml | 9 +-- examples/leptos-axum/src/routes/home.rs | 26 +++----- examples/leptos-axum/src/routes/home.scss | 11 ++++ sabry_intrnl/Cargo.toml | 2 + sabry_intrnl/src/scoper/mod.rs | 73 +++++++++++++++++++---- 9 files changed, 162 insertions(+), 35 deletions(-) diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index aed0fdd..b8773f0 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -6,7 +6,7 @@ on: pull_request: branches: ["window"] -env: +env: CARGO_TERM_COLOR: always jobs: @@ -22,4 +22,5 @@ jobs: - uses: actions/checkout@v4 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - run: cargo build --verbose + - run: cargo test --verbose --all - run: cargo test --verbose --all --all-features diff --git a/Cargo.lock b/Cargo.lock index 91a3997..bd98667 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1012,6 +1012,7 @@ version = "0.0.1-alpha.1" dependencies = [ "base64", "blake3", + "cfg-if", "const_format", "grass", "lightningcss", diff --git a/Cargo.toml b/Cargo.toml index d244cf6..1cc9c1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,6 +43,9 @@ sabry_intrnl = {workspace = true} [features] default = ["procmacro"] +lepty-scoping = [ + "sabry_intrnl/lepty-scoping" +] procmacro = [ "dep:sabry_procmacro" ] diff --git a/README.md b/README.md index ea37bb7..34f0d86 100644 --- a/README.md +++ b/README.md @@ -268,6 +268,73 @@ fn render() -> HtmlElement { ``` So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` function call is now accessible with simple and natural `@use "mixins"` SASS rule! +### Leptos specials + +With [leptos](https://github.com/leptos-rs/leptos) framework you can do the trick to apply some class to most of HtmlElements for the entire component/island: + +```rust,ignore +#[component] +fn component() -> impl IntoView { + view! {class="cls1", /* <- here */ + <h1>"Head"</h1> + <p>"text"</p> + } +} +``` +... and have "cls1" on both `h1` and `p` auto-assigned. Isn't this cool? + +So, if you're on leptos, and don't mind to take this approach, I'd highly recommend turning the *lepty-scoping* feature on: + +```toml +# Cargo.toml + +[dependencies] +sabry = {version = "0.0.1", features = ["lepty-scoping"]} + +[build-dependencies] +sabry = {version = "0.0.1", features = ["build", "lepty-scoping"]} +``` + +```rust,ignore +styly!(scope { + @use "tokens"; + h1 { + @include tokens.sectionhead(); + img { + @include tokens.sectionimg(); + } + } + .breadcumbs { + @include tokens.badgelist(); + &__item { + @include tokens.badge(secondary); + } + } +}); + +#[component] +fn component() -> impl IntoView { + view! {class=SCOPE, + <h1> + "Head" + <img src="whatever"/> + </h1> + <ul class=scope::breadcumbs> + <li class=scope::___item(scope::breadcumbs)> + "Home page" + </li> + </ul> + } +} +``` + +That will perform *much* better: + +- All scope members - like `scope::breadcumbs` - wont contain repeating scope hash, just the original class/id selector +- You will not encounter [the catch](#scoping) with nested tagname selectors + +Also, this isn't really exclusive leptos-supporting feature. It just changes scoping behavour. + ## Configuration Sabry configuration lives in `[package.metadata.sabry]` table of the manifest file. @@ -535,6 +602,8 @@ Different selector types are scoped differently: > > Also if there are nested tagname selectors - sabry won't take this into account and you'll > have to wrap them with `SCOPE` class as well +> +> **However** If you are able to apply some class to all html elements you have - like `view!{class=CLASS...}` with Leptos - you could use *lepty-scoping* feature flag for sabry and get rid of this catch! See more [here](#leptos-specials). As for **SASS parent selectors**: they are currently handled in different way. Instead of walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 1b30dbb..39e1e43 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -23,11 +23,11 @@ tracing = { version = "0.1", optional = true } http = "1" # sabry with sass -sabry = {path = "../../"} +sabry = {path = "../../", features = ["lepty-scoping"]} [build-dependencies] # sabry for build with sass -sabry = {path = "../../", features = ["build"]} +sabry = {path = "../../", features = ["build", "lepty-scoping"]} # lets depend on our styles define-styles = {path = "../define-styles"} @@ -51,11 +51,12 @@ css.minify = true css.bundle = "target/.sabry/target/bundle.css" [package.metadata.leptos] +# Sabry-specific quality of life config +style-file = "target/.sabry/target/bundle.css" + output-name = "leptos-axum" site-root = "target/site" site-pkg-dir = "pkg" -# Sabry-generated bundle for leptos -style-file = "target/.sabry/target/bundle.css" assets-dir = "public" site-addr = "127.0.0.1:3000" reload-port = 3001 diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index 0e06caf..1c006db 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -1,18 +1,7 @@ use leptos::prelude::*; use sabry::styly; -styly!(s "src/routes/home.scss"); - -styly!(s2 { - @use "theme"; - .card { - @include theme.surface(secondary); - } - .pocwarn { - @include theme.surface(secondary); - text-transform: uppercase; - } -}); +styly!(style "src/routes/home.scss"); /// Renders the home page of your application. #[component] @@ -21,13 +10,14 @@ pub fn Route() -> impl IntoView { let count = RwSignal::new(0); let on_click = move |_| *count.write() += 1; - view! { - <section class=s::table> + view! {class = STYLE, + <section class=style::table> <h1>"Welcome to Leptos!"</h1> - <button class=s::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> - <span class=s2::card>"DISCLAIMER:"</span> - <p class=s2::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> - <p class=s2::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> + <button class=style::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <button class=style::_dark(style::btn) on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <span class=style::card>"DISCLAIMER:"</span> + <p class=style::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> + <p class=style::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> </section> } } diff --git a/examples/leptos-axum/src/routes/home.scss b/examples/leptos-axum/src/routes/home.scss index 67e7ec1..d9ef063 100644 --- a/examples/leptos-axum/src/routes/home.scss +++ b/examples/leptos-axum/src/routes/home.scss @@ -4,9 +4,20 @@ .btn { @include tokens.clickable(accent); + &-dark { + @include tokens.clickable(secondary, 0.8, 1.1); + } } .table { @include utils.flex(column, center, center); @include theme.surface(primary); } + +.card { + @include theme.surface(secondary); +} +.pocwarn { + @include theme.surface(secondary); + text-transform: uppercase; +} diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 19d7f51..41c5cbc 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -23,5 +23,7 @@ const_format = {version = "^0.2"} thiserror = {version = "^1.0"} serde = {version = "^1.0", features = ["derive"]} toml = {version = "^0.8"} +cfg-if = {version = "^1.0"} [features] +lepty-scoping = [] diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 658e8f0..0d82a7d 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -1,3 +1,4 @@ +use cfg_if::cfg_if; use hash::ScopeHash; use raffia::Spanned; use regex::Regex; @@ -187,10 +188,22 @@ impl HashedSelector { // As we dont want to use two HTML props for a single ID, // ID scoping is done with id modification ScopedSelector::Id(a) => { - format!("{}-{}", hash.as_str(), a.ident) + cfg_if! { + if #[cfg(feature = "lepty-scoping")] { + format!("{}.{}", a.ident, hash.as_str()) + } else { + format!("{}-{}", hash.as_str(), a.ident) + } + } } ScopedSelector::Tag(a) => { - format!(".{} {}", hash.as_str(), a.ident) + cfg_if! { + if #[cfg(feature = "lepty-scoping")] { + format!("{}.{}", a.ident, hash.as_str()) + } else { + format!(".{} {}", hash.as_str(), a.ident) + } + } } } } @@ -205,10 +218,26 @@ impl HashedSelector { pub fn make_hashed_html(value: &ScopedSelector, hash: &ScopeHash) -> Option<String> { match value { // Class scoping is done with class composition - ScopedSelector::Class(a) => Some(format!("{} {}", hash.as_str(), a.ident)), + ScopedSelector::Class(a) => { + cfg_if! { + if #[cfg(feature = "lepty-scoping")] { + Some(a.ident.to_string()) + } else { + Some(format!("{} {}", hash.as_str(), a.ident)) + } + } + }, // As we dont want to use two HTML props for a single ID, // ID scoping is done with id modification - ScopedSelector::Id(a) => Some(format!("{}-{}", hash.as_str(), a.ident)), + ScopedSelector::Id(a) => { + cfg_if! { + if #[cfg(feature = "lepty-scoping")] { + Some(a.ident.to_string()) + } else { + Some(format!("{}-{}", hash.as_str(), a.ident)) + } + } + }, ScopedSelector::Tag(_) => None, } } @@ -330,6 +359,7 @@ pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { mod test { use std::collections::HashSet; + use cfg_if::cfg_if; use syn::Ident; use crate::{ @@ -345,14 +375,33 @@ mod test { ".cls1{color:red; &-dark{color: black;} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; let hash = ScopeHash::test_init("F2kf8nMs".into()); - let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; - let expect_selector_htmls = HashSet::from([ - "F2kf8nMs cls1".to_string(), - "F2kf8nMs-id1".to_string(), - "F2kf8nMs cls3".to_string(), - "F2kf8nMs-id2".to_string(), - "".to_string(), // comes from `div` which has no html hashed code, still want to check presense - ]); + cfg_if! { + if #[cfg(feature = "lepty-scoping")]{ + let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #id1.F2kf8nMs {color:green;} div.F2kf8nMs {color:blue;}} .F2kf8nMs.cls3#id2.F2kf8nMs{color: black;}"; + } else { + let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; + } + } + + cfg_if! { + if #[cfg(feature = "lepty-scoping")] { + let expect_selector_htmls = HashSet::from([ + "cls1".to_string(), + "id1".to_string(), + "cls3".to_string(), + "id2".to_string(), + "".to_string(), // comes from `div` which has no html hashed code, still want to check presense + ]); + } else { + let expect_selector_htmls = HashSet::from([ + "F2kf8nMs cls1".to_string(), + "F2kf8nMs-id1".to_string(), + "F2kf8nMs cls3".to_string(), + "F2kf8nMs-id2".to_string(), + "".to_string(), // comes from `div` which has no html hashed code, still want to check presense + ]); + } + } let scope = ArbitraryScope::from_source( raffia::Syntax::Scss, From 13ac29a2337c7cb6a73c34002feeab5339ce1707 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 09:15:42 +0500 Subject: [PATCH 018/184] use lepty-scoping in examples --- README.md | 2 ++ examples/leptos-axum/src/routes/home.rs | 44 +++++++++++++++++++++-- examples/leptos-axum/src/routes/home.scss | 23 ------------ 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 34f0d86..6ab6e0b 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,8 @@ Every selector, if that does make sense, now available for you as a member of `s ### Use styles earlier created in another crate +> **Tip** | If you use [leptos](https://github.com/leptos-rs/leptos) - check [this](#leptos-specials) section as well + The combination of previous two, with some additional work to do and some extra sugar to enjoy. Sabry is needed as both dependency and build-dependency. diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index 1c006db..b79682d 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -1,7 +1,41 @@ use leptos::prelude::*; use sabry::styly; -styly!(style "src/routes/home.scss"); +styly!(style { + @use "tokens"; + @use "utils"; + @use "theme"; + + h2 { + margin-bottom: 1rem; + @include theme.surface(primary); + @include theme.txt(primary); + span { + @include theme.txt(accent); + } + } + + .btn { + @include tokens.clickable(accent); + &-dark { + @include tokens.clickable(secondary, 0.8, 1.1); + } + } + + .table { + @include utils.flex(column, center, center); + @include theme.surface(primary); + } + + .card { + @include theme.surface(secondary); + } + .pocwarn { + @include theme.surface(secondary); + text-transform: uppercase; + } + +}); /// Renders the home page of your application. #[component] @@ -12,7 +46,13 @@ pub fn Route() -> impl IntoView { view! {class = STYLE, <section class=style::table> - <h1>"Welcome to Leptos!"</h1> + <h2>"Welcome to Leptos"</h2> + <h2 class=""> + "This head is styled with lepty-scopes feature" + <br/> + <span class="">"And this child too!"</span> + </h2> + <button class=style::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> <button class=style::_dark(style::btn) on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> <span class=style::card>"DISCLAIMER:"</span> diff --git a/examples/leptos-axum/src/routes/home.scss b/examples/leptos-axum/src/routes/home.scss index d9ef063..e69de29 100644 --- a/examples/leptos-axum/src/routes/home.scss +++ b/examples/leptos-axum/src/routes/home.scss @@ -1,23 +0,0 @@ -@use "tokens"; -@use "utils"; -@use "theme"; - -.btn { - @include tokens.clickable(accent); - &-dark { - @include tokens.clickable(secondary, 0.8, 1.1); - } -} - -.table { - @include utils.flex(column, center, center); - @include theme.surface(primary); -} - -.card { - @include theme.surface(secondary); -} -.pocwarn { - @include theme.surface(secondary); - text-transform: uppercase; -} From 4588eb9b1d7fb3ce984699db624354525955efe1 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 09:20:00 +0500 Subject: [PATCH 019/184] chore: Release --- Cargo.lock | 10 +++++----- Cargo.toml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd98667..edd82bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -987,7 +987,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_build", "sabry_intrnl", @@ -996,7 +996,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1008,7 +1008,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "base64", "blake3", @@ -1028,14 +1028,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 1cc9c1a..91f3a93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-alpha.1" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-alpha.1" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-alpha.1" } -sabry_build = {path = "sabry_build", version = "0.0.1-alpha.1" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-alpha.2" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-alpha.2" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-alpha.2" } +sabry_build = {path = "sabry_build", version = "0.0.1-alpha.2" } [workspace.package] -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" edition = "2021" rust-version = "1.82" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 3fb281bb038f46773306cb7e4746b6cd88ef1af0 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 17:07:03 +0500 Subject: [PATCH 020/184] docs deserve to be tested --- Cargo.lock | 1087 +++++++++++++++++++++++++++++++++++- Cargo.toml | 5 +- README.md | 79 +-- sabry_procmacro/src/lib.rs | 8 +- tests/assets/mixins.sass | 5 + tests/assets/mixins.scss | 9 + 6 files changed, 1130 insertions(+), 63 deletions(-) create mode 100644 tests/assets/mixins.sass create mode 100644 tests/assets/mixins.scss diff --git a/Cargo.lock b/Cargo.lock index edd82bf..250df59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,6 +90,23 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "any_spawner" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9747eb01aed7603aba23f7c869d5d7e5d37aab9c3501aced42d8fdb786f1f6e3" +dependencies = [ + "futures", + "thiserror", + "wasm-bindgen-futures", +] + +[[package]] +name = "anyhow" +version = "1.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" + [[package]] name = "arrayref" version = "0.3.9" @@ -102,6 +119,47 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "attribute-derive" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f1ee502851995027b06f99f5ffbeffa1406b38d0b318a1ebfa469332c6cbafd" +dependencies = [ + "attribute-derive-macro", + "derive-where", + "manyhow", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "attribute-derive-macro" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3601467f634cfe36c4780ca9c75dea9a5b34529c1f2810676a337e7e0997f954" +dependencies = [ + "collection_literals", + "interpolator", + "manyhow", + "proc-macro-utils 0.8.0", + "proc-macro2", + "quote", + "quote-use", + "syn 2.0.85", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -194,6 +252,12 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" + [[package]] name = "cc" version = "1.1.31" @@ -236,18 +300,57 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +[[package]] +name = "codee" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d3ad3122b0001c7f140cf4d605ef9a9e2c24d96ab0b4fb4347b76de2425f445" +dependencies = [ + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "codemap" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" +[[package]] +name = "collection_literals" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" + [[package]] name = "colorchoice" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "config" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" +dependencies = [ + "convert_case", + "nom", + "pathdiff", + "serde", + "toml", +] + [[package]] name = "const-str" version = "0.3.2" @@ -288,6 +391,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "const_str_slice_concat" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67855af358fcb20fac58f9d714c94e2b228fe5694c1c9b4ead4a366343eda1b" + [[package]] name = "constant_time_eq" version = "0.3.1" @@ -373,6 +482,20 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" version = "2.6.0" @@ -388,6 +511,23 @@ dependencies = [ "matches", ] +[[package]] +name = "derive-where" +version = "1.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "drain_filter_polyfill" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" + [[package]] name = "dtoa" version = "1.0.9" @@ -409,18 +549,152 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "either_of" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6e22feb4d5cacf9f2c64902a1c35ef0f2d766e42db316a98b93992bbce669cb" +dependencies = [ + "pin-project-lite", +] + [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "funty" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "fxhash" version = "0.2.1" @@ -443,6 +717,40 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "grass" version = "0.13.4" @@ -468,6 +776,12 @@ dependencies = [ "rand", ] +[[package]] +name = "guardian" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "493913a18c0d7bebb75127a26a432162c59edbe06f6cf712001e3e769345e8b5" + [[package]] name = "hashbrown" version = "0.12.3" @@ -499,6 +813,50 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "html-escape" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" +dependencies = [ + "utf8-width", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "hydration_context" +version = "0.2.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3572b2778f74f110d907744b8d44be3602f1588aa5b7a098d8911a5d806b7f1" +dependencies = [ + "futures", + "once_cell", + "or_poisoned", + "pin-project-lite", + "serde", + "throw_error", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" version = "2.6.0" @@ -509,6 +867,12 @@ dependencies = [ "hashbrown 0.15.0", ] +[[package]] +name = "interpolator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -524,6 +888,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -532,9 +905,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -554,6 +927,129 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leptos" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf56a5fa2a3ca01c4b49255a66375612ddd138aeef2ffe11f7157ea3e349a82" +dependencies = [ + "any_spawner", + "cfg-if", + "either_of", + "futures", + "hydration_context", + "leptos_config", + "leptos_dom", + "leptos_hot_reload", + "leptos_macro", + "leptos_server", + "oco_ref", + "or_poisoned", + "paste", + "reactive_graph", + "rustc-hash", + "send_wrapper", + "serde", + "serde_qs", + "server_fn", + "slotmap", + "tachys", + "thiserror", + "throw_error", + "typed-builder", + "typed-builder-macro", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_config" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b972bec4a29c0a351fa54736b70eb9eda05938f732d1ec659f63887a5208c4bd" +dependencies = [ + "config", + "regex", + "serde", + "thiserror", + "typed-builder", +] + +[[package]] +name = "leptos_dom" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ccab6ce79c7428460451e43edf052c5344a682058666f8ef19c19e898387fca" +dependencies = [ + "js-sys", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "tachys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_hot_reload" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1406f4641b5521324f3c5845f065e8a67b60147ee1aae56721dc2ba7c317dc2" +dependencies = [ + "anyhow", + "camino", + "indexmap", + "parking_lot", + "proc-macro2", + "quote", + "rstml", + "serde", + "syn 2.0.85", + "walkdir", +] + +[[package]] +name = "leptos_macro" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62fa728becd72d6f08cc9f93db3a712b4e068edb8b8af2da5b933bd3d1dcede" +dependencies = [ + "attribute-derive", + "cfg-if", + "convert_case", + "html-escape", + "itertools 0.13.0", + "leptos_hot_reload", + "prettyplease", + "proc-macro-error2", + "proc-macro2", + "quote", + "rstml", + "server_fn_macro", + "syn 2.0.85", + "uuid", +] + +[[package]] +name = "leptos_server" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc869a5f93379eec0b4af337bfe953a6b6b7a20223c56ab6dbde7798d0296b4" +dependencies = [ + "any_spawner", + "base64", + "codee", + "futures", + "hydration_context", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "serde", + "serde_json", + "server_fn", + "tachys", +] + [[package]] name = "libc" version = "0.2.161" @@ -571,10 +1067,10 @@ dependencies = [ "const-str", "cssparser", "cssparser-color", - "dashmap", + "dashmap 5.5.3", "data-encoding", "getrandom", - "itertools", + "itertools 0.10.5", "lazy_static", "lightningcss-derive", "parcel_selectors", @@ -598,6 +1094,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "linear-map" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" + [[package]] name = "lock_api" version = "0.4.12" @@ -614,6 +1116,29 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "manyhow" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91ea592d76c0b6471965708ccff7e6a5d277f676b90ab31f4d3f3fc77fade64" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "manyhow-macros" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64621e2c08f2576e4194ea8be11daf24ac01249a4f53cd8befcbb7077120ead" +dependencies = [ + "proc-macro-utils 0.8.0", + "proc-macro2", + "quote", +] + [[package]] name = "matches" version = "0.1.10" @@ -626,12 +1151,50 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "next_tuple" +version = "0.1.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5154cd29823504d933fa19d02dd52f9f692cf9e337653f1409db70863fa5cd49" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "oco_ref" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b94982fe39a861561cf67ff17a7849f2cedadbbad960a797634032b7abb998" +dependencies = [ + "serde", + "thiserror", +] + [[package]] name = "once_cell" version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "or_poisoned" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" + [[package]] name = "outref" version = "0.1.0" @@ -668,6 +1231,22 @@ dependencies = [ "vlq", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + [[package]] name = "parking_lot_core" version = "0.9.10" @@ -693,6 +1272,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "phf" version = "0.10.1" @@ -773,6 +1358,38 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -788,6 +1405,83 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +dependencies = [ + "proc-macro2", + "syn 2.0.85", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "proc-macro-utils" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f59e109e2f795a5070e69578c4dc101068139f74616778025ae1011d4cd41a8" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + [[package]] name = "proc-macro2" version = "1.0.89" @@ -797,6 +1491,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", + "version_check", + "yansi", +] + [[package]] name = "ptr_meta" version = "0.1.4" @@ -826,6 +1533,28 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "quote-use" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9619db1197b497a36178cfc736dc96b271fe918875fbf1344c436a7e93d0321e" +dependencies = [ + "quote", + "quote-use-macros", +] + +[[package]] +name = "quote-use-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82ebfb7faafadc06a7ab141a6f67bcfb24cb8beb158c6fe933f2f035afa99f35" +dependencies = [ + "proc-macro-utils 0.10.0", + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "radium" version = "0.7.0" @@ -903,6 +1632,55 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "reactive_graph" +version = "0.1.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e99ef30cfb23ffd2da6bbfcfa218c043003fdc40909102b52e9cc48707894e8" +dependencies = [ + "any_spawner", + "async-lock", + "futures", + "guardian", + "hydration_context", + "or_poisoned", + "pin-project-lite", + "rustc-hash", + "send_wrapper", + "serde", + "slotmap", + "thiserror", + "web-sys", +] + +[[package]] +name = "reactive_stores" +version = "0.1.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8062a7f178f934c17145a4dab0e8f0bf8879975ce72e1146b9bcd3bc6f342c19" +dependencies = [ + "guardian", + "itertools 0.13.0", + "or_poisoned", + "paste", + "reactive_graph", + "reactive_stores_macro", + "rustc-hash", +] + +[[package]] +name = "reactive_stores_macro" +version = "0.1.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1262c9b4c1633da17472d69a2bc7d4709780c616e919b236e51949f160d2ab2e" +dependencies = [ + "convert_case", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "redox_syscall" version = "0.5.7" @@ -979,6 +1757,27 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rstml" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51187e564f12336ef40cd04f6f4d805d6919188001dcf1e0a021898ea0fe28ce" +dependencies = [ + "derive-where", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.85", + "syn_derive", + "thiserror", +] + +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "ryu" version = "1.0.18" @@ -989,6 +1788,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" name = "sabry" version = "0.0.1-alpha.2" dependencies = [ + "leptos", "sabry_build", "sabry_intrnl", "sabry_procmacro", @@ -1067,19 +1867,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] -name = "serde" -version = "1.0.213" +name = "send_wrapper" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" +dependencies = [ + "futures-core", +] + +[[package]] +name = "serde" +version = "1.0.214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", @@ -1098,6 +1907,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_qs" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6" +dependencies = [ + "percent-encoding", + "serde", + "thiserror", +] + [[package]] name = "serde_spanned" version = "0.6.8" @@ -1107,6 +1927,60 @@ dependencies = [ "serde", ] +[[package]] +name = "server_fn" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2397ddd8c45c2379d3b596e978f8edc6548572c669730d0e69c8aac3117679c2" +dependencies = [ + "bytes", + "const_format", + "dashmap 6.1.0", + "futures", + "gloo-net", + "http", + "js-sys", + "once_cell", + "pin-project-lite", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn_macro_default", + "thiserror", + "throw_error", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0965c30b56ec0f1cdd15464f4ce4abd83d06fe582c9c2fbcf61ee7e1453c805" +dependencies = [ + "const_format", + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.85", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro_default" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08bce1bdbe13e78fba58b3e1323b25597bc9c14ae59825299d7f6b10f819286" +dependencies = [ + "server_fn_macro", + "syn 2.0.85", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1134,6 +2008,24 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.13.2" @@ -1168,6 +2060,50 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "tachys" +version = "0.1.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4061a2262552cb95969488266f015c14b52539e92d2ada077ac170b3a1b458ba" +dependencies = [ + "any_spawner", + "const_str_slice_concat", + "drain_filter_polyfill", + "either_of", + "futures", + "html-escape", + "indexmap", + "itertools 0.13.0", + "js-sys", + "linear-map", + "next_tuple", + "oco_ref", + "once_cell", + "or_poisoned", + "parking_lot", + "paste", + "reactive_graph", + "reactive_stores", + "rustc-hash", + "send_wrapper", + "slotmap", + "throw_error", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "tap" version = "1.0.1" @@ -1194,6 +2130,15 @@ dependencies = [ "syn 2.0.85", ] +[[package]] +name = "throw_error" +version = "0.2.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f94a0abd02fad5a46b04748c89c32d2b5784bbb046fb6675f186e0bd45cd415c" +dependencies = [ + "pin-project-lite", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -1243,12 +2188,47 @@ dependencies = [ "winnow", ] +[[package]] +name = "typed-builder" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06fbd5b8de54c5f7c91f6fe4cebb949be2125d7758e630bb58b1d831dbce600" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9534daa9fd3ed0bd911d462a37f172228077e7abf18c18a5f67199d959205f8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -1261,6 +2241,23 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + [[package]] name = "utf8parse" version = "0.2.2" @@ -1272,6 +2269,9 @@ name = "uuid" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +dependencies = [ + "getrandom", +] [[package]] name = "version_check" @@ -1303,9 +2303,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", "once_cell", @@ -1314,9 +2314,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", @@ -1328,10 +2328,22 @@ dependencies = [ ] [[package]] -name = "wasm-bindgen-macro" -version = "0.2.95" +name = "wasm-bindgen-futures" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1339,9 +2351,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", @@ -1352,9 +2364,32 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "wasm-streams" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] [[package]] name = "winapi-util" @@ -1456,6 +2491,18 @@ dependencies = [ "tap", ] +[[package]] +name = "xxhash-rust" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "zerocopy" version = "0.7.35" diff --git a/Cargo.toml b/Cargo.toml index 91f3a93..29b8912 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ publish = true [package] name = "sabry" -description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust." +description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust" keywords = ["web", "sass", "scss", "macro"] repository.workspace = true version.workspace = true @@ -41,6 +41,9 @@ sabry_procmacro = {workspace = true, optional = true} sabry_build = {workspace = true, optional = true} sabry_intrnl = {workspace = true} +[dev-dependencies] +leptos = {version = "0.7.0-gamma3"} + [features] default = ["procmacro"] lepty-scoping = [ diff --git a/README.md b/README.md index 6ab6e0b..ea5625f 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ Also, just about everything is pub-available in this crate - Sabry is ready for Feel free to check out examples: -|[crate of styles](./examples//define-styles/)|[style usage](./examples/use-styles/)|[leptos-axum with sabry](./examples/leptos-axum)| +|[crate of styles](https://github.com/yiffyrusdev/sabry/tree/master/examples/define-styles)|[style usage](https://github.com/yiffyrusdev/sabry/tree/master/examples/use-styles)|[leptos-axum with sabry](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum)| |-|-|-| ### Create a crate full of arbitrary SASS @@ -148,11 +148,11 @@ The only need is the dependency sabry = {version = "0.0.1"} ``` And a proc-macro -```rust,ignore +```rust // lib.rs use sabry::sassy; -sassy!(mixins "assets/mixins.scss"); +sassy!(mixins "tests/assets/mixins.scss"); sassy!(styles { $primary-color: black; @mixin colored($col: primary) { @@ -179,7 +179,7 @@ Depend on sabry sabry = {version = "0.0.1"} ``` And create a style scope wherever you want: -```rust,ignore +```rust // breadbadgelist.rs use sabry::styly; @@ -195,13 +195,10 @@ styly!(const styles { } }); -fn render() -> HtmlElement { - div().class(styles::badges).chain( - ul().class(styles::_list(styles::badges)) - ).chain( - span().id(styles::thewolf) - ) -} +/* Now you can use all scoped selectors: */ +let badges_scoped_class = styles::badges; +let wolf_scoped_id = styles::thewolf; +let badges__list_scoped_class = styles::___list(styles::badges); ``` > That `const` usage is covered in the [following](#constant-styly-scopes) section. In this example we dont invoke sabry build-magic, so, to be as close to real life as possible, I used a const. @@ -229,8 +226,6 @@ sabry = {version = "0.0.1", features = ["build"]} Then you have to tell sabry when code should be compiled. We'll do this in *build.rs* file. ```rust,ignore // build.rs -use shared_styles::{mixins, styles}; - fn main(){ sabry::buildy( sabry::usey!( @@ -243,11 +238,12 @@ fn main(){ `buildy` is the entry function of sabry build-time process. The handy `usey!` macro will do just proper handling of our style-macros for it. Now lets get back to the code and use the mixin defined in another crate: -```rust,ignore +```rust // breadbadgelist.rs use sabry::styly; styly!(styles { + // "mixins" is available beacuse we did call mixins!() macro in the example below @use "mixins"; .badges { display: flex; @@ -259,14 +255,6 @@ styly!(styles { @include mixins.colored(white); } }); - -fn render() -> HtmlElement { - div().class(styles::badges).chain( - ul().class(styles::_list(styles::badges)) - ).chain( - span().id(styles::thewolf) - ) -} ``` So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` function call is now accessible with simple and natural `@use "mixins"` SASS rule! @@ -274,7 +262,9 @@ So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` fu With [leptos](https://github.com/leptos-rs/leptos) framework you can do the trick to apply some class to most of HtmlElements for the entire component/island: -```rust,ignore +```rust +use leptos::prelude::*; + #[component] fn component() -> impl IntoView { view! {class="cls1", /* <- here */ @@ -297,8 +287,12 @@ sabry = {version = "0.0.1", features = ["lepty-scoping"]} sabry = {version = "0.0.1", features = ["build", "lepty-scoping"]} ``` -```rust,ignore +```rust +use leptos::prelude::*; +use sabry::styly; + styly!(scope { + // assuming we have tokens!() macro generated by `sassy!`, which is handled by `buildy` @use "tokens"; h1 { @include tokens.sectionhead(); @@ -443,14 +437,19 @@ It does accept the following syntax: `$name(:$syntax)? ({ $code })|($filename)`, - *$filename* is a string literal which contains path to the file relative to package root Examples: -```rust,ignore +```rust +use sabry::sassy; + sassy!(module1 {$primary-color: red;}); -sassy!(module2 "src/assets/module2.scss"); -sassy!(module3:sass "src/assets/module3.sass"); +sassy!(module2 "tests/assets/mixins.scss"); +sassy!(module3:sass "tests/assets/mixins.sass"); // works, but there are catches. sassy!(module4:sass { - =colored - color: red + =colored($col: primary) + @if $col == primary + color: white + @else + color: red }); ``` @@ -474,15 +473,17 @@ It does accept the following syntax: `pub? const? $ident(:$syntax)? ({ $code })| - *$filename* is a string literal which contains path to the file relative to package root Examples -```rust,ignore -styly!(fox {.fur {color: red; &-dark {color: black;}}}) -styly!(pub fox {.fur {color: red; &-dark {color: black;}}}) -styly!(pub const fox:sass { +```rust +use sabry::styly; + +styly!(private_fox {.fur {color: red; &-dark {color: black;}}}); +styly!(pub public_fox {.fur {color: red; &-dark {color: black;}}}); +styly!(pub const pub_compiletime_fox:sass { .fur color: red &-dark color: black -}) +}); ``` Every of those calls will produce the styling scope as a module. Differences are explained right below. @@ -510,8 +511,8 @@ You can read more about scoping and hashing in the [scoping](#scoping) section. By default generated `mod` is private. You can make both mod and wrapper style constant public by adding the `pub` to macro call: -```rust,ignore -styly!(pub whatever "src/assets/whatever.scss"); +```rust +sabry::styly!(pub whatever "tests/assets/mixins.scss"); ``` #### Constant styly scopes @@ -521,7 +522,7 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: ```rust,ignore -styly!(const scope "src/assets/scope.scss"); +sabry::styly!(const scope "tests/assets/mixins.scss"); ``` Which results in following: ```rust,ignore @@ -610,8 +611,8 @@ Different selector types are scoped differently: As for **SASS parent selectors**: they are currently handled in different way. Instead of walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: -```rust,ignore -styly!(scope { +```rust +sabry::styly!(scope { .cls1 { &-dark {} } diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index b05f1d9..6500413 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -48,7 +48,10 @@ pub fn sassy(input: TokenStream) -> TokenStream { /// ## Usage /// /// Write style in rusty code (rust-analyzer wont autocomplete your scope members) +/// /// ```ignore +/// use sabry::styly; +/// /// styly!(scope1 { /// /* SCSS */ /// }); @@ -107,9 +110,8 @@ pub fn styly(input: TokenStream) -> TokenStream { /// use brandstyle::tokens as brand_tokens; /// /// usey!( -/// brandstyle::theme!(), -/// tokens!(), -/// brand_tokens!(), +/// theme!(), +/// tokens!() /// ); /// ``` /// diff --git a/tests/assets/mixins.sass b/tests/assets/mixins.sass new file mode 100644 index 0000000..9e2462e --- /dev/null +++ b/tests/assets/mixins.sass @@ -0,0 +1,5 @@ +=colored($color: primary) + @if $color == primary + color: white + @else + color: $col diff --git a/tests/assets/mixins.scss b/tests/assets/mixins.scss new file mode 100644 index 0000000..d201fd0 --- /dev/null +++ b/tests/assets/mixins.scss @@ -0,0 +1,9 @@ +$primary-color: black; + +@mixin colored($col: primary) { + @if $col == primary { + color: $primary-color; + } @else { + color: $col; + } +} From 2e54f29419d4d5c96543fd81d782d297c7f19293 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 05:33:23 +0500 Subject: [PATCH 021/184] docs: a reminder about lepty-scoping feature flag --- README.md | 18 ++++++++++++------ examples/use-styles/Cargo.lock | 11 ++++++----- examples/use-styles/src/main.rs | 2 -- release.toml | 6 +++++- sabry_intrnl/src/scoper/mod.rs | 4 ++-- sabry_procmacro_impl/src/impls/mod.rs | 7 ++++++- 6 files changed, 31 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index ea5625f..9895b02 100644 --- a/README.md +++ b/README.md @@ -273,7 +273,7 @@ fn component() -> impl IntoView { } } ``` -... and have "cls1" on both `h1` and `p` auto-assigned. Isn't this cool? +... and have "cls1" on both `h1` and `p` auto-assigned. Isn't that cool? So, if you're on leptos, and don't mind to take this approach, I'd highly recommend turning the *lepty-scoping* feature on: @@ -327,6 +327,7 @@ fn component() -> impl IntoView { That will perform *much* better: - All scope members - like `scope::breadcumbs` - wont contain repeating scope hash, just the original class/id selector + - So instead of scope members (which [aren't](https://github.com/yiffyrusdev/sabry/issues/2) autocompleted for sass-in-the-rust yet) you could just write bare selectors, as you do, for example, with svelte: `<li class="breadcumbs__item">` - You will not encounter [the catch](#scoping) with nested tagname selectors Also, this isn't really exclusive leptos-supporting feature. It just changes scoping behavour. @@ -631,15 +632,20 @@ So you still can get the scoped variant of `cls1-dark` class: `scope::_dark(scop This isn't very handy, also isn't strict enough, and is a high-priority subject to change. wip. +#### Scope member naming rules + +Not any valid CSS selector is a valid rust identifier. In general this section should not be needed, as you should receive autocompletion from the editor. *However* it doesn't seem to work properly. Check the [wip](#wip) section out. + ## WIP *(sorted by my own priority)*, "dones" are excluded -- [] Crates of styled components - currently the only way to create them seems to be const styly. - - [] CSS support -- [] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance -- [] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. -- [] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. +- [ ] Somehow achieve the autocompletion for scopes. The problem is explained in details [here](https://github.com/yiffyrusdev/sabry/issues/2) +- [ ] Crates of styled components - currently the only way to create them seems to be const styly. + - [ ] CSS support +- [ ] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance +- [ ] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. +- [ ] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. ## Contributions diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 8bc46bd..d0d46c5 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -994,7 +994,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_build", "sabry_intrnl", @@ -1003,7 +1003,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1" +version = "0.0.1-alpha.2" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,10 +1015,11 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1" +version = "0.0.1-alpha.2" dependencies = [ "base64", "blake3", + "cfg-if", "const_format", "grass", "lightningcss", @@ -1034,14 +1035,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1" +version = "0.0.1-alpha.2" dependencies = [ "proc-macro2", "quote", diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 6472b0e..0f69f52 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -11,8 +11,6 @@ styly!(pub const bundlemod { } }); -styly!(pub const filemod:sass "src/main.sass"); - fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); diff --git a/release.toml b/release.toml index d60c78b..edd975f 100644 --- a/release.toml +++ b/release.toml @@ -4,5 +4,9 @@ sign-tag = true target = "x86_64-unknown-linux-gnu" pre-release-replacements = [ - {file="README.md", search='sabry = {\s?version = "[0-9a-z\-\.]*"(?<rest>.*)\s?}', replace='sabry = { version = "{{version}}" $rest}'}, + {file="README.md", search='sabry = {\s?version = "[0-9a-z\-\.]*"', replace='sabry = { version = "{{version}}"'}, +] + +pre-release-hook = [ + "/bin/echo $NEW_VERSION" ] diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 0d82a7d..659fc7f 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -226,7 +226,7 @@ impl HashedSelector { Some(format!("{} {}", hash.as_str(), a.ident)) } } - }, + } // As we dont want to use two HTML props for a single ID, // ID scoping is done with id modification ScopedSelector::Id(a) => { @@ -237,7 +237,7 @@ impl HashedSelector { Some(format!("{}-{}", hash.as_str(), a.ident)) } } - }, + } ScopedSelector::Tag(_) => None, } } diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index a6876d8..f86a7ae 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -57,7 +57,12 @@ impl Parse for ArbitraryStyleBlock { let iofile = match fs::read(&fullpath) { Ok(bf) => bf, - Err(_) => return Err(syn::Error::new(path_tok.span(), format!("Could not read file at {fullpath:?}"))) + Err(_) => { + return Err(syn::Error::new( + path_tok.span(), + format!("Could not read file at {fullpath:?}"), + )) + } }; let code = String::from_utf8_lossy(&iofile).to_string(); From 8bc362501d9af62b50851902c905d68f3a0efc9c Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 07:41:49 +0500 Subject: [PATCH 022/184] feat!: expose internals with special feature flag, improve related docs --- Cargo.toml | 5 ++++ README.md | 8 +++++++ sabry_build/Cargo.toml | 4 ++++ sabry_build/src/buildmagic.rs | 42 +++++++++++++++++++++++++++++++++ sabry_build/src/lib.rs | 1 - sabry_intrnl/Cargo.toml | 4 ++++ sabry_procmacro/Cargo.toml | 4 ++++ sabry_procmacro_impl/Cargo.toml | 4 ++++ src/lib.rs | 15 +++++++++++- 9 files changed, 85 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 29b8912..94bb5d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,3 +58,8 @@ build = [ net-files = [ "sabry_build/net-files" ] +internals = [] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/README.md b/README.md index 9895b02..59ca70d 100644 --- a/README.md +++ b/README.md @@ -636,6 +636,14 @@ This isn't very handy, also isn't strict enough, and is a high-priority subject Not any valid CSS selector is a valid rust identifier. In general this section should not be needed, as you should receive autocompletion from the editor. *However* it doesn't seem to work properly. Check the [wip](#wip) section out. +## Notable feature flags + +**build** - turns on the `sabry::buildy` function, along with the entire `sabry_build` crate where it lives + +**internals** - exposes majority of internal stuff for you to experiment or build own workflow + +**lepty-scoping** - overhauls the scope generation logic, best suitable for the leptos. Check out the [section](#leptos-specials) and an [example](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum) + ## WIP *(sorted by my own priority)*, "dones" are excluded diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index 526a350..400a3a0 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -19,3 +19,7 @@ walkdir = {version = "^2.5"} [features] net-files = [] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index f9abcf7..bcff0ef 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -23,6 +23,29 @@ type ModuleCode = String; type StyleModule = (ModuleName, ModuleCode); type BuilderResult = Result<(), SabryBuildError>; +/// Entry point of sabrys build-magic +/// +/// Example: +/// ``` +/// # use sabry_build::buildmagic::buildy; +/// /* buildy call */ +/// buildy( +/// vec![("mixins.scss".to_string(), "@mixin abc(){}".to_string())] +/// ).expect("Sabry failed to build CSS"); +/// ``` +/// +/// Also you could use style-macros defined anywhere with `sabry::sassy!` procmacro: +/// ```ignore +/// buildy( +/// sabry::usey!( +/// crate1::mixins!(), +/// crate2::tokens!(), +/// crate3::mixins!() +/// ) +/// ).expect("Sabry failed to build CSS"); +/// ``` +/// +/// This function is intended to run at build time, however, you're free to use it however you please pub fn buildy(inline_side_modules: impl IntoIterator<Item = StyleModule>) -> BuilderResult { println!("🧙: This is probably the stderr. Something went wrong:"); @@ -49,6 +72,17 @@ pub fn buildy(inline_side_modules: impl IntoIterator<Item = StyleModule>) -> Bui Ok(()) } +/// Entrypoint structure of sabrys build-magic. +/// +/// You could construct CSS compilation process by yourself instead of using `buildy` function: +/// ```rust +/// # use sabry_intrnl::config::SabryConfig; +/// # use sabry_build::buildmagic::SabryBuilder; +/// let config = SabryConfig::require().expect("Config didnt load"); +/// let builder = SabryBuilder::new(config); +/// ``` +/// +/// the [buildy] function will just do baseline usage of this structure for you pub struct SabryBuilder { config: SabryConfig, css_compiler: CompilerAdapter, @@ -57,6 +91,14 @@ pub struct SabryBuilder { //🧙 impl SabryBuilder { + /// Construct new [SabryBuilder] from the config + /// + /// You can require [SabryConfig] automatically, with the [Result], by: + /// + /// ``` + /// # use sabry_intrnl::config::SabryConfig; + /// SabryConfig::require().expect("Config didnt load"); + /// ``` pub fn new(config: SabryConfig) -> Self { let css_compiler = CompilerAdapter::new(config.clone()); Self { diff --git a/sabry_build/src/lib.rs b/sabry_build/src/lib.rs index ecac97d..b2d511e 100644 --- a/sabry_build/src/lib.rs +++ b/sabry_build/src/lib.rs @@ -2,4 +2,3 @@ pub mod buildmagic; pub mod filevisit; -pub use buildmagic::*; diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 41c5cbc..e7ff33b 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -27,3 +27,7 @@ cfg-if = {version = "^1.0"} [features] lepty-scoping = [] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 932a3d2..570fccf 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -15,3 +15,7 @@ proc-macro = true sabry_procmacro_impl = {workspace = true} [features] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index b170930..a7a1927 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -18,3 +18,7 @@ raffia = {version = "^0.9"} regex = {version = "^1.11"} [features] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/src/lib.rs b/src/lib.rs index 71317c6..92fcb93 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,19 @@ #![doc = include_str!("../README.md")] +#![cfg_attr(docsrs, feature(doc_cfg))] +#[cfg_attr(docsrs, doc(cfg(feature = "build")))] #[cfg(feature = "build")] -pub use sabry_build::*; +pub use sabry_build::buildmagic::buildy; +#[cfg_attr(docsrs, doc(cfg(feature = "procmacro")))] #[cfg(feature = "procmacro")] pub use sabry_procmacro::*; + + +// reexports +#[cfg_attr(docsrs, doc(cfg(all(feature = "build", feature = "internals"))))] +#[cfg(all(feature = "build", feature = "internals"))] +pub use sabry_build::*; + +#[cfg_attr(docsrs, doc(cfg(all(feature = "procmacro", feature = "internals"))))] +#[cfg(all(feature = "procmacro", feature = "internals"))] +pub use sabry_intrnl::*; From e1bd0b8c27f5402f75eccfda6a62c9a154c64929 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 09:42:37 +0500 Subject: [PATCH 023/184] fix!: bring the scope autocompletion in by changing style input syntax BREAKING CHANGE: `styly`, `sassy` macros syntax change. Now requires `{"$code"}`. --- README.md | 88 +++++++++++++----------- examples/define-styles/Cargo.lock | 9 +-- examples/define-styles/src/lib.rs | 14 ++-- examples/leptos-axum/src/routes/home.rs | 10 +-- examples/use-styles/build.rs | 4 +- examples/use-styles/src/main.rs | 11 ++- sabry_intrnl/src/scoper/mod.rs | 6 +- sabry_procmacro_impl/src/impls/mod.rs | 89 +++++++++++++++---------- src/lib.rs | 1 - 9 files changed, 132 insertions(+), 100 deletions(-) diff --git a/README.md b/README.md index 59ca70d..a434c5c 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ At first, I'll show how this crate "tastes". With SABRY, its in your power to: Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with modules, with feature flags, etc. Say "bye" to manual copying, cli-tools and consts. -```rust,ignore -sassy!(tokens {@mixin colored{color: red;}}); +```rust +sabry::sassy!(tokens {"@mixin colored{color: red;}"}); ``` </td> @@ -38,9 +38,9 @@ sassy!(tokens {@mixin colored{color: red;}}); Code your SASS in separate files to get proper syntax highlighting, or do sass-in-the-rust to keep things in one place -```rust,ignore -styly!(component {.btn {color: green;}}); -styly!(extras "src/components/extras.scss"); +```rust +sabry::styly!(component {".btn {color: green;}"}); +sabry::styly!(extras "tests/assets/mixins.scss"); ``` </td> @@ -68,11 +68,11 @@ tgk_brandstyle = {version = "0.0.1", features = ["utils"]} `@use` your style-crates in sass code *naturally* -```rust,ignore -styly!(breadbadge { +```rust +sabry::styly!(breadbadge {" @use 'tokens'; .scope {@include tokens.badge(primary);} -}) +"}); ``` </td> @@ -85,10 +85,11 @@ styly!(breadbadge { Keep things as private and modular as you wish +```rust +sabry::styly!(pub cats "tests/assets/mixins.scss"); +sabry::styly!(dogs {"#howl {border: none;}"}); +``` ```rust,ignore -styly!(pub cats "src/sections/cats/style.scss"); -styly!(dogs {#howl {border: none;}}) - /// something like render function { <div class={cats::meow}> @@ -107,9 +108,9 @@ styly!(dogs {#howl {border: none;}}) Compile all the sweet SASS/SCSS into the optimized CSS bundle, ship it in CSS shunks or even include the compiled style into the binary -```rust,ignore -styly!(cssbundle {.c1 {color: white;}}) -styly!(const binary {.c2 {color: black;}}) +```rust +sabry::styly!(cssbundle {".c1 {color: white;}"}); +sabry::styly!(const binary {".c2 {color: black;}"}); ``` </td> @@ -127,8 +128,7 @@ Sabry will gladly: - prepare ready CSS bundle and put it wherever you wish - include CSS into the build artifact - if you really want it -Also, just about everything is pub-available in this crate - Sabry is ready for experiments. - +Also, just about everything is pub-available in this crate (with *internals* feature flag) - Sabry is ready for experiments. ## Usage @@ -153,7 +153,7 @@ And a proc-macro use sabry::sassy; sassy!(mixins "tests/assets/mixins.scss"); -sassy!(styles { +sassy!(styles {" $primary-color: black; @mixin colored($col: primary) { @if $col == primary { @@ -162,8 +162,10 @@ sassy!(styles { color: $col; } } -}); +"}); ``` +*\* Unlike most of other crates that do sass-in-the-rust, sabry currently does not allow unquoted sass/scss. You still have to write it in a string-quotes. Unquoted sass/scss is reserved for the future, where we shall introduce variable injection.* + Now you can build and see two ready for export macros: `mixins!` and `styles!`. These are usefull on their own, as invocation of `mixins!()` or `styles!()` - both shall give you the code literal. @@ -183,7 +185,7 @@ And create a style scope wherever you want: // breadbadgelist.rs use sabry::styly; -styly!(const styles { +styly!(const styles {" .badges { display: flex; &__list { @@ -193,7 +195,7 @@ styly!(const styles { #wolf { color: white; } -}); +"}); /* Now you can use all scoped selectors: */ let badges_scoped_class = styles::badges; @@ -242,9 +244,9 @@ Now lets get back to the code and use the mixin defined in another crate: // breadbadgelist.rs use sabry::styly; -styly!(styles { - // "mixins" is available beacuse we did call mixins!() macro in the example below - @use "mixins"; +styly!(styles {" + // 'mixins' is available beacuse we did call mixins!() macro in the example below + @use 'mixins'; .badges { display: flex; &__list { @@ -254,7 +256,7 @@ styly!(styles { #wolf { @include mixins.colored(white); } -}); +"}); ``` So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` function call is now accessible with simple and natural `@use "mixins"` SASS rule! @@ -291,9 +293,9 @@ sabry = {version = "0.0.1", features = ["build", "lepty-scoping"]} use leptos::prelude::*; use sabry::styly; -styly!(scope { +styly!(scope {" // assuming we have tokens!() macro generated by `sassy!`, which is handled by `buildy` - @use "tokens"; + @use 'tokens'; h1 { @include tokens.sectionhead(); img { @@ -306,7 +308,7 @@ styly!(scope { @include tokens.badge(secondary); } } -}); +"}); #[component] fn component() -> impl IntoView { @@ -441,17 +443,17 @@ Examples: ```rust use sabry::sassy; -sassy!(module1 {$primary-color: red;}); +sassy!(module1 {"$primary-color: red;"}); sassy!(module2 "tests/assets/mixins.scss"); sassy!(module3:sass "tests/assets/mixins.sass"); // works, but there are catches. -sassy!(module4:sass { +sassy!(module4:sass {" =colored($col: primary) @if $col == primary color: white @else color: red -}); +"}); ``` You may omit the syntax specifier - sabry uses SCSS as the default one. @@ -477,14 +479,14 @@ Examples ```rust use sabry::styly; -styly!(private_fox {.fur {color: red; &-dark {color: black;}}}); -styly!(pub public_fox {.fur {color: red; &-dark {color: black;}}}); -styly!(pub const pub_compiletime_fox:sass { +styly!(private_fox {".fur {color: red; &-dark {color: black;}}"}); +styly!(pub public_fox {".fur {color: red; &-dark {color: black;}}"}); +styly!(pub const pub_compiletime_fox:sass {" .fur color: red &-dark color: black -}); +"}); ``` Every of those calls will produce the styling scope as a module. Differences are explained right below. @@ -522,7 +524,7 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: -```rust,ignore +```rust sabry::styly!(const scope "tests/assets/mixins.scss"); ``` Which results in following: @@ -613,11 +615,11 @@ As for **SASS parent selectors**: they are currently handled in different way. I walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: ```rust -sabry::styly!(scope { +sabry::styly!(scope {" .cls1 { &-dark {} } -}); +"}); ``` is something like ```rust,ignore @@ -648,10 +650,20 @@ Not any valid CSS selector is a valid rust identifier. In general this section s *(sorted by my own priority)*, "dones" are excluded -- [ ] Somehow achieve the autocompletion for scopes. The problem is explained in details [here](https://github.com/yiffyrusdev/sabry/issues/2) +- [x] Somehow achieve the autocompletion for scopes. The problem is explained in details [here](https://github.com/yiffyrusdev/sabry/issues/2) + - [ ] some weird unrelated stuff I can see in autocompletion - [ ] Crates of styled components - currently the only way to create them seems to be const styly. - [ ] CSS support - [ ] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance +- [ ] Use sass-in-rust without quoted styles for variable injection: + ```rust, ignore + let myvar = "content"; + styly!(scope { + .c::after { + content: somehow(myvar); + } + }) + ``` - [ ] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. - [ ] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index ce5f0bc..5c7cbf1 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -994,7 +994,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_intrnl", "sabry_procmacro", @@ -1002,10 +1002,11 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "base64", "blake3", + "cfg-if", "const_format", "grass", "lightningcss", @@ -1021,14 +1022,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "proc-macro2", "quote", diff --git a/examples/define-styles/src/lib.rs b/examples/define-styles/src/lib.rs index d53f80c..9850a64 100644 --- a/examples/define-styles/src/lib.rs +++ b/examples/define-styles/src/lib.rs @@ -2,7 +2,7 @@ use sabry::sassy; sassy!(style "src/style.scss"); -sassy!(utils { +sassy!(utils {" @mixin flex($direction, $align, $justify, $gap: .5rem) { display: flex; list-style: none; @@ -29,9 +29,9 @@ sassy!(utils { justify-content: $justify; } } -}); +"}); -sassy!(theme { +sassy!(theme {" $thm-surface-primary: #2b2a29; $thm-surface-secondary: #6C6C6C; $thm-surface-tertiary: #4C4C4C; @@ -75,10 +75,10 @@ sassy!(theme { color: $thm-text-accent; } } -}); +"}); -sassy!(tokens { - @use "theme"; +sassy!(tokens {" + @use 'theme'; @mixin clickable($style: accent, $scale: 1.2, $clickscale: 0.9){ @if $style == accent{ @@ -103,4 +103,4 @@ sassy!(tokens { transform: scale($clickscale); } } -}); +"}); diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index b79682d..c8b8d4b 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -1,10 +1,10 @@ use leptos::prelude::*; use sabry::styly; -styly!(style { - @use "tokens"; - @use "utils"; - @use "theme"; +styly!(style {" + @use 'tokens'; + @use 'utils'; + @use 'theme'; h2 { margin-bottom: 1rem; @@ -35,7 +35,7 @@ styly!(style { text-transform: uppercase; } -}); +"}); /// Renders the home page of your application. #[component] diff --git a/examples/use-styles/build.rs b/examples/use-styles/build.rs index 88a9998..d8b254f 100644 --- a/examples/use-styles/build.rs +++ b/examples/use-styles/build.rs @@ -3,11 +3,11 @@ use sabry::{sassy, usey}; // This module will have the same name as define_styles_example::utils // and sabry is configured to merge them -sassy!(utils { +sassy!(utils {" @mixin nonclickable(){ display: none; } -}); +"}); fn main(){ /* Declare modules to use with sabry */ diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 0f69f52..cb9bd46 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -1,7 +1,10 @@ use sabry::styly; -styly!(pub const bundlemod { - @use "tokens"; +// Sabry now (0.0.1-alpha.3) disallows unquoted styles +// you won't benefit from unqouted styles though, as you won't get syntax highlighting +// Also, unqouted styles are reserved for future +styly!(pub const bundlemod {" + @use 'tokens'; .someth { @include tokens.clickable; background-color: black; @@ -9,7 +12,9 @@ styly!(pub const bundlemod { background-color: white; } } -}); +"}); + +styly!(pub filemod:sass "src/main.sass"); fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 659fc7f..b519cff 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -215,7 +215,7 @@ impl HashedSelector { /// /// Not every hashed selector is presentable for HTML-ish use: like `div`, in that case /// returns [None] - pub fn make_hashed_html(value: &ScopedSelector, hash: &ScopeHash) -> Option<String> { + pub fn make_hashed_html(value: &ScopedSelector, _hash: &ScopeHash) -> Option<String> { match value { // Class scoping is done with class composition ScopedSelector::Class(a) => { @@ -223,7 +223,7 @@ impl HashedSelector { if #[cfg(feature = "lepty-scoping")] { Some(a.ident.to_string()) } else { - Some(format!("{} {}", hash.as_str(), a.ident)) + Some(format!("{} {}", _hash.as_str(), a.ident)) } } } @@ -234,7 +234,7 @@ impl HashedSelector { if #[cfg(feature = "lepty-scoping")] { Some(a.ident.to_string()) } else { - Some(format!("{}-{}", hash.as_str(), a.ident)) + Some(format!("{}-{}", _hash.as_str(), a.ident)) } } } diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index f86a7ae..faa10df 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -2,8 +2,9 @@ use std::{fmt::Debug, fs, path::PathBuf, str::FromStr}; use proc_macro2::{Span, TokenStream}; use quote::{quote, ToTokens, TokenStreamExt}; +use regex::Regex; use sabry_intrnl::compiler::CompilerSyntax; -use syn::{braced, parse::Parse, spanned::Spanned, Ident, LitStr, Token}; +use syn::{braced, parse::Parse, Ident, LitStr, Token}; pub mod sassy; pub mod styly; @@ -68,21 +69,17 @@ impl Parse for ArbitraryStyleBlock { (code, path_tok.span()) } else { - // Does not work on stable! - // We're on nightly though - // So what? - // Then is works. - let _s; - braced!(_s in input); - let stream = _s.parse::<TokenStream>()?; - - let c = match stream.span().source_text() { - Some(stx) => stx, - // TODO: rust-analyzer does fall into this even if all is fine - None => "".to_string(), //return Err(syn::Error::new(stream.span(), "Source code expected")), - }; - - (c, stream.span()) + let s; + braced!(s in input); + if let Ok(stream) = s.parse::<LitStr>() { + let c = stream.value(); + // shift the entire code for the first line ident + let ident_regex = Regex::new(r"\n\s{4}").expect("BUG: base ident regex at sabry_procmacro_impl/src/impls/mod.rs:: impl Parse for ArbitraryStyleBlock"); + let c = ident_regex.replace_all(&c, "\n").to_string(); + (c, stream.span()) + } else { + return Err(syn::Error::new(s.span(), "Use \"\" within the braces to specify your SASS/SCSS. Unquoted style syntax is reserved for the future. Unquoted SCSS/SASS doesnt make sense though, as you won't benefit from it in rust file.\n\ntip: use `{\"style\"}` instead of `{style}`")); + } }; Ok(Self { code, span }) @@ -137,9 +134,9 @@ impl Parse for ArbitraryStyleSyntax { _ => Err(syn::Error::new( ident.span(), format!( - "Available syntax are `sass` (WIP) and `scss`, each of them requires feature flag. Omit to use default {:?} syntax", - Self::default() - ), + "Available syntax are `sass` and `scss`, omit to use default {:?} syntax", + Self::default() + ), )), } } @@ -176,31 +173,49 @@ mod test { fn arbitrary_style_block_sass() { use super::ArbitraryStyleBlock; - let code = "#a - co:d - .sel - di: pi - .sel,div > sel - f: \"into\""; - let braced_code = format!("{{{code}}}"); - let block = syn::parse_str::<ArbitraryStyleBlock>(&braced_code).unwrap(); + let code = " + #a + co: red + .sel + co: white + &-dark + & > div + co: blue"; + let expect_code = " +#a + co: red +.sel + co: white +&-dark + & > div + co: blue"; + let input = format!("{{\"{code}\"}}"); + let block = syn::parse_str::<ArbitraryStyleBlock>(&input).unwrap(); - assert_eq!(code, block.code); + assert_eq!(expect_code, block.code); } #[test] fn arbitrary_style_block_scss() { use super::ArbitraryStyleBlock; - let code = "#a { - c:r; - } - .b.c{ - c:\"into\"; - }"; - let braced_code = format!("{{{code}}}"); - let block = syn::parse_str::<ArbitraryStyleBlock>(&braced_code).unwrap(); + let code = " + #a { + c: r; + } + .b.c { + c: 'into'; + }"; + let expect_code = " +#a { + c: r; +} +.b.c { + c: 'into'; +}"; + let input = format!("{{\"{code}\"}}"); + let block = syn::parse_str::<ArbitraryStyleBlock>(&input).unwrap(); - assert_eq!(code, block.code) + assert_eq!(expect_code, block.code) } } diff --git a/src/lib.rs b/src/lib.rs index 92fcb93..4cc9d27 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,6 @@ pub use sabry_build::buildmagic::buildy; #[cfg(feature = "procmacro")] pub use sabry_procmacro::*; - // reexports #[cfg_attr(docsrs, doc(cfg(all(feature = "build", feature = "internals"))))] #[cfg(all(feature = "build", feature = "internals"))] From 50d8ac6a3be2699b76d121676f91540495b83072 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 09:53:24 +0500 Subject: [PATCH 024/184] remove unneeded rel --- release.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/release.toml b/release.toml index edd975f..ac70f3c 100644 --- a/release.toml +++ b/release.toml @@ -6,7 +6,3 @@ target = "x86_64-unknown-linux-gnu" pre-release-replacements = [ {file="README.md", search='sabry = {\s?version = "[0-9a-z\-\.]*"', replace='sabry = { version = "{{version}}"'}, ] - -pre-release-hook = [ - "/bin/echo $NEW_VERSION" -] From 1afaa1d169701060cf00945ad0f330ac2b3fc982 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 09:53:54 +0500 Subject: [PATCH 025/184] chore: Release --- Cargo.lock | 10 +++++----- Cargo.toml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 250df59..0992fd0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1786,7 +1786,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "leptos", "sabry_build", @@ -1796,7 +1796,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1808,7 +1808,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "base64", "blake3", @@ -1828,14 +1828,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 94bb5d6..4567bf8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-alpha.2" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-alpha.2" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-alpha.2" } -sabry_build = {path = "sabry_build", version = "0.0.1-alpha.2" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.1" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.1" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.1" } +sabry_build = {path = "sabry_build", version = "0.0.1-beta.1" } [workspace.package] -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" edition = "2021" rust-version = "1.82" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 6253ad8e8f6fcb90b923836eb38c4f06e2b36f74 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 10:25:11 +0500 Subject: [PATCH 026/184] docs: get rid of those icons, reference the scoping autocompletion --- README.md | 28 ++++++++++++---------------- examples/use-styles/Cargo.lock | 10 +++++----- examples/use-styles/src/main.rs | 6 +++++- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index a434c5c..7af58ea 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,19 @@ sabry::sassy!(tokens {"@mixin colored{color: red;}"}); ``` </td> +</tr> +<tr> <td> -📦 + +Get the *(almost)* proper autocompletion for your scope from rust-analyzer + +```rust +sabry::styly!(scope {".cls1{} #id1{}"}); +/* autocompleted for you */ +scope::cls1; +scope::theid1; +``` + </td> </tr> <tr> @@ -43,9 +54,6 @@ sabry::styly!(component {".btn {color: green;}"}); sabry::styly!(extras "tests/assets/mixins.scss"); ``` -</td> -<td> -:3 </td> </tr> <tr> @@ -58,9 +66,6 @@ Depend on styles with cargo, at build time, which brings all the rusty sweeties tgk_brandstyle = {version = "0.0.1", features = ["utils"]} ``` -</td> -<td> -🦀 </td> </tr> <tr> @@ -75,9 +80,6 @@ sabry::styly!(breadbadge {" "}); ``` -</td> -<td> -🪄 </td> </tr> <tr> @@ -98,9 +100,6 @@ sabry::styly!(dogs {"#howl {border: none;}"}); } ``` -</td> -<td> -^_^ </td> </tr> <tr> @@ -113,9 +112,6 @@ sabry::styly!(cssbundle {".c1 {color: white;}"}); sabry::styly!(const binary {".c2 {color: black;}"}); ``` -</td> -<td> -🏗️ </td> </tr> </table> diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index d0d46c5..b5c9a3f 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -994,7 +994,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "sabry_build", "sabry_intrnl", @@ -1003,7 +1003,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,7 +1015,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "base64", "blake3", @@ -1035,14 +1035,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "proc-macro2", "quote", diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index cb9bd46..a029637 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -12,6 +12,9 @@ styly!(pub const bundlemod {" background-color: white; } } + #fox { + color: red; + } "}); styly!(pub filemod:sass "src/main.sass"); @@ -19,6 +22,7 @@ styly!(pub filemod:sass "src/main.sass"); fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); - //println!("someth-dark selector will be: {}", bundlemod::_dark(bundlemod::someth)); + println!("someth-dark selector will be: {}", bundlemod::___dark(bundlemod::someth)); + println!("#fox id will be: {}", bundlemod::thefox); println!("Thats how we used the styles! Good luck!!"); } From 9092aff8585b2946b97124b0ba32b7f9265897a8 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 18:36:23 +0500 Subject: [PATCH 027/184] fix: duplicated extra-indentation removal caused invalid SASS syntax --- sabry_procmacro_impl/src/impls/sassy.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index 16fe436..42d1725 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -46,14 +46,7 @@ impl Parse for MacroSyntax { fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { let ident = input.parse::<Ident>()?; let mode = input.parse::<ArbitraryStyleSyntax>()?; - let mut code = input.parse::<ArbitraryStyleBlock>()?; - - // this is because of how parsing works. Need to find more elegant way though - // TODO: find a more elegant way - code.code = Regex::new("\n ") - .expect("BUG: failed to build regex for indentation SASS") - .replace_all(&code.code, "\n") - .to_string(); + let code = input.parse::<ArbitraryStyleBlock>()?; Ok(Self { ident, From 53b8a934aad4f175d1b3e3156752bc405978fe99 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 18:37:21 +0500 Subject: [PATCH 028/184] chore: Release --- Cargo.lock | 10 +++++----- Cargo.toml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0992fd0..d4e21b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1786,7 +1786,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "leptos", "sabry_build", @@ -1796,7 +1796,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1808,7 +1808,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "base64", "blake3", @@ -1828,14 +1828,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 4567bf8..defdf56 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.1" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.1" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.1" } -sabry_build = {path = "sabry_build", version = "0.0.1-beta.1" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.2" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.2" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.2" } +sabry_build = {path = "sabry_build", version = "0.0.1-beta.2" } [workspace.package] -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" edition = "2021" rust-version = "1.82" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From d5491b86ccd662c6ddc32c65c0945ff2f091f7ab Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 00:20:10 +0500 Subject: [PATCH 029/184] fix: more-or-less readable errors + syntax check on sassy macro --- examples/define-styles/Cargo.lock | 8 ++-- examples/use-styles/Cargo.lock | 10 ++-- sabry_build/src/buildmagic.rs | 2 +- sabry_intrnl/src/compiler/mod.rs | 61 +++++++++++++++++++++---- sabry_intrnl/src/scoper/mod.rs | 26 ++++++++--- sabry_procmacro_impl/src/impls/sassy.rs | 10 +++- 6 files changed, 91 insertions(+), 26 deletions(-) diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index 5c7cbf1..1b2178a 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -994,7 +994,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.2" dependencies = [ "sabry_intrnl", "sabry_procmacro", @@ -1002,7 +1002,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.2" dependencies = [ "base64", "blake3", @@ -1022,14 +1022,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.2" dependencies = [ "proc-macro2", "quote", diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index b5c9a3f..a75ee98 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -994,7 +994,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "sabry_build", "sabry_intrnl", @@ -1003,7 +1003,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,7 +1015,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "base64", "blake3", @@ -1035,14 +1035,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "proc-macro2", "quote", diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index bcff0ef..fe3043c 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -331,7 +331,7 @@ pub enum SabryBuildError { #[error("Sabry cant understand the file")] FileVisit(#[from] FileVisitError), #[error("Syntax of style can not be parsed")] - SyntaxParse(#[from] ScopeError), + SyntaxError(#[from] ScopeError), #[error("Another scope has the same hash, and sabry is configured to raise an error. Try to adjust config, increase hash size, or change the style code")] HashCollision { scope: ModuleName }, #[error("Something's wrong with file path")] diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 7b20556..7376497 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -1,4 +1,11 @@ -use lightningcss::{printer::PrinterOptions, stylesheet::MinifyOptions, targets::Targets}; +use std::fmt::Debug; + +use lightningcss::{ + error::{MinifyErrorKind, PrinterErrorKind}, + printer::PrinterOptions, + stylesheet::MinifyOptions, + targets::Targets, +}; use crate::config::SabryConfig; @@ -28,7 +35,12 @@ impl CompilerAdapter { lightningcss::stylesheet::ParserOptions::default(), ) { Ok(s) => s, - Err(_) => return Err(SabryCompilerError::Lightningcss()), + Err(e) => { + return Err(SabryCompilerError::LightParse { + kind: e.kind.to_string(), + loc: e.loc, + }) + } }; let targets = Targets { @@ -47,16 +59,14 @@ impl CompilerAdapter { ..Default::default() }; - if lightsheet.minify(minify_options).is_err() { - return Err(SabryCompilerError::Lightningcss()); - } + lightsheet.minify(minify_options)?; css = match lightsheet.to_css(printer_options) { Ok(c) => { drop(lightsheet); c.code } - Err(_) => return Err(SabryCompilerError::Lightningcss()), + Err(e) => return Err(SabryCompilerError::LightPrint(e)), }; } @@ -78,12 +88,45 @@ impl From<&SabryConfig> for grass::Options<'_> { } } -#[derive(Debug, thiserror::Error)] +#[derive(thiserror::Error)] pub enum SabryCompilerError { #[error("Could not compile into CSS with grass")] GrassCompile(#[from] Box<grass::Error>), - #[error("Could not parse compiled CSS with lightningcss")] - Lightningcss(), + #[error("Could not print compiled CSS with lightningcss")] + LightPrint(#[from] lightningcss::error::Error<PrinterErrorKind>), + #[error("Could not minify CSS with lightningcss")] + LightMinify(#[from] lightningcss::error::Error<MinifyErrorKind>), + #[error("Could not parse CSS with lightningcss")] + LightParse { + kind: String, + loc: Option<lightningcss::error::ErrorLocation>, + }, +} + +impl Debug for SabryCompilerError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let explain = match self { + Self::LightPrint(e) => format!( + "{} at {:?}", + e.kind, + e.loc.clone() + .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) + ), + Self::GrassCompile(err) => format!("{err}"), + Self::LightMinify(e) => format!( + "{} at {:?}", + e.kind, + e.loc.clone() + .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) + ), + Self::LightParse { kind, loc } => format!( + "{kind} at {:?}", + loc.clone().map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) + ), + }; + + write!(f, "{explain}") + } } /// Unification wrapper over all the Syntax enums diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index b519cff..a42949c 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -1,3 +1,5 @@ +use std::fmt::Debug; + use cfg_if::cfg_if; use hash::ScopeHash; use raffia::Spanned; @@ -7,15 +9,19 @@ use crate::{config::SabryHashConfig, syntax::StylesheetAdapter}; pub mod hash; -#[derive(Debug, thiserror::Error)] +#[derive(thiserror::Error)] pub enum ScopeError { #[error("Raffia reports parse error")] - Raffia(raffia::error::ErrorKind), + Raffia(raffia::error::ErrorKind, String), } -impl From<raffia::error::Error> for ScopeError { - fn from(value: raffia::error::Error) -> Self { - Self::Raffia(value.kind) +impl Debug for ScopeError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let a = match self { + Self::Raffia(kind, source) => format!("{kind}: at {source}") + }; + + write!(f, "{a}") } } @@ -33,8 +39,16 @@ impl<'s> ArbitraryScope<'s> { name: syn::Ident, source: &'s str, ) -> Result<Self, ScopeError> { + let adapter = match StylesheetAdapter::new(source, syntax) { + Ok(a) => a, + Err(e) => { + let source = &source[e.span.start..e.span.end]; + return Err(ScopeError::Raffia(e.kind, source.to_string())) + } + }; + Ok(Self { - adapter: StylesheetAdapter::new(source, syntax)?, + adapter, name, }) } diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index 42d1725..b05d03f 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -1,6 +1,6 @@ use proc_macro2::TokenStream; use quote::quote; -use regex::Regex; +use sabry_intrnl::scoper::ArbitraryScope; use syn::{parse::Parse, Ident}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -21,6 +21,14 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { Err(e) => return e.to_compile_error(), }; + // quick raffia syntax check + match ArbitraryScope::from_source(mode.into(), ident.clone(), &code.code) { + Ok(_) => {}, + Err(e) => { + return syn::Error::new(code.span, format!("{e:?}")).into_compile_error() + } + } + let sourcesass = code.to_string(); let identname = ident.to_string(); let macro_doc = format!("Arbitrary {:?} code declared with `sassy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); From 0092e18e053042db75fcf44ed532aaa633d0a885 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 00:34:03 +0500 Subject: [PATCH 030/184] fmt: always forget about fmt --- sabry_intrnl/src/compiler/mod.rs | 9 ++++++--- sabry_intrnl/src/scoper/mod.rs | 9 +++------ sabry_procmacro_impl/src/impls/sassy.rs | 6 ++---- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 7376497..882a8bf 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -109,19 +109,22 @@ impl Debug for SabryCompilerError { Self::LightPrint(e) => format!( "{} at {:?}", e.kind, - e.loc.clone() + e.loc + .clone() .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) ), Self::GrassCompile(err) => format!("{err}"), Self::LightMinify(e) => format!( "{} at {:?}", e.kind, - e.loc.clone() + e.loc + .clone() .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) ), Self::LightParse { kind, loc } => format!( "{kind} at {:?}", - loc.clone().map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) + loc.clone() + .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) ), }; diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index a42949c..d89f7b0 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -18,7 +18,7 @@ pub enum ScopeError { impl Debug for ScopeError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let a = match self { - Self::Raffia(kind, source) => format!("{kind}: at {source}") + Self::Raffia(kind, source) => format!("{kind}: at {source}"), }; write!(f, "{a}") @@ -43,14 +43,11 @@ impl<'s> ArbitraryScope<'s> { Ok(a) => a, Err(e) => { let source = &source[e.span.start..e.span.end]; - return Err(ScopeError::Raffia(e.kind, source.to_string())) + return Err(ScopeError::Raffia(e.kind, source.to_string())); } }; - Ok(Self { - adapter, - name, - }) + Ok(Self { adapter, name }) } /// Consume arbitrary scope and create a [HashedScope] in its basis diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index b05d03f..e8149bc 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -23,10 +23,8 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { // quick raffia syntax check match ArbitraryScope::from_source(mode.into(), ident.clone(), &code.code) { - Ok(_) => {}, - Err(e) => { - return syn::Error::new(code.span, format!("{e:?}")).into_compile_error() - } + Ok(_) => {} + Err(e) => return syn::Error::new(code.span, format!("{e:?}")).into_compile_error(), } let sourcesass = code.to_string(); From 827d916a7ef9e6723f3c934af412bc7ad54c7d57 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 00:49:57 +0500 Subject: [PATCH 031/184] fix: drop unused dependency --- sabry_intrnl/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index e7ff33b..3d2a39e 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -18,7 +18,6 @@ grass = {version = "^0.13"} lightningcss = {version = "1.0.0-alpha.59"} blake3 = {version = "^1.5"} base64 = {version = "^0.22"} -const_format = {version = "^0.2"} thiserror = {version = "^1.0"} serde = {version = "^1.0", features = ["derive"]} From 69483373e09574ce027a9b38dbe1ca4ff3cca220 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 00:50:19 +0500 Subject: [PATCH 032/184] docs: improve sass --- Cargo.lock | 1 - README.md | 2 +- examples/define-styles/Cargo.lock | 27 --------------------------- tests/assets/mixins.sass | 2 +- 4 files changed, 2 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d4e21b3..27e224e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1813,7 +1813,6 @@ dependencies = [ "base64", "blake3", "cfg-if", - "const_format", "grass", "lightningcss", "proc-macro2", diff --git a/README.md b/README.md index 7af58ea..9c398aa 100644 --- a/README.md +++ b/README.md @@ -444,7 +444,7 @@ sassy!(module2 "tests/assets/mixins.scss"); sassy!(module3:sass "tests/assets/mixins.sass"); // works, but there are catches. sassy!(module4:sass {" - =colored($col: primary) + @mixin colored($col: primary) @if $col == primary color: white @else diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index 1b2178a..73cad63 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -268,26 +268,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "const_format" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - [[package]] name = "constant_time_eq" version = "0.3.1" @@ -1007,7 +987,6 @@ dependencies = [ "base64", "blake3", "cfg-if", - "const_format", "grass", "lightningcss", "proc-macro2", @@ -1240,12 +1219,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "utf8parse" version = "0.2.2" diff --git a/tests/assets/mixins.sass b/tests/assets/mixins.sass index 9e2462e..45a1ec6 100644 --- a/tests/assets/mixins.sass +++ b/tests/assets/mixins.sass @@ -1,4 +1,4 @@ -=colored($color: primary) +@mixin colored($color: primary) @if $color == primary color: white @else From ae5645492d605f7ea3774c7f7355efc1ef38f2aa Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 01:33:28 +0500 Subject: [PATCH 033/184] feat!: introduce SASS prelude as well. Its more convenient then making build.rs sassy macro. --- README.md | 13 +++--- examples/leptos-axum/Cargo.toml | 2 + examples/leptos-axum/styles/app.scss | 5 +++ examples/leptos-axum/styles/prelude.css | 4 ++ sabry_build/src/buildmagic.rs | 56 ++++++++++++++++++++++--- sabry_intrnl/src/config/mod.rs | 6 ++- sabry_procmacro_impl/src/impls/mod.rs | 18 ++++++-- 7 files changed, 88 insertions(+), 16 deletions(-) create mode 100644 examples/leptos-axum/styles/app.scss create mode 100644 examples/leptos-axum/styles/prelude.css diff --git a/README.md b/README.md index 9c398aa..25774c6 100644 --- a/README.md +++ b/README.md @@ -342,13 +342,14 @@ Full example, close to defaults: [package.metadata.sabry] css.bundle = "target/static/style.css" -css.bundle_prelude = ["assets/prelude.css"] +css.prelude = ["assets/prelude.css"] css.scopes = "target/statis/scopes/" css.minify = true sass.intermediate_dir = "target/.sabry/sass" sass.module_name_collision = "merge" sass.modules = ["assets/sass/mod1.scss"] +sass.prelude = ["assets/sass/prelude.scss"] sass.scanroot = "src" hash.size = 6 @@ -366,11 +367,11 @@ ie = "6" ### `sabry.css` -**bundle** *(no default)* - file path ro write CSS bundle into relative to project root +**bundle** *(no default)* - file path ro write CSS bundle into, relative to crate root -**bundle_prelude** *(no default)* - collection of CSS files, relative to the project root, which content will be inserted before the compiled style into the *bundle* file if any +**prelude** *(no default)* - collection of CSS files, relative to the crate root, which content will be inserted before the compiled style into the *bundle* file if any. Does not affect generated CSS scopes if any. -**scopes** *(no default)* - dir path to put separate CSS for every scope into relative to project root +**scopes** *(no default)* - dir path to put separate CSS for every scope into, relative to crate root **minify** *(default true)* - print compressed CSS output and do the lightningcss thing @@ -380,7 +381,9 @@ ie = "6" **scanroot** *(default "src")* - root directory to start scanning "rs" files from. Used in build function -**modules** *(no default)* - collection of SASS/SCSS files, relative to the project root, which should be available as modules as well +**modules** *(no default)* - collection of SASS/SCSS files, relative to the crate root, which should be available as modules as well + +**prelude** *(no default)* - collection of SASS/SCSS files, relative to the crate root, which content will be compiled into CSS and then inserted into the CSS *bundle* if any. Does not affect generated CSS scopes if any. **module_name_collision** *(default "merge")* - how to handle similary named modules. diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 39e1e43..f1aadcd 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -49,6 +49,8 @@ ssr = [ css.minify = true # We'll use bundle for leptos css.bundle = "target/.sabry/target/bundle.css" +css.prelude = ["styles/prelude.css"] +sass.prelude = ["styles/app.scss"] [package.metadata.leptos] # Sabry-specific quality of life config diff --git a/examples/leptos-axum/styles/app.scss b/examples/leptos-axum/styles/app.scss new file mode 100644 index 0000000..9e4155f --- /dev/null +++ b/examples/leptos-axum/styles/app.scss @@ -0,0 +1,5 @@ +@use 'theme'; + +html { + @include theme.surface(primary); +} diff --git a/examples/leptos-axum/styles/prelude.css b/examples/leptos-axum/styles/prelude.css new file mode 100644 index 0000000..66e2b6f --- /dev/null +++ b/examples/leptos-axum/styles/prelude.css @@ -0,0 +1,4 @@ +html, body { + margin: 0; + padding: 0; +} diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index fe3043c..0e66c96 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -13,7 +13,7 @@ use sabry_intrnl::{ config::{manifest::ManifestError, BehavHashCollision, BehavSassModCollision, SabryConfig}, scoper::{hash::ScopeHash, ArbitraryScope, ScopeError}, }; -use sabry_procmacro_impl::impls::styly; +use sabry_procmacro_impl::impls::{styly, ArbitraryStyleSyntax}; use walkdir::WalkDir; use crate::filevisit::{self, FileVisitError}; @@ -164,6 +164,7 @@ impl SabryBuilder { println!("🧙 sabry didn't load any usable styles"); } + // compile styly! macro parsed styles for styly in &self.state.loaded_stylyses { let scope = ArbitraryScope::from_source( styly.syntax.into(), @@ -193,6 +194,12 @@ impl SabryBuilder { .push((scope.original_scope.name.to_string(), css)); } + // compile sass preludes into the CSS prelude + for pre in &self.state.sass_prelude { + let css = self.css_compiler.compile_module(pre.syntax.into(), &pre.code)?; + self.state.css_prelude.push_str(&css); + } + Ok(()) } @@ -230,12 +237,12 @@ impl SabryBuilder { Ok(()) } - /// Load up configured preludes as side modules + /// Load up configured preludes and side modules pub fn load_preludes(&mut self) -> BuilderResult { // load sass modules from config let mut modules: Vec<StyleModule> = vec![]; - if let Some(sass_pre) = &self.config.sass.modules { - for pre in sass_pre { + if let Some(sass_mods) = &self.config.sass.modules { + for pre in sass_mods { let pre_path = PathBuf::from_str(pre)?; let pre_name = pre_path .file_name() @@ -250,8 +257,26 @@ impl SabryBuilder { self.load_side_module(name, code)?; } + // load SASS preludes + if let Some(sass_pres) = &self.config.sass.prelude { + let mut sass_preludes: Vec<SassPreludeModule> = vec![]; + for pre in sass_pres { + let pre_path = PathBuf::from_str(pre)?; + + let syntax = pre_path.extension().unwrap_or_default().to_str().unwrap_or_default(); + let syntax = match ArbitraryStyleSyntax::try_from(syntax) { + Ok(s) => s, + Err(_) => return Err(SabryBuildError::Another(format!("Unknown syntax for sass prelude {pre}"))) + }; + + let code = fs::read_to_string(pre_path)?; + sass_preludes.push(SassPreludeModule {syntax, code}); + } + self.state.sass_prelude.extend(sass_preludes); + } + // load css preludes - if let Some(css_pre) = &self.config.css.bundle_prelude { + if let Some(css_pre) = &self.config.css.prelude { for pre in css_pre { let code = fs::read_to_string(pre)?; self.state.css_prelude.push_str(&code); @@ -309,11 +334,30 @@ impl SabryBuilder { #[derive(Default)] pub struct SabryBuildState { + /// HashSet of scope hashes known by builder + /// Used to determine hash collision known_scope_hashes: HashSet<ScopeHash>, + /// HashSet of module names known by builder + /// Used to determine module name collision known_side_modules: HashSet<ModuleName>, + /// styly! macro uses, parsed loaded_stylyses: Vec<styly::MacroSyntax>, + /// CSS modules to form bundle/write separately loaded_css_modules: Vec<StyleModule>, + /// CSS prelude to write into bundle + /// Lives separately from [loaded_css_modules] to avoid name collision css_prelude: String, + /// SASS preludes loaded from config + /// Should be compiled into loaded_css_modules as well + sass_prelude: Vec<SassPreludeModule> +} + +/// Convenience struct for [SabryBuildState::sass_prelude] +pub struct SassPreludeModule { + /// syntax for the prelude + syntax: ArbitraryStyleSyntax, + /// code of the prelude + code: String } #[derive(Debug, thiserror::Error)] @@ -342,4 +386,6 @@ pub enum SabryBuildError { CssCompile(#[from] SabryCompilerError), #[error("Failed to load config/manifest")] Manifest(#[from] ManifestError), + #[error("Another error")] + Another(String) } diff --git a/sabry_intrnl/src/config/mod.rs b/sabry_intrnl/src/config/mod.rs index 0903929..7fdfa13 100644 --- a/sabry_intrnl/src/config/mod.rs +++ b/sabry_intrnl/src/config/mod.rs @@ -41,7 +41,7 @@ impl From<&ValuableManifest> for SabryConfig { pub struct SabryCssConfig { pub bundle: Option<String>, pub scopes: Option<String>, - pub bundle_prelude: Option<Vec<String>>, + pub prelude: Option<Vec<String>>, #[serde(default = "SabryCssConfig::default_minify")] pub minify: bool, } @@ -57,7 +57,7 @@ impl Default for SabryCssConfig { Self { bundle: None, scopes: None, - bundle_prelude: None, + prelude: None, minify: Self::default_minify(), } } @@ -71,6 +71,7 @@ pub struct SabrySassConfig { #[serde(default = "SabrySassConfig::default_scanroot")] pub scanroot: String, pub modules: Option<Vec<String>>, + pub prelude: Option<Vec<String>>, #[serde(default = "SabrySassConfig::default_intermediate_dir")] pub intermediate_dir: String, #[serde(default = "SabrySassConfig::default_module_name_collision")] @@ -94,6 +95,7 @@ impl Default for SabrySassConfig { Self { scanroot: Self::default_scanroot(), modules: None, + prelude: None, intermediate_dir: Self::default_intermediate_dir(), module_name_collision: Self::default_module_name_collision(), } diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index faa10df..0a0bbde 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -117,6 +117,17 @@ impl ToTokens for ArbitraryStyleSyntax { } } +impl TryFrom<&str> for ArbitraryStyleSyntax { + type Error = (); + fn try_from(value: &str) -> Result<Self, Self::Error> { + match value { + "sass" => Ok(Self::Sass), + "scss" => Ok(Self::Scss), + _ => Err(()) + } + } +} + impl Parse for ArbitraryStyleSyntax { fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { match input.parse::<Token![:]>() { @@ -128,10 +139,9 @@ impl Parse for ArbitraryStyleSyntax { } let ident = input.parse::<Ident>()?; - match ident.to_string().as_str() { - "sass" => Ok(Self::Sass), - "scss" => Ok(Self::Scss), - _ => Err(syn::Error::new( + match Self::try_from(ident.to_string().as_str()) { + Ok(v) => Ok(v), + Err(_) => Err(syn::Error::new( ident.span(), format!( "Available syntax are `sass` and `scss`, omit to use default {:?} syntax", From 4ef34e344ef7223165da953b5e1497dd366cc7ec Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 01:52:22 +0500 Subject: [PATCH 034/184] refactor: use single unified syntax shim type instead of many --- sabry_build/src/buildmagic.rs | 2 +- sabry_intrnl/src/compiler/mod.rs | 31 +----------- sabry_intrnl/src/scoper/hash.rs | 6 +-- sabry_intrnl/src/scoper/mod.rs | 10 ++-- sabry_intrnl/src/syntax/mod.rs | 22 ++++++--- sabry_intrnl/src/syntax/ostrta.rs | 64 +++++++++++++++++++++++++ sabry_procmacro_impl/src/impls/mod.rs | 53 ++++---------------- sabry_procmacro_impl/src/impls/sassy.rs | 2 +- sabry_procmacro_impl/src/impls/styly.rs | 4 +- 9 files changed, 102 insertions(+), 92 deletions(-) create mode 100644 sabry_intrnl/src/syntax/ostrta.rs diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index 0e66c96..7faa138 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -186,7 +186,7 @@ impl SabryBuilder { } let css = self.css_compiler.compile_module( - scope.original_scope.adapter().syntax.into(), + scope.original_scope.adapter().syntax, &scope.hashed_code, )?; self.state diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 882a8bf..4fcd129 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -7,7 +7,7 @@ use lightningcss::{ targets::Targets, }; -use crate::config::SabryConfig; +use crate::{config::SabryConfig, syntax::ostrta::OneSyntaxToRuleThemAll}; /// Convenience wrapper on Grass and Lightningcss pub struct CompilerAdapter { @@ -21,7 +21,7 @@ impl CompilerAdapter { pub fn compile_module( &self, - syntax: CompilerSyntax, + syntax: OneSyntaxToRuleThemAll, code: &str, ) -> Result<String, SabryCompilerError> { let options = grass::Options::from(&self.config).input_syntax(syntax.into()); @@ -131,30 +131,3 @@ impl Debug for SabryCompilerError { write!(f, "{explain}") } } - -/// Unification wrapper over all the Syntax enums -#[derive(Clone, Copy)] -pub enum CompilerSyntax { - Sass, - Scss, -} - -impl From<raffia::Syntax> for CompilerSyntax { - fn from(value: raffia::Syntax) -> Self { - match value { - raffia::Syntax::Sass => Self::Sass, - raffia::Syntax::Scss => Self::Scss, - // TODO: fallbacky error-prone - _ => Self::Scss, - } - } -} - -impl From<CompilerSyntax> for grass::InputSyntax { - fn from(value: CompilerSyntax) -> Self { - match value { - CompilerSyntax::Scss => Self::Scss, - CompilerSyntax::Sass => Self::Sass, - } - } -} diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index 4188a39..e40819f 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -69,7 +69,7 @@ impl ScopeHash { mod test { use syn::Ident; - use crate::{config::SabryHashConfig, scoper::ArbitraryScope}; + use crate::{config::SabryHashConfig, scoper::ArbitraryScope, syntax::ostrta::OneSyntaxToRuleThemAll}; use super::ScopeHash; @@ -78,7 +78,7 @@ mod test { let source = ".cls1{color:red; &-dark{color: black} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; let scope1 = ArbitraryScope::from_source( - raffia::Syntax::Scss, + OneSyntaxToRuleThemAll::Scss, syn::parse_str::<Ident>("lasifudm").unwrap(), source, ) @@ -86,7 +86,7 @@ mod test { let hash1 = ScopeHash::new(&scope1, &SabryHashConfig::default()); let scope2 = ArbitraryScope::from_source( - raffia::Syntax::Scss, + OneSyntaxToRuleThemAll::Scss, syn::parse_str::<Ident>("lasifudm").unwrap(), source, ) diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index d89f7b0..934d646 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -5,7 +5,7 @@ use hash::ScopeHash; use raffia::Spanned; use regex::Regex; -use crate::{config::SabryHashConfig, syntax::StylesheetAdapter}; +use crate::{config::SabryHashConfig, syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}}; pub mod hash; @@ -35,7 +35,7 @@ pub struct ArbitraryScope<'s> { impl<'s> ArbitraryScope<'s> { /// Parse given source code with given syntax and assign given name pub fn from_source( - syntax: raffia::Syntax, + syntax: OneSyntaxToRuleThemAll, name: syn::Ident, source: &'s str, ) -> Result<Self, ScopeError> { @@ -375,7 +375,7 @@ mod test { use crate::{ config::SabryHashConfig, - scoper::{hash::ScopeHash, HashedScope}, + scoper::{hash::ScopeHash, HashedScope}, syntax::ostrta::OneSyntaxToRuleThemAll, }; use super::ArbitraryScope; @@ -415,7 +415,7 @@ mod test { } let scope = ArbitraryScope::from_source( - raffia::Syntax::Scss, + OneSyntaxToRuleThemAll::Scss, syn::parse_str("scope1").unwrap(), code, ) @@ -463,7 +463,7 @@ mod test { let hash_cfg = SabryHashConfig::default(); let scope = ArbitraryScope::from_source( - raffia::Syntax::Scss, + OneSyntaxToRuleThemAll::Scss, syn::parse_str::<Ident>("scope2oiej").unwrap(), code, ) diff --git a/sabry_intrnl/src/syntax/mod.rs b/sabry_intrnl/src/syntax/mod.rs index a52d7d6..ba85336 100644 --- a/sabry_intrnl/src/syntax/mod.rs +++ b/sabry_intrnl/src/syntax/mod.rs @@ -1,24 +1,30 @@ +use ostrta::OneSyntaxToRuleThemAll; use raffia::{ ast::{ ClassSelector, CompoundSelector, IdSelector, NestingSelector, SimpleSelector, Statement, Stylesheet, TypeSelector, }, - ParserBuilder, Syntax, + ParserBuilder, }; +pub mod ostrta; + /// Convenience wrapper for [Stylesheet] pub struct StylesheetAdapter<'s> { - pub syntax: Syntax, + pub syntax: OneSyntaxToRuleThemAll, source: &'s str, stylesheet: Stylesheet<'s>, } impl<'s> StylesheetAdapter<'s> { - pub fn new(source: &'s str, syntax: Syntax) -> Result<Self, raffia::error::Error> { + pub fn new( + source: &'s str, + syntax: OneSyntaxToRuleThemAll, + ) -> Result<Self, raffia::error::Error> { Ok(Self { stylesheet: ParserBuilder::new(source) .ignore_comments() - .syntax(syntax) + .syntax(syntax.into()) .build() .parse()?, syntax, @@ -103,6 +109,8 @@ mod test { use raffia::Spanned; + use crate::syntax::ostrta::OneSyntaxToRuleThemAll; + use super::StylesheetAdapter; #[test] @@ -157,7 +165,7 @@ div#id2 let expect_tags = HashSet::from(["ul", "div", "span"]); //scss - let adp = StylesheetAdapter::new(source_scss, raffia::Syntax::Scss).unwrap(); + let adp = StylesheetAdapter::new(source_scss, OneSyntaxToRuleThemAll::Scss).unwrap(); let classes = adp .class_selectors() @@ -183,7 +191,7 @@ div#id2 assert_eq!(expect_tags, tags); //sass - let adp = StylesheetAdapter::new(source_sass, raffia::Syntax::Sass).unwrap(); + let adp = StylesheetAdapter::new(source_sass, OneSyntaxToRuleThemAll::Sass).unwrap(); let classes = adp .class_selectors() @@ -215,7 +223,7 @@ div#id2 let newname = "cls203-jg7ihgjhftyfhjh"; let expect = ".cls1{color:red; .cls203-jg7ihgjhftyfhjh{color:green;}}"; - let adp = StylesheetAdapter::new(scss, raffia::Syntax::Scss).unwrap(); + let adp = StylesheetAdapter::new(scss, OneSyntaxToRuleThemAll::Scss).unwrap(); let classes = adp.class_selectors(); let target_class = classes[0].clone(); diff --git a/sabry_intrnl/src/syntax/ostrta.rs b/sabry_intrnl/src/syntax/ostrta.rs new file mode 100644 index 0000000..1edbf1c --- /dev/null +++ b/sabry_intrnl/src/syntax/ostrta.rs @@ -0,0 +1,64 @@ +/// Convenience unification entrypoint +/// to make friends with all the different syntax-consumers +#[derive(Debug, Clone, Copy)] +pub enum OneSyntaxToRuleThemAll { + Sass, + Scss +} + +impl Default for OneSyntaxToRuleThemAll { + fn default() -> Self { + Self::Scss + } +} + +impl TryFrom<&str> for OneSyntaxToRuleThemAll { + type Error = (); + fn try_from(value: &str) -> Result<Self, Self::Error> { + match value { + "sass" => Ok(Self::Sass), + "scss" => Ok(Self::Scss), + _ => Err(()) + } + } +} + +impl TryFrom<raffia::Syntax> for OneSyntaxToRuleThemAll { + type Error = (); + fn try_from(value: raffia::Syntax) -> Result<Self, Self::Error> { + match value { + raffia::Syntax::Sass => Ok(Self::Sass), + raffia::Syntax::Scss => Ok(Self::Scss), + _ => Err(()) + } + } +} + +impl TryFrom<grass::InputSyntax> for OneSyntaxToRuleThemAll { + type Error = (); + fn try_from(value: grass::InputSyntax) -> Result<Self, Self::Error> { + match value { + grass::InputSyntax::Sass => Ok(Self::Sass), + grass::InputSyntax::Scss => Ok(Self::Scss), + _ => Err(()) + } + } +} + +impl From<OneSyntaxToRuleThemAll> for raffia::Syntax { + fn from(value: OneSyntaxToRuleThemAll) -> Self { + match value { + OneSyntaxToRuleThemAll::Sass => Self::Sass, + OneSyntaxToRuleThemAll::Scss => Self::Scss + } + } +} + +impl From<OneSyntaxToRuleThemAll> for grass::InputSyntax { + fn from(value: OneSyntaxToRuleThemAll) -> Self { + match value { + OneSyntaxToRuleThemAll::Scss => Self::Scss, + OneSyntaxToRuleThemAll::Sass => Self::Sass + } + } +} diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index 0a0bbde..009df1f 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -3,7 +3,7 @@ use std::{fmt::Debug, fs, path::PathBuf, str::FromStr}; use proc_macro2::{Span, TokenStream}; use quote::{quote, ToTokens, TokenStreamExt}; use regex::Regex; -use sabry_intrnl::compiler::CompilerSyntax; +use sabry_intrnl::syntax::ostrta::OneSyntaxToRuleThemAll; use syn::{braced, parse::Parse, Ident, LitStr, Token}; pub mod sassy; @@ -93,26 +93,20 @@ impl ToString for ArbitraryStyleBlock { } } -#[derive(Clone, Copy)] -pub enum ArbitraryStyleSyntax { - Scss, - Sass, -} +#[derive(Default, Debug, Clone, Copy)] +pub struct ArbitraryStyleSyntax(OneSyntaxToRuleThemAll); -impl From<ArbitraryStyleSyntax> for CompilerSyntax { +impl From<ArbitraryStyleSyntax> for OneSyntaxToRuleThemAll { fn from(value: ArbitraryStyleSyntax) -> Self { - match value { - ArbitraryStyleSyntax::Sass => Self::Sass, - ArbitraryStyleSyntax::Scss => Self::Scss, - } + value.0 } } impl ToTokens for ArbitraryStyleSyntax { fn to_tokens(&self, tokens: &mut TokenStream) { - match self { - Self::Sass => tokens.append_all(quote! {"sass"}), - Self::Scss => tokens.append_all(quote! {"scss"}), + match self.0 { + OneSyntaxToRuleThemAll::Sass => tokens.append_all(quote! {"sass"}), + OneSyntaxToRuleThemAll::Scss => tokens.append_all(quote! {"scss"}), } } } @@ -120,11 +114,7 @@ impl ToTokens for ArbitraryStyleSyntax { impl TryFrom<&str> for ArbitraryStyleSyntax { type Error = (); fn try_from(value: &str) -> Result<Self, Self::Error> { - match value { - "sass" => Ok(Self::Sass), - "scss" => Ok(Self::Scss), - _ => Err(()) - } + Ok(Self(OneSyntaxToRuleThemAll::try_from(value)?)) } } @@ -152,31 +142,6 @@ impl Parse for ArbitraryStyleSyntax { } } -impl Debug for ArbitraryStyleSyntax { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let name = match self { - Self::Sass => "sass", - Self::Scss => "scss", - }; - write!(f, "{name}") - } -} - -impl Default for ArbitraryStyleSyntax { - fn default() -> Self { - Self::Scss - } -} - -impl From<ArbitraryStyleSyntax> for raffia::Syntax { - fn from(value: ArbitraryStyleSyntax) -> Self { - match value { - ArbitraryStyleSyntax::Sass => Self::Sass, - ArbitraryStyleSyntax::Scss => Self::Scss, - } - } -} - #[cfg(test)] mod test { #[test] diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index e8149bc..c15c303 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -22,7 +22,7 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { }; // quick raffia syntax check - match ArbitraryScope::from_source(mode.into(), ident.clone(), &code.code) { + match ArbitraryScope::from_source(mode.0, ident.clone(), &code.code) { Ok(_) => {} Err(e) => return syn::Error::new(code.span, format!("{e:?}")).into_compile_error(), } diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 4a157d2..296fc4f 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -45,7 +45,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { Err(e) => return e.to_compile_error(), }; - let scope = match ArbitraryScope::from_source(ms.syntax.into(), ms.scope.clone(), &ms.code.code) + let scope = match ArbitraryScope::from_source(ms.syntax.0, ms.scope.clone(), &ms.code.code) { Ok(s) => match s.hashed(&config.hash) { Ok(hs) => Ok(hs), @@ -134,7 +134,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { if constant { let compiler = CompilerAdapter::new(config.clone()); - let css = match compiler.compile_module(ms.syntax.into(), &ms.code.code) { + let css = match compiler.compile_module(ms.syntax.0, &ms.code.code) { Ok(c) => c, Err(e) => { return syn::Error::new( From 189523bc8a97127ef61b98102da04b05b2813b1c Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 01:59:17 +0500 Subject: [PATCH 035/184] idk!: dont see any reason to have Cargo.lock here --- .gitignore | 1 + Cargo.lock | 2524 ---------------------------------------------------- 2 files changed, 1 insertion(+), 2524 deletions(-) delete mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index f276f31..e2bc000 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ rust-toolchain.toml .vscode .profile +/Cargo.lock diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 27e224e..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,2524 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "anstream" -version = "0.6.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "any_spawner" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9747eb01aed7603aba23f7c869d5d7e5d37aab9c3501aced42d8fdb786f1f6e3" -dependencies = [ - "futures", - "thiserror", - "wasm-bindgen-futures", -] - -[[package]] -name = "anyhow" -version = "1.0.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "attribute-derive" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f1ee502851995027b06f99f5ffbeffa1406b38d0b318a1ebfa469332c6cbafd" -dependencies = [ - "attribute-derive-macro", - "derive-where", - "manyhow", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "attribute-derive-macro" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3601467f634cfe36c4780ca9c75dea9a5b34529c1f2810676a337e7e0997f954" -dependencies = [ - "collection_literals", - "interpolator", - "manyhow", - "proc-macro-utils 0.8.0", - "proc-macro2", - "quote", - "quote-use", - "syn 2.0.85", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64-simd" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" -dependencies = [ - "simd-abstraction", -] - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake3" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" - -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" - -[[package]] -name = "cc" -version = "1.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - -[[package]] -name = "codee" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3ad3122b0001c7f140cf4d605ef9a9e2c24d96ab0b4fb4347b76de2425f445" -dependencies = [ - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "codemap" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" - -[[package]] -name = "collection_literals" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" - -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "config" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" -dependencies = [ - "convert_case", - "nom", - "pathdiff", - "serde", - "toml", -] - -[[package]] -name = "const-str" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" -dependencies = [ - "const-str-proc-macro", -] - -[[package]] -name = "const-str-proc-macro" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "const_format" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "const_str_slice_concat" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f67855af358fcb20fac58f9d714c94e2b228fe5694c1c9b4ead4a366343eda1b" - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "cssparser" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "phf 0.11.2", - "smallvec", -] - -[[package]] -name = "cssparser-color" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" -dependencies = [ - "cssparser", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.85", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "data-url" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" -dependencies = [ - "matches", -] - -[[package]] -name = "derive-where" -version = "1.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "drain_filter_polyfill" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" - -[[package]] -name = "dtoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "either_of" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6e22feb4d5cacf9f2c64902a1c35ef0f2d766e42db316a98b93992bbce669cb" -dependencies = [ - "pin-project-lite", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "event-listener" -version = "5.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "http", - "js-sys", - "pin-project", - "serde", - "serde_json", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "grass" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" -dependencies = [ - "clap", - "getrandom", - "grass_compiler", -] - -[[package]] -name = "grass_compiler" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" -dependencies = [ - "codemap", - "indexmap", - "lasso", - "once_cell", - "phf 0.11.2", - "rand", -] - -[[package]] -name = "guardian" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "493913a18c0d7bebb75127a26a432162c59edbe06f6cf712001e3e769345e8b5" - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.11", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "html-escape" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" -dependencies = [ - "utf8-width", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "hydration_context" -version = "0.2.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3572b2778f74f110d907744b8d44be3602f1588aa5b7a098d8911a5d806b7f1" -dependencies = [ - "futures", - "once_cell", - "or_poisoned", - "pin-project-lite", - "serde", - "throw_error", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" -dependencies = [ - "equivalent", - "hashbrown 0.15.0", -] - -[[package]] -name = "interpolator" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lasso" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "leptos" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf56a5fa2a3ca01c4b49255a66375612ddd138aeef2ffe11f7157ea3e349a82" -dependencies = [ - "any_spawner", - "cfg-if", - "either_of", - "futures", - "hydration_context", - "leptos_config", - "leptos_dom", - "leptos_hot_reload", - "leptos_macro", - "leptos_server", - "oco_ref", - "or_poisoned", - "paste", - "reactive_graph", - "rustc-hash", - "send_wrapper", - "serde", - "serde_qs", - "server_fn", - "slotmap", - "tachys", - "thiserror", - "throw_error", - "typed-builder", - "typed-builder-macro", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "leptos_config" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b972bec4a29c0a351fa54736b70eb9eda05938f732d1ec659f63887a5208c4bd" -dependencies = [ - "config", - "regex", - "serde", - "thiserror", - "typed-builder", -] - -[[package]] -name = "leptos_dom" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ccab6ce79c7428460451e43edf052c5344a682058666f8ef19c19e898387fca" -dependencies = [ - "js-sys", - "or_poisoned", - "reactive_graph", - "send_wrapper", - "tachys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "leptos_hot_reload" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1406f4641b5521324f3c5845f065e8a67b60147ee1aae56721dc2ba7c317dc2" -dependencies = [ - "anyhow", - "camino", - "indexmap", - "parking_lot", - "proc-macro2", - "quote", - "rstml", - "serde", - "syn 2.0.85", - "walkdir", -] - -[[package]] -name = "leptos_macro" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62fa728becd72d6f08cc9f93db3a712b4e068edb8b8af2da5b933bd3d1dcede" -dependencies = [ - "attribute-derive", - "cfg-if", - "convert_case", - "html-escape", - "itertools 0.13.0", - "leptos_hot_reload", - "prettyplease", - "proc-macro-error2", - "proc-macro2", - "quote", - "rstml", - "server_fn_macro", - "syn 2.0.85", - "uuid", -] - -[[package]] -name = "leptos_server" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc869a5f93379eec0b4af337bfe953a6b6b7a20223c56ab6dbde7798d0296b4" -dependencies = [ - "any_spawner", - "base64", - "codee", - "futures", - "hydration_context", - "or_poisoned", - "reactive_graph", - "send_wrapper", - "serde", - "serde_json", - "server_fn", - "tachys", -] - -[[package]] -name = "libc" -version = "0.2.161" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" - -[[package]] -name = "lightningcss" -version = "1.0.0-alpha.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" -dependencies = [ - "ahash 0.8.11", - "bitflags", - "const-str", - "cssparser", - "cssparser-color", - "dashmap 5.5.3", - "data-encoding", - "getrandom", - "itertools 0.10.5", - "lazy_static", - "lightningcss-derive", - "parcel_selectors", - "parcel_sourcemap", - "paste", - "pathdiff", - "rayon", - "serde", - "smallvec", -] - -[[package]] -name = "lightningcss-derive" -version = "1.0.0-alpha.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "linear-map" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "manyhow" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91ea592d76c0b6471965708ccff7e6a5d277f676b90ab31f4d3f3fc77fade64" -dependencies = [ - "manyhow-macros", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "manyhow-macros" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64621e2c08f2576e4194ea8be11daf24ac01249a4f53cd8befcbb7077120ead" -dependencies = [ - "proc-macro-utils 0.8.0", - "proc-macro2", - "quote", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "next_tuple" -version = "0.1.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5154cd29823504d933fa19d02dd52f9f692cf9e337653f1409db70863fa5cd49" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "oco_ref" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b94982fe39a861561cf67ff17a7849f2cedadbbad960a797634032b7abb998" -dependencies = [ - "serde", - "thiserror", -] - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "or_poisoned" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" - -[[package]] -name = "outref" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" - -[[package]] -name = "parcel_selectors" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" -dependencies = [ - "bitflags", - "cssparser", - "fxhash", - "log", - "phf 0.10.1", - "phf_codegen", - "precomputed-hash", - "smallvec", -] - -[[package]] -name = "parcel_sourcemap" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" -dependencies = [ - "base64-simd", - "data-url", - "rkyv", - "serde", - "serde_json", - "vlq", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pathdiff" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_shared 0.10.0", -] - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared 0.11.2", -] - -[[package]] -name = "phf_codegen" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared 0.11.2", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "prettyplease" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" -dependencies = [ - "proc-macro2", - "syn 2.0.85", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "proc-macro-utils" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f59e109e2f795a5070e69578c4dc101068139f74616778025ae1011d4cd41a8" -dependencies = [ - "proc-macro2", - "quote", - "smallvec", -] - -[[package]] -name = "proc-macro-utils" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" -dependencies = [ - "proc-macro2", - "quote", - "smallvec", -] - -[[package]] -name = "proc-macro2" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", - "version_check", - "yansi", -] - -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "quote-use" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9619db1197b497a36178cfc736dc96b271fe918875fbf1344c436a7e93d0321e" -dependencies = [ - "quote", - "quote-use-macros", -] - -[[package]] -name = "quote-use-macros" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82ebfb7faafadc06a7ab141a6f67bcfb24cb8beb158c6fe933f2f035afa99f35" -dependencies = [ - "proc-macro-utils 0.10.0", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "raffia" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" -dependencies = [ - "raffia_macro", - "smallvec", -] - -[[package]] -name = "raffia_macro" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" -dependencies = [ - "heck", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "reactive_graph" -version = "0.1.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e99ef30cfb23ffd2da6bbfcfa218c043003fdc40909102b52e9cc48707894e8" -dependencies = [ - "any_spawner", - "async-lock", - "futures", - "guardian", - "hydration_context", - "or_poisoned", - "pin-project-lite", - "rustc-hash", - "send_wrapper", - "serde", - "slotmap", - "thiserror", - "web-sys", -] - -[[package]] -name = "reactive_stores" -version = "0.1.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8062a7f178f934c17145a4dab0e8f0bf8879975ce72e1146b9bcd3bc6f342c19" -dependencies = [ - "guardian", - "itertools 0.13.0", - "or_poisoned", - "paste", - "reactive_graph", - "reactive_stores_macro", - "rustc-hash", -] - -[[package]] -name = "reactive_stores_macro" -version = "0.1.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1262c9b4c1633da17472d69a2bc7d4709780c616e919b236e51949f160d2ab2e" -dependencies = [ - "convert_case", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "redox_syscall" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rkyv" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rstml" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51187e564f12336ef40cd04f6f4d805d6919188001dcf1e0a021898ea0fe28ce" -dependencies = [ - "derive-where", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.85", - "syn_derive", - "thiserror", -] - -[[package]] -name = "rustc-hash" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "sabry" -version = "0.0.1-beta.2" -dependencies = [ - "leptos", - "sabry_build", - "sabry_intrnl", - "sabry_procmacro", -] - -[[package]] -name = "sabry_build" -version = "0.0.1-beta.2" -dependencies = [ - "proc-macro2", - "sabry_intrnl", - "sabry_procmacro_impl", - "syn 2.0.85", - "thiserror", - "walkdir", -] - -[[package]] -name = "sabry_intrnl" -version = "0.0.1-beta.2" -dependencies = [ - "base64", - "blake3", - "cfg-if", - "grass", - "lightningcss", - "proc-macro2", - "quote", - "raffia", - "regex", - "serde", - "syn 2.0.85", - "thiserror", - "toml", -] - -[[package]] -name = "sabry_procmacro" -version = "0.0.1-beta.2" -dependencies = [ - "sabry_procmacro_impl", -] - -[[package]] -name = "sabry_procmacro_impl" -version = "0.0.1-beta.2" -dependencies = [ - "proc-macro2", - "quote", - "raffia", - "regex", - "sabry_intrnl", - "syn 2.0.85", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" -dependencies = [ - "futures-core", -] - -[[package]] -name = "serde" -version = "1.0.214" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.214" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "serde_json" -version = "1.0.132" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_qs" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6" -dependencies = [ - "percent-encoding", - "serde", - "thiserror", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[package]] -name = "server_fn" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2397ddd8c45c2379d3b596e978f8edc6548572c669730d0e69c8aac3117679c2" -dependencies = [ - "bytes", - "const_format", - "dashmap 6.1.0", - "futures", - "gloo-net", - "http", - "js-sys", - "once_cell", - "pin-project-lite", - "send_wrapper", - "serde", - "serde_json", - "serde_qs", - "server_fn_macro_default", - "thiserror", - "throw_error", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "xxhash-rust", -] - -[[package]] -name = "server_fn_macro" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0965c30b56ec0f1cdd15464f4ce4abd83d06fe582c9c2fbcf61ee7e1453c805" -dependencies = [ - "const_format", - "convert_case", - "proc-macro2", - "quote", - "syn 2.0.85", - "xxhash-rust", -] - -[[package]] -name = "server_fn_macro_default" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08bce1bdbe13e78fba58b3e1323b25597bc9c14ae59825299d7f6b10f819286" -dependencies = [ - "server_fn_macro", - "syn 2.0.85", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "simd-abstraction" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" -dependencies = [ - "outref", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "slotmap" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "tachys" -version = "0.1.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4061a2262552cb95969488266f015c14b52539e92d2ada077ac170b3a1b458ba" -dependencies = [ - "any_spawner", - "const_str_slice_concat", - "drain_filter_polyfill", - "either_of", - "futures", - "html-escape", - "indexmap", - "itertools 0.13.0", - "js-sys", - "linear-map", - "next_tuple", - "oco_ref", - "once_cell", - "or_poisoned", - "parking_lot", - "paste", - "reactive_graph", - "reactive_stores", - "rustc-hash", - "send_wrapper", - "slotmap", - "throw_error", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "thiserror" -version = "1.0.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "throw_error" -version = "0.2.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f94a0abd02fad5a46b04748c89c32d2b5784bbb046fb6675f186e0bd45cd415c" -dependencies = [ - "pin-project-lite", -] - -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "toml" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "typed-builder" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06fbd5b8de54c5f7c91f6fe4cebb949be2125d7758e630bb58b1d831dbce600" -dependencies = [ - "typed-builder-macro", -] - -[[package]] -name = "typed-builder-macro" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9534daa9fd3ed0bd911d462a37f172228077e7abf18c18a5f67199d959205f8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - -[[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8-width" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" -dependencies = [ - "getrandom", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vlq" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.85", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" - -[[package]] -name = "wasm-streams" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" -dependencies = [ - "memchr", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "xxhash-rust" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" - -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] From 5465319d1d067a447e1f22d93caf91ee2cf67f87 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 02:03:50 +0500 Subject: [PATCH 036/184] idk!: reduce MSRV a bit --- Cargo.toml | 2 +- README.md | 4 ++-- examples/leptos-axum/Cargo.toml | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index defdf56..8af57cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ sabry_build = {path = "sabry_build", version = "0.0.1-beta.2" } [workspace.package] version = "0.0.1-beta.2" edition = "2021" -rust-version = "1.82" +rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] repository = "https://github.com/yiffyrusdev/sabry" license = "MIT" diff --git a/README.md b/README.md index 25774c6..187e999 100644 --- a/README.md +++ b/README.md @@ -682,9 +682,9 @@ If you'd like to lend a paw - feel free to check the [WIP](#wip) section out, or ## MSRV -Sabry passes its own tests on 1.82 nightly. +Sabry passes its own tests on 1.78 nightly/stable. -There *were* some strange parsing issues reports on *stable* channel, seems to be fixed. idk. +Examples are on 1.82. ## License diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index f1aadcd..848c699 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -1,6 +1,7 @@ [package] name = "leptos-axum-sabry" version = "0.1.0" +rust-version = "1.82" edition = "2021" publish = false From 747b2bca21f37d153cacaded8cc623855f454e56 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 02:04:10 +0500 Subject: [PATCH 037/184] fmt: fmt --- sabry_build/src/buildmagic.rs | 31 ++++++++++++++++--------- sabry_intrnl/src/scoper/hash.rs | 4 +++- sabry_intrnl/src/scoper/mod.rs | 8 +++++-- sabry_intrnl/src/syntax/ostrta.rs | 12 +++++----- sabry_procmacro_impl/src/impls/styly.rs | 3 +-- 5 files changed, 36 insertions(+), 22 deletions(-) diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index 7faa138..8d7bcff 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -185,10 +185,9 @@ impl SabryBuilder { } } - let css = self.css_compiler.compile_module( - scope.original_scope.adapter().syntax, - &scope.hashed_code, - )?; + let css = self + .css_compiler + .compile_module(scope.original_scope.adapter().syntax, &scope.hashed_code)?; self.state .loaded_css_modules .push((scope.original_scope.name.to_string(), css)); @@ -196,7 +195,9 @@ impl SabryBuilder { // compile sass preludes into the CSS prelude for pre in &self.state.sass_prelude { - let css = self.css_compiler.compile_module(pre.syntax.into(), &pre.code)?; + let css = self + .css_compiler + .compile_module(pre.syntax.into(), &pre.code)?; self.state.css_prelude.push_str(&css); } @@ -263,14 +264,22 @@ impl SabryBuilder { for pre in sass_pres { let pre_path = PathBuf::from_str(pre)?; - let syntax = pre_path.extension().unwrap_or_default().to_str().unwrap_or_default(); + let syntax = pre_path + .extension() + .unwrap_or_default() + .to_str() + .unwrap_or_default(); let syntax = match ArbitraryStyleSyntax::try_from(syntax) { Ok(s) => s, - Err(_) => return Err(SabryBuildError::Another(format!("Unknown syntax for sass prelude {pre}"))) + Err(_) => { + return Err(SabryBuildError::Another(format!( + "Unknown syntax for sass prelude {pre}" + ))) + } }; let code = fs::read_to_string(pre_path)?; - sass_preludes.push(SassPreludeModule {syntax, code}); + sass_preludes.push(SassPreludeModule { syntax, code }); } self.state.sass_prelude.extend(sass_preludes); } @@ -349,7 +358,7 @@ pub struct SabryBuildState { css_prelude: String, /// SASS preludes loaded from config /// Should be compiled into loaded_css_modules as well - sass_prelude: Vec<SassPreludeModule> + sass_prelude: Vec<SassPreludeModule>, } /// Convenience struct for [SabryBuildState::sass_prelude] @@ -357,7 +366,7 @@ pub struct SassPreludeModule { /// syntax for the prelude syntax: ArbitraryStyleSyntax, /// code of the prelude - code: String + code: String, } #[derive(Debug, thiserror::Error)] @@ -387,5 +396,5 @@ pub enum SabryBuildError { #[error("Failed to load config/manifest")] Manifest(#[from] ManifestError), #[error("Another error")] - Another(String) + Another(String), } diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index e40819f..21a875c 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -69,7 +69,9 @@ impl ScopeHash { mod test { use syn::Ident; - use crate::{config::SabryHashConfig, scoper::ArbitraryScope, syntax::ostrta::OneSyntaxToRuleThemAll}; + use crate::{ + config::SabryHashConfig, scoper::ArbitraryScope, syntax::ostrta::OneSyntaxToRuleThemAll, + }; use super::ScopeHash; diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 934d646..fdfb84e 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -5,7 +5,10 @@ use hash::ScopeHash; use raffia::Spanned; use regex::Regex; -use crate::{config::SabryHashConfig, syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}}; +use crate::{ + config::SabryHashConfig, + syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}, +}; pub mod hash; @@ -375,7 +378,8 @@ mod test { use crate::{ config::SabryHashConfig, - scoper::{hash::ScopeHash, HashedScope}, syntax::ostrta::OneSyntaxToRuleThemAll, + scoper::{hash::ScopeHash, HashedScope}, + syntax::ostrta::OneSyntaxToRuleThemAll, }; use super::ArbitraryScope; diff --git a/sabry_intrnl/src/syntax/ostrta.rs b/sabry_intrnl/src/syntax/ostrta.rs index 1edbf1c..6dd4f69 100644 --- a/sabry_intrnl/src/syntax/ostrta.rs +++ b/sabry_intrnl/src/syntax/ostrta.rs @@ -3,7 +3,7 @@ #[derive(Debug, Clone, Copy)] pub enum OneSyntaxToRuleThemAll { Sass, - Scss + Scss, } impl Default for OneSyntaxToRuleThemAll { @@ -18,7 +18,7 @@ impl TryFrom<&str> for OneSyntaxToRuleThemAll { match value { "sass" => Ok(Self::Sass), "scss" => Ok(Self::Scss), - _ => Err(()) + _ => Err(()), } } } @@ -29,7 +29,7 @@ impl TryFrom<raffia::Syntax> for OneSyntaxToRuleThemAll { match value { raffia::Syntax::Sass => Ok(Self::Sass), raffia::Syntax::Scss => Ok(Self::Scss), - _ => Err(()) + _ => Err(()), } } } @@ -40,7 +40,7 @@ impl TryFrom<grass::InputSyntax> for OneSyntaxToRuleThemAll { match value { grass::InputSyntax::Sass => Ok(Self::Sass), grass::InputSyntax::Scss => Ok(Self::Scss), - _ => Err(()) + _ => Err(()), } } } @@ -49,7 +49,7 @@ impl From<OneSyntaxToRuleThemAll> for raffia::Syntax { fn from(value: OneSyntaxToRuleThemAll) -> Self { match value { OneSyntaxToRuleThemAll::Sass => Self::Sass, - OneSyntaxToRuleThemAll::Scss => Self::Scss + OneSyntaxToRuleThemAll::Scss => Self::Scss, } } } @@ -58,7 +58,7 @@ impl From<OneSyntaxToRuleThemAll> for grass::InputSyntax { fn from(value: OneSyntaxToRuleThemAll) -> Self { match value { OneSyntaxToRuleThemAll::Scss => Self::Scss, - OneSyntaxToRuleThemAll::Sass => Self::Sass + OneSyntaxToRuleThemAll::Sass => Self::Sass, } } } diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 296fc4f..82801ea 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -45,8 +45,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { Err(e) => return e.to_compile_error(), }; - let scope = match ArbitraryScope::from_source(ms.syntax.0, ms.scope.clone(), &ms.code.code) - { + let scope = match ArbitraryScope::from_source(ms.syntax.0, ms.scope.clone(), &ms.code.code) { Ok(s) => match s.hashed(&config.hash) { Ok(hs) => Ok(hs), Err(e) => Err(e), From d59729e6fec8ec2425bf42ea0df63a920449b238 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 09:15:11 +0500 Subject: [PATCH 038/184] fix: apply lightningcss to bundle once again. Seems the right thing to do --- sabry_build/src/buildmagic.rs | 8 ++- sabry_intrnl/src/compiler/mod.rs | 90 ++++++++++++++++++-------------- 2 files changed, 57 insertions(+), 41 deletions(-) diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index 8d7bcff..be71ab7 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -145,10 +145,14 @@ impl SabryBuilder { .append(true) .open(path)?; + // merged bundle CSS does require another lightningcss pass + let mut buffer = String::new(); for (_, code) in &self.state.loaded_css_modules { - write!(file, " {}", self.state.css_prelude)?; - write!(file, " {code}")?; + buffer.push_str(code); } + buffer = self.css_compiler.lightningcss(&buffer)?; + + write!(file, "{buffer}")?; } Ok(()) diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 4fcd129..a789585 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -19,6 +19,8 @@ impl CompilerAdapter { Self { config } } + /// Compile given SASS/SCSS into CSS + /// with respect to self.config pub fn compile_module( &self, syntax: OneSyntaxToRuleThemAll, @@ -28,48 +30,58 @@ impl CompilerAdapter { let mut css = grass::from_string(code, &options)?; + css = match self.lightningcss(&css) { + Ok(c) => c, + Err(e) => return Err(e), + }; + + Ok(css) + } + + /// Perform lightningcss transformations on given css + /// with respect to self.config.css.minify on minification + pub fn lightningcss(&self, css: &str) -> Result<String, SabryCompilerError> { + let mut lightsheet = match lightningcss::stylesheet::StyleSheet::parse( + css, + lightningcss::stylesheet::ParserOptions::default(), + ) { + Ok(s) => s, + Err(e) => { + return Err(SabryCompilerError::LightParse { + kind: e.kind.to_string(), + loc: e.loc, + }) + } + }; + + let targets = Targets { + browsers: Some(self.config.lightningcss.targets.clone().into()), + ..Default::default() + }; + + let printer_options = PrinterOptions { + minify: self.config.css.minify, + targets, + ..Default::default() + }; + + let minify_options = MinifyOptions { + targets, + ..Default::default() + }; + if self.config.css.minify { - //its lightningcss time! - let mut lightsheet = match lightningcss::stylesheet::StyleSheet::parse( - &css, - lightningcss::stylesheet::ParserOptions::default(), - ) { - Ok(s) => s, - Err(e) => { - return Err(SabryCompilerError::LightParse { - kind: e.kind.to_string(), - loc: e.loc, - }) - } - }; - - let targets = Targets { - browsers: Some(self.config.lightningcss.targets.clone().into()), - ..Default::default() - }; - - let printer_options = PrinterOptions { - minify: self.config.css.minify, - targets, - ..Default::default() - }; - - let minify_options = MinifyOptions { - targets, - ..Default::default() - }; - - lightsheet.minify(minify_options)?; - - css = match lightsheet.to_css(printer_options) { - Ok(c) => { - drop(lightsheet); - c.code - } - Err(e) => return Err(SabryCompilerError::LightPrint(e)), - }; + lightsheet.minify(minify_options)? } + let css = match lightsheet.to_css(printer_options) { + Ok(c) => { + drop(lightsheet); + c.code + } + Err(e) => return Err(SabryCompilerError::LightPrint(e)), + }; + Ok(css) } } From fe984a9348aa81453dbde75a142fec518b27c2f5 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 09:20:00 +0500 Subject: [PATCH 039/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8af57cd..8db224a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.2" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.2" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.2" } -sabry_build = {path = "sabry_build", version = "0.0.1-beta.2" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.3" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.3" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.3" } +sabry_build = {path = "sabry_build", version = "0.0.1-beta.3" } [workspace.package] -version = "0.0.1-beta.2" +version = "0.0.1-beta.3" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From a379035f790e74540142cd7ca44ec00f11091295 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 09:56:15 +0500 Subject: [PATCH 040/184] feat!: use macro call name for scss module name in usey --- sabry_procmacro/tests/macros.rs | 84 +++++++++++++++++++++++++ sabry_procmacro/tests/samicro.sass | 2 + sabry_procmacro/tests/scmicro.scss | 3 + sabry_procmacro_impl/src/impls/sassy.rs | 2 - sabry_procmacro_impl/src/impls/usey.rs | 8 ++- 5 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 sabry_procmacro/tests/macros.rs create mode 100644 sabry_procmacro/tests/samicro.sass create mode 100644 sabry_procmacro/tests/scmicro.scss diff --git a/sabry_procmacro/tests/macros.rs b/sabry_procmacro/tests/macros.rs new file mode 100644 index 0000000..22bd4a3 --- /dev/null +++ b/sabry_procmacro/tests/macros.rs @@ -0,0 +1,84 @@ +use std::{collections::HashSet, fs}; + +use sabry_procmacro::{sassy, usey}; + +sassy!(scmod:scss {" + @mixin abc(){ + color: red; + } + .sel1{ + @include abc; + } +"}); +sassy!(samod:sass {" + @mixin abc() + color: green + .sel1 + @include abc +"}); + +sassy!(scmicromod:scss "sabry_procmacro/tests/scmicro.scss"); +sassy!(samicromod:sass "sabry_procmacro/tests/samicro.sass"); + +#[test] +fn sassy_contract() { + assert_eq!(scmod!(syntax), "scss"); + assert_eq!( + scmod!(), + " +@mixin abc(){ + color: red; +} +.sel1{ + @include abc; +} +" + ); + + assert_eq!(scmicromod!(syntax), "scss"); + assert_eq!( + scmicromod!(), + fs::read_to_string("tests/scmicro.scss").unwrap() + ); + + assert_eq!(samod!(syntax), "sass"); + assert_eq!( + samod!(), + " +@mixin abc() + color: green +.sel1 + @include abc +" + ); + + assert_eq!(samicromod!(syntax), "sass"); + assert_eq!( + samicromod!(), + fs::read_to_string("tests/samicro.sass").unwrap() + ); +} + +#[test] +fn usey_contract() { + use samicromod as aliasedmod; + + let _usey = usey!(aliasedmod!(), scmicromod!()); + let expect_modules = + HashSet::from(["aliasedmod.sass".to_string(), "scmicromod.scss".to_string()]); + let expect_codes = HashSet::from([ + fs::read_to_string("tests/samicro.sass").unwrap(), + fs::read_to_string("tests/scmicro.scss").unwrap(), + ]); + + let mut real_modules = HashSet::new(); + let mut real_codes = HashSet::new(); + + _usey.iter().for_each(|(module, code)| { + real_modules.insert(module.clone()); + real_codes.insert(code.clone()); + }); + + assert_eq!(expect_modules, real_modules); + assert_eq!(expect_codes, real_codes) +} diff --git a/sabry_procmacro/tests/samicro.sass b/sabry_procmacro/tests/samicro.sass new file mode 100644 index 0000000..7bc961b --- /dev/null +++ b/sabry_procmacro/tests/samicro.sass @@ -0,0 +1,2 @@ +.sel1 + color: red diff --git a/sabry_procmacro/tests/scmicro.scss b/sabry_procmacro/tests/scmicro.scss new file mode 100644 index 0000000..07d5482 --- /dev/null +++ b/sabry_procmacro/tests/scmicro.scss @@ -0,0 +1,3 @@ +.sel1 { + color: red; +} diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index c15c303..ef5d401 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -28,7 +28,6 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { } let sourcesass = code.to_string(); - let identname = ident.to_string(); let macro_doc = format!("Arbitrary {:?} code declared with `sassy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); quote! { @@ -36,7 +35,6 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { #[macro_export] macro_rules! #ident { () => {#sourcesass}; - (module) => {#identname}; (syntax) => {#mode}; } } diff --git a/sabry_procmacro_impl/src/impls/usey.rs b/sabry_procmacro_impl/src/impls/usey.rs index 730bb4e..caf31ef 100644 --- a/sabry_procmacro_impl/src/impls/usey.rs +++ b/sabry_procmacro_impl/src/impls/usey.rs @@ -34,7 +34,11 @@ impl StyleCall { let call_bang = &self.call.bang_token; // the following calls are expected by macro genereted by `sassy!` let call_syntax = quote! {#call_path #call_bang (syntax)}; - let call_file = quote! {#call_path #call_bang (module)}; + + let module_name = call_path + .get_ident() + .expect("BUG: failed to get identifier for macro call") + .to_string(); if self.vis_pub { quote! { @@ -42,7 +46,7 @@ impl StyleCall { } } else { quote! { - (format!("{}.{}", #call_file, #call_syntax), #call_code .to_string()) + (format!("{}.{}", #module_name, #call_syntax), #call_code .to_string()) } } } From 120f254eaf9383bc7788e313b3737a2bb529cd0a Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 10:00:05 +0500 Subject: [PATCH 041/184] docs: update for the changed usey module name check --- README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 187e999..6f530d9 100644 --- a/README.md +++ b/README.md @@ -565,9 +565,8 @@ buildy( The `usey!` macro accepts the following syntax: `#($macro,)*`, where -- *$macro* is a macro which handles three expansions: +- *$macro* is a macro which handles two expansions: - `() => { $code }` - - `(name) => { $name }` - `(syntax) => { $syntax }` Where for the *$macro*: @@ -576,6 +575,20 @@ Where for the *$macro*: - *$name* is a name of module without extension as a string literal - *$syntax* is either "sass" or "scss" +`usey!` macro will put the module full name from macro call identifier and the `syntax` expansion, so you could +resolve potential naming conflicts: + +```rust,ignore +use tgk_brandstyle::theme; +use basestyle::theme as base_theme; + +sabry::buildy( + sabry::usey!( + theme!(), + base_theme!() + ) +)?; +``` Exactly this kind of macros is produced by [`sassy!`](#style-definition-with-sassy). From 46ca58a7a232bbb68e45311e8b6a602dbfb68b3f Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 10:00:36 +0500 Subject: [PATCH 042/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8db224a..ffb981b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.3" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.3" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.3" } -sabry_build = {path = "sabry_build", version = "0.0.1-beta.3" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.4" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.4" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.4" } +sabry_build = {path = "sabry_build", version = "0.0.1-beta.4" } [workspace.package] -version = "0.0.1-beta.3" +version = "0.0.1-beta.4" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From f4645aaf399b2fc1124bf6aa969ca9d5b2f3a0f1 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sun, 3 Nov 2024 17:12:01 +0500 Subject: [PATCH 043/184] tests: ufix: usey macro didn`t recognize qualified path --- sabry_procmacro_impl/src/impls/usey.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sabry_procmacro_impl/src/impls/usey.rs b/sabry_procmacro_impl/src/impls/usey.rs index caf31ef..56b2ba5 100644 --- a/sabry_procmacro_impl/src/impls/usey.rs +++ b/sabry_procmacro_impl/src/impls/usey.rs @@ -36,9 +36,10 @@ impl StyleCall { let call_syntax = quote! {#call_path #call_bang (syntax)}; let module_name = call_path - .get_ident() - .expect("BUG: failed to get identifier for macro call") - .to_string(); + .segments + .last() + .map(|l| l.ident.to_string()) + .expect("BUG: failed to get identifier for macro call"); if self.vis_pub { quote! { From 3b8d1aa6f25187aae30c6fa36a9195eac39464f3 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sun, 3 Nov 2024 17:51:24 +0500 Subject: [PATCH 044/184] refactor: make the default build workflow a part of SabryBuilder API --- sabry_build/src/buildmagic.rs | 48 +++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index be71ab7..7ea2af9 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -47,27 +47,9 @@ type BuilderResult = Result<(), SabryBuildError>; /// /// This function is intended to run at build time, however, you're free to use it however you please pub fn buildy(inline_side_modules: impl IntoIterator<Item = StyleModule>) -> BuilderResult { - println!("🧙: This is probably the stderr. Something went wrong:"); - let config = SabryConfig::require()?; let mut builder = SabryBuilder::new(config); - - println!("🧙 loading preludes"); - builder.load_preludes()?; - - println!("🧙 loading `buildy` modules"); - for (name, code) in inline_side_modules { - builder.load_side_module(name, code)?; - } - - println!("🧙 loading this crate"); - builder.load_styles_from_this_crate()?; - - println!("🧙 compiling CSS"); - builder.compile_everything()?; - - println!("🧙 writing an output"); - builder.generate_output()?; + builder.build(inline_side_modules)?; Ok(()) } @@ -108,6 +90,33 @@ impl SabryBuilder { } } + /// Default building workflow implementation + pub fn build( + &mut self, + inline_side_modules: impl IntoIterator<Item = StyleModule>, + ) -> BuilderResult { + println!("🧙: This is probably the stderr. Something went wrong:"); + + println!("🧙 loading preludes"); + self.load_preludes()?; + + println!("🧙 loading `buildy` modules"); + for (name, code) in inline_side_modules { + self.load_side_module(name, code)?; + } + + println!("🧙 loading this crate"); + self.load_styles_from_this_crate()?; + + println!("🧙 compiling CSS"); + self.compile_everything()?; + + println!("🧙 writing an output"); + self.generate_output()?; + + Ok(()) + } + /// Write all the loaded CSS /// /// - Bundle file (if configured) @@ -228,6 +237,7 @@ impl SabryBuilder { let entry_path = entry.path(); let ext = entry_path.extension().unwrap_or_default(); if ext == "rs" { + println!(".. reading {entry_path:?}"); let visitor = filevisit::visit_file(entry_path)?; self.state.loaded_stylyses.extend(visitor.found_stylys); } From 45ba23e9625577f6a76b9e166647be54e2e6f27c Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sun, 3 Nov 2024 17:52:28 +0500 Subject: [PATCH 045/184] test: add more integration tests with insta. Like it! --- .gitignore | 3 + Cargo.toml | 1 + README.md | 14 +- tests/assets/mixin-module.sass | 19 ++ tests/assets/mixin-module.scss | 24 +++ tests/assets/mixins.sass | 5 - tests/assets/mixins.scss | 9 - tests/assets/module-forward.sass | 3 + tests/assets/module-forward.scss | 3 + tests/assets/module-usage.sass | 15 ++ tests/assets/module-usage.scss | 20 ++ tests/assets/prelude.css | 3 + tests/assets/prelude.sass | 5 + tests/assets/prelude.scss | 6 + tests/assets/sole-code.sass | 17 ++ tests/assets/sole-code.scss | 22 +++ tests/assets/use-forwarded.sass | 14 ++ tests/assets/use-forwarded.scss | 20 ++ tests/macros.rs | 182 ++++++++++++++++++ .../compilation_with_buildy@bundle.css.snap | 7 + ..._buildy@scopes__module_usage_sass.css.snap | 7 + ..._buildy@scopes__module_usage_scss.css.snap | 7 + ...ith_buildy@scopes__sole_code_sass.css.snap | 7 + ...ith_buildy@scopes__sole_code_scss.css.snap | 7 + ...buildy@scopes__use_forwarded_sass.css.snap | 7 + ...buildy@scopes__use_forwarded_scss.css.snap | 7 + 26 files changed, 413 insertions(+), 21 deletions(-) create mode 100644 tests/assets/mixin-module.sass create mode 100644 tests/assets/mixin-module.scss delete mode 100644 tests/assets/mixins.sass delete mode 100644 tests/assets/mixins.scss create mode 100644 tests/assets/module-forward.sass create mode 100644 tests/assets/module-forward.scss create mode 100644 tests/assets/module-usage.sass create mode 100644 tests/assets/module-usage.scss create mode 100644 tests/assets/prelude.css create mode 100644 tests/assets/prelude.sass create mode 100644 tests/assets/prelude.scss create mode 100644 tests/assets/sole-code.sass create mode 100644 tests/assets/sole-code.scss create mode 100644 tests/assets/use-forwarded.sass create mode 100644 tests/assets/use-forwarded.scss create mode 100644 tests/macros.rs create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap diff --git a/.gitignore b/.gitignore index e2bc000..ae8e48f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ rust-toolchain.toml .vscode .profile /Cargo.lock +/tests/sabry_intermediate +/tests/sabry_output +/playground diff --git a/Cargo.toml b/Cargo.toml index ffb981b..ed2ec1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,6 +43,7 @@ sabry_intrnl = {workspace = true} [dev-dependencies] leptos = {version = "0.7.0-gamma3"} +insta = {version = "^1.41", features = ["glob"]} [features] default = ["procmacro"] diff --git a/README.md b/README.md index 6f530d9..0a4e396 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Code your SASS in separate files to get proper syntax highlighting, or do sass-i ```rust sabry::styly!(component {".btn {color: green;}"}); -sabry::styly!(extras "tests/assets/mixins.scss"); +sabry::styly!(extras "tests/assets/mixin-module.scss"); ``` </td> @@ -88,7 +88,7 @@ sabry::styly!(breadbadge {" Keep things as private and modular as you wish ```rust -sabry::styly!(pub cats "tests/assets/mixins.scss"); +sabry::styly!(pub cats "tests/assets/mixin-module.scss"); sabry::styly!(dogs {"#howl {border: none;}"}); ``` ```rust,ignore @@ -148,7 +148,7 @@ And a proc-macro // lib.rs use sabry::sassy; -sassy!(mixins "tests/assets/mixins.scss"); +sassy!(mixins "tests/assets/mixin-module.scss"); sassy!(styles {" $primary-color: black; @mixin colored($col: primary) { @@ -443,8 +443,8 @@ Examples: use sabry::sassy; sassy!(module1 {"$primary-color: red;"}); -sassy!(module2 "tests/assets/mixins.scss"); -sassy!(module3:sass "tests/assets/mixins.sass"); +sassy!(module2 "tests/assets/mixin-module.scss"); +sassy!(module3:sass "tests/assets/mixin-module.sass"); // works, but there are catches. sassy!(module4:sass {" @mixin colored($col: primary) @@ -514,7 +514,7 @@ You can read more about scoping and hashing in the [scoping](#scoping) section. By default generated `mod` is private. You can make both mod and wrapper style constant public by adding the `pub` to macro call: ```rust -sabry::styly!(pub whatever "tests/assets/mixins.scss"); +sabry::styly!(pub whatever "tests/assets/mixin-module.scss"); ``` #### Constant styly scopes @@ -524,7 +524,7 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: ```rust -sabry::styly!(const scope "tests/assets/mixins.scss"); +sabry::styly!(const scope "tests/assets/mixin-module.scss"); ``` Which results in following: ```rust,ignore diff --git a/tests/assets/mixin-module.sass b/tests/assets/mixin-module.sass new file mode 100644 index 0000000..cff411f --- /dev/null +++ b/tests/assets/mixin-module.sass @@ -0,0 +1,19 @@ + +@mixin color($color: black) + @if $color == black + color: white + background-color: green + @else if $color == white + color: red + background-color: black + @else + color: #c6c6c6 + background-color: #00ffff + &::after + content: 'Colored' + color: $color + background-color: blue + &:hover + transform: scale(2) + &:hover + transform: translateX(10%) diff --git a/tests/assets/mixin-module.scss b/tests/assets/mixin-module.scss new file mode 100644 index 0000000..f8887c0 --- /dev/null +++ b/tests/assets/mixin-module.scss @@ -0,0 +1,24 @@ + +@mixin surface($color: black){ + @if $color == black{ + color: white; + background-color: green; + }@else if $color == white{ + color: red; + background-color: black; + }@else{ + color: #c6c6c6; + background-color: #00ffff; + } + &::after{ + content: 'Colored'; + color: $color; + background-color: blue; + &:hover{ + transform: scale(2); + } + } + &:hover{ + transform: translateX(10%); + } +} diff --git a/tests/assets/mixins.sass b/tests/assets/mixins.sass deleted file mode 100644 index 45a1ec6..0000000 --- a/tests/assets/mixins.sass +++ /dev/null @@ -1,5 +0,0 @@ -@mixin colored($color: primary) - @if $color == primary - color: white - @else - color: $col diff --git a/tests/assets/mixins.scss b/tests/assets/mixins.scss deleted file mode 100644 index d201fd0..0000000 --- a/tests/assets/mixins.scss +++ /dev/null @@ -1,9 +0,0 @@ -$primary-color: black; - -@mixin colored($col: primary) { - @if $col == primary { - color: $primary-color; - } @else { - color: $col; - } -} diff --git a/tests/assets/module-forward.sass b/tests/assets/module-forward.sass new file mode 100644 index 0000000..ad1e734 --- /dev/null +++ b/tests/assets/module-forward.sass @@ -0,0 +1,3 @@ + +@forward 'mixins_a' +@forward 'mixins_c' diff --git a/tests/assets/module-forward.scss b/tests/assets/module-forward.scss new file mode 100644 index 0000000..8352864 --- /dev/null +++ b/tests/assets/module-forward.scss @@ -0,0 +1,3 @@ + +@forward 'mixins_a'; +@forward 'mixins_c'; diff --git a/tests/assets/module-usage.sass b/tests/assets/module-usage.sass new file mode 100644 index 0000000..3137332 --- /dev/null +++ b/tests/assets/module-usage.sass @@ -0,0 +1,15 @@ +@use 'mixins_a' as * +@use 'mixins_c' as * + +.coated + @include color(green) + @include surface(black) + &-dark + @include surface(red) + a + @include surface(blue) + img + @include color(black) + span + @include color(green) + display: block diff --git a/tests/assets/module-usage.scss b/tests/assets/module-usage.scss new file mode 100644 index 0000000..921333c --- /dev/null +++ b/tests/assets/module-usage.scss @@ -0,0 +1,20 @@ +@use 'mixins_a' as *; +@use 'mixins_c' as *; + +.coated{ + @include color(green); + @include surface(black); + &-dark{ + @include surface(red); + a{ + @include surface(blue); + img{ + @include color(black); + } + } + } + span{ + @include color(green); + display: block; + } +} diff --git a/tests/assets/prelude.css b/tests/assets/prelude.css new file mode 100644 index 0000000..0995dad --- /dev/null +++ b/tests/assets/prelude.css @@ -0,0 +1,3 @@ +html { + background-color: dark; +} diff --git a/tests/assets/prelude.sass b/tests/assets/prelude.sass new file mode 100644 index 0000000..c78cbb1 --- /dev/null +++ b/tests/assets/prelude.sass @@ -0,0 +1,5 @@ +@use 'mixins_a' as * +@use 'mixins_c' as * + +body + @include color() diff --git a/tests/assets/prelude.scss b/tests/assets/prelude.scss new file mode 100644 index 0000000..28384b9 --- /dev/null +++ b/tests/assets/prelude.scss @@ -0,0 +1,6 @@ +@use 'mixins_a' as *; +@use 'mixins_c' as *; + +body { + @include surface(); +} diff --git a/tests/assets/sole-code.sass b/tests/assets/sole-code.sass new file mode 100644 index 0000000..ccc06a1 --- /dev/null +++ b/tests/assets/sole-code.sass @@ -0,0 +1,17 @@ +.fuzz + background-color: red + display: block + &-dark + background-color: black + color: white + a + text-transform: uppercase + img + position: absolute + top: 0 + left: 10rem + span + position: relative + display: grid + grid-template-areas: 'a b c' 'd e f' 'x x x' + display: block diff --git a/tests/assets/sole-code.scss b/tests/assets/sole-code.scss new file mode 100644 index 0000000..dcb73cc --- /dev/null +++ b/tests/assets/sole-code.scss @@ -0,0 +1,22 @@ +.fuzz{ + background-color: red; + display: block; + &-dark{ + background-color: black; + color: white; + a{ + text-transform: uppercase; + img{ + position: absolute; + top: 0; + left: 10rem; + } + } + } + span{ + position: relative; + display: grid; + grid-template-areas: 'a b c' 'd e f' 'x x x'; + display: block; + } +} diff --git a/tests/assets/use-forwarded.sass b/tests/assets/use-forwarded.sass new file mode 100644 index 0000000..e1b91e3 --- /dev/null +++ b/tests/assets/use-forwarded.sass @@ -0,0 +1,14 @@ +@use 'module_a' as * + +.coated + @include color(green) + @include surface(black) + &-dark + @include surface(red) + a + @include surface(blue) + img + @include color(black) + span + @include color(green) + display: block diff --git a/tests/assets/use-forwarded.scss b/tests/assets/use-forwarded.scss new file mode 100644 index 0000000..ce68c48 --- /dev/null +++ b/tests/assets/use-forwarded.scss @@ -0,0 +1,20 @@ +@use 'module_c' as *; + + +.coated{ + @include color(green); + @include surface(black); + &-dark{ + @include surface(red); + a{ + @include surface(blue); + img{ + @include color(black); + } + } + } + span{ + @include color(green); + display: block; + } +} diff --git a/tests/macros.rs b/tests/macros.rs new file mode 100644 index 0000000..e944f3d --- /dev/null +++ b/tests/macros.rs @@ -0,0 +1,182 @@ +use std::fs; + +use insta::{glob, Settings}; + +use sabry::{ + buildmagic::SabryBuilder, + config::{BehavHashCollision, BehavSassModCollision, SabryConfig}, + sassy, styly, usey, +}; + +pub mod sass { + use sabry::sassy; + + sassy!(mixins_sass:sass "tests/assets/mixin-module.sass"); + sassy!(mixins_inline_sass:sass {" + @mixin color($color: black) + @if $color == black + color: white + background-color: green + @else if $color == white + color: red + background-color: black + @else + color: #c6c6c6 + background-color: #00ffff + &::after + content: 'Colored' + color: $color + background-color: blue + &:hover + transform: scale(2) + &:hover + transform: translateX(10%) +"}); + sassy!(module_sass:sass "tests/assets/module-forward.sass"); + sassy!(module_inline_sass:sass {" +@forward 'mixins_a' +@forward 'mixins_c' +"}); + pub(crate) use mixins_inline_sass as mixins_inline_a; + pub(crate) use mixins_sass as mixins_a; + pub(crate) use module_inline_sass as module_inline_a; + pub(crate) use module_sass as module_a; +} + +pub mod scss { + use sabry::sassy; + + sassy!(mixins_scss:scss "tests/assets/mixin-module.scss"); + sassy!(mixins_inline_scss:scss {" + @mixin surface($color: black){ + @if $color == black{ + color: white; + background-color: green; + }@else if $color == white{ + color: red; + background-color: black; + }@else{ + color: #c6c6c6; + background-color: #00ffff; + } + &::after{ + content: 'Colored'; + color: $color; + background-color: blue; + &:hover{ + transform: scale(2); + } + } + &:hover{ + transform: translateX(10%); + } + } +"}); + sassy!(module_scss:scss "tests/assets/module-forward.scss"); + sassy!(module_inline_scss:scss {" +@forward 'mixins_a'; +@forward 'mixins_c'; +"}); + + pub(crate) use mixins_inline_scss as mixins_inline_c; + pub(crate) use mixins_scss as mixins_c; + pub(crate) use module_inline_scss as module_inline_c; + pub(crate) use module_scss as module_c; +} + +styly!(sole_code_sass:sass "tests/assets/sole-code.sass"); +styly!(sole_code_scss:scss "tests/assets/sole-code.scss"); +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"); + +#[test] +fn ensure_inline_matches_file() { + assert_eq!(sass::mixins_a!(), sass::mixins_inline_a!()); + assert_eq!(scss::mixins_c!(), scss::mixins_inline_c!()); + + assert_eq!(sass::module_a!(), sass::module_inline_a!()); + assert_eq!(scss::module_c!(), scss::module_inline_c!()); +} + +#[test] +fn syntax_contract() { + assert_eq!(scss::mixins_inline_c!(syntax), "scss"); + assert_eq!(scss::mixins_c!(syntax), "scss"); + assert_eq!(scss::module_inline_c!(syntax), "scss"); + assert_eq!(scss::module_c!(syntax), "scss"); + + assert_eq!(sass::mixins_a!(syntax), "sass"); + assert_eq!(sass::mixins_inline_a!(syntax), "sass"); + assert_eq!(sass::module_a!(syntax), "sass"); + assert_eq!(sass::module_inline_a!(syntax), "sass"); +} + +fn gen_config() -> SabryConfig { + let mut config = SabryConfig::require().unwrap(); + config.css.bundle = Some("tests/sabry_output/bundle.css".into()); + config.css.scopes = Some("tests/sabry_output/scopes".into()); + config.css.minify = true; + config.css.prelude = Some(vec!["tests/assets/prelude.css".into()]); + + config.sass.prelude = Some(vec![ + "tests/assets/prelude.sass".into(), + "tests/assets/prelude.scss".into(), + ]); + config.sass.intermediate_dir = "tests/sabry_intermediate".into(); + config.sass.scanroot = "tests".into(); + config.sass.module_name_collision = BehavSassModCollision::Merge; + + config.hash.collision = BehavHashCollision::Error; + config.hash.size = 16; + config.hash.use_code_size = true; + config.hash.use_code_text = true; + config.hash.use_item_names = true; + config.hash.use_scope_name = true; + + config.lightningcss.targets.android = Some("10".into()); + config.lightningcss.targets.chrome = Some("100".into()); + config.lightningcss.targets.edge = Some("80".into()); + config.lightningcss.targets.firefox = Some("100".into()); + config.lightningcss.targets.ie = Some("8".into()); + config.lightningcss.targets.ios_saf = Some("13.2".into()); + config.lightningcss.targets.opera = Some("80".into()); + config.lightningcss.targets.safari = Some("11".into()); + config.lightningcss.targets.samsung = Some("80".into()); + + config +} + +fn gen_builder() -> SabryBuilder { + let config = gen_config(); + let builder = SabryBuilder::new(config); + + builder +} + +#[test] +fn compilation_with_buildy() { + let mut builder = gen_builder(); + builder + .build(usey!( + sass::mixins_a!(), + sass::module_a!(), + scss::mixins_c!(), + scss::module_c!() + )) + .unwrap(); + + glob!("sabry_output/**/*.css", |path| { + let generated = fs::read_to_string(path).unwrap(); + + let mut settings = Settings::clone_current(); + settings.set_snapshot_path("sabry_output_snapshots"); + settings.set_prepend_module_to_snapshot(false); + settings.set_omit_expression(true); + settings.remove_info(); + settings.bind(|| { + insta::assert_snapshot!(generated); + }); + }); +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap new file mode 100644 index 0000000..e0d861c --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +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%)} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap new file mode 100644 index 0000000..e26b0f4 --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/module_usage_sass.css +snapshot_kind: text +--- +.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%)} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap new file mode 100644 index 0000000..c24335b --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/module_usage_scss.css +snapshot_kind: text +--- +.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%)} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap new file mode 100644 index 0000000..922db8e --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/sole_code_sass.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} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap new file mode 100644 index 0000000..a7760eb --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/sole_code_scss.css +snapshot_kind: text +--- +.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} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap new file mode 100644 index 0000000..3695b70 --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/use_forwarded_sass.css +snapshot_kind: text +--- +.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%)} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap new file mode 100644 index 0000000..b8adffa --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/use_forwarded_scss.css +snapshot_kind: text +--- +.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%)} From 4fa26061ee919602227c84730e082413fed1c7ea Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sun, 3 Nov 2024 18:08:39 +0500 Subject: [PATCH 046/184] fix(tests): proper flag handling --- tests/macros.rs | 131 ++++++++++++++++++++++++------------------------ 1 file changed, 66 insertions(+), 65 deletions(-) diff --git a/tests/macros.rs b/tests/macros.rs index e944f3d..eb583b4 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -1,12 +1,4 @@ -use std::fs; - -use insta::{glob, Settings}; - -use sabry::{ - buildmagic::SabryBuilder, - config::{BehavHashCollision, BehavSassModCollision, SabryConfig}, - sassy, styly, usey, -}; +use sabry::styly; pub mod sass { use sabry::sassy; @@ -113,70 +105,79 @@ fn syntax_contract() { assert_eq!(sass::module_inline_a!(syntax), "sass"); } -fn gen_config() -> SabryConfig { - let mut config = SabryConfig::require().unwrap(); - config.css.bundle = Some("tests/sabry_output/bundle.css".into()); - config.css.scopes = Some("tests/sabry_output/scopes".into()); - config.css.minify = true; - config.css.prelude = Some(vec!["tests/assets/prelude.css".into()]); +#[cfg(test)] +#[cfg(all(feature = "procmacro", feature = "build"))] +mod build_tests { + use std::fs; - config.sass.prelude = Some(vec![ - "tests/assets/prelude.sass".into(), - "tests/assets/prelude.scss".into(), - ]); - config.sass.intermediate_dir = "tests/sabry_intermediate".into(); - config.sass.scanroot = "tests".into(); - config.sass.module_name_collision = BehavSassModCollision::Merge; + use insta::{glob, Settings}; + use sabry::{usey, buildmagic::SabryBuilder, config::{BehavHashCollision, BehavSassModCollision, SabryConfig}}; - config.hash.collision = BehavHashCollision::Error; - config.hash.size = 16; - config.hash.use_code_size = true; - config.hash.use_code_text = true; - config.hash.use_item_names = true; - config.hash.use_scope_name = true; + fn gen_config() -> SabryConfig { + let mut config = SabryConfig::require().unwrap(); + config.css.bundle = Some("tests/sabry_output/bundle.css".into()); + config.css.scopes = Some("tests/sabry_output/scopes".into()); + config.css.minify = true; + config.css.prelude = Some(vec!["tests/assets/prelude.css".into()]); - config.lightningcss.targets.android = Some("10".into()); - config.lightningcss.targets.chrome = Some("100".into()); - config.lightningcss.targets.edge = Some("80".into()); - config.lightningcss.targets.firefox = Some("100".into()); - config.lightningcss.targets.ie = Some("8".into()); - config.lightningcss.targets.ios_saf = Some("13.2".into()); - config.lightningcss.targets.opera = Some("80".into()); - config.lightningcss.targets.safari = Some("11".into()); - config.lightningcss.targets.samsung = Some("80".into()); + config.sass.prelude = Some(vec![ + "tests/assets/prelude.sass".into(), + "tests/assets/prelude.scss".into(), + ]); + config.sass.intermediate_dir = "tests/sabry_intermediate".into(); + config.sass.scanroot = "tests".into(); + config.sass.module_name_collision = BehavSassModCollision::Merge; - config -} + config.hash.collision = BehavHashCollision::Error; + config.hash.size = 16; + config.hash.use_code_size = true; + config.hash.use_code_text = true; + config.hash.use_item_names = true; + config.hash.use_scope_name = true; -fn gen_builder() -> SabryBuilder { - let config = gen_config(); - let builder = SabryBuilder::new(config); + config.lightningcss.targets.android = Some("10".into()); + config.lightningcss.targets.chrome = Some("100".into()); + config.lightningcss.targets.edge = Some("80".into()); + config.lightningcss.targets.firefox = Some("100".into()); + config.lightningcss.targets.ie = Some("8".into()); + config.lightningcss.targets.ios_saf = Some("13.2".into()); + config.lightningcss.targets.opera = Some("80".into()); + config.lightningcss.targets.safari = Some("11".into()); + config.lightningcss.targets.samsung = Some("80".into()); - builder -} + config + } -#[test] -fn compilation_with_buildy() { - let mut builder = gen_builder(); - builder - .build(usey!( - sass::mixins_a!(), - sass::module_a!(), - scss::mixins_c!(), - scss::module_c!() - )) - .unwrap(); + fn gen_builder() -> SabryBuilder { + let config = gen_config(); + let builder = SabryBuilder::new(config); - glob!("sabry_output/**/*.css", |path| { - let generated = fs::read_to_string(path).unwrap(); + builder + } - let mut settings = Settings::clone_current(); - settings.set_snapshot_path("sabry_output_snapshots"); - settings.set_prepend_module_to_snapshot(false); - settings.set_omit_expression(true); - settings.remove_info(); - settings.bind(|| { - insta::assert_snapshot!(generated); + #[test] + fn compilation_with_buildy() { + let mut builder = gen_builder(); + builder + .build(usey!( + super::sass::mixins_a!(), + super::sass::module_a!(), + super::scss::mixins_c!(), + super::scss::module_c!() + )) + .unwrap(); + + glob!("sabry_output/**/*.css", |path| { + let generated = fs::read_to_string(path).unwrap(); + + let mut settings = Settings::clone_current(); + settings.set_snapshot_path("sabry_output_snapshots"); + settings.set_prepend_module_to_snapshot(false); + settings.set_omit_expression(true); + settings.remove_info(); + settings.bind(|| { + insta::assert_snapshot!(generated); + }); }); - }); + } } From fc432ddde0b966e08d80322453fc526f292c84a8 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Mon, 4 Nov 2024 22:06:29 +0500 Subject: [PATCH 047/184] fix: found that macro name was nasty. Also my team starts a production with sabry, so lets call it release --- README.md | 28 +++++++++---------- examples/define-styles/src/lib.rs | 10 +++---- examples/use-styles/build.rs | 4 +-- sabry_build/src/buildmagic.rs | 2 +- sabry_procmacro/src/lib.rs | 16 +++++------ sabry_procmacro/tests/macros.rs | 12 ++++---- sabry_procmacro_impl/src/impls/mod.rs | 2 +- .../src/impls/{sassy.rs => scssy.rs} | 4 +-- sabry_procmacro_impl/src/impls/usey.rs | 2 +- tests/macros.rs | 20 ++++++------- 10 files changed, 50 insertions(+), 50 deletions(-) rename sabry_procmacro_impl/src/impls/{sassy.rs => scssy.rs} (92%) diff --git a/README.md b/README.md index 0a4e396..ae87410 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ At first, I'll show how this crate "tastes". With SABRY, its in your power to: Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with modules, with feature flags, etc. Say "bye" to manual copying, cli-tools and consts. ```rust -sabry::sassy!(tokens {"@mixin colored{color: red;}"}); +sabry::scssy!(tokens {"@mixin colored{color: red;}"}); ``` </td> @@ -146,10 +146,10 @@ sabry = {version = "0.0.1"} And a proc-macro ```rust // lib.rs -use sabry::sassy; +use sabry::scssy; -sassy!(mixins "tests/assets/mixin-module.scss"); -sassy!(styles {" +scssy!(mixins "tests/assets/mixin-module.scss"); +scssy!(styles {" $primary-color: black; @mixin colored($col: primary) { @if $col == primary { @@ -290,7 +290,7 @@ use leptos::prelude::*; use sabry::styly; styly!(scope {" - // assuming we have tokens!() macro generated by `sassy!`, which is handled by `buildy` + // assuming we have tokens!() macro generated by `scssy!`, which is handled by `buildy` @use 'tokens'; h1 { @include tokens.sectionhead(); @@ -427,9 +427,9 @@ For example `{ie = "9", saf_ios = "13.2"}` will try to generate CSS supported on ## Detailed guide -### Style definition with `sassy!` +### Style definition with `scssy!` -The `sassy!` macro is available with *procmacro* feature which is enabled by default. +The `scssy!` macro is available with *procmacro* feature which is enabled by default. It does accept the following syntax: `$name(:$syntax)? ({ $code })|($filename)`, where @@ -440,13 +440,13 @@ It does accept the following syntax: `$name(:$syntax)? ({ $code })|($filename)`, Examples: ```rust -use sabry::sassy; +use sabry::scssy; -sassy!(module1 {"$primary-color: red;"}); -sassy!(module2 "tests/assets/mixin-module.scss"); -sassy!(module3:sass "tests/assets/mixin-module.sass"); +scssy!(module1 {"$primary-color: red;"}); +scssy!(module2 "tests/assets/mixin-module.scss"); +scssy!(module3:sass "tests/assets/mixin-module.sass"); // works, but there are catches. -sassy!(module4:sass {" +scssy!(module4:sass {" @mixin colored($col: primary) @if $col == primary color: white @@ -457,7 +457,7 @@ sassy!(module4:sass {" You may omit the syntax specifier - sabry uses SCSS as the default one. -The given code to `sassy!` is not checked to be valid code in given syntax (wip). +The given code to `scssy!` is not checked to be valid code in given syntax (wip). > SASS support inside of rust files is experimental. If you do want to use SASS tabbed syntax - consider to use files path instead of sass-in-rust option. @@ -590,7 +590,7 @@ sabry::buildy( )?; ``` -Exactly this kind of macros is produced by [`sassy!`](#style-definition-with-sassy). +Exactly this kind of macros is produced by [`scssy!`](#style-definition-with-scssy). ### Scoping diff --git a/examples/define-styles/src/lib.rs b/examples/define-styles/src/lib.rs index 9850a64..0640d6e 100644 --- a/examples/define-styles/src/lib.rs +++ b/examples/define-styles/src/lib.rs @@ -1,8 +1,8 @@ -use sabry::sassy; +use sabry::scssy; -sassy!(style "src/style.scss"); +scssy!(style "src/style.scss"); -sassy!(utils {" +scssy!(utils {" @mixin flex($direction, $align, $justify, $gap: .5rem) { display: flex; list-style: none; @@ -31,7 +31,7 @@ sassy!(utils {" } "}); -sassy!(theme {" +scssy!(theme {" $thm-surface-primary: #2b2a29; $thm-surface-secondary: #6C6C6C; $thm-surface-tertiary: #4C4C4C; @@ -77,7 +77,7 @@ sassy!(theme {" } "}); -sassy!(tokens {" +scssy!(tokens {" @use 'theme'; @mixin clickable($style: accent, $scale: 1.2, $clickscale: 0.9){ diff --git a/examples/use-styles/build.rs b/examples/use-styles/build.rs index d8b254f..ec066dc 100644 --- a/examples/use-styles/build.rs +++ b/examples/use-styles/build.rs @@ -1,9 +1,9 @@ use define_styles::{theme, tokens, utils as utils_dup}; -use sabry::{sassy, usey}; +use sabry::{scssy, usey}; // This module will have the same name as define_styles_example::utils // and sabry is configured to merge them -sassy!(utils {" +scssy!(utils {" @mixin nonclickable(){ display: none; } diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index 7ea2af9..bd476a7 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -34,7 +34,7 @@ type BuilderResult = Result<(), SabryBuildError>; /// ).expect("Sabry failed to build CSS"); /// ``` /// -/// Also you could use style-macros defined anywhere with `sabry::sassy!` procmacro: +/// Also you could use style-macros defined anywhere with `sabry::scssy!` procmacro: /// ```ignore /// buildy( /// sabry::usey!( diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index 6500413..aed8a2c 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -2,7 +2,7 @@ use proc_macro::TokenStream; use sabry_procmacro_impl::impls::{ - sassy::sassy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, + scssy::scssy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, }; /// Macro that makes sass code rusty. @@ -13,28 +13,28 @@ use sabry_procmacro_impl::impls::{ /// ## Usage /// /// ```ignore -/// sassy!(scssmodule { +/// scssy!(scssmodule { /// /* SCSS */ /// }); -/// sassy!(sassmodule:sass { +/// scssy!(sassmodule:sass { /// /* SASS (WIP) */ /// }); -/// sassy!(scssmod2:scss { +/// scssy!(scssmod2:scss { /// /* SCSS */ /// }); /// ``` /// Or read code from file /// ```ignore -/// sassy!(filemodule "src/styles/a.scss"); -/// sassy!(filemodule:sass "src/styles/b.sass"); +/// scssy!(filemodule "src/styles/a.scss"); +/// scssy!(filemodule:sass "src/styles/b.sass"); /// ``` /// /// \[SCSS syntax requires 'scss' feature\] /// \[SASS syntax requires 'sass' feature (WIP)\] /// #[proc_macro] -pub fn sassy(input: TokenStream) -> TokenStream { - sassy_macro_impl(input.into()).into() +pub fn scssy(input: TokenStream) -> TokenStream { + scssy_macro_impl(input.into()).into() } /// Macro that brings sass code into app diff --git a/sabry_procmacro/tests/macros.rs b/sabry_procmacro/tests/macros.rs index 22bd4a3..84376af 100644 --- a/sabry_procmacro/tests/macros.rs +++ b/sabry_procmacro/tests/macros.rs @@ -1,8 +1,8 @@ use std::{collections::HashSet, fs}; -use sabry_procmacro::{sassy, usey}; +use sabry_procmacro::{scssy, usey}; -sassy!(scmod:scss {" +scssy!(scmod:scss {" @mixin abc(){ color: red; } @@ -10,18 +10,18 @@ sassy!(scmod:scss {" @include abc; } "}); -sassy!(samod:sass {" +scssy!(samod:sass {" @mixin abc() color: green .sel1 @include abc "}); -sassy!(scmicromod:scss "sabry_procmacro/tests/scmicro.scss"); -sassy!(samicromod:sass "sabry_procmacro/tests/samicro.sass"); +scssy!(scmicromod:scss "sabry_procmacro/tests/scmicro.scss"); +scssy!(samicromod:sass "sabry_procmacro/tests/samicro.sass"); #[test] -fn sassy_contract() { +fn scssy_contract() { assert_eq!(scmod!(syntax), "scss"); assert_eq!( scmod!(), diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index 009df1f..47a6939 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -6,7 +6,7 @@ use regex::Regex; use sabry_intrnl::syntax::ostrta::OneSyntaxToRuleThemAll; use syn::{braced, parse::Parse, Ident, LitStr, Token}; -pub mod sassy; +pub mod scssy; pub mod styly; pub mod usey; diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/scssy.rs similarity index 92% rename from sabry_procmacro_impl/src/impls/sassy.rs rename to sabry_procmacro_impl/src/impls/scssy.rs index ef5d401..b82718d 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/scssy.rs @@ -11,7 +11,7 @@ use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; /// `$syntax`: sass/scss /// /// `$code`: intended to be valid based on $syntax -pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { +pub fn scssy_macro_impl(input: TokenStream) -> TokenStream { let MacroSyntax { ident, syntax: mode, @@ -28,7 +28,7 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { } let sourcesass = code.to_string(); - let macro_doc = format!("Arbitrary {:?} code declared with `sassy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); + let macro_doc = format!("Arbitrary {:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); quote! { #[doc = #macro_doc] diff --git a/sabry_procmacro_impl/src/impls/usey.rs b/sabry_procmacro_impl/src/impls/usey.rs index 56b2ba5..95d2dc8 100644 --- a/sabry_procmacro_impl/src/impls/usey.rs +++ b/sabry_procmacro_impl/src/impls/usey.rs @@ -32,7 +32,7 @@ impl StyleCall { let call_code = &self.call; let call_path = &self.call.path; let call_bang = &self.call.bang_token; - // the following calls are expected by macro genereted by `sassy!` + // the following calls are expected by macro genereted by `scssy!` let call_syntax = quote! {#call_path #call_bang (syntax)}; let module_name = call_path diff --git a/tests/macros.rs b/tests/macros.rs index eb583b4..f8f2ea0 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -1,10 +1,10 @@ use sabry::styly; pub mod sass { - use sabry::sassy; + use sabry::scssy; - sassy!(mixins_sass:sass "tests/assets/mixin-module.sass"); - sassy!(mixins_inline_sass:sass {" + scssy!(mixins_sass:sass "tests/assets/mixin-module.sass"); + scssy!(mixins_inline_sass:sass {" @mixin color($color: black) @if $color == black color: white @@ -24,8 +24,8 @@ pub mod sass { &:hover transform: translateX(10%) "}); - sassy!(module_sass:sass "tests/assets/module-forward.sass"); - sassy!(module_inline_sass:sass {" + scssy!(module_sass:sass "tests/assets/module-forward.sass"); + scssy!(module_inline_sass:sass {" @forward 'mixins_a' @forward 'mixins_c' "}); @@ -36,10 +36,10 @@ pub mod sass { } pub mod scss { - use sabry::sassy; + use sabry::scssy; - sassy!(mixins_scss:scss "tests/assets/mixin-module.scss"); - sassy!(mixins_inline_scss:scss {" + scssy!(mixins_scss:scss "tests/assets/mixin-module.scss"); + scssy!(mixins_inline_scss:scss {" @mixin surface($color: black){ @if $color == black{ color: white; @@ -64,8 +64,8 @@ pub mod scss { } } "}); - sassy!(module_scss:scss "tests/assets/module-forward.scss"); - sassy!(module_inline_scss:scss {" + scssy!(module_scss:scss "tests/assets/module-forward.scss"); + scssy!(module_inline_scss:scss {" @forward 'mixins_a'; @forward 'mixins_c'; "}); From c92b19a3d8b03d0a9d7b90113d224b126a337bef Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Mon, 4 Nov 2024 22:15:20 +0500 Subject: [PATCH 048/184] fix(cfg): replacement --- release.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.toml b/release.toml index ac70f3c..7667a01 100644 --- a/release.toml +++ b/release.toml @@ -4,5 +4,5 @@ sign-tag = true target = "x86_64-unknown-linux-gnu" pre-release-replacements = [ - {file="README.md", search='sabry = {\s?version = "[0-9a-z\-\.]*"', replace='sabry = { version = "{{version}}"'}, + {file="README.md", search='sabry = \{\s?version = "[0-9a-z\-\.]*"', replace='sabry = {version = "{{version}}"'}, ] From 86ce86809a8d5a29e84e8e215b3856420769b1d7 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Mon, 4 Nov 2024 22:16:02 +0500 Subject: [PATCH 049/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ed2ec1b..5c90aae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.4" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.4" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.4" } -sabry_build = {path = "sabry_build", version = "0.0.1-beta.4" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1" } +sabry_build = {path = "sabry_build", version = "0.0.1" } [workspace.package] -version = "0.0.1-beta.4" +version = "0.0.1" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 28b7c4687d77470ac882afb0c7500d22813f626a Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 16 Nov 2024 19:55:27 +0500 Subject: [PATCH 050/184] fix: use hashed style code for const styly! macro --- examples/use-styles/Cargo.lock | 37 ++++--------------------- examples/use-styles/src/main.rs | 8 ++++-- sabry_procmacro_impl/src/impls/styly.rs | 2 +- 3 files changed, 12 insertions(+), 35 deletions(-) diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index a75ee98..0807c2c 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -268,26 +268,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "const_format" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - [[package]] name = "constant_time_eq" version = "0.3.1" @@ -994,7 +974,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "sabry_build", "sabry_intrnl", @@ -1003,7 +983,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,12 +995,11 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "base64", "blake3", "cfg-if", - "const_format", "grass", "lightningcss", "proc-macro2", @@ -1035,14 +1014,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "proc-macro2", "quote", @@ -1262,12 +1241,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "use-styles" version = "0.0.0" diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index a029637..269cd12 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -19,10 +19,14 @@ styly!(pub const bundlemod {" styly!(pub filemod:sass "src/main.sass"); -fn main(){ +fn main() { println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); - println!("someth-dark selector will be: {}", bundlemod::___dark(bundlemod::someth)); + println!( + "someth-dark selector will be: {}", + bundlemod::___dark(bundlemod::someth) + ); println!("#fox id will be: {}", bundlemod::thefox); + println!("Bundles const CSS will be: {}", BUNDLEMOD_CSS); println!("Thats how we used the styles! Good luck!!"); } diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 82801ea..8d6ae1d 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -133,7 +133,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { if constant { let compiler = CompilerAdapter::new(config.clone()); - let css = match compiler.compile_module(ms.syntax.0, &ms.code.code) { + let css = match compiler.compile_module(ms.syntax.0, &scope.hashed_code) { Ok(c) => c, Err(e) => { return syn::Error::new( From 17fa4ab197f59088e2241439dafc0985db5dfec3 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 16 Nov 2024 22:32:38 +0500 Subject: [PATCH 051/184] feat: relative style paths & component crate example --- .github/workflows/cbt.yml | 53 ++++++++++++++++--------- Cargo.toml | 3 ++ README.md | 29 +++++++++++++- examples/define-styles/Cargo.lock | 9 +++-- examples/define-styles/Cargo.toml | 2 +- examples/define-styles/src/lib.rs | 4 +- examples/leptos-axum/Cargo.toml | 13 +++--- examples/leptos-axum/src/main.rs | 1 + examples/leptos-axum/src/routes/home.rs | 1 + examples/leptos-axum/src/shell.rs | 11 ++++- examples/leptos-components/.gitignore | 14 +++++++ examples/leptos-components/Cargo.toml | 33 +++++++++++++++ examples/leptos-components/LICENSE | 24 +++++++++++ examples/leptos-components/README.md | 6 +++ examples/leptos-components/build.rs | 11 +++++ examples/leptos-components/src/lib.rs | 52 ++++++++++++++++++++++++ examples/use-styles/Cargo.lock | 1 + examples/use-styles/Cargo.toml | 4 +- examples/use-styles/build.rs | 12 ++---- examples/use-styles/src/main.rs | 5 ++- sabry_build/src/filevisit.rs | 27 +++++++++---- sabry_procmacro/Cargo.toml | 2 + sabry_procmacro/src/lib.rs | 23 +++++++++-- sabry_procmacro_impl/Cargo.toml | 1 + sabry_procmacro_impl/src/impls/mod.rs | 33 +++++++++------ sabry_procmacro_impl/src/impls/scssy.rs | 45 +++++++++++++++------ sabry_procmacro_impl/src/impls/styly.rs | 40 +++++++++++++++---- tests/macros.rs | 6 ++- 28 files changed, 376 insertions(+), 89 deletions(-) create mode 100644 examples/leptos-components/.gitignore create mode 100644 examples/leptos-components/Cargo.toml create mode 100644 examples/leptos-components/LICENSE create mode 100644 examples/leptos-components/README.md create mode 100644 examples/leptos-components/build.rs create mode 100644 examples/leptos-components/src/lib.rs diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index b8773f0..23416dd 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -1,26 +1,41 @@ name: cargo basic build-test on: - push: - branches: ["window", "master"] - pull_request: - branches: ["window"] + push: + branches: ["window", "master"] + pull_request: + branches: ["window"] env: - CARGO_TERM_COLOR: always + CARGO_TERM_COLOR: always jobs: - build_and_test: - name: Sabry - latest - runs-on: ubuntu-latest - strategy: - matrix: - toolchain: - - stable - - nightly - steps: - - uses: actions/checkout@v4 - - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - - run: cargo build --verbose - - run: cargo test --verbose --all - - run: cargo test --verbose --all --all-features + build_and_test: + name: Sabry - latest + runs-on: ubuntu-latest + strategy: + matrix: + toolchain: + - stable + - nightly + steps: + - uses: actions/checkout@v4 + - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} + - run: cargo build --verbose + - run: cargo test --verbose --all + - run: cargo test --verbose --all --all-features + + build_examples: + name: Sabry - latset - examples + runs-on: ubuntu-latest + strategy: + matrix: + example: + - define-styles + - use-styles + - leptos-axum + steps: + - uses: actions/checkout@v4 + - run: rustup update nightly && rustup default nightly + - run: cd examples/${{ matrix.example }} + - run: cargo build --verbose diff --git a/Cargo.toml b/Cargo.toml index 5c90aae..38499c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,6 +59,9 @@ build = [ net-files = [ "sabry_build/net-files" ] +nightly = [ + "sabry_procmacro?/nightly" +] internals = [] [package.metadata.docs.rs] diff --git a/README.md b/README.md index ae87410..afb8f1d 100644 --- a/README.md +++ b/README.md @@ -130,8 +130,8 @@ Also, just about everything is pub-available in this crate (with *internals* fea Feel free to check out examples: -|[crate of styles](https://github.com/yiffyrusdev/sabry/tree/master/examples/define-styles)|[style usage](https://github.com/yiffyrusdev/sabry/tree/master/examples/use-styles)|[leptos-axum with sabry](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum)| -|-|-|-| +|[crate of styles](https://github.com/yiffyrusdev/sabry/tree/master/examples/define-styles)|[style usage](https://github.com/yiffyrusdev/sabry/tree/master/examples/use-styles)|[leptos-axum with sabry](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum)|[leptos components](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-components)| +|-|-|-|-| ### Create a crate full of arbitrary SASS @@ -256,6 +256,23 @@ styly!(styles {" ``` So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` function call is now accessible with simple and natural `@use "mixins"` SASS rule! +### Create crate of styled components + +This is currently an alpha-testing-early-concept feature which comes +with some things to avoid. + +While the process depends much on the framework you prefer, there are +some limitations and essential recommendations: + +- Sabry will scope (hash) your styles at build time, which means +higher collision probability between the component crate and the main application, which *can not* be currently +detected by sabry. +- You have to write style scopes for components with `const` styly macro flavour: `styly!(const whatever {""})` + - And then you have to solve the task of injecting those generated CSS for your component manually. +- If you want to write styles in separate SASS/SCSS files, you need the nightly rust and the 'nightly' feature flag set +for sabry, so you can use styles from relative paths `styly!(const comp "./style.scss")` + - Which will give you an error from rust-analyzer wether file exists or not. However, if the path is correct, it will build fine. + ### Leptos specials With [leptos](https://github.com/leptos-rs/leptos) framework you can do the trick to apply some class to most of HtmlElements for the entire component/island: @@ -461,6 +478,8 @@ The given code to `scssy!` is not checked to be valid code in given syntax (wip) > SASS support inside of rust files is experimental. If you do want to use SASS tabbed syntax - consider to use files path instead of sass-in-rust option. +> With *nightly* feature flag if using the relative path like `scssy!(module "./module.scss")` you'll get false-positive error even if file exists. Also you won't get autocompletion and rust-analyzer will complain on `module!` macro. WIP. + ### Scoping with `styly!` The `styly!` macro is available with *procmacro* feature flag which is enabled by default. @@ -541,6 +560,8 @@ mod scope {/* selector collection */} > > Worth of notice: sabry will still include const-flavored styles into the CSS bundle during build time. +> With *nightly* feature flag if using the relative path like `styly!(const scope "./sctyle.scss")` you'll get false-positive error even if file exists. Also you won't get autocompletion and rust-analyzer will complain on `SCOPE_CSS`, `scope::whatever` etc. WIP. + ### Building with `buildy` and `usey!` The `buildy` function is available with *build* feature which needs to be enabled explicitly. @@ -658,6 +679,8 @@ Not any valid CSS selector is a valid rust identifier. In general this section s **lepty-scoping** - overhauls the scope generation logic, best suitable for the leptos. Check out the [section](#leptos-specials) and an [example](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum) +**nightly** - allows relative path selection with `scssy!` and `styly!` macros. However rust-analyzer will raise false-positives for reachable files as well. + ## WIP *(sorted by my own priority)*, "dones" are excluded @@ -666,6 +689,8 @@ Not any valid CSS selector is a valid rust identifier. In general this section s - [ ] some weird unrelated stuff I can see in autocompletion - [ ] Crates of styled components - currently the only way to create them seems to be const styly. - [ ] CSS support + - [x] Allow relative path selection (with 'nightly' feature on nightly rust) + - [ ] Somehow get rid of false-positives AND retain proper autocompletion - [ ] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance - [ ] Use sass-in-rust without quoted styles for variable injection: ```rust, ignore diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index 73cad63..87b2f50 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -974,7 +974,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "sabry_intrnl", "sabry_procmacro", @@ -982,7 +982,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "base64", "blake3", @@ -1001,14 +1001,15 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ + "cfg-if", "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "proc-macro2", "quote", diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml index 4e80fbe..4288abb 100644 --- a/examples/define-styles/Cargo.toml +++ b/examples/define-styles/Cargo.toml @@ -6,4 +6,4 @@ rust-version = "1.82" publish = false [dependencies] -sabry = {path = "../../"} +sabry = {path = "../../", features = ["nightly"]} diff --git a/examples/define-styles/src/lib.rs b/examples/define-styles/src/lib.rs index 0640d6e..7b1b5ee 100644 --- a/examples/define-styles/src/lib.rs +++ b/examples/define-styles/src/lib.rs @@ -1,6 +1,8 @@ use sabry::scssy; -scssy!(style "src/style.scss"); +// relative path is available because 'nightly' feature flag is set. +// If you don't - this will be "src/style.scss" +scssy!(style "./style.scss"); scssy!(utils {" @mixin flex($direction, $align, $justify, $gap: .5rem) { diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 848c699..6fe0d77 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -9,16 +9,16 @@ publish = false crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "0.7.0-gamma3" } -leptos_axum = { version = "0.7.0-gamma3", optional = true } -leptos_meta = { version = "0.7.0-gamma3" } -leptos_router = { version = "0.7.0-gamma3" } +leptos = { version = "0.7.0-rc1" } +leptos_axum = { version = "0.7.0-rc1", optional = true } +leptos_meta = { version = "0.7.0-rc1" } +leptos_router = { version = "0.7.0-rc1" } axum = { version = "0.7", optional = true } console_error_panic_hook = "0.1" tokio = { version = "1", features = ["rt-multi-thread"], optional = true } tower = { version = "0.4", optional = true } tower-http = { version = "0.5", features = ["fs"], optional = true } -wasm-bindgen = "=0.2.93" +wasm-bindgen = "=0.2.95" thiserror = "1" tracing = { version = "0.1", optional = true } http = "1" @@ -26,6 +26,9 @@ http = "1" # sabry with sass sabry = {path = "../../", features = ["lepty-scoping"]} +# our component library +leptos-components = {path = "../leptos-components"} + [build-dependencies] # sabry for build with sass sabry = {path = "../../", features = ["build", "lepty-scoping"]} diff --git a/examples/leptos-axum/src/main.rs b/examples/leptos-axum/src/main.rs index 355d992..d4b5b24 100644 --- a/examples/leptos-axum/src/main.rs +++ b/examples/leptos-axum/src/main.rs @@ -4,6 +4,7 @@ async fn main() { use axum::Router; use leptos::prelude::*; + use leptos::logging::*; use leptos_axum::{generate_route_list, LeptosRoutes}; use leptos_axum_sabry::shell::*; diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index c8b8d4b..6d5e942 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -45,6 +45,7 @@ pub fn Route() -> impl IntoView { let on_click = move |_| *count.write() += 1; view! {class = STYLE, + <leptos_components::Aside/> // lets use our component <section class=style::table> <h2>"Welcome to Leptos"</h2> <h2 class=""> diff --git a/examples/leptos-axum/src/shell.rs b/examples/leptos-axum/src/shell.rs index 125c90d..d1d757e 100644 --- a/examples/leptos-axum/src/shell.rs +++ b/examples/leptos-axum/src/shell.rs @@ -4,6 +4,7 @@ use leptos_router::{ components::{Route, Router, Routes}, StaticSegment, }; +use sabry::styly; use crate::routes; @@ -29,7 +30,7 @@ pub fn shell(options: LeptosOptions) -> impl IntoView { pub fn App() -> impl IntoView { provide_meta_context(); - view! { + view! {class=APP, <Stylesheet id="leptos" href="/pkg/leptos-axum.css"/> <Title text="Welcome to Leptos"/> <Router> @@ -41,3 +42,11 @@ pub fn App() -> impl IntoView { </Router> } } + +styly!(app:scss {" + @use 'theme'; + + main { + @include theme.surface(primary); + } +"}); diff --git a/examples/leptos-components/.gitignore b/examples/leptos-components/.gitignore new file mode 100644 index 0000000..6985cf1 --- /dev/null +++ b/examples/leptos-components/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml new file mode 100644 index 0000000..2359885 --- /dev/null +++ b/examples/leptos-components/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "leptos-components" +version = "0.1.0" +rust-version = "1.82" +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +leptos = { version = "0.7.0-rc1" } +leptos_meta = { version = "0.7.0-rc1" } +leptos_router = { version = "0.7.0-rc1" } + +sabry = {path = "../../", features = ["lepty-scoping"]} + +[build-dependencies] +sabry = {path = "../../", features = ["build", "lepty-scoping"]} +define-styles = {path = "../define-styles"} + +[features] +hydrate = ["leptos/hydrate"] +ssr = [ + "leptos/ssr", + "leptos_meta/ssr", + "leptos_router/ssr", +] + +[package.metadata.sabry] +css.minify = true +# No need for bundle +# css.bundle = "target/.sabry/target/bundle.css" diff --git a/examples/leptos-components/LICENSE b/examples/leptos-components/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/examples/leptos-components/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to <https://unlicense.org> diff --git a/examples/leptos-components/README.md b/examples/leptos-components/README.md new file mode 100644 index 0000000..bbfcf13 --- /dev/null +++ b/examples/leptos-components/README.md @@ -0,0 +1,6 @@ +<picture> + <source srcset="https://raw.githubusercontent.com/leptos-rs/leptos/main/docs/logos/Leptos_logo_Solid_White.svg" media="(prefers-color-scheme: dark)"> + <img src="https://raw.githubusercontent.com/leptos-rs/leptos/main/docs/logos/Leptos_logo_RGB.svg" alt="Leptos Logo"> +</picture> + +This is an example of sabry with leptos-axum, made with [leptos-axum sterter template](https://github.com/leptos-rs/start-axum) diff --git a/examples/leptos-components/build.rs b/examples/leptos-components/build.rs new file mode 100644 index 0000000..be74188 --- /dev/null +++ b/examples/leptos-components/build.rs @@ -0,0 +1,11 @@ +use define_styles::{theme, utils, tokens}; + +fn main(){ + sabry::buildy( + sabry::usey!( + utils!(), + theme!(), + tokens!() + ) + ).expect("Failed to build with sabry"); +} diff --git a/examples/leptos-components/src/lib.rs b/examples/leptos-components/src/lib.rs new file mode 100644 index 0000000..33a2aaf --- /dev/null +++ b/examples/leptos-components/src/lib.rs @@ -0,0 +1,52 @@ +use leptos::prelude::*; +use leptos_meta::Style; +use sabry::styly; + +#[component] +pub fn Aside() -> impl IntoView { + let showme = RwSignal::new(true); + + view!{class=SCOPE, + <Style>{SCOPE_CSS}</Style> + <Show when=move|| *showme.read()> + <aside> + <h1>"Welcome to 'sabried' leptos!"</h1> + <p>"This is the 'Aside' component"</p> + <p>"which we declared in another crate"</p> + <p>"styled with sabry too!"</p> + <br/> + <button class="btn" on:click=move|_| *showme.write() = false> + "Click me to hide aside!" + </button> + </aside> + </Show> + } +} + +styly!(const scope:scss {" + @use 'theme'; + @use 'utils'; + @use 'tokens'; + + aside { + @include theme.surface(secondary); + @include utils.flex(column, center, center); + + position: fixed; + top: 0; + left: 0; + bottom: 0; + width: max-content; + z-index: 1000; + } + + p { + @include theme.txt(primary); + font-size: 1rem; + } + + .btn { + @include theme.surface(accent); + @include tokens.clickable(); + } +"}); diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 0807c2c..2ab59b6 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -1016,6 +1016,7 @@ dependencies = [ name = "sabry_procmacro" version = "0.0.1" dependencies = [ + "cfg-if", "sabry_procmacro_impl", ] diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml index 29e0a32..c6241e0 100644 --- a/examples/use-styles/Cargo.toml +++ b/examples/use-styles/Cargo.toml @@ -6,10 +6,10 @@ rust-version = "1.82" publish = false [dependencies] -sabry = {path = "../../"} +sabry = {path = "../../", features = ["nightly"]} [build-dependencies] -sabry = {path = "../../", features = ["build"]} +sabry = {path = "../../", features = ["build", "nightly"]} define-styles = {path = "../define-styles"} [package.metadata.sabry] diff --git a/examples/use-styles/build.rs b/examples/use-styles/build.rs index ec066dc..904431c 100644 --- a/examples/use-styles/build.rs +++ b/examples/use-styles/build.rs @@ -9,14 +9,8 @@ scssy!(utils {" } "}); -fn main(){ +fn main() { /* Declare modules to use with sabry */ - sabry::buildy( - usey!( - theme!(), - tokens!(), - utils_dup!(), - utils!() - ) - ).expect("Failed to build sabry styles"); + sabry::buildy(usey!(theme!(), tokens!(), utils_dup!(), utils!())) + .expect("Failed to build sabry styles"); } diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 269cd12..f9cf8ac 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -17,7 +17,9 @@ styly!(pub const bundlemod {" } "}); -styly!(pub filemod:sass "src/main.sass"); +// relative path is available because 'nightly' feature flag is set. +// If you don't - this will be "src/main.sass" +styly!(pub const filemod:sass "./main.sass"); fn main() { println!("someth class codemod styles: {}", bundlemod::someth); @@ -28,5 +30,6 @@ fn main() { ); println!("#fox id will be: {}", bundlemod::thefox); println!("Bundles const CSS will be: {}", BUNDLEMOD_CSS); + println!("Bundles const CSS from file will be: {}", FILEMOD_CSS); // false-positive from relative file. println!("Thats how we used the styles! Good luck!!"); } diff --git a/sabry_build/src/filevisit.rs b/sabry_build/src/filevisit.rs index 2844469..8574a4b 100644 --- a/sabry_build/src/filevisit.rs +++ b/sabry_build/src/filevisit.rs @@ -1,4 +1,7 @@ -use std::{fs, io, path::Path}; +use std::{ + fs, io, + path::{Path, PathBuf}, +}; use proc_macro2::TokenStream; use sabry_procmacro_impl::impls::styly; @@ -6,7 +9,7 @@ use syn::{spanned::Spanned, visit::Visit}; #[derive(Debug, thiserror::Error)] pub enum FileVisitError { - #[error("Could not read file")] + #[error("tt read file")] Read(#[from] io::Error), #[error("styly! macro found, yet invalid")] Styly(#[from] syn::Error), @@ -19,6 +22,7 @@ pub fn visit_file(path: &Path) -> Result<StylyVisitor, FileVisitError> { let mut styly_visitor = StylyVisitor { found_stylys: vec![], + path: path.to_owned(), }; styly_visitor.visit_file(&code_file); @@ -34,17 +38,26 @@ pub fn visit_file(path: &Path) -> Result<StylyVisitor, FileVisitError> { #[derive(Debug)] pub struct StylyVisitor { pub found_stylys: Vec<styly::MacroSyntax>, + pub path: PathBuf, } impl<'ast> Visit<'ast> for StylyVisitor { fn visit_item_macro(&mut self, node: &'ast syn::ItemMacro) { if node.mac.path.get_ident().is_some_and(|i| i == "styly") { - let body = node.mac.parse_body::<TokenStream>().unwrap_or_else(|_| { - panic!("could not parse `styly!` macro at {:?}", node.mac.span()) - }); - let macro_data = styly::parse_macro_syntax(body).unwrap_or_else(|_| { - panic!("could not parse `styly!` macro at {:?}", node.mac.span()) + let body = node.mac.parse_body::<TokenStream>().unwrap_or_else(|e| { + panic!( + "could not parse `styly!` macro at {:?}: {e:?}", + node.mac.span() + ) }); + let macro_data = + styly::parse_macro_syntax(body, self.path.parent().map(|p| p.to_owned())) + .unwrap_or_else(|e| { + panic!( + "could not parse `styly!` macro at {:?}: {e:?}", + node.mac.span() + ) + }); self.found_stylys.push(macro_data); } } diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 570fccf..cb2c1bd 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -13,8 +13,10 @@ proc-macro = true [dependencies] sabry_procmacro_impl = {workspace = true} +cfg-if = {version = "^1.0"} [features] +nightly = [] [package.metadata.docs.rs] all-features = true diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index aed8a2c..5c9ffba 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -1,6 +1,8 @@ #![doc = include_str!("../README.md")] +#![cfg_attr(feature = "nightly", feature(proc_macro_span))] -use proc_macro::TokenStream; +use cfg_if::cfg_if; +use proc_macro::{Span, TokenStream}; use sabry_procmacro_impl::impls::{ scssy::scssy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, }; @@ -34,7 +36,14 @@ use sabry_procmacro_impl::impls::{ /// #[proc_macro] pub fn scssy(input: TokenStream) -> TokenStream { - scssy_macro_impl(input.into()).into() + cfg_if! { + if #[cfg(feature = "nightly")] { + let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); + } else { + let source_path = None; + } + } + scssy_macro_impl(input.into(), source_path).into() } /// Macro that brings sass code into app @@ -96,7 +105,15 @@ pub fn scssy(input: TokenStream) -> TokenStream { /// ``` #[proc_macro] pub fn styly(input: TokenStream) -> TokenStream { - styly_macro_impl(input.into()).into() + cfg_if! { + if #[cfg(feature = "nightly")] { + let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); + } else { + let source_path = None; + } + } + + styly_macro_impl(input.into(), source_path).into() } /// Macro that brings external sass code into app diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index a7a1927..522fa2f 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -18,6 +18,7 @@ raffia = {version = "^0.9"} regex = {version = "^1.11"} [features] +nightly = [] [package.metadata.docs.rs] all-features = true diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index 47a6939..c82f67f 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -30,28 +30,29 @@ impl ArbitraryStyleBlock { pub fn code(&self) -> &str { &self.code } -} -impl Parse for ArbitraryStyleBlock { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + pub fn parse_syn( + input: syn::parse::ParseStream, + use_code_path_prefix: Option<PathBuf>, + ) -> syn::Result<Self> { let (code, span) = if let Ok(path_tok) = input.parse::<LitStr>() { - let path = path_tok.value(); - - let path = match PathBuf::from_str(&path) { - Ok(p) => p, - Err(_) => { - return Err(syn::Error::new( - path_tok.span(), - format!("Could not read {} as a path: Infallible", path), - )) + let path = if let Some(prefix) = use_code_path_prefix { + let p = path_tok.value(); + if let Some(pp) = p.strip_prefix("./") { + prefix.join(pp) + } else { + PathBuf::from_str(&p).expect("Unable to convert path into PathBuf") } + } else { + PathBuf::from_str(&path_tok.value()).expect("Unable to convert path into PathBuf") }; + let fullpath = match path.canonicalize() { Ok(cp) => cp, Err(e) => { return Err(syn::Error::new( path_tok.span(), - format!("Could not use path {path:?}: {:?}", e.kind()), + format!("Could not use path {path:?}: {:?}. If the path is relative and 'nightly' feature flag is set - this is likely false-positive", e.kind()), )) } }; @@ -86,6 +87,12 @@ impl Parse for ArbitraryStyleBlock { } } +impl Parse for ArbitraryStyleBlock { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + Self::parse_syn(input, None) + } +} + #[allow(clippy::to_string_trait_impl)] impl ToString for ArbitraryStyleBlock { fn to_string(&self) -> String { diff --git a/sabry_procmacro_impl/src/impls/scssy.rs b/sabry_procmacro_impl/src/impls/scssy.rs index b82718d..0684b70 100644 --- a/sabry_procmacro_impl/src/impls/scssy.rs +++ b/sabry_procmacro_impl/src/impls/scssy.rs @@ -1,7 +1,12 @@ +use std::path::PathBuf; + use proc_macro2::TokenStream; use quote::quote; use sabry_intrnl::scoper::ArbitraryScope; -use syn::{parse::Parse, Ident}; +use syn::{ + parse::{Parse, ParseStream}, + Ident, +}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -11,31 +16,34 @@ use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; /// `$syntax`: sass/scss /// /// `$code`: intended to be valid based on $syntax -pub fn scssy_macro_impl(input: TokenStream) -> TokenStream { +pub fn scssy_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> TokenStream { let MacroSyntax { ident, - syntax: mode, + syntax, code, - } = match syn::parse2::<MacroSyntax>(input) { + } = match syn::parse::Parser::parse2( + |input: ParseStream<'_>| MacroSyntax::parse_syn(input, source_path), + input, + ) { Ok(m) => m, Err(e) => return e.to_compile_error(), }; // quick raffia syntax check - match ArbitraryScope::from_source(mode.0, ident.clone(), &code.code) { + match ArbitraryScope::from_source(syntax.0, ident.clone(), &code.code) { Ok(_) => {} Err(e) => return syn::Error::new(code.span, format!("{e:?}")).into_compile_error(), } let sourcesass = code.to_string(); - let macro_doc = format!("Arbitrary {:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); + let macro_doc = format!("Arbitrary {:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `buildy` at build time", syntax); quote! { #[doc = #macro_doc] #[macro_export] macro_rules! #ident { () => {#sourcesass}; - (syntax) => {#mode}; + (syntax) => {#syntax}; } } } @@ -46,19 +54,32 @@ pub struct MacroSyntax { code: ArbitraryStyleBlock, } -impl Parse for MacroSyntax { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { +impl MacroSyntax { + pub fn parse_syn( + input: syn::parse::ParseStream, + source_path: Option<PathBuf>, + ) -> syn::Result<Self> { let ident = input.parse::<Ident>()?; - let mode = input.parse::<ArbitraryStyleSyntax>()?; - let code = input.parse::<ArbitraryStyleBlock>()?; + let syntax = input.parse::<ArbitraryStyleSyntax>()?; + + let code = match source_path { + Some(sp) => ArbitraryStyleBlock::parse_syn(input, Some(sp))?, + None => input.parse::<ArbitraryStyleBlock>()?, + }; Ok(Self { ident, - syntax: mode, + syntax, code, }) } } +impl Parse for MacroSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + Self::parse_syn(input, None) + } +} + #[cfg(test)] mod test {} diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 8d6ae1d..8231201 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use proc_macro2::{Span, TokenStream}; use quote::quote; use sabry_intrnl::{ @@ -5,7 +7,10 @@ use sabry_intrnl::{ config::SabryConfig, scoper::{apply_basic_rusty_member_gen_rules, ArbitraryScope, ScopedSelector}, }; -use syn::{parse::Parse, Ident, Token}; +use syn::{ + parse::{Parse, ParseStream}, + Ident, Token, +}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -26,7 +31,7 @@ use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; /// /// The machine-readable output may also be forced by use `machine_readable: true` arg on `parse_macro_syntax` function /// without modifying tokenstream -pub fn styly_macro_impl(input: TokenStream) -> TokenStream { +pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> TokenStream { let config = match SabryConfig::require() { Ok(c) => c, Err(e) => { @@ -40,7 +45,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { .to_compile_error() } }; - let ms = match parse_macro_syntax(input) { + let ms = match parse_macro_syntax(input, source_path) { Ok(ms) => ms, Err(e) => return e.to_compile_error(), }; @@ -180,8 +185,14 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { } // reusable function, that does not return tokenstream for machine-processing at build time -pub fn parse_macro_syntax(input: TokenStream) -> Result<MacroSyntax, syn::Error> { - syn::parse2::<MacroSyntax>(input) +pub fn parse_macro_syntax( + input: TokenStream, + source_path: Option<PathBuf>, +) -> Result<MacroSyntax, syn::Error> { + syn::parse::Parser::parse2( + |input: ParseStream<'_>| MacroSyntax::parse_syn(input, source_path), + input, + ) } #[derive(Debug)] @@ -215,12 +226,19 @@ pub struct MacroSyntax { pub code: ArbitraryStyleBlock, } -impl Parse for MacroSyntax { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { +impl MacroSyntax { + pub fn parse_syn( + input: syn::parse::ParseStream, + source_path: Option<PathBuf>, + ) -> syn::Result<Self> { let mut generator = input.parse::<ScopeGenerator>()?; let scope = input.parse::<Ident>()?; let syntax = input.parse::<ArbitraryStyleSyntax>()?; - let code = input.parse::<ArbitraryStyleBlock>()?; + let code = if source_path.is_some() { + ArbitraryStyleBlock::parse_syn(input, source_path) + } else { + input.parse::<ArbitraryStyleBlock>() + }?; if input.parse::<Token![#]>().is_ok() { generator = ScopeGenerator::MachineReadable @@ -234,3 +252,9 @@ impl Parse for MacroSyntax { }) } } + +impl Parse for MacroSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + Self::parse_syn(input, None) + } +} diff --git a/tests/macros.rs b/tests/macros.rs index f8f2ea0..bcb013a 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -111,7 +111,11 @@ mod build_tests { use std::fs; use insta::{glob, Settings}; - use sabry::{usey, buildmagic::SabryBuilder, config::{BehavHashCollision, BehavSassModCollision, SabryConfig}}; + use sabry::{ + buildmagic::SabryBuilder, + config::{BehavHashCollision, BehavSassModCollision, SabryConfig}, + usey, + }; fn gen_config() -> SabryConfig { let mut config = SabryConfig::require().unwrap(); From ca363326845ffc9fc58838d180a40fa612025a69 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 16 Nov 2024 22:37:31 +0500 Subject: [PATCH 052/184] oops: rearrange uses --- sabry_procmacro/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index 5c9ffba..71136a5 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -2,7 +2,7 @@ #![cfg_attr(feature = "nightly", feature(proc_macro_span))] use cfg_if::cfg_if; -use proc_macro::{Span, TokenStream}; +use proc_macro::TokenStream; use sabry_procmacro_impl::impls::{ scssy::scssy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, }; @@ -38,6 +38,7 @@ use sabry_procmacro_impl::impls::{ pub fn scssy(input: TokenStream) -> TokenStream { cfg_if! { if #[cfg(feature = "nightly")] { + use proc_macro::Span; let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); } else { let source_path = None; @@ -107,6 +108,7 @@ pub fn scssy(input: TokenStream) -> TokenStream { pub fn styly(input: TokenStream) -> TokenStream { cfg_if! { if #[cfg(feature = "nightly")] { + use proc_macro::Span; let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); } else { let source_path = None; From 60fd00beba0058d985136e9eb646dca2604f0380 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 16 Nov 2024 22:39:35 +0500 Subject: [PATCH 053/184] chore: Release --- Cargo.toml | 10 +++++----- README.md | 12 ++++++------ sabry_build/README.md | 2 +- sabry_intrnl/README.md | 2 +- sabry_procmacro/README.md | 2 +- sabry_procmacro_impl/README.md | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 38499c1..cc8a3c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1" } -sabry_build = {path = "sabry_build", version = "0.0.1" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.2" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.2" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.2" } +sabry_build = {path = "sabry_build", version = "0.0.2" } [workspace.package] -version = "0.0.1" +version = "0.0.2" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] diff --git a/README.md b/README.md index afb8f1d..ec284c2 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ The only need is the dependency #Cargo.toml [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` And a proc-macro ```rust @@ -174,7 +174,7 @@ Depend on sabry # Cargo.toml [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` And create a style scope wherever you want: ```rust @@ -214,10 +214,10 @@ To be able to compile all styles sabry also needs the *build* feature flag: # Cargo.toml [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} [build-dependencies] -sabry = {version = "0.0.1", features = ["build"]} +sabry = {version = "0.0.2", features = ["build"]} ``` > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. @@ -296,10 +296,10 @@ So, if you're on leptos, and don't mind to take this approach, I'd highly recomm # Cargo.toml [dependencies] -sabry = {version = "0.0.1", features = ["lepty-scoping"]} +sabry = {version = "0.0.2", features = ["lepty-scoping"]} [build-dependencies] -sabry = {version = "0.0.1", features = ["build", "lepty-scoping"]} +sabry = {version = "0.0.2", features = ["build", "lepty-scoping"]} ``` ```rust diff --git a/sabry_build/README.md b/sabry_build/README.md index 51da6c9..6171d6f 100644 --- a/sabry_build/README.md +++ b/sabry_build/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md index 7c3e17d..c67c372 100644 --- a/sabry_intrnl/README.md +++ b/sabry_intrnl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md index 6de0068..93779e0 100644 --- a/sabry_procmacro/README.md +++ b/sabry_procmacro/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md index eb13d81..e442bb3 100644 --- a/sabry_procmacro_impl/README.md +++ b/sabry_procmacro_impl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` From 09c90b79e8b3025109fae0e633080b484b8fceec Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 01:26:23 +0500 Subject: [PATCH 054/184] 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<String, SabryCompilerError> { 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<PathBuf>) -> Tok interp }) }) + .unique() .map(|s| { let ident = apply_basic_rusty_member_gen_rules(&s); let fnident = syn::parse_str::<Ident>(format!("_{ident}").as_str()) @@ -110,6 +112,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> 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} From 5483a607c35b2799fe9ba89df74da0cc7d3402c4 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 01:39:35 +0500 Subject: [PATCH 055/184] fix: allchore: bump example deps --- examples/define-styles/Cargo.lock | 242 ++++++++++++------------- examples/leptos-axum/Cargo.toml | 10 +- examples/leptos-components/Cargo.toml | 6 +- examples/use-styles/Cargo.lock | 246 ++++++++++++-------------- 4 files changed, 232 insertions(+), 272 deletions(-) diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index 87b2f50..d1a55eb 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -37,15 +37,15 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -58,9 +58,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" @@ -143,9 +143,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" dependencies = [ "arrayref", "arrayvec", @@ -190,15 +190,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" dependencies = [ "shlex", ] @@ -211,18 +211,18 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -232,9 +232,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "codemap" @@ -317,7 +317,7 @@ dependencies = [ "cssparser-macros", "dtoa-short", "itoa", - "phf 0.11.2", + "phf", "smallvec", ] @@ -337,7 +337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -408,15 +408,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -451,7 +442,7 @@ dependencies = [ "indexmap", "lasso", "once_cell", - "phf 0.11.2", + "phf", "rand", ] @@ -476,9 +467,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -488,12 +479,12 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", ] [[package]] @@ -512,17 +503,27 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.11" +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -543,15 +544,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "lightningcss" -version = "1.0.0-alpha.59" +version = "1.0.0-alpha.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" +checksum = "20c9e1f991b3861d25bf872ecca2eb6a73f7a9fe671da047cd1f9b49c65cbc40" dependencies = [ "ahash 0.8.11", "bitflags", @@ -561,7 +562,8 @@ dependencies = [ "dashmap", "data-encoding", "getrandom", - "itertools", + "indexmap", + "itertools 0.10.5", "lazy_static", "lightningcss-derive", "parcel_selectors", @@ -627,17 +629,17 @@ checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" [[package]] name = "parcel_selectors" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" +checksum = "7645c578d3a5c4cdf667af1ad39765f5f751c4883d251e050d5e1204b5cad0a9" dependencies = [ "bitflags", "cssparser", - "fxhash", "log", - "phf 0.10.1", + "phf", "phf_codegen", "precomputed-hash", + "rustc-hash", "smallvec", ] @@ -676,18 +678,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_shared 0.10.0", -] +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "phf" @@ -696,27 +689,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ "phf_macros", - "phf_shared 0.11.2", + "phf_shared", ] [[package]] name = "phf_codegen" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand", + "phf_generator", + "phf_shared", ] [[package]] @@ -725,7 +708,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ - "phf_shared 0.11.2", + "phf_shared", "rand", ] @@ -735,20 +718,11 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", + "phf_generator", + "phf_shared", "proc-macro2", "quote", - "syn 2.0.85", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", + "syn 2.0.90", ] [[package]] @@ -777,9 +751,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -837,7 +811,7 @@ checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" dependencies = [ "heck", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -892,9 +866,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags", ] @@ -913,9 +887,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -966,6 +940,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rustc-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" + [[package]] name = "ryu" version = "1.0.18" @@ -974,7 +954,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1" +version = "0.0.2" dependencies = [ "sabry_intrnl", "sabry_procmacro", @@ -982,7 +962,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1" +version = "0.0.2" dependencies = [ "base64", "blake3", @@ -994,14 +974,14 @@ dependencies = [ "raffia", "regex", "serde", - "syn 2.0.85", + "syn 2.0.90", "thiserror", "toml", ] [[package]] name = "sabry_procmacro" -version = "0.0.1" +version = "0.0.2" dependencies = [ "cfg-if", "sabry_procmacro_impl", @@ -1009,14 +989,15 @@ dependencies = [ [[package]] name = "sabry_procmacro_impl" -version = "0.0.1" +version = "0.0.2" dependencies = [ + "itertools 0.13.0", "proc-macro2", "quote", "raffia", "regex", "sabry_intrnl", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1033,29 +1014,29 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "serde" -version = "1.0.213" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -1124,9 +1105,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -1141,22 +1122,22 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1210,9 +1191,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-segmentation" @@ -1252,9 +1233,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -1263,24 +1244,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1288,22 +1268,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "windows-sys" @@ -1414,5 +1394,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 6fe0d77..659fbf9 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -9,16 +9,16 @@ publish = false crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "0.7.0-rc1" } -leptos_axum = { version = "0.7.0-rc1", optional = true } -leptos_meta = { version = "0.7.0-rc1" } -leptos_router = { version = "0.7.0-rc1" } +leptos = { version = "^0.7" } +leptos_axum = { version = "^0.7", optional = true } +leptos_meta = { version = "^0.7" } +leptos_router = { version = "^0.7" } axum = { version = "0.7", optional = true } console_error_panic_hook = "0.1" tokio = { version = "1", features = ["rt-multi-thread"], optional = true } tower = { version = "0.4", optional = true } tower-http = { version = "0.5", features = ["fs"], optional = true } -wasm-bindgen = "=0.2.95" +wasm-bindgen = "=0.2.96" thiserror = "1" tracing = { version = "0.1", optional = true } http = "1" diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml index 2359885..4b9f858 100644 --- a/examples/leptos-components/Cargo.toml +++ b/examples/leptos-components/Cargo.toml @@ -9,9 +9,9 @@ publish = false crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "0.7.0-rc1" } -leptos_meta = { version = "0.7.0-rc1" } -leptos_router = { version = "0.7.0-rc1" } +leptos = { version = "^0.7" } +leptos_meta = { version = "^0.7" } +leptos_router = { version = "^0.7" } sabry = {path = "../../", features = ["lepty-scoping"]} diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 2ab59b6..1e07093 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -37,15 +37,15 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -58,9 +58,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" @@ -143,9 +143,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" dependencies = [ "arrayref", "arrayvec", @@ -190,15 +190,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" dependencies = [ "shlex", ] @@ -211,18 +211,18 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -232,9 +232,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "codemap" @@ -317,7 +317,7 @@ dependencies = [ "cssparser-macros", "dtoa-short", "itoa", - "phf 0.11.2", + "phf", "smallvec", ] @@ -337,7 +337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -408,15 +408,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -451,7 +442,7 @@ dependencies = [ "indexmap", "lasso", "once_cell", - "phf 0.11.2", + "phf", "rand", ] @@ -476,9 +467,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -488,12 +479,12 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", ] [[package]] @@ -512,17 +503,27 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.11" +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -543,15 +544,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "lightningcss" -version = "1.0.0-alpha.59" +version = "1.0.0-alpha.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" +checksum = "20c9e1f991b3861d25bf872ecca2eb6a73f7a9fe671da047cd1f9b49c65cbc40" dependencies = [ "ahash 0.8.11", "bitflags", @@ -561,7 +562,8 @@ dependencies = [ "dashmap", "data-encoding", "getrandom", - "itertools", + "indexmap", + "itertools 0.10.5", "lazy_static", "lightningcss-derive", "parcel_selectors", @@ -627,17 +629,17 @@ checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" [[package]] name = "parcel_selectors" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" +checksum = "7645c578d3a5c4cdf667af1ad39765f5f751c4883d251e050d5e1204b5cad0a9" dependencies = [ "bitflags", "cssparser", - "fxhash", "log", - "phf 0.10.1", + "phf", "phf_codegen", "precomputed-hash", + "rustc-hash", "smallvec", ] @@ -676,18 +678,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_shared 0.10.0", -] +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "phf" @@ -696,27 +689,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ "phf_macros", - "phf_shared 0.11.2", + "phf_shared", ] [[package]] name = "phf_codegen" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand", + "phf_generator", + "phf_shared", ] [[package]] @@ -725,7 +708,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ - "phf_shared 0.11.2", + "phf_shared", "rand", ] @@ -735,20 +718,11 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", + "phf_generator", + "phf_shared", "proc-macro2", "quote", - "syn 2.0.85", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", + "syn 2.0.90", ] [[package]] @@ -777,9 +751,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -837,7 +811,7 @@ checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" dependencies = [ "heck", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -892,9 +866,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags", ] @@ -913,9 +887,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -966,6 +940,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rustc-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" + [[package]] name = "ryu" version = "1.0.18" @@ -974,7 +954,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1" +version = "0.0.2" dependencies = [ "sabry_build", "sabry_intrnl", @@ -983,19 +963,19 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1" +version = "0.0.2" dependencies = [ "proc-macro2", "sabry_intrnl", "sabry_procmacro_impl", - "syn 2.0.85", + "syn 2.0.90", "thiserror", "walkdir", ] [[package]] name = "sabry_intrnl" -version = "0.0.1" +version = "0.0.2" dependencies = [ "base64", "blake3", @@ -1007,14 +987,14 @@ dependencies = [ "raffia", "regex", "serde", - "syn 2.0.85", + "syn 2.0.90", "thiserror", "toml", ] [[package]] name = "sabry_procmacro" -version = "0.0.1" +version = "0.0.2" dependencies = [ "cfg-if", "sabry_procmacro_impl", @@ -1022,14 +1002,15 @@ dependencies = [ [[package]] name = "sabry_procmacro_impl" -version = "0.0.1" +version = "0.0.2" dependencies = [ + "itertools 0.13.0", "proc-macro2", "quote", "raffia", "regex", "sabry_intrnl", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1055,29 +1036,29 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "serde" -version = "1.0.213" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -1146,9 +1127,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -1163,22 +1144,22 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1232,9 +1213,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-segmentation" @@ -1292,9 +1273,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -1303,24 +1284,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1328,22 +1308,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "winapi-util" @@ -1463,5 +1443,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] From d39e170adb57d76c86e2c1acce505094c944587e Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:33:59 +0500 Subject: [PATCH 056/184] tests: prepare to the glob & clean a bit --- tests/assets/global.scss | 31 +++++++++++++++++++ tests/macros.rs | 11 ------- .../compilation_with_buildy@bundle.css.snap | 4 +-- ...ompilation_with_buildy@bundle.css.snap.new | 7 +++++ ...n_with_buildy@scopes__global_scss.css.snap | 7 +++++ ...th_buildy@scopes__global_scss.css.snap.new | 7 +++++ tests/styly_global.rs | 3 ++ tests/styly_module_usage.rs | 4 +++ tests/styly_repeating_selector.rs | 4 +++ tests/styly_sole_code.rs | 4 +++ tests/styly_use_forwarded.rs | 4 +++ 11 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 tests/assets/global.scss create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new create mode 100644 tests/styly_global.rs create mode 100644 tests/styly_module_usage.rs create mode 100644 tests/styly_repeating_selector.rs create mode 100644 tests/styly_sole_code.rs create mode 100644 tests/styly_use_forwarded.rs diff --git a/tests/assets/global.scss b/tests/assets/global.scss new file mode 100644 index 0000000..8c74805 --- /dev/null +++ b/tests/assets/global.scss @@ -0,0 +1,31 @@ +.p1 { + font-size: 10px; + color: white; + &-dark { + color: black; + } + + :global(html.mob) & { + font-size: 1rem; + + &-dark { + color: green; + } + + :global(ie) some & { + border: 1px; + } + } + + :global(html.dark) & { + color: orange; + } + + :global(whatever) & { + background: yellow; + + :global(ooops) & { + border: none; + } + } +} diff --git a/tests/macros.rs b/tests/macros.rs index 765a63b..30237f0 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -1,5 +1,3 @@ -use sabry::styly; - pub mod sass { use sabry::scssy; @@ -76,15 +74,6 @@ pub mod scss { pub(crate) use module_scss as module_c; } -styly!(sole_code_sass:sass "tests/assets/sole-code.sass"); -styly!(sole_code_scss:scss "tests/assets/sole-code.scss"); -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() { assert_eq!(sass::mixins_a!(), sass::mixins_inline_a!()); 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 a577331..0877132 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: 183 +assertion_line: 172 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%)}.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@bundle.css.snap.new b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new new file mode 100644 index 0000000..057646a --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 172 +input_file: tests/sabry_output/bundle.css +snapshot_kind: text +--- +.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%)}.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}.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}.wZIQboPSLZ8aKu0MjXHwYg.p1{color:#fff;font-size:10px}.wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:#000}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{font-size:1rem}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:green}ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{border:1px}html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1{color:orange}whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{background:#ff0}ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{border:none} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap new file mode 100644 index 0000000..31b7e63 --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 184 +input_file: tests/sabry_output/scopes/global_scss.css +snapshot_kind: text +--- +.qbRV6eFWg6fUikzGqcGvZg.p1{color:#fff;font-size:10px}.qbRV6eFWg6fUikzGqcGvZg.p1-dark{color:#000}html.mob .qbRV6eFWg6fUikzGqcGvZg.p1{font-size:1rem}html.mob .qbRV6eFWg6fUikzGqcGvZg.p1-dark{color:green}html.dark .qbRV6eFWg6fUikzGqcGvZg.p1{color:purple}whatever .qbRV6eFWg6fUikzGqcGvZg.p1{background:#ff0} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new new file mode 100644 index 0000000..db27d21 --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 172 +input_file: tests/sabry_output/scopes/global_scss.css +snapshot_kind: text +--- +.wZIQboPSLZ8aKu0MjXHwYg.p1{color:#fff;font-size:10px}.wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:#000}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{font-size:1rem}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:green}ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{border:1px}html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1{color:orange}whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{background:#ff0}ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{border:none} diff --git a/tests/styly_global.rs b/tests/styly_global.rs new file mode 100644 index 0000000..6e96aa5 --- /dev/null +++ b/tests/styly_global.rs @@ -0,0 +1,3 @@ +use sabry::styly; + +styly!(global_scss:scss "tests/assets/global.scss"); diff --git a/tests/styly_module_usage.rs b/tests/styly_module_usage.rs new file mode 100644 index 0000000..0b1bf9d --- /dev/null +++ b/tests/styly_module_usage.rs @@ -0,0 +1,4 @@ +use sabry::styly; + +styly!(module_usage_sass:sass "tests/assets/module-usage.sass"); +styly!(module_usage_scss:scss "tests/assets/module-usage.scss"); diff --git a/tests/styly_repeating_selector.rs b/tests/styly_repeating_selector.rs new file mode 100644 index 0000000..430ac62 --- /dev/null +++ b/tests/styly_repeating_selector.rs @@ -0,0 +1,4 @@ +use sabry::styly; + +styly!(repeating_selector_sass:sass "tests/assets/repeating-selector.sass"); +styly!(repeating_selector_scss:scss "tests/assets/repeating-selector.scss"); diff --git a/tests/styly_sole_code.rs b/tests/styly_sole_code.rs new file mode 100644 index 0000000..4d7ece1 --- /dev/null +++ b/tests/styly_sole_code.rs @@ -0,0 +1,4 @@ +use sabry::styly; + +styly!(sole_code_sass:sass "tests/assets/sole-code.sass"); +styly!(sole_code_scss:scss "tests/assets/sole-code.scss"); diff --git a/tests/styly_use_forwarded.rs b/tests/styly_use_forwarded.rs new file mode 100644 index 0000000..958d33e --- /dev/null +++ b/tests/styly_use_forwarded.rs @@ -0,0 +1,4 @@ +use sabry::styly; + +styly!(use_forwarded_sass:sass "tests/assets/use-forwarded.sass"); +styly!(use_forwarded_scss:scss "tests/assets/use-forwarded.scss"); From 722106595b7bd27d394cf0dbdbdffe15504d424b Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:34:23 +0500 Subject: [PATCH 057/184] feature: implement :glob() --- sabry_intrnl/src/scoper/mod.rs | 89 +++++++++++++++++++++---- sabry_intrnl/src/syntax/mod.rs | 25 ++++++- sabry_procmacro_impl/src/impls/styly.rs | 3 +- 3 files changed, 100 insertions(+), 17 deletions(-) diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 112ffe3..24696d3 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -2,7 +2,7 @@ use std::fmt::Debug; use cfg_if::cfg_if; use hash::ScopeHash; -use raffia::Spanned; +use raffia::{Span, Spanned}; use regex::Regex; use crate::{ @@ -109,7 +109,33 @@ impl<'s> HashedScope<'s> { .filter_map(|t| t.as_tag_name()) .map(|c| HashedSelector::from_tag(&hash, c)); - let mut hashed_selectors = classes.chain(ids).chain(tags).collect::<Vec<_>>(); + // get global selectors + let globs = scope.adapter().glob_modified_selectors(); + let globs = globs + .iter() + .filter_map(|g| { + // we do ignore the latter selectors from :global(a, b) because there's no clear decision: + // how should we treat :glob(a, b) c {} + // as `a c {}` `b c {}` + // or as `a, b c {}` ? + g.arg.clone().and_then(|a| { + if let raffia::ast::PseudoClassSelectorArgKind::SelectorList(list) = a.kind { + list.selectors + .first() + .cloned() + .map(|fcl| (g.span.clone(), fcl.span.clone())) + } else { + None + } + }) + }) + .map(|c| HashedSelector::from_glob_mod(&hash, c, scope.adapter().source())); + + let mut hashed_selectors = classes + .chain(ids) + .chain(tags) + .chain(globs) + .collect::<Vec<_>>(); // sorting by span start is important because of how hashed code construction works hashed_selectors.sort_by(|a, b| { @@ -151,6 +177,18 @@ pub struct HashedSelector { } impl HashedSelector { + pub fn from_glob_mod(hash: &ScopeHash, sel: (Span, Span), source: &str) -> Self { + let sel = ScopedSelector::from_glob_mod(sel, source); + let css_ident = Self::make_hashed_css(&sel, hash); + let html_ident = Self::make_hashed_html(&sel, hash); + + Self { + sel, + css_ident, + html_ident, + } + } + /// Construct the [HashedSelector], with given hash and parsed class selector pub fn from_class(hash: &ScopeHash, sel: &raffia::ast::ClassSelector) -> Self { let sel = ScopedSelector::from_class(sel); @@ -220,6 +258,7 @@ impl HashedSelector { } } } + ScopedSelector::Glob { raw, .. } => raw.clone(), } } @@ -254,6 +293,7 @@ impl HashedSelector { } } ScopedSelector::Tag(_) => None, + ScopedSelector::Glob { .. } => None, } } } @@ -264,7 +304,7 @@ pub struct ArbitrarySelector { /// CSS-ish identifier pub ident: String, /// Span in original CSS code where it comes from - pub span: raffia::Span, + pub span: Span, } /// Any unary CSS-ish selector, that's able to be scoped, and then hashed @@ -273,6 +313,11 @@ pub enum ScopedSelector { Class(ArbitrarySelector), Id(ArbitrarySelector), Tag(ArbitrarySelector), + Glob { + origin: ArbitrarySelector, + inner_span: Span, + raw: String, + }, } impl ScopedSelector { @@ -282,24 +327,40 @@ impl ScopedSelector { Self::Class(a) => a, Self::Id(a) => a, Self::Tag(a) => a, + Self::Glob { origin, .. } => origin, } } /// Generate rusty member ident based on selector type and CSS ident - pub fn gen_rusty_ident(&self) -> syn::Ident { - let basic = apply_basic_rusty_member_gen_rules(&self.as_arbitrary().ident); + pub fn gen_rusty_ident(&self) -> Option<syn::Ident> { + let arb = &self.as_arbitrary().ident; + let basic = apply_basic_rusty_member_gen_rules(arb); let ready = match self { - Self::Class(_) => basic, - Self::Id(_) => { - format!("the{basic}") - } - Self::Tag(_) => { - format!("any{basic}") - } + Self::Class(_) => Some(basic), + Self::Id(_) => Some(format!("the{basic}")), + Self::Tag(_) => Some(format!("any{basic}")), + Self::Glob { .. } => None, }; - syn::parse_str::<syn::Ident>(&ready).expect("BUG: formed ident is not Rust Ident") + ready.map(|rs| { + syn::parse_str::<syn::Ident>(&rs).expect("BUG: formed ident is not Rust Ident") + }) + } + + /// Construct this from glob complex selector + pub fn from_glob_mod(s: (Span, Span), source: &str) -> Self { + let inner_span = s.1; + let origin_ident = source[s.0.start..s.0.end].to_owned(); + + Self::Glob { + origin: ArbitrarySelector { + span: s.0, + ident: origin_ident, + }, + raw: source[inner_span.start..inner_span.end].to_owned(), + inner_span, + } } /// Construct this from class selector @@ -482,7 +543,7 @@ mod test { .hashed_selectors .iter() .map(|s| s.sel.gen_rusty_ident()) - .map(|i| i.to_string()) + .flat_map(|i| i.map(|is| is.to_string())) .collect::<HashSet<_>>(); assert_eq!(expect_ident_names, sels); diff --git a/sabry_intrnl/src/syntax/mod.rs b/sabry_intrnl/src/syntax/mod.rs index ba85336..9feccd4 100644 --- a/sabry_intrnl/src/syntax/mod.rs +++ b/sabry_intrnl/src/syntax/mod.rs @@ -1,8 +1,8 @@ use ostrta::OneSyntaxToRuleThemAll; use raffia::{ ast::{ - ClassSelector, CompoundSelector, IdSelector, NestingSelector, SimpleSelector, Statement, - Stylesheet, TypeSelector, + ClassSelector, CompoundSelector, IdSelector, NestingSelector, PseudoClassSelector, + SimpleSelector, Statement, Stylesheet, TypeSelector, }, ParserBuilder, }; @@ -56,6 +56,27 @@ impl<'s> StylesheetAdapter<'s> { self.selectors_by(|c| c.as_nesting().cloned()) } + /// special selector case searching for :g(whatever), :glob(whatever), :global(whatever) + pub fn glob_modified_selectors(&self) -> Vec<PseudoClassSelector<'s>> { + self.selectors_by(|c| { + let cps = match c.as_pseudo_class() { + Some(s) => s.clone(), + _ => return None, + }; + + let ident = match cps.name.as_literal().map(|r| r.raw) { + Some(i) => i, + _ => return None, + }; + + if ident == "global" { + Some(cps) + } else { + None + } + }) + } + /// Return collected [Vec] of owned values modulo `T`, filtered by `F`. /// /// This is preferred way to apply custom filtering on selectors over diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 5d896d3..e49a577 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -119,13 +119,14 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok ScopedSelector::Class(_) => "class", ScopedSelector::Id(_) => "id", ScopedSelector::Tag(_) => "tagname", + ScopedSelector::Glob { .. } => "glob", }; (name, hs.sel.gen_rusty_ident(), html, hs.css_ident.clone()) }) }) .map(|(name, ident, html, css)| { - let docs = format!("'{}' {}. CSS selector '{}'", ident, name, css); + let docs = format!("'{:?}' {}. CSS selector '{}'", ident, name, css); quote! { #[doc = #docs] #[allow(non_upper_case_globals)] From 1b4df88f69e2ca6adc60ea14f38d4f3874b16572 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:35:47 +0500 Subject: [PATCH 058/184] tests: use uncompressed. Lets pray that those can be trusted on the edge --- tests/macros.rs | 2 +- .../compilation_with_buildy@bundle.css.snap | 593 ++++++++++++++++++ ...ompilation_with_buildy@bundle.css.snap.new | 7 - ...n_with_buildy@scopes__global_scss.css.snap | 35 +- ...th_buildy@scopes__global_scss.css.snap.new | 7 - ..._buildy@scopes__module_usage_sass.css.snap | 114 +++- ..._buildy@scopes__module_usage_scss.css.snap | 114 +++- ...y@scopes__repeating_selector_sass.css.snap | 30 +- ...y@scopes__repeating_selector_scss.css.snap | 30 +- ...ith_buildy@scopes__sole_code_sass.css.snap | 31 +- ...ith_buildy@scopes__sole_code_scss.css.snap | 31 +- ...buildy@scopes__use_forwarded_sass.css.snap | 114 +++- ...buildy@scopes__use_forwarded_scss.css.snap | 114 +++- 13 files changed, 1189 insertions(+), 33 deletions(-) delete mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new delete mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new diff --git a/tests/macros.rs b/tests/macros.rs index 30237f0..e3e56e4 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -112,7 +112,7 @@ mod build_tests { let mut config = SabryConfig::require().unwrap(); config.css.bundle = Some("tests/sabry_output/bundle.css".into()); config.css.scopes = Some("tests/sabry_output/scopes".into()); - config.css.minify = true; + config.css.minify = false; config.css.prelude = Some(vec!["tests/assets/prelude.css".into()]); config.sass.prelude = Some(vec![ 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 0877132..c8a14ae 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -4,4 +4,597 @@ assertion_line: 172 input_file: tests/sabry_output/bundle.css snapshot_kind: text --- +.n5vGKZlIscA58H8d7ZMOhSw.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} +.n5vGKZlIscA58H8d7ZMOhSw.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { + transform: translateX(10%); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(10%); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:hover { + transform: translateX(10%); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(10%); +} + +.smfXzGrnTs2kl9jPP0nk6w.fuzz { + background-color: red; + display: block; +} + +.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark { + background-color: #000; + color: #fff; +} + +.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 { + position: relative; + display: grid; + grid-template-areas: "a b c" + "d e f" + "x x x"; + display: block; +} + +.FT5yVVwswyLvNU3dIk0qw.fuzz { + background-color: red; + display: block; +} + +.FT5yVVwswyLvNU3dIk0qw.fuzz-dark { + background-color: #000; + color: #fff; +} + +.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 { + position: relative; + display: grid; + grid-template-areas: "a b c" + "d e f" + "x x x"; + display: block; +} + +.qK4fsMeZRSTGObSesXXRBA.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:hover { + transform: translateX(10%); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(10%); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:hover { + transform: translateX(10%); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(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; +} + +.wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 10px; + color: #fff; +} + +.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: #000; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 1rem; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: green; +} + +ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: 1px; +} + +html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { + color: orange; +} + +whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + background: #ff0; +} + +ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: none; +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new deleted file mode 100644 index 057646a..0000000 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/macros.rs -assertion_line: 172 -input_file: tests/sabry_output/bundle.css -snapshot_kind: text ---- -.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%)}.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}.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}.wZIQboPSLZ8aKu0MjXHwYg.p1{color:#fff;font-size:10px}.wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:#000}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{font-size:1rem}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:green}ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{border:1px}html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1{color:orange}whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{background:#ff0}ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{border:none} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap index 31b7e63..a2a6ddf 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap @@ -1,7 +1,38 @@ --- source: tests/macros.rs -assertion_line: 184 +assertion_line: 172 input_file: tests/sabry_output/scopes/global_scss.css snapshot_kind: text --- -.qbRV6eFWg6fUikzGqcGvZg.p1{color:#fff;font-size:10px}.qbRV6eFWg6fUikzGqcGvZg.p1-dark{color:#000}html.mob .qbRV6eFWg6fUikzGqcGvZg.p1{font-size:1rem}html.mob .qbRV6eFWg6fUikzGqcGvZg.p1-dark{color:green}html.dark .qbRV6eFWg6fUikzGqcGvZg.p1{color:purple}whatever .qbRV6eFWg6fUikzGqcGvZg.p1{background:#ff0} +.wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 10px; + color: #fff; +} + +.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: #000; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 1rem; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: green; +} + +ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: 1px; +} + +html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { + color: orange; +} + +whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + background: #ff0; +} + +ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: none; +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new deleted file mode 100644 index db27d21..0000000 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/macros.rs -assertion_line: 172 -input_file: tests/sabry_output/scopes/global_scss.css -snapshot_kind: text ---- -.wZIQboPSLZ8aKu0MjXHwYg.p1{color:#fff;font-size:10px}.wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:#000}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{font-size:1rem}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:green}ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{border:1px}html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1{color:orange}whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{background:#ff0}ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{border:none} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap index e26b0f4..59776f1 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap @@ -1,7 +1,117 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/module_usage_sass.css snapshot_kind: text --- -.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%)} +.n5vGKZlIscA58H8d7ZMOhSw.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { + transform: translateX(10%); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(10%); +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap index c24335b..f26df0f 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap @@ -1,7 +1,117 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/module_usage_scss.css snapshot_kind: text --- -.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%)} +.n6ROVrVzYikGtxgKBYy11kA.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:hover { + transform: translateX(10%); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(10%); +} 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 index 904488c..ecff4e6 100644 --- 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 @@ -1,7 +1,33 @@ --- source: tests/macros.rs -assertion_line: 183 +assertion_line: 172 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} +.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 index efc723b..9c06115 100644 --- 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 @@ -1,7 +1,33 @@ --- source: tests/macros.rs -assertion_line: 183 +assertion_line: 172 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} +.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__sole_code_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap index 922db8e..2b91afc 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap @@ -1,7 +1,34 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/sole_code_sass.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} +.smfXzGrnTs2kl9jPP0nk6w.fuzz { + background-color: red; + display: block; +} + +.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark { + background-color: #000; + color: #fff; +} + +.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 { + position: relative; + display: grid; + grid-template-areas: "a b c" + "d e f" + "x x x"; + display: block; +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap index a7760eb..7cb4253 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap @@ -1,7 +1,34 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/sole_code_scss.css snapshot_kind: text --- -.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} +.FT5yVVwswyLvNU3dIk0qw.fuzz { + background-color: red; + display: block; +} + +.FT5yVVwswyLvNU3dIk0qw.fuzz-dark { + background-color: #000; + color: #fff; +} + +.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 { + position: relative; + display: grid; + grid-template-areas: "a b c" + "d e f" + "x x x"; + display: block; +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap index 3695b70..5f18c81 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap @@ -1,7 +1,117 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/use_forwarded_sass.css snapshot_kind: text --- -.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%)} +.qK4fsMeZRSTGObSesXXRBA.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:hover { + transform: translateX(10%); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(10%); +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap index b8adffa..68599c1 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap @@ -1,7 +1,117 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/use_forwarded_scss.css snapshot_kind: text --- -.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%)} +.FMHIHNH4_QHxbUqdVmS1A.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:hover { + transform: translateX(10%); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(10%); +} From fb6d00048165ab3ca538b39da5337ae1a45498c0 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:49:49 +0500 Subject: [PATCH 059/184] chore: allow publish from 'window' for early stages --- release.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.toml b/release.toml index 7667a01..ebe3dfb 100644 --- a/release.toml +++ b/release.toml @@ -1,4 +1,4 @@ -allow-branch = ["master"] +allow-branch = ["master", "window"] sign-commit = true sign-tag = true target = "x86_64-unknown-linux-gnu" From ecc065ad333d43b258ee531b654c1fc6e52f7777 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:53:43 +0500 Subject: [PATCH 060/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cc8a3c7..2093233 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.2" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.2" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.2" } -sabry_build = {path = "sabry_build", version = "0.0.2" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.3-alpha.1" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.3-alpha.1" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.3-alpha.1" } +sabry_build = {path = "sabry_build", version = "0.0.3-alpha.1" } [workspace.package] -version = "0.0.2" +version = "0.0.3-alpha.1" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 6bcc3bfff549519786e1e9cd0a1c5ad6fa1c0541 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:57:29 +0500 Subject: [PATCH 061/184] chore: bump lightningcss --- sabry_intrnl/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 3d2a39e..8d516e3 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -15,7 +15,7 @@ proc-macro2 = {version = "^1.0"} raffia = {version = "^0.9"} regex = {version = "^1.11"} grass = {version = "^0.13"} -lightningcss = {version = "1.0.0-alpha.59"} +lightningcss = {version = "1.0.0-alpha.61"} blake3 = {version = "^1.5"} base64 = {version = "^0.22"} From ad34a0e78a5fc3e613cf1f80bd8f20e6649d0f14 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Sat, 14 Dec 2024 10:21:41 +0500 Subject: [PATCH 062/184] fix: repeating non-parent selectors --- sabry_procmacro_impl/src/impls/styly.rs | 3 +- tests/assets/repeating-selector.scss | 15 ++++++++++ .../compilation_with_buildy@bundle.css.snap | 30 ++++++++++++++----- ...y@scopes__repeating_selector_scss.css.snap | 30 ++++++++++++++----- 4 files changed, 63 insertions(+), 15 deletions(-) diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index e49a577..7e9d68d 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -112,7 +112,8 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok let scope_members = scope .hashed_selectors .iter() - .unique() + // not pretty sure about the best way to do this + .unique_by(|hs| hs.sel.as_arbitrary().ident.clone()) .filter_map(|hs| { hs.html_ident.clone().map(|html| { let name = match hs.sel { diff --git a/tests/assets/repeating-selector.scss b/tests/assets/repeating-selector.scss index 7cf81f6..3150f9b 100644 --- a/tests/assets/repeating-selector.scss +++ b/tests/assets/repeating-selector.scss @@ -7,6 +7,13 @@ &__blist { list-style: none; } + + &.sub { + margin: 0; + } + .bus & { + padding: 0; + } } .el2 { @@ -21,4 +28,12 @@ background: black; } } + + &.sub { + margin: 0; + } + + .bus { + margin: 0; + } } 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 c8a14ae..af1132e 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -538,34 +538,50 @@ snapshot_kind: text background: #000; } -.YYYksiQMfU3exD720ckMbA.el1 { +.n9m9Me_zRl6xP8NIGObY_A.el1 { color: red; } -.YYYksiQMfU3exD720ckMbA.el1-mob { +.n9m9Me_zRl6xP8NIGObY_A.el1-mob { color: #00f; } -.YYYksiQMfU3exD720ckMbA.el1__blist { +.n9m9Me_zRl6xP8NIGObY_A.el1__blist { list-style: none; } -.YYYksiQMfU3exD720ckMbA.el2 { +.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { + padding: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 { color: #fff; } -.YYYksiQMfU3exD720ckMbA.el2-mob { +.n9m9Me_zRl6xP8NIGObY_A.el2-mob { color: #000; } -.YYYksiQMfU3exD720ckMbA.el2__blist { +.n9m9Me_zRl6xP8NIGObY_A.el2__blist { background: #fff; } -.YYYksiQMfU3exD720ckMbA.el2__blist-mob { +.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { background: #000; } +.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { + margin: 0; +} + .wZIQboPSLZ8aKu0MjXHwYg.p1 { font-size: 10px; color: #fff; 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 index 9c06115..e40637f 100644 --- 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 @@ -4,30 +4,46 @@ assertion_line: 172 input_file: tests/sabry_output/scopes/repeating_selector_scss.css snapshot_kind: text --- -.YYYksiQMfU3exD720ckMbA.el1 { +.n9m9Me_zRl6xP8NIGObY_A.el1 { color: red; } -.YYYksiQMfU3exD720ckMbA.el1-mob { +.n9m9Me_zRl6xP8NIGObY_A.el1-mob { color: #00f; } -.YYYksiQMfU3exD720ckMbA.el1__blist { +.n9m9Me_zRl6xP8NIGObY_A.el1__blist { list-style: none; } -.YYYksiQMfU3exD720ckMbA.el2 { +.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { + padding: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 { color: #fff; } -.YYYksiQMfU3exD720ckMbA.el2-mob { +.n9m9Me_zRl6xP8NIGObY_A.el2-mob { color: #000; } -.YYYksiQMfU3exD720ckMbA.el2__blist { +.n9m9Me_zRl6xP8NIGObY_A.el2__blist { background: #fff; } -.YYYksiQMfU3exD720ckMbA.el2__blist-mob { +.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { background: #000; } + +.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { + margin: 0; +} From b5887e1924ff3696608b692978e9452b289b086f Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Sat, 14 Dec 2024 10:25:37 +0500 Subject: [PATCH 063/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2093233..db19f52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.3-alpha.1" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.3-alpha.1" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.3-alpha.1" } -sabry_build = {path = "sabry_build", version = "0.0.3-alpha.1" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.3-alpha.2" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.3-alpha.2" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.3-alpha.2" } +sabry_build = {path = "sabry_build", version = "0.0.3-alpha.2" } [workspace.package] -version = "0.0.3-alpha.1" +version = "0.0.3-alpha.2" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 02e8efb990af4a6535ac8a63f9dc010462689e84 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Sat, 14 Dec 2024 10:44:04 +0500 Subject: [PATCH 064/184] fix: improve docs --- README.md | 108 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index ec284c2..be7fb6f 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,7 @@ At first, I'll show how this crate "tastes". With SABRY, its in your power to: -<table> -<tr> -<td> +<hr/> Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with modules, with feature flags, etc. Say "bye" to manual copying, cli-tools and consts. @@ -28,10 +26,7 @@ Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with sabry::scssy!(tokens {"@mixin colored{color: red;}"}); ``` -</td> -</tr> -<tr> -<td> +<hr/> Get the *(almost)* proper autocompletion for your scope from rust-analyzer @@ -42,10 +37,7 @@ scope::cls1; scope::theid1; ``` -</td> -</tr> -<tr> -<td> +<hr/> Code your SASS in separate files to get proper syntax highlighting, or do sass-in-the-rust to keep things in one place @@ -54,22 +46,18 @@ sabry::styly!(component {".btn {color: green;}"}); sabry::styly!(extras "tests/assets/mixin-module.scss"); ``` -</td> -</tr> -<tr> -<td> +<hr/> Depend on styles with cargo, at build time, which brings all the rusty sweeties in: versions, updates, cratesio, local registries, workspaces, etc. ```toml -[build-dependencies] -tgk_brandstyle = {version = "0.0.1", features = ["utils"]} +[build-dependencies.your_styles] +registry = "your_registry_isnt_that_cool" +version = "^0.1" +features = ["darkmode", "mobile"] ``` -</td> -</tr> -<tr> -<td> +<hr/> `@use` your style-crates in sass code *naturally* @@ -80,10 +68,7 @@ sabry::styly!(breadbadge {" "}); ``` -</td> -</tr> -<tr> -<td> +<hr/> Keep things as private and modular as you wish @@ -100,10 +85,7 @@ sabry::styly!(dogs {"#howl {border: none;}"}); } ``` -</td> -</tr> -<tr> -<td> +<hr/> Compile all the sweet SASS/SCSS into the optimized CSS bundle, ship it in CSS shunks or even include the compiled style into the binary @@ -112,9 +94,7 @@ sabry::styly!(cssbundle {".c1 {color: white;}"}); sabry::styly!(const binary {".c2 {color: black;}"}); ``` -</td> -</tr> -</table> +<hr/> Sabry will gladly: @@ -160,7 +140,7 @@ scssy!(styles {" } "}); ``` -*\* Unlike most of other crates that do sass-in-the-rust, sabry currently does not allow unquoted sass/scss. You still have to write it in a string-quotes. Unquoted sass/scss is reserved for the future, where we shall introduce variable injection.* +*\* Unlike most of other crates that do sass-in-the-rust, sabry currently does not allow unquoted sass/scss. You still have to write it in a string-quotes. Unquoted sass/scss is reserved for the future, where, hopefully, I'll find more exciting usage for it. In the meantime it does look like Zed, for example, still highlights your code (:* Now you can build and see two ready for export macros: `mixins!` and `styles!`. These are usefull on their own, as invocation of `mixins!()` or `styles!()` - both shall give you the code literal. @@ -273,6 +253,68 @@ detected by sabry. for sabry, so you can use styles from relative paths `styly!(const comp "./style.scss")` - Which will give you an error from rust-analyzer wether file exists or not. However, if the path is correct, it will build fine. +<details> +<summary>I'd suggest something like this</summary> + +```rust,ignore +// lib.rs +pub mod utils; +pub mod form; + +pub const fn css() -> &'static str { + concatcp!(utils::css(), form::css()) +} +``` + +```rust,ignore +// utils.rs +use sabry::styly; + +styly!(pub const scope:scss {" + .whatever { + &__code {} + &[you-please] {} + } +"}); + +styly!(pub const another:scss {" + .whatever { + &__code {} + &[you-please] {} + } +"}); + +pub const fn css() -> &'static str { + concatcp!(SCOPE, ANOTHER) +} +``` + +```rust,ignore +// form.rs +use sabry::styly; + +styly!(pub const scope:scss {" + .whatever { + &__code {} + &[you-please] {} + } +"}); + +styly!(pub const another:scss {" + .whatever { + &__code {} + &[you-please] {} + } +"}); + +pub const fn css() -> &'static str { + concatcp!(SCOPE, ANOTHER) +} +``` +So I'd say - do the const function back-propogation and let the consumer decide how to include the CSS of the component crate. + +</details> + ### Leptos specials With [leptos](https://github.com/leptos-rs/leptos) framework you can do the trick to apply some class to most of HtmlElements for the entire component/island: From 835c7e13a864b82268a66023236a16c7237c65bb Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Sat, 14 Dec 2024 10:47:55 +0500 Subject: [PATCH 065/184] fix: improve docs --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index be7fb6f..e6dbb59 100644 --- a/README.md +++ b/README.md @@ -372,8 +372,8 @@ fn component() -> impl IntoView { "Head" <img src="whatever"/> </h1> - <ul class=scope::breadcumbs> - <li class=scope::___item(scope::breadcumbs)> + <ul class="breadcumbs"> + <li class="breadcumbs__item"> "Home page" </li> </ul> @@ -385,6 +385,7 @@ That will perform *much* better: - All scope members - like `scope::breadcumbs` - wont contain repeating scope hash, just the original class/id selector - So instead of scope members (which [aren't](https://github.com/yiffyrusdev/sabry/issues/2) autocompleted for sass-in-the-rust yet) you could just write bare selectors, as you do, for example, with svelte: `<li class="breadcumbs__item">` + - You'll still have the rusty mod generated: its just the `scope::breadcumbs` is the `"breadcumbs"` without the hash - You will not encounter [the catch](#scoping) with nested tagname selectors Also, this isn't really exclusive leptos-supporting feature. It just changes scoping behavour. From 6a85ff16ef21d6f91bb7e94160488afc311becec Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Sat, 14 Dec 2024 10:52:47 +0500 Subject: [PATCH 066/184] fix: improve docs --- README.md | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index e6dbb59..768863f 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,11 @@ \* sabry isn't "syntactically awesome", it refers to SASS abbr expansion. -> **Project status** - early, good enough for my team's non-critical "for-fun" pre-production, on demand. WIP features have no ETA. I'm pretty happy with ergonomics and taste of the crate, and I'll do my best to keep DX the way it is between minor versions - but there's no guarantee on backwards-compatibility and no refunds if something breaks. +> **Project status** - early, my team uses it now and again in production, and the most of features/fixes do come on demand. I'm pretty happy with ergonomics and taste of the crate, and I'll do my best to keep DX the way it is between minor versions - but there's no guarantee on backwards-compatibility and no refunds if something breaks. > > "master" branch is what's currently on crates.io > -> each version ever been on crates.io (except the latest release) is available in "r_x.x.x" branch +> each version ever been on crates.io (except the latest release) is available in "vX.X.X" branch > > the latest-trashy state is in the "window" branch @@ -729,23 +729,12 @@ Not any valid CSS selector is a valid rust identifier. In general this section s *(sorted by my own priority)*, "dones" are excluded - [x] Somehow achieve the autocompletion for scopes. The problem is explained in details [here](https://github.com/yiffyrusdev/sabry/issues/2) - - [ ] some weird unrelated stuff I can see in autocompletion -- [ ] Crates of styled components - currently the only way to create them seems to be const styly. - - [ ] CSS support - - [x] Allow relative path selection (with 'nightly' feature on nightly rust) - - [ ] Somehow get rid of false-positives AND retain proper autocompletion + - [x] some weird unrelated stuff I can see in autocompletion (still investigating btw) +- [ ] Support for direct CSS syntax - [ ] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance -- [ ] Use sass-in-rust without quoted styles for variable injection: - ```rust, ignore - let myvar = "content"; - styly!(scope { - .c::after { - content: somehow(myvar); - } - }) - ``` -- [ ] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. -- [ ] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. +- [ ] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it: + - [ ] We have to save file twice with cargo leptos for changed styles to take effect + - [ ] Seems like turning on the "hashing" with leptos requires a hard-restart of cargo-leptos ## Contributions From 9f0a6e7ee40105b5ec0ace0648f8978fd607e50b Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Wed, 9 Apr 2025 05:55:41 +0500 Subject: [PATCH 067/184] weaken & bump versions: = weaken = * regex * thiserror * cfg-if * serde * syn * quote * proc-macro2 * walkdir = bump = * thiserror -> 2 * lightningcss -> alpha.65 * itertools -> 0.14 --- Cargo.toml | 50 +++++++++++---------------------- sabry_build/Cargo.toml | 12 ++++---- sabry_intrnl/Cargo.toml | 24 ++++++++-------- sabry_procmacro/Cargo.toml | 4 +-- sabry_procmacro_impl/Cargo.toml | 13 ++++----- 5 files changed, 42 insertions(+), 61 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index db19f52..9e1d672 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,22 +1,16 @@ [workspace] resolver = "2" -members = [ - "sabry_procmacro", - "sabry_procmacro_impl", - "sabry_intrnl", -] -exclude = [ - "examples" -] +members = ["sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl"] +exclude = ["examples"] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.3-alpha.2" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.3-alpha.2" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.3-alpha.2" } -sabry_build = {path = "sabry_build", version = "0.0.3-alpha.2" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.3" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.3" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.3" } +sabry_build = { path = "sabry_build", version = "0.0.3" } [workspace.package] -version = "0.0.3-alpha.2" +version = "0.0.3" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] @@ -37,31 +31,21 @@ license.workspace = true publish.workspace = true [dependencies] -sabry_procmacro = {workspace = true, optional = true} -sabry_build = {workspace = true, optional = true} -sabry_intrnl = {workspace = true} +sabry_procmacro = { workspace = true, optional = true } +sabry_build = { workspace = true, optional = true } +sabry_intrnl = { workspace = true } [dev-dependencies] -leptos = {version = "0.7.0-gamma3"} -insta = {version = "^1.41", features = ["glob"]} +leptos = { version = "0.7.0-gamma3" } +insta = { version = "^1.41", features = ["glob"] } [features] default = ["procmacro"] -lepty-scoping = [ - "sabry_intrnl/lepty-scoping" -] -procmacro = [ - "dep:sabry_procmacro" -] -build = [ - "dep:sabry_build" -] -net-files = [ - "sabry_build/net-files" -] -nightly = [ - "sabry_procmacro?/nightly" -] +lepty-scoping = ["sabry_intrnl/lepty-scoping"] +procmacro = ["dep:sabry_procmacro"] +build = ["dep:sabry_build"] +net-files = ["sabry_build/net-files"] +nightly = ["sabry_procmacro?/nightly"] internals = [] [package.metadata.docs.rs] diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index 400a3a0..ce81bbc 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -9,13 +9,13 @@ authors.workspace = true license.workspace = true [dependencies] -sabry_intrnl = {workspace = true} -sabry_procmacro_impl = {workspace = true} +sabry_intrnl = { workspace = true } +sabry_procmacro_impl = { workspace = true } -syn = {version = "^2.0", features = ["visit", "derive", "parsing", "full"]} -proc-macro2 = {version = "^1.0", features = ["span-locations"]} -thiserror = {version = "^1.0"} -walkdir = {version = "^2.5"} +syn = { version = "^2", features = ["visit", "derive", "parsing", "full"] } +proc-macro2 = { version = "^1", features = ["span-locations"] } +thiserror = { version = "^2" } +walkdir = { version = "^2" } [features] net-files = [] diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 8d516e3..85d7a9f 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -9,20 +9,18 @@ authors.workspace = true license.workspace = true [dependencies] -syn = {version = "^2.0"} -quote = {version = "^1.0"} -proc-macro2 = {version = "^1.0"} -raffia = {version = "^0.9"} -regex = {version = "^1.11"} -grass = {version = "^0.13"} -lightningcss = {version = "1.0.0-alpha.61"} -blake3 = {version = "^1.5"} -base64 = {version = "^0.22"} +syn = { version = "^2" } +raffia = { version = "^0.9" } +regex = { version = "^1" } +grass = { version = "^0.13" } +lightningcss = { version = "1.0.0-alpha.65" } +blake3 = { version = "^1.5" } +base64 = { version = "^0.22" } -thiserror = {version = "^1.0"} -serde = {version = "^1.0", features = ["derive"]} -toml = {version = "^0.8"} -cfg-if = {version = "^1.0"} +thiserror = { version = "^2" } +serde = { version = "^1", features = ["derive"] } +toml = { version = "^0.8" } +cfg-if = { version = "^1" } [features] lepty-scoping = [] diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index cb2c1bd..fb95447 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -12,8 +12,8 @@ license.workspace = true proc-macro = true [dependencies] -sabry_procmacro_impl = {workspace = true} -cfg-if = {version = "^1.0"} +sabry_procmacro_impl = { workspace = true } +cfg-if = { version = "^1" } [features] nightly = [] diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index e4a2b50..e121b3f 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -9,14 +9,13 @@ authors.workspace = true license.workspace = true [dependencies] -sabry_intrnl = {workspace = true} +sabry_intrnl = { workspace = true } -syn = {version = "^2.0", features = ["parsing"]} -quote = {version = "^1.0"} -proc-macro2 = {version = "^1.0", features = ["span-locations"]} -raffia = {version = "^0.9"} -regex = {version = "^1.11"} -itertools = {version = "^0.13"} +syn = { version = "^2", features = ["parsing"] } +quote = { version = "^1" } +proc-macro2 = { version = "^1", features = ["span-locations"] } +regex = { version = "^1" } +itertools = { version = "^0.14" } [features] nightly = [] From e308898c1702934f3c4ca6c99d3e1c40d460207f Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Wed, 9 Apr 2025 05:58:50 +0500 Subject: [PATCH 068/184] fix: verify test snapshot --- .../compilation_with_buildy@bundle.css.snap | 211 +++++++++--------- 1 file changed, 105 insertions(+), 106 deletions(-) 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 af1132e..9b70a49 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -2,8 +2,40 @@ source: tests/macros.rs assertion_line: 172 input_file: tests/sabry_output/bundle.css -snapshot_kind: text --- +.wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 10px; + color: #fff; +} + +.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: #000; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 1rem; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: green; +} + +ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: 1px; +} + +html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { + color: orange; +} + +whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + background: #ff0; +} + +ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: none; +} + .n5vGKZlIscA58H8d7ZMOhSw.coated { color: #c6c6c6; background-color: #0ff; @@ -228,6 +260,78 @@ snapshot_kind: text transform: translateX(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; +} + +.n9m9Me_zRl6xP8NIGObY_A.el1 { + color: red; +} + +.n9m9Me_zRl6xP8NIGObY_A.el1-mob { + color: #00f; +} + +.n9m9Me_zRl6xP8NIGObY_A.el1__blist { + list-style: none; +} + +.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { + padding: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 { + color: #fff; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2-mob { + color: #000; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2__blist { + background: #fff; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { + background: #000; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { + margin: 0; +} + .smfXzGrnTs2kl9jPP0nk6w.fuzz { background-color: red; display: block; @@ -509,108 +613,3 @@ snapshot_kind: text .FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover { transform: translateX(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; -} - -.n9m9Me_zRl6xP8NIGObY_A.el1 { - color: red; -} - -.n9m9Me_zRl6xP8NIGObY_A.el1-mob { - color: #00f; -} - -.n9m9Me_zRl6xP8NIGObY_A.el1__blist { - list-style: none; -} - -.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { - margin: 0; -} - -.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { - padding: 0; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2 { - color: #fff; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2-mob { - color: #000; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2__blist { - background: #fff; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { - background: #000; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { - margin: 0; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { - margin: 0; -} - -.wZIQboPSLZ8aKu0MjXHwYg.p1 { - font-size: 10px; - color: #fff; -} - -.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { - color: #000; -} - -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { - font-size: 1rem; -} - -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { - color: green; -} - -ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { - border: 1px; -} - -html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { - color: orange; -} - -whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { - background: #ff0; -} - -ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { - border: none; -} From 6ca9e1b9b00ac362377508cf08406972c38f6948 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Wed, 9 Apr 2025 06:00:59 +0500 Subject: [PATCH 069/184] chore: Release --- Cargo.toml | 10 +++++----- README.md | 12 ++++++------ sabry_build/README.md | 2 +- sabry_intrnl/README.md | 2 +- sabry_procmacro/README.md | 2 +- sabry_procmacro_impl/README.md | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9e1d672..7b79f09 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,13 @@ members = ["sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl"] exclude = ["examples"] [workspace.dependencies] -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.3" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.3" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.3" } -sabry_build = { path = "sabry_build", version = "0.0.3" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.4" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.4" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.4" } +sabry_build = { path = "sabry_build", version = "0.0.4" } [workspace.package] -version = "0.0.3" +version = "0.0.4" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] diff --git a/README.md b/README.md index 768863f..885c0d0 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ The only need is the dependency #Cargo.toml [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` And a proc-macro ```rust @@ -154,7 +154,7 @@ Depend on sabry # Cargo.toml [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` And create a style scope wherever you want: ```rust @@ -194,10 +194,10 @@ To be able to compile all styles sabry also needs the *build* feature flag: # Cargo.toml [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} [build-dependencies] -sabry = {version = "0.0.2", features = ["build"]} +sabry = {version = "0.0.4", features = ["build"]} ``` > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. @@ -338,10 +338,10 @@ So, if you're on leptos, and don't mind to take this approach, I'd highly recomm # Cargo.toml [dependencies] -sabry = {version = "0.0.2", features = ["lepty-scoping"]} +sabry = {version = "0.0.4", features = ["lepty-scoping"]} [build-dependencies] -sabry = {version = "0.0.2", features = ["build", "lepty-scoping"]} +sabry = {version = "0.0.4", features = ["build", "lepty-scoping"]} ``` ```rust diff --git a/sabry_build/README.md b/sabry_build/README.md index 6171d6f..217437d 100644 --- a/sabry_build/README.md +++ b/sabry_build/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md index c67c372..8e5b154 100644 --- a/sabry_intrnl/README.md +++ b/sabry_intrnl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md index 93779e0..02c5683 100644 --- a/sabry_procmacro/README.md +++ b/sabry_procmacro/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md index e442bb3..b0a825c 100644 --- a/sabry_procmacro_impl/README.md +++ b/sabry_procmacro_impl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` From 8939a2dde9d03f99208a531311189afe486891bd Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Wed, 30 Apr 2025 17:36:24 +0500 Subject: [PATCH 070/184] breaking: sync with latest proc_macro function signatures on nightly. Shall break with nightly before 2025-04-(~28). --- sabry_procmacro/src/lib.rs | 12 ++++++++++-- sabry_procmacro_impl/Cargo.toml | 1 - 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index 71136a5..98f056a 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -1,6 +1,8 @@ #![doc = include_str!("../README.md")] #![cfg_attr(feature = "nightly", feature(proc_macro_span))] +use std::str::FromStr; + use cfg_if::cfg_if; use proc_macro::TokenStream; use sabry_procmacro_impl::impls::{ @@ -39,7 +41,10 @@ pub fn scssy(input: TokenStream) -> TokenStream { cfg_if! { if #[cfg(feature = "nightly")] { use proc_macro::Span; - let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); + use std::path::PathBuf; + let source_path = Some(PathBuf::from_str( + &Span::call_site().file()).expect("&str to be Infallible converted into PathBuf") + ); } else { let source_path = None; } @@ -109,7 +114,10 @@ pub fn styly(input: TokenStream) -> TokenStream { cfg_if! { if #[cfg(feature = "nightly")] { use proc_macro::Span; - let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); + use std::path::PathBuf; + let source_path = Some(PathBuf::from_str( + &Span::call_site().file()).expect("&str to be Infallible converted into PathBuf") + ); } else { let source_path = None; } diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index e121b3f..8e468f6 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -10,7 +10,6 @@ license.workspace = true [dependencies] sabry_intrnl = { workspace = true } - syn = { version = "^2", features = ["parsing"] } quote = { version = "^1" } proc-macro2 = { version = "^1", features = ["span-locations"] } From 247774d9a4587800b918664c75bd4620663c5d03 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Wed, 30 Apr 2025 17:37:43 +0500 Subject: [PATCH 071/184] chore: Release --- Cargo.toml | 10 +++++----- README.md | 12 ++++++------ sabry_build/README.md | 2 +- sabry_intrnl/README.md | 2 +- sabry_procmacro/README.md | 2 +- sabry_procmacro_impl/README.md | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7b79f09..595e861 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,13 @@ members = ["sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl"] exclude = ["examples"] [workspace.dependencies] -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.4" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.4" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.4" } -sabry_build = { path = "sabry_build", version = "0.0.4" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.5" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.5" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.5" } +sabry_build = { path = "sabry_build", version = "0.0.5" } [workspace.package] -version = "0.0.4" +version = "0.0.5" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] diff --git a/README.md b/README.md index 885c0d0..443dbec 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ The only need is the dependency #Cargo.toml [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` And a proc-macro ```rust @@ -154,7 +154,7 @@ Depend on sabry # Cargo.toml [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` And create a style scope wherever you want: ```rust @@ -194,10 +194,10 @@ To be able to compile all styles sabry also needs the *build* feature flag: # Cargo.toml [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} [build-dependencies] -sabry = {version = "0.0.4", features = ["build"]} +sabry = {version = "0.0.5", features = ["build"]} ``` > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. @@ -338,10 +338,10 @@ So, if you're on leptos, and don't mind to take this approach, I'd highly recomm # Cargo.toml [dependencies] -sabry = {version = "0.0.4", features = ["lepty-scoping"]} +sabry = {version = "0.0.5", features = ["lepty-scoping"]} [build-dependencies] -sabry = {version = "0.0.4", features = ["build", "lepty-scoping"]} +sabry = {version = "0.0.5", features = ["build", "lepty-scoping"]} ``` ```rust diff --git a/sabry_build/README.md b/sabry_build/README.md index 217437d..4f8f220 100644 --- a/sabry_build/README.md +++ b/sabry_build/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md index 8e5b154..2e53d53 100644 --- a/sabry_intrnl/README.md +++ b/sabry_intrnl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md index 02c5683..0944f74 100644 --- a/sabry_procmacro/README.md +++ b/sabry_procmacro/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md index b0a825c..d92d7ed 100644 --- a/sabry_procmacro_impl/README.md +++ b/sabry_procmacro_impl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` From 80890500c9539ce7a2d1c52c887d118ff51bbeb6 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Thu, 8 May 2025 19:42:06 +0500 Subject: [PATCH 072/184] breaking: gate 'styly!(const scope...' behind the const-scoping feature.\nFor some reason it did only become a problem recently, but it appears that having lightningcss/grass unconditionally will break WASM builds by having getrandom dependency --- Cargo.toml | 25 +++++++++ README.md | 4 +- examples/leptos-components/Cargo.toml | 16 +++--- sabry_build/Cargo.toml | 16 +++--- sabry_intrnl/Cargo.toml | 31 +++++++---- sabry_intrnl/src/compiler/mod.rs | 27 +++++----- sabry_intrnl/src/config/mod.rs | 1 + sabry_intrnl/src/scoper/hash.rs | 13 +++-- sabry_intrnl/src/scoper/mod.rs | 16 +++--- sabry_intrnl/src/syntax/ostrta.rs | 2 + sabry_procmacro/Cargo.toml | 5 +- sabry_procmacro_impl/Cargo.toml | 17 +++--- sabry_procmacro_impl/src/impls/scssy.rs | 2 +- sabry_procmacro_impl/src/impls/styly.rs | 72 ++++++++++++++----------- 14 files changed, 150 insertions(+), 97 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 595e861..8742652 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,10 +4,33 @@ members = ["sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl"] exclude = ["examples"] [workspace.dependencies] +## Workspace sabry_intrnl = { path = "sabry_intrnl", version = "0.0.5" } sabry_procmacro = { path = "sabry_procmacro", version = "0.0.5" } sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.5" } sabry_build = { path = "sabry_build", version = "0.0.5" } +## Package +## Package +lightningcss.version = "1.0.0-alpha.65" +lightningcss.default-features = false +grass.version = "^0.13" +grass.default-features = false +raffia.version = "^0.9" +#/ +serde.version = "^1" +toml.version = "^0.8" +blake3.version = "^1" +base64.version = "^0.22" +regex.version = "^1" +#/ +itertools.version = "^0.14" +walkdir.version = "^2" +#/ +cfg-if.version = "^1" +thiserror.version = "^2" +proc-macro2.version = "^1" +quote.version = "^1" +syn.version = "^2" [workspace.package] version = "0.0.5" @@ -31,6 +54,7 @@ license.workspace = true publish.workspace = true [dependencies] +## Workspace sabry_procmacro = { workspace = true, optional = true } sabry_build = { workspace = true, optional = true } sabry_intrnl = { workspace = true } @@ -42,6 +66,7 @@ insta = { version = "^1.41", features = ["glob"] } [features] default = ["procmacro"] lepty-scoping = ["sabry_intrnl/lepty-scoping"] +const-scoping = ["sabry_procmacro?/const-compile"] procmacro = ["dep:sabry_procmacro"] build = ["dep:sabry_build"] net-files = ["sabry_build/net-files"] diff --git a/README.md b/README.md index 443dbec..857ad5e 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,6 @@ > > "master" branch is what's currently on crates.io > -> each version ever been on crates.io (except the latest release) is available in "vX.X.X" branch -> -> the latest-trashy state is in the "window" branch [![Crates.io](https://img.shields.io/crates/v/sabry.svg)](https://crates.io/crates/sabry) [![Docs.rs](https://img.shields.io/docsrs/sabry/latest.svg)](https://docs.rs/sabry) @@ -586,6 +583,7 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: ```rust +// Requires `const-scoping` feature sabry::styly!(const scope "tests/assets/mixin-module.scss"); ``` Which results in following: diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml index 4b9f858..9e8b6d6 100644 --- a/examples/leptos-components/Cargo.toml +++ b/examples/leptos-components/Cargo.toml @@ -13,19 +13,19 @@ leptos = { version = "^0.7" } leptos_meta = { version = "^0.7" } leptos_router = { version = "^0.7" } -sabry = {path = "../../", features = ["lepty-scoping"]} +sabry = { path = "../../", features = ["lepty-scoping", "const-scoping"] } [build-dependencies] -sabry = {path = "../../", features = ["build", "lepty-scoping"]} -define-styles = {path = "../define-styles"} +sabry = { path = "../../", features = [ + "build", + "lepty-scoping", + "const-scoping", +] } +define-styles = { path = "../define-styles" } [features] hydrate = ["leptos/hydrate"] -ssr = [ - "leptos/ssr", - "leptos_meta/ssr", - "leptos_router/ssr", -] +ssr = ["leptos/ssr", "leptos_meta/ssr", "leptos_router/ssr"] [package.metadata.sabry] css.minify = true diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index ce81bbc..dfa13e8 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -9,13 +9,17 @@ authors.workspace = true license.workspace = true [dependencies] -sabry_intrnl = { workspace = true } -sabry_procmacro_impl = { workspace = true } +sabry_intrnl.workspace = true +sabry_intrnl.features = ["compile", "scope"] +sabry_procmacro_impl.workspace = true +sabry_procmacro_impl.features = ["const-compile"] -syn = { version = "^2", features = ["visit", "derive", "parsing", "full"] } -proc-macro2 = { version = "^1", features = ["span-locations"] } -thiserror = { version = "^2" } -walkdir = { version = "^2" } +syn.workspace = true +syn.features = ["visit", "derive", "parsing", "full"] +proc-macro2.workspace = true +proc-macro2.features = ["span-locations"] +thiserror.workspace = true +walkdir.workspace = true [features] net-files = [] diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 85d7a9f..b39c615 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -9,21 +9,30 @@ authors.workspace = true license.workspace = true [dependencies] -syn = { version = "^2" } -raffia = { version = "^0.9" } -regex = { version = "^1" } -grass = { version = "^0.13" } -lightningcss = { version = "1.0.0-alpha.65" } -blake3 = { version = "^1.5" } -base64 = { version = "^0.22" } +syn.workspace = true +raffia.workspace = true +regex.workspace = true +regex.optional = true +grass.workspace = true +grass.optional = true +lightningcss.workspace = true +lightningcss.features = ["grid"] +lightningcss.optional = true +blake3.workspace = true +blake3.optional = true +base64.workspace = true +base64.optional = true -thiserror = { version = "^2" } -serde = { version = "^1", features = ["derive"] } -toml = { version = "^0.8" } -cfg-if = { version = "^1" } +thiserror.workspace = true +serde.workspace = true +serde.features = ["derive"] +toml.workspace = true +cfg-if.workspace = true [features] lepty-scoping = [] +scope = ["dep:blake3", "dep:base64", "dep:regex"] +compile = ["dep:lightningcss", "dep:grass"] [package.metadata.docs.rs] all-features = true diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 374d527..adc398f 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -1,16 +1,8 @@ -use std::fmt::Debug; - -use lightningcss::{ - error::{MinifyErrorKind, PrinterErrorKind}, - printer::PrinterOptions, - stylesheet::MinifyOptions, - targets::Targets, -}; - -use crate::{config::SabryConfig, syntax::ostrta::OneSyntaxToRuleThemAll}; +use crate::config::SabryConfig; /// Convenience wrapper on Grass and Lightningcss pub struct CompilerAdapter { + #[allow(dead_code)] // without 'compile' feature, still want to set this config: SabryConfig, } @@ -21,9 +13,10 @@ impl CompilerAdapter { /// Compile given SASS/SCSS into CSS /// with respect to self.config + #[cfg(feature = "compile")] pub fn compile_module( &self, - syntax: OneSyntaxToRuleThemAll, + syntax: crate::syntax::ostrta::OneSyntaxToRuleThemAll, code: &str, ) -> Result<String, SabryCompilerError> { let options = grass::Options::from(&self.config).input_syntax(syntax.into()); @@ -35,7 +28,10 @@ impl CompilerAdapter { /// Perform lightningcss transformations on given css /// with respect to self.config.css.minify on minification + #[cfg(feature = "compile")] pub fn lightningcss(&self, css: &str) -> Result<String, SabryCompilerError> { + use lightningcss::{printer::PrinterOptions, stylesheet::MinifyOptions, targets::Targets}; + let mut lightsheet = match lightningcss::stylesheet::StyleSheet::parse( css, lightningcss::stylesheet::ParserOptions::default(), @@ -81,6 +77,7 @@ impl CompilerAdapter { } } +#[cfg(feature = "compile")] impl From<&SabryConfig> for grass::Options<'_> { fn from(config: &SabryConfig) -> Self { let mut options = grass::Options::default(); @@ -95,14 +92,15 @@ impl From<&SabryConfig> for grass::Options<'_> { } } +#[cfg(feature = "compile")] #[derive(thiserror::Error)] pub enum SabryCompilerError { #[error("Could not compile into CSS with grass")] GrassCompile(#[from] Box<grass::Error>), #[error("Could not print compiled CSS with lightningcss")] - LightPrint(#[from] lightningcss::error::Error<PrinterErrorKind>), + LightPrint(#[from] lightningcss::error::Error<lightningcss::error::PrinterErrorKind>), #[error("Could not minify CSS with lightningcss")] - LightMinify(#[from] lightningcss::error::Error<MinifyErrorKind>), + LightMinify(#[from] lightningcss::error::Error<lightningcss::error::MinifyErrorKind>), #[error("Could not parse CSS with lightningcss")] LightParse { kind: String, @@ -110,7 +108,8 @@ pub enum SabryCompilerError { }, } -impl Debug for SabryCompilerError { +#[cfg(feature = "compile")] +impl std::fmt::Debug for SabryCompilerError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let explain = match self { Self::LightPrint(e) => format!( diff --git a/sabry_intrnl/src/config/mod.rs b/sabry_intrnl/src/config/mod.rs index 7fdfa13..dfa13bc 100644 --- a/sabry_intrnl/src/config/mod.rs +++ b/sabry_intrnl/src/config/mod.rs @@ -199,6 +199,7 @@ impl SabryLightTargets { } } +#[cfg(feature = "compile")] impl From<SabryLightTargets> for lightningcss::targets::Browsers { fn from(value: SabryLightTargets) -> Self { Self { diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index 21a875c..df21766 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -1,15 +1,14 @@ -use base64::Engine; - -use crate::config::SabryHashConfig; - -use super::{apply_basic_rusty_member_gen_rules, ArbitraryScope}; - /// Convenience wrapper for String-being-a-hash #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ScopeHash(String); impl ScopeHash { - pub fn new(scope: &ArbitraryScope, config: &SabryHashConfig) -> Self { + #[cfg(feature = "scope")] + pub fn new(scope: &super::ArbitraryScope, config: &crate::config::SabryHashConfig) -> Self { + use base64::Engine; + + use crate::scoper::apply_basic_rusty_member_gen_rules; + let mut hasher = blake3::Hasher::new(); if config.use_scope_name { diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 24696d3..408b417 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -3,12 +3,8 @@ use std::fmt::Debug; use cfg_if::cfg_if; use hash::ScopeHash; use raffia::{Span, Spanned}; -use regex::Regex; -use crate::{ - config::SabryHashConfig, - syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}, -}; +use crate::syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}; pub mod hash; @@ -56,7 +52,11 @@ impl<'s> ArbitraryScope<'s> { /// Consume arbitrary scope and create a [HashedScope] in its basis /// /// This function calls [HashedScope::new] under the hood - pub fn hashed(self, config: &SabryHashConfig) -> Result<HashedScope<'s>, ScopeError> { + #[cfg(feature = "scope")] + pub fn hashed( + self, + config: &crate::config::SabryHashConfig, + ) -> Result<HashedScope<'s>, ScopeError> { let hash = ScopeHash::new(&self, config); HashedScope::new(hash, self) } @@ -332,6 +332,7 @@ impl ScopedSelector { } /// Generate rusty member ident based on selector type and CSS ident + #[cfg(feature = "scope")] pub fn gen_rusty_ident(&self) -> Option<syn::Ident> { let arb = &self.as_arbitrary().ident; let basic = apply_basic_rusty_member_gen_rules(arb); @@ -401,8 +402,9 @@ impl ScopedSelector { } } +#[cfg(feature = "scope")] pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { - let omit_regex = Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") + let omit_regex = regex::Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") .expect("BUG: can not build omition regex for rusty member generation"); // omit forbidden chars diff --git a/sabry_intrnl/src/syntax/ostrta.rs b/sabry_intrnl/src/syntax/ostrta.rs index 6dd4f69..8d6826c 100644 --- a/sabry_intrnl/src/syntax/ostrta.rs +++ b/sabry_intrnl/src/syntax/ostrta.rs @@ -34,6 +34,7 @@ impl TryFrom<raffia::Syntax> for OneSyntaxToRuleThemAll { } } +#[cfg(feature = "compile")] impl TryFrom<grass::InputSyntax> for OneSyntaxToRuleThemAll { type Error = (); fn try_from(value: grass::InputSyntax) -> Result<Self, Self::Error> { @@ -54,6 +55,7 @@ impl From<OneSyntaxToRuleThemAll> for raffia::Syntax { } } +#[cfg(feature = "compile")] impl From<OneSyntaxToRuleThemAll> for grass::InputSyntax { fn from(value: OneSyntaxToRuleThemAll) -> Self { match value { diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index fb95447..12758de 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -12,11 +12,12 @@ license.workspace = true proc-macro = true [dependencies] -sabry_procmacro_impl = { workspace = true } -cfg-if = { version = "^1" } +sabry_procmacro_impl.workspace = true +cfg-if.workspace = true [features] nightly = [] +const-compile = ["sabry_procmacro_impl/const-compile"] [package.metadata.docs.rs] all-features = true diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index 8e468f6..ae8189a 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -9,15 +9,20 @@ authors.workspace = true license.workspace = true [dependencies] -sabry_intrnl = { workspace = true } -syn = { version = "^2", features = ["parsing"] } -quote = { version = "^1" } -proc-macro2 = { version = "^1", features = ["span-locations"] } -regex = { version = "^1" } -itertools = { version = "^0.14" } +sabry_intrnl.workspace = true +sabry_intrnl.features = ["scope"] +syn.workspace = true +syn.features = ["parsing"] +quote.workspace = true +proc-macro2.workspace = true +proc-macro2.features = ["span-locations"] +regex.workspace = true +itertools.workspace = true +cfg-if.workspace = true [features] nightly = [] +const-compile = ["sabry_intrnl/compile"] [package.metadata.docs.rs] all-features = true diff --git a/sabry_procmacro_impl/src/impls/scssy.rs b/sabry_procmacro_impl/src/impls/scssy.rs index 0684b70..ddbee04 100644 --- a/sabry_procmacro_impl/src/impls/scssy.rs +++ b/sabry_procmacro_impl/src/impls/scssy.rs @@ -36,7 +36,7 @@ pub fn scssy_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok } let sourcesass = code.to_string(); - let macro_doc = format!("Arbitrary {:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `buildy` at build time", syntax); + let macro_doc = format!("Arbitrary {syntax:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `buildy` at build time"); quote! { #[doc = #macro_doc] diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 7e9d68d..a0a7e23 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -1,10 +1,10 @@ use std::path::PathBuf; +use cfg_if::cfg_if; use itertools::Itertools; use proc_macro2::{Span, TokenStream}; use quote::quote; use sabry_intrnl::{ - compiler::CompilerAdapter, config::SabryConfig, scoper::{apply_basic_rusty_member_gen_rules, ArbitraryScope, ScopedSelector}, }; @@ -38,10 +38,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok Err(e) => { return syn::Error::new( Span::call_site(), - format!( - "Could not read sabry configuration required by this macro: {:?}", - e - ), + format!("Could not read sabry configuration required by this macro: {e:?}",), ) .to_compile_error() } @@ -63,7 +60,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok Err(e) => { return syn::Error::new( Span::call_site(), - format!("Could not generate scope: {:?}", e), + format!("Could not generate scope: {e:?}"), ) .to_compile_error() } @@ -127,7 +124,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok }) }) .map(|(name, ident, html, css)| { - let docs = format!("'{:?}' {}. CSS selector '{}'", ident, name, css); + let docs = format!("'{ident:?}' {name}. CSS selector '{css}'"); quote! { #[doc = #docs] #[allow(non_upper_case_globals)] @@ -142,33 +139,44 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok let wrp_docs = format!("wrapper class for '{}' scope. If you have any tagname selectors - they should live as children of element with this class applied.", &scope_ident); if constant { - let compiler = CompilerAdapter::new(config.clone()); - let css = match compiler.compile_module(ms.syntax.0, &scope.hashed_code) { - Ok(c) => c, - Err(e) => { - return syn::Error::new( - ms.code.span, - format!("Could not compile const inline: {e:?}"), + cfg_if! { + if #[cfg(feature = "const-compile")] { + use sabry_intrnl::compiler::CompilerAdapter; + let compiler = CompilerAdapter::new(config.clone()); + let css = match compiler.compile_module(ms.syntax.0, &scope.hashed_code) { + Ok(c) => c, + Err(e) => { + return syn::Error::new( + ms.code.span, + format!("Could not compile const inline: {e:?}"), + ) + .to_compile_error() + } + }; + + let const_docs = format!("The compiled CSS style for {} scope", &scope_ident); + let const_wrapper_ident = syn::parse_str::<Ident>( + format!("{}_CSS", &scope_ident.to_string().to_uppercase()).as_str(), ) - .to_compile_error() - } - }; + .expect("BUG: We just converted valid Ident to string and uppercased"); - let const_docs = format!("The compiled CSS style for {} scope", &scope_ident); - let const_wrapper_ident = syn::parse_str::<Ident>( - format!("{}_CSS", &scope_ident.to_string().to_uppercase()).as_str(), - ) - .expect("BUG: We just converted valid Ident to string and uppercased"); - - quote! { - #[doc = #const_docs] - #scope_vis const #const_wrapper_ident: &str = #css ; - #[doc = #wrp_docs] - #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; - #[doc = #mod_docs] - #scope_vis mod #scope_ident { - #(#scope_members)* - #(#special_nesting_members)* + quote! { + #[doc = #const_docs] + #scope_vis const #const_wrapper_ident: &str = #css ; + #[doc = #wrp_docs] + #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; + #[doc = #mod_docs] + #scope_vis mod #scope_ident { + #(#scope_members)* + #(#special_nesting_members)* + } + } + } else { + return syn::Error::new( + Span::call_site(), + "`styly!(const scope...` requires `experimental-const-scoping` feature flag", + ) + .to_compile_error(); } } } else { From eacaf3b163b8e90ffa6efee07efed6f608d10659 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Thu, 8 May 2025 19:52:13 +0500 Subject: [PATCH 073/184] fix: update doctests --- .github/workflows/cbt.yml | 3 +-- README.md | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index 23416dd..ad3f3f1 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -17,13 +17,12 @@ jobs: matrix: toolchain: - stable - - nightly steps: - uses: actions/checkout@v4 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - run: cargo build --verbose - run: cargo test --verbose --all - - run: cargo test --verbose --all --all-features + - run: cargo test --verbose --all --features "const-scoping lepty-scoping" build_examples: name: Sabry - latset - examples diff --git a/README.md b/README.md index 857ad5e..29b42b7 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,10 @@ Compile all the sweet SASS/SCSS into the optimized CSS bundle, ship it in CSS sh ```rust sabry::styly!(cssbundle {".c1 {color: white;}"}); +``` + +```rust,ignore +// requires `const-scoping` feature sabry::styly!(const binary {".c2 {color: black;}"}); ``` @@ -158,7 +162,7 @@ And create a style scope wherever you want: // breadbadgelist.rs use sabry::styly; -styly!(const styles {" +styly!(styles {" .badges { display: flex; &__list { @@ -173,9 +177,7 @@ styly!(const styles {" /* Now you can use all scoped selectors: */ let badges_scoped_class = styles::badges; let wolf_scoped_id = styles::thewolf; -let badges__list_scoped_class = styles::___list(styles::badges); ``` -> That `const` usage is covered in the [following](#constant-styly-scopes) section. In this example we dont invoke sabry build-magic, so, to be as close to real life as possible, I used a const. Every selector, if that does make sense, now available for you as a member of `styles` scope. In this example - `styles::badges`, `styles::thewolf` and `styles::_list()`. More about scoping and member names you can read [here](#styly-scopes). @@ -267,6 +269,7 @@ pub const fn css() -> &'static str { // utils.rs use sabry::styly; +// required `const-scoping` feature styly!(pub const scope:scss {" .whatever { &__code {} @@ -274,6 +277,7 @@ styly!(pub const scope:scss {" } "}); +// requires `const-scoping` feature styly!(pub const another:scss {" .whatever { &__code {} @@ -290,6 +294,7 @@ pub const fn css() -> &'static str { // form.rs use sabry::styly; +// requires `const-scoping` feature styly!(pub const scope:scss {" .whatever { &__code {} @@ -297,6 +302,7 @@ styly!(pub const scope:scss {" } "}); +// requires `const-scoping` feature styly!(pub const another:scss {" .whatever { &__code {} @@ -539,6 +545,9 @@ use sabry::styly; styly!(private_fox {".fur {color: red; &-dark {color: black;}}"}); styly!(pub public_fox {".fur {color: red; &-dark {color: black;}}"}); +``` +```rust,ignore +// requires `const-scoping` feature styly!(pub const pub_compiletime_fox:sass {" .fur color: red @@ -546,6 +555,7 @@ styly!(pub const pub_compiletime_fox:sass {" color: black "}); ``` + Every of those calls will produce the styling scope as a module. Differences are explained right below. In general the scope does look like this: @@ -582,7 +592,7 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: -```rust +```rust,ignore // Requires `const-scoping` feature sabry::styly!(const scope "tests/assets/mixin-module.scss"); ``` @@ -720,12 +730,15 @@ Not any valid CSS selector is a valid rust identifier. In general this section s **lepty-scoping** - overhauls the scope generation logic, best suitable for the leptos. Check out the [section](#leptos-specials) and an [example](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum) +**const-scoping** - unlocks `styly!(const scope...` compile-time SASS->CSS generation, which seems to break WASM builds without special treatment (https://docs.rs/getrandom/latest/getrandom/#webassembly-support). Idk why, but it started to happen just recently + **nightly** - allows relative path selection with `scssy!` and `styly!` macros. However rust-analyzer will raise false-positives for reachable files as well. ## WIP *(sorted by my own priority)*, "dones" are excluded +- [ ] Why does `const scope` break WASM build? Everything was fine untill recent. This feature isn't top-priority, I dont personally use it, but still curious - [x] Somehow achieve the autocompletion for scopes. The problem is explained in details [here](https://github.com/yiffyrusdev/sabry/issues/2) - [x] some weird unrelated stuff I can see in autocompletion (still investigating btw) - [ ] Support for direct CSS syntax From 293de0a1d171cf645746d154648c60e2e49471a4 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Thu, 8 May 2025 19:54:32 +0500 Subject: [PATCH 074/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8742652..95acb73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,10 +5,10 @@ exclude = ["examples"] [workspace.dependencies] ## Workspace -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.5" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.5" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.5" } -sabry_build = { path = "sabry_build", version = "0.0.5" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6-rc.1" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6-rc.1" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6-rc.1" } +sabry_build = { path = "sabry_build", version = "0.0.6-rc.1" } ## Package ## Package lightningcss.version = "1.0.0-alpha.65" @@ -33,7 +33,7 @@ quote.version = "^1" syn.version = "^2" [workspace.package] -version = "0.0.5" +version = "0.0.6-rc.1" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From ee1b401f4755ad6ae236c372aba0b465574970eb Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 12 Sep 2025 14:15:47 +0500 Subject: [PATCH 075/184] refactor!: remove `lepty-scoping` feature and make its behaviour the default; deprecate scope members; bump MSRV; bump deps --- .github/workflows/cbt.yml | 64 ++++----- Cargo.toml | 16 +-- README.md | 178 +++++------------------- examples/define-styles/Cargo.toml | 4 +- examples/leptos-axum/Cargo.toml | 28 ++-- examples/leptos-components/Cargo.toml | 10 +- examples/use-styles/Cargo.toml | 10 +- sabry_intrnl/Cargo.toml | 2 - sabry_intrnl/src/config/mod.rs | 20 +-- sabry_intrnl/src/scoper/hash.rs | 7 +- sabry_intrnl/src/scoper/mod.rs | 142 ++++++++----------- sabry_intrnl/src/syntax/mod.rs | 124 +++++++++++------ sabry_intrnl/src/syntax/ostrta.rs | 11 +- sabry_procmacro_impl/Cargo.toml | 1 + sabry_procmacro_impl/src/impls/styly.rs | 37 ++++- 15 files changed, 282 insertions(+), 372 deletions(-) diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index ad3f3f1..97fdacb 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -1,40 +1,40 @@ name: cargo basic build-test on: - push: - branches: ["window", "master"] - pull_request: - branches: ["window"] + push: + branches: ["window", "master"] + pull_request: + branches: ["window"] env: - CARGO_TERM_COLOR: always + CARGO_TERM_COLOR: always jobs: - build_and_test: - name: Sabry - latest - runs-on: ubuntu-latest - strategy: - matrix: - toolchain: - - stable - steps: - - uses: actions/checkout@v4 - - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - - run: cargo build --verbose - - run: cargo test --verbose --all - - run: cargo test --verbose --all --features "const-scoping lepty-scoping" + build_and_test: + name: Sabry - latest + runs-on: ubuntu-latest + strategy: + matrix: + toolchain: + - stable + steps: + - uses: actions/checkout@v4 + - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} + - run: cargo build --verbose + - run: cargo test --verbose --all + - run: cargo test --verbose --all --features "const-scoping" - build_examples: - name: Sabry - latset - examples - runs-on: ubuntu-latest - strategy: - matrix: - example: - - define-styles - - use-styles - - leptos-axum - steps: - - uses: actions/checkout@v4 - - run: rustup update nightly && rustup default nightly - - run: cd examples/${{ matrix.example }} - - run: cargo build --verbose + build_examples: + name: Sabry - latset - examples + runs-on: ubuntu-latest + strategy: + matrix: + example: + - define-styles + - use-styles + - leptos-axum + steps: + - uses: actions/checkout@v4 + - run: rustup update nightly && rustup default nightly + - run: cd examples/${{ matrix.example }} + - run: cargo build --verbose diff --git a/Cargo.toml b/Cargo.toml index 95acb73..d3fa278 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,16 +9,15 @@ sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6-rc.1" } sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6-rc.1" } sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6-rc.1" } sabry_build = { path = "sabry_build", version = "0.0.6-rc.1" } -## Package -## Package -lightningcss.version = "1.0.0-alpha.65" +#/ +lightningcss.version = "1.0.0-alpha.67" lightningcss.default-features = false grass.version = "^0.13" grass.default-features = false -raffia.version = "^0.9" +raffia.version = "^0.11" #/ serde.version = "^1" -toml.version = "^0.8" +toml.version = "^0.9" blake3.version = "^1" base64.version = "^0.22" regex.version = "^1" @@ -35,7 +34,7 @@ syn.version = "^2" [workspace.package] version = "0.0.6-rc.1" edition = "2021" -rust-version = "1.78" +rust-version = "1.88" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] repository = "https://github.com/yiffyrusdev/sabry" license = "MIT" @@ -60,12 +59,11 @@ sabry_build = { workspace = true, optional = true } sabry_intrnl = { workspace = true } [dev-dependencies] -leptos = { version = "0.7.0-gamma3" } -insta = { version = "^1.41", features = ["glob"] } +leptos = { version = "^0.8" } +insta = { version = "^1", features = ["glob"] } [features] default = ["procmacro"] -lepty-scoping = ["sabry_intrnl/lepty-scoping"] const-scoping = ["sabry_procmacro?/const-compile"] procmacro = ["dep:sabry_procmacro"] build = ["dep:sabry_build"] diff --git a/README.md b/README.md index 29b42b7..5c47c88 100644 --- a/README.md +++ b/README.md @@ -25,17 +25,6 @@ sabry::scssy!(tokens {"@mixin colored{color: red;}"}); <hr/> -Get the *(almost)* proper autocompletion for your scope from rust-analyzer - -```rust -sabry::styly!(scope {".cls1{} #id1{}"}); -/* autocompleted for you */ -scope::cls1; -scope::theid1; -``` - -<hr/> - Code your SASS in separate files to get proper syntax highlighting, or do sass-in-the-rust to keep things in one place ```rust @@ -71,13 +60,23 @@ Keep things as private and modular as you wish ```rust sabry::styly!(pub cats "tests/assets/mixin-module.scss"); -sabry::styly!(dogs {"#howl {border: none;}"}); +sabry::styly!(dogs {".howl {border: none;}"}); ``` -```rust,ignore +```html /// something like render function { - <div class={cats::meow}> - <ul id={dogs::thehowl}></ul> + <div class={concatcp!("meow ", CATS)}> + <ul class={concatcp!("howl ", DOGS)}></ul> + </div> +} +``` +```html +/// or even better with leptos +view!{class=CATS + <div class="meow"> + {move || view!{class=DOGS, + <ul class="howl"></ul> + }} </div> } ``` @@ -122,7 +121,7 @@ The only need is the dependency #Cargo.toml [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` And a proc-macro ```rust @@ -155,7 +154,7 @@ Depend on sabry # Cargo.toml [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` And create a style scope wherever you want: ```rust @@ -173,18 +172,18 @@ styly!(styles {" color: white; } "}); - -/* Now you can use all scoped selectors: */ -let badges_scoped_class = styles::badges; -let wolf_scoped_id = styles::thewolf; ``` -Every selector, if that does make sense, now available for you as a member of `styles` scope. In this example - `styles::badges`, `styles::thewolf` and `styles::_list()`. More about scoping and member names you can read [here](#styly-scopes). +```html +<ul class={concatcp!("badges ", STYLES)}> + <li class={STYLES} id="wolf"> + "HOOOOWL!" + </li> +</ul> +``` ### Use styles earlier created in another crate -> **Tip** | If you use [leptos](https://github.com/leptos-rs/leptos) - check [this](#leptos-specials) section as well - The combination of previous two, with some additional work to do and some extra sugar to enjoy. Sabry is needed as both dependency and build-dependency. @@ -193,10 +192,10 @@ To be able to compile all styles sabry also needs the *build* feature flag: # Cargo.toml [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} [build-dependencies] -sabry = {version = "0.0.5", features = ["build"]} +sabry = {version = "0.0.6", features = ["build"]} ``` > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. @@ -318,81 +317,6 @@ So I'd say - do the const function back-propogation and let the consumer decide </details> -### Leptos specials - -With [leptos](https://github.com/leptos-rs/leptos) framework you can do the trick to apply some class to most of HtmlElements for the entire component/island: - -```rust -use leptos::prelude::*; - -#[component] -fn component() -> impl IntoView { - view! {class="cls1", /* <- here */ - <h1>"Head"</h1> - <p>"text"</p> - } -} -``` -... and have "cls1" on both `h1` and `p` auto-assigned. Isn't that cool? - -So, if you're on leptos, and don't mind to take this approach, I'd highly recommend turning the *lepty-scoping* feature on: - -```toml -# Cargo.toml - -[dependencies] -sabry = {version = "0.0.5", features = ["lepty-scoping"]} - -[build-dependencies] -sabry = {version = "0.0.5", features = ["build", "lepty-scoping"]} -``` - -```rust -use leptos::prelude::*; -use sabry::styly; - -styly!(scope {" - // assuming we have tokens!() macro generated by `scssy!`, which is handled by `buildy` - @use 'tokens'; - h1 { - @include tokens.sectionhead(); - img { - @include tokens.sectionimg(); - } - } - .breadcumbs { - @include tokens.badgelist(); - &__item { - @include tokens.badge(secondary); - } - } -"}); - -#[component] -fn component() -> impl IntoView { - view! {class=SCOPE, - <h1> - "Head" - <img src="whatever"/> - </h1> - <ul class="breadcumbs"> - <li class="breadcumbs__item"> - "Home page" - </li> - </ul> - } -} -``` - -That will perform *much* better: - -- All scope members - like `scope::breadcumbs` - wont contain repeating scope hash, just the original class/id selector - - So instead of scope members (which [aren't](https://github.com/yiffyrusdev/sabry/issues/2) autocompleted for sass-in-the-rust yet) you could just write bare selectors, as you do, for example, with svelte: `<li class="breadcumbs__item">` - - You'll still have the rusty mod generated: its just the `scope::breadcumbs` is the `"breadcumbs"` without the hash -- You will not encounter [the catch](#scoping) with nested tagname selectors - -Also, this isn't really exclusive leptos-supporting feature. It just changes scoping behavour. - ## Configuration Sabry configuration lives in `[package.metadata.sabry]` table of the manifest file. @@ -562,8 +486,8 @@ In general the scope does look like this: ```rust,ignore const FOX: &str = "J9k_s9"; mod fox { - pub const fur: &str = "J9k_s9 fur"; - pub fn _dark(c: &str) -> String {format!("{c}-dark")} + #[deprecated(since = "0.0.6", note = "will remove")] + pub const fur: &str = "fur J9k_s9"; } ``` @@ -572,9 +496,6 @@ mod fox { Styly macro itself does not generate the scope. It is done in the `sabry_intrnl::scoper`. However, as a result, you will have the following: - `const` with the UPPER_CASE name of the scope, which contains its hash -- `mod` with exact scope name which is the scope you're going to use - - for simple selectors, like `.fur` you will have a const members with hashed original selectors to use wherever you need a class/id/etc. - - for parent-selectors like `&-dark` you will have a non-const function, which will create matching the selector from any other. You can read more about scoping and hashing in the [scoping](#scoping) section. @@ -600,7 +521,6 @@ Which results in following: ```rust,ignore const SCOPE: &str = /* scope hash */; const SCOPE_CSS: &str = /* compiled from src/assets/scope.scss */; -mod scope {/* selector collection */} ``` > **There is a catch** | with the `const` modifier macro must compile CSS at compile-time. That results in several game changers: @@ -666,15 +586,15 @@ Exactly this kind of macros is produced by [`scssy!`](#style-definition-with-scs ### Scoping -Sabry handles scoping by restriction or mutation of existing selectors +Sabry handles scoping by restriction of existing selectors with the hash. Hash is calculated for the entire scope by the [`styly!`](#scoping-with-styly) macro. Currently the following types of selectors are scoped: - class - id +- tagname - SASS parent selectors (see below, there is a catch) -- tagname (see below, there is a catch) Sabry does not make difference between top-level and nested selectors, also selector complexity isn't taken into account: sabry simply walks through all compound selectors @@ -683,40 +603,8 @@ and apply scoping for supported ones. Different selector types are scoped differently: - class selectors are restricted with scope hash: `.class` -> `.HASH.class` -- id selector are mutated with scope hash: `#id` -> `#id-HASH` -- tagname selectors are changed into indirect descendance: `div` -> `.HASH div` - -> **There is a catch** | currently tagname selectors are scoped with indirect descendancy -> hash restriction. That means - if you do use tagnames in scoped stylesheets, you have to wrap your markdown -> with `SCOPE` class generated by `styly!` macro. -> -> Also if there are nested tagname selectors - sabry won't take this into account and you'll -> have to wrap them with `SCOPE` class as well -> -> **However** If you are able to apply some class to all html elements you have - like `view!{class=CLASS...}` with Leptos - you could use *lepty-scoping* feature flag for sabry and get rid of this catch! See more [here](#leptos-specials). - -As for **SASS parent selectors**: they are currently handled in different way. Instead of -walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: - -```rust -sabry::styly!(scope {" - .cls1 { - &-dark {} - } -"}); -``` -is something like -```rust,ignore -const SCOPE: &str = "Ut8CskJ"; -mod scope { - pub const cls1: &str = "Ut8CskJ cls1"; - pub fn _dark(c: &str) -> String {format!("{c}-dark")} -} -``` - -So you still can get the scoped variant of `cls1-dark` class: `scope::_dark(scope::cls1)`. - -This isn't very handy, also isn't strict enough, and is a high-priority subject to change. wip. +- id selector are mutated with scope hash: `#id` -> `.HASH#id` +- tagname selectors are changed into indirect descendance: `div` -> `div.HASH` #### Scope member naming rules @@ -763,9 +651,9 @@ If you'd like to lend a paw - feel free to check the [WIP](#wip) section out, or ## MSRV -Sabry passes its own tests on 1.78 nightly/stable. +Sabry passes its own tests on 1.88 nightly/stable. -Examples are on 1.82. +Examples are on 1.88. ## License diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml index 4288abb..e7a8b65 100644 --- a/examples/define-styles/Cargo.toml +++ b/examples/define-styles/Cargo.toml @@ -2,8 +2,8 @@ name = "define-styles" version = "0.0.0" edition = "2021" -rust-version = "1.82" +rust-version = "1.88" publish = false [dependencies] -sabry = {path = "../../", features = ["nightly"]} +sabry = { path = "../../", features = ["nightly"] } diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 659fbf9..162c94a 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "leptos-axum-sabry" version = "0.1.0" -rust-version = "1.82" +rust-version = "1.88" edition = "2021" publish = false @@ -9,31 +9,31 @@ publish = false crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "^0.7" } -leptos_axum = { version = "^0.7", optional = true } -leptos_meta = { version = "^0.7" } -leptos_router = { version = "^0.7" } -axum = { version = "0.7", optional = true } +leptos = { version = "^0.8" } +leptos_axum = { version = "^0.8", optional = true } +leptos_meta = { version = "^0.8" } +leptos_router = { version = "^0.8" } +axum = { version = "0.8", optional = true } console_error_panic_hook = "0.1" tokio = { version = "1", features = ["rt-multi-thread"], optional = true } -tower = { version = "0.4", optional = true } -tower-http = { version = "0.5", features = ["fs"], optional = true } +tower = { version = "0.5", optional = true } +tower-http = { version = "0.6", features = ["fs"], optional = true } wasm-bindgen = "=0.2.96" -thiserror = "1" +thiserror = "^1" tracing = { version = "0.1", optional = true } -http = "1" +http = "^1" # sabry with sass -sabry = {path = "../../", features = ["lepty-scoping"]} +sabry = { path = "../../" } # our component library -leptos-components = {path = "../leptos-components"} +leptos-components = { path = "../leptos-components" } [build-dependencies] # sabry for build with sass -sabry = {path = "../../", features = ["build", "lepty-scoping"]} +sabry = { path = "../../", features = ["build"] } # lets depend on our styles -define-styles = {path = "../define-styles"} +define-styles = { path = "../define-styles" } [features] hydrate = ["leptos/hydrate"] diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml index 9e8b6d6..2d0f28b 100644 --- a/examples/leptos-components/Cargo.toml +++ b/examples/leptos-components/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "leptos-components" version = "0.1.0" -rust-version = "1.82" +rust-version = "1.88" edition = "2021" publish = false @@ -13,14 +13,10 @@ leptos = { version = "^0.7" } leptos_meta = { version = "^0.7" } leptos_router = { version = "^0.7" } -sabry = { path = "../../", features = ["lepty-scoping", "const-scoping"] } +sabry = { path = "../../", features = ["const-scoping"] } [build-dependencies] -sabry = { path = "../../", features = [ - "build", - "lepty-scoping", - "const-scoping", -] } +sabry = { path = "../../", features = ["build", "const-scoping"] } define-styles = { path = "../define-styles" } [features] diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml index c6241e0..fa3bd23 100644 --- a/examples/use-styles/Cargo.toml +++ b/examples/use-styles/Cargo.toml @@ -2,15 +2,15 @@ name = "use-styles" version = "0.0.0" edition = "2021" -rust-version = "1.82" +rust-version = "1.88" publish = false [dependencies] -sabry = {path = "../../", features = ["nightly"]} +sabry = { path = "../../", features = ["nightly"] } [build-dependencies] -sabry = {path = "../../", features = ["build", "nightly"]} -define-styles = {path = "../define-styles"} +sabry = { path = "../../", features = ["build", "nightly"] } +define-styles = { path = "../define-styles" } [package.metadata.sabry] css.bundle = "target/static/style.css" @@ -21,4 +21,4 @@ hash.size = 6 hash.collision = "error" [package.metadata.sabry.lightningcss] -targets = {chrome = "120", firefox = "120", ie = "8"} +targets = { chrome = "120", firefox = "120", ie = "8" } diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index b39c615..939f3e1 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -16,7 +16,6 @@ regex.optional = true grass.workspace = true grass.optional = true lightningcss.workspace = true -lightningcss.features = ["grid"] lightningcss.optional = true blake3.workspace = true blake3.optional = true @@ -30,7 +29,6 @@ toml.workspace = true cfg-if.workspace = true [features] -lepty-scoping = [] scope = ["dep:blake3", "dep:base64", "dep:regex"] compile = ["dep:lightningcss", "dep:grass"] diff --git a/sabry_intrnl/src/config/mod.rs b/sabry_intrnl/src/config/mod.rs index dfa13bc..5c4f63b 100644 --- a/sabry_intrnl/src/config/mod.rs +++ b/sabry_intrnl/src/config/mod.rs @@ -217,31 +217,21 @@ impl From<SabryLightTargets> for lightningcss::targets::Browsers { } /// \[package.metadata.sabry.sass\].module_name_collision option -#[derive(Deserialize, Clone, Copy)] +#[derive(Default, Deserialize, Clone, Copy)] #[serde(rename_all = "lowercase")] pub enum BehavSassModCollision { + #[default] Merge, Error, } -impl Default for BehavSassModCollision { - fn default() -> Self { - Self::Merge - } -} - /// \[package.metadata.sabry.hash\].collision option -#[derive(Deserialize, Clone, Copy)] +#[derive(Default, Deserialize, Clone, Copy)] #[serde(rename_all = "lowercase")] pub enum BehavHashCollision { - Error, + #[default] Ignore, -} - -impl Default for BehavHashCollision { - fn default() -> Self { - Self::Ignore - } + Error, } #[cfg(test)] diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index df21766..34ef46d 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -1,3 +1,5 @@ +use raffia::ast::InterpolableIdent; + /// Convenience wrapper for String-being-a-hash #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ScopeHash(String); @@ -30,7 +32,10 @@ impl ScopeHash { .iter() .map(|s| &s.name) .chain(ids.iter().map(|i| &i.name)) - .map(|ident| ident.as_literal()) + .map(|ident| match ident { + InterpolableIdent::Literal(lit) => Some(lit), + _ => None, + }) .filter_map(|mbl| mbl.map(|l| l.raw)) .collect::<String>(); diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 408b417..2b0d2dd 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -1,8 +1,10 @@ use std::fmt::Debug; -use cfg_if::cfg_if; use hash::ScopeHash; -use raffia::{Span, Spanned}; +use raffia::{ + ast::{InterpolableIdent, TypeSelector}, + Span, Spanned, +}; use crate::syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}; @@ -106,7 +108,10 @@ impl<'s> HashedScope<'s> { let tags = scope.adapter().type_selectors(); let tags = tags .iter() - .filter_map(|t| t.as_tag_name()) + .filter_map(|t| match t { + TypeSelector::TagName(tag) => Some(tag), + _ => None, + }) .map(|c| HashedSelector::from_tag(&hash, c)); // get global selectors @@ -234,29 +239,17 @@ impl HashedSelector { /// whats this function returns will be usable in HTML with to_hashed_html_def() pub fn make_hashed_css(value: &ScopedSelector, hash: &ScopeHash) -> String { match value { - // Class scoping is done with class composition ScopedSelector::Class(a) => { + // Class scoping is done by composition format!("{}.{}", hash.as_str(), a.ident) } - // As we dont want to use two HTML props for a single ID, - // ID scoping is done with id modification - ScopedSelector::Id(a) => { - cfg_if! { - if #[cfg(feature = "lepty-scoping")] { - format!("{}.{}", a.ident, hash.as_str()) - } else { - format!("{}-{}", hash.as_str(), a.ident) - } - } - } ScopedSelector::Tag(a) => { - cfg_if! { - if #[cfg(feature = "lepty-scoping")] { - format!("{}.{}", a.ident, hash.as_str()) - } else { - format!(".{} {}", hash.as_str(), a.ident) - } - } + // Tag scoping is done by composition + format!("{}.{}", a.ident, hash.as_str()) + } + ScopedSelector::Id(a) => { + // ID scoping is done by class composition + format!("{}.{}", a.ident, hash.as_str()) } ScopedSelector::Glob { raw, .. } => raw.clone(), } @@ -267,31 +260,15 @@ impl HashedSelector { /// Cooperates with the [HashedSelector::make_hashed_css], so /// whats this function returns will be usable in CSS with to_hashed_code() /// - /// Not every hashed selector is presentable for HTML-ish use: like `div`, in that case - /// returns [None] - pub fn make_hashed_html(value: &ScopedSelector, _hash: &ScopeHash) -> Option<String> { + /// Since 0.0.6 all scoping is done via classes, so this function + /// persists for bw-compat for everything except for class. + /// + /// Global and Tag selectors are never transformed; + pub fn make_hashed_html(value: &ScopedSelector, hash: &ScopeHash) -> Option<String> { match value { // Class scoping is done with class composition - ScopedSelector::Class(a) => { - cfg_if! { - if #[cfg(feature = "lepty-scoping")] { - Some(a.ident.to_string()) - } else { - Some(format!("{} {}", _hash.as_str(), a.ident)) - } - } - } - // As we dont want to use two HTML props for a single ID, - // ID scoping is done with id modification - ScopedSelector::Id(a) => { - cfg_if! { - if #[cfg(feature = "lepty-scoping")] { - Some(a.ident.to_string()) - } else { - Some(format!("{}-{}", _hash.as_str(), a.ident)) - } - } - } + ScopedSelector::Class(a) => Some(format!("{} {}", a.ident, hash.as_str())), + ScopedSelector::Id(id) => Some(id.ident.clone()), ScopedSelector::Tag(_) => None, ScopedSelector::Glob { .. } => None, } @@ -366,10 +343,9 @@ impl ScopedSelector { /// Construct this from class selector pub fn from_class(s: &raffia::ast::ClassSelector) -> Self { - let lit = s - .name - .as_literal() - .expect("BUG: class selector is not a literal"); + let InterpolableIdent::Literal(lit) = &s.name else { + panic!("BUG: class selector was not a literal") + }; Self::Class(ArbitrarySelector { ident: lit.raw.to_string(), span: lit.span().clone(), @@ -378,10 +354,9 @@ impl ScopedSelector { /// Construct this from id selector pub fn from_id(s: &raffia::ast::IdSelector) -> Self { - let lit = s - .name - .as_literal() - .expect("BUG: id selector is not a literal"); + let InterpolableIdent::Literal(lit) = &s.name else { + panic!("BUG: id selector was not a literal") + }; Self::Id(ArbitrarySelector { ident: lit.raw.to_string(), span: lit.span().clone(), @@ -390,11 +365,9 @@ impl ScopedSelector { /// Construct this from tagname selector pub fn from_tag(s: &raffia::ast::TagNameSelector) -> Self { - let lit = s - .name - .name - .as_literal() - .expect("BUG: tag selector is not a literal"); + let InterpolableIdent::Literal(lit) = &s.name.name else { + panic!("BUG: tag selector was not a literal") + }; Self::Tag(ArbitrarySelector { ident: lit.raw.to_string(), span: lit.span().clone(), @@ -439,7 +412,6 @@ pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { mod test { use std::collections::HashSet; - use cfg_if::cfg_if; use syn::Ident; use crate::{ @@ -456,33 +428,33 @@ mod test { ".cls1{color:red; &-dark{color: black;} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; let hash = ScopeHash::test_init("F2kf8nMs".into()); - cfg_if! { - if #[cfg(feature = "lepty-scoping")]{ - let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #id1.F2kf8nMs {color:green;} div.F2kf8nMs {color:blue;}} .F2kf8nMs.cls3#id2.F2kf8nMs{color: black;}"; - } else { - let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; - } - } + //cfg_if! { + //if #[cfg(feature = "lepty-scoping")]{ + let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #id1.F2kf8nMs {color:green;} div.F2kf8nMs {color:blue;}} .F2kf8nMs.cls3#id2.F2kf8nMs{color: black;}"; + //} else { + // let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; + //} + //} - cfg_if! { - if #[cfg(feature = "lepty-scoping")] { - let expect_selector_htmls = HashSet::from([ - "cls1".to_string(), - "id1".to_string(), - "cls3".to_string(), - "id2".to_string(), - "".to_string(), // comes from `div` which has no html hashed code, still want to check presense - ]); - } else { - let expect_selector_htmls = HashSet::from([ - "F2kf8nMs cls1".to_string(), - "F2kf8nMs-id1".to_string(), - "F2kf8nMs cls3".to_string(), - "F2kf8nMs-id2".to_string(), - "".to_string(), // comes from `div` which has no html hashed code, still want to check presense - ]); - } - } + // cfg_if! { + // if #[cfg(feature = "lepty-scoping")] { + let expect_selector_htmls = HashSet::from([ + "cls1".to_string(), + "id1".to_string(), + "cls3".to_string(), + "id2".to_string(), + "".to_string(), // comes from `div` which has no html hashed code, still want to check presense + ]); + // } else { + // let expect_selector_htmls = HashSet::from([ + // "F2kf8nMs cls1".to_string(), + // "F2kf8nMs-id1".to_string(), + // "F2kf8nMs cls3".to_string(), + // "F2kf8nMs-id2".to_string(), + // "".to_string(), // comes from `div` which has no html hashed code, still want to check presense + // ]); + // } + //} let scope = ArbitraryScope::from_source( OneSyntaxToRuleThemAll::Scss, diff --git a/sabry_intrnl/src/syntax/mod.rs b/sabry_intrnl/src/syntax/mod.rs index 9feccd4..d1d8c67 100644 --- a/sabry_intrnl/src/syntax/mod.rs +++ b/sabry_intrnl/src/syntax/mod.rs @@ -1,8 +1,8 @@ use ostrta::OneSyntaxToRuleThemAll; use raffia::{ ast::{ - ClassSelector, CompoundSelector, IdSelector, NestingSelector, PseudoClassSelector, - SimpleSelector, Statement, Stylesheet, TypeSelector, + ClassSelector, ComplexSelectorChild, CompoundSelector, IdSelector, InterpolableIdent, + NestingSelector, PseudoClassSelector, SimpleSelector, Statement, Stylesheet, TypeSelector, }, ParserBuilder, }; @@ -41,38 +41,49 @@ impl<'s> StylesheetAdapter<'s> { } pub fn class_selectors(&self) -> Vec<ClassSelector<'s>> { - self.selectors_by(|c| c.as_class().cloned()) + self.selectors_by(|c| match c { + SimpleSelector::Class(sel) => Some(sel), + _ => None, + }) } pub fn id_selectors(&self) -> Vec<IdSelector<'s>> { - self.selectors_by(|c| c.as_id().cloned()) + self.selectors_by(|c| match c { + SimpleSelector::Id(sel) => Some(sel), + _ => None, + }) } pub fn type_selectors(&self) -> Vec<TypeSelector<'s>> { - self.selectors_by(|c| c.as_type().cloned()) + self.selectors_by(|c| match c { + SimpleSelector::Type(sel) => Some(sel), + _ => None, + }) } pub fn nesting_selectors(&self) -> Vec<NestingSelector<'s>> { - self.selectors_by(|c| c.as_nesting().cloned()) + self.selectors_by(|c| match c { + SimpleSelector::Nesting(sel) => Some(sel), + _ => None, + }) } /// special selector case searching for :g(whatever), :glob(whatever), :global(whatever) pub fn glob_modified_selectors(&self) -> Vec<PseudoClassSelector<'s>> { self.selectors_by(|c| { - let cps = match c.as_pseudo_class() { - Some(s) => s.clone(), + let cps = match c { + SimpleSelector::PseudoClass(sel) => sel, _ => return None, }; - let ident = match cps.name.as_literal().map(|r| r.raw) { - Some(i) => i, - _ => return None, - }; - - if ident == "global" { - Some(cps) - } else { - None + match &cps.name { + InterpolableIdent::Literal(lit) => match lit.raw { + "g" => Some(cps), + "glob" => Some(cps), + "global" => Some(cps), + _ => None, + }, + _ => None, } }) } @@ -106,21 +117,27 @@ impl<'s> StylesheetAdapter<'s> { // 4 - Danik // 5 - Yiffy // 8 - Danik - c.filter_map(|s| s.as_qualified_rule().cloned()) - .flat_map(|q| { - let thissels = q - .selector - .selectors - .iter() - .flat_map(|sel| &sel.children) - .filter_map(|sc| sc.as_compound_selector()) - .cloned(); + c.filter_map(|s| match s { + Statement::QualifiedRule(stmt) => Some(stmt), + _ => None, + }) + .flat_map(|q| { + let thissels = q + .selector + .selectors + .iter() + .flat_map(|sel| &sel.children) + .filter_map(|sc| match sc { + ComplexSelectorChild::CompoundSelector(sel) => Some(sel), + _ => None, + }) + .cloned(); - let blockstmt = q.block.statements.iter().cloned(); - Self::selectors_of(blockstmt) - .chain(thissels) - .collect::<Vec<_>>() - }) + let blockstmt = q.block.statements.iter().cloned(); + Self::selectors_of(blockstmt) + .chain(thissels) + .collect::<Vec<_>>() + }) } } @@ -128,7 +145,10 @@ impl<'s> StylesheetAdapter<'s> { mod test { use std::collections::HashSet; - use raffia::Spanned; + use raffia::{ + ast::{InterpolableIdent, TypeSelector}, + Spanned, + }; use crate::syntax::ostrta::OneSyntaxToRuleThemAll; @@ -191,20 +211,32 @@ div#id2 let classes = adp .class_selectors() .iter() - .filter_map(|c| c.name.as_literal().map(|l| l.raw)) + .filter_map(|c| match &c.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); let ids = adp .id_selectors() .iter() - .filter_map(|i| i.name.as_literal().map(|l| l.raw)) + .filter_map(|i| match &i.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); let tags = adp .type_selectors() .iter() - .filter_map(|t| t.as_tag_name()) - .filter_map(|t| t.name.name.as_literal().map(|l| l.raw)) + .filter_map(|t| match t { + TypeSelector::TagName(tag) => Some(tag), + _ => None, + }) + .filter_map(|t| match &t.name.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); assert_eq!(expect_classes, classes); @@ -217,20 +249,32 @@ div#id2 let classes = adp .class_selectors() .iter() - .filter_map(|c| c.name.as_literal().map(|l| l.raw)) + .filter_map(|c| match &c.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); let ids = adp .id_selectors() .iter() - .filter_map(|i| i.name.as_literal().map(|l| l.raw)) + .filter_map(|i| match &i.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); let tags = adp .type_selectors() .iter() - .filter_map(|t| t.as_tag_name()) - .filter_map(|t| t.name.name.as_literal().map(|l| l.raw)) + .filter_map(|t| match t { + TypeSelector::TagName(tag) => Some(tag), + _ => None, + }) + .filter_map(|t| match &t.name.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); assert_eq!(expect_classes, classes); diff --git a/sabry_intrnl/src/syntax/ostrta.rs b/sabry_intrnl/src/syntax/ostrta.rs index 8d6826c..bf320a0 100644 --- a/sabry_intrnl/src/syntax/ostrta.rs +++ b/sabry_intrnl/src/syntax/ostrta.rs @@ -1,15 +1,10 @@ /// Convenience unification entrypoint /// to make friends with all the different syntax-consumers -#[derive(Debug, Clone, Copy)] +#[derive(Default, Debug, Clone, Copy)] pub enum OneSyntaxToRuleThemAll { - Sass, + #[default] Scss, -} - -impl Default for OneSyntaxToRuleThemAll { - fn default() -> Self { - Self::Scss - } + Sass, } impl TryFrom<&str> for OneSyntaxToRuleThemAll { diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index ae8189a..05646ba 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -11,6 +11,7 @@ license.workspace = true [dependencies] sabry_intrnl.workspace = true sabry_intrnl.features = ["scope"] +raffia.workspace = true syn.workspace = true syn.features = ["parsing"] quote.workspace = true diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index a0a7e23..0297c06 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -84,10 +84,17 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok .iter() .filter_map(|ns| { ns.suffix.clone().and_then(|s| { - let interp = s - .as_sass_interpolated() - .and_then(|i| i.elements.first()) - .and_then(|e| e.as_static().map(|s| s.raw.to_string())); + let interp = match s { + raffia::ast::InterpolableIdent::SassInterpolated(int) => Some(int), + _ => None, + }; + + let interp = interp.and_then(|i| match i.elements.first() { + Some(raffia::ast::SassInterpolatedIdentElement::Static(i)) => { + Some(i.raw.to_string()) + } + _ => None, + }); interp }) @@ -102,6 +109,10 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok quote! { #[doc = #doc] + #[deprecated( + since = "0.0.6", + note = "All scoping is done by directly applying hash classes to elements now - this is useless for everything except of classes" + )] pub fn #fnident(c: &str) -> String {format!(#formatstr)} } }); @@ -120,23 +131,35 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok ScopedSelector::Glob { .. } => "glob", }; - (name, hs.sel.gen_rusty_ident(), html, hs.css_ident.clone()) + ( + name, + hs.sel.gen_rusty_ident(), + html, + hs.css_ident.clone(), + ) }) }) .map(|(name, ident, html, css)| { let docs = format!("'{ident:?}' {name}. CSS selector '{css}'"); quote! { #[doc = #docs] + #[deprecated( + since = "0.0.6", + note = "All scoping is done by directly applying hash classes to elements now - this is useless for everything except of classes" + )] #[allow(non_upper_case_globals)] pub const #ident : &str = #html ; } }); let mod_docs = format!( - "'{}' style scope. The wrapper class for scoped tagnames is {}", + "'{}' style scope. The hash class is `{}`", &scope_ident, &scope_wrapper_ident ); - let wrp_docs = format!("wrapper class for '{}' scope. If you have any tagname selectors - they should live as children of element with this class applied.", &scope_ident); + let wrp_docs = format!( + "hash class for '{}' scope. All HTML elements should have this class applied", + &scope_ident + ); if constant { cfg_if! { From d40f3931f6c2d4ea027602e1d91aed1ce7f48ea1 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 12 Sep 2025 14:21:20 +0500 Subject: [PATCH 076/184] fix: dont know why sabry_build wasn't a member --- Cargo.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index d3fa278..e9cb58a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,11 @@ [workspace] resolver = "2" -members = ["sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl"] +members = [ + "sabry_procmacro", + "sabry_procmacro_impl", + "sabry_intrnl", + "sabry_build", +] exclude = ["examples"] [workspace.dependencies] From 41e06d138bd20d982415240178ccc4040c8e65fd Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 12 Sep 2025 14:24:36 +0500 Subject: [PATCH 077/184] fix: use under feature --- sabry_intrnl/src/scoper/hash.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index 34ef46d..fe539fe 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -1,5 +1,3 @@ -use raffia::ast::InterpolableIdent; - /// Convenience wrapper for String-being-a-hash #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ScopeHash(String); @@ -8,6 +6,7 @@ impl ScopeHash { #[cfg(feature = "scope")] pub fn new(scope: &super::ArbitraryScope, config: &crate::config::SabryHashConfig) -> Self { use base64::Engine; + use raffia::ast::InterpolableIdent; use crate::scoper::apply_basic_rusty_member_gen_rules; From 26bf251c89f945bae4ef4a3800a149c2cb08abbf Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 12 Sep 2025 14:27:58 +0500 Subject: [PATCH 078/184] chore: Release --- Cargo.toml | 10 +++++----- sabry_build/README.md | 2 +- sabry_intrnl/README.md | 2 +- sabry_procmacro/README.md | 2 +- sabry_procmacro_impl/README.md | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e9cb58a..5036882 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,10 +10,10 @@ exclude = ["examples"] [workspace.dependencies] ## Workspace -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6-rc.1" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6-rc.1" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6-rc.1" } -sabry_build = { path = "sabry_build", version = "0.0.6-rc.1" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6" } +sabry_build = { path = "sabry_build", version = "0.0.6" } #/ lightningcss.version = "1.0.0-alpha.67" lightningcss.default-features = false @@ -37,7 +37,7 @@ quote.version = "^1" syn.version = "^2" [workspace.package] -version = "0.0.6-rc.1" +version = "0.0.6" edition = "2021" rust-version = "1.88" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] diff --git a/sabry_build/README.md b/sabry_build/README.md index 4f8f220..e08a18f 100644 --- a/sabry_build/README.md +++ b/sabry_build/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md index 2e53d53..c9cabbd 100644 --- a/sabry_intrnl/README.md +++ b/sabry_intrnl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md index 0944f74..29fef06 100644 --- a/sabry_procmacro/README.md +++ b/sabry_procmacro/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md index d92d7ed..c0e51bf 100644 --- a/sabry_procmacro_impl/README.md +++ b/sabry_procmacro_impl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` From 06a40a8e242956a6092f30a8b3a728c1ff5b0c8d Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Wed, 13 May 2026 13:05:54 +0500 Subject: [PATCH 079/184] chore(repo)!: move --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 5c47c88..0fe9f97 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,10 @@ +> **Repository moved** +> +> On GithHub this repository is now a [push-mirror](https://source.spushk.ru/rustyworks/sabry) +> and will be removed from GH at 07-2026 +> +> Crate will remain maintained + # 🧙🏻 SABRY - Syntactically Awesome, But RustY **Y**et another **R**usty **B**oilerplate-free **A**gnostic **S**tyling crate, which brings your SASS/SCSS style into Rust. Written by a fox this time. From 996f1e46a5d4a9b4efff0ace50957c211e53a9af Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Tue, 24 Mar 2026 05:53:08 +0500 Subject: [PATCH 080/184] chore: pre0.1 --- Cargo.toml | 36 +++++----- examples/define-styles/Cargo.toml | 2 +- examples/leptos-axum/Cargo.toml | 30 ++++++--- examples/leptos-components/Cargo.toml | 8 +-- examples/use-styles/Cargo.toml | 2 +- sabry_intrnl/Cargo.toml | 6 +- sabry_intrnl/src/scoper/hash.rs | 28 +++----- sabry_intrnl/src/scoper/mod.rs | 56 ++++++--------- sabry_procmacro/Cargo.toml | 2 - sabry_procmacro/src/lib.rs | 30 ++------- sabry_procmacro_impl/src/impls/mod.rs | 90 +++++-------------------- sabry_procmacro_impl/src/impls/scssy.rs | 31 ++++----- sabry_procmacro_impl/src/impls/styly.rs | 31 +++------ 13 files changed, 114 insertions(+), 238 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5036882..195a87b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -resolver = "2" +resolver = "3" members = [ "sabry_procmacro", "sabry_procmacro_impl", @@ -8,43 +8,42 @@ members = [ ] exclude = ["examples"] +[workspace.package] +version = "0.0.6" +edition = "2024" +rust-version = "1.88" +authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] +repository = "https://github.com/yiffyrusdev/sabry" +license = "MIT" +publish = true + [workspace.dependencies] ## Workspace sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6" } sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6" } sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6" } sabry_build = { path = "sabry_build", version = "0.0.6" } -#/ -lightningcss.version = "1.0.0-alpha.67" +## CSS +lightningcss.version = "1.0.0-alpha.71" lightningcss.default-features = false grass.version = "^0.13" grass.default-features = false -raffia.version = "^0.11" -#/ +raffia.version = "^0.12" +## Marshall serde.version = "^1" -toml.version = "^0.9" -blake3.version = "^1" +toml.version = "^1" base64.version = "^0.22" regex.version = "^1" -#/ +## Util itertools.version = "^0.14" walkdir.version = "^2" -#/ +## Codegen cfg-if.version = "^1" thiserror.version = "^2" proc-macro2.version = "^1" quote.version = "^1" syn.version = "^2" -[workspace.package] -version = "0.0.6" -edition = "2021" -rust-version = "1.88" -authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] -repository = "https://github.com/yiffyrusdev/sabry" -license = "MIT" -publish = true - [package] name = "sabry" description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust" @@ -73,7 +72,6 @@ const-scoping = ["sabry_procmacro?/const-compile"] procmacro = ["dep:sabry_procmacro"] build = ["dep:sabry_build"] net-files = ["sabry_build/net-files"] -nightly = ["sabry_procmacro?/nightly"] internals = [] [package.metadata.docs.rs] diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml index e7a8b65..e235bcc 100644 --- a/examples/define-styles/Cargo.toml +++ b/examples/define-styles/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "define-styles" version = "0.0.0" -edition = "2021" +edition = "2024" rust-version = "1.88" publish = false diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 162c94a..4a2994b 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -2,25 +2,33 @@ name = "leptos-axum-sabry" version = "0.1.0" rust-version = "1.88" -edition = "2021" +edition = "2024" publish = false [lib] crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "^0.8" } -leptos_axum = { version = "^0.8", optional = true } -leptos_meta = { version = "^0.8" } -leptos_router = { version = "^0.8" } -axum = { version = "0.8", optional = true } +leptos.version = "^0.8" +leptos_axum.version = "^0.8" +leptos_axum.optional = true +leptos_meta.version = "^0.8" +leptos_router.version = "^0.8" +axum.version = "0.8" +axum.optional = true console_error_panic_hook = "0.1" -tokio = { version = "1", features = ["rt-multi-thread"], optional = true } -tower = { version = "0.5", optional = true } -tower-http = { version = "0.6", features = ["fs"], optional = true } -wasm-bindgen = "=0.2.96" +tokio.version = "1" +tokio.features = ["rt-multi-thread"] +tokio.optional = true +tower.version = "0.5" +tower.optional = true +tower-http.version = "0.6" +tower-http.features = ["fs"] +tower-http.optional = true +wasm-bindgen = "=0.2.114" thiserror = "^1" -tracing = { version = "0.1", optional = true } +tracing.version = "0.1" +tracing.optional = true http = "^1" # sabry with sass diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml index 2d0f28b..2a7cd5b 100644 --- a/examples/leptos-components/Cargo.toml +++ b/examples/leptos-components/Cargo.toml @@ -2,16 +2,16 @@ name = "leptos-components" version = "0.1.0" rust-version = "1.88" -edition = "2021" +edition = "2024" publish = false [lib] crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "^0.7" } -leptos_meta = { version = "^0.7" } -leptos_router = { version = "^0.7" } +leptos.version = "^0.8" +leptos_meta.version = "^0.8" +leptos_router.version = "^0.8" sabry = { path = "../../", features = ["const-scoping"] } diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml index fa3bd23..9a665b8 100644 --- a/examples/use-styles/Cargo.toml +++ b/examples/use-styles/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "use-styles" version = "0.0.0" -edition = "2021" +edition = "2024" rust-version = "1.88" publish = false diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 939f3e1..e078f81 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -11,14 +11,10 @@ license.workspace = true [dependencies] syn.workspace = true raffia.workspace = true -regex.workspace = true -regex.optional = true grass.workspace = true grass.optional = true lightningcss.workspace = true lightningcss.optional = true -blake3.workspace = true -blake3.optional = true base64.workspace = true base64.optional = true @@ -29,7 +25,7 @@ toml.workspace = true cfg-if.workspace = true [features] -scope = ["dep:blake3", "dep:base64", "dep:regex"] +scope = ["dep:base64"] compile = ["dep:lightningcss", "dep:grass"] [package.metadata.docs.rs] diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index fe539fe..c6e6844 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -7,19 +7,20 @@ impl ScopeHash { pub fn new(scope: &super::ArbitraryScope, config: &crate::config::SabryHashConfig) -> Self { use base64::Engine; use raffia::ast::InterpolableIdent; + use std::hash::Hasher; - use crate::scoper::apply_basic_rusty_member_gen_rules; + use crate::scoper::sanitize_css_member; - let mut hasher = blake3::Hasher::new(); + let mut hasher = std::hash::DefaultHasher::new(); if config.use_scope_name { - hasher.update(scope.name.to_string().as_bytes()); + hasher.write(scope.name.to_string().as_bytes()); } if config.use_code_text { - hasher.update(scope.adapter().source().as_bytes()); + hasher.write(scope.adapter().source().as_bytes()); } if config.use_code_size { - hasher.update(&scope.adapter().source().len().to_ne_bytes()); + hasher.write(&scope.adapter().source().len().to_ne_bytes()); } if config.use_item_names { let classes = scope.adapter().class_selectors(); @@ -38,22 +39,13 @@ impl ScopeHash { .filter_map(|mbl| mbl.map(|l| l.raw)) .collect::<String>(); - hasher.update(merged_items.as_bytes()); + hasher.write(merged_items.as_bytes()); } - let size = if config.size >= blake3::OUT_LEN { - blake3::OUT_LEN - } else { - config.size - }; + let hash = hasher.finish().to_be_bytes(); - let hash = hasher.finalize(); - let hash = hash.as_bytes(); - - //? This isn't right. "size" is size of hash in symbols. - // naaah, its fine :D (Dan) - let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(&hash[..size]); - let hash = apply_basic_rusty_member_gen_rules(&hash); + let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(hash); + let hash = sanitize_css_member(&hash); Self(hash) } diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 2b0d2dd..ab3b5d6 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -2,11 +2,11 @@ use std::fmt::Debug; use hash::ScopeHash; use raffia::{ - ast::{InterpolableIdent, TypeSelector}, Span, Spanned, + ast::{InterpolableIdent, TypeSelector}, }; -use crate::syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}; +use crate::syntax::{StylesheetAdapter, ostrta::OneSyntaxToRuleThemAll}; pub mod hash; @@ -312,7 +312,7 @@ impl ScopedSelector { #[cfg(feature = "scope")] pub fn gen_rusty_ident(&self) -> Option<syn::Ident> { let arb = &self.as_arbitrary().ident; - let basic = apply_basic_rusty_member_gen_rules(arb); + let basic = sanitize_css_member(arb); let ready = match self { Self::Class(_) => Some(basic), @@ -376,34 +376,35 @@ impl ScopedSelector { } #[cfg(feature = "scope")] -pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { - let omit_regex = regex::Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") - .expect("BUG: can not build omition regex for rusty member generation"); - - // omit forbidden chars - let cleaned = omit_regex.replace_all(source, "").to_string(); - - // other not-so-obvious rules - let mut target = String::with_capacity(cleaned.len()); +pub fn sanitize_css_member(source: &str) -> String { + let mut target = String::with_capacity(source.len()); let mut next_uppercase: bool = false; - for (i, c) in cleaned.chars().enumerate() { + for (i, c) in source + .chars() + .filter(|c| c.is_alphanumeric() || *c == '-') + .enumerate() + { // first gidit is prepended with 'n' if i == 0 && c.is_numeric() { target.push('n'); target.push(c); continue; } - // dash is omitted and next is uppercase if may be + + // dash is omitted, replacing the next char with its uppercase if c == '-' { next_uppercase = true; continue; } - target.push(if next_uppercase { + + let char = if next_uppercase { next_uppercase = false; c.to_ascii_uppercase() } else { c - }); + }; + + target.push(char); } target } @@ -416,7 +417,7 @@ mod test { use crate::{ config::SabryHashConfig, - scoper::{hash::ScopeHash, HashedScope}, + scoper::{HashedScope, hash::ScopeHash}, syntax::ostrta::OneSyntaxToRuleThemAll, }; @@ -424,20 +425,11 @@ mod test { #[test] fn scope_hash_codegen() { - let code = - ".cls1{color:red; &-dark{color: black;} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; + let code = ".cls1{color:red; &-dark{color: black;} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; let hash = ScopeHash::test_init("F2kf8nMs".into()); - //cfg_if! { - //if #[cfg(feature = "lepty-scoping")]{ let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #id1.F2kf8nMs {color:green;} div.F2kf8nMs {color:blue;}} .F2kf8nMs.cls3#id2.F2kf8nMs{color: black;}"; - //} else { - // let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; - //} - //} - // cfg_if! { - // if #[cfg(feature = "lepty-scoping")] { let expect_selector_htmls = HashSet::from([ "cls1".to_string(), "id1".to_string(), @@ -445,16 +437,6 @@ mod test { "id2".to_string(), "".to_string(), // comes from `div` which has no html hashed code, still want to check presense ]); - // } else { - // let expect_selector_htmls = HashSet::from([ - // "F2kf8nMs cls1".to_string(), - // "F2kf8nMs-id1".to_string(), - // "F2kf8nMs cls3".to_string(), - // "F2kf8nMs-id2".to_string(), - // "".to_string(), // comes from `div` which has no html hashed code, still want to check presense - // ]); - // } - //} let scope = ArbitraryScope::from_source( OneSyntaxToRuleThemAll::Scss, diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 12758de..13e4092 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -13,10 +13,8 @@ proc-macro = true [dependencies] sabry_procmacro_impl.workspace = true -cfg-if.workspace = true [features] -nightly = [] const-compile = ["sabry_procmacro_impl/const-compile"] [package.metadata.docs.rs] diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index 98f056a..827576c 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -1,9 +1,8 @@ #![doc = include_str!("../README.md")] -#![cfg_attr(feature = "nightly", feature(proc_macro_span))] +use std::path::PathBuf; use std::str::FromStr; -use cfg_if::cfg_if; use proc_macro::TokenStream; use sabry_procmacro_impl::impls::{ scssy::scssy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, @@ -38,17 +37,8 @@ use sabry_procmacro_impl::impls::{ /// #[proc_macro] pub fn scssy(input: TokenStream) -> TokenStream { - cfg_if! { - if #[cfg(feature = "nightly")] { - use proc_macro::Span; - use std::path::PathBuf; - let source_path = Some(PathBuf::from_str( - &Span::call_site().file()).expect("&str to be Infallible converted into PathBuf") - ); - } else { - let source_path = None; - } - } + let source_path = + PathBuf::from_str(&proc_macro::Span::call_site().file()).expect("Irrefutable result"); scssy_macro_impl(input.into(), source_path).into() } @@ -111,18 +101,8 @@ pub fn scssy(input: TokenStream) -> TokenStream { /// ``` #[proc_macro] pub fn styly(input: TokenStream) -> TokenStream { - cfg_if! { - if #[cfg(feature = "nightly")] { - use proc_macro::Span; - use std::path::PathBuf; - let source_path = Some(PathBuf::from_str( - &Span::call_site().file()).expect("&str to be Infallible converted into PathBuf") - ); - } else { - let source_path = None; - } - } - + let source_path = + PathBuf::from_str(&proc_macro::Span::call_site().file()).expect("Irrefutable result"); styly_macro_impl(input.into(), source_path).into() } diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index c82f67f..59b79d8 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -1,10 +1,10 @@ use std::{fmt::Debug, fs, path::PathBuf, str::FromStr}; use proc_macro2::{Span, TokenStream}; -use quote::{quote, ToTokens, TokenStreamExt}; +use quote::{ToTokens, TokenStreamExt, quote}; use regex::Regex; use sabry_intrnl::syntax::ostrta::OneSyntaxToRuleThemAll; -use syn::{braced, parse::Parse, Ident, LitStr, Token}; +use syn::{Ident, LitStr, Token, braced, parse::Parse}; pub mod scssy; pub mod styly; @@ -31,20 +31,15 @@ impl ArbitraryStyleBlock { &self.code } - pub fn parse_syn( - input: syn::parse::ParseStream, - use_code_path_prefix: Option<PathBuf>, - ) -> syn::Result<Self> { + pub fn parse_syn(input: syn::parse::ParseStream, path_prefix: PathBuf) -> syn::Result<Self> { let (code, span) = if let Ok(path_tok) = input.parse::<LitStr>() { - let path = if let Some(prefix) = use_code_path_prefix { + let path = { let p = path_tok.value(); if let Some(pp) = p.strip_prefix("./") { - prefix.join(pp) + path_prefix.join(pp) } else { - PathBuf::from_str(&p).expect("Unable to convert path into PathBuf") + PathBuf::from_str(&p).unwrap() // infallible } - } else { - PathBuf::from_str(&path_tok.value()).expect("Unable to convert path into PathBuf") }; let fullpath = match path.canonicalize() { @@ -52,8 +47,11 @@ impl ArbitraryStyleBlock { Err(e) => { return Err(syn::Error::new( path_tok.span(), - format!("Could not use path {path:?}: {:?}. If the path is relative and 'nightly' feature flag is set - this is likely false-positive", e.kind()), - )) + format!( + "Could not use path {path:?}: {:?}. If the path is relative and 'nightly' feature flag is set - this is likely false-positive", + e.kind() + ), + )); } }; @@ -63,7 +61,7 @@ impl ArbitraryStyleBlock { return Err(syn::Error::new( path_tok.span(), format!("Could not read file at {fullpath:?}"), - )) + )); } }; let code = String::from_utf8_lossy(&iofile).to_string(); @@ -79,7 +77,10 @@ impl ArbitraryStyleBlock { let c = ident_regex.replace_all(&c, "\n").to_string(); (c, stream.span()) } else { - return Err(syn::Error::new(s.span(), "Use \"\" within the braces to specify your SASS/SCSS. Unquoted style syntax is reserved for the future. Unquoted SCSS/SASS doesnt make sense though, as you won't benefit from it in rust file.\n\ntip: use `{\"style\"}` instead of `{style}`")); + return Err(syn::Error::new( + s.span(), + "Use \"\" within the braces to specify your SASS/SCSS. Unquoted style syntax is reserved for the future. Unquoted SCSS/SASS doesnt make sense though, as you won't benefit from it in rust file.\n\ntip: use `{\"style\"}` instead of `{style}`", + )); } }; @@ -87,12 +88,6 @@ impl ArbitraryStyleBlock { } } -impl Parse for ArbitraryStyleBlock { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { - Self::parse_syn(input, None) - } -} - #[allow(clippy::to_string_trait_impl)] impl ToString for ArbitraryStyleBlock { fn to_string(&self) -> String { @@ -148,56 +143,3 @@ impl Parse for ArbitraryStyleSyntax { } } } - -#[cfg(test)] -mod test { - #[test] - fn arbitrary_style_block_sass() { - use super::ArbitraryStyleBlock; - - let code = " - #a - co: red - .sel - co: white - &-dark - & > div - co: blue"; - let expect_code = " -#a - co: red -.sel - co: white -&-dark - & > div - co: blue"; - let input = format!("{{\"{code}\"}}"); - let block = syn::parse_str::<ArbitraryStyleBlock>(&input).unwrap(); - - assert_eq!(expect_code, block.code); - } - - #[test] - fn arbitrary_style_block_scss() { - use super::ArbitraryStyleBlock; - - let code = " - #a { - c: r; - } - .b.c { - c: 'into'; - }"; - let expect_code = " -#a { - c: r; -} -.b.c { - c: 'into'; -}"; - let input = format!("{{\"{code}\"}}"); - let block = syn::parse_str::<ArbitraryStyleBlock>(&input).unwrap(); - - assert_eq!(expect_code, block.code) - } -} diff --git a/sabry_procmacro_impl/src/impls/scssy.rs b/sabry_procmacro_impl/src/impls/scssy.rs index ddbee04..7ab9854 100644 --- a/sabry_procmacro_impl/src/impls/scssy.rs +++ b/sabry_procmacro_impl/src/impls/scssy.rs @@ -3,10 +3,7 @@ use std::path::PathBuf; use proc_macro2::TokenStream; use quote::quote; use sabry_intrnl::scoper::ArbitraryScope; -use syn::{ - parse::{Parse, ParseStream}, - Ident, -}; +use syn::{Ident, parse::ParseStream}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -16,7 +13,7 @@ use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; /// `$syntax`: sass/scss /// /// `$code`: intended to be valid based on $syntax -pub fn scssy_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> TokenStream { +pub fn scssy_macro_impl(input: TokenStream, source_path: PathBuf) -> TokenStream { let MacroSyntax { ident, syntax, @@ -36,7 +33,9 @@ pub fn scssy_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok } let sourcesass = code.to_string(); - let macro_doc = format!("Arbitrary {syntax:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `buildy` at build time"); + let macro_doc = format!( + "Arbitrary {syntax:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `buildy` at build time" + ); quote! { #[doc = #macro_doc] @@ -55,17 +54,11 @@ pub struct MacroSyntax { } impl MacroSyntax { - pub fn parse_syn( - input: syn::parse::ParseStream, - source_path: Option<PathBuf>, - ) -> syn::Result<Self> { + pub fn parse_syn(input: syn::parse::ParseStream, source_path: PathBuf) -> syn::Result<Self> { let ident = input.parse::<Ident>()?; let syntax = input.parse::<ArbitraryStyleSyntax>()?; - let code = match source_path { - Some(sp) => ArbitraryStyleBlock::parse_syn(input, Some(sp))?, - None => input.parse::<ArbitraryStyleBlock>()?, - }; + let code = ArbitraryStyleBlock::parse_syn(input, source_path)?; Ok(Self { ident, @@ -75,11 +68,11 @@ impl MacroSyntax { } } -impl Parse for MacroSyntax { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { - Self::parse_syn(input, None) - } -} +// impl Parse for MacroSyntax { +// fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { +// Self::parse_syn(input, None) +// } +// } #[cfg(test)] mod test {} diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 0297c06..d8b6f91 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -6,11 +6,11 @@ use proc_macro2::{Span, TokenStream}; use quote::quote; use sabry_intrnl::{ config::SabryConfig, - scoper::{apply_basic_rusty_member_gen_rules, ArbitraryScope, ScopedSelector}, + scoper::{ArbitraryScope, ScopedSelector, sanitize_css_member}, }; use syn::{ - parse::{Parse, ParseStream}, Ident, Token, + parse::{Parse, ParseStream}, }; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -32,7 +32,7 @@ use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; /// /// The machine-readable output may also be forced by use `machine_readable: true` arg on `parse_macro_syntax` function /// without modifying tokenstream -pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> TokenStream { +pub fn styly_macro_impl(input: TokenStream, source_path: PathBuf) -> TokenStream { let config = match SabryConfig::require() { Ok(c) => c, Err(e) => { @@ -40,7 +40,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok Span::call_site(), format!("Could not read sabry configuration required by this macro: {e:?}",), ) - .to_compile_error() + .to_compile_error(); } }; let ms = match parse_macro_syntax(input, source_path) { @@ -62,7 +62,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok Span::call_site(), format!("Could not generate scope: {e:?}"), ) - .to_compile_error() + .to_compile_error(); } }; @@ -101,7 +101,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok }) .unique() .map(|s| { - let ident = apply_basic_rusty_member_gen_rules(&s); + let ident = sanitize_css_member(&s); let fnident = syn::parse_str::<Ident>(format!("_{ident}").as_str()) .expect("BUG: invalid ident for nesting selector formed"); let formatstr = format!("{{c}}{}", &s); @@ -223,7 +223,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok // reusable function, that does not return tokenstream for machine-processing at build time pub fn parse_macro_syntax( input: TokenStream, - source_path: Option<PathBuf>, + source_path: PathBuf, ) -> Result<MacroSyntax, syn::Error> { syn::parse::Parser::parse2( |input: ParseStream<'_>| MacroSyntax::parse_syn(input, source_path), @@ -263,18 +263,11 @@ pub struct MacroSyntax { } impl MacroSyntax { - pub fn parse_syn( - input: syn::parse::ParseStream, - source_path: Option<PathBuf>, - ) -> syn::Result<Self> { + pub fn parse_syn(input: syn::parse::ParseStream, source_path: PathBuf) -> syn::Result<Self> { let mut generator = input.parse::<ScopeGenerator>()?; let scope = input.parse::<Ident>()?; let syntax = input.parse::<ArbitraryStyleSyntax>()?; - let code = if source_path.is_some() { - ArbitraryStyleBlock::parse_syn(input, source_path) - } else { - input.parse::<ArbitraryStyleBlock>() - }?; + let code = ArbitraryStyleBlock::parse_syn(input, source_path)?; if input.parse::<Token![#]>().is_ok() { generator = ScopeGenerator::MachineReadable @@ -288,9 +281,3 @@ impl MacroSyntax { }) } } - -impl Parse for MacroSyntax { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { - Self::parse_syn(input, None) - } -} From 4dfcb2646a47ea3b317abae9574d2da2d7028f3e Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Mon, 5 Oct 2026 23:43:03 +0300 Subject: [PATCH 081/184] chore: 0.0.7: bump deps & light code cleanup --- Cargo.toml | 25 +- examples/define-styles/Cargo.lock | 1278 ++------------------- examples/define-styles/Cargo.toml | 3 +- examples/leptos-axum/Cargo.toml | 31 +- examples/leptos-axum/src/routes/home.rs | 53 +- examples/leptos-axum/src/routes/home.scss | 0 examples/leptos-components/Cargo.toml | 12 +- examples/use-styles/Cargo.lock | 1137 ++++++------------ examples/use-styles/Cargo.toml | 10 +- sabry_build/Cargo.toml | 18 +- sabry_build/src/filevisit.rs | 21 +- sabry_intrnl/Cargo.toml | 46 +- sabry_intrnl/src/scoper/mod.rs | 60 +- sabry_procmacro/Cargo.toml | 15 +- sabry_procmacro/src/lib.rs | 7 +- sabry_procmacro_impl/Cargo.toml | 40 +- sabry_procmacro_impl/src/impls/mod.rs | 2 +- sabry_procmacro_impl/src/impls/styly.rs | 6 +- tombi.toml | 9 + 19 files changed, 630 insertions(+), 2143 deletions(-) delete mode 100644 examples/leptos-axum/src/routes/home.scss create mode 100644 tombi.toml diff --git a/Cargo.toml b/Cargo.toml index 195a87b..b1bf54b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,15 +1,15 @@ [workspace] resolver = "3" members = [ - "sabry_procmacro", - "sabry_procmacro_impl", - "sabry_intrnl", - "sabry_build", + "sabry_procmacro", + "sabry_procmacro_impl", + "sabry_intrnl", + "sabry_build", ] exclude = ["examples"] [workspace.package] -version = "0.0.6" +version = "0.0.7" edition = "2024" rust-version = "1.88" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] @@ -19,12 +19,12 @@ publish = true [workspace.dependencies] ## Workspace -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6" } -sabry_build = { path = "sabry_build", version = "0.0.6" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.7" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.7" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.7" } +sabry_build = { path = "sabry_build", version = "0.0.7" } ## CSS -lightningcss.version = "1.0.0-alpha.71" +lightningcss.version = "1.0.0-alpha.72" lightningcss.default-features = false grass.version = "^0.13" grass.default-features = false @@ -32,7 +32,7 @@ raffia.version = "^0.12" ## Marshall serde.version = "^1" toml.version = "^1" -base64.version = "^0.22" +base64.version = "^0.23" regex.version = "^1" ## Util itertools.version = "^0.14" @@ -42,7 +42,7 @@ cfg-if.version = "^1" thiserror.version = "^2" proc-macro2.version = "^1" quote.version = "^1" -syn.version = "^2" +syn.version = "^3" [package] name = "sabry" @@ -73,6 +73,7 @@ procmacro = ["dep:sabry_procmacro"] build = ["dep:sabry_build"] net-files = ["sabry_build/net-files"] internals = [] +nightly = ["sabry_procmacro?/nightly"] [package.metadata.docs.rs] all-features = true diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index d1a55eb..d34dc05 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -2,371 +2,26 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - [[package]] name = "base64" -version = "0.22.1" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64-simd" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" -dependencies = [ - "simd-abstraction", -] - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake3" -version = "1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" - -[[package]] -name = "cc" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" -dependencies = [ - "shlex", -] +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" - -[[package]] -name = "codemap" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" - -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "const-str" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" -dependencies = [ - "const-str-proc-macro", -] - -[[package]] -name = "const-str-proc-macro" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "cssparser" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "phf", - "smallvec", -] - -[[package]] -name = "cssparser-color" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" -dependencies = [ - "cssparser", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.90", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "data-url" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" -dependencies = [ - "matches", -] +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "define-styles" @@ -375,101 +30,23 @@ dependencies = [ "sabry", ] -[[package]] -name = "dtoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - [[package]] name = "either" -version = "1.13.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "grass" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" -dependencies = [ - "clap", - "getrandom", - "grass_compiler", -] - -[[package]] -name = "grass_compiler" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" -dependencies = [ - "codemap", - "indexmap", - "lasso", - "once_cell", - "phf", - "rand", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.11", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" @@ -479,325 +56,52 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indexmap" -version = "2.7.0" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", - "hashbrown 0.15.2", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", + "hashbrown", ] [[package]] name = "itertools" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "js-sys" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "lasso" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.168" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" - -[[package]] -name = "lightningcss" -version = "1.0.0-alpha.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c9e1f991b3861d25bf872ecca2eb6a73f7a9fe671da047cd1f9b49c65cbc40" -dependencies = [ - "ahash 0.8.11", - "bitflags", - "const-str", - "cssparser", - "cssparser-color", - "dashmap", - "data-encoding", - "getrandom", - "indexmap", - "itertools 0.10.5", - "lazy_static", - "lightningcss-derive", - "parcel_selectors", - "parcel_sourcemap", - "paste", - "pathdiff", - "rayon", - "serde", - "smallvec", -] - -[[package]] -name = "lightningcss-derive" -version = "1.0.0-alpha.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "outref" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" - -[[package]] -name = "parcel_selectors" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7645c578d3a5c4cdf667af1ad39765f5f751c4883d251e050d5e1204b5cad0a9" -dependencies = [ - "bitflags", - "cssparser", - "log", - "phf", - "phf_codegen", - "precomputed-hash", - "rustc-hash", - "smallvec", -] - -[[package]] -name = "parcel_sourcemap" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" -dependencies = [ - "base64-simd", - "data-url", - "rkyv", - "serde", - "serde_json", - "vlq", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "quote" -version = "1.0.37" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - [[package]] name = "raffia" -version = "0.9.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" +checksum = "a589c5611a5f7713bf0c13e949c4c791a359ff517a9f27552475b470e8873229" dependencies = [ "raffia_macro", "smallvec", @@ -805,79 +109,20 @@ dependencies = [ [[package]] name = "raffia_macro" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" +checksum = "8ac21f5e4bc6b29ea5d5e691a9aa08b2b9fd8891f48a99157b9f02d8a48e1318" dependencies = [ "heck", "quote", - "syn 2.0.90", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags", + "syn 2.0.119", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -887,9 +132,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -898,63 +143,13 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rkyv" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rustc-hash" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "sabry" -version = "0.0.2" +version = "0.0.7" dependencies = [ "sabry_intrnl", "sabry_procmacro", @@ -962,141 +157,88 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.2" +version = "0.0.7" dependencies = [ "base64", - "blake3", "cfg-if", - "grass", - "lightningcss", - "proc-macro2", - "quote", "raffia", - "regex", "serde", - "syn 2.0.90", + "syn 3.0.6", "thiserror", "toml", ] [[package]] name = "sabry_procmacro" -version = "0.0.2" +version = "0.0.7" dependencies = [ - "cfg-if", "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.2" +version = "0.0.7" dependencies = [ - "itertools 0.13.0", + "cfg-if", + "itertools", "proc-macro2", "quote", "raffia", "regex", "sabry_intrnl", - "syn 2.0.90", + "syn 3.0.6", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "serde" -version = "1.0.216" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", -] - -[[package]] -name = "serde_json" -version = "1.0.133" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", + "syn 3.0.6", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ - "serde", + "serde_core", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "simd-abstraction" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" -dependencies = [ - "outref", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - [[package]] name = "smallvec" -version = "1.13.2" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -1105,294 +247,82 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "thiserror" -version = "1.0.69" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 3.0.6", ] -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "toml" -version = "0.8.19" +version = "1.1.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" dependencies = [ "indexmap", - "serde", + "serde_core", "serde_spanned", "toml_datetime", + "toml_parser", + "toml_writer", "winnow", ] +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vlq" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.90", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "winnow" -version = "0.6.20" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" -dependencies = [ - "memchr", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml index e235bcc..e6ca652 100644 --- a/examples/define-styles/Cargo.toml +++ b/examples/define-styles/Cargo.toml @@ -6,4 +6,5 @@ rust-version = "1.88" publish = false [dependencies] -sabry = { path = "../../", features = ["nightly"] } +sabry.path = "../../" +sabry.features = ["nightly"] diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 4a2994b..f5eea60 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -30,31 +30,32 @@ thiserror = "^1" tracing.version = "0.1" tracing.optional = true http = "^1" - # sabry with sass -sabry = { path = "../../" } - +sabry.path = "../../" # our component library -leptos-components = { path = "../leptos-components" } +leptos-components.version = "0.0.0" +leptos-components.path = "../leptos-components" [build-dependencies] # sabry for build with sass -sabry = { path = "../../", features = ["build"] } +sabry.path = "../../" +sabry.features = ["build"] # lets depend on our styles -define-styles = { path = "../define-styles" } +define-styles.version = "0.0.0" +define-styles.path = "../define-styles" [features] hydrate = ["leptos/hydrate"] ssr = [ - "dep:axum", - "dep:tokio", - "dep:tower", - "dep:tower-http", - "dep:leptos_axum", - "leptos/ssr", - "leptos_meta/ssr", - "leptos_router/ssr", - "dep:tracing", + "dep:axum", + "dep:tokio", + "dep:tower", + "dep:tower-http", + "dep:leptos_axum", + "leptos/ssr", + "leptos_meta/ssr", + "leptos_router/ssr", + "dep:tracing", ] [package.metadata.sabry] diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index 6d5e942..f077197 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -1,6 +1,32 @@ use leptos::prelude::*; use sabry::styly; +/// Renders the home page of your application. +#[component] +pub fn Route() -> impl IntoView { + // Creates a reactive value to update the button + let count = RwSignal::new(0); + let on_click = move |_| *count.write() += 1; + + view! {class = STYLE, + <leptos_components::Aside/> // lets use our component + <section class=style::table> + <h2>"Welcome to Leptos"</h2> + <h2 class=""> + "This head is styled with lepty-scopes feature" + <br/> + <span class="">"And this child too!"</span> + </h2> + + <button class=style::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <button class=style::_dark(style::btn) on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <span class=style::card>"DISCLAIMER:"</span> + <p class=style::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> + <p class=style::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> + </section> + } +} + styly!(style {" @use 'tokens'; @use 'utils'; @@ -34,31 +60,4 @@ styly!(style {" @include theme.surface(secondary); text-transform: uppercase; } - "}); - -/// Renders the home page of your application. -#[component] -pub fn Route() -> impl IntoView { - // Creates a reactive value to update the button - let count = RwSignal::new(0); - let on_click = move |_| *count.write() += 1; - - view! {class = STYLE, - <leptos_components::Aside/> // lets use our component - <section class=style::table> - <h2>"Welcome to Leptos"</h2> - <h2 class=""> - "This head is styled with lepty-scopes feature" - <br/> - <span class="">"And this child too!"</span> - </h2> - - <button class=style::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> - <button class=style::_dark(style::btn) on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> - <span class=style::card>"DISCLAIMER:"</span> - <p class=style::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> - <p class=style::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> - </section> - } -} diff --git a/examples/leptos-axum/src/routes/home.scss b/examples/leptos-axum/src/routes/home.scss deleted file mode 100644 index e69de29..0000000 diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml index 2a7cd5b..bc1572c 100644 --- a/examples/leptos-components/Cargo.toml +++ b/examples/leptos-components/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "leptos-components" -version = "0.1.0" +version = "0.0.0" rust-version = "1.88" edition = "2024" publish = false @@ -12,12 +12,14 @@ crate-type = ["cdylib", "rlib"] leptos.version = "^0.8" leptos_meta.version = "^0.8" leptos_router.version = "^0.8" - -sabry = { path = "../../", features = ["const-scoping"] } +sabry.path = "../../" +sabry.features = ["const-scoping"] [build-dependencies] -sabry = { path = "../../", features = ["build", "const-scoping"] } -define-styles = { path = "../define-styles" } +sabry.path = "../../" +sabry.features = ["build", "const-scoping"] +define-styles.version = "0.0.0" +define-styles.path = "../define-styles" [features] hydrate = ["leptos/hydrate"] diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 1e07093..5405d75 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -4,23 +4,12 @@ version = 4 [[package]] name = "ahash" -version = "0.7.8" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -28,9 +17,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] @@ -41,200 +30,29 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - [[package]] name = "base64" -version = "0.22.1" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64-simd" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" -dependencies = [ - "simd-abstraction", -] +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake3" -version = "1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" - -[[package]] -name = "cc" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" -dependencies = [ - "shlex", -] +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "codemap" @@ -242,37 +60,11 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - [[package]] name = "const-str" -version = "0.3.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" -dependencies = [ - "const-str-proc-macro", -] - -[[package]] -name = "const-str-proc-macro" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "18f12cc9948ed9604230cdddc7c86e270f9401ccbe3c2e98a4378c5e7632212f" [[package]] name = "convert_case" @@ -283,90 +75,43 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - [[package]] name = "cssparser" -version = "0.33.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98" dependencies = [ "cssparser-macros", "dtoa-short", "itoa", - "phf", + "phf 0.13.1", "smallvec", ] [[package]] name = "cssparser-color" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +checksum = "bbaa233e1dcd9c13a5d3e3a8a2c0f5a727bac380398345dbcb31db4597edc86b" dependencies = [ "cssparser", ] [[package]] name = "cssparser-macros" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a" dependencies = [ "quote", - "syn 2.0.90", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", + "syn 3.0.6", ] [[package]] name = "data-encoding" -version = "2.6.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "data-url" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" -dependencies = [ - "matches", -] +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" [[package]] name = "define-styles" @@ -377,9 +122,9 @@ dependencies = [ [[package]] name = "dtoa" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" [[package]] name = "dtoa-short" @@ -392,27 +137,51 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "funty" -version = "2.0.0" +name = "fastrand" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -421,14 +190,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + [[package]] name = "grass" version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" dependencies = [ - "clap", - "getrandom", + "getrandom 0.2.17", "grass_compiler", ] @@ -442,17 +222,7 @@ dependencies = [ "indexmap", "lasso", "once_cell", - "phf", - "rand", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", + "phf 0.11.3", ] [[package]] @@ -461,15 +231,15 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", + "ahash", "allocator-api2", ] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" @@ -479,20 +249,16 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indexmap" -version = "2.7.0" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.17.1", + "serde", + "serde_core", ] -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - [[package]] name = "itertools" version = "0.10.5" @@ -504,26 +270,27 @@ dependencies = [ [[package]] name = "itertools" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] @@ -538,40 +305,36 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" [[package]] name = "libc" -version = "0.2.168" +version = "0.2.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] name = "lightningcss" -version = "1.0.0-alpha.61" +version = "1.0.0-alpha.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c9e1f991b3861d25bf872ecca2eb6a73f7a9fe671da047cd1f9b49c65cbc40" +checksum = "d31b760f96e8fdfe1d0c295e4bf76c503d6f15d2d470d53bd8cd1f7aa8c7d934" dependencies = [ - "ahash 0.8.11", + "ahash", "bitflags", "const-str", "cssparser", "cssparser-color", - "dashmap", "data-encoding", - "getrandom", + "getrandom 0.3.4", "indexmap", "itertools 0.10.5", "lazy_static", "lightningcss-derive", "parcel_selectors", - "parcel_sourcemap", - "paste", + "pastey", "pathdiff", - "rayon", - "serde", "smallvec", ] @@ -587,56 +350,34 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" -version = "0.4.22" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "outref" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "parcel_selectors" -version = "0.28.0" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7645c578d3a5c4cdf667af1ad39765f5f751c4883d251e050d5e1204b5cad0a9" +checksum = "d05f71e01edca03d245ab0a9f7ce13a974ceb79baaae8faf2ba0b11de6b90913" dependencies = [ "bitflags", "cssparser", "log", - "phf", + "phf 0.11.3", "phf_codegen", "precomputed-hash", "rustc-hash", @@ -644,37 +385,10 @@ dependencies = [ ] [[package]] -name = "parcel_sourcemap" -version = "2.1.1" +name = "pastey" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" -dependencies = [ - "base64-simd", - "data-url", - "rkyv", - "serde", - "serde_json", - "vlq", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] name = "pathdiff" @@ -684,65 +398,105 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_macros", - "phf_shared", + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", ] [[package]] name = "phf_codegen" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.11.3", + "phf_shared 0.11.3", ] [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared", + "phf_shared 0.11.3", "rand", ] [[package]] -name = "phf_macros" -version = "0.11.2" +name = "phf_generator" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ - "phf_generator", - "phf_shared", + "fastrand", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.119", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", ] [[package]] -name = "ppv-lite86" -version = "0.2.20" +name = "phf_shared" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" dependencies = [ - "zerocopy", + "siphasher", ] +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + [[package]] name = "precomputed-hash" version = "0.1.1" @@ -751,53 +505,33 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "quote" -version = "1.0.37" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] [[package]] -name = "radium" -version = "0.7.0" +name = "r-efi" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "raffia" -version = "0.9.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" +checksum = "a589c5611a5f7713bf0c13e949c4c791a359ff517a9f27552475b470e8873229" dependencies = [ "raffia_macro", "smallvec", @@ -805,33 +539,21 @@ dependencies = [ [[package]] name = "raffia_macro" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" +checksum = "8ac21f5e4bc6b29ea5d5e691a9aa08b2b9fd8891f48a99157b9f02d8a48e1318" dependencies = [ "heck", "quote", - "syn 2.0.90", + "syn 2.0.119", ] [[package]] name = "rand" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", "rand_core", ] @@ -840,44 +562,12 @@ name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags", -] [[package]] name = "regex" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -887,9 +577,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -898,63 +588,25 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rkyv" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rustc-hash" -version = "2.1.0" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] -name = "ryu" -version = "1.0.18" +name = "rustversion" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "sabry" -version = "0.0.2" +version = "0.0.7" dependencies = [ "sabry_build", "sabry_intrnl", @@ -963,54 +615,50 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.2" +version = "0.0.7" dependencies = [ "proc-macro2", "sabry_intrnl", "sabry_procmacro_impl", - "syn 2.0.90", + "syn 3.0.6", "thiserror", "walkdir", ] [[package]] name = "sabry_intrnl" -version = "0.0.2" +version = "0.0.7" dependencies = [ "base64", - "blake3", "cfg-if", "grass", "lightningcss", - "proc-macro2", - "quote", "raffia", - "regex", "serde", - "syn 2.0.90", + "syn 3.0.6", "thiserror", "toml", ] [[package]] name = "sabry_procmacro" -version = "0.0.2" +version = "0.0.7" dependencies = [ - "cfg-if", "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.2" +version = "0.0.7" dependencies = [ - "itertools 0.13.0", + "cfg-if", + "itertools 0.14.0", "proc-macro2", "quote", "raffia", "regex", "sabry_intrnl", - "syn 2.0.90", + "syn 3.0.6", ] [[package]] @@ -1022,97 +670,62 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "serde" -version = "1.0.216" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", -] - -[[package]] -name = "serde_json" -version = "1.0.133" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", + "syn 3.0.6", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ - "serde", + "serde_core", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "simd-abstraction" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" -dependencies = [ - "outref", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - [[package]] name = "siphasher" -version = "0.3.11" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.13.2" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" [[package]] name = "syn" @@ -1127,9 +740,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -1137,91 +750,86 @@ dependencies = [ ] [[package]] -name = "tap" -version = "1.0.1" +name = "syn" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] [[package]] name = "thiserror" -version = "1.0.69" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 3.0.6", ] -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "toml" -version = "0.8.19" +version = "1.1.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" dependencies = [ "indexmap", - "serde", + "serde_core", "serde_spanned", "toml_datetime", + "toml_parser", + "toml_writer", "winnow", ] [[package]] -name = "unicode-ident" -version = "1.0.14" +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "use-styles" @@ -1231,30 +839,12 @@ dependencies = [ "sabry", ] -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" - [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vlq" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" - [[package]] name = "walkdir" version = "2.5.0" @@ -1267,40 +857,37 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasm-bindgen" -version = "0.2.99" +name = "wasip2" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.99" +name = "wasm-bindgen" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.90", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1308,140 +895,78 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.90", - "wasm-bindgen-backend", + "syn 3.0.6", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +dependencies = [ + "unicode-ident", +] [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-targets", + "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - [[package]] name = "winnow" -version = "0.6.20" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" -dependencies = [ - "memchr", -] +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" [[package]] -name = "wyz" -version = "0.5.1" +name = "wit-bindgen" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.119", ] diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml index 9a665b8..4992bc1 100644 --- a/examples/use-styles/Cargo.toml +++ b/examples/use-styles/Cargo.toml @@ -6,11 +6,15 @@ rust-version = "1.88" publish = false [dependencies] -sabry = { path = "../../", features = ["nightly"] } +sabry.version = "0.0.7" +sabry.path = "../../" +sabry.features = ["nightly"] [build-dependencies] -sabry = { path = "../../", features = ["build", "nightly"] } -define-styles = { path = "../define-styles" } +sabry.path = "../../" +sabry.features = ["build"] +define-styles.version = "0.0.0" +define-styles.path = "../define-styles" [package.metadata.sabry] css.bundle = "target/static/style.css" diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index dfa13e8..3ac6e7f 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -1,29 +1,29 @@ [package] name = "sabry_build" -description = "Sabry build magic as a separate crate" version.workspace = true -repository.workspace = true +authors.workspace = true edition.workspace = true rust-version.workspace = true -authors.workspace = true +description = "Sabry build magic as a separate crate" +repository.workspace = true license.workspace = true +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + [dependencies] sabry_intrnl.workspace = true sabry_intrnl.features = ["compile", "scope"] sabry_procmacro_impl.workspace = true sabry_procmacro_impl.features = ["const-compile"] -syn.workspace = true -syn.features = ["visit", "derive", "parsing", "full"] proc-macro2.workspace = true proc-macro2.features = ["span-locations"] +syn.workspace = true +syn.features = ["derive", "full", "parsing", "visit"] thiserror.workspace = true walkdir.workspace = true [features] net-files = [] - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] diff --git a/sabry_build/src/filevisit.rs b/sabry_build/src/filevisit.rs index 8574a4b..4faf3fa 100644 --- a/sabry_build/src/filevisit.rs +++ b/sabry_build/src/filevisit.rs @@ -50,14 +50,19 @@ impl<'ast> Visit<'ast> for StylyVisitor { node.mac.span() ) }); - let macro_data = - styly::parse_macro_syntax(body, self.path.parent().map(|p| p.to_owned())) - .unwrap_or_else(|e| { - panic!( - "could not parse `styly!` macro at {:?}: {e:?}", - node.mac.span() - ) - }); + let source_path = self.path.parent().unwrap_or_else(|| { + panic!( + "could not find source_file at {:?}: none parent exists", + node.mac.span() + ) + }); + let macro_data = styly::parse_macro_syntax(body, source_path.to_owned()) + .unwrap_or_else(|e| { + panic!( + "could not parse `styly!` macro at {:?}: {e:?}", + node.mac.span() + ) + }); self.found_stylys.push(macro_data); } } diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index e078f81..d6e7339 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -1,33 +1,33 @@ [package] name = "sabry_intrnl" -description = "Sabry internal, yet still public library" version.workspace = true -repository.workspace = true +authors.workspace = true edition.workspace = true rust-version.workspace = true -authors.workspace = true +description = "Sabry internal, yet still public library" +repository.workspace = true license.workspace = true -[dependencies] -syn.workspace = true -raffia.workspace = true -grass.workspace = true -grass.optional = true -lightningcss.workspace = true -lightningcss.optional = true -base64.workspace = true -base64.optional = true - -thiserror.workspace = true -serde.workspace = true -serde.features = ["derive"] -toml.workspace = true -cfg-if.workspace = true - -[features] -scope = ["dep:base64"] -compile = ["dep:lightningcss", "dep:grass"] - [package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +base64.workspace = true +base64.optional = true +grass.workspace = true +grass.optional = true +lightningcss.workspace = true +lightningcss.optional = true +raffia.workspace = true +syn.workspace = true + +cfg-if.workspace = true +serde.workspace = true +serde.features = ["derive"] +thiserror.workspace = true +toml.workspace = true + +[features] +compile = ["dep:grass", "dep:lightningcss"] +scope = ["dep:base64"] diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index ab3b5d6..4d6ad29 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -377,35 +377,43 @@ impl ScopedSelector { #[cfg(feature = "scope")] pub fn sanitize_css_member(source: &str) -> String { - let mut target = String::with_capacity(source.len()); - let mut next_uppercase: bool = false; - for (i, c) in source - .chars() - .filter(|c| c.is_alphanumeric() || *c == '-') - .enumerate() - { - // first gidit is prepended with 'n' - if i == 0 && c.is_numeric() { - target.push('n'); - target.push(c); - continue; + let mut target = String::with_capacity(source.len() + 1); + + for part in source.split('-').filter(|p| !p.is_empty()) { + let mut chars = part.chars().filter(|c| c.is_ascii() && c.is_alphanumeric()); + match (chars.next(), chars.next()) { + (None, None) => continue, + (Some(f), None) => { + target.push(f); + continue; + } + (Some(f), Some(s)) => { + target.push(f.to_ascii_uppercase()); + target.push(s); + } + (None, Some(s)) => { + target.push(s); + continue; + } } - // dash is omitted, replacing the next char with its uppercase - if c == '-' { - next_uppercase = true; - continue; - } - - let char = if next_uppercase { - next_uppercase = false; - c.to_ascii_uppercase() - } else { - c - }; - - target.push(char); + chars.for_each(|c| target.push(c)); } + + match target.chars().next() { + Some(c) if c.is_numeric() => { + target.insert(0, 'n'); + } + Some(c) => { + target.replace_range(..1, &c.to_ascii_lowercase().to_string()); + } + _ => { + /* has to produce valid rust ident */ + target.clear(); + target.push_str("unknown"); + } + } + target } diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 13e4092..99262d8 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -1,13 +1,17 @@ [package] name = "sabry_procmacro" -description = "Sabry proc-macro declarations" version.workspace = true -repository.workspace = true +authors.workspace = true edition.workspace = true rust-version.workspace = true -authors.workspace = true +description = "Sabry proc-macro declarations" +repository.workspace = true license.workspace = true +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + [lib] proc-macro = true @@ -16,7 +20,4 @@ sabry_procmacro_impl.workspace = true [features] const-compile = ["sabry_procmacro_impl/const-compile"] - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] +nightly = ["sabry_procmacro_impl/nightly"] diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index 827576c..84363ea 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -37,8 +37,11 @@ use sabry_procmacro_impl::impls::{ /// #[proc_macro] pub fn scssy(input: TokenStream) -> TokenStream { - let source_path = - PathBuf::from_str(&proc_macro::Span::call_site().file()).expect("Irrefutable result"); + let source_path = PathBuf::from_str(&proc_macro::Span::call_site().file()) + .expect("Irrefutable result") + .parent() + .expect("The scssy procmacro callsite source file has no parent dir") + .to_owned(); scssy_macro_impl(input.into(), source_path).into() } diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index 05646ba..229540a 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -1,30 +1,30 @@ [package] name = "sabry_procmacro_impl" -description = "Sabry proc-macro internals reusable outside of proc-macro context" version.workspace = true -repository.workspace = true +authors.workspace = true edition.workspace = true rust-version.workspace = true -authors.workspace = true +description = "Sabry proc-macro internals reusable outside of proc-macro context" +repository.workspace = true license.workspace = true -[dependencies] -sabry_intrnl.workspace = true -sabry_intrnl.features = ["scope"] -raffia.workspace = true -syn.workspace = true -syn.features = ["parsing"] -quote.workspace = true -proc-macro2.workspace = true -proc-macro2.features = ["span-locations"] -regex.workspace = true -itertools.workspace = true -cfg-if.workspace = true - -[features] -nightly = [] -const-compile = ["sabry_intrnl/compile"] - [package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +cfg-if.workspace = true +itertools.workspace = true +proc-macro2.workspace = true +proc-macro2.features = ["span-locations"] +quote.workspace = true +raffia.workspace = true +regex.workspace = true +sabry_intrnl.workspace = true +sabry_intrnl.features = ["scope"] +syn.workspace = true +syn.features = ["parsing"] + +[features] +const-compile = ["sabry_intrnl/compile"] +nightly = [] diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index 59b79d8..eaac922 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -48,7 +48,7 @@ impl ArbitraryStyleBlock { return Err(syn::Error::new( path_tok.span(), format!( - "Could not use path {path:?}: {:?}. If the path is relative and 'nightly' feature flag is set - this is likely false-positive", + "Could not use path {path:?}: {:?}. If the path is relative, nightly rust has to be used and `nightly` feature flag has to be set", e.kind() ), )); diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index d8b6f91..cf0d81b 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -89,14 +89,12 @@ pub fn styly_macro_impl(input: TokenStream, source_path: PathBuf) -> TokenStream _ => None, }; - let interp = interp.and_then(|i| match i.elements.first() { + interp.and_then(|i| match i.elements.first() { Some(raffia::ast::SassInterpolatedIdentElement::Static(i)) => { Some(i.raw.to_string()) } _ => None, - }); - - interp + }) }) }) .unique() diff --git a/tombi.toml b/tombi.toml new file mode 100644 index 0000000..9d8da2c --- /dev/null +++ b/tombi.toml @@ -0,0 +1,9 @@ +[[schemas]] +path = "tombi://www.schemastore.org/cargo.json" +include = ["Cargo.toml"] +format.rules.array-values-order.enabled = false +format.rules.table-keys-order.enabled = false + +[[schemas.overrides]] +targets = ["workspace.dependencies", "dependencies", "dev-dependencies", "build-dependencies"] +format.rules = { table-keys-order.enabled = false } From e1c20fe2e8f514e10cbe8bf7f1e9c4cd00208c96 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Mon, 5 Oct 2026 23:58:44 +0300 Subject: [PATCH 082/184] chore: 0.0.7 cleanup --- .gitignore | 1 + Cargo.toml | 6 +++--- deny.toml | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 deny.toml diff --git a/.gitignore b/.gitignore index ae8e48f..5a8005a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ rust-toolchain.toml .vscode .profile +.envrc /Cargo.lock /tests/sabry_intermediate /tests/sabry_output diff --git a/Cargo.toml b/Cargo.toml index b1bf54b..78f0188 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ exclude = ["examples"] [workspace.package] version = "0.0.7" edition = "2024" -rust-version = "1.88" +rust-version = "1.89" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] repository = "https://github.com/yiffyrusdev/sabry" license = "MIT" @@ -28,14 +28,14 @@ lightningcss.version = "1.0.0-alpha.72" lightningcss.default-features = false grass.version = "^0.13" grass.default-features = false -raffia.version = "^0.12" +raffia.version = "^0.13" ## Marshall serde.version = "^1" toml.version = "^1" base64.version = "^0.23" regex.version = "^1" ## Util -itertools.version = "^0.14" +itertools.version = "^0.15" walkdir.version = "^2" ## Codegen cfg-if.version = "^1" diff --git a/deny.toml b/deny.toml new file mode 100644 index 0000000..d7a99c2 --- /dev/null +++ b/deny.toml @@ -0,0 +1,52 @@ +[graph] +targets = [ + {triple = "x86_64-unknown-linux-gnu"}, +] +all-features = false +no-default-features = false + +[output] +feature-depth = 1 + +[advisories] +db-urls = ["https://github.com/rustsec/advisory-db"] +ignore = [] + +[licenses] +allow = [ + "MIT", + "Apache-2.0", + "Apache-2.0 WITH LLVM-exception", + "BSD-2-Clause", + "CC0-1.0", + "Unlicense", + "Unicode-3.0", +] +confidence-threshold = 0.8 +exceptions = [] + +[licenses.private] +ignore = true +registries = [] + +[bans] +multiple-versions = "warn" +wildcards = "deny" +highlight = "simplest-path" +workspace-default-features = "allow" +external-default-features = "allow" +allow = [] +allow-workspace = false +deny = [] +skip-tree = [] + +[sources] +unknown-registry = "warn" +unknown-git = "warn" +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +allow-git = [] + +[sources.allow-org] +github = [] +gitlab = [] +bitbucket = [] From ca892220b08ccb87ab1791ba11c7407a58974eaf Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:02:58 +0300 Subject: [PATCH 083/184] chore: 0.0.7 approve new test snapshots --- .../compilation_with_buildy@bundle.css.snap | 257 +++++++++--------- ...n_with_buildy@scopes__global_scss.css.snap | 18 +- ..._buildy@scopes__module_usage_sass.css.snap | 48 ++-- ..._buildy@scopes__module_usage_scss.css.snap | 48 ++-- ...y@scopes__repeating_selector_sass.css.snap | 16 +- ...y@scopes__repeating_selector_scss.css.snap | 24 +- ...ith_buildy@scopes__sole_code_sass.css.snap | 12 +- ...ith_buildy@scopes__sole_code_scss.css.snap | 12 +- ...buildy@scopes__use_forwarded_sass.css.snap | 48 ++-- ...buildy@scopes__use_forwarded_scss.css.snap | 48 ++-- 10 files changed, 256 insertions(+), 275 deletions(-) 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 9b70a49..f40ca0f 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -1,358 +1,357 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/bundle.css --- -.wZIQboPSLZ8aKu0MjXHwYg.p1 { +.n4aLPsz0DYTE.p1 { font-size: 10px; color: #fff; } -.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { +.n4aLPsz0DYTE.p1-dark { color: #000; } -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { +html.mob .n4aLPsz0DYTE.p1 { font-size: 1rem; } -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { +html.mob .n4aLPsz0DYTE.p1-dark { color: green; } -ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { +ie some.n4aLPsz0DYTE html.mob .n4aLPsz0DYTE.p1 { border: 1px; } -html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { +html.dark .n4aLPsz0DYTE.p1 { color: orange; } -whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { +whatever .n4aLPsz0DYTE.p1 { background: #ff0; } -ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { +ooops whatever .n4aLPsz0DYTE.p1 { border: none; } -.n5vGKZlIscA58H8d7ZMOhSw.coated { +.nKenbAxSNs.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after { +.nKenbAxSNs.coated:after { content: "Colored"; color: green; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { +.nKenbAxSNs.coated:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { +.nKenbAxSNs.coated:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after { +.nKenbAxSNs.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { +.nKenbAxSNs.coated:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { +.nKenbAxSNs.coated:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark { +.nKenbAxSNs.coated-dark { color: #c6c6c6; background-color: #0ff; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after { +.nKenbAxSNs.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after:hover { +.nKenbAxSNs.coated-dark:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:hover { +.nKenbAxSNs.coated-dark:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated-dark a.nKenbAxSNs { color: #c6c6c6; background-color: #0ff; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:after { content: "Colored"; color: #00f; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs { color: #fff; background-color: green; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:after { content: "Colored"; color: #000; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated span.nKenbAxSNs { color: #c6c6c6; background-color: #0ff; display: block; } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated span.nKenbAxSNs:after { content: "Colored"; color: green; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated span.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated span.nKenbAxSNs:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated { +.mMNbTGLet9k.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after { +.mMNbTGLet9k.coated:after { content: "Colored"; color: green; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { +.mMNbTGLet9k.coated:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated:hover { +.mMNbTGLet9k.coated:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated:after { +.mMNbTGLet9k.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { +.mMNbTGLet9k.coated:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated:hover { +.mMNbTGLet9k.coated:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark { +.mMNbTGLet9k.coated-dark { color: #c6c6c6; background-color: #0ff; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after { +.mMNbTGLet9k.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after:hover { +.mMNbTGLet9k.coated-dark:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:hover { +.mMNbTGLet9k.coated-dark:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k { color: #c6c6c6; background-color: #0ff; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:after { content: "Colored"; color: #00f; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k { color: #fff; background-color: green; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:after { content: "Colored"; color: #000; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated span.mMNbTGLet9k { color: #c6c6c6; background-color: #0ff; display: block; } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated span.mMNbTGLet9k:after { content: "Colored"; color: green; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated span.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated span.mMNbTGLet9k:hover { transform: translateX(10%); } -.rWkBO00R__2y_lbRfXlyg.el1 { +.xm0JxM8Vqpg.el1 { color: red; } -.rWkBO00R__2y_lbRfXlyg.el1-mob { +.xm0JxM8Vqpg.el1-mob { color: #00f; } -.rWkBO00R__2y_lbRfXlyg.el1__blist { +.xm0JxM8Vqpg.el1__blist { list-style: none; } -.rWkBO00R__2y_lbRfXlyg.el2 { +.xm0JxM8Vqpg.el2 { color: #fff; } -.rWkBO00R__2y_lbRfXlyg.el2-mob { +.xm0JxM8Vqpg.el2-mob { color: #000; } -.rWkBO00R__2y_lbRfXlyg.el2__blist { +.xm0JxM8Vqpg.el2__blist { background: #fff; } -.rWkBO00R__2y_lbRfXlyg.el2__blist-mob { +.xm0JxM8Vqpg.el2__blist-mob { background: #000; } -.n9m9Me_zRl6xP8NIGObY_A.el1 { +.wCmhvw6X7vw.el1 { color: red; } -.n9m9Me_zRl6xP8NIGObY_A.el1-mob { +.wCmhvw6X7vw.el1-mob { color: #00f; } -.n9m9Me_zRl6xP8NIGObY_A.el1__blist { +.wCmhvw6X7vw.el1__blist { list-style: none; } -.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { +.wCmhvw6X7vw.el1.wCmhvw6X7vw.sub { margin: 0; } -.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { +.wCmhvw6X7vw.bus .wCmhvw6X7vw.el1 { padding: 0; } -.n9m9Me_zRl6xP8NIGObY_A.el2 { +.wCmhvw6X7vw.el2 { color: #fff; } -.n9m9Me_zRl6xP8NIGObY_A.el2-mob { +.wCmhvw6X7vw.el2-mob { color: #000; } -.n9m9Me_zRl6xP8NIGObY_A.el2__blist { +.wCmhvw6X7vw.el2__blist { background: #fff; } -.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { +.wCmhvw6X7vw.el2__blist-mob { background: #000; } -.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { +.wCmhvw6X7vw.el2.wCmhvw6X7vw.sub { margin: 0; } -.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { +.wCmhvw6X7vw.el2 .wCmhvw6X7vw.bus { margin: 0; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz { +.vnm6NZhBSSY.fuzz { background-color: red; display: block; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark { +.vnm6NZhBSSY.fuzz-dark { background-color: #000; color: #fff; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz-dark a.vnm6NZhBSSY { text-transform: uppercase; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w img.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz-dark a.vnm6NZhBSSY img.vnm6NZhBSSY { position: absolute; top: 0; left: 10rem; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz span.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz span.vnm6NZhBSSY { position: relative; display: grid; grid-template-areas: "a b c" @@ -361,27 +360,27 @@ ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { display: block; } -.FT5yVVwswyLvNU3dIk0qw.fuzz { +.n3N0gcUIyf7I.fuzz { background-color: red; display: block; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark { +.n3N0gcUIyf7I.fuzz-dark { background-color: #000; color: #fff; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz-dark a.n3N0gcUIyf7I { text-transform: uppercase; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw img.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz-dark a.n3N0gcUIyf7I img.n3N0gcUIyf7I { position: absolute; top: 0; left: 10rem; } -.FT5yVVwswyLvNU3dIk0qw.fuzz span.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz span.n3N0gcUIyf7I { position: relative; display: grid; grid-template-areas: "a b c" @@ -390,226 +389,226 @@ ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { display: block; } -.qK4fsMeZRSTGObSesXXRBA.coated { +.dGuHauwffw.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.qK4fsMeZRSTGObSesXXRBA.coated:after { +.dGuHauwffw.coated:after { content: "Colored"; color: green; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { +.dGuHauwffw.coated:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated:hover { +.dGuHauwffw.coated:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated:after { +.dGuHauwffw.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { +.dGuHauwffw.coated:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated:hover { +.dGuHauwffw.coated:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark { +.dGuHauwffw.coated-dark { color: #c6c6c6; background-color: #0ff; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:after { +.dGuHauwffw.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:after:hover { +.dGuHauwffw.coated-dark:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:hover { +.dGuHauwffw.coated-dark:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated-dark a.dGuHauwffw { color: #c6c6c6; background-color: #0ff; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated-dark a.dGuHauwffw:after { content: "Colored"; color: #00f; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw { color: #fff; background-color: green; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:after { content: "Colored"; color: #000; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated span.dGuHauwffw { color: #c6c6c6; background-color: #0ff; display: block; } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated span.dGuHauwffw:after { content: "Colored"; color: green; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated span.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated span.dGuHauwffw:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated { +.h9QvS1beJbo.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after { +.h9QvS1beJbo.coated:after { content: "Colored"; color: green; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { +.h9QvS1beJbo.coated:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated:hover { +.h9QvS1beJbo.coated:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated:after { +.h9QvS1beJbo.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { +.h9QvS1beJbo.coated:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated:hover { +.h9QvS1beJbo.coated:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark { +.h9QvS1beJbo.coated-dark { color: #c6c6c6; background-color: #0ff; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after { +.h9QvS1beJbo.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after:hover { +.h9QvS1beJbo.coated-dark:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:hover { +.h9QvS1beJbo.coated-dark:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo { color: #c6c6c6; background-color: #0ff; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:after { content: "Colored"; color: #00f; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo { color: #fff; background-color: green; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:after { content: "Colored"; color: #000; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated span.h9QvS1beJbo { color: #c6c6c6; background-color: #0ff; display: block; } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated span.h9QvS1beJbo:after { content: "Colored"; color: green; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated span.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated span.h9QvS1beJbo:hover { transform: translateX(10%); } diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap index a2a6ddf..e7abc3b 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap @@ -1,38 +1,36 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/global_scss.css -snapshot_kind: text --- -.wZIQboPSLZ8aKu0MjXHwYg.p1 { +.n4aLPsz0DYTE.p1 { font-size: 10px; color: #fff; } -.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { +.n4aLPsz0DYTE.p1-dark { color: #000; } -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { +html.mob .n4aLPsz0DYTE.p1 { font-size: 1rem; } -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { +html.mob .n4aLPsz0DYTE.p1-dark { color: green; } -ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { +ie some.n4aLPsz0DYTE html.mob .n4aLPsz0DYTE.p1 { border: 1px; } -html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { +html.dark .n4aLPsz0DYTE.p1 { color: orange; } -whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { +whatever .n4aLPsz0DYTE.p1 { background: #ff0; } -ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { +ooops whatever .n4aLPsz0DYTE.p1 { border: none; } diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap index 59776f1..57adc44 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap @@ -1,117 +1,115 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/module_usage_sass.css -snapshot_kind: text --- -.n5vGKZlIscA58H8d7ZMOhSw.coated { +.nKenbAxSNs.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after { +.nKenbAxSNs.coated:after { content: "Colored"; color: green; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { +.nKenbAxSNs.coated:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { +.nKenbAxSNs.coated:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after { +.nKenbAxSNs.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { +.nKenbAxSNs.coated:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { +.nKenbAxSNs.coated:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark { +.nKenbAxSNs.coated-dark { color: #c6c6c6; background-color: #0ff; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after { +.nKenbAxSNs.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after:hover { +.nKenbAxSNs.coated-dark:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:hover { +.nKenbAxSNs.coated-dark:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated-dark a.nKenbAxSNs { color: #c6c6c6; background-color: #0ff; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:after { content: "Colored"; color: #00f; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs { color: #fff; background-color: green; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:after { content: "Colored"; color: #000; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated span.nKenbAxSNs { color: #c6c6c6; background-color: #0ff; display: block; } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated span.nKenbAxSNs:after { content: "Colored"; color: green; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated span.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated span.nKenbAxSNs:hover { transform: translateX(10%); } diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap index f26df0f..14bfd30 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap @@ -1,117 +1,115 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/module_usage_scss.css -snapshot_kind: text --- -.n6ROVrVzYikGtxgKBYy11kA.coated { +.mMNbTGLet9k.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after { +.mMNbTGLet9k.coated:after { content: "Colored"; color: green; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { +.mMNbTGLet9k.coated:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated:hover { +.mMNbTGLet9k.coated:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated:after { +.mMNbTGLet9k.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { +.mMNbTGLet9k.coated:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated:hover { +.mMNbTGLet9k.coated:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark { +.mMNbTGLet9k.coated-dark { color: #c6c6c6; background-color: #0ff; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after { +.mMNbTGLet9k.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after:hover { +.mMNbTGLet9k.coated-dark:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:hover { +.mMNbTGLet9k.coated-dark:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k { color: #c6c6c6; background-color: #0ff; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:after { content: "Colored"; color: #00f; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k { color: #fff; background-color: green; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:after { content: "Colored"; color: #000; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated span.mMNbTGLet9k { color: #c6c6c6; background-color: #0ff; display: block; } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated span.mMNbTGLet9k:after { content: "Colored"; color: green; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated span.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated span.mMNbTGLet9k:hover { transform: translateX(10%); } 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 index ecff4e6..3fbd4b8 100644 --- 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 @@ -1,33 +1,31 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/repeating_selector_sass.css -snapshot_kind: text --- -.rWkBO00R__2y_lbRfXlyg.el1 { +.xm0JxM8Vqpg.el1 { color: red; } -.rWkBO00R__2y_lbRfXlyg.el1-mob { +.xm0JxM8Vqpg.el1-mob { color: #00f; } -.rWkBO00R__2y_lbRfXlyg.el1__blist { +.xm0JxM8Vqpg.el1__blist { list-style: none; } -.rWkBO00R__2y_lbRfXlyg.el2 { +.xm0JxM8Vqpg.el2 { color: #fff; } -.rWkBO00R__2y_lbRfXlyg.el2-mob { +.xm0JxM8Vqpg.el2-mob { color: #000; } -.rWkBO00R__2y_lbRfXlyg.el2__blist { +.xm0JxM8Vqpg.el2__blist { background: #fff; } -.rWkBO00R__2y_lbRfXlyg.el2__blist-mob { +.xm0JxM8Vqpg.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 index e40637f..b461f46 100644 --- 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 @@ -1,49 +1,47 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/repeating_selector_scss.css -snapshot_kind: text --- -.n9m9Me_zRl6xP8NIGObY_A.el1 { +.wCmhvw6X7vw.el1 { color: red; } -.n9m9Me_zRl6xP8NIGObY_A.el1-mob { +.wCmhvw6X7vw.el1-mob { color: #00f; } -.n9m9Me_zRl6xP8NIGObY_A.el1__blist { +.wCmhvw6X7vw.el1__blist { list-style: none; } -.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { +.wCmhvw6X7vw.el1.wCmhvw6X7vw.sub { margin: 0; } -.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { +.wCmhvw6X7vw.bus .wCmhvw6X7vw.el1 { padding: 0; } -.n9m9Me_zRl6xP8NIGObY_A.el2 { +.wCmhvw6X7vw.el2 { color: #fff; } -.n9m9Me_zRl6xP8NIGObY_A.el2-mob { +.wCmhvw6X7vw.el2-mob { color: #000; } -.n9m9Me_zRl6xP8NIGObY_A.el2__blist { +.wCmhvw6X7vw.el2__blist { background: #fff; } -.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { +.wCmhvw6X7vw.el2__blist-mob { background: #000; } -.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { +.wCmhvw6X7vw.el2.wCmhvw6X7vw.sub { margin: 0; } -.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { +.wCmhvw6X7vw.el2 .wCmhvw6X7vw.bus { margin: 0; } diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap index 2b91afc..95c53a7 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap @@ -1,30 +1,28 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/sole_code_sass.css -snapshot_kind: text --- -.smfXzGrnTs2kl9jPP0nk6w.fuzz { +.vnm6NZhBSSY.fuzz { background-color: red; display: block; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark { +.vnm6NZhBSSY.fuzz-dark { background-color: #000; color: #fff; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz-dark a.vnm6NZhBSSY { text-transform: uppercase; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w img.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz-dark a.vnm6NZhBSSY img.vnm6NZhBSSY { position: absolute; top: 0; left: 10rem; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz span.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz span.vnm6NZhBSSY { position: relative; display: grid; grid-template-areas: "a b c" diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap index 7cb4253..d5e3d9a 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap @@ -1,30 +1,28 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/sole_code_scss.css -snapshot_kind: text --- -.FT5yVVwswyLvNU3dIk0qw.fuzz { +.n3N0gcUIyf7I.fuzz { background-color: red; display: block; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark { +.n3N0gcUIyf7I.fuzz-dark { background-color: #000; color: #fff; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz-dark a.n3N0gcUIyf7I { text-transform: uppercase; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw img.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz-dark a.n3N0gcUIyf7I img.n3N0gcUIyf7I { position: absolute; top: 0; left: 10rem; } -.FT5yVVwswyLvNU3dIk0qw.fuzz span.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz span.n3N0gcUIyf7I { position: relative; display: grid; grid-template-areas: "a b c" diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap index 5f18c81..c65d115 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap @@ -1,117 +1,115 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/use_forwarded_sass.css -snapshot_kind: text --- -.qK4fsMeZRSTGObSesXXRBA.coated { +.dGuHauwffw.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.qK4fsMeZRSTGObSesXXRBA.coated:after { +.dGuHauwffw.coated:after { content: "Colored"; color: green; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { +.dGuHauwffw.coated:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated:hover { +.dGuHauwffw.coated:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated:after { +.dGuHauwffw.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { +.dGuHauwffw.coated:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated:hover { +.dGuHauwffw.coated:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark { +.dGuHauwffw.coated-dark { color: #c6c6c6; background-color: #0ff; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:after { +.dGuHauwffw.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:after:hover { +.dGuHauwffw.coated-dark:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:hover { +.dGuHauwffw.coated-dark:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated-dark a.dGuHauwffw { color: #c6c6c6; background-color: #0ff; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated-dark a.dGuHauwffw:after { content: "Colored"; color: #00f; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw { color: #fff; background-color: green; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:after { content: "Colored"; color: #000; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated span.dGuHauwffw { color: #c6c6c6; background-color: #0ff; display: block; } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated span.dGuHauwffw:after { content: "Colored"; color: green; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated span.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated span.dGuHauwffw:hover { transform: translateX(10%); } diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap index 68599c1..dfab0b5 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap @@ -1,117 +1,115 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/use_forwarded_scss.css -snapshot_kind: text --- -.FMHIHNH4_QHxbUqdVmS1A.coated { +.h9QvS1beJbo.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after { +.h9QvS1beJbo.coated:after { content: "Colored"; color: green; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { +.h9QvS1beJbo.coated:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated:hover { +.h9QvS1beJbo.coated:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated:after { +.h9QvS1beJbo.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { +.h9QvS1beJbo.coated:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated:hover { +.h9QvS1beJbo.coated:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark { +.h9QvS1beJbo.coated-dark { color: #c6c6c6; background-color: #0ff; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after { +.h9QvS1beJbo.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after:hover { +.h9QvS1beJbo.coated-dark:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:hover { +.h9QvS1beJbo.coated-dark:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo { color: #c6c6c6; background-color: #0ff; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:after { content: "Colored"; color: #00f; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo { color: #fff; background-color: green; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:after { content: "Colored"; color: #000; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated span.h9QvS1beJbo { color: #c6c6c6; background-color: #0ff; display: block; } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated span.h9QvS1beJbo:after { content: "Colored"; color: green; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated span.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated span.h9QvS1beJbo:hover { transform: translateX(10%); } From f81977fc1100ca2ec0d433cc8e3b52629ffdd2a5 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:08:35 +0300 Subject: [PATCH 084/184] chore: 0.0.7 update example usage --- examples/leptos-axum/src/routes/home.rs | 16 ++++++++-------- examples/leptos-axum/src/shell.rs | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index f077197..989aeec 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -10,19 +10,19 @@ pub fn Route() -> impl IntoView { view! {class = STYLE, <leptos_components::Aside/> // lets use our component - <section class=style::table> + <section class="table"> <h2>"Welcome to Leptos"</h2> - <h2 class=""> + <h2> "This head is styled with lepty-scopes feature" <br/> - <span class="">"And this child too!"</span> + <span>"And this child too!"</span> </h2> - <button class=style::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> - <button class=style::_dark(style::btn) on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> - <span class=style::card>"DISCLAIMER:"</span> - <p class=style::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> - <p class=style::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> + <button class="btn" on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <button class="btn btn-dark" on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <span class="card">"DISCLAIMER:"</span> + <p class="pocwarn">"This isn't a design example! Its just proof of sabry's capabilities."</p> + <p class="pocwarn">"Plz dont make websites/apps which look like this page :D"</p> </section> } } diff --git a/examples/leptos-axum/src/shell.rs b/examples/leptos-axum/src/shell.rs index d1d757e..323a55f 100644 --- a/examples/leptos-axum/src/shell.rs +++ b/examples/leptos-axum/src/shell.rs @@ -1,8 +1,8 @@ use leptos::prelude::*; -use leptos_meta::{provide_meta_context, MetaTags, Stylesheet, Title}; +use leptos_meta::{MetaTags, Stylesheet, Title, provide_meta_context}; use leptos_router::{ - components::{Route, Router, Routes}, StaticSegment, + components::{Route, Router, Routes}, }; use sabry::styly; From 8a202ba80f4c5bb58bfa5099ef4f7e8a51b8b1aa Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:10:28 +0300 Subject: [PATCH 085/184] chore: 0.0.7 upade README links for examples --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0fe9f97..e4f0e35 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ Also, just about everything is pub-available in this crate (with *internals* fea Feel free to check out examples: -|[crate of styles](https://github.com/yiffyrusdev/sabry/tree/master/examples/define-styles)|[style usage](https://github.com/yiffyrusdev/sabry/tree/master/examples/use-styles)|[leptos-axum with sabry](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum)|[leptos components](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-components)| +|[crate of styles](./examples/define-styles)|[style usage](./examples/use-styles)|[leptos-axum with sabry](./examples/leptos-axum)|[leptos components](./examples/leptos-components)| |-|-|-|-| ### Create a crate full of arbitrary SASS From 2de0fc0ebf1541e2cb0533c59d551b310a4b893e Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:18:41 +0300 Subject: [PATCH 086/184] chore: Release --- sabry_intrnl/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md index c9cabbd..65e87f3 100644 --- a/sabry_intrnl/README.md +++ b/sabry_intrnl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` From dab648a4511e2e8c71d7be0bf9109233cf21b8d1 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:20:15 +0300 Subject: [PATCH 087/184] chore: Release --- sabry_procmacro_impl/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md index c0e51bf..7631af2 100644 --- a/sabry_procmacro_impl/README.md +++ b/sabry_procmacro_impl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` From ddc1922456c29c89ce4469ac2785124a0228217f Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:20:40 +0300 Subject: [PATCH 088/184] chore: Release --- sabry_procmacro/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md index 29fef06..285dc7f 100644 --- a/sabry_procmacro/README.md +++ b/sabry_procmacro/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` From 9fc6eb217a85e0af99c819934a78609862e8a5bc Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:21:10 +0300 Subject: [PATCH 089/184] chore: Release --- sabry_build/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sabry_build/README.md b/sabry_build/README.md index e08a18f..7b8ddc7 100644 --- a/sabry_build/README.md +++ b/sabry_build/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` From 1c7ccc58fe4c4c0d1ad48c40b3cb1a5e69d2f7d8 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:21:38 +0300 Subject: [PATCH 090/184] chore: Release --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e4f0e35..a1a5e1d 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ The only need is the dependency #Cargo.toml [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` And a proc-macro ```rust @@ -161,7 +161,7 @@ Depend on sabry # Cargo.toml [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` And create a style scope wherever you want: ```rust @@ -199,10 +199,10 @@ To be able to compile all styles sabry also needs the *build* feature flag: # Cargo.toml [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} [build-dependencies] -sabry = {version = "0.0.6", features = ["build"]} +sabry = {version = "0.0.7", features = ["build"]} ``` > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. From 0a0cbeee1ae21e6e871e2bff33c129b6bc9e3512 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Sun, 11 Oct 2026 22:57:27 +0300 Subject: [PATCH 091/184] fix!: bring `const` scopes back - replace grass with sasso - drop lightningcss - rearrange crate and workspace hierarchy & features --- .gitignore | 1 - Cargo.lock | 2030 +++++++++++++++++ Cargo.toml | 62 +- sabry/Cargo.toml | 28 + sabry/src/lib.rs | 4 + sabry_build/Cargo.toml | 7 +- sabry_build/src/buildmagic.rs | 70 +- sabry_build/src/lib.rs | 3 + sabry_intrnl/Cargo.toml | 26 +- sabry_intrnl/src/compiler/mod.rs | 139 -- sabry_intrnl/src/{config => conf}/manifest.rs | 0 sabry_intrnl/src/conf/mod.rs | 210 ++ sabry_intrnl/src/config/mod.rs | 246 -- sabry_intrnl/src/lib.rs | 8 +- sabry_intrnl/src/scoper/hash.rs | 95 - sabry_intrnl/src/style/compiler.rs | 49 + sabry_intrnl/src/style/mod.rs | 5 + .../src/{scoper/mod.rs => style/scope.rs} | 123 +- .../src/{syntax/mod.rs => style/syntax.rs} | 88 +- sabry_intrnl/src/syntax/ostrta.rs | 61 - sabry_procmacro/Cargo.toml | 1 - sabry_procmacro_impl/Cargo.toml | 15 +- sabry_procmacro_impl/src/impls/mod.rs | 13 +- sabry_procmacro_impl/src/impls/scssy.rs | 11 +- sabry_procmacro_impl/src/impls/styly.rs | 73 +- src/lib.rs | 18 - 26 files changed, 2616 insertions(+), 770 deletions(-) create mode 100644 Cargo.lock create mode 100644 sabry/Cargo.toml create mode 100644 sabry/src/lib.rs delete mode 100644 sabry_intrnl/src/compiler/mod.rs rename sabry_intrnl/src/{config => conf}/manifest.rs (100%) create mode 100644 sabry_intrnl/src/conf/mod.rs delete mode 100644 sabry_intrnl/src/config/mod.rs delete mode 100644 sabry_intrnl/src/scoper/hash.rs create mode 100644 sabry_intrnl/src/style/compiler.rs create mode 100644 sabry_intrnl/src/style/mod.rs rename sabry_intrnl/src/{scoper/mod.rs => style/scope.rs} (84%) rename sabry_intrnl/src/{syntax/mod.rs => style/syntax.rs} (78%) delete mode 100644 sabry_intrnl/src/syntax/ostrta.rs delete mode 100644 src/lib.rs diff --git a/.gitignore b/.gitignore index 5a8005a..24b4f0e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ rust-toolchain.toml .vscode .profile .envrc -/Cargo.lock /tests/sabry_intermediate /tests/sabry_output /playground diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..aeed6ed --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2030 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "any_spawner" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1384d3fe1eecb464229fcf6eebb72306591c56bf27b373561489458a7c73027d" +dependencies = [ + "futures", + "thiserror 2.0.21", + "wasm-bindgen-futures", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-once-cell" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288f83726785267c6f2ef073a3d83dc3f9b81464e9f99898240cced85fce35a" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "attribute-derive" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f9ef7a68684657ce9da341c934c73b63df7a3585a61e366d84c84ed5d3d167" +dependencies = [ + "attribute-derive-macro", + "manyhow", + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "attribute-derive-macro" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300d426e5e73549125bb8e4649bdd5508f82c94ddf898fb0517246e71dfb8e98" +dependencies = [ + "collection_literals", + "interpolator", + "manyhow", + "proc-macro-utils", + "proc-macro2", + "quote", + "quote-use", + "syn 3.0.6", +] + +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bstr" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" +dependencies = [ + "memchr", + "serde_core", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "camino" +version = "1.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbad30e4b4c14a39e3cc8aed085a12a327257c316619c93581e017bc52be591" + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "codee" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9dbbdc4b4d349732bc6690de10a9de952bd39ba6a065c586e26600b6b0b91f5" +dependencies = [ + "serde", + "serde_json", + "thiserror 2.0.21", +] + +[[package]] +name = "collection_literals" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2550f75b8cfac212855f6b1885455df8eaee8fe8e246b647d69146142e016084" + +[[package]] +name = "config" +version = "0.15.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e9fbc53afcec54441422f1c596cd054655b32e70e1cbac956651b7b175a404" +dependencies = [ + "convert_case 0.6.0", + "pathdiff", + "serde_core", + "toml", + "winnow", +] + +[[package]] +name = "console" +version = "0.16.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96a4956774c13c126a8b5af4daa79384f4d826534c95a02d76afb39e2ab64e3" +dependencies = [ + "encode_unicode", + "libc", + "windows-sys", +] + +[[package]] +name = "const-str" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18f12cc9948ed9604230cdddc7c86e270f9401ccbe3c2e98a4378c5e7632212f" + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "const_str_slice_concat" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67855af358fcb20fac58f9d714c94e2b228fe5694c1c9b4ead4a366343eda1b" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "convert_case" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "convert_case_extras" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589c70f0faf8aa9d17787557d5eae854d7755cac50f5c3d12c81d3d57661cebb" +dependencies = [ + "convert_case 0.11.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derive-where" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e2b94854e8576378ccda7c8de8a66ed8b4e8acbd2c50ec3418ea6c8aaf4b567" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "drain_filter_polyfill" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" + +[[package]] +name = "either" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" + +[[package]] +name = "either_of" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5060e0a4cbf26a87550792688ade88e6b8aec9208613631a7a363bda7bc2d4cd" +dependencies = [ + "paste", + "pin-project-lite", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1731451909bde27714eacba19c2566362a7f35224f52b153d3f42cf60f72472" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "globset" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "guardian" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e2ac29387b1aa07a1e448f7bb4f35b500787971e965b02842b900afa5c8f6f" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "html-escape" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9356095b4b41197bba32173600e1582792cda618f65d12f68e2e77d273413c5" + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "hydration_context" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "285b05858fe7d58c5eff059f7b46c228fd86996d996c59eb35fc0340d174f640" +dependencies = [ + "futures", + "or_poisoned", + "pin-project-lite", + "serde", + "throw_error", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "insta" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67d3d2e287e4b86c10b3f3b641033d1f89b74bdb39d05f34952e2b9a6fe21cd" +dependencies = [ + "console", + "globset", + "once_cell", + "similar", + "tempfile", + "walkdir", +] + +[[package]] +name = "interpolator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "leptos" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713ee6895e3d1126ea9781280d01414f5643f3f201a949b71efffac07d735f00" +dependencies = [ + "any_spawner", + "cfg-if", + "either_of", + "futures", + "hydration_context", + "leptos_config", + "leptos_dom", + "leptos_hot_reload", + "leptos_macro", + "leptos_server", + "oco_ref", + "or_poisoned", + "paste", + "reactive_graph", + "rustc-hash", + "rustc_version", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn", + "slotmap", + "tachys", + "thiserror 2.0.21", + "throw_error", + "typed-builder", + "typed-builder-macro", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm_split_helpers", + "web-sys", +] + +[[package]] +name = "leptos_config" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c06f751315bccc0d193fab302ac01d25bcfcd97474d4676440e7e3250dc3fc3" +dependencies = [ + "config", + "regex", + "serde", + "thiserror 2.0.21", + "typed-builder", +] + +[[package]] +name = "leptos_dom" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35742e9ed8f8aaf9e549b454c68a7ac0992536e06856365639b111f72ab07884" +dependencies = [ + "js-sys", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "tachys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_hot_reload" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d84989bd3d604e66adbfe13a32bec2ea47bdcb6c9fcd643f784facbb32f6ef10" +dependencies = [ + "anyhow", + "camino", + "indexmap", + "or_poisoned", + "proc-macro2", + "quote", + "rstml", + "serde", + "syn 3.0.6", + "walkdir", +] + +[[package]] +name = "leptos_macro" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0902af1e6947ffc7e906b7003a165f76f178dc711a47b74241025090b0c32a72" +dependencies = [ + "attribute-derive", + "cfg-if", + "convert_case 0.11.0", + "convert_case_extras", + "html-escape", + "itertools 0.14.0", + "leptos_hot_reload", + "prettyplease", + "proc-macro2", + "quote", + "rstml", + "rustc_version", + "server_fn_macro", + "syn 3.0.6", + "uuid", +] + +[[package]] +name = "leptos_server" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202b2d1261c22d886f307934760a6bb566444f68f39b24f6f10defdc23633049" +dependencies = [ + "any_spawner", + "base64 0.22.1", + "codee", + "futures", + "hydration_context", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "serde", + "serde_json", + "server_fn", + "tachys", +] + +[[package]] +name = "libc" +version = "0.2.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "manyhow" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c69ea6e469ca785c846b25dd69eac9e9c916b51d8ada1f212866787ee1da12d" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "manyhow-macros" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22fc5c1b2c4000056dae3619fea36e79ce79dabfee4907d2dcad6612b189e370" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "next_tuple" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60993920e071b0c9b66f14e2b32740a4e27ffc82854dcd72035887f336a09a28" + +[[package]] +name = "oco_ref" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0423ff9973dea4d6bd075934fdda86ebb8c05bdf9d6b0507067d4a1226371d" +dependencies = [ + "serde", + "thiserror 2.0.21", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "or_poisoned" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "prettyplease" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bfe0f4c752e450fc2faf62654f1c134747922825d5b04ca717b8874f41a40c0" +dependencies = [ + "proc-macro2", + "syn 3.0.6", +] + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df921e1ef974ebc8dd9effdb0c037a96928ae8cbf871438e02d6fd67204b595e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "version_check", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quote-use" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48356e493823dc3c1d7e9fc7b3ff204ecec48afbdd718fc4134091b88eb63f3d" +dependencies = [ + "quote", + "quote-use-macros", +] + +[[package]] +name = "quote-use-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf1c5de6a7cc231c71e03c77aa4c7019097859ea7029156b54d2894a8430704" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "raffia" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a83eb5987650fcfc3f2e912d3a718f19b8e87c0d980e12e36edf79fa0221d93" +dependencies = [ + "raffia_macro", + "smallvec", +] + +[[package]] +name = "raffia_macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ac21f5e4bc6b29ea5d5e691a9aa08b2b9fd8891f48a99157b9f02d8a48e1318" +dependencies = [ + "heck", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "reactive_graph" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79f11fac67625645add76313dab8dae510fca0654d96ef98fd8f961a7d2e22c1" +dependencies = [ + "any_spawner", + "async-lock", + "futures", + "guardian", + "hydration_context", + "indexmap", + "or_poisoned", + "paste", + "pin-project-lite", + "rustc-hash", + "rustc_version", + "send_wrapper", + "serde", + "slotmap", + "thiserror 2.0.21", + "web-sys", +] + +[[package]] +name = "reactive_stores" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a29e469b556f25486678e9f5f65fa21a0351d98affde9a7eea9fee286bf8ebd6" +dependencies = [ + "guardian", + "indexmap", + "itertools 0.14.0", + "or_poisoned", + "paste", + "reactive_graph", + "reactive_stores_macro", + "rustc-hash", + "send_wrapper", +] + +[[package]] +name = "reactive_stores_macro" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d11f1b82859d94577892b8037c35f8a4f066cbb3864583e22e68def0af49a88" +dependencies = [ + "convert_case 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rstml" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6bd1bfba3c4c0b57aae906204d9e5744f3f65800ce6c75bd4cc162f2c26f3aa" +dependencies = [ + "derive-where", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 3.0.6", + "thiserror 2.0.21", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "sabry" +version = "0.0.7" +dependencies = [ + "insta", + "leptos", + "sabry_intrnl", + "sabry_procmacro", +] + +[[package]] +name = "sabry_build" +version = "0.0.7" +dependencies = [ + "proc-macro2", + "sabry_intrnl", + "sabry_procmacro", + "sabry_procmacro_impl", + "syn 3.0.6", + "thiserror 2.0.21", + "walkdir", +] + +[[package]] +name = "sabry_intrnl" +version = "0.0.7" +dependencies = [ + "base64 0.23.1", + "raffia", + "sasso", + "serde", + "syn 3.0.6", + "thiserror 2.0.21", + "toml", +] + +[[package]] +name = "sabry_procmacro" +version = "0.0.7" +dependencies = [ + "sabry_procmacro_impl", +] + +[[package]] +name = "sabry_procmacro_impl" +version = "0.0.7" +dependencies = [ + "itertools 0.15.0", + "proc-macro2", + "quote", + "raffia", + "regex", + "sabry_intrnl", + "syn 3.0.6", + "thiserror 2.0.21", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "sasso" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de32df330f2607c02458791223064ee98752e719e6f85804953229533c32448" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" +dependencies = [ + "futures-core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_qs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3faaf9e727533a19351a43cc5a8de957372163c7d35cc48c90b75cdda13c352" +dependencies = [ + "percent-encoding", + "serde", + "thiserror 2.0.21", +] + +[[package]] +name = "serde_spanned" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7523beb55eece201a2356bee0bbca0d1ab466c14c07703b2e0ee6d42cb0c2c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "server_fn" +version = "0.8.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8559dd05af1b5b7e363a150616589d5a88af5187273f7f331ba0dae8922812" +dependencies = [ + "base64 0.22.1", + "bytes", + "const-str", + "const_format", + "futures", + "gloo-net", + "http", + "js-sys", + "or_poisoned", + "pin-project-lite", + "rustc_version", + "rustversion", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn_macro_default", + "thiserror 2.0.21", + "throw_error", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce79d7b6ab93f7994e5ff4999eb962f2aea370d7c3b91986eb75da738a8e65f9" +dependencies = [ + "const_format", + "convert_case 0.11.0", + "proc-macro2", + "quote", + "rustc_version", + "syn 3.0.6", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro_default" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9a4f81a0d855f279c3448243138a55cbfdd9851da9341b9c1e5971b90089e61" +dependencies = [ + "server_fn_macro", + "syn 3.0.6", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tachys" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47e2220bb9d2a3be976a22a0fb7685a0b84499bb11ea5cb3bbc82907675ac68" +dependencies = [ + "any_spawner", + "async-trait", + "const_str_slice_concat", + "drain_filter_polyfill", + "either_of", + "erased", + "futures", + "html-escape", + "indexmap", + "itertools 0.14.0", + "js-sys", + "next_tuple", + "oco_ref", + "or_poisoned", + "paste", + "reactive_graph", + "reactive_stores", + "rustc-hash", + "rustc_version", + "send_wrapper", + "slotmap", + "throw_error", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "throw_error" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0ed6038fcbc0795aca7c92963ddda636573b956679204e044492d2b13c8f64" +dependencies = [ + "pin-project-lite", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044" +dependencies = [ + "pin-project-lite", +] + +[[package]] +name = "toml" +version = "1.1.8+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20489e00e4d8741d6be680764cc12e270655e375a20d1011e844a9c3379e678d" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.1.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06bdbd8cfc056b8d2e2e85f29b56a3bdbecb527cef81eb39e3e7b98af4652770" + +[[package]] +name = "typed-builder" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31aa81521b70f94402501d848ccc0ecaa8f93c8eb6999eb9747e72287757ffda" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076a02dc54dd46795c2e9c8282ed40bcfb1e22747e955de9389a1de28190fb26" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97277d36b9c3ace13e58fa6e753f8b0bbbf302a18dd193240d70f9e29681059a" +dependencies = [ + "getrandom", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" +dependencies = [ + "js-sys", + "tokio", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.6", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasm_split_helpers" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab578aae2fe2916edaea06843187d50f87b0965622da0ceef648edca27b385ba" +dependencies = [ + "async-once-cell", + "wasm_split_macros", +] + +[[package]] +name = "wasm_split_macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e653af7ee4a9ef0fce481a9ec6f43cb78de20d0cdb4f4f5862e1dc6e407e6c8" +dependencies = [ + "base16", + "quote", + "sha2", + "syn 2.0.119", +] + +[[package]] +name = "web-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "xxhash-rust" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "550a2b930b62486a393c52d5c3b84bff264b28aa437ed64694d31e93b1757af7" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index 78f0188..2c46e0c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,6 @@ [workspace] resolver = "3" -members = [ - "sabry_procmacro", - "sabry_procmacro_impl", - "sabry_intrnl", - "sabry_build", -] +members = ["sabry", "sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl", "sabry_build"] exclude = ["examples"] [workspace.package] @@ -19,15 +14,21 @@ publish = true [workspace.dependencies] ## Workspace -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.7" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.7" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.7" } -sabry_build = { path = "sabry_build", version = "0.0.7" } +sabry.path = "sabry" +sabry.version = "0.0.7" +sabry_intrnl.path = "sabry_intrnl" +sabry_intrnl.version = "0.0.7" +sabry_procmacro.path = "sabry_procmacro" +sabry_procmacro.version = "0.0.7" +sabry_procmacro_impl.path = "sabry_procmacro_impl" +sabry_procmacro_impl.version = "0.0.7" +sabry_build.path = "sabry_build" +sabry_build.version = "0.0.7" ## CSS lightningcss.version = "1.0.0-alpha.72" lightningcss.default-features = false -grass.version = "^0.13" -grass.default-features = false +sasso.version = "^0.21" +sasso.default-features = false raffia.version = "^0.13" ## Marshall serde.version = "^1" @@ -43,38 +44,5 @@ thiserror.version = "^2" proc-macro2.version = "^1" quote.version = "^1" syn.version = "^3" - -[package] -name = "sabry" -description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust" -keywords = ["web", "sass", "scss", "macro"] -repository.workspace = true -version.workspace = true -edition.workspace = true -rust-version.workspace = true -authors.workspace = true -license.workspace = true -publish.workspace = true - -[dependencies] -## Workspace -sabry_procmacro = { workspace = true, optional = true } -sabry_build = { workspace = true, optional = true } -sabry_intrnl = { workspace = true } - -[dev-dependencies] -leptos = { version = "^0.8" } -insta = { version = "^1", features = ["glob"] } - -[features] -default = ["procmacro"] -const-scoping = ["sabry_procmacro?/const-compile"] -procmacro = ["dep:sabry_procmacro"] -build = ["dep:sabry_build"] -net-files = ["sabry_build/net-files"] -internals = [] -nightly = ["sabry_procmacro?/nightly"] - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] +## Testing +insta.version = "^1" diff --git a/sabry/Cargo.toml b/sabry/Cargo.toml new file mode 100644 index 0000000..084c066 --- /dev/null +++ b/sabry/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "sabry" +description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust" +keywords = ["web", "sass", "scss", "macro"] +repository.workspace = true +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true +publish.workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +## Workspace +sabry_procmacro.workspace = true +sabry_intrnl.workspace = true + +[dev-dependencies] +leptos.version = "^0.8" +insta.workspace = true +insta.features = ["glob"] + +[features] +nightly = ["sabry_procmacro/nightly", "sabry_intrnl/nightly"] diff --git a/sabry/src/lib.rs b/sabry/src/lib.rs new file mode 100644 index 0000000..152c401 --- /dev/null +++ b/sabry/src/lib.rs @@ -0,0 +1,4 @@ +#![doc = include_str!("../../README.md")] +#![cfg_attr(docsrs, feature(doc_cfg))] + +pub use sabry_procmacro::*; diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index 3ac6e7f..5648a52 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -14,10 +14,9 @@ rustdoc-args = ["--cfg", "docsrs"] [dependencies] sabry_intrnl.workspace = true -sabry_intrnl.features = ["compile", "scope"] +sabry_intrnl.features = ["config-manifest", "style-compiler"] +sabry_procmacro.workspace = true sabry_procmacro_impl.workspace = true -sabry_procmacro_impl.features = ["const-compile"] - proc-macro2.workspace = true proc-macro2.features = ["span-locations"] syn.workspace = true @@ -26,4 +25,4 @@ thiserror.workspace = true walkdir.workspace = true [features] -net-files = [] +nightly = ["sabry_procmacro/nightly", "sabry_procmacro_impl/nightly"] diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index bd476a7..eb43b2f 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -3,17 +3,17 @@ use std::{ convert::Infallible, fs::{self, OpenOptions}, io::{self, Write}, - path::PathBuf, - str::FromStr, vec, }; use sabry_intrnl::{ - compiler::{CompilerAdapter, SabryCompilerError}, - config::{manifest::ManifestError, BehavHashCollision, BehavSassModCollision, SabryConfig}, - scoper::{hash::ScopeHash, ArbitraryScope, ScopeError}, + conf::{BehavHashCollision, BehavSassModCollision, SabryConfig, manifest::ManifestError}, + style::{ + compiler::{CompilerAdapter, SabryCompilerError}, + scope::{ArbitraryScope, ScopeError, ScopeHash}, + }, }; -use sabry_procmacro_impl::impls::{styly, ArbitraryStyleSyntax}; +use sabry_procmacro_impl::impls::{ArbitraryStyleSyntax, styly}; use walkdir::WalkDir; use crate::filevisit::{self, FileVisitError}; @@ -71,7 +71,6 @@ pub struct SabryBuilder { state: SabryBuildState, } -//🧙 impl SabryBuilder { /// Construct new [SabryBuilder] from the config /// @@ -124,42 +123,40 @@ impl SabryBuilder { pub fn generate_output(&mut self) -> BuilderResult { // warn on empty loaded_css_modules if self.state.loaded_css_modules.is_empty() { - println!("🧙 sabry didn't compile any CSS. Perhaps the crate has no styles? Lets write some!\nAlso you should check that you do use `styly!` macro properly - at the top level as an item."); + println!( + "🧙 sabry didn't compile any CSS. Perhaps the crate has no styles? Lets write some!\nAlso you should check that you do use `styly!` macro properly - at the top level as an item." + ); } if let Some(scope_dir) = &self.config.css.scopes { - println!("🧙 writing CSS files for each of loaded scopes into {scope_dir}"); + println!("🧙 writing CSS files for each of loaded scopes into {scope_dir:?}"); fs::create_dir_all(scope_dir)?; for (scope, code) in &self.state.loaded_css_modules { - let scope_path = format!("{}/{}.css", scope_dir, scope); + let scope_path = scope_dir.join(scope).with_extension("css"); fs::write(scope_path, code)?; } } if let Some(bundle_file) = &self.config.css.bundle { - println!("🧙 writing merged CSS for the entire crate into {bundle_file}"); - - let path = PathBuf::from_str(bundle_file)?; - - if let Some(dir) = path.parent() { + println!("🧙 writing merged CSS for the entire crate into {bundle_file:?}"); + if let Some(dir) = bundle_file.parent() { fs::create_dir_all(dir)?; } // remove the file to write new fresh tasty CSS - let _ = fs::remove_file(&path); + let _ = fs::remove_file(bundle_file); // and then reopen it let mut file = OpenOptions::new() .create_new(true) .append(true) - .open(path)?; + .open(bundle_file)?; // merged bundle CSS does require another lightningcss pass let mut buffer = String::new(); for (_, code) in &self.state.loaded_css_modules { buffer.push_str(code); } - buffer = self.css_compiler.lightningcss(&buffer)?; write!(file, "{buffer}")?; } @@ -258,13 +255,12 @@ impl SabryBuilder { let mut modules: Vec<StyleModule> = vec![]; if let Some(sass_mods) = &self.config.sass.modules { for pre in sass_mods { - let pre_path = PathBuf::from_str(pre)?; - let pre_name = pre_path + let pre_name = pre .file_name() .ok_or(SabryBuildError::FileName())? .to_string_lossy() .to_string(); - let code = fs::read_to_string(pre_path)?; + let code = fs::read_to_string(pre)?; modules.push((pre_name, code)); } } @@ -276,9 +272,7 @@ impl SabryBuilder { if let Some(sass_pres) = &self.config.sass.prelude { let mut sass_preludes: Vec<SassPreludeModule> = vec![]; for pre in sass_pres { - let pre_path = PathBuf::from_str(pre)?; - - let syntax = pre_path + let syntax = pre .extension() .unwrap_or_default() .to_str() @@ -287,23 +281,21 @@ impl SabryBuilder { Ok(s) => s, Err(_) => { return Err(SabryBuildError::Another(format!( - "Unknown syntax for sass prelude {pre}" - ))) + "Unknown syntax for sass prelude {pre:?}" + ))); } }; - let code = fs::read_to_string(pre_path)?; + let code = fs::read_to_string(pre)?; sass_preludes.push(SassPreludeModule { syntax, code }); } self.state.sass_prelude.extend(sass_preludes); } // load css preludes - if let Some(css_pre) = &self.config.css.prelude { - for pre in css_pre { - let code = fs::read_to_string(pre)?; - self.state.css_prelude.push_str(&code); - } + for pre in &self.config.css.prelude { + let code = fs::read_to_string(pre)?; + self.state.css_prelude.push_str(&code); } Ok(()) @@ -319,9 +311,9 @@ impl SabryBuilder { /// This function will not overwrite the module file. Never. /// pub fn load_side_module(&mut self, name: ModuleName, code: ModuleCode) -> BuilderResult { - println!("🧙 loading side module '{}'", &name); + println!("🧙 loading side module '{}'", name); - let module_file_path = format!("{}/{}", &self.config.sass.intermediate_dir, &name); + let module_file_path = self.config.sass.intermediate_dir.join(&name); let mut open_options = OpenOptions::new(); let mut open_options = open_options.write(true); @@ -333,10 +325,12 @@ impl SabryBuilder { open_options = if self.state.known_side_modules.contains(&name) { match &self.config.sass.module_name_collision { BehavSassModCollision::Error => { - return Err(SabryBuildError::ModuleCollision { module: name }) + return Err(SabryBuildError::ModuleCollision { module: name }); } BehavSassModCollision::Merge => { - println!("🧙 sabry found duplicate module name '{name}': merging code, as configured"); + println!( + "🧙 sabry found duplicate module name '{name}': merging code, as configured" + ); open_options.append(true) } } @@ -399,7 +393,9 @@ pub enum SabryBuildError { FileVisit(#[from] FileVisitError), #[error("Syntax of style can not be parsed")] SyntaxError(#[from] ScopeError), - #[error("Another scope has the same hash, and sabry is configured to raise an error. Try to adjust config, increase hash size, or change the style code")] + #[error( + "Another scope has the same hash, and sabry is configured to raise an error. Try to adjust config, increase hash size, or change the style code" + )] HashCollision { scope: ModuleName }, #[error("Something's wrong with file path")] Path(#[from] Infallible), diff --git a/sabry_build/src/lib.rs b/sabry_build/src/lib.rs index b2d511e..d8e6863 100644 --- a/sabry_build/src/lib.rs +++ b/sabry_build/src/lib.rs @@ -2,3 +2,6 @@ pub mod buildmagic; pub mod filevisit; + +pub use buildmagic::buildy; +pub use sabry_procmacro::usey; diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index d6e7339..01ecd91 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -13,21 +13,21 @@ all-features = true rustdoc-args = ["--cfg", "docsrs"] [dependencies] +## Css +raffia.version = "^0.13" +sasso.workspace = true +sasso.optional = true base64.workspace = true -base64.optional = true -grass.workspace = true -grass.optional = true -lightningcss.workspace = true -lightningcss.optional = true -raffia.workspace = true -syn.workspace = true - -cfg-if.workspace = true -serde.workspace = true -serde.features = ["derive"] +## Codegen thiserror.workspace = true +syn.workspace = true +## Manifets seri +serde.workspace = true +serde.optional = true +serde.features = ["derive"] toml.workspace = true +toml.optional = true [features] -compile = ["dep:grass", "dep:lightningcss"] -scope = ["dep:base64"] +config-manifest = ["dep:toml", "dep:serde"] +style-compiler = ["dep:sasso"] diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs deleted file mode 100644 index adc398f..0000000 --- a/sabry_intrnl/src/compiler/mod.rs +++ /dev/null @@ -1,139 +0,0 @@ -use crate::config::SabryConfig; - -/// Convenience wrapper on Grass and Lightningcss -pub struct CompilerAdapter { - #[allow(dead_code)] // without 'compile' feature, still want to set this - config: SabryConfig, -} - -impl CompilerAdapter { - pub fn new(config: SabryConfig) -> Self { - Self { config } - } - - /// Compile given SASS/SCSS into CSS - /// with respect to self.config - #[cfg(feature = "compile")] - pub fn compile_module( - &self, - syntax: crate::syntax::ostrta::OneSyntaxToRuleThemAll, - code: &str, - ) -> Result<String, SabryCompilerError> { - let options = grass::Options::from(&self.config).input_syntax(syntax.into()); - - let css = self.lightningcss(&grass::from_string(code, &options)?)?; - - Ok(css) - } - - /// Perform lightningcss transformations on given css - /// with respect to self.config.css.minify on minification - #[cfg(feature = "compile")] - pub fn lightningcss(&self, css: &str) -> Result<String, SabryCompilerError> { - use lightningcss::{printer::PrinterOptions, stylesheet::MinifyOptions, targets::Targets}; - - let mut lightsheet = match lightningcss::stylesheet::StyleSheet::parse( - css, - lightningcss::stylesheet::ParserOptions::default(), - ) { - Ok(s) => s, - Err(e) => { - return Err(SabryCompilerError::LightParse { - kind: e.kind.to_string(), - loc: e.loc, - }) - } - }; - - let targets = Targets { - browsers: Some(self.config.lightningcss.targets.clone().into()), - ..Default::default() - }; - - let printer_options = PrinterOptions { - minify: self.config.css.minify, - targets, - ..Default::default() - }; - - let minify_options = MinifyOptions { - targets, - ..Default::default() - }; - - if self.config.css.minify { - lightsheet.minify(minify_options)? - } - - let css = match lightsheet.to_css(printer_options) { - Ok(c) => { - drop(lightsheet); - c.code - } - Err(e) => return Err(SabryCompilerError::LightPrint(e)), - }; - - Ok(css) - } -} - -#[cfg(feature = "compile")] -impl From<&SabryConfig> for grass::Options<'_> { - fn from(config: &SabryConfig) -> Self { - let mut options = grass::Options::default(); - options = options.style(if config.css.minify { - grass::OutputStyle::Compressed - } else { - grass::OutputStyle::Expanded - }); - options = options.load_path(&config.sass.intermediate_dir); - - options - } -} - -#[cfg(feature = "compile")] -#[derive(thiserror::Error)] -pub enum SabryCompilerError { - #[error("Could not compile into CSS with grass")] - GrassCompile(#[from] Box<grass::Error>), - #[error("Could not print compiled CSS with lightningcss")] - LightPrint(#[from] lightningcss::error::Error<lightningcss::error::PrinterErrorKind>), - #[error("Could not minify CSS with lightningcss")] - LightMinify(#[from] lightningcss::error::Error<lightningcss::error::MinifyErrorKind>), - #[error("Could not parse CSS with lightningcss")] - LightParse { - kind: String, - loc: Option<lightningcss::error::ErrorLocation>, - }, -} - -#[cfg(feature = "compile")] -impl std::fmt::Debug for SabryCompilerError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let explain = match self { - Self::LightPrint(e) => format!( - "{} at {:?}", - e.kind, - e.loc - .clone() - .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) - ), - Self::GrassCompile(err) => format!("{err}"), - Self::LightMinify(e) => format!( - "{} at {:?}", - e.kind, - e.loc - .clone() - .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) - ), - Self::LightParse { kind, loc } => format!( - "{kind} at {:?}", - loc.clone() - .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) - ), - }; - - write!(f, "{explain}") - } -} diff --git a/sabry_intrnl/src/config/manifest.rs b/sabry_intrnl/src/conf/manifest.rs similarity index 100% rename from sabry_intrnl/src/config/manifest.rs rename to sabry_intrnl/src/conf/manifest.rs diff --git a/sabry_intrnl/src/conf/mod.rs b/sabry_intrnl/src/conf/mod.rs new file mode 100644 index 0000000..7140697 --- /dev/null +++ b/sabry_intrnl/src/conf/mod.rs @@ -0,0 +1,210 @@ +use std::{path::PathBuf, str::FromStr}; + +#[cfg(feature = "config-manifest")] +pub mod manifest; + +/// Sabry configuration, as it is from package.metadata.sabry +#[derive(Default, Clone)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(default))] +pub struct SabryConfig { + pub css: SabryCssConfig, + pub sass: SabrySassConfig, + pub hash: SabryHashConfig, +} + +impl SabryConfig { + /// Require sabry configuration for the current project from every place in the code + #[cfg(feature = "config-manifest")] + pub fn require() -> Result<Self, manifest::ManifestError> { + let manifest = manifest::read_manifest()?; + Ok(Self::from(&manifest)) + } +} + +#[cfg(feature = "config-manifest")] +impl From<&manifest::ValuableManifest> for SabryConfig { + fn from(value: &manifest::ValuableManifest) -> Self { + value + .package + .as_ref() + .and_then(|p| p.metadata.as_ref()) + .and_then(|m| m.sabry.as_ref()) + .map_or(Self::default(), |sbr| sbr.clone()) + } +} + +/// Sabry `css` configuration table +#[derive(Clone)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(default))] +pub struct SabryCssConfig { + pub bundle: Option<PathBuf>, + pub scopes: Option<PathBuf>, + pub prelude: Vec<PathBuf>, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryCssConfig::default_minify") + )] + pub minify: bool, +} + +impl SabryCssConfig { + fn default_minify() -> bool { + true + } +} + +impl Default for SabryCssConfig { + fn default() -> Self { + Self { + bundle: None, + scopes: None, + prelude: vec![], + minify: Self::default_minify(), + } + } +} + +/// Sabry `sass` configuration table +/// +/// (SASS/SCSS related config) +#[derive(Clone)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(default))] +pub struct SabrySassConfig { + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabrySassConfig::default_scanroot") + )] + pub scanroot: PathBuf, + pub modules: Option<Vec<PathBuf>>, + pub prelude: Option<Vec<PathBuf>>, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabrySassConfig::default_intermediate_dir") + )] + pub intermediate_dir: PathBuf, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabrySassConfig::default_module_name_collision") + )] + pub module_name_collision: BehavSassModCollision, +} + +impl SabrySassConfig { + fn default_scanroot() -> PathBuf { + PathBuf::from_str("src") + .expect("Infallible: default SabrySassConfig::scanroot into PathBuf") + } + fn default_intermediate_dir() -> PathBuf { + PathBuf::from_str("target/.sabry/sass") + .expect("Infallibe: default SabrySassConfig::intermediate_dir into PathBuf") + } + fn default_module_name_collision() -> BehavSassModCollision { + BehavSassModCollision::default() + } +} + +impl Default for SabrySassConfig { + fn default() -> Self { + Self { + scanroot: Self::default_scanroot(), + modules: None, + prelude: None, + intermediate_dir: Self::default_intermediate_dir(), + module_name_collision: Self::default_module_name_collision(), + } + } +} + +/// Sabry `hash` configuration table +#[derive(Clone)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(default))] +pub struct SabryHashConfig { + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_size") + )] + pub size: usize, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_collision") + )] + pub collision: BehavHashCollision, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_use_scope_name") + )] + pub use_scope_name: bool, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_use_item_names") + )] + pub use_item_names: bool, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_use_code_size") + )] + pub use_code_size: bool, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_use_code_text") + )] + pub use_code_text: bool, +} + +impl SabryHashConfig { + fn default_size() -> usize { + 6 + } + fn default_collision() -> BehavHashCollision { + BehavHashCollision::default() + } + fn default_use_scope_name() -> bool { + true + } + fn default_use_item_names() -> bool { + false + } + fn default_use_code_size() -> bool { + true + } + fn default_use_code_text() -> bool { + false + } +} + +impl Default for SabryHashConfig { + fn default() -> Self { + Self { + size: Self::default_size(), + collision: Self::default_collision(), + use_scope_name: Self::default_use_scope_name(), + use_code_size: Self::default_use_code_size(), + use_code_text: Self::default_use_code_text(), + use_item_names: Self::default_use_item_names(), + } + } +} + +/// \[package.metadata.sabry.sass\].module_name_collision option +#[derive(Default, Clone, Copy)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(rename_all = "lowercase"))] +pub enum BehavSassModCollision { + #[default] + Merge, + Error, +} + +/// \[package.metadata.sabry.hash\].collision option +#[derive(Default, Clone, Copy)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(rename_all = "lowercase"))] +pub enum BehavHashCollision { + #[default] + Ignore, + Error, +} diff --git a/sabry_intrnl/src/config/mod.rs b/sabry_intrnl/src/config/mod.rs deleted file mode 100644 index 5c4f63b..0000000 --- a/sabry_intrnl/src/config/mod.rs +++ /dev/null @@ -1,246 +0,0 @@ -pub mod manifest; -use manifest::{ManifestError, ValuableManifest}; -use serde::Deserialize; - -/// Sabry configuration, as it is from package.metadata.sabry -#[derive(Default, Deserialize, Clone)] -pub struct SabryConfig { - #[serde(default = "SabryCssConfig::default")] - pub css: SabryCssConfig, - #[serde(default = "SabrySassConfig::default")] - pub sass: SabrySassConfig, - #[serde(default = "SabryHashConfig::default")] - pub hash: SabryHashConfig, - #[serde(default = "SabryGrassConfig::default")] - pub grass: SabryGrassConfig, - #[serde(default = "SabryLightCssConfig::default")] - pub lightningcss: SabryLightCssConfig, -} - -impl SabryConfig { - /// Require sabry configuration for the current project from every place in the code - pub fn require() -> Result<Self, ManifestError> { - let manifest = manifest::read_manifest()?; - Ok(Self::from(&manifest)) - } -} - -impl From<&ValuableManifest> for SabryConfig { - fn from(value: &ValuableManifest) -> Self { - value - .package - .as_ref() - .and_then(|p| p.metadata.as_ref()) - .and_then(|m| m.sabry.as_ref()) - .map_or(Self::default(), |sbr| sbr.clone()) - } -} - -/// Sabry `css` configuration table -#[derive(Deserialize, Clone)] -pub struct SabryCssConfig { - pub bundle: Option<String>, - pub scopes: Option<String>, - pub prelude: Option<Vec<String>>, - #[serde(default = "SabryCssConfig::default_minify")] - pub minify: bool, -} - -impl SabryCssConfig { - fn default_minify() -> bool { - true - } -} - -impl Default for SabryCssConfig { - fn default() -> Self { - Self { - bundle: None, - scopes: None, - prelude: None, - minify: Self::default_minify(), - } - } -} - -/// Sabry `sass` configuration table -/// -/// (SASS/SCSS related config) -#[derive(Deserialize, Clone)] -pub struct SabrySassConfig { - #[serde(default = "SabrySassConfig::default_scanroot")] - pub scanroot: String, - pub modules: Option<Vec<String>>, - pub prelude: Option<Vec<String>>, - #[serde(default = "SabrySassConfig::default_intermediate_dir")] - pub intermediate_dir: String, - #[serde(default = "SabrySassConfig::default_module_name_collision")] - pub module_name_collision: BehavSassModCollision, -} - -impl SabrySassConfig { - fn default_scanroot() -> String { - "src".into() - } - fn default_intermediate_dir() -> String { - "target/.sabry/sass".into() - } - fn default_module_name_collision() -> BehavSassModCollision { - BehavSassModCollision::default() - } -} - -impl Default for SabrySassConfig { - fn default() -> Self { - Self { - scanroot: Self::default_scanroot(), - modules: None, - prelude: None, - intermediate_dir: Self::default_intermediate_dir(), - module_name_collision: Self::default_module_name_collision(), - } - } -} - -/// Sabry `hash` configuration table -#[derive(Deserialize, Clone)] -pub struct SabryHashConfig { - #[serde(default = "SabryHashConfig::default_size")] - pub size: usize, - #[serde(default = "SabryHashConfig::default_collision")] - pub collision: BehavHashCollision, - #[serde(default = "SabryHashConfig::default_use_scope_name")] - pub use_scope_name: bool, - #[serde(default = "SabryHashConfig::default_use_item_names")] - pub use_item_names: bool, - #[serde(default = "SabryHashConfig::default_use_code_size")] - pub use_code_size: bool, - #[serde(default = "SabryHashConfig::default_use_code_text")] - pub use_code_text: bool, -} - -impl SabryHashConfig { - fn default_size() -> usize { - 6 - } - fn default_collision() -> BehavHashCollision { - BehavHashCollision::default() - } - fn default_use_scope_name() -> bool { - true - } - fn default_use_item_names() -> bool { - false - } - fn default_use_code_size() -> bool { - true - } - fn default_use_code_text() -> bool { - false - } -} - -impl Default for SabryHashConfig { - fn default() -> Self { - Self { - size: Self::default_size(), - collision: Self::default_collision(), - use_scope_name: Self::default_use_scope_name(), - use_code_size: Self::default_use_code_size(), - use_code_text: Self::default_use_code_text(), - use_item_names: Self::default_use_item_names(), - } - } -} - -/// [grass] specific configuration for sabry -#[derive(Default, Deserialize, Clone)] -pub struct SabryGrassConfig {} - -/// [lightningcss] specific configuration for sabry -#[derive(Default, Deserialize, Clone)] -pub struct SabryLightCssConfig { - pub targets: SabryLightTargets, -} - -/// \[package.metadata.sabry.lightningcss.targets\] configuration. -/// -/// This is a convenience layer under [lightningcss::targets::Browsers] structure accepted -/// by lightningcss. -/// -/// This structure is a part of [SabryConfig], which faces developer with more convenient -/// `safari = "13.2"` syntax. -#[derive(Default, Deserialize, Clone)] -pub struct SabryLightTargets { - pub android: Option<String>, - pub chrome: Option<String>, - pub edge: Option<String>, - pub firefox: Option<String>, - pub ie: Option<String>, - pub ios_saf: Option<String>, - pub opera: Option<String>, - pub safari: Option<String>, - pub samsung: Option<String>, -} - -impl SabryLightTargets { - pub fn parse_ver(ver: &str) -> u32 { - let mut vercode: u32 = 0; - let vers = ver.split('.'); - for (i, dig) in vers.into_iter().enumerate() { - let dignum = dig - .parse::<u32>() - .unwrap_or_else(|_| panic!("Invalid browser specifier: '{dig}'")); - - let shift = 16 - 8 * i; - vercode |= dignum << shift; - } - vercode - } -} - -#[cfg(feature = "compile")] -impl From<SabryLightTargets> for lightningcss::targets::Browsers { - fn from(value: SabryLightTargets) -> Self { - Self { - android: value.android.map(|s| SabryLightTargets::parse_ver(&s)), - chrome: value.chrome.map(|s| SabryLightTargets::parse_ver(&s)), - edge: value.edge.map(|s| SabryLightTargets::parse_ver(&s)), - firefox: value.firefox.map(|s| SabryLightTargets::parse_ver(&s)), - ie: value.ie.map(|s| SabryLightTargets::parse_ver(&s)), - ios_saf: value.ios_saf.map(|s| SabryLightTargets::parse_ver(&s)), - opera: value.opera.map(|s| SabryLightTargets::parse_ver(&s)), - safari: value.safari.map(|s| SabryLightTargets::parse_ver(&s)), - samsung: value.samsung.map(|s| SabryLightTargets::parse_ver(&s)), - } - } -} - -/// \[package.metadata.sabry.sass\].module_name_collision option -#[derive(Default, Deserialize, Clone, Copy)] -#[serde(rename_all = "lowercase")] -pub enum BehavSassModCollision { - #[default] - Merge, - Error, -} - -/// \[package.metadata.sabry.hash\].collision option -#[derive(Default, Deserialize, Clone, Copy)] -#[serde(rename_all = "lowercase")] -pub enum BehavHashCollision { - #[default] - Ignore, - Error, -} - -#[cfg(test)] -mod test { - use super::{manifest, SabryConfig}; - - #[test] - fn empty_manifest_still_worth_a_read() { - let manifest = manifest::read_manifest().unwrap(); - let _conf = SabryConfig::from(&manifest); - } -} diff --git a/sabry_intrnl/src/lib.rs b/sabry_intrnl/src/lib.rs index 495a300..e23b628 100644 --- a/sabry_intrnl/src/lib.rs +++ b/sabry_intrnl/src/lib.rs @@ -1,6 +1,2 @@ -#![doc = include_str!("../README.md")] - -pub mod compiler; -pub mod config; -pub mod scoper; -pub mod syntax; +pub mod conf; +pub mod style; diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs deleted file mode 100644 index c6e6844..0000000 --- a/sabry_intrnl/src/scoper/hash.rs +++ /dev/null @@ -1,95 +0,0 @@ -/// Convenience wrapper for String-being-a-hash -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct ScopeHash(String); - -impl ScopeHash { - #[cfg(feature = "scope")] - pub fn new(scope: &super::ArbitraryScope, config: &crate::config::SabryHashConfig) -> Self { - use base64::Engine; - use raffia::ast::InterpolableIdent; - use std::hash::Hasher; - - use crate::scoper::sanitize_css_member; - - let mut hasher = std::hash::DefaultHasher::new(); - - if config.use_scope_name { - hasher.write(scope.name.to_string().as_bytes()); - } - if config.use_code_text { - hasher.write(scope.adapter().source().as_bytes()); - } - if config.use_code_size { - hasher.write(&scope.adapter().source().len().to_ne_bytes()); - } - if config.use_item_names { - let classes = scope.adapter().class_selectors(); - let ids = scope.adapter().id_selectors(); - //# types/tags dont participate - //# child-parent dont participate - - let merged_items = classes - .iter() - .map(|s| &s.name) - .chain(ids.iter().map(|i| &i.name)) - .map(|ident| match ident { - InterpolableIdent::Literal(lit) => Some(lit), - _ => None, - }) - .filter_map(|mbl| mbl.map(|l| l.raw)) - .collect::<String>(); - - hasher.write(merged_items.as_bytes()); - } - - let hash = hasher.finish().to_be_bytes(); - - let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(hash); - let hash = sanitize_css_member(&hash); - - Self(hash) - } - - pub fn as_str(&self) -> &str { - &self.0 - } - - #[cfg(test)] - pub fn test_init(v: String) -> Self { - Self(v) - } -} - -#[cfg(test)] -mod test { - use syn::Ident; - - use crate::{ - config::SabryHashConfig, scoper::ArbitraryScope, syntax::ostrta::OneSyntaxToRuleThemAll, - }; - - use super::ScopeHash; - - #[test] - fn hash_matches() { - let source = ".cls1{color:red; &-dark{color: black} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; - - let scope1 = ArbitraryScope::from_source( - OneSyntaxToRuleThemAll::Scss, - syn::parse_str::<Ident>("lasifudm").unwrap(), - source, - ) - .unwrap(); - let hash1 = ScopeHash::new(&scope1, &SabryHashConfig::default()); - - let scope2 = ArbitraryScope::from_source( - OneSyntaxToRuleThemAll::Scss, - syn::parse_str::<Ident>("lasifudm").unwrap(), - source, - ) - .unwrap(); - let hash2 = ScopeHash::new(&scope2, &SabryHashConfig::default()); - - assert_eq!(hash1, hash2); - } -} diff --git a/sabry_intrnl/src/style/compiler.rs b/sabry_intrnl/src/style/compiler.rs new file mode 100644 index 0000000..c875e73 --- /dev/null +++ b/sabry_intrnl/src/style/compiler.rs @@ -0,0 +1,49 @@ +use crate::{conf::SabryConfig, style::syntax::SyntaxKind}; + +/// Convenience wrapper on Grass and Lightningcss +pub struct CompilerAdapter { + #[allow(dead_code)] // without 'compile' feature, still want to set this + config: SabryConfig, +} + +impl CompilerAdapter { + pub fn new(config: SabryConfig) -> Self { + Self { config } + } + + /// Compile given SASS/SCSS into CSS + /// with respect to self.config + pub fn compile_module( + &self, + syntax: SyntaxKind, + code: &str, + ) -> Result<String, SabryCompilerError> { + let importer = sasso::FsImporter::new(self.config.sass.modules.clone().unwrap_or_default()); + let options = sasso::Options::new() + .with_style(if self.config.css.minify { + sasso::OutputStyle::Compressed + } else { + sasso::OutputStyle::Expanded + }) + .with_importer(&importer) + .with_syntax(syntax.into()); + + Ok(sasso::compile(code, &options)?) + } +} + +#[derive(thiserror::Error)] +pub enum SabryCompilerError { + #[error("Could not compile into CSS with sasso")] + Compile(#[from] sasso::Error), +} + +impl std::fmt::Debug for SabryCompilerError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let explain = match self { + Self::Compile(err) => format!("{err}"), + }; + + write!(f, "{explain}") + } +} diff --git a/sabry_intrnl/src/style/mod.rs b/sabry_intrnl/src/style/mod.rs new file mode 100644 index 0000000..3d7d6dc --- /dev/null +++ b/sabry_intrnl/src/style/mod.rs @@ -0,0 +1,5 @@ +pub mod scope; +pub mod syntax; + +#[cfg(feature = "style-compiler")] +pub mod compiler; diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/style/scope.rs similarity index 84% rename from sabry_intrnl/src/scoper/mod.rs rename to sabry_intrnl/src/style/scope.rs index 4d6ad29..f6b79f5 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/style/scope.rs @@ -1,14 +1,14 @@ use std::fmt::Debug; -use hash::ScopeHash; use raffia::{ Span, Spanned, ast::{InterpolableIdent, TypeSelector}, }; -use crate::syntax::{StylesheetAdapter, ostrta::OneSyntaxToRuleThemAll}; - -pub mod hash; +use crate::{ + conf::SabryHashConfig, + style::syntax::{StylesheetAdapter, SyntaxKind}, +}; #[derive(thiserror::Error)] pub enum ScopeError { @@ -36,7 +36,7 @@ pub struct ArbitraryScope<'s> { impl<'s> ArbitraryScope<'s> { /// Parse given source code with given syntax and assign given name pub fn from_source( - syntax: OneSyntaxToRuleThemAll, + syntax: SyntaxKind, name: syn::Ident, source: &'s str, ) -> Result<Self, ScopeError> { @@ -54,11 +54,7 @@ impl<'s> ArbitraryScope<'s> { /// Consume arbitrary scope and create a [HashedScope] in its basis /// /// This function calls [HashedScope::new] under the hood - #[cfg(feature = "scope")] - pub fn hashed( - self, - config: &crate::config::SabryHashConfig, - ) -> Result<HashedScope<'s>, ScopeError> { + pub fn hashed(self, config: &SabryHashConfig) -> Result<HashedScope<'s>, ScopeError> { let hash = ScopeHash::new(&self, config); HashedScope::new(hash, self) } @@ -309,7 +305,6 @@ impl ScopedSelector { } /// Generate rusty member ident based on selector type and CSS ident - #[cfg(feature = "scope")] pub fn gen_rusty_ident(&self) -> Option<syn::Ident> { let arb = &self.as_arbitrary().ident; let basic = sanitize_css_member(arb); @@ -375,7 +370,6 @@ impl ScopedSelector { } } -#[cfg(feature = "scope")] pub fn sanitize_css_member(source: &str) -> String { let mut target = String::with_capacity(source.len() + 1); @@ -417,18 +411,77 @@ pub fn sanitize_css_member(source: &str) -> String { target } +/// Convenience wrapper for String-being-a-hash +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ScopeHash(String); + +impl ScopeHash { + pub fn new(scope: &ArbitraryScope, config: &SabryHashConfig) -> Self { + use base64::Engine; + use raffia::ast::InterpolableIdent; + use std::hash::Hasher; + + let mut hasher = std::hash::DefaultHasher::new(); + + if config.use_scope_name { + hasher.write(scope.name.to_string().as_bytes()); + } + if config.use_code_text { + hasher.write(scope.adapter().source().as_bytes()); + } + if config.use_code_size { + hasher.write(&scope.adapter().source().len().to_ne_bytes()); + } + if config.use_item_names { + let classes = scope.adapter().class_selectors(); + let ids = scope.adapter().id_selectors(); + //# types/tags dont participate + //# child-parent dont participate + + let merged_items = classes + .iter() + .map(|s| &s.name) + .chain(ids.iter().map(|i| &i.name)) + .map(|ident| match ident { + InterpolableIdent::Literal(lit) => Some(lit), + _ => None, + }) + .filter_map(|mbl| mbl.map(|l| l.raw)) + .collect::<String>(); + + hasher.write(merged_items.as_bytes()); + } + + let hash = hasher.finish().to_be_bytes(); + + let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(hash); + let hash = sanitize_css_member(&hash); + + Self(hash) + } + + pub fn as_str(&self) -> &str { + &self.0 + } + + #[cfg(test)] + pub fn test_init(v: String) -> Self { + Self(v) + } +} + #[cfg(test)] mod test { + use crate::{ + conf::SabryHashConfig, + style::{scope::HashedScope, syntax::SyntaxKind}, + }; + + use super::ScopeHash; use std::collections::HashSet; use syn::Ident; - use crate::{ - config::SabryHashConfig, - scoper::{HashedScope, hash::ScopeHash}, - syntax::ostrta::OneSyntaxToRuleThemAll, - }; - use super::ArbitraryScope; #[test] @@ -446,12 +499,9 @@ mod test { "".to_string(), // comes from `div` which has no html hashed code, still want to check presense ]); - let scope = ArbitraryScope::from_source( - OneSyntaxToRuleThemAll::Scss, - syn::parse_str("scope1").unwrap(), - code, - ) - .unwrap(); + let scope = + ArbitraryScope::from_source(SyntaxKind::Scss, syn::parse_str("scope1").unwrap(), code) + .unwrap(); let scope = HashedScope::new(hash, scope).unwrap(); let scope_selector_htmls = scope .hashed_selectors @@ -495,7 +545,7 @@ mod test { let hash_cfg = SabryHashConfig::default(); let scope = ArbitraryScope::from_source( - OneSyntaxToRuleThemAll::Scss, + SyntaxKind::Scss, syn::parse_str::<Ident>("scope2oiej").unwrap(), code, ) @@ -512,4 +562,27 @@ mod test { assert_eq!(expect_ident_names, sels); } + + #[test] + fn hash_matches() { + let source = ".cls1{color:red; &-dark{color: black} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; + + let scope1 = ArbitraryScope::from_source( + SyntaxKind::Scss, + syn::parse_str::<Ident>("lasifudm").unwrap(), + source, + ) + .unwrap(); + let hash1 = ScopeHash::new(&scope1, &SabryHashConfig::default()); + + let scope2 = ArbitraryScope::from_source( + SyntaxKind::Scss, + syn::parse_str::<Ident>("lasifudm").unwrap(), + source, + ) + .unwrap(); + let hash2 = ScopeHash::new(&scope2, &SabryHashConfig::default()); + + assert_eq!(hash1, hash2); + } } diff --git a/sabry_intrnl/src/syntax/mod.rs b/sabry_intrnl/src/style/syntax.rs similarity index 78% rename from sabry_intrnl/src/syntax/mod.rs rename to sabry_intrnl/src/style/syntax.rs index d1d8c67..c2997c8 100644 --- a/sabry_intrnl/src/syntax/mod.rs +++ b/sabry_intrnl/src/style/syntax.rs @@ -1,26 +1,20 @@ -use ostrta::OneSyntaxToRuleThemAll; use raffia::{ + ParserBuilder, ast::{ ClassSelector, ComplexSelectorChild, CompoundSelector, IdSelector, InterpolableIdent, NestingSelector, PseudoClassSelector, SimpleSelector, Statement, Stylesheet, TypeSelector, }, - ParserBuilder, }; -pub mod ostrta; - /// Convenience wrapper for [Stylesheet] pub struct StylesheetAdapter<'s> { - pub syntax: OneSyntaxToRuleThemAll, + pub syntax: SyntaxKind, source: &'s str, stylesheet: Stylesheet<'s>, } impl<'s> StylesheetAdapter<'s> { - pub fn new( - source: &'s str, - syntax: OneSyntaxToRuleThemAll, - ) -> Result<Self, raffia::error::Error> { + pub fn new(source: &'s str, syntax: SyntaxKind) -> Result<Self, raffia::error::Error> { Ok(Self { stylesheet: ParserBuilder::new(source) .ignore_comments() @@ -141,16 +135,82 @@ impl<'s> StylesheetAdapter<'s> { } } +/// Convenience unification entrypoint +/// to make friends with all the different syntax-consumers +#[derive(Default, Debug, Clone, Copy)] +pub enum SyntaxKind { + #[default] + Scss, + Sass, + Css, +} + +impl TryFrom<&str> for SyntaxKind { + type Error = (); + fn try_from(value: &str) -> Result<Self, Self::Error> { + match value { + "sass" => Ok(Self::Sass), + "scss" => Ok(Self::Scss), + "css" => Ok(Self::Css), + _ => Err(()), + } + } +} + +impl TryFrom<raffia::Syntax> for SyntaxKind { + type Error = (); + fn try_from(value: raffia::Syntax) -> Result<Self, Self::Error> { + match value { + raffia::Syntax::Sass => Ok(Self::Sass), + raffia::Syntax::Scss => Ok(Self::Scss), + raffia::Syntax::Css => Ok(Self::Css), + _ => Err(()), + } + } +} + +#[cfg(feature = "style-compiler")] +impl From<sasso::Syntax> for SyntaxKind { + fn from(value: sasso::Syntax) -> Self { + match value { + sasso::Syntax::Sass => Self::Sass, + sasso::Syntax::Scss => Self::Scss, + sasso::Syntax::Css => Self::Css, + } + } +} + +impl From<SyntaxKind> for raffia::Syntax { + fn from(value: SyntaxKind) -> Self { + match value { + SyntaxKind::Sass => Self::Sass, + SyntaxKind::Scss => Self::Scss, + SyntaxKind::Css => Self::Css, + } + } +} + +#[cfg(feature = "style-compiler")] +impl From<SyntaxKind> for sasso::Syntax { + fn from(value: SyntaxKind) -> Self { + match value { + SyntaxKind::Scss => Self::Scss, + SyntaxKind::Sass => Self::Sass, + SyntaxKind::Css => Self::Css, + } + } +} + #[cfg(test)] mod test { use std::collections::HashSet; use raffia::{ - ast::{InterpolableIdent, TypeSelector}, Spanned, + ast::{InterpolableIdent, TypeSelector}, }; - use crate::syntax::ostrta::OneSyntaxToRuleThemAll; + use crate::style::syntax::SyntaxKind; use super::StylesheetAdapter; @@ -206,7 +266,7 @@ div#id2 let expect_tags = HashSet::from(["ul", "div", "span"]); //scss - let adp = StylesheetAdapter::new(source_scss, OneSyntaxToRuleThemAll::Scss).unwrap(); + let adp = StylesheetAdapter::new(source_scss, SyntaxKind::Scss).unwrap(); let classes = adp .class_selectors() @@ -244,7 +304,7 @@ div#id2 assert_eq!(expect_tags, tags); //sass - let adp = StylesheetAdapter::new(source_sass, OneSyntaxToRuleThemAll::Sass).unwrap(); + let adp = StylesheetAdapter::new(source_sass, SyntaxKind::Sass).unwrap(); let classes = adp .class_selectors() @@ -288,7 +348,7 @@ div#id2 let newname = "cls203-jg7ihgjhftyfhjh"; let expect = ".cls1{color:red; .cls203-jg7ihgjhftyfhjh{color:green;}}"; - let adp = StylesheetAdapter::new(scss, OneSyntaxToRuleThemAll::Scss).unwrap(); + let adp = StylesheetAdapter::new(scss, SyntaxKind::Scss).unwrap(); let classes = adp.class_selectors(); let target_class = classes[0].clone(); diff --git a/sabry_intrnl/src/syntax/ostrta.rs b/sabry_intrnl/src/syntax/ostrta.rs deleted file mode 100644 index bf320a0..0000000 --- a/sabry_intrnl/src/syntax/ostrta.rs +++ /dev/null @@ -1,61 +0,0 @@ -/// Convenience unification entrypoint -/// to make friends with all the different syntax-consumers -#[derive(Default, Debug, Clone, Copy)] -pub enum OneSyntaxToRuleThemAll { - #[default] - Scss, - Sass, -} - -impl TryFrom<&str> for OneSyntaxToRuleThemAll { - type Error = (); - fn try_from(value: &str) -> Result<Self, Self::Error> { - match value { - "sass" => Ok(Self::Sass), - "scss" => Ok(Self::Scss), - _ => Err(()), - } - } -} - -impl TryFrom<raffia::Syntax> for OneSyntaxToRuleThemAll { - type Error = (); - fn try_from(value: raffia::Syntax) -> Result<Self, Self::Error> { - match value { - raffia::Syntax::Sass => Ok(Self::Sass), - raffia::Syntax::Scss => Ok(Self::Scss), - _ => Err(()), - } - } -} - -#[cfg(feature = "compile")] -impl TryFrom<grass::InputSyntax> for OneSyntaxToRuleThemAll { - type Error = (); - fn try_from(value: grass::InputSyntax) -> Result<Self, Self::Error> { - match value { - grass::InputSyntax::Sass => Ok(Self::Sass), - grass::InputSyntax::Scss => Ok(Self::Scss), - _ => Err(()), - } - } -} - -impl From<OneSyntaxToRuleThemAll> for raffia::Syntax { - fn from(value: OneSyntaxToRuleThemAll) -> Self { - match value { - OneSyntaxToRuleThemAll::Sass => Self::Sass, - OneSyntaxToRuleThemAll::Scss => Self::Scss, - } - } -} - -#[cfg(feature = "compile")] -impl From<OneSyntaxToRuleThemAll> for grass::InputSyntax { - fn from(value: OneSyntaxToRuleThemAll) -> Self { - match value { - OneSyntaxToRuleThemAll::Scss => Self::Scss, - OneSyntaxToRuleThemAll::Sass => Self::Sass, - } - } -} diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 99262d8..caff4a6 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -19,5 +19,4 @@ proc-macro = true sabry_procmacro_impl.workspace = true [features] -const-compile = ["sabry_procmacro_impl/const-compile"] nightly = ["sabry_procmacro_impl/nightly"] diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index 229540a..551237e 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -13,18 +13,21 @@ all-features = true rustdoc-args = ["--cfg", "docsrs"] [dependencies] -cfg-if.workspace = true +## Workspace +sabry_intrnl.workspace = true +sabry_intrnl.features = ["config-manifest", "style-compiler"] +## Css +raffia.workspace = true +## Util itertools.workspace = true +regex.workspace = true +## Codegen +thiserror.workspace = true proc-macro2.workspace = true proc-macro2.features = ["span-locations"] quote.workspace = true -raffia.workspace = true -regex.workspace = true -sabry_intrnl.workspace = true -sabry_intrnl.features = ["scope"] syn.workspace = true syn.features = ["parsing"] [features] -const-compile = ["sabry_intrnl/compile"] nightly = [] diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index eaac922..a82dcb4 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -3,7 +3,7 @@ use std::{fmt::Debug, fs, path::PathBuf, str::FromStr}; use proc_macro2::{Span, TokenStream}; use quote::{ToTokens, TokenStreamExt, quote}; use regex::Regex; -use sabry_intrnl::syntax::ostrta::OneSyntaxToRuleThemAll; +use sabry_intrnl::style::syntax::SyntaxKind; use syn::{Ident, LitStr, Token, braced, parse::Parse}; pub mod scssy; @@ -96,9 +96,9 @@ impl ToString for ArbitraryStyleBlock { } #[derive(Default, Debug, Clone, Copy)] -pub struct ArbitraryStyleSyntax(OneSyntaxToRuleThemAll); +pub struct ArbitraryStyleSyntax(SyntaxKind); -impl From<ArbitraryStyleSyntax> for OneSyntaxToRuleThemAll { +impl From<ArbitraryStyleSyntax> for SyntaxKind { fn from(value: ArbitraryStyleSyntax) -> Self { value.0 } @@ -107,8 +107,9 @@ impl From<ArbitraryStyleSyntax> for OneSyntaxToRuleThemAll { impl ToTokens for ArbitraryStyleSyntax { fn to_tokens(&self, tokens: &mut TokenStream) { match self.0 { - OneSyntaxToRuleThemAll::Sass => tokens.append_all(quote! {"sass"}), - OneSyntaxToRuleThemAll::Scss => tokens.append_all(quote! {"scss"}), + SyntaxKind::Sass => tokens.append_all(quote! {"sass"}), + SyntaxKind::Scss => tokens.append_all(quote! {"scss"}), + SyntaxKind::Css => tokens.append_all(quote! {"css"}), } } } @@ -116,7 +117,7 @@ impl ToTokens for ArbitraryStyleSyntax { impl TryFrom<&str> for ArbitraryStyleSyntax { type Error = (); fn try_from(value: &str) -> Result<Self, Self::Error> { - Ok(Self(OneSyntaxToRuleThemAll::try_from(value)?)) + Ok(Self(SyntaxKind::try_from(value)?)) } } diff --git a/sabry_procmacro_impl/src/impls/scssy.rs b/sabry_procmacro_impl/src/impls/scssy.rs index 7ab9854..c3eb91d 100644 --- a/sabry_procmacro_impl/src/impls/scssy.rs +++ b/sabry_procmacro_impl/src/impls/scssy.rs @@ -2,7 +2,7 @@ use std::path::PathBuf; use proc_macro2::TokenStream; use quote::quote; -use sabry_intrnl::scoper::ArbitraryScope; +use sabry_intrnl::style::scope::ArbitraryScope; use syn::{Ident, parse::ParseStream}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -67,12 +67,3 @@ impl MacroSyntax { }) } } - -// impl Parse for MacroSyntax { -// fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { -// Self::parse_syn(input, None) -// } -// } - -#[cfg(test)] -mod test {} diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index cf0d81b..459e175 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -1,12 +1,14 @@ use std::path::PathBuf; -use cfg_if::cfg_if; use itertools::Itertools; use proc_macro2::{Span, TokenStream}; use quote::quote; use sabry_intrnl::{ - config::SabryConfig, - scoper::{ArbitraryScope, ScopedSelector, sanitize_css_member}, + conf::SabryConfig, + style::{ + compiler::CompilerAdapter, + scope::{ArbitraryScope, ScopedSelector, sanitize_css_member}, + }, }; use syn::{ Ident, Token, @@ -102,7 +104,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: PathBuf) -> TokenStream let ident = sanitize_css_member(&s); let fnident = syn::parse_str::<Ident>(format!("_{ident}").as_str()) .expect("BUG: invalid ident for nesting selector formed"); - let formatstr = format!("{{c}}{}", &s); + let formatstr = format!("{{c}}{}", s); let doc = format!("Nesting selector. Originated from '&{s}'"); quote! { @@ -152,53 +154,42 @@ pub fn styly_macro_impl(input: TokenStream, source_path: PathBuf) -> TokenStream let mod_docs = format!( "'{}' style scope. The hash class is `{}`", - &scope_ident, &scope_wrapper_ident + scope_ident, scope_wrapper_ident ); let wrp_docs = format!( "hash class for '{}' scope. All HTML elements should have this class applied", - &scope_ident + scope_ident ); if constant { - cfg_if! { - if #[cfg(feature = "const-compile")] { - use sabry_intrnl::compiler::CompilerAdapter; - let compiler = CompilerAdapter::new(config.clone()); - let css = match compiler.compile_module(ms.syntax.0, &scope.hashed_code) { - Ok(c) => c, - Err(e) => { - return syn::Error::new( - ms.code.span, - format!("Could not compile const inline: {e:?}"), - ) - .to_compile_error() - } - }; - - let const_docs = format!("The compiled CSS style for {} scope", &scope_ident); - let const_wrapper_ident = syn::parse_str::<Ident>( - format!("{}_CSS", &scope_ident.to_string().to_uppercase()).as_str(), - ) - .expect("BUG: We just converted valid Ident to string and uppercased"); - - quote! { - #[doc = #const_docs] - #scope_vis const #const_wrapper_ident: &str = #css ; - #[doc = #wrp_docs] - #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; - #[doc = #mod_docs] - #scope_vis mod #scope_ident { - #(#scope_members)* - #(#special_nesting_members)* - } - } - } else { + let compiler = CompilerAdapter::new(config.clone()); + let css = match compiler.compile_module(ms.syntax.0, &scope.hashed_code) { + Ok(c) => c, + Err(e) => { return syn::Error::new( - Span::call_site(), - "`styly!(const scope...` requires `experimental-const-scoping` feature flag", + ms.code.span, + format!("Could not compile const inline: {e:?}"), ) .to_compile_error(); } + }; + + let const_docs = format!("The compiled CSS style for {} scope", scope_ident); + let const_wrapper_ident = syn::parse_str::<Ident>( + format!("{}_CSS", scope_ident.to_string().to_uppercase()).as_str(), + ) + .expect("BUG: We just converted valid Ident to string and uppercased"); + + quote! { + #[doc = #const_docs] + #scope_vis const #const_wrapper_ident: &str = #css ; + #[doc = #wrp_docs] + #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; + #[doc = #mod_docs] + #scope_vis mod #scope_ident { + #(#scope_members)* + #(#special_nesting_members)* + } } } else { quote! { diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 4cc9d27..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,18 +0,0 @@ -#![doc = include_str!("../README.md")] -#![cfg_attr(docsrs, feature(doc_cfg))] - -#[cfg_attr(docsrs, doc(cfg(feature = "build")))] -#[cfg(feature = "build")] -pub use sabry_build::buildmagic::buildy; -#[cfg_attr(docsrs, doc(cfg(feature = "procmacro")))] -#[cfg(feature = "procmacro")] -pub use sabry_procmacro::*; - -// reexports -#[cfg_attr(docsrs, doc(cfg(all(feature = "build", feature = "internals"))))] -#[cfg(all(feature = "build", feature = "internals"))] -pub use sabry_build::*; - -#[cfg_attr(docsrs, doc(cfg(all(feature = "procmacro", feature = "internals"))))] -#[cfg(all(feature = "procmacro", feature = "internals"))] -pub use sabry_intrnl::*; From 96352020bb9da6ab362aaa844d66f78f9b1f909f Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.work> Date: Wed, 21 Oct 2026 01:22:08 +0300 Subject: [PATCH 092/184] repo move --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a1a5e1d..2aa1b01 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ > **Repository moved** > -> On GithHub this repository is now a [push-mirror](https://source.spushk.ru/rustyworks/sabry) -> and will be removed from GH at 07-2026 +> On GithHub this repository is now a [push-mirror](https://git.spushk.work/rustyworks/sabry) > -> Crate will remain maintained +> Crate is still kinda maintained # 🧙🏻 SABRY - Syntactically Awesome, But RustY From d47557dc59a91d7f454f9ceea86cfafed61f5853 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 10:59:43 +0500 Subject: [PATCH 093/184] initial os release. I really expect SO much bugs, guys. good luck =) --- .gitignore | 4 + Cargo.lock | 1476 ++++++++++++++++++++ Cargo.toml | 80 ++ LICENSE | 0 README.md | 589 ++++++++ examples/define-styles/Cargo.lock | 1483 ++++++++++++++++++++ examples/define-styles/Cargo.toml | 9 + examples/define-styles/src/lib.rs | 104 ++ examples/leptos-axum/.gitignore | 14 + examples/leptos-axum/Cargo.toml | 67 + examples/leptos-axum/LICENSE | 24 + examples/leptos-axum/README.md | 90 ++ examples/leptos-axum/build.rs | 11 + examples/leptos-axum/public/favicon.ico | Bin 0 -> 15406 bytes examples/leptos-axum/src/lib.rs | 10 + examples/leptos-axum/src/main.rs | 38 + examples/leptos-axum/src/routes/home.rs | 33 + examples/leptos-axum/src/routes/home.scss | 12 + examples/leptos-axum/src/routes/mod.rs | 1 + examples/leptos-axum/src/shell.rs | 43 + examples/use-styles/Cargo.lock | 1491 +++++++++++++++++++++ examples/use-styles/Cargo.toml | 24 + examples/use-styles/assets/prelude.css | 4 + examples/use-styles/build.rs | 22 + examples/use-styles/src/main.rs | 17 + examples/use-styles/src/main.sass | 12 + sabry_build/Cargo.toml | 28 + sabry_build/src/buildmagic.rs | 305 +++++ sabry_build/src/filevisit.rs | 51 + sabry_build/src/lib.rs | 3 + sabry_intrnl/Cargo.toml | 28 + sabry_intrnl/src/compiler/mod.rs | 120 ++ sabry_intrnl/src/config/manifest.rs | 44 + sabry_intrnl/src/config/mod.rs | 253 ++++ sabry_intrnl/src/lib.rs | 4 + sabry_intrnl/src/scoper/hash.rs | 97 ++ sabry_intrnl/src/scoper/mod.rs | 423 ++++++ sabry_intrnl/src/syntax/mod.rs | 226 ++++ sabry_procmacro/Cargo.toml | 22 + sabry_procmacro/src/lib.rs | 117 ++ sabry_procmacro_impl/Cargo.toml | 26 + sabry_procmacro_impl/src/impls/mod.rs | 202 +++ sabry_procmacro_impl/src/impls/sassy.rs | 68 + sabry_procmacro_impl/src/impls/styly.rs | 209 +++ sabry_procmacro_impl/src/impls/usey.rs | 71 + sabry_procmacro_impl/src/lib.rs | 4 + src/lib.rs | 6 + 47 files changed, 7965 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 examples/define-styles/Cargo.lock create mode 100644 examples/define-styles/Cargo.toml create mode 100644 examples/define-styles/src/lib.rs create mode 100644 examples/leptos-axum/.gitignore create mode 100644 examples/leptos-axum/Cargo.toml create mode 100644 examples/leptos-axum/LICENSE create mode 100644 examples/leptos-axum/README.md create mode 100644 examples/leptos-axum/build.rs create mode 100644 examples/leptos-axum/public/favicon.ico create mode 100644 examples/leptos-axum/src/lib.rs create mode 100644 examples/leptos-axum/src/main.rs create mode 100644 examples/leptos-axum/src/routes/home.rs create mode 100644 examples/leptos-axum/src/routes/home.scss create mode 100644 examples/leptos-axum/src/routes/mod.rs create mode 100644 examples/leptos-axum/src/shell.rs create mode 100644 examples/use-styles/Cargo.lock create mode 100644 examples/use-styles/Cargo.toml create mode 100644 examples/use-styles/assets/prelude.css create mode 100644 examples/use-styles/build.rs create mode 100644 examples/use-styles/src/main.rs create mode 100644 examples/use-styles/src/main.sass create mode 100644 sabry_build/Cargo.toml create mode 100644 sabry_build/src/buildmagic.rs create mode 100644 sabry_build/src/filevisit.rs create mode 100644 sabry_build/src/lib.rs create mode 100644 sabry_intrnl/Cargo.toml create mode 100644 sabry_intrnl/src/compiler/mod.rs create mode 100644 sabry_intrnl/src/config/manifest.rs create mode 100644 sabry_intrnl/src/config/mod.rs create mode 100644 sabry_intrnl/src/lib.rs create mode 100644 sabry_intrnl/src/scoper/hash.rs create mode 100644 sabry_intrnl/src/scoper/mod.rs create mode 100644 sabry_intrnl/src/syntax/mod.rs create mode 100644 sabry_procmacro/Cargo.toml create mode 100644 sabry_procmacro/src/lib.rs create mode 100644 sabry_procmacro_impl/Cargo.toml create mode 100644 sabry_procmacro_impl/src/impls/mod.rs create mode 100644 sabry_procmacro_impl/src/impls/sassy.rs create mode 100644 sabry_procmacro_impl/src/impls/styly.rs create mode 100644 sabry_procmacro_impl/src/impls/usey.rs create mode 100644 sabry_procmacro_impl/src/lib.rs create mode 100644 src/lib.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f276f31 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +**/target +rust-toolchain.toml +.vscode +.profile diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..80d7a63 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1476 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "anstream" +version = "0.6.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" + +[[package]] +name = "cc" +version = "1.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "codemap" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "const_format" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.2", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.85", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "grass" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" +dependencies = [ + "clap", + "getrandom", + "grass_compiler", +] + +[[package]] +name = "grass_compiler" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" +dependencies = [ + "codemap", + "indexmap", + "lasso", + "once_cell", + "phf 0.11.2", + "rand", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lasso" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.161" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" + +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" +dependencies = [ + "ahash 0.8.11", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom", + "itertools", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "paste", + "pathdiff", + "rayon", + "serde", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + +[[package]] +name = "parcel_selectors" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" +dependencies = [ + "bitflags", + "cssparser", + "fxhash", + "log", + "phf 0.10.1", + "phf_codegen", + "precomputed-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" +dependencies = [ + "base64-simd", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "raffia" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" +dependencies = [ + "raffia_macro", + "smallvec", +] + +[[package]] +name = "raffia_macro" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" +dependencies = [ + "heck", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "sabry" +version = "0.0.1" +dependencies = [ + "sabry_build", + "sabry_intrnl", + "sabry_procmacro", +] + +[[package]] +name = "sabry_build" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "sabry_intrnl", + "sabry_procmacro_impl", + "syn 2.0.85", + "thiserror", + "walkdir", +] + +[[package]] +name = "sabry_intrnl" +version = "0.0.1" +dependencies = [ + "base64", + "blake3", + "const_format", + "grass", + "lightningcss", + "proc-macro2", + "raffia", + "regex", + "serde", + "syn 2.0.85", + "thiserror", + "toml", +] + +[[package]] +name = "sabry_procmacro" +version = "0.0.1" +dependencies = [ + "sabry_procmacro_impl", +] + +[[package]] +name = "sabry_procmacro_impl" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "raffia", + "regex", + "sabry_intrnl", + "syn 2.0.85", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "serde" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "serde_json" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..c31dc20 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,80 @@ +[workspace] +resolver = "2" +members = [ + "sabry_procmacro", + "sabry_procmacro_impl", + "sabry_intrnl", +] +exclude = [ + "examples" +] + +[workspace.dependencies] +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1"} +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1"} +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1"} +sabry_build = {path = "sabry_build", version = "0.0.1"} + +syn = {version = "^2.0"} +quote = {version = "^1.0"} +proc-macro2 = {version = "^1.0"} +raffia = {version = "^0.9"} +regex = {version = "^1.11"} +grass = {version = "^0.13"} +lightningcss = {version = "1.0.0-alpha.59"} +blake3 = {version = "^1.5"} +base64 = {version = "^0.22"} +const_format = {version = "^0.2"} + +thiserror = {version = "^1.0"} +serde = {version = "^1.0"} +toml = {version = "^0.8"} + + +[workspace.package] +version = "0.0.1" +edition = "2021" +rust-version = "1.82" +authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] +license = "MIT" +publish = true + +[package] +name = "sabry" +description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust." +keywords = ["web", "sass", "scss", "macro"] +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true +publish.workspace = true + +[dependencies] +sabry_procmacro = {workspace = true, optional = true} +sabry_build = {workspace = true, optional = true} +sabry_intrnl = {workspace = true} + +[features] +default = ["scss"] +procmacro = [ + "dep:sabry_procmacro" +] +sass = [ + "procmacro", + "sabry_procmacro/sass", + "sabry_intrnl/sass", + "sabry_build/sass" +] +scss = [ + "procmacro", + "sabry_procmacro/scss", + "sabry_intrnl/scss", + "sabry_build/scss" +] +build = [ + "dep:sabry_build" +] +net-files = [ + "sabry_build/net-files" +] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e969449 --- /dev/null +++ b/README.md @@ -0,0 +1,589 @@ +# 🧙🏻 SABRY - Syntactically Awesome, But RustY + +**Y**et another **R**usty **B**oilerplate-free **A**gnostic **S**tyling crate, which brings your SASS/SCSS style into Rust. Written by a fox this time. + +\* sabry isn't "syntactically awesome", it refers to SASS abbr expansion. + +> **Project status** - early, good enough for my team's non-critical "for-fun" pre-production, on demand. WIP features have no ETA. I'm pretty happy with ergonomics and taste of the crate, and I'll do my best to keep DX the way it is between minor versions - but there's no guarantee on backwards-compatibility and no refunds if something breaks. +> +> "master" branch is what's currently on crates.io +> +> each version ever been on crates.io (except the latest release) is available in "r_x.x.x" branch +> +> the latest-trashy state is in the "window" branch + +At first, I'll show how this crate "tastes". With SABRY, its in your power to: + +<table> +<tr> +<td> + +Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with modules, with feature flags, etc. Say "bye" to manual copying, cli-tools and consts. + +```rust +sassy!(tokens {@mixin colored{color: red;}}); +``` + +</td> +<td> +📦 +</td> +</tr> +<tr> +<td> + +Code your SASS in separate files to get proper syntax highlighting, or do sass-in-the-rust to keep things in one place + +```rust +styly!(component {.btn {color: green;}}); +styly!(extras "src/components/extras.scss"); +``` + +</td> +<td> +:3 +</td> +</tr> +<tr> +<td> + +Depend on styles with cargo, at build time, which brings all the rusty sweeties in: versions, updates, cratesio, local registries, workspaces, etc. + +```toml +[build-dependencies] +tgk_brandstyle = {version = "0.0.1", features = ["utils"]} +``` + +</td> +<td> +🦀 +</td> +</tr> +<tr> +<td> + +`@use` your style-crates in sass code *naturally* + +```rust +styly!(breadcumb { + @use 'tokens'; + .scope {@include tokens.badge(primary);} +}) +``` + +</td> +<td> +🪄 +</td> +</tr> +<tr> +<td> + +Keep things as private and modular as you wish + +```rust +styly!(pub cats "src/sections/cats/style.scss"); +styly!(dogs {#howl {border: none;}}) + +/// something like render function +{ + <div class={cats::meow}> + <ul id={dogs::thehowl}></ul> + </div> +} +``` + +</td> +<td> +^_^ +</td> +</tr> +<tr> +<td> + +Compile all the sweet SASS/SCSS into the optimized CSS bundle, ship it in CSS shunks or even include the compiled style into the binary + +```rust +styly!(cssbundle {.c1 {color: white;}}) +styly!(const binary {.c2 {color: black;}}) +``` + +</td> +<td> +🏗️ +</td> +</tr> +</table> + +Sabry will gladly: + +- scope and hash your styles, so they won't conflict, with amazing [raffia](https://crates.io/crates/raffia) parser +- compile SASS/SCSS into CSS with [grass](https://crates.io/crates/grass) +- optimize produced CSS with [lightningcss](https://crates.io/crates/lightningcss) +- prepare ready CSS bundle and put it wherever you wish +- include CSS into the build artifact - if you really want it + +Also, just about everything is pub-available in this crate - Sabry is ready for experiments. + + +## Usage + +Feel free to check out examples: + +|[crate of styles](./examples//define-styles/)|[style usage](./examples/use-styles/)|[leptox-axum with sabry](./examples/leptos-axum)| +|-|-|-| + +### Create a crate full of arbitrary SASS + +The only need is the dependency + +```toml +#Cargo.toml + +[dependencies] +sabry = {version = "0.0.1"} +``` +And a proc-macro +```rust +// lib.rs +use sabry::sassy; + +sassy!(mixins "assets/mixins.scss"); +sassy!(styles { + $primary-color: black; + @mixin colored($col: primary) { + @if $col == primary { + color: $primary-color; + } @else { + color: $col; + } + } +}); +``` +Now you can build and see two ready for export macros: `mixins!` and `styles!`. +These are usefull on their own, as invocation of `mixins!()` or `styles!()` - both shall give you the code literal. + +However there's more sweet use case for them, which is covered below. + +### Write scoped styles + +Depend on sabry +```toml +# Cargo.toml + +[dependencies] +sabry = {version = "0.0.1"} +``` +And create a style scope wherever you want: +```rust +// breadcumblist.rs +use sabry::styly; + +styly!(const styles { + .cumbs { + display: flex; + &__list { + display: flex; + } + } + #wolf { + color: white; + } +}); + +fn render() -> HtmlElement { + div().class(styles::cumbs).chain( + ul().class(styles::_list(styles::cumbs)) + ).chain( + span().id(styles::thewolf) + ) +} +``` +> That `const` usage is covered in the [following](#constant-styly-scopes) section. In this example we dont invoke sabry build-magic, so, to be as close to real life as possible, I used a const. + +Every selector, if that does make sense, now available for you as a member of `styles` scope. In this example - `styles::cumbs`, `styles::thewolf` and `styles::_list()`. More about scoping and member names you can read [here](#styly-scopes). + +### Use styles earlier created in another crate + +The combination of previous two, with some additional work to do and some extra sugar to enjoy. + +Sabry is needed as both dependency and build-dependency. +To be able to compile all styles sabry also needs the *build* feature flag: +```toml +# Cargo.toml + +[dependencies] +sabry = {version = "0.0.1"} + +[build-dependencies] +sabry = {version = "0.0.1", features = ["build"]} +``` +> If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. + +Then you have to tell sabry when code should be compiled. We'll do this in *build.rs* file. +```rust +// build.rs +use shared_styles::{mixins, styles}; + +fn main(){ + sabry::buildy( + sabry::usey!( + mixins!(), + styles!() + ) + ).expect("Failed to build sabry styles"); +} +``` +`buildy` is the entry function of sabry build-time process. The handy `usey!` macro will do just proper handling of our style-macros for it. + +Now lets get back to the code and use the mixin defined in another crate: +```rust +// breadcumblist.rs +use sabry::styly; + +styly!(styles { + @use "mixins"; + .cumbs { + display: flex; + &__list { + display: flex; + } + } + #wolf { + @include mixins.colored(white); + } +}); + +fn render() -> HtmlElement { + div().class(styles::cumbs).chain( + ul().class(styles::_list(styles::cumbs)) + ).chain( + span().id(styles::thewolf) + ) +} +``` +So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` function call is now accessible with simple and natural `@use "mixins"` SASS rule! + +## Configuration + +Sabry configuration lives in `[package.metadata.sabry]` table of the manifest file. + +All configurations are optional, but with default configuration sabry won't produce any CSS files. + +Full example, close to defaults: +```toml +# Cargo.toml + +[package.metadata.sabry] +css.bundle = "target/static/style.css" +css.bundle_prelude = ["assets/prelude.css"] +css.scopes = "target/statis/scopes/" +css.minify = true + +sass.intermediate_dir = "target/.sabry/sass" +sass.module_name_collision = "merge" +sass.modules = ["assets/sass/mod1.scss"] +sass.scanroot = "src" + +hash.size = 6 +hash.collision = "error" +hash.use_scope_name = true +hash.use_code_size = true +hash.use_item_names = false +hash.use_code_text = false + +[package.metadata.sabry.lightningcss.targets] +chrome = "120" +safari = "13.2" +ie = "6" +``` + +### `sabry.css` + +**bundle** *(no default)* - file path ro write CSS bundle into relative to project root + +**bundle_prelude** *(no default)* - collection of CSS files, relative to the project root, which content will be inserted before the compiled style into the *bundle* file if any + +**scopes** *(no default)* - dir path to put separate CSS for every scope into relative to project root + +**minify** *(default true)* - print compressed CSS output and do the lightningcss thing + +### `sabry.sass` + +**intermediate_dir** *(default "target/.sabry/sass")* - file to put SASS/SCSS modules into so they are available with `@use` in code + +**scanroot** *(default "src")* - root directory to start scanning "rs" files from. Used in build function + +**modules** *(no default)* - collection of SASS/SCSS files, relative to the project root, which should be available as modules as well + +**module_name_collision** *(default "merge")* - how to handle similary named modules. + +*merge* - merge content + +*error* - break building process with an error + +### `sabry.hash` + +**size** *(default 6)* - size of hash in bytes. Feel free to increase/decrease. + +**use_scope_name** *(default true)* - wether to use scope identifier to calculate hash + +**use_code_size** *(default true)* - wether to use scope code size to calculate hash + +**use_item_names** *(default false)* - wether to use all scoped item idents to calculate hash + +**use_code_text** *(default false)* - wether to use the scope code text to calculate hash + +**collision** *(default "ignore")* - how to handle similarity of generated hashes + +*ignore* - dont do anything + +*error* - break building process with an error + +### `sabry.lightningcss.targets` + +Does require `css.minify` to be *true*. + +Empty by default. + +Available keys: chrome, firefox, edge, safari, saf_ios, samsung, android, ie + +Value - minimal browser version to support in "M.m.p" format, where: + +- *M* - major +- *m* - minor +- *p* - patch + +For example `{ie = "9", saf_ios = "13.2"}` will try to generate CSS supported on both IE 9 and Safari-on-ios 13.2 + +## Detailed guide + +### Style definition with `sassy!` + +The `sassy!` macro is available with *procmacro* feature which is enabled by default. + +It does accept the following syntax: `$name(:$syntax)? ({ $code })|($filename)`, where + +- *$name* is any identifier valid for `macro_rules!` +- *$syntax* is either `sass` or `scss` +- *$code* is valid arbitrary style code in specified syntax +- *$filename* is a string literal which contains path to the file relative to package root + +Examples: +```rust +sassy!(module1 {$primary-color: red;}); +sassy!(module2 "src/assets/module2.scss"); +sassy!(module3:sass "src/assets/module3.sass"); +// works, but there are catches. +sassy!(module4:sass { + =colored + color: red +}); +``` + +You may omit the syntax specifier - sabry uses SCSS as the default one. + +The given code to `sassy!` is not checked to be valid code in given syntax (wip). + +> SASS support inside of rust files is experimental. If you do want to use SASS tabbed syntax - consider to use files path instead of sass-in-rust option. + +### Scoping with `styly!` + +The `styly!` macro is available with *procmacro* feature flag which is enabled by default. + +It does accept the following syntax: `pub? const? $ident(:$syntax)? ({ $code })|($filename)`, where + +- *pub* is explained [here](#public-styly-scopes) +- *const* is explained [here](#constant-styly-scopes) +- *$ident* is any identifier valid for `mod` +- *$syntax* is either `sass` or `scss` +- *$code* is arbitrary style code valid with given syntax +- *$filename* is a string literal which contains path to the file relative to package root + +Examples +```rust +styly!(fox {.fur {color: red; &-dark {color: black;}}}) +styly!(pub fox {.fur {color: red; &-dark {color: black;}}}) +styly!(pub const fox:sass { + .fur + color: red + &-dark + color: black +}) +``` +Every of those calls will produce the styling scope as a module. Differences are explained right below. + +In general the scope does look like this: +```rust +const FOX: &str = "J9k_s9"; +mod fox { + pub const fur: &str = "J9k_s9 fur"; + pub fn _dark(c: &str) -> String {format!("{c}-dark")} +} +``` + +#### Styly scopes + +Styly macro itself does not generate the scope. It is done in the `sabry_intrnl::scoper`. However, as a result, you will have the following: + +- `const` with the UPPER_CASE name of the scope, which contains its hash +- `mod` with exact scope name which is the scope you're going to use + - for simple selectors, like `.fur` you will have a const members with hashed original selectors to use wherever you need a class/id/etc. + - for parent-selectors like `&-dark` you will have a non-const function, which will create matching the selector from any other. + +You can read more about scoping and hashing in the [scoping](#scoping) section. + +#### Public styly scopes + +By default generated `mod` is private. You can make both mod and wrapper style constant public by adding the `pub` to macro call: + +```rust +styly!(pub whatever "src/assets/whatever.scss"); +``` + +#### Constant styly scopes + +As you've seen above, scope doe not contain any style code by itself. That's the use case i advise mostly. + +However you could still compile styles into the artifact by simply adding the `const` to the macro call: + +```rust +styly!(const scope "src/assets/scope.scss"); +``` +Which results in following: +```rust +const SCOPE: &str = /* scope hash */; +const SCOPE_CSS: &str = /* compiled from src/assets/scope.scss */; +mod scope {/* selector collection */} +``` + +> **There is a catch** | with the `const` modifier macro must compile CSS at compile-time. That results in several game changers: +> +> *First*. You could avoid the "build magic". Sabry will just compile given styles with procmacro at compile time. +> +> *Second*. If you `@use` something inside of constant-flavored scope, you can only success if sabry *did the build magic before compilation of that macro call*. So you still can compile the styles into the artifact and enjoy mixins from other crates, but, in general, you are going to receive some false-positives from editor. +> +> Worth of notice: sabry will still include const-flavored styles into the CSS bundle during build time. + +### Building with `buildy` and `usey!` + +The `buildy` function is available with *build* feature which needs to be enabled explicitly. + +This function accepts an iterator of pairs: (file_name, code) in form of `(String, String)` type. File name should have an extension, so grass can infere syntax during CSS compilation. + +Each of those pairs is processed as a file which sabry needs to write into +the configured `intermediate_dir` and then passed into the CSS compiler. + +You could, for example, define the module "mixin_a": +```rust +buildy(vec![("mixin_a".to_string(), "@mixin a(){}".to_string())]); +``` + +However there's a usey macro, which handles this for you: +```rust +buildy( + usey!(mixins!(), utils!()) +); +``` + +The `usey!` macro accepts the following syntax: +`#($macro,)*`, where + +- *$macro* is a macro which handles three expansions: + - `() => { $code }` + - `(name) => { $name }` + - `(syntax) => { $syntax }` + +Where for the *$macro*: + +- *$code* is a source code of style as a string literal +- *$name* is a name of module without extension as a string literal +- *$syntax* is either "sass" or "scss" + + +Exactly this kind of macros is produced by [`sassy!`](#style-definition-with-sassy). + +### Scoping + +Sabry handles scoping by restriction or mutation of existing selectors +with the hash. Hash is calculated for the entire scope by the [`styly!`](#scoping-with-styly) macro. + +Currently the following types of selectors are scoped: + +- class +- id +- SASS parent selectors (see below, there is a catch) +- tagname (see below, there is a catch) + +Sabry does not make difference between top-level and nested selectors, +also selector complexity isn't taken into account: sabry simply walks through all compound selectors +and apply scoping for supported ones. + +Different selector types are scoped differently: + +- class selectors are restricted with scope hash: `.class` -> `.HASH.class` +- id selector are mutated with scope hash: `#id` -> `#id-HASH` +- tagname selectors are changed into indirect descendance: `div` -> `.HASH div` + +> **There is a catch** | currently tagname selectors are scoped with indirect descendancy +> hash restriction. That means - if you do use tagnames in scoped stylesheets, you have to wrap your markdown +> with `SCOPE` class generated by `styly!` macro. +> +> Also if there are nested tagname selectors - sabry won't take this into account and you'll +> have to wrap them with `SCOPE` class as well + +As for **SASS parent selectors**: they are currently handled in different way. Instead of +walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: + +```rust +styly!(scope { + .cls1 { + &-dark {} + } +}); +``` +is something like +```rust +const SCOPE: &str = "Ut8CskJ"; +mod scope { + pub const cls1: &str = "Ut8CskJ cls1"; + pub fn _dark(c: &str) -> String {format!("{c}-dark")} +} +``` + +So you still can get the scoped variant of `cls1-dark` class: `scope::_dark(scope::cls1)`. + +This isn't very handy, also isn't strict enough, and is a high-priority subject to change. wip. + +## WIP + +*(sorted by my own priority)*, "dones" are excluded + +- [] Crates of styled components - currently the only way to create them seems to be const styly. + - [] CSS support +- [] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. +- [] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. + +## Contributions + +Any contributions are always welcome! + +If you find this crate usefull, wanna stick with it in some project, but do miss some +features - feel free to submit a PR. + +> If you'd like to fork for the PR - please, use the "window" branch, not the "master". + +If you encounter any bugs/problems or have use case where things dont work as they should +for the latest version - please, open an issue! + +If you'd like to lend a paw - feel free to check the [WIP](#wip) section out, or to search for "TODO" comments. + +## MSRV + +Sabry passes its own tests on 1.82 nightly. + +There *were* some strange parsing issues reports on *stable* channel, seems to be fixed. idk. + +## License + +MIT. diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock new file mode 100644 index 0000000..963559d --- /dev/null +++ b/examples/define-styles/Cargo.lock @@ -0,0 +1,1483 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "anstream" +version = "0.6.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" + +[[package]] +name = "cc" +version = "1.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "codemap" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "const_format" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.2", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.85", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + +[[package]] +name = "define-styles" +version = "0.0.0" +dependencies = [ + "sabry", +] + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "grass" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" +dependencies = [ + "clap", + "getrandom", + "grass_compiler", +] + +[[package]] +name = "grass_compiler" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" +dependencies = [ + "codemap", + "indexmap", + "lasso", + "once_cell", + "phf 0.11.2", + "rand", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lasso" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.161" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" + +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" +dependencies = [ + "ahash 0.8.11", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom", + "itertools", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "paste", + "pathdiff", + "rayon", + "serde", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + +[[package]] +name = "parcel_selectors" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" +dependencies = [ + "bitflags", + "cssparser", + "fxhash", + "log", + "phf 0.10.1", + "phf_codegen", + "precomputed-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" +dependencies = [ + "base64-simd", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "raffia" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" +dependencies = [ + "raffia_macro", + "smallvec", +] + +[[package]] +name = "raffia_macro" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" +dependencies = [ + "heck", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "sabry" +version = "0.0.1" +dependencies = [ + "sabry_build", + "sabry_intrnl", + "sabry_procmacro", +] + +[[package]] +name = "sabry_build" +version = "0.0.0" +dependencies = [ + "proc-macro2", + "sabry_intrnl", + "sabry_procmacro_impl", + "syn 2.0.85", + "thiserror", + "walkdir", +] + +[[package]] +name = "sabry_intrnl" +version = "0.0.0" +dependencies = [ + "base64", + "blake3", + "const_format", + "grass", + "lightningcss", + "proc-macro2", + "raffia", + "regex", + "serde", + "syn 2.0.85", + "thiserror", + "toml", +] + +[[package]] +name = "sabry_procmacro" +version = "0.0.0" +dependencies = [ + "sabry_procmacro_impl", +] + +[[package]] +name = "sabry_procmacro_impl" +version = "0.0.0" +dependencies = [ + "proc-macro2", + "quote", + "raffia", + "regex", + "sabry_intrnl", + "syn 2.0.85", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "serde" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "serde_json" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml new file mode 100644 index 0000000..496ecd3 --- /dev/null +++ b/examples/define-styles/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "define-styles" +version = "0.0.0" +edition = "2021" +rust-version = "1.82" +publish = false + +[dependencies] +sabry = {path = "../../", features = ["sass"]} diff --git a/examples/define-styles/src/lib.rs b/examples/define-styles/src/lib.rs new file mode 100644 index 0000000..bdf62c3 --- /dev/null +++ b/examples/define-styles/src/lib.rs @@ -0,0 +1,104 @@ +use sabry::sassy; + +sassy!(utils { + @mixin flex($direction, $align, $justify, $gap: .5rem) { + display: flex; + list-style: none; + gap: $gap; + flex-direction: $direction; + + @if $align == start{ + align-items: flex-start; + } + @else if $align == end{ + align-items: flex-end; + } + @else{ + align-items: $align; + } + + @if $justify == start { + justify-content: flex-start; + } + @else if $justify == end { + justify-content: flex-end; + } + @else { + justify-content: $justify; + } + } +}); + +sassy!(theme { + $thm-surface-primary: #2b2a29; + $thm-surface-secondary: #6C6C6C; + $thm-surface-tertiary: #4C4C4C; + $thm-surface-accent: #B0CB1F; + + $thm-text-primary: #ffffff; + $thm-text-secondary: #ffffff; + $thm-text-tertiary: #ffffff; + $thm-text-accent: #B0CB1F; + + @mixin surface($style: primary) { + @if $style == primary { + @include txt(primary); + background-color: $thm-surface-primary; + } + @else if $style == secondary { + @include txt(secondary); + background-color: $thm-surface-secondary; + } + @else if $style == accent { + @include txt; + background-color: $thm-surface-accent; + } + } + + @mixin txt($style: primary) { + @if $style == primary { + font-weight: 500; + color: $thm-text-primary; + } + @else if $style == secondary { + font-weight: 400; + color: $thm-text-secondary; + } + @else if $style == tertiary { + font-weight: 400; + color: $thm-text-tertiary; + } + @else if $style == accent { + font-weight: 500; + color: $thm-text-accent; + } + } +}); + +sassy!(tokens { + @use "theme"; + + @mixin clickable($style: accent, $scale: 1.2, $clickscale: 0.9){ + @if $style == accent{ + @include theme.surface(accent); + } + @else if $style == secondary { + @include theme.surface(secondary); + } + + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: #00000000; + transition: transform .07s, filter .07s; + &:hover{ + transform: scale($scale); + } + &:focus-visible { + outline: 2px solid #fff; + } + &:active { + filter: brightness(.9); + transform: scale($clickscale); + } + } +}); diff --git a/examples/leptos-axum/.gitignore b/examples/leptos-axum/.gitignore new file mode 100644 index 0000000..6985cf1 --- /dev/null +++ b/examples/leptos-axum/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml new file mode 100644 index 0000000..7033f16 --- /dev/null +++ b/examples/leptos-axum/Cargo.toml @@ -0,0 +1,67 @@ +[package] +name = "leptos-axum-sabry" +version = "0.1.0" +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +leptos = { version = "0.7.0-gamma3" } +leptos_axum = { version = "0.7.0-gamma3", optional = true } +leptos_meta = { version = "0.7.0-gamma3" } +leptos_router = { version = "0.7.0-gamma3" } +axum = { version = "0.7", optional = true } +console_error_panic_hook = "0.1" +tokio = { version = "1", features = ["rt-multi-thread"], optional = true } +tower = { version = "0.4", optional = true } +tower-http = { version = "0.5", features = ["fs"], optional = true } +wasm-bindgen = "=0.2.93" +thiserror = "1" +tracing = { version = "0.1", optional = true } +http = "1" + +# sabry with sass +sabry = {path = "../../", features = ["sass"]} + +[build-dependencies] +# sabry for build with sass +sabry = {path = "../../", features = ["build", "sass"]} +# lets depend on our styles +define-styles = {path = "../define-styles"} + +[features] +hydrate = ["leptos/hydrate"] +ssr = [ + "dep:axum", + "dep:tokio", + "dep:tower", + "dep:tower-http", + "dep:leptos_axum", + "leptos/ssr", + "leptos_meta/ssr", + "leptos_router/ssr", + "dep:tracing", +] + +[package.metadata.sabry] +css.minify = true +# We'll use bundle for leptos +css.bundle = "target/.sabry/target/bundle.css" + +[package.metadata.leptos] +output-name = "leptos-axum" +site-root = "target/site" +site-pkg-dir = "pkg" +# Sabry-generated bundle for leptos +style-file = "target/.sabry/target/bundle.css" +assets-dir = "public" +site-addr = "127.0.0.1:3000" +reload-port = 3001 +browserquery = "defaults" +env = "DEV" +bin-features = ["ssr"] +bin-default-features = false +lib-features = ["hydrate"] +lib-default-features = false diff --git a/examples/leptos-axum/LICENSE b/examples/leptos-axum/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/examples/leptos-axum/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to <https://unlicense.org> diff --git a/examples/leptos-axum/README.md b/examples/leptos-axum/README.md new file mode 100644 index 0000000..e5d3c4a --- /dev/null +++ b/examples/leptos-axum/README.md @@ -0,0 +1,90 @@ +<picture> + <source srcset="https://raw.githubusercontent.com/leptos-rs/leptos/main/docs/logos/Leptos_logo_Solid_White.svg" media="(prefers-color-scheme: dark)"> + <img src="https://raw.githubusercontent.com/leptos-rs/leptos/main/docs/logos/Leptos_logo_RGB.svg" alt="Leptos Logo"> +</picture> + +# Leptos Axum Starter Template + +This is a template for use with the [Leptos](https://github.com/leptos-rs/leptos) web framework and the [cargo-leptos](https://github.com/akesson/cargo-leptos) tool using [Axum](https://github.com/tokio-rs/axum). + +## Creating your template repo + +If you don't have `cargo-leptos` installed you can install it with + +```bash +cargo install cargo-leptos --locked +``` + +Then run +```bash +cargo leptos new --git https://github.com/leptos-rs/start-axum-0.7 +``` + +to generate a new project template. + +```bash +cd leptos-axum +``` + +to go to your newly created project. +Feel free to explore the project structure, but the best place to start with your application code is in `src/app.rs`. +Addtionally, Cargo.toml may need updating as new versions of the dependencies are released, especially if things are not working after a `cargo update`. + +## Running your project + +```bash +cargo leptos watch +``` + +## Installing Additional Tools + +By default, `cargo-leptos` uses `nightly` Rust, `cargo-generate`, and `sass`. If you run into any trouble, you may need to install one or more of these tools. + +1. `rustup toolchain install nightly --allow-downgrade` - make sure you have Rust nightly +2. `rustup target add wasm32-unknown-unknown` - add the ability to compile Rust to WebAssembly +3. `cargo install cargo-generate` - install `cargo-generate` binary (should be installed automatically in future) +4. `npm install -g sass` - install `dart-sass` (should be optional in future + +## Compiling for Release +```bash +cargo leptos build --release +``` + +Will generate your server binary in target/server/release and your site package in target/site + +## Testing Your Project +```bash +cargo leptos end-to-end +``` + +```bash +cargo leptos end-to-end --release +``` + +Cargo-leptos uses Playwright as the end-to-end test tool. +Tests are located in end2end/tests directory. + +## Executing a Server on a Remote Machine Without the Toolchain +After running a `cargo leptos build --release` the minimum files needed are: + +1. The server binary located in `target/server/release` +2. The `site` directory and all files within located in `target/site` + +Copy these files to your remote server. The directory structure should be: +```text +leptos-axum +site/ +``` +Set the following environment variables (updating for your project as needed): +```text +LEPTOS_OUTPUT_NAME="leptos-axum" +LEPTOS_SITE_ROOT="site" +LEPTOS_SITE_PKG_DIR="pkg" +LEPTOS_SITE_ADDR="127.0.0.1:3000" +LEPTOS_RELOAD_PORT="3001" +``` +Finally, run the server binary. + +## Licensing + +This template itself is released under the Unlicense. You should replace the LICENSE for your own application with an appropriate license if you plan to release it publicly. diff --git a/examples/leptos-axum/build.rs b/examples/leptos-axum/build.rs new file mode 100644 index 0000000..be74188 --- /dev/null +++ b/examples/leptos-axum/build.rs @@ -0,0 +1,11 @@ +use define_styles::{theme, utils, tokens}; + +fn main(){ + sabry::buildy( + sabry::usey!( + utils!(), + theme!(), + tokens!() + ) + ).expect("Failed to build with sabry"); +} diff --git a/examples/leptos-axum/public/favicon.ico b/examples/leptos-axum/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2ba8527cb12f5f28f331b8d361eef560492d4c77 GIT binary patch literal 15406 zcmeHOd3aPs5`TblWD*3D%tXPJ#q(n!z$P=3gCjvf#a)E}a;Uf>h{pmVih!a-5LVO` zB?JrzEFicD0wRLo0iPfO372xnkvkzFlRHB)lcTnNZ}KK@US{UKN#b8?e_zkLy1RZ= zT~*y(-6IICgf>E_P6A)M3(wvl2qr-gx_5Ux-_uzT*6_Q&ee1v9B?vzS3&K5IhO2N5 z$9ukLN<`G>$$|GLnga~y%>f}*j%+w@(ixVUb^1_Gjoc;(?TrD3m2)RduFblVN)uy; zQAEd^T{5>-YYH%|Kv{V^cxHMBr1Ik<Vknc_c<}b#F7>7Frht$i<ZW=>mC`rqx@5*| z+OqN!xAjqmaU=qR$uGDMa7p!W9oZ+64($4xDk^FyFQ<_9Z`(;DLnB<;LLJD1<&vnZ zo0(>zIkQTse}qNMb6+i`th54(3pKm8;UAJ<_BULR*Z=m5FU7jiW(&#l+}WkHZ|e@1 z`pm;Q^pCuLUQUrnQ(hPM10pSSHQS=Bf8DqG1&!-B!oQQ|FuzLruL1w(+g<8&znyI? zzX-}?SwUvNjEuT?7uUOy{Fb@xKklpj+jdYM^IK9}NxvLRZd{l9FHEQJ4IO~q%4I0O zAN|*8x^nIU4Giw?f*tmNx=7H)2-Zn?J^B6SgpcW3ZXV_57Sn%Mtfr_=w|sYpAhdJT zcKo6Z*oIOU(az~3$LOEWm9Q)dYWMA}T7L23MVGqrcA%4H)+^`+=j+Hh8CTCnnG2Rh zgcXVW%F8$R9)6}f=NQiLPt8qt3xNUQI>Q*)H1lzk<&n?XR-f}tc&9V0H0lhGqHJ^N zN%h(9-Of2_)!Xk{qdIkU>1%mk%I_Id1!MU*yq&&>)Q+!L^t&-2<em6urrIod`3!;R z=Wl<Y!MEJ02?OvzHtZ7@%YC929AWK(Z|8caC7$l@-jj~(|6as!`sd>mW9Xq7g9C@* zl&PKJ&su2L+iku?Te?Pf?k3tUK){Bj_gb&aPo8Ago^XI~mRTd(5{&^tf1)!-lSMha z@$~ae!r(~`=p&|mMxy2EiZQ6FvXb(1avS*`Pj%$)*?vwceGKHmHnl`v&fEQ_Wh+G) zEPQ^3&oV%}%;zF`AM|S%d<Va?d!s3R8`U?Gc5T=!(zn}eR8m+-=T4lW_5WVR<Fo5n zEY(q7nO2p&AJ`YJQkGFZM|ZiEHhi$0s;jF-+BRDqrKeX@24}myPJCBwucrUJ{}Dk~ zmGza+>>pM@1}33PN5*4SewROk_K$n^i8QjaYiRzwG8#OvVIF|{x85wH+?*P*%)woI zR538k@=(E`V;p1UwA|fqSh`$n_t;Sz4T)`_s~pRR4lbmWWSdxa-FqLZ%fLT)B<thH z?r2KyM)!-N8kRZu_C{O60t~siHB@c4H=0*TZAw>h?iye?COx~mO1wkn5)HNMg7`8~ z25VJhz&3Z7`M>6luJrEw$<qW~i<R}a8vT1?EUc$>Jikft+6SxyIh?)PU1?DfrKMGC z=3T;;omE4H`PWqF8?0*dOA3o9y@~WK`S}{?tIHquEw?v`M^D%Lobpdrp%3}1=-&qk zqAtb1p<Vype#@bMYnCkaPT!$_UhNP57CtYBean!+o^4-}#r^jd($%XqWVhLAL@$#X z{RH+uV<cVobcJt6N<MC*p<Xb6_K6gS|5>x-1Fy6}E8IUg4s%8B0~P<<jSlYKD`J3; zT`<3l?j6)13-tFwmO1!F`hMqbic%Q^Sntcigq!`uF(AN@<cW9beRP*@;@ASeh6MZ0 zVjDxoJrZONzSU@>P5C;de%@n~XnDKF@fr$a+^@$^P|>vlw($aSK2lRtLt~8tRb`I0 znfI!G?K|<5ry*gk>y56rZy0NkK6)))6Mg1=K?7yS9p+#1Ij=W*%5Rt-mlc;#MOnE9 zoi`-+6oj@)`gq2Af!B+9%J#K9V=ji2dj2<_qaLSXOCeqQ<t!!6U*w!8vfOi(a#!Mr z;I(g4F=Sl2B4U6(W@gq<Rh2_8&+wXIkfBE|uhE!w^@O<@+vF)Nd`o5Cob-Z7`<F9z z8veIJalFD@;Jf`*c%O1MCB;SG)KJvx!(x`1Cc8NL{Xwd$tD{jPikxF*l&PR<NNnLk zrtfiGu7(3T!9H>&<0zMSb$5mAi;HU=v`v<>NYk}MbD!ewYVB+N-ctzn=l&bTwv)*7 zmY<+Y@SBbtl9PPk$HTR?ln@(T92XjTRj0Mx|Mzl;lW>Su_y^~fh?8(L?oz8h!cCpb zZG-OY=NJ3{>r*`U<(J%#zjFT-a9>u6+23H{=d(utkgqt7@^)C;pkb)fQ|Q=*8*SyT z;otKe+f8fEp)ZacKZDn3TNzs><E(S1|L)$QEc^6q=5?o0r=Mx`3x=rM{GOPlwi$N_ z=T)5Zax*gRvmbw&B5%4y)A;0p7d!Kl&vD^Re-S$0D$!}_t5FCD4A<$WFL`Npar$qU z#I+amK;<Q+v}o!~8mM=Tce=x>_Kx+g*c_mr8LBhr8GnoEmAQk#%sR52<z$1b$A%B2 zt*h3G^AqrZxXIdgm(qRR?rw5FIC<lBlgZz(H>`bdbW8Ms$<Hvc-WFZ-8}a3r$4n6C zTHwJ}W#d>!0u2bdt=T-lK3JbDW`F(Urt%Ob2seiN>7U`YN}aOdIiCC;eeufJC#m3S z9#|l2c?G@t*hH5y^76jkv)rs4H+;oiTuY5FQwRMN_7NUqeiD|b&RyxPXQz|3qC(_> zZJMwjC4F!1m2INXqzisQ4X^w=>&(+Ecdu&~IWEMn7f*YcYI&eWI(6hI#f114%aymM zyhlG6{q>XN7(LyGiMAS&qijR%d2rV|>AUT_sE&EKUSTCM26>aKzNxk0?K|utOcxl# zxIOwM#O!!H+QzbX*&p=QuKe4y;bS>&StQOE5AEGg_ubk8{;1yOVAJfE_Js-lL7rr9 z)CEuFIlkApj~uV^zJK7KocjT=<q6S4TFeeWi+QLv1?XqE!ynFLANNs-5|h?vU?0)j zM4v5B5^VrK7~8JpUZo4C&d`?}TSjajvE=6XShnY)K0=qS3Le_<yvpOAq8bn5%`u|y zPrdLP)$)4VQ-XbGUQVTrOB3m_h}b6g4bPcYGyc{R58*d<?!`8qu7*?j9sYmTxTh#5 zJ;UjHfW4;15ko(G*hYsBRZ;4dYK~<%d=tKdkG!lLik~u#A~o*4xzOgdw6Q~Acs>4B zJP(}0x}|A7C$$5gIp>K<R9aLFNMfwz%H?WWzN~^Ce#o)Tlwx1F;@z?jE9lZi=B0jL zpp5lv-o)p8=7F)=S&!y1{#ICj@%<(Vm)5Hs`}ON}v}vQ2#*A!Oqsp<%??*mTNE_E% zsj||shA(A*HFv@@KI;<uqTN_~g!u*C%(|1M6*tNuo|Jjn5mTtFtfl!J1059I5O<T~ zb$5@lug@tZ@Qsw0l}!`+`{t_{b4~>BPZ|A#2Ew;$#g9Fk)r;Q~?G$>x<+JM)J3u>j zi68K=I;ld`JJ<u}v;BD=QY#K%4r`|$!sGJmTI-<PuscG<SQ6xxl~qk+MyczJgjsoo zF2S~u;Fr|m!b+TMw{Nf>?Nq+^_B?C+Q%+x#m{9JF$tbaDeNIep%=^#>KHGtg=L)>m z_J&vaZTs2{qP!4Gdw5u5Kcf}5R4(q}Lebx%(J$7l*Q`Il#pCTM%!`y5y*-~zIVs}D z9;t+(xmV~R65^ZQXe+<5{$QW0O8MT~a{<o>kdFLR)nfRMA9L(YU>x*DTltN#m-2km zC;T`cfb{c`mcx(z7o_a8bYJn8_^dz4Cq!D<UvIA7NcFR`9r}YaEJ_)BduHF0!#bpT zHbdUV)>Z37{P6uF{@#519UWK1{>(9sZB1I^6MmNc39MJ-_|)!S8vO+O3&$MulU3Gc z_W{N*B(yneyl-oN_MKaJ{CZ6dv-~^8uPbLSh&0jfV@EfA{2Dc!_rOyfx`R0T@LonA z<*%O?-aa_Wm-z$s@K(ex7UhM0-?9C=PkYdk&d2n((E4>&(f4D`fOQY%CURMMyJyU` zVeJBAId&StHjw76tnwSqZs3e0683`L{a3k9JYdg#(ZVw4J`&CkV-2LF<L#N}Z<*NN zte-!B>aDE1Z?CehVy%vZx$tM3tTax8E@2;N^QTrPcI?Ob8uK!DM0_sfE6ks<hCyt_ z*KrJMFT@*)3M?WI&?W3suUlhv*{hQD1-L(1T_NuG!*?Np|Cx_Y@Hu|XSZ(Y(=V1K; z{9$ba?_qvY-O1V8JMi#g+<3O<^G=@xT;K&~eX!?`j58+^W_-uFp|lGZ#q}H7@J7Sk zH^!ff^N7G+pIT%8%UxM5@35Z1UiD=KAHXV4*hkFaF&6vmTKCl5(PykljN7?>2M?iw zPS4{(k-PF*-oY<D(4!YkA2Ck!B_|IZ5wT{cWl;LX%i<XX;QxB_=RThkmD6XtEx=wx zz1&?cYzLElwF7zEp6(yItFPEM=nKqo#)J>>S!d9;L+|xdTtLen9B2LvpL4k;#ScB< z$NP_7j~7)5eXuoYEk*dK_rSz9yT_C4B{r~^#^o}-VQI=Y?01|$aa!a7=UEm$|DsQQ zfLK1qmho2@)nwA?$1%T6jwO2HZ({6&;`s|OQOxI4S8*Hw=Qp!b(<qJi)V|^WJ78Ra z9Yx4u*Nmk&To*J}6}YT`*-t;2d2Z5~5l{FL_gu+y5A2tDN;rpf_?vH?@f5~hVDk5@ z^D@ZF+ctdW<gu3S2gJRs<>gNJR%<PtJYl1A=j_h&y08)K<2=$cyn=novkdG8B{;3m zX6`q(hYaSU*)~0t&l4pdJS1Yb@w{p07nStjkcKq`=CX*F+U*>SAj&wGa>^&2@x)Vj zhd^WfzJ^b0O{E^q82Pw({uT`E`MT2WnZ02{E%t*yRPN>?W>0vU^4@Vyh4;mLj918c z*s*papo?<}cQM{5lcgZScx}?usg{mS!KkH9U%@|^_33?{FI{1ss+8kXyFY&5M-e~f zM$){FF;_+z3sNJ)Er~{Beux$fEl{R4|7WKcpEsGtK57f+H0DJ$hI;U;JtF>+lG@sV zQI_;bQ^7XIJ>Bs?C32b1v;am;P4GUqAJ#zOHv}4SmV|xXX6~O9&e_~YCCpbT>s$`! k<4FtN!5<V};cOZ-C_kkBJe0@%L`?wxDD;N}njwMz0Wv;ivH$=8 literal 0 HcmV?d00001 diff --git a/examples/leptos-axum/src/lib.rs b/examples/leptos-axum/src/lib.rs new file mode 100644 index 0000000..c22d897 --- /dev/null +++ b/examples/leptos-axum/src/lib.rs @@ -0,0 +1,10 @@ +pub mod shell; +pub mod routes; + +#[cfg(feature = "hydrate")] +#[wasm_bindgen::prelude::wasm_bindgen] +pub fn hydrate() { + use crate::shell::*; + console_error_panic_hook::set_once(); + leptos::mount::hydrate_body(App); +} diff --git a/examples/leptos-axum/src/main.rs b/examples/leptos-axum/src/main.rs new file mode 100644 index 0000000..355d992 --- /dev/null +++ b/examples/leptos-axum/src/main.rs @@ -0,0 +1,38 @@ + +#[cfg(feature = "ssr")] +#[tokio::main] +async fn main() { + use axum::Router; + use leptos::prelude::*; + use leptos_axum::{generate_route_list, LeptosRoutes}; + use leptos_axum_sabry::shell::*; + + let conf = get_configuration(None).unwrap(); + let addr = conf.leptos_options.site_addr; + let leptos_options = conf.leptos_options; + // Generate the list of routes in your Leptos App + let routes = generate_route_list(App); + + let app = Router::new() + .leptos_routes(&leptos_options, routes, { + let leptos_options = leptos_options.clone(); + move || shell(leptos_options.clone()) + }) + .fallback(leptos_axum::file_and_error_handler(shell)) + .with_state(leptos_options); + + // run our app with hyper + // `axum::Server` is a re-export of `hyper::Server` + log!("listening on http://{}", &addr); + let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); + axum::serve(listener, app.into_make_service()) + .await + .unwrap(); +} + +#[cfg(not(feature = "ssr"))] +pub fn main() { + // no client-side main function + // unless we want this to work with e.g., Trunk for pure client-side testing + // see lib.rs for hydration function instead +} diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs new file mode 100644 index 0000000..0e06caf --- /dev/null +++ b/examples/leptos-axum/src/routes/home.rs @@ -0,0 +1,33 @@ +use leptos::prelude::*; +use sabry::styly; + +styly!(s "src/routes/home.scss"); + +styly!(s2 { + @use "theme"; + .card { + @include theme.surface(secondary); + } + .pocwarn { + @include theme.surface(secondary); + text-transform: uppercase; + } +}); + +/// Renders the home page of your application. +#[component] +pub fn Route() -> impl IntoView { + // Creates a reactive value to update the button + let count = RwSignal::new(0); + let on_click = move |_| *count.write() += 1; + + view! { + <section class=s::table> + <h1>"Welcome to Leptos!"</h1> + <button class=s::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <span class=s2::card>"DISCLAIMER:"</span> + <p class=s2::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> + <p class=s2::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> + </section> + } +} diff --git a/examples/leptos-axum/src/routes/home.scss b/examples/leptos-axum/src/routes/home.scss new file mode 100644 index 0000000..67e7ec1 --- /dev/null +++ b/examples/leptos-axum/src/routes/home.scss @@ -0,0 +1,12 @@ +@use "tokens"; +@use "utils"; +@use "theme"; + +.btn { + @include tokens.clickable(accent); +} + +.table { + @include utils.flex(column, center, center); + @include theme.surface(primary); +} diff --git a/examples/leptos-axum/src/routes/mod.rs b/examples/leptos-axum/src/routes/mod.rs new file mode 100644 index 0000000..9b86bcf --- /dev/null +++ b/examples/leptos-axum/src/routes/mod.rs @@ -0,0 +1 @@ +pub mod home; diff --git a/examples/leptos-axum/src/shell.rs b/examples/leptos-axum/src/shell.rs new file mode 100644 index 0000000..125c90d --- /dev/null +++ b/examples/leptos-axum/src/shell.rs @@ -0,0 +1,43 @@ +use leptos::prelude::*; +use leptos_meta::{provide_meta_context, MetaTags, Stylesheet, Title}; +use leptos_router::{ + components::{Route, Router, Routes}, + StaticSegment, +}; + +use crate::routes; + +pub fn shell(options: LeptosOptions) -> impl IntoView { + view! { + <!DOCTYPE html> + <html lang="en"> + <head> + <meta charset="utf-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1"/> + <AutoReload options=options.clone() /> + <HydrationScripts options/> + <MetaTags/> + </head> + <body> + <App/> + </body> + </html> + } +} + +#[component] +pub fn App() -> impl IntoView { + provide_meta_context(); + + view! { + <Stylesheet id="leptos" href="/pkg/leptos-axum.css"/> + <Title text="Welcome to Leptos"/> + <Router> + <main> + <Routes fallback=|| "Page not found.".into_view()> + <Route path=StaticSegment("") view=routes::home::Route/> + </Routes> + </main> + </Router> + } +} diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock new file mode 100644 index 0000000..7e7c03c --- /dev/null +++ b/examples/use-styles/Cargo.lock @@ -0,0 +1,1491 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "anstream" +version = "0.6.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" + +[[package]] +name = "cc" +version = "1.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "codemap" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "const_format" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.2", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.85", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + +[[package]] +name = "define-styles" +version = "0.0.0" +dependencies = [ + "sabry", +] + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "grass" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" +dependencies = [ + "clap", + "getrandom", + "grass_compiler", +] + +[[package]] +name = "grass_compiler" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" +dependencies = [ + "codemap", + "indexmap", + "lasso", + "once_cell", + "phf 0.11.2", + "rand", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lasso" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.161" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" + +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" +dependencies = [ + "ahash 0.8.11", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom", + "itertools", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "paste", + "pathdiff", + "rayon", + "serde", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + +[[package]] +name = "parcel_selectors" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" +dependencies = [ + "bitflags", + "cssparser", + "fxhash", + "log", + "phf 0.10.1", + "phf_codegen", + "precomputed-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" +dependencies = [ + "base64-simd", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "raffia" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" +dependencies = [ + "raffia_macro", + "smallvec", +] + +[[package]] +name = "raffia_macro" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" +dependencies = [ + "heck", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "sabry" +version = "0.0.1" +dependencies = [ + "sabry_build", + "sabry_intrnl", + "sabry_procmacro", +] + +[[package]] +name = "sabry_build" +version = "0.0.0" +dependencies = [ + "proc-macro2", + "sabry_intrnl", + "sabry_procmacro_impl", + "syn 2.0.85", + "thiserror", + "walkdir", +] + +[[package]] +name = "sabry_intrnl" +version = "0.0.0" +dependencies = [ + "base64", + "blake3", + "const_format", + "grass", + "lightningcss", + "proc-macro2", + "raffia", + "regex", + "serde", + "syn 2.0.85", + "thiserror", + "toml", +] + +[[package]] +name = "sabry_procmacro" +version = "0.0.0" +dependencies = [ + "sabry_procmacro_impl", +] + +[[package]] +name = "sabry_procmacro_impl" +version = "0.0.0" +dependencies = [ + "proc-macro2", + "quote", + "raffia", + "regex", + "sabry_intrnl", + "syn 2.0.85", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "serde" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.213" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "serde_json" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "use-styles" +version = "0.0.0" +dependencies = [ + "define-styles", + "sabry", +] + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml new file mode 100644 index 0000000..77c0ca6 --- /dev/null +++ b/examples/use-styles/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "use-styles" +version = "0.0.0" +edition = "2021" +rust-version = "1.82" +publish = false + +[dependencies] +sabry = {path = "../../", features = ["sass"]} + +[build-dependencies] +sabry = {path = "../../", features = ["build", "sass"]} +define-styles = {path = "../define-styles"} + +[package.metadata.sabry] +css.bundle = "target/static/style.css" +css.scopes = "target/static/styles/" +css.bundle_prelude = ["assets/prelude.css"] + +hash.size = 6 +hash.collision = "error" + +[package.metadata.sabry.lightningcss] +targets = {chrome = "120", firefox = "120", ie = "8"} diff --git a/examples/use-styles/assets/prelude.css b/examples/use-styles/assets/prelude.css new file mode 100644 index 0000000..b889e82 --- /dev/null +++ b/examples/use-styles/assets/prelude.css @@ -0,0 +1,4 @@ +html { + box-sizing: border-box; + font-size: 10px; +} diff --git a/examples/use-styles/build.rs b/examples/use-styles/build.rs new file mode 100644 index 0000000..88a9998 --- /dev/null +++ b/examples/use-styles/build.rs @@ -0,0 +1,22 @@ +use define_styles::{theme, tokens, utils as utils_dup}; +use sabry::{sassy, usey}; + +// This module will have the same name as define_styles_example::utils +// and sabry is configured to merge them +sassy!(utils { + @mixin nonclickable(){ + display: none; + } +}); + +fn main(){ + /* Declare modules to use with sabry */ + sabry::buildy( + usey!( + theme!(), + tokens!(), + utils_dup!(), + utils!() + ) + ).expect("Failed to build sabry styles"); +} diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs new file mode 100644 index 0000000..6751b2c --- /dev/null +++ b/examples/use-styles/src/main.rs @@ -0,0 +1,17 @@ +use sabry::styly; + +styly!(pub const bundlemod { + @use "tokens"; + .someth { + @include tokens.clickable; + background-color: black; + } +}); + +styly!(pub const filemod:sass "src/main.sass"); + +fn main(){ + println!("someth class codemod styles: {}", bundlemod::someth); + println!("someth class filemod styles: {}", filemod::someth); + println!("Thats how we used the styles! Good luck!!"); +} diff --git a/examples/use-styles/src/main.sass b/examples/use-styles/src/main.sass new file mode 100644 index 0000000..38596ed --- /dev/null +++ b/examples/use-styles/src/main.sass @@ -0,0 +1,12 @@ +@use "tokens" + +.someth + @include tokens.clickable + background: white + &-dark + background: none + border: 1px solid black + &[value] + &::after + content: "valued" + color: green diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml new file mode 100644 index 0000000..05d7609 --- /dev/null +++ b/sabry_build/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "sabry_build" +description = "Sabry build magic as a separate crate" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true + +[dependencies] +sabry_intrnl = {workspace = true} +sabry_procmacro_impl = {workspace = true} +proc-macro2 = {workspace = true, features = ["span-locations"]} +syn = {workspace = true, features = ["visit", "derive", "parsing", "full"]} +thiserror = {workspace = true} + +walkdir = {version = "^2.5"} + +[features] +sass = [ + "sabry_procmacro_impl/sass", + "sabry_intrnl/sass" +] +scss = [ + "sabry_procmacro_impl/scss", + "sabry_intrnl/scss" +] +net-files = [] diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs new file mode 100644 index 0000000..c3e6439 --- /dev/null +++ b/sabry_build/src/buildmagic.rs @@ -0,0 +1,305 @@ +use std::{ + collections::HashSet, + convert::Infallible, + fs::{self, OpenOptions}, + io::{self, Write}, + path::PathBuf, + str::FromStr, vec, +}; + +use sabry_intrnl::{ + compiler::{CompilerAdapter, SabryCompilerError}, + config::{ + manifest::ManifestError, + BehavHashCollision, BehavSassModCollision, SabryConfig, + }, + scoper::{hash::ScopeHash, ArbitraryScope, ScopeError}, +}; +use sabry_procmacro_impl::impls::styly; +use walkdir::WalkDir; + +use crate::filevisit::{self, FileVisitError}; + +type ModuleName = String; +type ModuleCode = String; +type StyleModule = (ModuleName, ModuleCode); +type BuilderResult = Result<(), SabryBuildError>; + +pub fn buildy(inline_side_modules: impl IntoIterator<Item = StyleModule>) -> BuilderResult { + println!("🧙: This is probably the stderr. Something went wrong:"); + + let config = SabryConfig::require()?; + let mut builder = SabryBuilder::new(config); + + println!("🧙 loading preludes"); + builder.load_preludes()?; + + println!("🧙 loading `buildy` modules"); + for (name, code) in inline_side_modules { + builder.load_side_module(name, code)?; + } + + println!("🧙 loading this crate"); + builder.load_styles_from_this_crate()?; + + println!("🧙 compiling CSS"); + builder.compile_everything()?; + + println!("🧙 writing an output"); + builder.generate_output()?; + + Ok(()) +} + +pub struct SabryBuilder { + config: SabryConfig, + css_compiler: CompilerAdapter, + state: SabryBuildState, +} + +//🧙 +impl SabryBuilder { + pub fn new(config: SabryConfig) -> Self { + let css_compiler = CompilerAdapter::new(config.clone()); + Self { + config, + css_compiler, + state: SabryBuildState::default(), + } + } + + /// Write all the loaded CSS + /// + /// - Bundle file (if configured) + /// - Scope chunks (if out-dir is configured) + pub fn generate_output(&mut self) -> BuilderResult { + // warn on empty loaded_css_modules + if self.state.loaded_css_modules.is_empty() { + println!("🧙 sabry didn't compile any CSS. Perhaps the crate has no styles? Lets write some!\nAlso you should check that you do use `styly!` macro properly - at the top level as an item."); + } + + if let Some(scope_dir) = &self.config.css.scopes { + println!("🧙 writing CSS files for each of loaded scopes into {scope_dir}"); + + fs::create_dir_all(scope_dir)?; + for (scope, code) in &self.state.loaded_css_modules { + let scope_path = format!("{}/{}.css", scope_dir, scope); + fs::write(scope_path, code)?; + } + } + + if let Some(bundle_file) = &self.config.css.bundle { + println!("🧙 writing merged CSS for the entire crate into {bundle_file}"); + + let path = PathBuf::from_str(bundle_file)?; + + if let Some(dir) = path.parent() { + fs::create_dir_all(dir)?; + } + + // remove the file to write new fresh tasty CSS + let _ = fs::remove_file(&path); + // and then reopen it + let mut file = OpenOptions::new() + .create_new(true) + .append(true) + .open(path)?; + + for (_, code) in &self.state.loaded_css_modules { + write!(file, " {}", self.state.css_prelude)?; + write!(file, " {code}")?; + } + } + + Ok(()) + } + + /// Compile all the loaded styles, SASS/SCSS/CSS, without actually writing them. + pub fn compile_everything(&mut self) -> BuilderResult { + // warn on empty known_side_modules and loaded_stylyses + if self.state.known_side_modules.is_empty() { + println!("🧙 sabry didn't load any side modules"); + } + if self.state.loaded_stylyses.is_empty() { + println!("🧙 sabry didn't load any usable styles"); + } + + for styly in &self.state.loaded_stylyses { + let scope = ArbitraryScope::from_source( + styly.syntax.into(), + styly.scope.clone(), + styly.code.code(), + )? + .hashed(&self.config.hash)?; + + match self.config.hash.collision { + BehavHashCollision::Ignore => {} + BehavHashCollision::Error => { + if self.state.known_scope_hashes.contains(&scope.hash) { + return Err(SabryBuildError::HashCollision { + scope: scope.original_scope.name.to_string(), + }); + } + self.state.known_scope_hashes.insert(scope.hash.clone()); + } + } + + let css = self.css_compiler.compile_module( + scope.original_scope.adapter().syntax.into(), + &scope.hashed_code, + )?; + self.state + .loaded_css_modules + .push((scope.original_scope.name.to_string(), css)); + } + + Ok(()) + } + + /// Visit all the source files in the current crate and look for code that may affect building process: + /// + /// - `styly!` macro calls + /// + /// Only files with an **.rs** extension are visited. + /// + /// All the gathered info is loaded into state + pub fn load_styles_from_this_crate(&mut self) -> BuilderResult { + println!("🧙 scanning the crate"); + + let root = WalkDir::new(&self.config.sass.scanroot); + + for entry in root { + let entry = entry?; + let metadata = entry.metadata()?; + + if metadata.is_file() { + let entry_path = entry.path(); + let ext = entry_path.extension().unwrap_or_default(); + if ext == "rs" { + let visitor = filevisit::visit_file(entry_path)?; + self.state.loaded_stylyses.extend(visitor.found_stylys); + } + } else if metadata.is_symlink() { + println!( + "🧙 sabry won't go through symlinks currently ('{}' is a symlink)", + entry.path().to_string_lossy() + ) + } + } + + Ok(()) + } + + /// Load up configured preludes as side modules + pub fn load_preludes(&mut self) -> BuilderResult { + // load sass modules from config + let mut modules: Vec<StyleModule> = vec![]; + if let Some(sass_pre) = &self.config.sass.modules { + for pre in sass_pre { + let pre_path = PathBuf::from_str(pre)?; + let pre_name = pre_path + .file_name() + .ok_or(SabryBuildError::FileName())? + .to_string_lossy() + .to_string(); + let code = fs::read_to_string(pre_path)?; + modules.push((pre_name, code)); + } + } + for (name, code) in modules { + self.load_side_module(name, code)?; + } + + // load css preludes + if let Some(css_pre) = &self.config.css.bundle_prelude { + for pre in css_pre { + let code = fs::read_to_string(pre)?; + self.state.css_prelude.push_str(&code); + } + } + + Ok(()) + } + + /// Load up the SASS module by its `name` and fill the according file by its `code` as-is + /// + /// Module "loading" is simply a file creation. File is created in the configured `intermediate_dir` + /// directory. + /// + /// Module `name` is not suffixed with syntax/extensions/whatever so it already should have necessary file extensions. + /// + /// This function will not overwrite the module file. Never. + /// + pub fn load_side_module(&mut self, name: ModuleName, code: ModuleCode) -> BuilderResult { + println!("🧙 loading side module '{}'", &name); + + let module_file_path = format!("{}/{}", &self.config.sass.intermediate_dir, &name); + let mut open_options = OpenOptions::new(); + let mut open_options = open_options.write(true); + + // prematurelly remove module file if the module is not yet known to be loaded + if !self.state.known_side_modules.contains(&name) { + let _ = fs::remove_file(&module_file_path); + } + + open_options = if self.state.known_side_modules.contains(&name) { + match &self.config.sass.module_name_collision { + BehavSassModCollision::Error => { + return Err(SabryBuildError::ModuleCollision { module: name }) + } + BehavSassModCollision::Merge => { + println!("🧙 sabry found duplicate module name '{name}': merging code, as configured"); + open_options.append(true) + } + } + } else { + open_options.create(true) + }; + + fs::create_dir_all(&self.config.sass.intermediate_dir)?; + let mut module_file = open_options.open(module_file_path)?; + + write!(module_file, "\n{code}\n")?; + + self.state.known_side_modules.insert(name); + + Ok(()) + } +} + +#[derive(Default)] +pub struct SabryBuildState { + known_scope_hashes: HashSet<ScopeHash>, + known_side_modules: HashSet<ModuleName>, + loaded_stylyses: Vec<styly::MacroSyntax>, + loaded_css_modules: Vec<StyleModule>, + css_prelude: String, +} + +#[derive(Debug, thiserror::Error)] +pub enum SabryBuildError { + #[error("Filesystem error")] + Fs(#[from] io::Error), + #[error("Failed to walk through the crate")] + CrateWalk(#[from] walkdir::Error), + #[error("Failed to load side SASS module")] + LoadSass(), + #[error( + "Module with the similar name was already loaded, and sabry is configured to raise an error" + )] + ModuleCollision { module: ModuleName }, + #[error("Sabry cant understand the file")] + FileVisit(#[from] FileVisitError), + #[error("Syntax of style can not be parsed")] + SyntaxParse(#[from] ScopeError), + #[error("Another scope has the same hash, and sabry is configured to raise an error. Try to adjust config, increase hash size, or change the style code")] + HashCollision { scope: ModuleName }, + #[error("Something's wrong with file path")] + Path(#[from] Infallible), + #[error("File name wasnt determined properly")] + FileName(), + #[error("Failed to compile CSS")] + CssCompile(#[from] SabryCompilerError), + #[error("Failed to load config/manifest")] + Manifest(#[from] ManifestError), +} diff --git a/sabry_build/src/filevisit.rs b/sabry_build/src/filevisit.rs new file mode 100644 index 0000000..2844469 --- /dev/null +++ b/sabry_build/src/filevisit.rs @@ -0,0 +1,51 @@ +use std::{fs, io, path::Path}; + +use proc_macro2::TokenStream; +use sabry_procmacro_impl::impls::styly; +use syn::{spanned::Spanned, visit::Visit}; + +#[derive(Debug, thiserror::Error)] +pub enum FileVisitError { + #[error("Could not read file")] + Read(#[from] io::Error), + #[error("styly! macro found, yet invalid")] + Styly(#[from] syn::Error), +} + +/// Visit file, returning either [StylyVisitor] or error +pub fn visit_file(path: &Path) -> Result<StylyVisitor, FileVisitError> { + let content = fs::read_to_string(path)?; + let code_file = syn::parse_file(&content)?; + + let mut styly_visitor = StylyVisitor { + found_stylys: vec![], + }; + styly_visitor.visit_file(&code_file); + + Ok(styly_visitor) +} + +/// Syn Visitor, which will look at every `styly!` macro, +/// parse its input tokenstream and avaluate it, capturing [styly::MacroSyntax] result +/// +/// ## Panics +/// +/// If either macro body is not a [TokenStream], or [styly::parse_macro_syntax] is not [Ok] +#[derive(Debug)] +pub struct StylyVisitor { + pub found_stylys: Vec<styly::MacroSyntax>, +} + +impl<'ast> Visit<'ast> for StylyVisitor { + fn visit_item_macro(&mut self, node: &'ast syn::ItemMacro) { + if node.mac.path.get_ident().is_some_and(|i| i == "styly") { + let body = node.mac.parse_body::<TokenStream>().unwrap_or_else(|_| { + panic!("could not parse `styly!` macro at {:?}", node.mac.span()) + }); + let macro_data = styly::parse_macro_syntax(body).unwrap_or_else(|_| { + panic!("could not parse `styly!` macro at {:?}", node.mac.span()) + }); + self.found_stylys.push(macro_data); + } + } +} diff --git a/sabry_build/src/lib.rs b/sabry_build/src/lib.rs new file mode 100644 index 0000000..180dbd0 --- /dev/null +++ b/sabry_build/src/lib.rs @@ -0,0 +1,3 @@ +pub mod buildmagic; +pub mod filevisit; +pub use buildmagic::*; diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml new file mode 100644 index 0000000..5bf56e5 --- /dev/null +++ b/sabry_intrnl/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "sabry_intrnl" +description = "Sabry internal, yet still public library" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true + +[dependencies] +raffia = {workspace = true} +grass = {workspace = true} +lightningcss = {workspace = true} +blake3 = {workspace = true} +base64 = {workspace = true} + +syn = {workspace = true} +proc-macro2 = {workspace = true} +regex = {workspace = true} +const_format = {workspace = true} + +serde = {workspace = true, features = ["derive"]} +toml = {workspace = true} +thiserror = {workspace = true} + +[features] +sass = [] +scss = [] diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs new file mode 100644 index 0000000..0c2df2b --- /dev/null +++ b/sabry_intrnl/src/compiler/mod.rs @@ -0,0 +1,120 @@ +use lightningcss::{printer::PrinterOptions, stylesheet::MinifyOptions, targets::Targets}; + +use crate::config::SabryConfig; + +/// Convenience wrapper on Grass and Lightningcss +pub struct CompilerAdapter { + config: SabryConfig, +} + +impl CompilerAdapter { + pub fn new(config: SabryConfig) -> Self { + Self { config } + } + + pub fn compile_module( + &self, + syntax: CompilerSyntax, + code: &str, + ) -> Result<String, SabryCompilerError> { + let options = grass::Options::from(&self.config).input_syntax(syntax.into()); + + let mut css = grass::from_string(code, &options)?; + + if self.config.css.minify { + //its lightningcss time! + let mut lightsheet = match lightningcss::stylesheet::StyleSheet::parse( + &css, + lightningcss::stylesheet::ParserOptions::default(), + ) { + Ok(s) => s, + Err(_) => return Err(SabryCompilerError::Lightningcss()), + }; + + let targets = Targets { + browsers: Some(self.config.lightningcss.targets.clone().into()), + ..Default::default() + }; + + let printer_options = PrinterOptions { + minify: self.config.css.minify, + targets, + ..Default::default() + }; + + let minify_options = MinifyOptions { + targets, + ..Default::default() + }; + + if lightsheet.minify(minify_options).is_err() { + return Err(SabryCompilerError::Lightningcss()); + } + + css = match lightsheet.to_css(printer_options) { + Ok(c) => { + drop(lightsheet); + c.code + } + Err(_) => return Err(SabryCompilerError::Lightningcss()), + }; + } + + Ok(css) + } +} + +impl From<&SabryConfig> for grass::Options<'_> { + fn from(config: &SabryConfig) -> Self { + let mut options = grass::Options::default(); + options = options.style(if config.css.minify { + grass::OutputStyle::Compressed + } else { + grass::OutputStyle::Expanded + }); + options = options.load_path(&config.sass.intermediate_dir); + + options + } +} + +#[derive(Debug, thiserror::Error)] +pub enum SabryCompilerError { + #[error("Could not compile into CSS with grass")] + GrassCompile(#[from] Box<grass::Error>), + #[error("Could not parse compiled CSS with lightningcss")] + Lightningcss(), +} + +/// Unification wrapper over all the Syntax enums +#[derive(Clone, Copy)] +pub enum CompilerSyntax { + #[cfg(feature = "sass")] + Sass, + #[cfg(feature = "scss")] + Scss, +} + +impl From<raffia::Syntax> for CompilerSyntax { + fn from(value: raffia::Syntax) -> Self { + match value { + #[cfg(feature = "sass")] + raffia::Syntax::Sass => Self::Sass, + #[cfg(feature = "scss")] + raffia::Syntax::Scss => Self::Scss, + // TODO: fallbacky error-prone + _ => Self::Scss, + } + } +} + +impl From<CompilerSyntax> for grass::InputSyntax { + fn from(value: CompilerSyntax) -> Self { + match value { + #[cfg(feature = "scss")] + CompilerSyntax::Scss => Self::Scss, + #[cfg(feature = "sass")] + CompilerSyntax::Sass => Self::Sass, + } + } +} diff --git a/sabry_intrnl/src/config/manifest.rs b/sabry_intrnl/src/config/manifest.rs new file mode 100644 index 0000000..ac0700f --- /dev/null +++ b/sabry_intrnl/src/config/manifest.rs @@ -0,0 +1,44 @@ +use std::{env, fs, io}; + +use serde::Deserialize; + +use super::SabryConfig; + +pub const MANIFEST: &str = "Cargo.toml"; +pub const MANIFEST_DIR_ENV: &str = "CARGO_MANIFEST_DIR"; + +pub fn read_manifest() -> Result<ValuableManifest, ManifestError> { + let manpath = format!("{}/{MANIFEST}", env::var(MANIFEST_DIR_ENV)?); + + Ok(toml::de::from_str(&fs::read_to_string(manpath)?)?) +} + +#[derive(Debug, thiserror::Error)] +pub enum ManifestError { + #[error("Could not read manifest path from env")] + ManifestDirEnv(#[from] env::VarError), + #[error("Could not read manifest file")] + ManifestRead(#[from] io::Error), + #[error("Could not deserialize manifest")] + ManifestDe(#[from] toml::de::Error), +} + +/// Manifest structure that makes sense for sabry +#[derive(Deserialize, Default)] +pub struct ValuableManifest { + pub package: Option<ValuableManifestPkg>, +} + +/// Manifest \[package.metadata\] structure that makes sense for sabry +#[derive(Deserialize, Default)] +pub struct ValuableManifestPkg { + pub metadata: Option<ValuableManifestPkgMeta>, +} + +/// Manifest \[package.metadata.sabry\] structure that makes sense for sabry +/// +/// Which is basically [SabryConfig] +#[derive(Deserialize, Default)] +pub struct ValuableManifestPkgMeta { + pub sabry: Option<SabryConfig>, +} diff --git a/sabry_intrnl/src/config/mod.rs b/sabry_intrnl/src/config/mod.rs new file mode 100644 index 0000000..0903929 --- /dev/null +++ b/sabry_intrnl/src/config/mod.rs @@ -0,0 +1,253 @@ +pub mod manifest; +use manifest::{ManifestError, ValuableManifest}; +use serde::Deserialize; + +/// Sabry configuration, as it is from package.metadata.sabry +#[derive(Default, Deserialize, Clone)] +pub struct SabryConfig { + #[serde(default = "SabryCssConfig::default")] + pub css: SabryCssConfig, + #[serde(default = "SabrySassConfig::default")] + pub sass: SabrySassConfig, + #[serde(default = "SabryHashConfig::default")] + pub hash: SabryHashConfig, + #[serde(default = "SabryGrassConfig::default")] + pub grass: SabryGrassConfig, + #[serde(default = "SabryLightCssConfig::default")] + pub lightningcss: SabryLightCssConfig, +} + +impl SabryConfig { + /// Require sabry configuration for the current project from every place in the code + pub fn require() -> Result<Self, ManifestError> { + let manifest = manifest::read_manifest()?; + Ok(Self::from(&manifest)) + } +} + +impl From<&ValuableManifest> for SabryConfig { + fn from(value: &ValuableManifest) -> Self { + value + .package + .as_ref() + .and_then(|p| p.metadata.as_ref()) + .and_then(|m| m.sabry.as_ref()) + .map_or(Self::default(), |sbr| sbr.clone()) + } +} + +/// Sabry `css` configuration table +#[derive(Deserialize, Clone)] +pub struct SabryCssConfig { + pub bundle: Option<String>, + pub scopes: Option<String>, + pub bundle_prelude: Option<Vec<String>>, + #[serde(default = "SabryCssConfig::default_minify")] + pub minify: bool, +} + +impl SabryCssConfig { + fn default_minify() -> bool { + true + } +} + +impl Default for SabryCssConfig { + fn default() -> Self { + Self { + bundle: None, + scopes: None, + bundle_prelude: None, + minify: Self::default_minify(), + } + } +} + +/// Sabry `sass` configuration table +/// +/// (SASS/SCSS related config) +#[derive(Deserialize, Clone)] +pub struct SabrySassConfig { + #[serde(default = "SabrySassConfig::default_scanroot")] + pub scanroot: String, + pub modules: Option<Vec<String>>, + #[serde(default = "SabrySassConfig::default_intermediate_dir")] + pub intermediate_dir: String, + #[serde(default = "SabrySassConfig::default_module_name_collision")] + pub module_name_collision: BehavSassModCollision, +} + +impl SabrySassConfig { + fn default_scanroot() -> String { + "src".into() + } + fn default_intermediate_dir() -> String { + "target/.sabry/sass".into() + } + fn default_module_name_collision() -> BehavSassModCollision { + BehavSassModCollision::default() + } +} + +impl Default for SabrySassConfig { + fn default() -> Self { + Self { + scanroot: Self::default_scanroot(), + modules: None, + intermediate_dir: Self::default_intermediate_dir(), + module_name_collision: Self::default_module_name_collision(), + } + } +} + +/// Sabry `hash` configuration table +#[derive(Deserialize, Clone)] +pub struct SabryHashConfig { + #[serde(default = "SabryHashConfig::default_size")] + pub size: usize, + #[serde(default = "SabryHashConfig::default_collision")] + pub collision: BehavHashCollision, + #[serde(default = "SabryHashConfig::default_use_scope_name")] + pub use_scope_name: bool, + #[serde(default = "SabryHashConfig::default_use_item_names")] + pub use_item_names: bool, + #[serde(default = "SabryHashConfig::default_use_code_size")] + pub use_code_size: bool, + #[serde(default = "SabryHashConfig::default_use_code_text")] + pub use_code_text: bool, +} + +impl SabryHashConfig { + fn default_size() -> usize { + 6 + } + fn default_collision() -> BehavHashCollision { + BehavHashCollision::default() + } + fn default_use_scope_name() -> bool { + true + } + fn default_use_item_names() -> bool { + false + } + fn default_use_code_size() -> bool { + true + } + fn default_use_code_text() -> bool { + false + } +} + +impl Default for SabryHashConfig { + fn default() -> Self { + Self { + size: Self::default_size(), + collision: Self::default_collision(), + use_scope_name: Self::default_use_scope_name(), + use_code_size: Self::default_use_code_size(), + use_code_text: Self::default_use_code_text(), + use_item_names: Self::default_use_item_names(), + } + } +} + +/// [grass] specific configuration for sabry +#[derive(Default, Deserialize, Clone)] +pub struct SabryGrassConfig {} + +/// [lightningcss] specific configuration for sabry +#[derive(Default, Deserialize, Clone)] +pub struct SabryLightCssConfig { + pub targets: SabryLightTargets, +} + +/// \[package.metadata.sabry.lightningcss.targets\] configuration. +/// +/// This is a convenience layer under [lightningcss::targets::Browsers] structure accepted +/// by lightningcss. +/// +/// This structure is a part of [SabryConfig], which faces developer with more convenient +/// `safari = "13.2"` syntax. +#[derive(Default, Deserialize, Clone)] +pub struct SabryLightTargets { + pub android: Option<String>, + pub chrome: Option<String>, + pub edge: Option<String>, + pub firefox: Option<String>, + pub ie: Option<String>, + pub ios_saf: Option<String>, + pub opera: Option<String>, + pub safari: Option<String>, + pub samsung: Option<String>, +} + +impl SabryLightTargets { + pub fn parse_ver(ver: &str) -> u32 { + let mut vercode: u32 = 0; + let vers = ver.split('.'); + for (i, dig) in vers.into_iter().enumerate() { + let dignum = dig + .parse::<u32>() + .unwrap_or_else(|_| panic!("Invalid browser specifier: '{dig}'")); + + let shift = 16 - 8 * i; + vercode |= dignum << shift; + } + vercode + } +} + +impl From<SabryLightTargets> for lightningcss::targets::Browsers { + fn from(value: SabryLightTargets) -> Self { + Self { + android: value.android.map(|s| SabryLightTargets::parse_ver(&s)), + chrome: value.chrome.map(|s| SabryLightTargets::parse_ver(&s)), + edge: value.edge.map(|s| SabryLightTargets::parse_ver(&s)), + firefox: value.firefox.map(|s| SabryLightTargets::parse_ver(&s)), + ie: value.ie.map(|s| SabryLightTargets::parse_ver(&s)), + ios_saf: value.ios_saf.map(|s| SabryLightTargets::parse_ver(&s)), + opera: value.opera.map(|s| SabryLightTargets::parse_ver(&s)), + safari: value.safari.map(|s| SabryLightTargets::parse_ver(&s)), + samsung: value.samsung.map(|s| SabryLightTargets::parse_ver(&s)), + } + } +} + +/// \[package.metadata.sabry.sass\].module_name_collision option +#[derive(Deserialize, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum BehavSassModCollision { + Merge, + Error, +} + +impl Default for BehavSassModCollision { + fn default() -> Self { + Self::Merge + } +} + +/// \[package.metadata.sabry.hash\].collision option +#[derive(Deserialize, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum BehavHashCollision { + Error, + Ignore, +} + +impl Default for BehavHashCollision { + fn default() -> Self { + Self::Ignore + } +} + +#[cfg(test)] +mod test { + use super::{manifest, SabryConfig}; + + #[test] + fn empty_manifest_still_worth_a_read() { + let manifest = manifest::read_manifest().unwrap(); + let _conf = SabryConfig::from(&manifest); + } +} diff --git a/sabry_intrnl/src/lib.rs b/sabry_intrnl/src/lib.rs new file mode 100644 index 0000000..ec12902 --- /dev/null +++ b/sabry_intrnl/src/lib.rs @@ -0,0 +1,4 @@ +pub mod compiler; +pub mod config; +pub mod scoper; +pub mod syntax; diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs new file mode 100644 index 0000000..9f8a9e4 --- /dev/null +++ b/sabry_intrnl/src/scoper/hash.rs @@ -0,0 +1,97 @@ +use base64::Engine; + +use crate::config::SabryHashConfig; + +use super::ArbitraryScope; + +/// Convenience wrapper for String-being-a-hash +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ScopeHash(String); + +impl ScopeHash { + pub fn new(scope: &ArbitraryScope, config: &SabryHashConfig) -> Self { + let mut hasher = blake3::Hasher::new(); + + if config.use_scope_name { + hasher.update(scope.name.to_string().as_bytes()); + } + if config.use_code_text { + hasher.update(scope.adapter().source().as_bytes()); + } + if config.use_code_size { + hasher.update(&scope.adapter().source().len().to_ne_bytes()); + } + if config.use_item_names { + let classes = scope.adapter().class_selectors(); + let ids = scope.adapter().id_selectors(); + //# types/tags dont participate + //# child-parent dont participate + + let merged_items = classes + .iter() + .map(|s| &s.name) + .chain(ids.iter().map(|i| &i.name)) + .map(|ident| ident.as_literal()) + .filter_map(|mbl| mbl.map(|l| l.raw)) + .collect::<String>(); + + hasher.update(merged_items.as_bytes()); + } + + let size = if config.size >= blake3::OUT_LEN { + blake3::OUT_LEN + } else { + config.size + }; + + let hash = hasher.finalize(); + let hash = hash.as_bytes(); + + //? This isn't right. "size" is size of hash in symbols. + // naaah, its fine :D (Dan) + let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(&hash[..size]); + + Self(hash) + } + + pub fn as_str(&self) -> &str { + &self.0 + } + + #[cfg(test)] + pub fn test_init(v: String) -> Self { + Self(v) + } +} + +#[cfg(test)] +mod test { + use syn::Ident; + + use crate::{config::SabryHashConfig, scoper::ArbitraryScope}; + + use super::ScopeHash; + + #[test] + fn hash_matches() { + let source = ".cls1{color:red; &-dark{color: black} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; + + let scope1 = ArbitraryScope::from_source( + raffia::Syntax::Scss, + syn::parse_str::<Ident>("lasifudm").unwrap(), + source, + ) + .unwrap(); + let hash1 = ScopeHash::new(&scope1, &SabryHashConfig::default()); + + let scope2 = ArbitraryScope::from_source( + raffia::Syntax::Scss, + syn::parse_str::<Ident>("lasifudm").unwrap(), + source, + ) + .unwrap(); + let hash2 = ScopeHash::new(&scope2, &SabryHashConfig::default()); + + assert_eq!(hash1, hash2); + } +} diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs new file mode 100644 index 0000000..824aed7 --- /dev/null +++ b/sabry_intrnl/src/scoper/mod.rs @@ -0,0 +1,423 @@ +use hash::ScopeHash; +use raffia::Spanned; +use regex::Regex; + +use crate::{config::SabryHashConfig, syntax::StylesheetAdapter}; + +pub mod hash; + +#[derive(Debug, thiserror::Error)] +pub enum ScopeError { + #[error("Raffia reports parse error")] + Raffia(raffia::error::ErrorKind), +} + +impl From<raffia::error::Error> for ScopeError { + fn from(value: raffia::error::Error) -> Self { + Self::Raffia(value.kind) + } +} + +/// Struct which represents arbitrary style scope with known style syntax and name identifier +pub struct ArbitraryScope<'s> { + /// Ident name for the current scope + pub name: syn::Ident, + adapter: StylesheetAdapter<'s>, +} + +impl<'s> ArbitraryScope<'s> { + /// Parse given source code with given syntax and assign given name + pub fn from_source( + syntax: raffia::Syntax, + name: syn::Ident, + source: &'s str, + ) -> Result<Self, ScopeError> { + Ok(Self { + adapter: StylesheetAdapter::new(source, syntax)?, + name, + }) + } + + /// Consume arbitrary scope and create a [HashedScope] in its basis + /// + /// This function calls [HashedScope::new] under the hood + pub fn hashed(self, config: &SabryHashConfig) -> Result<HashedScope<'s>, ScopeError> { + let hash = ScopeHash::new(&self, config); + HashedScope::new(hash, self) + } + + /// Borrow the underlying [StylesheetAdapter] + pub fn adapter(&self) -> &StylesheetAdapter<'s> { + &self.adapter + } +} + +/// Hashed scope which holds hashed style code, +/// vector of hashed selectors and the calculated hash itself. +/// +/// Construction with [HashedScope::new] consumes [ArbitraryScope] and does all the job +pub struct HashedScope<'s> { + /// Original arbitrary scope + pub original_scope: ArbitraryScope<'s>, + /// Hashed style code + pub hashed_code: String, + /// Collection of hashed selectors + pub hashed_selectors: Vec<HashedSelector>, + + /// Given hash to the scope + pub hash: ScopeHash, +} + +impl<'s> HashedScope<'s> { + /// Consume [ArbitraryScope], + /// calculate the hash, + /// hash all the supported selectors + /// and construct hashed source code + /// + /// Heavy operation. + pub fn new(hash: ScopeHash, scope: ArbitraryScope<'s>) -> Result<Self, ScopeError> { + let origin_code = scope.adapter().source(); + let mut hashed_code = String::with_capacity(scope.adapter().source().len()); + + // get classes + let classes = scope.adapter().class_selectors(); + let classes = classes.iter().map(|c| HashedSelector::from_class(&hash, c)); + + // get ids + let ids = scope.adapter().id_selectors(); + let ids = ids.iter().map(|c| HashedSelector::from_id(&hash, c)); + + // get tags + let tags = scope.adapter().type_selectors(); + let tags = tags + .iter() + .filter_map(|t| t.as_tag_name()) + .map(|c| HashedSelector::from_tag(&hash, c)); + + let mut hashed_selectors = classes.chain(ids).chain(tags).collect::<Vec<_>>(); + + // sorting by span start is important because of how hashed code construction works + hashed_selectors.sort_by(|a, b| { + let astart = a.sel.as_arbitrary().span.start; + let bstart = b.sel.as_arbitrary().span.start; + + astart.cmp(&bstart) + }); + + let mut last_term_span: usize = 0; + for sel in &hashed_selectors { + let span = sel.sel.as_arbitrary().span.clone(); + hashed_code.push_str(&origin_code[last_term_span..span.start]); + hashed_code.push_str(&sel.css_ident); + last_term_span = span.end; + } + hashed_code.push_str(&origin_code[last_term_span..]); + + Ok(Self { + original_scope: scope, + hashed_code, + hashed_selectors, + hash, + }) + } +} + +/// Struct which represents hashed selector inside of [HashedScope]. +/// +/// Does not hold information about hash itself, as meant to be inside of scope. +pub struct HashedSelector { + /// Basic unrelated to hash info about this selector + pub sel: ScopedSelector, + /// CSS-ish identifier for this selector, which matches what's in the hashed style code + pub css_ident: String, + /// HTML-ish identifier for this selector, which will match [Self::css_ident] in browser + pub html_ident: Option<String>, +} + +impl HashedSelector { + /// Construct the [HashedSelector], with given hash and parsed class selector + pub fn from_class(hash: &ScopeHash, sel: &raffia::ast::ClassSelector) -> Self { + let sel = ScopedSelector::from_class(sel); + let css_ident = Self::make_hashed_css(&sel, hash); + let html_ident = Self::make_hashed_html(&sel, hash); + + Self { + sel, + css_ident, + html_ident, + } + } + + /// Construct the [HashedSelector], with given hash and parsed id selector + pub fn from_id(hash: &ScopeHash, sel: &raffia::ast::IdSelector) -> Self { + let sel = ScopedSelector::from_id(sel); + let css_ident = Self::make_hashed_css(&sel, hash); + let html_ident = Self::make_hashed_html(&sel, hash); + + Self { + sel, + css_ident, + html_ident, + } + } + + /// Construct the [HashedSelector], with given hash and parsed tagname selector + pub fn from_tag(hash: &ScopeHash, sel: &raffia::ast::TagNameSelector) -> Self { + let sel = ScopedSelector::from_tag(sel); + let css_ident = Self::make_hashed_css(&sel, hash); + let html_ident = Self::make_hashed_html(&sel, hash); + + Self { + sel, + css_ident, + html_ident, + } + } + + /// Transform this selector into hashed version for CSS-ish language + /// + /// Cooperates with the [HashedSelector::make_hashed_html], so + /// whats this function returns will be usable in HTML with to_hashed_html_def() + pub fn make_hashed_css(value: &ScopedSelector, hash: &ScopeHash) -> String { + match value { + // Class scoping is done with class composition + ScopedSelector::Class(a) => { + format!("{}.{}", hash.as_str(), a.ident) + } + // As we dont want to use two HTML props for a single ID, + // ID scoping is done with id modification + ScopedSelector::Id(a) => { + format!("{}-{}", hash.as_str(), a.ident) + } + ScopedSelector::Tag(a) => { + format!(".{} {}", hash.as_str(), a.ident) + } + } + } + + /// Transform this selector into hashed version valid for HTML-ish insertion + /// + /// Cooperates with the [HashedSelector::make_hashed_css], so + /// whats this function returns will be usable in CSS with to_hashed_code() + /// + /// Not every hashed selector is presentable for HTML-ish use: like `div`, in that case + /// returns [None] + pub fn make_hashed_html(value: &ScopedSelector, hash: &ScopeHash) -> Option<String> { + match value { + // Class scoping is done with class composition + ScopedSelector::Class(a) => Some(format!("{} {}", hash.as_str(), a.ident)), + // As we dont want to use two HTML props for a single ID, + // ID scoping is done with id modification + ScopedSelector::Id(a) => Some(format!("{}-{}", hash.as_str(), a.ident)), + ScopedSelector::Tag(_) => None, + } + } +} + +/// Just any unary CSS-ish selector +pub struct ArbitrarySelector { + /// CSS-ish identifier + pub ident: String, + /// Span in original CSS code where it comes from + pub span: raffia::Span, +} + +/// Any unary CSS-ish selector, that's able to be scoped, and then hashed +pub enum ScopedSelector { + Class(ArbitrarySelector), + Id(ArbitrarySelector), + Tag(ArbitrarySelector), +} + +impl ScopedSelector { + /// Borrow the underlying [ArbitrarySelector] + pub fn as_arbitrary(&self) -> &ArbitrarySelector { + match self { + Self::Class(a) => a, + Self::Id(a) => a, + Self::Tag(a) => a, + } + } + + /// Generate rusty member ident based on selector type and CSS ident + pub fn gen_rusty_ident(&self) -> syn::Ident { + let basic = apply_basic_rusty_member_gen_rules(&self.as_arbitrary().ident); + + let ready = match self { + Self::Class(_) => basic, + Self::Id(_) => { + format!("the{basic}") + } + Self::Tag(_) => { + format!("any{basic}") + } + }; + + syn::parse_str::<syn::Ident>(&ready).expect("BUG: formed ident is not Rust Ident") + } + + /// Construct this from class selector + pub fn from_class(s: &raffia::ast::ClassSelector) -> Self { + let lit = s + .name + .as_literal() + .expect("BUG: class selector is not a literal"); + Self::Class(ArbitrarySelector { + ident: lit.raw.to_string(), + span: lit.span().clone(), + }) + } + + /// Construct this from id selector + pub fn from_id(s: &raffia::ast::IdSelector) -> Self { + let lit = s + .name + .as_literal() + .expect("BUG: id selector is not a literal"); + Self::Id(ArbitrarySelector { + ident: lit.raw.to_string(), + span: lit.span().clone(), + }) + } + + /// Construct this from tagname selector + pub fn from_tag(s: &raffia::ast::TagNameSelector) -> Self { + let lit = s + .name + .name + .as_literal() + .expect("BUG: tag selector is not a literal"); + Self::Tag(ArbitrarySelector { + ident: lit.raw.to_string(), + span: lit.span().clone(), + }) + } +} + +fn apply_basic_rusty_member_gen_rules(source: &str) -> String { + let omit_regex = Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") + .expect("BUG: can not build omition regex for rusty member generation"); + + // omit forbidden chars + let cleaned = omit_regex.replace_all(source, "").to_string(); + + // other not-so-obvious rules + let mut target = String::with_capacity(cleaned.len()); + let mut next_uppercase: bool = false; + for (i, c) in cleaned.chars().enumerate() { + // first gidit is prepended with 'n' + if i == 0 && c.is_numeric() { + target.push('n'); + target.push(c); + continue; + } + // dash is omitted and next is uppercase if may be + if c == '-' { + next_uppercase = true; + continue; + } + target.push(if next_uppercase { + next_uppercase = false; + c.to_ascii_uppercase() + } else { + c + }); + } + target +} + +#[cfg(test)] +mod test { + use std::collections::HashSet; + + use syn::Ident; + + use crate::{ + config::SabryHashConfig, + scoper::{hash::ScopeHash, HashedScope}, + }; + + use super::ArbitraryScope; + + #[test] + fn scope_hash_codegen() { + let code = + ".cls1{color:red; &-dark{color: black;} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; + let hash = ScopeHash::test_init("F2kf8nMs".into()); + + let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; + let expect_selector_htmls = HashSet::from([ + "F2kf8nMs cls1".to_string(), + "F2kf8nMs-id1".to_string(), + "F2kf8nMs cls3".to_string(), + "F2kf8nMs-id2".to_string(), + "".to_string(), // comes from `div` which has no html hashed code, still want to check presense + ]); + + let scope = ArbitraryScope::from_source( + raffia::Syntax::Scss, + syn::parse_str("scope1").unwrap(), + code, + ) + .unwrap(); + let scope = HashedScope::new(hash, scope).unwrap(); + let scope_selector_htmls = scope + .hashed_selectors + .iter() + .map(|hs| hs.html_ident.clone().unwrap_or_default()) + .collect::<HashSet<_>>(); + + // check that original is untouched + assert_eq!(code, scope.original_scope.adapter().source()); + // check that hashed matches what we expect + assert_eq!(expect_code, scope.hashed_code); + // check that HTML selector hashed code matches what we expect + assert_eq!(expect_selector_htmls, scope_selector_htmls); + } + + #[test] + fn rusty_idents() { + let code = " +.cls-1{ + color:red; + &-dark{ + color: black; + } + #id-1 { + color:green; + } + .-txt-of { + color:blue; + } +} +.-c_ls3#4id{ + color: black; +}"; + let expect_ident_names = HashSet::from([ + "cls1".to_string(), + "theid1".to_string(), + "c_ls3".to_string(), + "then4id".to_string(), + "txtOf".to_string(), + ]); + + let hash_cfg = SabryHashConfig::default(); + let scope = ArbitraryScope::from_source( + raffia::Syntax::Scss, + syn::parse_str::<Ident>("scope2oiej").unwrap(), + code, + ) + .unwrap() + .hashed(&hash_cfg) + .unwrap(); + + let sels = scope + .hashed_selectors + .iter() + .map(|s| s.sel.gen_rusty_ident()) + .map(|i| i.to_string()) + .collect::<HashSet<_>>(); + + assert_eq!(expect_ident_names, sels); + } +} diff --git a/sabry_intrnl/src/syntax/mod.rs b/sabry_intrnl/src/syntax/mod.rs new file mode 100644 index 0000000..a52d7d6 --- /dev/null +++ b/sabry_intrnl/src/syntax/mod.rs @@ -0,0 +1,226 @@ +use raffia::{ + ast::{ + ClassSelector, CompoundSelector, IdSelector, NestingSelector, SimpleSelector, Statement, + Stylesheet, TypeSelector, + }, + ParserBuilder, Syntax, +}; + +/// Convenience wrapper for [Stylesheet] +pub struct StylesheetAdapter<'s> { + pub syntax: Syntax, + source: &'s str, + stylesheet: Stylesheet<'s>, +} + +impl<'s> StylesheetAdapter<'s> { + pub fn new(source: &'s str, syntax: Syntax) -> Result<Self, raffia::error::Error> { + Ok(Self { + stylesheet: ParserBuilder::new(source) + .ignore_comments() + .syntax(syntax) + .build() + .parse()?, + syntax, + source, + }) + } + + pub fn source(&self) -> &str { + self.source + } + + pub fn selectors(&self) -> Vec<CompoundSelector<'s>> { + Self::selectors_of(self.stylesheet.statements.iter().cloned()).collect() + } + + pub fn class_selectors(&self) -> Vec<ClassSelector<'s>> { + self.selectors_by(|c| c.as_class().cloned()) + } + + pub fn id_selectors(&self) -> Vec<IdSelector<'s>> { + self.selectors_by(|c| c.as_id().cloned()) + } + + pub fn type_selectors(&self) -> Vec<TypeSelector<'s>> { + self.selectors_by(|c| c.as_type().cloned()) + } + + pub fn nesting_selectors(&self) -> Vec<NestingSelector<'s>> { + self.selectors_by(|c| c.as_nesting().cloned()) + } + + /// Return collected [Vec] of owned values modulo `T`, filtered by `F`. + /// + /// This is preferred way to apply custom filtering on selectors over + /// `selectors().iter().filter_map()` + /// as it does not allocate intermediate vector + pub fn selectors_by<T, F>(&self, form: F) -> Vec<T> + where + F: FnMut(SimpleSelector<'s>) -> Option<T>, + { + Self::selectors_of(self.stylesheet.statements.iter().cloned()) + .flat_map(|cs| cs.children) + .filter_map(form) + .collect() + } + + fn selectors_of( + c: impl Iterator<Item = Statement<'s>>, + ) -> impl Iterator<Item = CompoundSelector<'s>> { + // Hello. Its Dan. + // Im not proud of this, + // but more effective implementation + // was SO unreadable and SO infected with lifetimes + // I suck at those things + + // For everyone trying to make this MORE OPTIMAL: + // increment the hour-counter and post your name here: + // 4 - Danik + // 5 - Yiffy + // 8 - Danik + c.filter_map(|s| s.as_qualified_rule().cloned()) + .flat_map(|q| { + let thissels = q + .selector + .selectors + .iter() + .flat_map(|sel| &sel.children) + .filter_map(|sc| sc.as_compound_selector()) + .cloned(); + + let blockstmt = q.block.statements.iter().cloned(); + Self::selectors_of(blockstmt) + .chain(thissels) + .collect::<Vec<_>>() + }) + } +} + +#[cfg(test)] +mod test { + use std::collections::HashSet; + + use raffia::Spanned; + + use super::StylesheetAdapter; + + #[test] + fn sels() { + let source_scss = " +.r1{ + .r2.r3 { + color: red; + } + &-rod { + color: red; + &[value] { + color: red; + } + } +} +div#id2 { + & > span.seled { + color: red; + & + ul#id2[attr] { + color: red; + } + & + .uled[attr] { + color: red; + } + } + &::after{ + color: red; + } +} + "; + let source_sass = " +.r1 + .r2.r3 + color: red + &-rod + color: red + &[value] + color: red +div#id2 + & > span.seled + color: red + & + ul#id2[attr] + color: red + & + .uled[attr] + color: red + &::after + color: red + "; + let expect_classes = HashSet::from(["r2", "r3", "r1", "uled", "seled"]); + let expect_ids = HashSet::from(["id2", "id2"]); + let expect_tags = HashSet::from(["ul", "div", "span"]); + + //scss + let adp = StylesheetAdapter::new(source_scss, raffia::Syntax::Scss).unwrap(); + + let classes = adp + .class_selectors() + .iter() + .filter_map(|c| c.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + let ids = adp + .id_selectors() + .iter() + .filter_map(|i| i.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + let tags = adp + .type_selectors() + .iter() + .filter_map(|t| t.as_tag_name()) + .filter_map(|t| t.name.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + assert_eq!(expect_classes, classes); + assert_eq!(expect_ids, ids); + assert_eq!(expect_tags, tags); + + //sass + let adp = StylesheetAdapter::new(source_sass, raffia::Syntax::Sass).unwrap(); + + let classes = adp + .class_selectors() + .iter() + .filter_map(|c| c.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + let ids = adp + .id_selectors() + .iter() + .filter_map(|i| i.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + let tags = adp + .type_selectors() + .iter() + .filter_map(|t| t.as_tag_name()) + .filter_map(|t| t.name.name.as_literal().map(|l| l.raw)) + .collect::<HashSet<_>>(); + + assert_eq!(expect_classes, classes); + assert_eq!(expect_ids, ids); + assert_eq!(expect_tags, tags); + } + + #[test] + fn rename_class() { + let scss = ".cls1{color:red; .cls2{color:green;}}"; + let newname = "cls203-jg7ihgjhftyfhjh"; + let expect = ".cls1{color:red; .cls203-jg7ihgjhftyfhjh{color:green;}}"; + + let adp = StylesheetAdapter::new(scss, raffia::Syntax::Scss).unwrap(); + let classes = adp.class_selectors(); + let target_class = classes[0].clone(); + + let span = target_class.name.span(); + let renamed = format!("{}{}{}", &scss[..span.start], newname, &scss[span.end..]); + assert_eq!(renamed, expect); + } +} diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml new file mode 100644 index 0000000..1ca3d35 --- /dev/null +++ b/sabry_procmacro/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "sabry_procmacro" +description = "Sabry proc-macro declarations" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true + +[lib] +proc-macro = true + +[dependencies] +sabry_procmacro_impl = {workspace = true} + +[features] +sass = [ + "sabry_procmacro_impl/sass" +] +scss = [ + "sabry_procmacro_impl/scss" +] diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs new file mode 100644 index 0000000..d5ede42 --- /dev/null +++ b/sabry_procmacro/src/lib.rs @@ -0,0 +1,117 @@ +use proc_macro::TokenStream; +use sabry_procmacro_impl::impls::{ + sassy::sassy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, +}; + +/// Macro that makes sass code rusty. +/// +/// Accepts arbitrary (yet valid) sass(wip)/scss code and +/// makes it available as rust macro +/// +/// ## Usage +/// +/// ```ignore +/// sassy!(scssmodule { +/// /* SCSS */ +/// }); +/// sassy!(sassmodule:sass { +/// /* SASS (WIP) */ +/// }); +/// sassy!(scssmod2:scss { +/// /* SCSS */ +/// }); +/// ``` +/// Or read code from file +/// ```ignore +/// sassy!(filemodule "src/styles/a.scss"); +/// sassy!(filemodule:sass "src/styles/b.sass"); +/// ``` +/// +/// \[SCSS syntax requires 'scss' feature\] +/// \[SASS syntax requires 'sass' feature (WIP)\] +/// +#[proc_macro] +pub fn sassy(input: TokenStream) -> TokenStream { + sassy_macro_impl(input.into()).into() +} + +/// Macro that brings sass code into app +/// +/// Accepts arbitrary (yet valid) sass(wip)/scss code +/// and creates public/private module with scoped(hashed) +/// selector members. +/// +/// Feel free to use it with qualified path, but dont alias it with `use sabry::styly as whetever`. +/// +/// ## Usage +/// +/// Write style in rusty code (rust-analyzer wont autocomplete your scope members) +/// ```ignore +/// styly!(scope1 { +/// /* SCSS */ +/// }); +/// styly!(scope2:sass { +/// /* SASS (WIP) */ +/// }); +/// styly!(scope3:scss { +/// /* SCSS */ +/// }); +/// styly!(pub scope4 { +/// /* SCSS which is available as <mod>::scope4 */ +/// }); +/// styly!(const scope5 { +/// /* SCSS which wount be bundled, instead SCOPE5_STYLE constant is introduced with CSS */ +/// }); +/// styly!(pub const scope6 { +/// /* SCSS, which is like 'const scope5' but publically available like 'pub scope4'*/ +/// }); +/// ``` +/// Or use SCSS file and get syntax highlighting and autocompletion: +/// ```ignore +/// styly!(penguin "src/components/penguin.scss"); +/// styly!(pub page "src/routes/page.scss"); +/// styly!(pub const embed:sass "src/embedded.sass"); +/// ``` +/// +/// \[SCSS syntax requires 'scss' feature\] +/// \[SASS syntax requires 'sass' feature (WIP)\] +/// +/// ### About `const` scope +/// +/// Const-flavored styly macro will generate SCOPENAME_CSS constant available in runtime, which contains +/// compiled CSS. Note, that only possibility to `@use` something - is to have sabry as build time, so that const styly +/// macro could read all modules. +/// +/// ### Not meant to be used, yet still available +/// +/// ```ignore +/// styly!(notascope { +/// /* produces machine-readable invalid rust code */ +/// }#); +/// ``` +#[proc_macro] +pub fn styly(input: TokenStream) -> TokenStream { + styly_macro_impl(input.into()).into() +} + +/// Macro that brings external sass code into app +/// +/// Intended to be used in tandem with `sabry::buildy` function in `build.rs` file +/// +/// ## Usage +/// +/// ```ignore +/// use sharedstyles::tokens; +/// use brandstyle::tokens as brand_tokens; +/// +/// usey!( +/// brandstyle::theme!(), +/// tokens!(), +/// brand_tokens!(), +/// ); +/// ``` +/// +#[proc_macro] +pub fn usey(input: TokenStream) -> TokenStream { + usey_macro_impl(input.into()).into() +} diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml new file mode 100644 index 0000000..c5e0e5b --- /dev/null +++ b/sabry_procmacro_impl/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "sabry_procmacro_impl" +description = "Sabry proc-macro internals reusable outside of proc-macro context" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true + +[dependencies] +sabry_intrnl = {workspace = true} + +proc-macro2 = {workspace = true, features = ["span-locations"]} +syn = {workspace = true, features = ["parsing"]} +quote = {workspace = true} +regex = {workspace = true} + +raffia = {workspace = true} + +[features] +sass = [ + "sabry_intrnl/sass" +] +scss = [ + "sabry_intrnl/scss" +] diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs new file mode 100644 index 0000000..e5f9cc5 --- /dev/null +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -0,0 +1,202 @@ +use std::{fmt::Debug, fs}; + +use proc_macro2::{Span, TokenStream}; +use quote::{quote, ToTokens, TokenStreamExt}; +use sabry_intrnl::compiler::CompilerSyntax; +use syn::{braced, parse::Parse, spanned::Spanned, Ident, LitStr, Token}; + +pub mod sassy; +pub mod styly; +pub mod usey; + +/// Macro input for arbitrary style code +/// +/// Also supports string literal token instead of braces, +/// in which mode will look for relative file +/// +/// Does not work nice with rust-analyzer though +#[derive(Clone, Debug)] +pub struct ArbitraryStyleBlock { + code: String, + span: Span, +} + +impl ArbitraryStyleBlock { + pub fn span(&self) -> Span { + self.span + } + + pub fn code(&self) -> &str { + &self.code + } +} + +impl Parse for ArbitraryStyleBlock { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let (code, span) = if let Ok(path_tok) = input.parse::<LitStr>() { + let path = path_tok.value(); + + let iofile = match fs::read(&path) { + Ok(bf) => bf, + Err(_) => return Err(syn::Error::new(path_tok.span(), format!("Could not read file '{path}'. Perhaps its relative? Thats not currently supported :("))) + }; + let code = String::from_utf8_lossy(&iofile).to_string(); + + (code, path_tok.span()) + } else { + // Does not work on stable! + // We're on nightly though + // So what? + // Then is works. + let _s; + braced!(_s in input); + let stream = _s.parse::<TokenStream>()?; + + let c = match stream.span().source_text() { + Some(stx) => stx, + // TODO: rust-analyzer does fall into this even if all is fine + None => "".to_string(), //return Err(syn::Error::new(stream.span(), "Source code expected")), + }; + + (c, stream.span()) + }; + + Ok(Self { code, span }) + } +} + +#[allow(clippy::to_string_trait_impl)] +impl ToString for ArbitraryStyleBlock { + fn to_string(&self) -> String { + self.code.clone() + } +} + +#[derive(Clone, Copy)] +pub enum ArbitraryStyleSyntax { + #[cfg(feature = "scss")] + Scss, + #[cfg(feature = "sass")] + Sass, +} + +impl From<ArbitraryStyleSyntax> for CompilerSyntax { + fn from(value: ArbitraryStyleSyntax) -> Self { + match value { + #[cfg(feature = "sass")] + ArbitraryStyleSyntax::Sass => Self::Sass, + #[cfg(feature = "scss")] + ArbitraryStyleSyntax::Scss => Self::Scss, + } + } +} + +impl ToTokens for ArbitraryStyleSyntax { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + #[cfg(feature = "sass")] + Self::Sass => tokens.append_all(quote! {"sass"}), + #[cfg(feature = "scss")] + Self::Scss => tokens.append_all(quote! {"scss"}), + } + } +} + +impl Parse for ArbitraryStyleSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + match input.parse::<Token![:]>() { + Ok(_) => { /* Syntax is set */ } + Err(_) => { + /* Syntax is not set, falling to default */ + return Ok(Self::default()); + } + } + let ident = input.parse::<Ident>()?; + + match ident.to_string().as_str() { + #[cfg(feature = "sass")] + "sass" => Ok(Self::Sass), + #[cfg(feature = "scss")] + "scss" => Ok(Self::Scss), + _ => Err(syn::Error::new( + ident.span(), + format!( + "Available syntax are `sass` (WIP) and `scss`, each of them requires feature flag. Omit to use default {:?} syntax", + Self::default() + ), + )), + } + } +} + +impl Debug for ArbitraryStyleSyntax { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let name = match self { + #[cfg(feature = "sass")] + Self::Sass => "sass", + #[cfg(feature = "scss")] + Self::Scss => "scss", + }; + write!(f, "{name}") + } +} + +impl Default for ArbitraryStyleSyntax { + #[cfg(feature = "scss")] + fn default() -> Self { + Self::Scss + } + + #[cfg(all(feature = "sass", not(feature = "scss")))] + fn default() -> Self { + Self::Sass + } +} + +impl From<ArbitraryStyleSyntax> for raffia::Syntax { + fn from(value: ArbitraryStyleSyntax) -> Self { + match value { + #[cfg(feature = "sass")] + ArbitraryStyleSyntax::Sass => Self::Sass, + #[cfg(feature = "scss")] + ArbitraryStyleSyntax::Scss => Self::Scss, + } + } +} + +#[cfg(test)] +mod test { + #[cfg(feature = "sass")] + #[test] + fn arbitrary_style_block_sass() { + use super::ArbitraryStyleBlock; + + let code = "#a + co:d + .sel + di: pi + .sel,div > sel + f: \"into\""; + let braced_code = format!("{{{code}}}"); + let block = syn::parse_str::<ArbitraryStyleBlock>(&braced_code).unwrap(); + + assert_eq!(code, block.code); + } + + #[cfg(feature = "scss")] + #[test] + fn arbitrary_style_block_scss() { + use super::ArbitraryStyleBlock; + + let code = "#a { + c:r; + } + .b.c{ + c:\"into\"; + }"; + let braced_code = format!("{{{code}}}"); + let block = syn::parse_str::<ArbitraryStyleBlock>(&braced_code).unwrap(); + + assert_eq!(code, block.code) + } +} diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs new file mode 100644 index 0000000..6221449 --- /dev/null +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -0,0 +1,68 @@ +use proc_macro2::TokenStream; +use quote::quote; +use syn::{parse::Parse, Ident}; + +use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; + +/// Syntax: +/// `#ident(:$syntax)? { $code }` +/// +/// `$syntax`: sass/scss +/// +/// `$code`: intended to be valid based on $syntax +pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { + let MacroSyntax { + ident, + syntax: mode, + code, + } = match syn::parse2::<MacroSyntax>(input) { + Ok(m) => m, + Err(e) => return e.to_compile_error(), + }; + + let sourcesass = code.to_string(); + let identname = ident.to_string(); + let macro_doc = format!("Arbitrary {:?} code declared with `sassy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); + + quote! { + #[doc = #macro_doc] + #[macro_export] + macro_rules! #ident { + () => {#sourcesass}; + (module) => {#identname}; + (syntax) => {#mode}; + } + } +} + +pub struct MacroSyntax { + ident: Ident, + syntax: ArbitraryStyleSyntax, + code: ArbitraryStyleBlock, +} + +impl Parse for MacroSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + #[cfg(feature = "sass")] + use regex::Regex; + + let ident = input.parse::<Ident>()?; + let mode = input.parse::<ArbitraryStyleSyntax>()?; + let mut code = input.parse::<ArbitraryStyleBlock>()?; + + // this is because of how parsing works. Need to find more elegant way though + // TODO: find a more elegant way + code.code = Regex::new("\n ").expect("BUG: failed to build regex for indentation SASS").replace_all(&code.code, "\n").to_string(); + + Ok(Self { + ident, + syntax: mode, + code, + }) + } +} + +#[cfg(test)] +mod test { + +} diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs new file mode 100644 index 0000000..9d6b0ed --- /dev/null +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -0,0 +1,209 @@ +use proc_macro2::{Span, TokenStream}; +use quote::quote; +use sabry_intrnl::{ + compiler::CompilerAdapter, + config::SabryConfig, + scoper::{ArbitraryScope, ScopedSelector}, +}; +use syn::{parse::Parse, Ident, Token}; + +use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; + +/// Syntax: +/// `pub? #ident(:$syntax)? { $code } \#?` +/// +/// `$syntax`: sass/scss +/// +/// `$code`: intended to be valid based on $syntax +/// +/// `pub` modifier makes scope public +/// +/// `const` modifier completely changes the behaviour of styling, and +/// makes CSS exposed as constant +/// +/// `#` shebang generates machine-readable and well-parsible but invalid rust code for building purposes +/// instead of scope module. +/// +/// The machine-readable output may also be forced by use `machine_readable: true` arg on `parse_macro_syntax` function +/// without modifying tokenstream +pub fn styly_macro_impl(input: TokenStream) -> TokenStream { + let config = match SabryConfig::require() { + Ok(c) => c, + Err(e) => { + return syn::Error::new( + Span::call_site(), + format!( + "Could not read sabry configuration required by this macro: {:?}", + e + ), + ) + .to_compile_error() + } + }; + let ms = match parse_macro_syntax(input) { + Ok(ms) => ms, + Err(e) => return e.to_compile_error(), + }; + + let scope = match ArbitraryScope::from_source(ms.syntax.into(), ms.scope.clone(), &ms.code.code) + { + Ok(s) => match s.hashed(&config.hash) { + Ok(hs) => Ok(hs), + Err(e) => Err(e), + }, + Err(e) => Err(e), + }; + let scope = match scope { + Ok(s) => s, + Err(e) => { + return syn::Error::new( + Span::call_site(), + format!("Could not generate scope: {:?}", e), + ) + .to_compile_error() + } + }; + + match ms.generator { + ScopeGenerator::Module { public, constant } => { + let scope_hash = scope.hash.as_str(); + let scope_ident = scope.original_scope.name; + let scope_wrapper_ident = + syn::parse_str::<Ident>(&scope_ident.to_string().to_uppercase()) + .expect("BUG: We just converted valid Ident to string and uppercased"); + let scope_vis = if public { + quote! {pub} + } else { + quote! {} + }; + + let scope_members = scope + .hashed_selectors + .iter() + .filter_map(|hs| { + hs.html_ident.clone().map(|html| { + let name = match hs.sel { + ScopedSelector::Class(_) => "class", + ScopedSelector::Id(_) => "id", + ScopedSelector::Tag(_) => "tagname", + }; + + (name, hs.sel.gen_rusty_ident(), html, hs.css_ident.clone()) + }) + }) + .map(|(name, ident, html, css)| { + let docs = format!("'{}' {}. CSS selector '{}'", ident, name, css); + quote! { + #[doc = #docs] + #[allow(non_upper_case_globals)] + pub const #ident : &str = #html ; + } + }); + + let mod_docs = format!( + "'{}' style scope. The wrapper class for scoped tagnames is {}", + &scope_ident, &scope_wrapper_ident + ); + let wrp_docs = format!("wrapper class for '{}' scope. If you have any tagname selectors - they should live as children of element with this class applied.", &scope_ident); + + if constant { + let compiler = CompilerAdapter::new(config.clone()); + let css = match compiler.compile_module(ms.syntax.into(), &ms.code.code) { + Ok(c) => c, + Err(e) => { + return syn::Error::new( + ms.code.span, + format!("Could not compile const inline: {e:?}"), + ) + .to_compile_error() + } + }; + + let const_docs = format!("The compiled CSS style for {} scope", &scope_ident); + let const_wrapper_ident = syn::parse_str::<Ident>( + format!("{}_CSS", &scope_ident.to_string().to_uppercase()).as_str(), + ) + .expect("BUG: We just converted valid Ident to string and uppercased"); + + quote! { + #[doc = #const_docs] + #scope_vis const #const_wrapper_ident: &str = #css ; + #[doc = #wrp_docs] + #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; + #[doc = #mod_docs] + #scope_vis mod #scope_ident { + #(#scope_members)* + } + } + } else { + quote! { + #[doc = #wrp_docs] + #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; + #[doc = #mod_docs] + #scope_vis mod #scope_ident { + #(#scope_members)* + } + } + } + } + ScopeGenerator::MachineReadable => { + quote! {} + } + } +} + +// reusable function, that does not return tokenstream for machine-processing at build time +pub fn parse_macro_syntax(input: TokenStream) -> Result<MacroSyntax, syn::Error> { + syn::parse2::<MacroSyntax>(input) +} + +#[derive(Debug)] +pub enum ScopeGenerator { + Module { public: bool, constant: bool }, + MachineReadable, +} + +impl Parse for ScopeGenerator { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let public = input.parse::<Token![pub]>().is_ok(); + let constant = input.parse::<Token![const]>().is_ok(); + + // would be nice to implement compile-time CSS compilation to const + // with `const` modifier, so I'll leave it this way for now + let this = Self::Module { public, constant }; + + Ok(this) + } +} + +#[derive(Debug)] +pub struct MacroSyntax { + /// The way macro should be expanded + pub generator: ScopeGenerator, + /// Scope identifier + pub scope: Ident, + /// Used stytax + pub syntax: ArbitraryStyleSyntax, + /// Style code, either from rust or read from file + pub code: ArbitraryStyleBlock, +} + +impl Parse for MacroSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let mut generator = input.parse::<ScopeGenerator>()?; + let scope = input.parse::<Ident>()?; + let syntax = input.parse::<ArbitraryStyleSyntax>()?; + let code = input.parse::<ArbitraryStyleBlock>()?; + + if input.parse::<Token![#]>().is_ok() { + generator = ScopeGenerator::MachineReadable + } + + Ok(Self { + generator, + scope, + syntax, + code, + }) + } +} diff --git a/sabry_procmacro_impl/src/impls/usey.rs b/sabry_procmacro_impl/src/impls/usey.rs new file mode 100644 index 0000000..730bb4e --- /dev/null +++ b/sabry_procmacro_impl/src/impls/usey.rs @@ -0,0 +1,71 @@ +use proc_macro2::TokenStream; +use quote::quote; +use syn::{parse::Parse, punctuated::Punctuated, Macro, Token}; + +/// Syntax: +/// `#(pub? #macro,)*` +pub fn usey_macro_impl(input: TokenStream) -> TokenStream { + let MacroSyntax { stylecalls } = match syn::parse2(input) { + Ok(ms) => ms, + Err(e) => return e.to_compile_error(), + }; + + let stylecall_pairs = stylecalls + .iter() + .map(|c| c.to_contract_pair("__sabry_pub_module")); + + quote! { + vec![ + #(#stylecall_pairs,)* + ] + } +} + +#[derive(Clone)] +pub struct StyleCall { + vis_pub: bool, + call: Macro, +} + +impl StyleCall { + pub fn to_contract_pair(&self, pub_module: &str) -> TokenStream { + let call_code = &self.call; + let call_path = &self.call.path; + let call_bang = &self.call.bang_token; + // the following calls are expected by macro genereted by `sassy!` + let call_syntax = quote! {#call_path #call_bang (syntax)}; + let call_file = quote! {#call_path #call_bang (module)}; + + if self.vis_pub { + quote! { + (format!("{}.{}", #pub_module, #call_syntax), #call_code .to_string()) + } + } else { + quote! { + (format!("{}.{}", #call_file, #call_syntax), #call_code .to_string()) + } + } + } +} + +impl Parse for StyleCall { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let vis_pub = input.parse::<Token![pub]>().is_ok(); + let call = input.parse::<Macro>()?; + + Ok(Self { vis_pub, call }) + } +} + +pub struct MacroSyntax { + stylecalls: Vec<StyleCall>, +} + +impl Parse for MacroSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let calls = Punctuated::<StyleCall, Token![,]>::parse_separated_nonempty(input)?; + + let stylecalls = calls.iter().cloned().collect(); + Ok(Self { stylecalls }) + } +} diff --git a/sabry_procmacro_impl/src/lib.rs b/sabry_procmacro_impl/src/lib.rs new file mode 100644 index 0000000..daad739 --- /dev/null +++ b/sabry_procmacro_impl/src/lib.rs @@ -0,0 +1,4 @@ +// Moving this to separate crate, cuz I don't wanna to reimplement that parsing again for build magic +// Also, because I can. + +pub mod impls; diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..71317c6 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,6 @@ +#![doc = include_str!("../README.md")] + +#[cfg(feature = "build")] +pub use sabry_build::*; +#[cfg(feature = "procmacro")] +pub use sabry_procmacro::*; From e643a6827080cb70fcb3c09c6a4dc496751714f3 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 11:18:04 +0500 Subject: [PATCH 094/184] Create cbt.yml Hmm. Never used those. Its time to try --- .github/workflows/cbt.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/cbt.yml diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml new file mode 100644 index 0000000..e649dab --- /dev/null +++ b/.github/workflows/cbt.yml @@ -0,0 +1,23 @@ +name: cargo basic build-test + +on: + push: + pull_request: + +env: + CARGO_TERM_COLOR: always + +jobs: + build_and_test: + name: Sabry - latest + runs-on: ubuntu-latest + strategy: + matrix: + toolchain: + - stable + - nightly + steps: + - uses: actions/checkout@v4 + - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} + - run: cargo build --verbose + - run: cargo test --verbose -all --all-features From 65ad514112756e68175410d6f9ea70c7609757c3 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 11:21:16 +0500 Subject: [PATCH 095/184] this is gonna take MANY commits :D --- .github/workflows/cbt.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index e649dab..baa6f55 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -2,7 +2,9 @@ name: cargo basic build-test on: push: + branches: ["window", "master"] pull_request: + branches: ["window"] env: CARGO_TERM_COLOR: always From bb7fb5e5ce9e0fc09da3e5a1086561f0a9e2adb4 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 16:33:50 +0500 Subject: [PATCH 096/184] first-approach implementation of nesting selectors --- examples/use-styles/Cargo.lock | 8 +++--- examples/use-styles/src/main.rs | 4 +++ sabry_intrnl/src/scoper/mod.rs | 2 +- sabry_procmacro_impl/src/impls/styly.rs | 33 +++++++++++++++++++++++-- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 7e7c03c..00f3e98 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -1003,7 +1003,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.0" +version = "0.0.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,7 +1015,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.0" +version = "0.0.1" dependencies = [ "base64", "blake3", @@ -1033,14 +1033,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.0" +version = "0.0.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.0" +version = "0.0.1" dependencies = [ "proc-macro2", "quote", diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 6751b2c..6cdf59d 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -5,6 +5,9 @@ styly!(pub const bundlemod { .someth { @include tokens.clickable; background-color: black; + &-dark { + background-color: white; + } } }); @@ -13,5 +16,6 @@ styly!(pub const filemod:sass "src/main.sass"); fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); + println!("someth-dark selector will be: {}", bundlemod::_dark(bundlemod::someth)); println!("Thats how we used the styles! Good luck!!"); } diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 824aed7..658e8f0 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -294,7 +294,7 @@ impl ScopedSelector { } } -fn apply_basic_rusty_member_gen_rules(source: &str) -> String { +pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { let omit_regex = Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") .expect("BUG: can not build omition regex for rusty member generation"); diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 9d6b0ed..56a977c 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -3,7 +3,7 @@ use quote::quote; use sabry_intrnl::{ compiler::CompilerAdapter, config::SabryConfig, - scoper::{ArbitraryScope, ScopedSelector}, + scoper::{apply_basic_rusty_member_gen_rules, ArbitraryScope, ScopedSelector}, }; use syn::{parse::Parse, Ident, Token}; @@ -67,7 +67,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { match ms.generator { ScopeGenerator::Module { public, constant } => { let scope_hash = scope.hash.as_str(); - let scope_ident = scope.original_scope.name; + let scope_ident = scope.original_scope.name.clone(); let scope_wrapper_ident = syn::parse_str::<Ident>(&scope_ident.to_string().to_uppercase()) .expect("BUG: We just converted valid Ident to string and uppercased"); @@ -77,6 +77,33 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { quote! {} }; + let nests = scope.original_scope.adapter().nesting_selectors(); + let special_nesting_members = nests + .iter() + .filter_map(|ns| { + ns.suffix.clone().and_then(|s| { + let interp = s + .as_sass_interpolated() + .and_then(|i| i.elements.first()) + .and_then(|e| e.as_static()) + .and_then(|s| Some(s.raw.to_string())); + + interp + }) + }) + .map(|s| { + let ident = apply_basic_rusty_member_gen_rules(&s); + let fnident = syn::parse_str::<Ident>(format!("_{ident}").as_str()) + .expect("BUG: invalid ident for nesting selector formed"); + let formatstr = format!("{{c}}{}", &s); + let doc = format!("Nesting selector. Originated from '&{s}'"); + + quote! { + #[doc = #doc] + pub fn #fnident(c: &str) -> String {format!(#formatstr)} + } + }); + let scope_members = scope .hashed_selectors .iter() @@ -133,6 +160,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { #[doc = #mod_docs] #scope_vis mod #scope_ident { #(#scope_members)* + #(#special_nesting_members)* } } } else { @@ -142,6 +170,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { #[doc = #mod_docs] #scope_vis mod #scope_ident { #(#scope_members)* + #(#special_nesting_members)* } } } From 4863f331bc92c7ecc7a375c3ed77fbb8edb75c12 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 16:41:45 +0500 Subject: [PATCH 097/184] ensure generated hash is safe --- examples/use-styles/src/main.rs | 4 ++-- sabry_intrnl/src/scoper/hash.rs | 3 ++- sabry_procmacro_impl/src/impls/styly.rs | 3 +-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 6cdf59d..6472b0e 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -5,7 +5,7 @@ styly!(pub const bundlemod { .someth { @include tokens.clickable; background-color: black; - &-dark { + &__dark { background-color: white; } } @@ -16,6 +16,6 @@ styly!(pub const filemod:sass "src/main.sass"); fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); - println!("someth-dark selector will be: {}", bundlemod::_dark(bundlemod::someth)); + //println!("someth-dark selector will be: {}", bundlemod::_dark(bundlemod::someth)); println!("Thats how we used the styles! Good luck!!"); } diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index 9f8a9e4..4188a39 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -2,7 +2,7 @@ use base64::Engine; use crate::config::SabryHashConfig; -use super::ArbitraryScope; +use super::{apply_basic_rusty_member_gen_rules, ArbitraryScope}; /// Convenience wrapper for String-being-a-hash #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -50,6 +50,7 @@ impl ScopeHash { //? This isn't right. "size" is size of hash in symbols. // naaah, its fine :D (Dan) let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(&hash[..size]); + let hash = apply_basic_rusty_member_gen_rules(&hash); Self(hash) } diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 56a977c..4a157d2 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -85,8 +85,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { let interp = s .as_sass_interpolated() .and_then(|i| i.elements.first()) - .and_then(|e| e.as_static()) - .and_then(|s| Some(s.raw.to_string())); + .and_then(|e| e.as_static().map(|s| s.raw.to_string())); interp }) From ff285adb7af53e7865eb62565e85f9dc23dc2754 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 16:51:03 +0500 Subject: [PATCH 098/184] oops, make readme to pass tests --- README.md | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index e969449..7d90fc0 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ At first, I'll show how this crate "tastes". With SABRY, its in your power to: Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with modules, with feature flags, etc. Say "bye" to manual copying, cli-tools and consts. -```rust +```rust,ignore sassy!(tokens {@mixin colored{color: red;}}); ``` @@ -34,7 +34,7 @@ sassy!(tokens {@mixin colored{color: red;}}); Code your SASS in separate files to get proper syntax highlighting, or do sass-in-the-rust to keep things in one place -```rust +```rust,ignore styly!(component {.btn {color: green;}}); styly!(extras "src/components/extras.scss"); ``` @@ -64,7 +64,7 @@ tgk_brandstyle = {version = "0.0.1", features = ["utils"]} `@use` your style-crates in sass code *naturally* -```rust +```rust,ignore styly!(breadcumb { @use 'tokens'; .scope {@include tokens.badge(primary);} @@ -81,7 +81,7 @@ styly!(breadcumb { Keep things as private and modular as you wish -```rust +```rust,ignore styly!(pub cats "src/sections/cats/style.scss"); styly!(dogs {#howl {border: none;}}) @@ -103,7 +103,7 @@ styly!(dogs {#howl {border: none;}}) Compile all the sweet SASS/SCSS into the optimized CSS bundle, ship it in CSS shunks or even include the compiled style into the binary -```rust +```rust,ignore styly!(cssbundle {.c1 {color: white;}}) styly!(const binary {.c2 {color: black;}}) ``` @@ -144,7 +144,7 @@ The only need is the dependency sabry = {version = "0.0.1"} ``` And a proc-macro -```rust +```rust,ignore // lib.rs use sabry::sassy; @@ -175,7 +175,7 @@ Depend on sabry sabry = {version = "0.0.1"} ``` And create a style scope wherever you want: -```rust +```rust,ignore // breadcumblist.rs use sabry::styly; @@ -221,7 +221,7 @@ sabry = {version = "0.0.1", features = ["build"]} > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. Then you have to tell sabry when code should be compiled. We'll do this in *build.rs* file. -```rust +```rust,ignore // build.rs use shared_styles::{mixins, styles}; @@ -237,7 +237,7 @@ fn main(){ `buildy` is the entry function of sabry build-time process. The handy `usey!` macro will do just proper handling of our style-macros for it. Now lets get back to the code and use the mixin defined in another crate: -```rust +```rust,ignore // breadcumblist.rs use sabry::styly; @@ -370,7 +370,7 @@ It does accept the following syntax: `$name(:$syntax)? ({ $code })|($filename)`, - *$filename* is a string literal which contains path to the file relative to package root Examples: -```rust +```rust,ignore sassy!(module1 {$primary-color: red;}); sassy!(module2 "src/assets/module2.scss"); sassy!(module3:sass "src/assets/module3.sass"); @@ -401,7 +401,7 @@ It does accept the following syntax: `pub? const? $ident(:$syntax)? ({ $code })| - *$filename* is a string literal which contains path to the file relative to package root Examples -```rust +```rust,ignore styly!(fox {.fur {color: red; &-dark {color: black;}}}) styly!(pub fox {.fur {color: red; &-dark {color: black;}}}) styly!(pub const fox:sass { @@ -414,7 +414,7 @@ styly!(pub const fox:sass { Every of those calls will produce the styling scope as a module. Differences are explained right below. In general the scope does look like this: -```rust +```rust,ignore const FOX: &str = "J9k_s9"; mod fox { pub const fur: &str = "J9k_s9 fur"; @@ -437,7 +437,7 @@ You can read more about scoping and hashing in the [scoping](#scoping) section. By default generated `mod` is private. You can make both mod and wrapper style constant public by adding the `pub` to macro call: -```rust +```rust,ignore styly!(pub whatever "src/assets/whatever.scss"); ``` @@ -447,11 +447,11 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: -```rust +```rust,ignore styly!(const scope "src/assets/scope.scss"); ``` Which results in following: -```rust +```rust,ignore const SCOPE: &str = /* scope hash */; const SCOPE_CSS: &str = /* compiled from src/assets/scope.scss */; mod scope {/* selector collection */} @@ -475,12 +475,12 @@ Each of those pairs is processed as a file which sabry needs to write into the configured `intermediate_dir` and then passed into the CSS compiler. You could, for example, define the module "mixin_a": -```rust +```rust,ignore buildy(vec![("mixin_a".to_string(), "@mixin a(){}".to_string())]); ``` However there's a usey macro, which handles this for you: -```rust +```rust,ignore buildy( usey!(mixins!(), utils!()) ); @@ -535,7 +535,7 @@ Different selector types are scoped differently: As for **SASS parent selectors**: they are currently handled in different way. Instead of walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: -```rust +```rust,ignore styly!(scope { .cls1 { &-dark {} @@ -543,7 +543,7 @@ styly!(scope { }); ``` is something like -```rust +```rust,ignore const SCOPE: &str = "Ut8CskJ"; mod scope { pub const cls1: &str = "Ut8CskJ cls1"; @@ -561,6 +561,7 @@ This isn't very handy, also isn't strict enough, and is a high-priority subject - [] Crates of styled components - currently the only way to create them seems to be const styly. - [] CSS support +- [] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance - [] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. - [] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. From 6cac4e9b9560c5f555a0eb18baffbd2a1a2693d2 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 17:09:21 +0500 Subject: [PATCH 099/184] we should keep dependencies independent from workspace --- Cargo.lock | 1 + Cargo.toml | 13 ------------- examples/use-styles/Cargo.lock | 1 + sabry_build/Cargo.toml | 6 +++--- sabry_intrnl/Cargo.toml | 26 +++++++++++++------------- sabry_procmacro_impl/Cargo.toml | 11 +++++------ 6 files changed, 23 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 80d7a63..1907822 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1016,6 +1016,7 @@ dependencies = [ "grass", "lightningcss", "proc-macro2", + "quote", "raffia", "regex", "serde", diff --git a/Cargo.toml b/Cargo.toml index c31dc20..3af3f66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,20 +15,7 @@ sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1"} sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1"} sabry_build = {path = "sabry_build", version = "0.0.1"} -syn = {version = "^2.0"} -quote = {version = "^1.0"} -proc-macro2 = {version = "^1.0"} -raffia = {version = "^0.9"} -regex = {version = "^1.11"} -grass = {version = "^0.13"} -lightningcss = {version = "1.0.0-alpha.59"} -blake3 = {version = "^1.5"} -base64 = {version = "^0.22"} -const_format = {version = "^0.2"} -thiserror = {version = "^1.0"} -serde = {version = "^1.0"} -toml = {version = "^0.8"} [workspace.package] diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 00f3e98..8bc46bd 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -1023,6 +1023,7 @@ dependencies = [ "grass", "lightningcss", "proc-macro2", + "quote", "raffia", "regex", "serde", diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index 05d7609..d6ff640 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -10,10 +10,10 @@ license.workspace = true [dependencies] sabry_intrnl = {workspace = true} sabry_procmacro_impl = {workspace = true} -proc-macro2 = {workspace = true, features = ["span-locations"]} -syn = {workspace = true, features = ["visit", "derive", "parsing", "full"]} -thiserror = {workspace = true} +syn = {version = "^2.0", features = ["visit", "derive", "parsing", "full"]} +proc-macro2 = {version = "^1.0", features = ["span-locations"]} +thiserror = {version = "^1.0"} walkdir = {version = "^2.5"} [features] diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 5bf56e5..412f6f5 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -8,20 +8,20 @@ authors.workspace = true license.workspace = true [dependencies] -raffia = {workspace = true} -grass = {workspace = true} -lightningcss = {workspace = true} -blake3 = {workspace = true} -base64 = {workspace = true} +syn = {version = "^2.0"} +quote = {version = "^1.0"} +proc-macro2 = {version = "^1.0"} +raffia = {version = "^0.9"} +regex = {version = "^1.11"} +grass = {version = "^0.13"} +lightningcss = {version = "1.0.0-alpha.59"} +blake3 = {version = "^1.5"} +base64 = {version = "^0.22"} +const_format = {version = "^0.2"} -syn = {workspace = true} -proc-macro2 = {workspace = true} -regex = {workspace = true} -const_format = {workspace = true} - -serde = {workspace = true, features = ["derive"]} -toml = {workspace = true} -thiserror = {workspace = true} +thiserror = {version = "^1.0"} +serde = {version = "^1.0", features = ["derive"]} +toml = {version = "^0.8"} [features] sass = [] diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index c5e0e5b..dbac87d 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -10,12 +10,11 @@ license.workspace = true [dependencies] sabry_intrnl = {workspace = true} -proc-macro2 = {workspace = true, features = ["span-locations"]} -syn = {workspace = true, features = ["parsing"]} -quote = {workspace = true} -regex = {workspace = true} - -raffia = {workspace = true} +syn = {version = "^2.0", features = ["parsing"]} +quote = {version = "^1.0"} +proc-macro2 = {version = "^1.0", features = ["span-locations"]} +raffia = {version = "^0.9"} +regex = {version = "^1.11"} [features] sass = [ From 65005f446f8872c84b24807305225c7ca27bbbf7 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 17:12:23 +0500 Subject: [PATCH 100/184] oops, fix regex :D --- sabry_procmacro_impl/src/impls/sassy.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index 6221449..6e89732 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -1,6 +1,7 @@ use proc_macro2::TokenStream; use quote::quote; use syn::{parse::Parse, Ident}; +use regex::Regex; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -43,9 +44,6 @@ pub struct MacroSyntax { impl Parse for MacroSyntax { fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { - #[cfg(feature = "sass")] - use regex::Regex; - let ident = input.parse::<Ident>()?; let mode = input.parse::<ArbitraryStyleSyntax>()?; let mut code = input.parse::<ArbitraryStyleBlock>()?; From 7bdb7158d1125a31b1c287e6748b4a5e737348f7 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 17:42:26 +0500 Subject: [PATCH 101/184] drop redundant feature flags, as behavour is consistent between sass syntax types --- Cargo.toml | 14 +------------- examples/define-styles/Cargo.toml | 2 +- examples/leptos-axum/Cargo.toml | 4 ++-- examples/use-styles/Cargo.toml | 4 ++-- sabry_build/Cargo.toml | 8 -------- sabry_intrnl/Cargo.toml | 2 -- sabry_intrnl/src/compiler/mod.rs | 6 ------ sabry_procmacro/Cargo.toml | 6 ------ sabry_procmacro_impl/Cargo.toml | 6 ------ sabry_procmacro_impl/src/impls/mod.rs | 20 -------------------- 10 files changed, 6 insertions(+), 66 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3af3f66..9bab5e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,22 +43,10 @@ sabry_build = {workspace = true, optional = true} sabry_intrnl = {workspace = true} [features] -default = ["scss"] +default = ["procmacro"] procmacro = [ "dep:sabry_procmacro" ] -sass = [ - "procmacro", - "sabry_procmacro/sass", - "sabry_intrnl/sass", - "sabry_build/sass" -] -scss = [ - "procmacro", - "sabry_procmacro/scss", - "sabry_intrnl/scss", - "sabry_build/scss" -] build = [ "dep:sabry_build" ] diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml index 496ecd3..4e80fbe 100644 --- a/examples/define-styles/Cargo.toml +++ b/examples/define-styles/Cargo.toml @@ -6,4 +6,4 @@ rust-version = "1.82" publish = false [dependencies] -sabry = {path = "../../", features = ["sass"]} +sabry = {path = "../../"} diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 7033f16..1b30dbb 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -23,11 +23,11 @@ tracing = { version = "0.1", optional = true } http = "1" # sabry with sass -sabry = {path = "../../", features = ["sass"]} +sabry = {path = "../../"} [build-dependencies] # sabry for build with sass -sabry = {path = "../../", features = ["build", "sass"]} +sabry = {path = "../../", features = ["build"]} # lets depend on our styles define-styles = {path = "../define-styles"} diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml index 77c0ca6..29e0a32 100644 --- a/examples/use-styles/Cargo.toml +++ b/examples/use-styles/Cargo.toml @@ -6,10 +6,10 @@ rust-version = "1.82" publish = false [dependencies] -sabry = {path = "../../", features = ["sass"]} +sabry = {path = "../../"} [build-dependencies] -sabry = {path = "../../", features = ["build", "sass"]} +sabry = {path = "../../", features = ["build"]} define-styles = {path = "../define-styles"} [package.metadata.sabry] diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index d6ff640..c8f8a81 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -17,12 +17,4 @@ thiserror = {version = "^1.0"} walkdir = {version = "^2.5"} [features] -sass = [ - "sabry_procmacro_impl/sass", - "sabry_intrnl/sass" -] -scss = [ - "sabry_procmacro_impl/scss", - "sabry_intrnl/scss" -] net-files = [] diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 412f6f5..457d28f 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -24,5 +24,3 @@ serde = {version = "^1.0", features = ["derive"]} toml = {version = "^0.8"} [features] -sass = [] -scss = [] diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 0c2df2b..7b20556 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -89,18 +89,14 @@ pub enum SabryCompilerError { /// Unification wrapper over all the Syntax enums #[derive(Clone, Copy)] pub enum CompilerSyntax { - #[cfg(feature = "sass")] Sass, - #[cfg(feature = "scss")] Scss, } impl From<raffia::Syntax> for CompilerSyntax { fn from(value: raffia::Syntax) -> Self { match value { - #[cfg(feature = "sass")] raffia::Syntax::Sass => Self::Sass, - #[cfg(feature = "scss")] raffia::Syntax::Scss => Self::Scss, // TODO: fallbacky error-prone _ => Self::Scss, @@ -111,9 +107,7 @@ impl From<raffia::Syntax> for CompilerSyntax { impl From<CompilerSyntax> for grass::InputSyntax { fn from(value: CompilerSyntax) -> Self { match value { - #[cfg(feature = "scss")] CompilerSyntax::Scss => Self::Scss, - #[cfg(feature = "sass")] CompilerSyntax::Sass => Self::Sass, } } diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 1ca3d35..70df668 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -14,9 +14,3 @@ proc-macro = true sabry_procmacro_impl = {workspace = true} [features] -sass = [ - "sabry_procmacro_impl/sass" -] -scss = [ - "sabry_procmacro_impl/scss" -] diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index dbac87d..499f1ce 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -17,9 +17,3 @@ raffia = {version = "^0.9"} regex = {version = "^1.11"} [features] -sass = [ - "sabry_intrnl/sass" -] -scss = [ - "sabry_intrnl/scss" -] diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index e5f9cc5..c2420e2 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -74,18 +74,14 @@ impl ToString for ArbitraryStyleBlock { #[derive(Clone, Copy)] pub enum ArbitraryStyleSyntax { - #[cfg(feature = "scss")] Scss, - #[cfg(feature = "sass")] Sass, } impl From<ArbitraryStyleSyntax> for CompilerSyntax { fn from(value: ArbitraryStyleSyntax) -> Self { match value { - #[cfg(feature = "sass")] ArbitraryStyleSyntax::Sass => Self::Sass, - #[cfg(feature = "scss")] ArbitraryStyleSyntax::Scss => Self::Scss, } } @@ -94,9 +90,7 @@ impl From<ArbitraryStyleSyntax> for CompilerSyntax { impl ToTokens for ArbitraryStyleSyntax { fn to_tokens(&self, tokens: &mut TokenStream) { match self { - #[cfg(feature = "sass")] Self::Sass => tokens.append_all(quote! {"sass"}), - #[cfg(feature = "scss")] Self::Scss => tokens.append_all(quote! {"scss"}), } } @@ -114,9 +108,7 @@ impl Parse for ArbitraryStyleSyntax { let ident = input.parse::<Ident>()?; match ident.to_string().as_str() { - #[cfg(feature = "sass")] "sass" => Ok(Self::Sass), - #[cfg(feature = "scss")] "scss" => Ok(Self::Scss), _ => Err(syn::Error::new( ident.span(), @@ -132,9 +124,7 @@ impl Parse for ArbitraryStyleSyntax { impl Debug for ArbitraryStyleSyntax { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let name = match self { - #[cfg(feature = "sass")] Self::Sass => "sass", - #[cfg(feature = "scss")] Self::Scss => "scss", }; write!(f, "{name}") @@ -142,23 +132,15 @@ impl Debug for ArbitraryStyleSyntax { } impl Default for ArbitraryStyleSyntax { - #[cfg(feature = "scss")] fn default() -> Self { Self::Scss } - - #[cfg(all(feature = "sass", not(feature = "scss")))] - fn default() -> Self { - Self::Sass - } } impl From<ArbitraryStyleSyntax> for raffia::Syntax { fn from(value: ArbitraryStyleSyntax) -> Self { match value { - #[cfg(feature = "sass")] ArbitraryStyleSyntax::Sass => Self::Sass, - #[cfg(feature = "scss")] ArbitraryStyleSyntax::Scss => Self::Scss, } } @@ -166,7 +148,6 @@ impl From<ArbitraryStyleSyntax> for raffia::Syntax { #[cfg(test)] mod test { - #[cfg(feature = "sass")] #[test] fn arbitrary_style_block_sass() { use super::ArbitraryStyleBlock; @@ -183,7 +164,6 @@ mod test { assert_eq!(code, block.code); } - #[cfg(feature = "scss")] #[test] fn arbitrary_style_block_scss() { use super::ArbitraryStyleBlock; From 5d1897a914ee0dd437fdccf2d45de7f113d91956 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 17:15:40 +0500 Subject: [PATCH 102/184] im still learning to write actions --- .github/workflows/cbt.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index baa6f55..aed0fdd 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -22,4 +22,4 @@ jobs: - uses: actions/checkout@v4 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - run: cargo build --verbose - - run: cargo test --verbose -all --all-features + - run: cargo test --verbose --all --all-features From d997675b7e53d916b1e00814152a941a7cd64c5c Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 17:51:49 +0500 Subject: [PATCH 103/184] micro: set repistory for packages micro: fmt micro: set repistory for packages micro: release.toml micro: prepare for crates publish. Im crazy micro: prepare for crates publish. Im crazy micro: prepare for crates publish. Im crazy micro: prepare for crates publish. Im crazy micro: prepare for crates publish. Im crazy --- Cargo.lock | 10 +-- Cargo.toml | 15 ++--- examples/leptos-axum/README.md | 86 +------------------------ release.toml | 8 +++ sabry_build/Cargo.toml | 1 + sabry_build/README.md | 8 +++ sabry_build/src/buildmagic.rs | 8 +-- sabry_build/src/lib.rs | 2 + sabry_intrnl/Cargo.toml | 1 + sabry_intrnl/README.md | 8 +++ sabry_intrnl/src/lib.rs | 2 + sabry_procmacro/Cargo.toml | 1 + sabry_procmacro/README.md | 8 +++ sabry_procmacro/src/lib.rs | 2 + sabry_procmacro_impl/Cargo.toml | 1 + sabry_procmacro_impl/README.md | 8 +++ sabry_procmacro_impl/src/impls/sassy.rs | 11 ++-- sabry_procmacro_impl/src/lib.rs | 2 + 18 files changed, 74 insertions(+), 108 deletions(-) create mode 100644 release.toml create mode 100644 sabry_build/README.md create mode 100644 sabry_intrnl/README.md create mode 100644 sabry_procmacro/README.md create mode 100644 sabry_procmacro_impl/README.md diff --git a/Cargo.lock b/Cargo.lock index 1907822..74b0b99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -987,7 +987,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1" +version = "0.0.0" dependencies = [ "sabry_build", "sabry_intrnl", @@ -996,7 +996,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1" +version = "0.0.0" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1008,7 +1008,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1" +version = "0.0.0" dependencies = [ "base64", "blake3", @@ -1027,14 +1027,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1" +version = "0.0.0" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1" +version = "0.0.0" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 9bab5e4..7bce3ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,19 +10,17 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1"} -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1"} -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1"} -sabry_build = {path = "sabry_build", version = "0.0.1"} - - - +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.0"} +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.0"} +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.0"} +sabry_build = {path = "sabry_build", version = "0.0.0"} [workspace.package] -version = "0.0.1" +version = "0.0.0" edition = "2021" rust-version = "1.82" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] +repository = "https://github.com/yiffyrusdev/sabry" license = "MIT" publish = true @@ -30,6 +28,7 @@ publish = true name = "sabry" description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust." keywords = ["web", "sass", "scss", "macro"] +repository.workspace = true version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/examples/leptos-axum/README.md b/examples/leptos-axum/README.md index e5d3c4a..bbfcf13 100644 --- a/examples/leptos-axum/README.md +++ b/examples/leptos-axum/README.md @@ -3,88 +3,4 @@ <img src="https://raw.githubusercontent.com/leptos-rs/leptos/main/docs/logos/Leptos_logo_RGB.svg" alt="Leptos Logo"> </picture> -# Leptos Axum Starter Template - -This is a template for use with the [Leptos](https://github.com/leptos-rs/leptos) web framework and the [cargo-leptos](https://github.com/akesson/cargo-leptos) tool using [Axum](https://github.com/tokio-rs/axum). - -## Creating your template repo - -If you don't have `cargo-leptos` installed you can install it with - -```bash -cargo install cargo-leptos --locked -``` - -Then run -```bash -cargo leptos new --git https://github.com/leptos-rs/start-axum-0.7 -``` - -to generate a new project template. - -```bash -cd leptos-axum -``` - -to go to your newly created project. -Feel free to explore the project structure, but the best place to start with your application code is in `src/app.rs`. -Addtionally, Cargo.toml may need updating as new versions of the dependencies are released, especially if things are not working after a `cargo update`. - -## Running your project - -```bash -cargo leptos watch -``` - -## Installing Additional Tools - -By default, `cargo-leptos` uses `nightly` Rust, `cargo-generate`, and `sass`. If you run into any trouble, you may need to install one or more of these tools. - -1. `rustup toolchain install nightly --allow-downgrade` - make sure you have Rust nightly -2. `rustup target add wasm32-unknown-unknown` - add the ability to compile Rust to WebAssembly -3. `cargo install cargo-generate` - install `cargo-generate` binary (should be installed automatically in future) -4. `npm install -g sass` - install `dart-sass` (should be optional in future - -## Compiling for Release -```bash -cargo leptos build --release -``` - -Will generate your server binary in target/server/release and your site package in target/site - -## Testing Your Project -```bash -cargo leptos end-to-end -``` - -```bash -cargo leptos end-to-end --release -``` - -Cargo-leptos uses Playwright as the end-to-end test tool. -Tests are located in end2end/tests directory. - -## Executing a Server on a Remote Machine Without the Toolchain -After running a `cargo leptos build --release` the minimum files needed are: - -1. The server binary located in `target/server/release` -2. The `site` directory and all files within located in `target/site` - -Copy these files to your remote server. The directory structure should be: -```text -leptos-axum -site/ -``` -Set the following environment variables (updating for your project as needed): -```text -LEPTOS_OUTPUT_NAME="leptos-axum" -LEPTOS_SITE_ROOT="site" -LEPTOS_SITE_PKG_DIR="pkg" -LEPTOS_SITE_ADDR="127.0.0.1:3000" -LEPTOS_RELOAD_PORT="3001" -``` -Finally, run the server binary. - -## Licensing - -This template itself is released under the Unlicense. You should replace the LICENSE for your own application with an appropriate license if you plan to release it publicly. +This is an example of sabry with leptos-axum, made with [leptos-axum sterter template](https://github.com/leptos-rs/start-axum) diff --git a/release.toml b/release.toml new file mode 100644 index 0000000..d60c78b --- /dev/null +++ b/release.toml @@ -0,0 +1,8 @@ +allow-branch = ["master"] +sign-commit = true +sign-tag = true +target = "x86_64-unknown-linux-gnu" + +pre-release-replacements = [ + {file="README.md", search='sabry = {\s?version = "[0-9a-z\-\.]*"(?<rest>.*)\s?}', replace='sabry = { version = "{{version}}" $rest}'}, +] diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index c8f8a81..526a350 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -2,6 +2,7 @@ name = "sabry_build" description = "Sabry build magic as a separate crate" version.workspace = true +repository.workspace = true edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/sabry_build/README.md b/sabry_build/README.md new file mode 100644 index 0000000..51da6c9 --- /dev/null +++ b/sabry_build/README.md @@ -0,0 +1,8 @@ +sabry_build is an internal-ish part of the sabry lib, you should probably start from [here](https://crates.io/crates/sabry) + +There is very low probability, that you should depend on this crate, instead do: + +```rust,ignore +[dependencies] +sabry = {version = "0.0.1"} +``` diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index c3e6439..f9abcf7 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -4,15 +4,13 @@ use std::{ fs::{self, OpenOptions}, io::{self, Write}, path::PathBuf, - str::FromStr, vec, + str::FromStr, + vec, }; use sabry_intrnl::{ compiler::{CompilerAdapter, SabryCompilerError}, - config::{ - manifest::ManifestError, - BehavHashCollision, BehavSassModCollision, SabryConfig, - }, + config::{manifest::ManifestError, BehavHashCollision, BehavSassModCollision, SabryConfig}, scoper::{hash::ScopeHash, ArbitraryScope, ScopeError}, }; use sabry_procmacro_impl::impls::styly; diff --git a/sabry_build/src/lib.rs b/sabry_build/src/lib.rs index 180dbd0..ecac97d 100644 --- a/sabry_build/src/lib.rs +++ b/sabry_build/src/lib.rs @@ -1,3 +1,5 @@ +#![doc = include_str!("../README.md")] + pub mod buildmagic; pub mod filevisit; pub use buildmagic::*; diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 457d28f..19d7f51 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -2,6 +2,7 @@ name = "sabry_intrnl" description = "Sabry internal, yet still public library" version.workspace = true +repository.workspace = true edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md new file mode 100644 index 0000000..7c3e17d --- /dev/null +++ b/sabry_intrnl/README.md @@ -0,0 +1,8 @@ +sabry_intrnl is an internal-ish part of the sabry lib, you should probably start from [here](https://crates.io/crates/sabry) + +There is very low probability, that you should depend on this crate, instead do: + +```rust,ignore +[dependencies] +sabry = {version = "0.0.1"} +``` diff --git a/sabry_intrnl/src/lib.rs b/sabry_intrnl/src/lib.rs index ec12902..495a300 100644 --- a/sabry_intrnl/src/lib.rs +++ b/sabry_intrnl/src/lib.rs @@ -1,3 +1,5 @@ +#![doc = include_str!("../README.md")] + pub mod compiler; pub mod config; pub mod scoper; diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 70df668..932a3d2 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -2,6 +2,7 @@ name = "sabry_procmacro" description = "Sabry proc-macro declarations" version.workspace = true +repository.workspace = true edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md new file mode 100644 index 0000000..6de0068 --- /dev/null +++ b/sabry_procmacro/README.md @@ -0,0 +1,8 @@ +sabry_procmacro is an internal-ish part of the sabry lib, you should probably start from [here](https://crates.io/crates/sabry) + +There is very low probability, that you should depend on this crate, instead do: + +```rust,ignore +[dependencies] +sabry = {version = "0.0.1"} +``` diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index d5ede42..b05f1d9 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -1,3 +1,5 @@ +#![doc = include_str!("../README.md")] + use proc_macro::TokenStream; use sabry_procmacro_impl::impls::{ sassy::sassy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index 499f1ce..b170930 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -2,6 +2,7 @@ name = "sabry_procmacro_impl" description = "Sabry proc-macro internals reusable outside of proc-macro context" version.workspace = true +repository.workspace = true edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md new file mode 100644 index 0000000..eb13d81 --- /dev/null +++ b/sabry_procmacro_impl/README.md @@ -0,0 +1,8 @@ +sabry_procmacro_impl is an internal-ish part of the sabry lib, you should probably start from [here](https://crates.io/crates/sabry) + +There is very low probability, that you should depend on this crate, instead do: + +```rust,ignore +[dependencies] +sabry = {version = "0.0.1"} +``` diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index 6e89732..16fe436 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -1,7 +1,7 @@ use proc_macro2::TokenStream; use quote::quote; -use syn::{parse::Parse, Ident}; use regex::Regex; +use syn::{parse::Parse, Ident}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -50,7 +50,10 @@ impl Parse for MacroSyntax { // this is because of how parsing works. Need to find more elegant way though // TODO: find a more elegant way - code.code = Regex::new("\n ").expect("BUG: failed to build regex for indentation SASS").replace_all(&code.code, "\n").to_string(); + code.code = Regex::new("\n ") + .expect("BUG: failed to build regex for indentation SASS") + .replace_all(&code.code, "\n") + .to_string(); Ok(Self { ident, @@ -61,6 +64,4 @@ impl Parse for MacroSyntax { } #[cfg(test)] -mod test { - -} +mod test {} diff --git a/sabry_procmacro_impl/src/lib.rs b/sabry_procmacro_impl/src/lib.rs index daad739..8bc1266 100644 --- a/sabry_procmacro_impl/src/lib.rs +++ b/sabry_procmacro_impl/src/lib.rs @@ -1,3 +1,5 @@ +#![doc = include_str!("../README.md")] + // Moving this to separate crate, cuz I don't wanna to reimplement that parsing again for build magic // Also, because I can. From 9dd948b9bd319f829d8dba07ba3d278990c3edd8 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 18:35:14 +0500 Subject: [PATCH 104/184] chore: Release --- Cargo.lock | 10 +++++----- Cargo.toml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 74b0b99..91a3997 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -987,7 +987,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "sabry_build", "sabry_intrnl", @@ -996,7 +996,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1008,7 +1008,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "base64", "blake3", @@ -1027,14 +1027,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 7bce3ff..d244cf6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.0"} -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.0"} -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.0"} -sabry_build = {path = "sabry_build", version = "0.0.0"} +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-alpha.1" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-alpha.1" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-alpha.1" } +sabry_build = {path = "sabry_build", version = "0.0.1-alpha.1" } [workspace.package] -version = "0.0.0" +version = "0.0.1-alpha.1" edition = "2021" rust-version = "1.82" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 3e29ff82c34fcdb519573727e8126fcdd4cda6a4 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Wed, 30 Oct 2024 19:41:37 +0500 Subject: [PATCH 105/184] fix awfull typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d90fc0..775a6dc 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ Also, just about everything is pub-available in this crate - Sabry is ready for Feel free to check out examples: -|[crate of styles](./examples//define-styles/)|[style usage](./examples/use-styles/)|[leptox-axum with sabry](./examples/leptos-axum)| +|[crate of styles](./examples//define-styles/)|[style usage](./examples/use-styles/)|[leptos-axum with sabry](./examples/leptos-axum)| |-|-|-| ### Create a crate full of arbitrary SASS From 143f7ab6c0f1b348490cd7cffd76b1d24a68ee0b Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 06:06:00 +0500 Subject: [PATCH 106/184] wow, nice badges --- LICENSE | 21 +++++++++++++++++++++ README.md | 24 ++++++++++++++---------- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/LICENSE b/LICENSE index e69de29..c63862d 100644 --- a/LICENSE +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Svyatoslav Pushkarev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 775a6dc..ea37bb7 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ > > the latest-trashy state is in the "window" branch +[![Crates.io](https://img.shields.io/crates/v/sabry.svg)](https://crates.io/crates/sabry) +[![Docs.rs](https://img.shields.io/docsrs/sabry/latest.svg)](https://docs.rs/sabry) +[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/yiffyrusdev/sabry/blob/master/LICENSE) + At first, I'll show how this crate "tastes". With SABRY, its in your power to: <table> @@ -65,7 +69,7 @@ tgk_brandstyle = {version = "0.0.1", features = ["utils"]} `@use` your style-crates in sass code *naturally* ```rust,ignore -styly!(breadcumb { +styly!(breadbadge { @use 'tokens'; .scope {@include tokens.badge(primary);} }) @@ -176,11 +180,11 @@ sabry = {version = "0.0.1"} ``` And create a style scope wherever you want: ```rust,ignore -// breadcumblist.rs +// breadbadgelist.rs use sabry::styly; styly!(const styles { - .cumbs { + .badges { display: flex; &__list { display: flex; @@ -192,8 +196,8 @@ styly!(const styles { }); fn render() -> HtmlElement { - div().class(styles::cumbs).chain( - ul().class(styles::_list(styles::cumbs)) + div().class(styles::badges).chain( + ul().class(styles::_list(styles::badges)) ).chain( span().id(styles::thewolf) ) @@ -201,7 +205,7 @@ fn render() -> HtmlElement { ``` > That `const` usage is covered in the [following](#constant-styly-scopes) section. In this example we dont invoke sabry build-magic, so, to be as close to real life as possible, I used a const. -Every selector, if that does make sense, now available for you as a member of `styles` scope. In this example - `styles::cumbs`, `styles::thewolf` and `styles::_list()`. More about scoping and member names you can read [here](#styly-scopes). +Every selector, if that does make sense, now available for you as a member of `styles` scope. In this example - `styles::badges`, `styles::thewolf` and `styles::_list()`. More about scoping and member names you can read [here](#styly-scopes). ### Use styles earlier created in another crate @@ -238,12 +242,12 @@ fn main(){ Now lets get back to the code and use the mixin defined in another crate: ```rust,ignore -// breadcumblist.rs +// breadbadgelist.rs use sabry::styly; styly!(styles { @use "mixins"; - .cumbs { + .badges { display: flex; &__list { display: flex; @@ -255,8 +259,8 @@ styly!(styles { }); fn render() -> HtmlElement { - div().class(styles::cumbs).chain( - ul().class(styles::_list(styles::cumbs)) + div().class(styles::badges).chain( + ul().class(styles::_list(styles::badges)) ).chain( span().id(styles::thewolf) ) From bf88476cb8241f160615c78023faac1e15d89aef Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 08:07:24 +0500 Subject: [PATCH 107/184] more comprehensive error messages on file load --- sabry_procmacro_impl/src/impls/mod.rs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index c2420e2..a6876d8 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -1,4 +1,4 @@ -use std::{fmt::Debug, fs}; +use std::{fmt::Debug, fs, path::PathBuf, str::FromStr}; use proc_macro2::{Span, TokenStream}; use quote::{quote, ToTokens, TokenStreamExt}; @@ -36,9 +36,28 @@ impl Parse for ArbitraryStyleBlock { let (code, span) = if let Ok(path_tok) = input.parse::<LitStr>() { let path = path_tok.value(); - let iofile = match fs::read(&path) { + let path = match PathBuf::from_str(&path) { + Ok(p) => p, + Err(_) => { + return Err(syn::Error::new( + path_tok.span(), + format!("Could not read {} as a path: Infallible", path), + )) + } + }; + let fullpath = match path.canonicalize() { + Ok(cp) => cp, + Err(e) => { + return Err(syn::Error::new( + path_tok.span(), + format!("Could not use path {path:?}: {:?}", e.kind()), + )) + } + }; + + let iofile = match fs::read(&fullpath) { Ok(bf) => bf, - Err(_) => return Err(syn::Error::new(path_tok.span(), format!("Could not read file '{path}'. Perhaps its relative? Thats not currently supported :("))) + Err(_) => return Err(syn::Error::new(path_tok.span(), format!("Could not read file at {fullpath:?}"))) }; let code = String::from_utf8_lossy(&iofile).to_string(); From ecf5e96a8673bee6ba3eaf72a13a4563a1975c3c Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 08:07:43 +0500 Subject: [PATCH 108/184] example with files --- examples/define-styles/Cargo.lock | 50 +++------------------------ examples/define-styles/src/lib.rs | 2 ++ examples/define-styles/src/style.scss | 5 +++ 3 files changed, 12 insertions(+), 45 deletions(-) create mode 100644 examples/define-styles/src/style.scss diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index 963559d..ce5f0bc 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -994,28 +994,15 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1" +version = "0.0.1-alpha.1" dependencies = [ - "sabry_build", "sabry_intrnl", "sabry_procmacro", ] -[[package]] -name = "sabry_build" -version = "0.0.0" -dependencies = [ - "proc-macro2", - "sabry_intrnl", - "sabry_procmacro_impl", - "syn 2.0.85", - "thiserror", - "walkdir", -] - [[package]] name = "sabry_intrnl" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "base64", "blake3", @@ -1023,6 +1010,7 @@ dependencies = [ "grass", "lightningcss", "proc-macro2", + "quote", "raffia", "regex", "serde", @@ -1033,14 +1021,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.0" +version = "0.0.1-alpha.1" dependencies = [ "proc-macro2", "quote", @@ -1050,15 +1038,6 @@ dependencies = [ "syn 2.0.85", ] -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -1290,16 +1269,6 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1361,15 +1330,6 @@ version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys", -] - [[package]] name = "windows-sys" version = "0.59.0" diff --git a/examples/define-styles/src/lib.rs b/examples/define-styles/src/lib.rs index bdf62c3..d53f80c 100644 --- a/examples/define-styles/src/lib.rs +++ b/examples/define-styles/src/lib.rs @@ -1,5 +1,7 @@ use sabry::sassy; +sassy!(style "src/style.scss"); + sassy!(utils { @mixin flex($direction, $align, $justify, $gap: .5rem) { display: flex; diff --git a/examples/define-styles/src/style.scss b/examples/define-styles/src/style.scss new file mode 100644 index 0000000..d60a314 --- /dev/null +++ b/examples/define-styles/src/style.scss @@ -0,0 +1,5 @@ +@use "theme" as *; + +.codeblock { + background: $thm-surface-primary; +} From 230d7899db1210464cf4fa190b7177ee5c8f5952 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 08:55:00 +0500 Subject: [PATCH 109/184] introduce lepty-scoping, which is more effective and more nice - especially with leptos --- .github/workflows/cbt.yml | 3 +- Cargo.lock | 1 + Cargo.toml | 3 + README.md | 69 +++++++++++++++++++++ examples/leptos-axum/Cargo.toml | 9 +-- examples/leptos-axum/src/routes/home.rs | 26 +++----- examples/leptos-axum/src/routes/home.scss | 11 ++++ sabry_intrnl/Cargo.toml | 2 + sabry_intrnl/src/scoper/mod.rs | 73 +++++++++++++++++++---- 9 files changed, 162 insertions(+), 35 deletions(-) diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index aed0fdd..b8773f0 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -6,7 +6,7 @@ on: pull_request: branches: ["window"] -env: +env: CARGO_TERM_COLOR: always jobs: @@ -22,4 +22,5 @@ jobs: - uses: actions/checkout@v4 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - run: cargo build --verbose + - run: cargo test --verbose --all - run: cargo test --verbose --all --all-features diff --git a/Cargo.lock b/Cargo.lock index 91a3997..bd98667 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1012,6 +1012,7 @@ version = "0.0.1-alpha.1" dependencies = [ "base64", "blake3", + "cfg-if", "const_format", "grass", "lightningcss", diff --git a/Cargo.toml b/Cargo.toml index d244cf6..1cc9c1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,6 +43,9 @@ sabry_intrnl = {workspace = true} [features] default = ["procmacro"] +lepty-scoping = [ + "sabry_intrnl/lepty-scoping" +] procmacro = [ "dep:sabry_procmacro" ] diff --git a/README.md b/README.md index ea37bb7..34f0d86 100644 --- a/README.md +++ b/README.md @@ -268,6 +268,73 @@ fn render() -> HtmlElement { ``` So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` function call is now accessible with simple and natural `@use "mixins"` SASS rule! +### Leptos specials + +With [leptos](https://github.com/leptos-rs/leptos) framework you can do the trick to apply some class to most of HtmlElements for the entire component/island: + +```rust,ignore +#[component] +fn component() -> impl IntoView { + view! {class="cls1", /* <- here */ + <h1>"Head"</h1> + <p>"text"</p> + } +} +``` +... and have "cls1" on both `h1` and `p` auto-assigned. Isn't this cool? + +So, if you're on leptos, and don't mind to take this approach, I'd highly recommend turning the *lepty-scoping* feature on: + +```toml +# Cargo.toml + +[dependencies] +sabry = {version = "0.0.1", features = ["lepty-scoping"]} + +[build-dependencies] +sabry = {version = "0.0.1", features = ["build", "lepty-scoping"]} +``` + +```rust,ignore +styly!(scope { + @use "tokens"; + h1 { + @include tokens.sectionhead(); + img { + @include tokens.sectionimg(); + } + } + .breadcumbs { + @include tokens.badgelist(); + &__item { + @include tokens.badge(secondary); + } + } +}); + +#[component] +fn component() -> impl IntoView { + view! {class=SCOPE, + <h1> + "Head" + <img src="whatever"/> + </h1> + <ul class=scope::breadcumbs> + <li class=scope::___item(scope::breadcumbs)> + "Home page" + </li> + </ul> + } +} +``` + +That will perform *much* better: + +- All scope members - like `scope::breadcumbs` - wont contain repeating scope hash, just the original class/id selector +- You will not encounter [the catch](#scoping) with nested tagname selectors + +Also, this isn't really exclusive leptos-supporting feature. It just changes scoping behavour. + ## Configuration Sabry configuration lives in `[package.metadata.sabry]` table of the manifest file. @@ -535,6 +602,8 @@ Different selector types are scoped differently: > > Also if there are nested tagname selectors - sabry won't take this into account and you'll > have to wrap them with `SCOPE` class as well +> +> **However** If you are able to apply some class to all html elements you have - like `view!{class=CLASS...}` with Leptos - you could use *lepty-scoping* feature flag for sabry and get rid of this catch! See more [here](#leptos-specials). As for **SASS parent selectors**: they are currently handled in different way. Instead of walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 1b30dbb..39e1e43 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -23,11 +23,11 @@ tracing = { version = "0.1", optional = true } http = "1" # sabry with sass -sabry = {path = "../../"} +sabry = {path = "../../", features = ["lepty-scoping"]} [build-dependencies] # sabry for build with sass -sabry = {path = "../../", features = ["build"]} +sabry = {path = "../../", features = ["build", "lepty-scoping"]} # lets depend on our styles define-styles = {path = "../define-styles"} @@ -51,11 +51,12 @@ css.minify = true css.bundle = "target/.sabry/target/bundle.css" [package.metadata.leptos] +# Sabry-specific quality of life config +style-file = "target/.sabry/target/bundle.css" + output-name = "leptos-axum" site-root = "target/site" site-pkg-dir = "pkg" -# Sabry-generated bundle for leptos -style-file = "target/.sabry/target/bundle.css" assets-dir = "public" site-addr = "127.0.0.1:3000" reload-port = 3001 diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index 0e06caf..1c006db 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -1,18 +1,7 @@ use leptos::prelude::*; use sabry::styly; -styly!(s "src/routes/home.scss"); - -styly!(s2 { - @use "theme"; - .card { - @include theme.surface(secondary); - } - .pocwarn { - @include theme.surface(secondary); - text-transform: uppercase; - } -}); +styly!(style "src/routes/home.scss"); /// Renders the home page of your application. #[component] @@ -21,13 +10,14 @@ pub fn Route() -> impl IntoView { let count = RwSignal::new(0); let on_click = move |_| *count.write() += 1; - view! { - <section class=s::table> + view! {class = STYLE, + <section class=style::table> <h1>"Welcome to Leptos!"</h1> - <button class=s::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> - <span class=s2::card>"DISCLAIMER:"</span> - <p class=s2::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> - <p class=s2::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> + <button class=style::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <button class=style::_dark(style::btn) on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <span class=style::card>"DISCLAIMER:"</span> + <p class=style::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> + <p class=style::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> </section> } } diff --git a/examples/leptos-axum/src/routes/home.scss b/examples/leptos-axum/src/routes/home.scss index 67e7ec1..d9ef063 100644 --- a/examples/leptos-axum/src/routes/home.scss +++ b/examples/leptos-axum/src/routes/home.scss @@ -4,9 +4,20 @@ .btn { @include tokens.clickable(accent); + &-dark { + @include tokens.clickable(secondary, 0.8, 1.1); + } } .table { @include utils.flex(column, center, center); @include theme.surface(primary); } + +.card { + @include theme.surface(secondary); +} +.pocwarn { + @include theme.surface(secondary); + text-transform: uppercase; +} diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 19d7f51..41c5cbc 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -23,5 +23,7 @@ const_format = {version = "^0.2"} thiserror = {version = "^1.0"} serde = {version = "^1.0", features = ["derive"]} toml = {version = "^0.8"} +cfg-if = {version = "^1.0"} [features] +lepty-scoping = [] diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 658e8f0..0d82a7d 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -1,3 +1,4 @@ +use cfg_if::cfg_if; use hash::ScopeHash; use raffia::Spanned; use regex::Regex; @@ -187,10 +188,22 @@ impl HashedSelector { // As we dont want to use two HTML props for a single ID, // ID scoping is done with id modification ScopedSelector::Id(a) => { - format!("{}-{}", hash.as_str(), a.ident) + cfg_if! { + if #[cfg(feature = "lepty-scoping")] { + format!("{}.{}", a.ident, hash.as_str()) + } else { + format!("{}-{}", hash.as_str(), a.ident) + } + } } ScopedSelector::Tag(a) => { - format!(".{} {}", hash.as_str(), a.ident) + cfg_if! { + if #[cfg(feature = "lepty-scoping")] { + format!("{}.{}", a.ident, hash.as_str()) + } else { + format!(".{} {}", hash.as_str(), a.ident) + } + } } } } @@ -205,10 +218,26 @@ impl HashedSelector { pub fn make_hashed_html(value: &ScopedSelector, hash: &ScopeHash) -> Option<String> { match value { // Class scoping is done with class composition - ScopedSelector::Class(a) => Some(format!("{} {}", hash.as_str(), a.ident)), + ScopedSelector::Class(a) => { + cfg_if! { + if #[cfg(feature = "lepty-scoping")] { + Some(a.ident.to_string()) + } else { + Some(format!("{} {}", hash.as_str(), a.ident)) + } + } + }, // As we dont want to use two HTML props for a single ID, // ID scoping is done with id modification - ScopedSelector::Id(a) => Some(format!("{}-{}", hash.as_str(), a.ident)), + ScopedSelector::Id(a) => { + cfg_if! { + if #[cfg(feature = "lepty-scoping")] { + Some(a.ident.to_string()) + } else { + Some(format!("{}-{}", hash.as_str(), a.ident)) + } + } + }, ScopedSelector::Tag(_) => None, } } @@ -330,6 +359,7 @@ pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { mod test { use std::collections::HashSet; + use cfg_if::cfg_if; use syn::Ident; use crate::{ @@ -345,14 +375,33 @@ mod test { ".cls1{color:red; &-dark{color: black;} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; let hash = ScopeHash::test_init("F2kf8nMs".into()); - let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; - let expect_selector_htmls = HashSet::from([ - "F2kf8nMs cls1".to_string(), - "F2kf8nMs-id1".to_string(), - "F2kf8nMs cls3".to_string(), - "F2kf8nMs-id2".to_string(), - "".to_string(), // comes from `div` which has no html hashed code, still want to check presense - ]); + cfg_if! { + if #[cfg(feature = "lepty-scoping")]{ + let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #id1.F2kf8nMs {color:green;} div.F2kf8nMs {color:blue;}} .F2kf8nMs.cls3#id2.F2kf8nMs{color: black;}"; + } else { + let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; + } + } + + cfg_if! { + if #[cfg(feature = "lepty-scoping")] { + let expect_selector_htmls = HashSet::from([ + "cls1".to_string(), + "id1".to_string(), + "cls3".to_string(), + "id2".to_string(), + "".to_string(), // comes from `div` which has no html hashed code, still want to check presense + ]); + } else { + let expect_selector_htmls = HashSet::from([ + "F2kf8nMs cls1".to_string(), + "F2kf8nMs-id1".to_string(), + "F2kf8nMs cls3".to_string(), + "F2kf8nMs-id2".to_string(), + "".to_string(), // comes from `div` which has no html hashed code, still want to check presense + ]); + } + } let scope = ArbitraryScope::from_source( raffia::Syntax::Scss, From e64c4df1f00dd7b1e9a26d4803bb163f1c2dced3 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 09:15:42 +0500 Subject: [PATCH 110/184] use lepty-scoping in examples --- README.md | 2 ++ examples/leptos-axum/src/routes/home.rs | 44 +++++++++++++++++++++-- examples/leptos-axum/src/routes/home.scss | 23 ------------ 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 34f0d86..6ab6e0b 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,8 @@ Every selector, if that does make sense, now available for you as a member of `s ### Use styles earlier created in another crate +> **Tip** | If you use [leptos](https://github.com/leptos-rs/leptos) - check [this](#leptos-specials) section as well + The combination of previous two, with some additional work to do and some extra sugar to enjoy. Sabry is needed as both dependency and build-dependency. diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index 1c006db..b79682d 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -1,7 +1,41 @@ use leptos::prelude::*; use sabry::styly; -styly!(style "src/routes/home.scss"); +styly!(style { + @use "tokens"; + @use "utils"; + @use "theme"; + + h2 { + margin-bottom: 1rem; + @include theme.surface(primary); + @include theme.txt(primary); + span { + @include theme.txt(accent); + } + } + + .btn { + @include tokens.clickable(accent); + &-dark { + @include tokens.clickable(secondary, 0.8, 1.1); + } + } + + .table { + @include utils.flex(column, center, center); + @include theme.surface(primary); + } + + .card { + @include theme.surface(secondary); + } + .pocwarn { + @include theme.surface(secondary); + text-transform: uppercase; + } + +}); /// Renders the home page of your application. #[component] @@ -12,7 +46,13 @@ pub fn Route() -> impl IntoView { view! {class = STYLE, <section class=style::table> - <h1>"Welcome to Leptos!"</h1> + <h2>"Welcome to Leptos"</h2> + <h2 class=""> + "This head is styled with lepty-scopes feature" + <br/> + <span class="">"And this child too!"</span> + </h2> + <button class=style::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> <button class=style::_dark(style::btn) on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> <span class=style::card>"DISCLAIMER:"</span> diff --git a/examples/leptos-axum/src/routes/home.scss b/examples/leptos-axum/src/routes/home.scss index d9ef063..e69de29 100644 --- a/examples/leptos-axum/src/routes/home.scss +++ b/examples/leptos-axum/src/routes/home.scss @@ -1,23 +0,0 @@ -@use "tokens"; -@use "utils"; -@use "theme"; - -.btn { - @include tokens.clickable(accent); - &-dark { - @include tokens.clickable(secondary, 0.8, 1.1); - } -} - -.table { - @include utils.flex(column, center, center); - @include theme.surface(primary); -} - -.card { - @include theme.surface(secondary); -} -.pocwarn { - @include theme.surface(secondary); - text-transform: uppercase; -} From 154b0b0ae25b4b3a7c445ebbdbf28dbb72a816ed Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 09:20:00 +0500 Subject: [PATCH 111/184] chore: Release --- Cargo.lock | 10 +++++----- Cargo.toml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd98667..edd82bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -987,7 +987,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_build", "sabry_intrnl", @@ -996,7 +996,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1008,7 +1008,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "base64", "blake3", @@ -1028,14 +1028,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 1cc9c1a..91f3a93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-alpha.1" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-alpha.1" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-alpha.1" } -sabry_build = {path = "sabry_build", version = "0.0.1-alpha.1" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-alpha.2" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-alpha.2" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-alpha.2" } +sabry_build = {path = "sabry_build", version = "0.0.1-alpha.2" } [workspace.package] -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" edition = "2021" rust-version = "1.82" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From e433a5d66c8a778d4f4173e8fefa01caa58b390a Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Thu, 31 Oct 2024 17:07:03 +0500 Subject: [PATCH 112/184] docs deserve to be tested --- Cargo.lock | 1087 +++++++++++++++++++++++++++++++++++- Cargo.toml | 5 +- README.md | 79 +-- sabry_procmacro/src/lib.rs | 8 +- tests/assets/mixins.sass | 5 + tests/assets/mixins.scss | 9 + 6 files changed, 1130 insertions(+), 63 deletions(-) create mode 100644 tests/assets/mixins.sass create mode 100644 tests/assets/mixins.scss diff --git a/Cargo.lock b/Cargo.lock index edd82bf..250df59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,6 +90,23 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "any_spawner" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9747eb01aed7603aba23f7c869d5d7e5d37aab9c3501aced42d8fdb786f1f6e3" +dependencies = [ + "futures", + "thiserror", + "wasm-bindgen-futures", +] + +[[package]] +name = "anyhow" +version = "1.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" + [[package]] name = "arrayref" version = "0.3.9" @@ -102,6 +119,47 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "attribute-derive" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f1ee502851995027b06f99f5ffbeffa1406b38d0b318a1ebfa469332c6cbafd" +dependencies = [ + "attribute-derive-macro", + "derive-where", + "manyhow", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "attribute-derive-macro" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3601467f634cfe36c4780ca9c75dea9a5b34529c1f2810676a337e7e0997f954" +dependencies = [ + "collection_literals", + "interpolator", + "manyhow", + "proc-macro-utils 0.8.0", + "proc-macro2", + "quote", + "quote-use", + "syn 2.0.85", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -194,6 +252,12 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" + [[package]] name = "cc" version = "1.1.31" @@ -236,18 +300,57 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +[[package]] +name = "codee" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d3ad3122b0001c7f140cf4d605ef9a9e2c24d96ab0b4fb4347b76de2425f445" +dependencies = [ + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "codemap" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" +[[package]] +name = "collection_literals" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" + [[package]] name = "colorchoice" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "config" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" +dependencies = [ + "convert_case", + "nom", + "pathdiff", + "serde", + "toml", +] + [[package]] name = "const-str" version = "0.3.2" @@ -288,6 +391,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "const_str_slice_concat" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67855af358fcb20fac58f9d714c94e2b228fe5694c1c9b4ead4a366343eda1b" + [[package]] name = "constant_time_eq" version = "0.3.1" @@ -373,6 +482,20 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" version = "2.6.0" @@ -388,6 +511,23 @@ dependencies = [ "matches", ] +[[package]] +name = "derive-where" +version = "1.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "drain_filter_polyfill" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" + [[package]] name = "dtoa" version = "1.0.9" @@ -409,18 +549,152 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "either_of" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6e22feb4d5cacf9f2c64902a1c35ef0f2d766e42db316a98b93992bbce669cb" +dependencies = [ + "pin-project-lite", +] + [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "funty" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "fxhash" version = "0.2.1" @@ -443,6 +717,40 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "grass" version = "0.13.4" @@ -468,6 +776,12 @@ dependencies = [ "rand", ] +[[package]] +name = "guardian" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "493913a18c0d7bebb75127a26a432162c59edbe06f6cf712001e3e769345e8b5" + [[package]] name = "hashbrown" version = "0.12.3" @@ -499,6 +813,50 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "html-escape" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" +dependencies = [ + "utf8-width", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "hydration_context" +version = "0.2.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3572b2778f74f110d907744b8d44be3602f1588aa5b7a098d8911a5d806b7f1" +dependencies = [ + "futures", + "once_cell", + "or_poisoned", + "pin-project-lite", + "serde", + "throw_error", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" version = "2.6.0" @@ -509,6 +867,12 @@ dependencies = [ "hashbrown 0.15.0", ] +[[package]] +name = "interpolator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -524,6 +888,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -532,9 +905,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -554,6 +927,129 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leptos" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf56a5fa2a3ca01c4b49255a66375612ddd138aeef2ffe11f7157ea3e349a82" +dependencies = [ + "any_spawner", + "cfg-if", + "either_of", + "futures", + "hydration_context", + "leptos_config", + "leptos_dom", + "leptos_hot_reload", + "leptos_macro", + "leptos_server", + "oco_ref", + "or_poisoned", + "paste", + "reactive_graph", + "rustc-hash", + "send_wrapper", + "serde", + "serde_qs", + "server_fn", + "slotmap", + "tachys", + "thiserror", + "throw_error", + "typed-builder", + "typed-builder-macro", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_config" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b972bec4a29c0a351fa54736b70eb9eda05938f732d1ec659f63887a5208c4bd" +dependencies = [ + "config", + "regex", + "serde", + "thiserror", + "typed-builder", +] + +[[package]] +name = "leptos_dom" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ccab6ce79c7428460451e43edf052c5344a682058666f8ef19c19e898387fca" +dependencies = [ + "js-sys", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "tachys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_hot_reload" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1406f4641b5521324f3c5845f065e8a67b60147ee1aae56721dc2ba7c317dc2" +dependencies = [ + "anyhow", + "camino", + "indexmap", + "parking_lot", + "proc-macro2", + "quote", + "rstml", + "serde", + "syn 2.0.85", + "walkdir", +] + +[[package]] +name = "leptos_macro" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62fa728becd72d6f08cc9f93db3a712b4e068edb8b8af2da5b933bd3d1dcede" +dependencies = [ + "attribute-derive", + "cfg-if", + "convert_case", + "html-escape", + "itertools 0.13.0", + "leptos_hot_reload", + "prettyplease", + "proc-macro-error2", + "proc-macro2", + "quote", + "rstml", + "server_fn_macro", + "syn 2.0.85", + "uuid", +] + +[[package]] +name = "leptos_server" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc869a5f93379eec0b4af337bfe953a6b6b7a20223c56ab6dbde7798d0296b4" +dependencies = [ + "any_spawner", + "base64", + "codee", + "futures", + "hydration_context", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "serde", + "serde_json", + "server_fn", + "tachys", +] + [[package]] name = "libc" version = "0.2.161" @@ -571,10 +1067,10 @@ dependencies = [ "const-str", "cssparser", "cssparser-color", - "dashmap", + "dashmap 5.5.3", "data-encoding", "getrandom", - "itertools", + "itertools 0.10.5", "lazy_static", "lightningcss-derive", "parcel_selectors", @@ -598,6 +1094,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "linear-map" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" + [[package]] name = "lock_api" version = "0.4.12" @@ -614,6 +1116,29 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "manyhow" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91ea592d76c0b6471965708ccff7e6a5d277f676b90ab31f4d3f3fc77fade64" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "manyhow-macros" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64621e2c08f2576e4194ea8be11daf24ac01249a4f53cd8befcbb7077120ead" +dependencies = [ + "proc-macro-utils 0.8.0", + "proc-macro2", + "quote", +] + [[package]] name = "matches" version = "0.1.10" @@ -626,12 +1151,50 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "next_tuple" +version = "0.1.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5154cd29823504d933fa19d02dd52f9f692cf9e337653f1409db70863fa5cd49" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "oco_ref" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b94982fe39a861561cf67ff17a7849f2cedadbbad960a797634032b7abb998" +dependencies = [ + "serde", + "thiserror", +] + [[package]] name = "once_cell" version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "or_poisoned" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" + [[package]] name = "outref" version = "0.1.0" @@ -668,6 +1231,22 @@ dependencies = [ "vlq", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + [[package]] name = "parking_lot_core" version = "0.9.10" @@ -693,6 +1272,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "phf" version = "0.10.1" @@ -773,6 +1358,38 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -788,6 +1405,83 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +dependencies = [ + "proc-macro2", + "syn 2.0.85", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "proc-macro-utils" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f59e109e2f795a5070e69578c4dc101068139f74616778025ae1011d4cd41a8" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + [[package]] name = "proc-macro2" version = "1.0.89" @@ -797,6 +1491,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", + "version_check", + "yansi", +] + [[package]] name = "ptr_meta" version = "0.1.4" @@ -826,6 +1533,28 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "quote-use" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9619db1197b497a36178cfc736dc96b271fe918875fbf1344c436a7e93d0321e" +dependencies = [ + "quote", + "quote-use-macros", +] + +[[package]] +name = "quote-use-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82ebfb7faafadc06a7ab141a6f67bcfb24cb8beb158c6fe933f2f035afa99f35" +dependencies = [ + "proc-macro-utils 0.10.0", + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "radium" version = "0.7.0" @@ -903,6 +1632,55 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "reactive_graph" +version = "0.1.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e99ef30cfb23ffd2da6bbfcfa218c043003fdc40909102b52e9cc48707894e8" +dependencies = [ + "any_spawner", + "async-lock", + "futures", + "guardian", + "hydration_context", + "or_poisoned", + "pin-project-lite", + "rustc-hash", + "send_wrapper", + "serde", + "slotmap", + "thiserror", + "web-sys", +] + +[[package]] +name = "reactive_stores" +version = "0.1.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8062a7f178f934c17145a4dab0e8f0bf8879975ce72e1146b9bcd3bc6f342c19" +dependencies = [ + "guardian", + "itertools 0.13.0", + "or_poisoned", + "paste", + "reactive_graph", + "reactive_stores_macro", + "rustc-hash", +] + +[[package]] +name = "reactive_stores_macro" +version = "0.1.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1262c9b4c1633da17472d69a2bc7d4709780c616e919b236e51949f160d2ab2e" +dependencies = [ + "convert_case", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "redox_syscall" version = "0.5.7" @@ -979,6 +1757,27 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rstml" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51187e564f12336ef40cd04f6f4d805d6919188001dcf1e0a021898ea0fe28ce" +dependencies = [ + "derive-where", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.85", + "syn_derive", + "thiserror", +] + +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "ryu" version = "1.0.18" @@ -989,6 +1788,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" name = "sabry" version = "0.0.1-alpha.2" dependencies = [ + "leptos", "sabry_build", "sabry_intrnl", "sabry_procmacro", @@ -1067,19 +1867,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] -name = "serde" -version = "1.0.213" +name = "send_wrapper" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" +dependencies = [ + "futures-core", +] + +[[package]] +name = "serde" +version = "1.0.214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", @@ -1098,6 +1907,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_qs" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6" +dependencies = [ + "percent-encoding", + "serde", + "thiserror", +] + [[package]] name = "serde_spanned" version = "0.6.8" @@ -1107,6 +1927,60 @@ dependencies = [ "serde", ] +[[package]] +name = "server_fn" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2397ddd8c45c2379d3b596e978f8edc6548572c669730d0e69c8aac3117679c2" +dependencies = [ + "bytes", + "const_format", + "dashmap 6.1.0", + "futures", + "gloo-net", + "http", + "js-sys", + "once_cell", + "pin-project-lite", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn_macro_default", + "thiserror", + "throw_error", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0965c30b56ec0f1cdd15464f4ce4abd83d06fe582c9c2fbcf61ee7e1453c805" +dependencies = [ + "const_format", + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.85", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro_default" +version = "0.7.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08bce1bdbe13e78fba58b3e1323b25597bc9c14ae59825299d7f6b10f819286" +dependencies = [ + "server_fn_macro", + "syn 2.0.85", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1134,6 +2008,24 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.13.2" @@ -1168,6 +2060,50 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "tachys" +version = "0.1.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4061a2262552cb95969488266f015c14b52539e92d2ada077ac170b3a1b458ba" +dependencies = [ + "any_spawner", + "const_str_slice_concat", + "drain_filter_polyfill", + "either_of", + "futures", + "html-escape", + "indexmap", + "itertools 0.13.0", + "js-sys", + "linear-map", + "next_tuple", + "oco_ref", + "once_cell", + "or_poisoned", + "parking_lot", + "paste", + "reactive_graph", + "reactive_stores", + "rustc-hash", + "send_wrapper", + "slotmap", + "throw_error", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "tap" version = "1.0.1" @@ -1194,6 +2130,15 @@ dependencies = [ "syn 2.0.85", ] +[[package]] +name = "throw_error" +version = "0.2.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f94a0abd02fad5a46b04748c89c32d2b5784bbb046fb6675f186e0bd45cd415c" +dependencies = [ + "pin-project-lite", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -1243,12 +2188,47 @@ dependencies = [ "winnow", ] +[[package]] +name = "typed-builder" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06fbd5b8de54c5f7c91f6fe4cebb949be2125d7758e630bb58b1d831dbce600" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9534daa9fd3ed0bd911d462a37f172228077e7abf18c18a5f67199d959205f8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -1261,6 +2241,23 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + [[package]] name = "utf8parse" version = "0.2.2" @@ -1272,6 +2269,9 @@ name = "uuid" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +dependencies = [ + "getrandom", +] [[package]] name = "version_check" @@ -1303,9 +2303,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", "once_cell", @@ -1314,9 +2314,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", @@ -1328,10 +2328,22 @@ dependencies = [ ] [[package]] -name = "wasm-bindgen-macro" -version = "0.2.95" +name = "wasm-bindgen-futures" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1339,9 +2351,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", @@ -1352,9 +2364,32 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "wasm-streams" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] [[package]] name = "winapi-util" @@ -1456,6 +2491,18 @@ dependencies = [ "tap", ] +[[package]] +name = "xxhash-rust" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "zerocopy" version = "0.7.35" diff --git a/Cargo.toml b/Cargo.toml index 91f3a93..29b8912 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ publish = true [package] name = "sabry" -description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust." +description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust" keywords = ["web", "sass", "scss", "macro"] repository.workspace = true version.workspace = true @@ -41,6 +41,9 @@ sabry_procmacro = {workspace = true, optional = true} sabry_build = {workspace = true, optional = true} sabry_intrnl = {workspace = true} +[dev-dependencies] +leptos = {version = "0.7.0-gamma3"} + [features] default = ["procmacro"] lepty-scoping = [ diff --git a/README.md b/README.md index 6ab6e0b..ea5625f 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ Also, just about everything is pub-available in this crate - Sabry is ready for Feel free to check out examples: -|[crate of styles](./examples//define-styles/)|[style usage](./examples/use-styles/)|[leptos-axum with sabry](./examples/leptos-axum)| +|[crate of styles](https://github.com/yiffyrusdev/sabry/tree/master/examples/define-styles)|[style usage](https://github.com/yiffyrusdev/sabry/tree/master/examples/use-styles)|[leptos-axum with sabry](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum)| |-|-|-| ### Create a crate full of arbitrary SASS @@ -148,11 +148,11 @@ The only need is the dependency sabry = {version = "0.0.1"} ``` And a proc-macro -```rust,ignore +```rust // lib.rs use sabry::sassy; -sassy!(mixins "assets/mixins.scss"); +sassy!(mixins "tests/assets/mixins.scss"); sassy!(styles { $primary-color: black; @mixin colored($col: primary) { @@ -179,7 +179,7 @@ Depend on sabry sabry = {version = "0.0.1"} ``` And create a style scope wherever you want: -```rust,ignore +```rust // breadbadgelist.rs use sabry::styly; @@ -195,13 +195,10 @@ styly!(const styles { } }); -fn render() -> HtmlElement { - div().class(styles::badges).chain( - ul().class(styles::_list(styles::badges)) - ).chain( - span().id(styles::thewolf) - ) -} +/* Now you can use all scoped selectors: */ +let badges_scoped_class = styles::badges; +let wolf_scoped_id = styles::thewolf; +let badges__list_scoped_class = styles::___list(styles::badges); ``` > That `const` usage is covered in the [following](#constant-styly-scopes) section. In this example we dont invoke sabry build-magic, so, to be as close to real life as possible, I used a const. @@ -229,8 +226,6 @@ sabry = {version = "0.0.1", features = ["build"]} Then you have to tell sabry when code should be compiled. We'll do this in *build.rs* file. ```rust,ignore // build.rs -use shared_styles::{mixins, styles}; - fn main(){ sabry::buildy( sabry::usey!( @@ -243,11 +238,12 @@ fn main(){ `buildy` is the entry function of sabry build-time process. The handy `usey!` macro will do just proper handling of our style-macros for it. Now lets get back to the code and use the mixin defined in another crate: -```rust,ignore +```rust // breadbadgelist.rs use sabry::styly; styly!(styles { + // "mixins" is available beacuse we did call mixins!() macro in the example below @use "mixins"; .badges { display: flex; @@ -259,14 +255,6 @@ styly!(styles { @include mixins.colored(white); } }); - -fn render() -> HtmlElement { - div().class(styles::badges).chain( - ul().class(styles::_list(styles::badges)) - ).chain( - span().id(styles::thewolf) - ) -} ``` So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` function call is now accessible with simple and natural `@use "mixins"` SASS rule! @@ -274,7 +262,9 @@ So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` fu With [leptos](https://github.com/leptos-rs/leptos) framework you can do the trick to apply some class to most of HtmlElements for the entire component/island: -```rust,ignore +```rust +use leptos::prelude::*; + #[component] fn component() -> impl IntoView { view! {class="cls1", /* <- here */ @@ -297,8 +287,12 @@ sabry = {version = "0.0.1", features = ["lepty-scoping"]} sabry = {version = "0.0.1", features = ["build", "lepty-scoping"]} ``` -```rust,ignore +```rust +use leptos::prelude::*; +use sabry::styly; + styly!(scope { + // assuming we have tokens!() macro generated by `sassy!`, which is handled by `buildy` @use "tokens"; h1 { @include tokens.sectionhead(); @@ -443,14 +437,19 @@ It does accept the following syntax: `$name(:$syntax)? ({ $code })|($filename)`, - *$filename* is a string literal which contains path to the file relative to package root Examples: -```rust,ignore +```rust +use sabry::sassy; + sassy!(module1 {$primary-color: red;}); -sassy!(module2 "src/assets/module2.scss"); -sassy!(module3:sass "src/assets/module3.sass"); +sassy!(module2 "tests/assets/mixins.scss"); +sassy!(module3:sass "tests/assets/mixins.sass"); // works, but there are catches. sassy!(module4:sass { - =colored - color: red + =colored($col: primary) + @if $col == primary + color: white + @else + color: red }); ``` @@ -474,15 +473,17 @@ It does accept the following syntax: `pub? const? $ident(:$syntax)? ({ $code })| - *$filename* is a string literal which contains path to the file relative to package root Examples -```rust,ignore -styly!(fox {.fur {color: red; &-dark {color: black;}}}) -styly!(pub fox {.fur {color: red; &-dark {color: black;}}}) -styly!(pub const fox:sass { +```rust +use sabry::styly; + +styly!(private_fox {.fur {color: red; &-dark {color: black;}}}); +styly!(pub public_fox {.fur {color: red; &-dark {color: black;}}}); +styly!(pub const pub_compiletime_fox:sass { .fur color: red &-dark color: black -}) +}); ``` Every of those calls will produce the styling scope as a module. Differences are explained right below. @@ -510,8 +511,8 @@ You can read more about scoping and hashing in the [scoping](#scoping) section. By default generated `mod` is private. You can make both mod and wrapper style constant public by adding the `pub` to macro call: -```rust,ignore -styly!(pub whatever "src/assets/whatever.scss"); +```rust +sabry::styly!(pub whatever "tests/assets/mixins.scss"); ``` #### Constant styly scopes @@ -521,7 +522,7 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: ```rust,ignore -styly!(const scope "src/assets/scope.scss"); +sabry::styly!(const scope "tests/assets/mixins.scss"); ``` Which results in following: ```rust,ignore @@ -610,8 +611,8 @@ Different selector types are scoped differently: As for **SASS parent selectors**: they are currently handled in different way. Instead of walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: -```rust,ignore -styly!(scope { +```rust +sabry::styly!(scope { .cls1 { &-dark {} } diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index b05f1d9..6500413 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -48,7 +48,10 @@ pub fn sassy(input: TokenStream) -> TokenStream { /// ## Usage /// /// Write style in rusty code (rust-analyzer wont autocomplete your scope members) +/// /// ```ignore +/// use sabry::styly; +/// /// styly!(scope1 { /// /* SCSS */ /// }); @@ -107,9 +110,8 @@ pub fn styly(input: TokenStream) -> TokenStream { /// use brandstyle::tokens as brand_tokens; /// /// usey!( -/// brandstyle::theme!(), -/// tokens!(), -/// brand_tokens!(), +/// theme!(), +/// tokens!() /// ); /// ``` /// diff --git a/tests/assets/mixins.sass b/tests/assets/mixins.sass new file mode 100644 index 0000000..9e2462e --- /dev/null +++ b/tests/assets/mixins.sass @@ -0,0 +1,5 @@ +=colored($color: primary) + @if $color == primary + color: white + @else + color: $col diff --git a/tests/assets/mixins.scss b/tests/assets/mixins.scss new file mode 100644 index 0000000..d201fd0 --- /dev/null +++ b/tests/assets/mixins.scss @@ -0,0 +1,9 @@ +$primary-color: black; + +@mixin colored($col: primary) { + @if $col == primary { + color: $primary-color; + } @else { + color: $col; + } +} From 338540173a4b0a6b9a7cb4470873a118af87aa93 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 05:33:23 +0500 Subject: [PATCH 113/184] docs: a reminder about lepty-scoping feature flag --- README.md | 18 ++++++++++++------ examples/use-styles/Cargo.lock | 11 ++++++----- examples/use-styles/src/main.rs | 2 -- release.toml | 6 +++++- sabry_intrnl/src/scoper/mod.rs | 4 ++-- sabry_procmacro_impl/src/impls/mod.rs | 7 ++++++- 6 files changed, 31 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index ea5625f..9895b02 100644 --- a/README.md +++ b/README.md @@ -273,7 +273,7 @@ fn component() -> impl IntoView { } } ``` -... and have "cls1" on both `h1` and `p` auto-assigned. Isn't this cool? +... and have "cls1" on both `h1` and `p` auto-assigned. Isn't that cool? So, if you're on leptos, and don't mind to take this approach, I'd highly recommend turning the *lepty-scoping* feature on: @@ -327,6 +327,7 @@ fn component() -> impl IntoView { That will perform *much* better: - All scope members - like `scope::breadcumbs` - wont contain repeating scope hash, just the original class/id selector + - So instead of scope members (which [aren't](https://github.com/yiffyrusdev/sabry/issues/2) autocompleted for sass-in-the-rust yet) you could just write bare selectors, as you do, for example, with svelte: `<li class="breadcumbs__item">` - You will not encounter [the catch](#scoping) with nested tagname selectors Also, this isn't really exclusive leptos-supporting feature. It just changes scoping behavour. @@ -631,15 +632,20 @@ So you still can get the scoped variant of `cls1-dark` class: `scope::_dark(scop This isn't very handy, also isn't strict enough, and is a high-priority subject to change. wip. +#### Scope member naming rules + +Not any valid CSS selector is a valid rust identifier. In general this section should not be needed, as you should receive autocompletion from the editor. *However* it doesn't seem to work properly. Check the [wip](#wip) section out. + ## WIP *(sorted by my own priority)*, "dones" are excluded -- [] Crates of styled components - currently the only way to create them seems to be const styly. - - [] CSS support -- [] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance -- [] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. -- [] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. +- [ ] Somehow achieve the autocompletion for scopes. The problem is explained in details [here](https://github.com/yiffyrusdev/sabry/issues/2) +- [ ] Crates of styled components - currently the only way to create them seems to be const styly. + - [ ] CSS support +- [ ] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance +- [ ] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. +- [ ] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. ## Contributions diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 8bc46bd..d0d46c5 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -994,7 +994,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_build", "sabry_intrnl", @@ -1003,7 +1003,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1" +version = "0.0.1-alpha.2" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,10 +1015,11 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1" +version = "0.0.1-alpha.2" dependencies = [ "base64", "blake3", + "cfg-if", "const_format", "grass", "lightningcss", @@ -1034,14 +1035,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1" +version = "0.0.1-alpha.2" dependencies = [ "proc-macro2", "quote", diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 6472b0e..0f69f52 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -11,8 +11,6 @@ styly!(pub const bundlemod { } }); -styly!(pub const filemod:sass "src/main.sass"); - fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); diff --git a/release.toml b/release.toml index d60c78b..edd975f 100644 --- a/release.toml +++ b/release.toml @@ -4,5 +4,9 @@ sign-tag = true target = "x86_64-unknown-linux-gnu" pre-release-replacements = [ - {file="README.md", search='sabry = {\s?version = "[0-9a-z\-\.]*"(?<rest>.*)\s?}', replace='sabry = { version = "{{version}}" $rest}'}, + {file="README.md", search='sabry = {\s?version = "[0-9a-z\-\.]*"', replace='sabry = { version = "{{version}}"'}, +] + +pre-release-hook = [ + "/bin/echo $NEW_VERSION" ] diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 0d82a7d..659fc7f 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -226,7 +226,7 @@ impl HashedSelector { Some(format!("{} {}", hash.as_str(), a.ident)) } } - }, + } // As we dont want to use two HTML props for a single ID, // ID scoping is done with id modification ScopedSelector::Id(a) => { @@ -237,7 +237,7 @@ impl HashedSelector { Some(format!("{}-{}", hash.as_str(), a.ident)) } } - }, + } ScopedSelector::Tag(_) => None, } } diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index a6876d8..f86a7ae 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -57,7 +57,12 @@ impl Parse for ArbitraryStyleBlock { let iofile = match fs::read(&fullpath) { Ok(bf) => bf, - Err(_) => return Err(syn::Error::new(path_tok.span(), format!("Could not read file at {fullpath:?}"))) + Err(_) => { + return Err(syn::Error::new( + path_tok.span(), + format!("Could not read file at {fullpath:?}"), + )) + } }; let code = String::from_utf8_lossy(&iofile).to_string(); From 1d37f939c0e00932cdb8aab0f07d73ce589190f6 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 07:41:49 +0500 Subject: [PATCH 114/184] feat!: expose internals with special feature flag, improve related docs --- Cargo.toml | 5 ++++ README.md | 8 +++++++ sabry_build/Cargo.toml | 4 ++++ sabry_build/src/buildmagic.rs | 42 +++++++++++++++++++++++++++++++++ sabry_build/src/lib.rs | 1 - sabry_intrnl/Cargo.toml | 4 ++++ sabry_procmacro/Cargo.toml | 4 ++++ sabry_procmacro_impl/Cargo.toml | 4 ++++ src/lib.rs | 15 +++++++++++- 9 files changed, 85 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 29b8912..94bb5d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,3 +58,8 @@ build = [ net-files = [ "sabry_build/net-files" ] +internals = [] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/README.md b/README.md index 9895b02..59ca70d 100644 --- a/README.md +++ b/README.md @@ -636,6 +636,14 @@ This isn't very handy, also isn't strict enough, and is a high-priority subject Not any valid CSS selector is a valid rust identifier. In general this section should not be needed, as you should receive autocompletion from the editor. *However* it doesn't seem to work properly. Check the [wip](#wip) section out. +## Notable feature flags + +**build** - turns on the `sabry::buildy` function, along with the entire `sabry_build` crate where it lives + +**internals** - exposes majority of internal stuff for you to experiment or build own workflow + +**lepty-scoping** - overhauls the scope generation logic, best suitable for the leptos. Check out the [section](#leptos-specials) and an [example](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum) + ## WIP *(sorted by my own priority)*, "dones" are excluded diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index 526a350..400a3a0 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -19,3 +19,7 @@ walkdir = {version = "^2.5"} [features] net-files = [] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index f9abcf7..bcff0ef 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -23,6 +23,29 @@ type ModuleCode = String; type StyleModule = (ModuleName, ModuleCode); type BuilderResult = Result<(), SabryBuildError>; +/// Entry point of sabrys build-magic +/// +/// Example: +/// ``` +/// # use sabry_build::buildmagic::buildy; +/// /* buildy call */ +/// buildy( +/// vec![("mixins.scss".to_string(), "@mixin abc(){}".to_string())] +/// ).expect("Sabry failed to build CSS"); +/// ``` +/// +/// Also you could use style-macros defined anywhere with `sabry::sassy!` procmacro: +/// ```ignore +/// buildy( +/// sabry::usey!( +/// crate1::mixins!(), +/// crate2::tokens!(), +/// crate3::mixins!() +/// ) +/// ).expect("Sabry failed to build CSS"); +/// ``` +/// +/// This function is intended to run at build time, however, you're free to use it however you please pub fn buildy(inline_side_modules: impl IntoIterator<Item = StyleModule>) -> BuilderResult { println!("🧙: This is probably the stderr. Something went wrong:"); @@ -49,6 +72,17 @@ pub fn buildy(inline_side_modules: impl IntoIterator<Item = StyleModule>) -> Bui Ok(()) } +/// Entrypoint structure of sabrys build-magic. +/// +/// You could construct CSS compilation process by yourself instead of using `buildy` function: +/// ```rust +/// # use sabry_intrnl::config::SabryConfig; +/// # use sabry_build::buildmagic::SabryBuilder; +/// let config = SabryConfig::require().expect("Config didnt load"); +/// let builder = SabryBuilder::new(config); +/// ``` +/// +/// the [buildy] function will just do baseline usage of this structure for you pub struct SabryBuilder { config: SabryConfig, css_compiler: CompilerAdapter, @@ -57,6 +91,14 @@ pub struct SabryBuilder { //🧙 impl SabryBuilder { + /// Construct new [SabryBuilder] from the config + /// + /// You can require [SabryConfig] automatically, with the [Result], by: + /// + /// ``` + /// # use sabry_intrnl::config::SabryConfig; + /// SabryConfig::require().expect("Config didnt load"); + /// ``` pub fn new(config: SabryConfig) -> Self { let css_compiler = CompilerAdapter::new(config.clone()); Self { diff --git a/sabry_build/src/lib.rs b/sabry_build/src/lib.rs index ecac97d..b2d511e 100644 --- a/sabry_build/src/lib.rs +++ b/sabry_build/src/lib.rs @@ -2,4 +2,3 @@ pub mod buildmagic; pub mod filevisit; -pub use buildmagic::*; diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 41c5cbc..e7ff33b 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -27,3 +27,7 @@ cfg-if = {version = "^1.0"} [features] lepty-scoping = [] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 932a3d2..570fccf 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -15,3 +15,7 @@ proc-macro = true sabry_procmacro_impl = {workspace = true} [features] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index b170930..a7a1927 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -18,3 +18,7 @@ raffia = {version = "^0.9"} regex = {version = "^1.11"} [features] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/src/lib.rs b/src/lib.rs index 71317c6..92fcb93 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,19 @@ #![doc = include_str!("../README.md")] +#![cfg_attr(docsrs, feature(doc_cfg))] +#[cfg_attr(docsrs, doc(cfg(feature = "build")))] #[cfg(feature = "build")] -pub use sabry_build::*; +pub use sabry_build::buildmagic::buildy; +#[cfg_attr(docsrs, doc(cfg(feature = "procmacro")))] #[cfg(feature = "procmacro")] pub use sabry_procmacro::*; + + +// reexports +#[cfg_attr(docsrs, doc(cfg(all(feature = "build", feature = "internals"))))] +#[cfg(all(feature = "build", feature = "internals"))] +pub use sabry_build::*; + +#[cfg_attr(docsrs, doc(cfg(all(feature = "procmacro", feature = "internals"))))] +#[cfg(all(feature = "procmacro", feature = "internals"))] +pub use sabry_intrnl::*; From 915467c01f7ffbdf089df7c5817ab9cc8b2ae132 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 09:42:37 +0500 Subject: [PATCH 115/184] fix!: bring the scope autocompletion in by changing style input syntax BREAKING CHANGE: `styly`, `sassy` macros syntax change. Now requires `{"$code"}`. --- README.md | 88 +++++++++++++----------- examples/define-styles/Cargo.lock | 9 +-- examples/define-styles/src/lib.rs | 14 ++-- examples/leptos-axum/src/routes/home.rs | 10 +-- examples/use-styles/build.rs | 4 +- examples/use-styles/src/main.rs | 11 ++- sabry_intrnl/src/scoper/mod.rs | 6 +- sabry_procmacro_impl/src/impls/mod.rs | 89 +++++++++++++++---------- src/lib.rs | 1 - 9 files changed, 132 insertions(+), 100 deletions(-) diff --git a/README.md b/README.md index 59ca70d..a434c5c 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ At first, I'll show how this crate "tastes". With SABRY, its in your power to: Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with modules, with feature flags, etc. Say "bye" to manual copying, cli-tools and consts. -```rust,ignore -sassy!(tokens {@mixin colored{color: red;}}); +```rust +sabry::sassy!(tokens {"@mixin colored{color: red;}"}); ``` </td> @@ -38,9 +38,9 @@ sassy!(tokens {@mixin colored{color: red;}}); Code your SASS in separate files to get proper syntax highlighting, or do sass-in-the-rust to keep things in one place -```rust,ignore -styly!(component {.btn {color: green;}}); -styly!(extras "src/components/extras.scss"); +```rust +sabry::styly!(component {".btn {color: green;}"}); +sabry::styly!(extras "tests/assets/mixins.scss"); ``` </td> @@ -68,11 +68,11 @@ tgk_brandstyle = {version = "0.0.1", features = ["utils"]} `@use` your style-crates in sass code *naturally* -```rust,ignore -styly!(breadbadge { +```rust +sabry::styly!(breadbadge {" @use 'tokens'; .scope {@include tokens.badge(primary);} -}) +"}); ``` </td> @@ -85,10 +85,11 @@ styly!(breadbadge { Keep things as private and modular as you wish +```rust +sabry::styly!(pub cats "tests/assets/mixins.scss"); +sabry::styly!(dogs {"#howl {border: none;}"}); +``` ```rust,ignore -styly!(pub cats "src/sections/cats/style.scss"); -styly!(dogs {#howl {border: none;}}) - /// something like render function { <div class={cats::meow}> @@ -107,9 +108,9 @@ styly!(dogs {#howl {border: none;}}) Compile all the sweet SASS/SCSS into the optimized CSS bundle, ship it in CSS shunks or even include the compiled style into the binary -```rust,ignore -styly!(cssbundle {.c1 {color: white;}}) -styly!(const binary {.c2 {color: black;}}) +```rust +sabry::styly!(cssbundle {".c1 {color: white;}"}); +sabry::styly!(const binary {".c2 {color: black;}"}); ``` </td> @@ -127,8 +128,7 @@ Sabry will gladly: - prepare ready CSS bundle and put it wherever you wish - include CSS into the build artifact - if you really want it -Also, just about everything is pub-available in this crate - Sabry is ready for experiments. - +Also, just about everything is pub-available in this crate (with *internals* feature flag) - Sabry is ready for experiments. ## Usage @@ -153,7 +153,7 @@ And a proc-macro use sabry::sassy; sassy!(mixins "tests/assets/mixins.scss"); -sassy!(styles { +sassy!(styles {" $primary-color: black; @mixin colored($col: primary) { @if $col == primary { @@ -162,8 +162,10 @@ sassy!(styles { color: $col; } } -}); +"}); ``` +*\* Unlike most of other crates that do sass-in-the-rust, sabry currently does not allow unquoted sass/scss. You still have to write it in a string-quotes. Unquoted sass/scss is reserved for the future, where we shall introduce variable injection.* + Now you can build and see two ready for export macros: `mixins!` and `styles!`. These are usefull on their own, as invocation of `mixins!()` or `styles!()` - both shall give you the code literal. @@ -183,7 +185,7 @@ And create a style scope wherever you want: // breadbadgelist.rs use sabry::styly; -styly!(const styles { +styly!(const styles {" .badges { display: flex; &__list { @@ -193,7 +195,7 @@ styly!(const styles { #wolf { color: white; } -}); +"}); /* Now you can use all scoped selectors: */ let badges_scoped_class = styles::badges; @@ -242,9 +244,9 @@ Now lets get back to the code and use the mixin defined in another crate: // breadbadgelist.rs use sabry::styly; -styly!(styles { - // "mixins" is available beacuse we did call mixins!() macro in the example below - @use "mixins"; +styly!(styles {" + // 'mixins' is available beacuse we did call mixins!() macro in the example below + @use 'mixins'; .badges { display: flex; &__list { @@ -254,7 +256,7 @@ styly!(styles { #wolf { @include mixins.colored(white); } -}); +"}); ``` So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` function call is now accessible with simple and natural `@use "mixins"` SASS rule! @@ -291,9 +293,9 @@ sabry = {version = "0.0.1", features = ["build", "lepty-scoping"]} use leptos::prelude::*; use sabry::styly; -styly!(scope { +styly!(scope {" // assuming we have tokens!() macro generated by `sassy!`, which is handled by `buildy` - @use "tokens"; + @use 'tokens'; h1 { @include tokens.sectionhead(); img { @@ -306,7 +308,7 @@ styly!(scope { @include tokens.badge(secondary); } } -}); +"}); #[component] fn component() -> impl IntoView { @@ -441,17 +443,17 @@ Examples: ```rust use sabry::sassy; -sassy!(module1 {$primary-color: red;}); +sassy!(module1 {"$primary-color: red;"}); sassy!(module2 "tests/assets/mixins.scss"); sassy!(module3:sass "tests/assets/mixins.sass"); // works, but there are catches. -sassy!(module4:sass { +sassy!(module4:sass {" =colored($col: primary) @if $col == primary color: white @else color: red -}); +"}); ``` You may omit the syntax specifier - sabry uses SCSS as the default one. @@ -477,14 +479,14 @@ Examples ```rust use sabry::styly; -styly!(private_fox {.fur {color: red; &-dark {color: black;}}}); -styly!(pub public_fox {.fur {color: red; &-dark {color: black;}}}); -styly!(pub const pub_compiletime_fox:sass { +styly!(private_fox {".fur {color: red; &-dark {color: black;}}"}); +styly!(pub public_fox {".fur {color: red; &-dark {color: black;}}"}); +styly!(pub const pub_compiletime_fox:sass {" .fur color: red &-dark color: black -}); +"}); ``` Every of those calls will produce the styling scope as a module. Differences are explained right below. @@ -522,7 +524,7 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: -```rust,ignore +```rust sabry::styly!(const scope "tests/assets/mixins.scss"); ``` Which results in following: @@ -613,11 +615,11 @@ As for **SASS parent selectors**: they are currently handled in different way. I walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: ```rust -sabry::styly!(scope { +sabry::styly!(scope {" .cls1 { &-dark {} } -}); +"}); ``` is something like ```rust,ignore @@ -648,10 +650,20 @@ Not any valid CSS selector is a valid rust identifier. In general this section s *(sorted by my own priority)*, "dones" are excluded -- [ ] Somehow achieve the autocompletion for scopes. The problem is explained in details [here](https://github.com/yiffyrusdev/sabry/issues/2) +- [x] Somehow achieve the autocompletion for scopes. The problem is explained in details [here](https://github.com/yiffyrusdev/sabry/issues/2) + - [ ] some weird unrelated stuff I can see in autocompletion - [ ] Crates of styled components - currently the only way to create them seems to be const styly. - [ ] CSS support - [ ] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance +- [ ] Use sass-in-rust without quoted styles for variable injection: + ```rust, ignore + let myvar = "content"; + styly!(scope { + .c::after { + content: somehow(myvar); + } + }) + ``` - [ ] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. - [ ] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index ce5f0bc..5c7cbf1 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -994,7 +994,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_intrnl", "sabry_procmacro", @@ -1002,10 +1002,11 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "base64", "blake3", + "cfg-if", "const_format", "grass", "lightningcss", @@ -1021,14 +1022,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-alpha.1" +version = "0.0.1-alpha.2" dependencies = [ "proc-macro2", "quote", diff --git a/examples/define-styles/src/lib.rs b/examples/define-styles/src/lib.rs index d53f80c..9850a64 100644 --- a/examples/define-styles/src/lib.rs +++ b/examples/define-styles/src/lib.rs @@ -2,7 +2,7 @@ use sabry::sassy; sassy!(style "src/style.scss"); -sassy!(utils { +sassy!(utils {" @mixin flex($direction, $align, $justify, $gap: .5rem) { display: flex; list-style: none; @@ -29,9 +29,9 @@ sassy!(utils { justify-content: $justify; } } -}); +"}); -sassy!(theme { +sassy!(theme {" $thm-surface-primary: #2b2a29; $thm-surface-secondary: #6C6C6C; $thm-surface-tertiary: #4C4C4C; @@ -75,10 +75,10 @@ sassy!(theme { color: $thm-text-accent; } } -}); +"}); -sassy!(tokens { - @use "theme"; +sassy!(tokens {" + @use 'theme'; @mixin clickable($style: accent, $scale: 1.2, $clickscale: 0.9){ @if $style == accent{ @@ -103,4 +103,4 @@ sassy!(tokens { transform: scale($clickscale); } } -}); +"}); diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index b79682d..c8b8d4b 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -1,10 +1,10 @@ use leptos::prelude::*; use sabry::styly; -styly!(style { - @use "tokens"; - @use "utils"; - @use "theme"; +styly!(style {" + @use 'tokens'; + @use 'utils'; + @use 'theme'; h2 { margin-bottom: 1rem; @@ -35,7 +35,7 @@ styly!(style { text-transform: uppercase; } -}); +"}); /// Renders the home page of your application. #[component] diff --git a/examples/use-styles/build.rs b/examples/use-styles/build.rs index 88a9998..d8b254f 100644 --- a/examples/use-styles/build.rs +++ b/examples/use-styles/build.rs @@ -3,11 +3,11 @@ use sabry::{sassy, usey}; // This module will have the same name as define_styles_example::utils // and sabry is configured to merge them -sassy!(utils { +sassy!(utils {" @mixin nonclickable(){ display: none; } -}); +"}); fn main(){ /* Declare modules to use with sabry */ diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 0f69f52..cb9bd46 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -1,7 +1,10 @@ use sabry::styly; -styly!(pub const bundlemod { - @use "tokens"; +// Sabry now (0.0.1-alpha.3) disallows unquoted styles +// you won't benefit from unqouted styles though, as you won't get syntax highlighting +// Also, unqouted styles are reserved for future +styly!(pub const bundlemod {" + @use 'tokens'; .someth { @include tokens.clickable; background-color: black; @@ -9,7 +12,9 @@ styly!(pub const bundlemod { background-color: white; } } -}); +"}); + +styly!(pub filemod:sass "src/main.sass"); fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 659fc7f..b519cff 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -215,7 +215,7 @@ impl HashedSelector { /// /// Not every hashed selector is presentable for HTML-ish use: like `div`, in that case /// returns [None] - pub fn make_hashed_html(value: &ScopedSelector, hash: &ScopeHash) -> Option<String> { + pub fn make_hashed_html(value: &ScopedSelector, _hash: &ScopeHash) -> Option<String> { match value { // Class scoping is done with class composition ScopedSelector::Class(a) => { @@ -223,7 +223,7 @@ impl HashedSelector { if #[cfg(feature = "lepty-scoping")] { Some(a.ident.to_string()) } else { - Some(format!("{} {}", hash.as_str(), a.ident)) + Some(format!("{} {}", _hash.as_str(), a.ident)) } } } @@ -234,7 +234,7 @@ impl HashedSelector { if #[cfg(feature = "lepty-scoping")] { Some(a.ident.to_string()) } else { - Some(format!("{}-{}", hash.as_str(), a.ident)) + Some(format!("{}-{}", _hash.as_str(), a.ident)) } } } diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index f86a7ae..faa10df 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -2,8 +2,9 @@ use std::{fmt::Debug, fs, path::PathBuf, str::FromStr}; use proc_macro2::{Span, TokenStream}; use quote::{quote, ToTokens, TokenStreamExt}; +use regex::Regex; use sabry_intrnl::compiler::CompilerSyntax; -use syn::{braced, parse::Parse, spanned::Spanned, Ident, LitStr, Token}; +use syn::{braced, parse::Parse, Ident, LitStr, Token}; pub mod sassy; pub mod styly; @@ -68,21 +69,17 @@ impl Parse for ArbitraryStyleBlock { (code, path_tok.span()) } else { - // Does not work on stable! - // We're on nightly though - // So what? - // Then is works. - let _s; - braced!(_s in input); - let stream = _s.parse::<TokenStream>()?; - - let c = match stream.span().source_text() { - Some(stx) => stx, - // TODO: rust-analyzer does fall into this even if all is fine - None => "".to_string(), //return Err(syn::Error::new(stream.span(), "Source code expected")), - }; - - (c, stream.span()) + let s; + braced!(s in input); + if let Ok(stream) = s.parse::<LitStr>() { + let c = stream.value(); + // shift the entire code for the first line ident + let ident_regex = Regex::new(r"\n\s{4}").expect("BUG: base ident regex at sabry_procmacro_impl/src/impls/mod.rs:: impl Parse for ArbitraryStyleBlock"); + let c = ident_regex.replace_all(&c, "\n").to_string(); + (c, stream.span()) + } else { + return Err(syn::Error::new(s.span(), "Use \"\" within the braces to specify your SASS/SCSS. Unquoted style syntax is reserved for the future. Unquoted SCSS/SASS doesnt make sense though, as you won't benefit from it in rust file.\n\ntip: use `{\"style\"}` instead of `{style}`")); + } }; Ok(Self { code, span }) @@ -137,9 +134,9 @@ impl Parse for ArbitraryStyleSyntax { _ => Err(syn::Error::new( ident.span(), format!( - "Available syntax are `sass` (WIP) and `scss`, each of them requires feature flag. Omit to use default {:?} syntax", - Self::default() - ), + "Available syntax are `sass` and `scss`, omit to use default {:?} syntax", + Self::default() + ), )), } } @@ -176,31 +173,49 @@ mod test { fn arbitrary_style_block_sass() { use super::ArbitraryStyleBlock; - let code = "#a - co:d - .sel - di: pi - .sel,div > sel - f: \"into\""; - let braced_code = format!("{{{code}}}"); - let block = syn::parse_str::<ArbitraryStyleBlock>(&braced_code).unwrap(); + let code = " + #a + co: red + .sel + co: white + &-dark + & > div + co: blue"; + let expect_code = " +#a + co: red +.sel + co: white +&-dark + & > div + co: blue"; + let input = format!("{{\"{code}\"}}"); + let block = syn::parse_str::<ArbitraryStyleBlock>(&input).unwrap(); - assert_eq!(code, block.code); + assert_eq!(expect_code, block.code); } #[test] fn arbitrary_style_block_scss() { use super::ArbitraryStyleBlock; - let code = "#a { - c:r; - } - .b.c{ - c:\"into\"; - }"; - let braced_code = format!("{{{code}}}"); - let block = syn::parse_str::<ArbitraryStyleBlock>(&braced_code).unwrap(); + let code = " + #a { + c: r; + } + .b.c { + c: 'into'; + }"; + let expect_code = " +#a { + c: r; +} +.b.c { + c: 'into'; +}"; + let input = format!("{{\"{code}\"}}"); + let block = syn::parse_str::<ArbitraryStyleBlock>(&input).unwrap(); - assert_eq!(code, block.code) + assert_eq!(expect_code, block.code) } } diff --git a/src/lib.rs b/src/lib.rs index 92fcb93..4cc9d27 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,6 @@ pub use sabry_build::buildmagic::buildy; #[cfg(feature = "procmacro")] pub use sabry_procmacro::*; - // reexports #[cfg_attr(docsrs, doc(cfg(all(feature = "build", feature = "internals"))))] #[cfg(all(feature = "build", feature = "internals"))] From 465e6ee084906eb961391182146620339e4112d4 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 09:53:24 +0500 Subject: [PATCH 116/184] remove unneeded rel --- release.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/release.toml b/release.toml index edd975f..ac70f3c 100644 --- a/release.toml +++ b/release.toml @@ -6,7 +6,3 @@ target = "x86_64-unknown-linux-gnu" pre-release-replacements = [ {file="README.md", search='sabry = {\s?version = "[0-9a-z\-\.]*"', replace='sabry = { version = "{{version}}"'}, ] - -pre-release-hook = [ - "/bin/echo $NEW_VERSION" -] From 263eee6e6227a69362633e2d5c3266e854c002d4 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 09:53:54 +0500 Subject: [PATCH 117/184] chore: Release --- Cargo.lock | 10 +++++----- Cargo.toml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 250df59..0992fd0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1786,7 +1786,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "leptos", "sabry_build", @@ -1796,7 +1796,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1808,7 +1808,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "base64", "blake3", @@ -1828,14 +1828,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 94bb5d6..4567bf8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-alpha.2" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-alpha.2" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-alpha.2" } -sabry_build = {path = "sabry_build", version = "0.0.1-alpha.2" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.1" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.1" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.1" } +sabry_build = {path = "sabry_build", version = "0.0.1-beta.1" } [workspace.package] -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" edition = "2021" rust-version = "1.82" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From e6ce31f675c7bad627155794e34b23a2c8e9dd9b Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 10:25:11 +0500 Subject: [PATCH 118/184] docs: get rid of those icons, reference the scoping autocompletion --- README.md | 28 ++++++++++++---------------- examples/use-styles/Cargo.lock | 10 +++++----- examples/use-styles/src/main.rs | 6 +++++- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index a434c5c..7af58ea 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,19 @@ sabry::sassy!(tokens {"@mixin colored{color: red;}"}); ``` </td> +</tr> +<tr> <td> -📦 + +Get the *(almost)* proper autocompletion for your scope from rust-analyzer + +```rust +sabry::styly!(scope {".cls1{} #id1{}"}); +/* autocompleted for you */ +scope::cls1; +scope::theid1; +``` + </td> </tr> <tr> @@ -43,9 +54,6 @@ sabry::styly!(component {".btn {color: green;}"}); sabry::styly!(extras "tests/assets/mixins.scss"); ``` -</td> -<td> -:3 </td> </tr> <tr> @@ -58,9 +66,6 @@ Depend on styles with cargo, at build time, which brings all the rusty sweeties tgk_brandstyle = {version = "0.0.1", features = ["utils"]} ``` -</td> -<td> -🦀 </td> </tr> <tr> @@ -75,9 +80,6 @@ sabry::styly!(breadbadge {" "}); ``` -</td> -<td> -🪄 </td> </tr> <tr> @@ -98,9 +100,6 @@ sabry::styly!(dogs {"#howl {border: none;}"}); } ``` -</td> -<td> -^_^ </td> </tr> <tr> @@ -113,9 +112,6 @@ sabry::styly!(cssbundle {".c1 {color: white;}"}); sabry::styly!(const binary {".c2 {color: black;}"}); ``` -</td> -<td> -🏗️ </td> </tr> </table> diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index d0d46c5..b5c9a3f 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -994,7 +994,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "sabry_build", "sabry_intrnl", @@ -1003,7 +1003,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,7 +1015,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "base64", "blake3", @@ -1035,14 +1035,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.1" dependencies = [ "proc-macro2", "quote", diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index cb9bd46..a029637 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -12,6 +12,9 @@ styly!(pub const bundlemod {" background-color: white; } } + #fox { + color: red; + } "}); styly!(pub filemod:sass "src/main.sass"); @@ -19,6 +22,7 @@ styly!(pub filemod:sass "src/main.sass"); fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); - //println!("someth-dark selector will be: {}", bundlemod::_dark(bundlemod::someth)); + println!("someth-dark selector will be: {}", bundlemod::___dark(bundlemod::someth)); + println!("#fox id will be: {}", bundlemod::thefox); println!("Thats how we used the styles! Good luck!!"); } From 80d015627ed8d18197518332df25e20bfcfb624b Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 18:36:23 +0500 Subject: [PATCH 119/184] fix: duplicated extra-indentation removal caused invalid SASS syntax --- sabry_procmacro_impl/src/impls/sassy.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index 16fe436..42d1725 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -46,14 +46,7 @@ impl Parse for MacroSyntax { fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { let ident = input.parse::<Ident>()?; let mode = input.parse::<ArbitraryStyleSyntax>()?; - let mut code = input.parse::<ArbitraryStyleBlock>()?; - - // this is because of how parsing works. Need to find more elegant way though - // TODO: find a more elegant way - code.code = Regex::new("\n ") - .expect("BUG: failed to build regex for indentation SASS") - .replace_all(&code.code, "\n") - .to_string(); + let code = input.parse::<ArbitraryStyleBlock>()?; Ok(Self { ident, From 8fd587a8b47288a552865a281320c17f2a031051 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 1 Nov 2024 18:37:21 +0500 Subject: [PATCH 120/184] chore: Release --- Cargo.lock | 10 +++++----- Cargo.toml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0992fd0..d4e21b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1786,7 +1786,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "leptos", "sabry_build", @@ -1796,7 +1796,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1808,7 +1808,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "base64", "blake3", @@ -1828,14 +1828,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 4567bf8..defdf56 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.1" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.1" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.1" } -sabry_build = {path = "sabry_build", version = "0.0.1-beta.1" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.2" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.2" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.2" } +sabry_build = {path = "sabry_build", version = "0.0.1-beta.2" } [workspace.package] -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" edition = "2021" rust-version = "1.82" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 6eb97255835ecb6dc3a53663c6f0a91a7e602063 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 00:20:10 +0500 Subject: [PATCH 121/184] fix: more-or-less readable errors + syntax check on sassy macro --- examples/define-styles/Cargo.lock | 8 ++-- examples/use-styles/Cargo.lock | 10 ++-- sabry_build/src/buildmagic.rs | 2 +- sabry_intrnl/src/compiler/mod.rs | 61 +++++++++++++++++++++---- sabry_intrnl/src/scoper/mod.rs | 26 ++++++++--- sabry_procmacro_impl/src/impls/sassy.rs | 10 +++- 6 files changed, 91 insertions(+), 26 deletions(-) diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index 5c7cbf1..1b2178a 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -994,7 +994,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.2" dependencies = [ "sabry_intrnl", "sabry_procmacro", @@ -1002,7 +1002,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.2" dependencies = [ "base64", "blake3", @@ -1022,14 +1022,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-alpha.2" +version = "0.0.1-beta.2" dependencies = [ "proc-macro2", "quote", diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index b5c9a3f..a75ee98 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -994,7 +994,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "sabry_build", "sabry_intrnl", @@ -1003,7 +1003,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,7 +1015,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "base64", "blake3", @@ -1035,14 +1035,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-beta.1" +version = "0.0.1-beta.2" dependencies = [ "proc-macro2", "quote", diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index bcff0ef..fe3043c 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -331,7 +331,7 @@ pub enum SabryBuildError { #[error("Sabry cant understand the file")] FileVisit(#[from] FileVisitError), #[error("Syntax of style can not be parsed")] - SyntaxParse(#[from] ScopeError), + SyntaxError(#[from] ScopeError), #[error("Another scope has the same hash, and sabry is configured to raise an error. Try to adjust config, increase hash size, or change the style code")] HashCollision { scope: ModuleName }, #[error("Something's wrong with file path")] diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 7b20556..7376497 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -1,4 +1,11 @@ -use lightningcss::{printer::PrinterOptions, stylesheet::MinifyOptions, targets::Targets}; +use std::fmt::Debug; + +use lightningcss::{ + error::{MinifyErrorKind, PrinterErrorKind}, + printer::PrinterOptions, + stylesheet::MinifyOptions, + targets::Targets, +}; use crate::config::SabryConfig; @@ -28,7 +35,12 @@ impl CompilerAdapter { lightningcss::stylesheet::ParserOptions::default(), ) { Ok(s) => s, - Err(_) => return Err(SabryCompilerError::Lightningcss()), + Err(e) => { + return Err(SabryCompilerError::LightParse { + kind: e.kind.to_string(), + loc: e.loc, + }) + } }; let targets = Targets { @@ -47,16 +59,14 @@ impl CompilerAdapter { ..Default::default() }; - if lightsheet.minify(minify_options).is_err() { - return Err(SabryCompilerError::Lightningcss()); - } + lightsheet.minify(minify_options)?; css = match lightsheet.to_css(printer_options) { Ok(c) => { drop(lightsheet); c.code } - Err(_) => return Err(SabryCompilerError::Lightningcss()), + Err(e) => return Err(SabryCompilerError::LightPrint(e)), }; } @@ -78,12 +88,45 @@ impl From<&SabryConfig> for grass::Options<'_> { } } -#[derive(Debug, thiserror::Error)] +#[derive(thiserror::Error)] pub enum SabryCompilerError { #[error("Could not compile into CSS with grass")] GrassCompile(#[from] Box<grass::Error>), - #[error("Could not parse compiled CSS with lightningcss")] - Lightningcss(), + #[error("Could not print compiled CSS with lightningcss")] + LightPrint(#[from] lightningcss::error::Error<PrinterErrorKind>), + #[error("Could not minify CSS with lightningcss")] + LightMinify(#[from] lightningcss::error::Error<MinifyErrorKind>), + #[error("Could not parse CSS with lightningcss")] + LightParse { + kind: String, + loc: Option<lightningcss::error::ErrorLocation>, + }, +} + +impl Debug for SabryCompilerError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let explain = match self { + Self::LightPrint(e) => format!( + "{} at {:?}", + e.kind, + e.loc.clone() + .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) + ), + Self::GrassCompile(err) => format!("{err}"), + Self::LightMinify(e) => format!( + "{} at {:?}", + e.kind, + e.loc.clone() + .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) + ), + Self::LightParse { kind, loc } => format!( + "{kind} at {:?}", + loc.clone().map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) + ), + }; + + write!(f, "{explain}") + } } /// Unification wrapper over all the Syntax enums diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index b519cff..a42949c 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -1,3 +1,5 @@ +use std::fmt::Debug; + use cfg_if::cfg_if; use hash::ScopeHash; use raffia::Spanned; @@ -7,15 +9,19 @@ use crate::{config::SabryHashConfig, syntax::StylesheetAdapter}; pub mod hash; -#[derive(Debug, thiserror::Error)] +#[derive(thiserror::Error)] pub enum ScopeError { #[error("Raffia reports parse error")] - Raffia(raffia::error::ErrorKind), + Raffia(raffia::error::ErrorKind, String), } -impl From<raffia::error::Error> for ScopeError { - fn from(value: raffia::error::Error) -> Self { - Self::Raffia(value.kind) +impl Debug for ScopeError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let a = match self { + Self::Raffia(kind, source) => format!("{kind}: at {source}") + }; + + write!(f, "{a}") } } @@ -33,8 +39,16 @@ impl<'s> ArbitraryScope<'s> { name: syn::Ident, source: &'s str, ) -> Result<Self, ScopeError> { + let adapter = match StylesheetAdapter::new(source, syntax) { + Ok(a) => a, + Err(e) => { + let source = &source[e.span.start..e.span.end]; + return Err(ScopeError::Raffia(e.kind, source.to_string())) + } + }; + Ok(Self { - adapter: StylesheetAdapter::new(source, syntax)?, + adapter, name, }) } diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index 42d1725..b05d03f 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -1,6 +1,6 @@ use proc_macro2::TokenStream; use quote::quote; -use regex::Regex; +use sabry_intrnl::scoper::ArbitraryScope; use syn::{parse::Parse, Ident}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -21,6 +21,14 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { Err(e) => return e.to_compile_error(), }; + // quick raffia syntax check + match ArbitraryScope::from_source(mode.into(), ident.clone(), &code.code) { + Ok(_) => {}, + Err(e) => { + return syn::Error::new(code.span, format!("{e:?}")).into_compile_error() + } + } + let sourcesass = code.to_string(); let identname = ident.to_string(); let macro_doc = format!("Arbitrary {:?} code declared with `sassy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); From 2247f4cdfa4ce9cc7c1224c7c140805be8f9c01e Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 00:34:03 +0500 Subject: [PATCH 122/184] fmt: always forget about fmt --- sabry_intrnl/src/compiler/mod.rs | 9 ++++++--- sabry_intrnl/src/scoper/mod.rs | 9 +++------ sabry_procmacro_impl/src/impls/sassy.rs | 6 ++---- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 7376497..882a8bf 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -109,19 +109,22 @@ impl Debug for SabryCompilerError { Self::LightPrint(e) => format!( "{} at {:?}", e.kind, - e.loc.clone() + e.loc + .clone() .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) ), Self::GrassCompile(err) => format!("{err}"), Self::LightMinify(e) => format!( "{} at {:?}", e.kind, - e.loc.clone() + e.loc + .clone() .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) ), Self::LightParse { kind, loc } => format!( "{kind} at {:?}", - loc.clone().map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) + loc.clone() + .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) ), }; diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index a42949c..d89f7b0 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -18,7 +18,7 @@ pub enum ScopeError { impl Debug for ScopeError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let a = match self { - Self::Raffia(kind, source) => format!("{kind}: at {source}") + Self::Raffia(kind, source) => format!("{kind}: at {source}"), }; write!(f, "{a}") @@ -43,14 +43,11 @@ impl<'s> ArbitraryScope<'s> { Ok(a) => a, Err(e) => { let source = &source[e.span.start..e.span.end]; - return Err(ScopeError::Raffia(e.kind, source.to_string())) + return Err(ScopeError::Raffia(e.kind, source.to_string())); } }; - Ok(Self { - adapter, - name, - }) + Ok(Self { adapter, name }) } /// Consume arbitrary scope and create a [HashedScope] in its basis diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index b05d03f..e8149bc 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -23,10 +23,8 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { // quick raffia syntax check match ArbitraryScope::from_source(mode.into(), ident.clone(), &code.code) { - Ok(_) => {}, - Err(e) => { - return syn::Error::new(code.span, format!("{e:?}")).into_compile_error() - } + Ok(_) => {} + Err(e) => return syn::Error::new(code.span, format!("{e:?}")).into_compile_error(), } let sourcesass = code.to_string(); From 4a5fbb9ef05cfd16ad22073a98a94cace1f3efe3 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 00:49:57 +0500 Subject: [PATCH 123/184] fix: drop unused dependency --- sabry_intrnl/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index e7ff33b..3d2a39e 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -18,7 +18,6 @@ grass = {version = "^0.13"} lightningcss = {version = "1.0.0-alpha.59"} blake3 = {version = "^1.5"} base64 = {version = "^0.22"} -const_format = {version = "^0.2"} thiserror = {version = "^1.0"} serde = {version = "^1.0", features = ["derive"]} From e53bafd2ce21189665c06dcd455b1a6e89dbbd85 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 00:50:19 +0500 Subject: [PATCH 124/184] docs: improve sass --- Cargo.lock | 1 - README.md | 2 +- examples/define-styles/Cargo.lock | 27 --------------------------- tests/assets/mixins.sass | 2 +- 4 files changed, 2 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d4e21b3..27e224e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1813,7 +1813,6 @@ dependencies = [ "base64", "blake3", "cfg-if", - "const_format", "grass", "lightningcss", "proc-macro2", diff --git a/README.md b/README.md index 7af58ea..9c398aa 100644 --- a/README.md +++ b/README.md @@ -444,7 +444,7 @@ sassy!(module2 "tests/assets/mixins.scss"); sassy!(module3:sass "tests/assets/mixins.sass"); // works, but there are catches. sassy!(module4:sass {" - =colored($col: primary) + @mixin colored($col: primary) @if $col == primary color: white @else diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index 1b2178a..73cad63 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -268,26 +268,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "const_format" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - [[package]] name = "constant_time_eq" version = "0.3.1" @@ -1007,7 +987,6 @@ dependencies = [ "base64", "blake3", "cfg-if", - "const_format", "grass", "lightningcss", "proc-macro2", @@ -1240,12 +1219,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "utf8parse" version = "0.2.2" diff --git a/tests/assets/mixins.sass b/tests/assets/mixins.sass index 9e2462e..45a1ec6 100644 --- a/tests/assets/mixins.sass +++ b/tests/assets/mixins.sass @@ -1,4 +1,4 @@ -=colored($color: primary) +@mixin colored($color: primary) @if $color == primary color: white @else From dc3c3bac11b3c0f8e635247336ef2da1144c450d Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 01:33:28 +0500 Subject: [PATCH 125/184] feat!: introduce SASS prelude as well. Its more convenient then making build.rs sassy macro. --- README.md | 13 +++--- examples/leptos-axum/Cargo.toml | 2 + examples/leptos-axum/styles/app.scss | 5 +++ examples/leptos-axum/styles/prelude.css | 4 ++ sabry_build/src/buildmagic.rs | 56 ++++++++++++++++++++++--- sabry_intrnl/src/config/mod.rs | 6 ++- sabry_procmacro_impl/src/impls/mod.rs | 18 ++++++-- 7 files changed, 88 insertions(+), 16 deletions(-) create mode 100644 examples/leptos-axum/styles/app.scss create mode 100644 examples/leptos-axum/styles/prelude.css diff --git a/README.md b/README.md index 9c398aa..25774c6 100644 --- a/README.md +++ b/README.md @@ -342,13 +342,14 @@ Full example, close to defaults: [package.metadata.sabry] css.bundle = "target/static/style.css" -css.bundle_prelude = ["assets/prelude.css"] +css.prelude = ["assets/prelude.css"] css.scopes = "target/statis/scopes/" css.minify = true sass.intermediate_dir = "target/.sabry/sass" sass.module_name_collision = "merge" sass.modules = ["assets/sass/mod1.scss"] +sass.prelude = ["assets/sass/prelude.scss"] sass.scanroot = "src" hash.size = 6 @@ -366,11 +367,11 @@ ie = "6" ### `sabry.css` -**bundle** *(no default)* - file path ro write CSS bundle into relative to project root +**bundle** *(no default)* - file path ro write CSS bundle into, relative to crate root -**bundle_prelude** *(no default)* - collection of CSS files, relative to the project root, which content will be inserted before the compiled style into the *bundle* file if any +**prelude** *(no default)* - collection of CSS files, relative to the crate root, which content will be inserted before the compiled style into the *bundle* file if any. Does not affect generated CSS scopes if any. -**scopes** *(no default)* - dir path to put separate CSS for every scope into relative to project root +**scopes** *(no default)* - dir path to put separate CSS for every scope into, relative to crate root **minify** *(default true)* - print compressed CSS output and do the lightningcss thing @@ -380,7 +381,9 @@ ie = "6" **scanroot** *(default "src")* - root directory to start scanning "rs" files from. Used in build function -**modules** *(no default)* - collection of SASS/SCSS files, relative to the project root, which should be available as modules as well +**modules** *(no default)* - collection of SASS/SCSS files, relative to the crate root, which should be available as modules as well + +**prelude** *(no default)* - collection of SASS/SCSS files, relative to the crate root, which content will be compiled into CSS and then inserted into the CSS *bundle* if any. Does not affect generated CSS scopes if any. **module_name_collision** *(default "merge")* - how to handle similary named modules. diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 39e1e43..f1aadcd 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -49,6 +49,8 @@ ssr = [ css.minify = true # We'll use bundle for leptos css.bundle = "target/.sabry/target/bundle.css" +css.prelude = ["styles/prelude.css"] +sass.prelude = ["styles/app.scss"] [package.metadata.leptos] # Sabry-specific quality of life config diff --git a/examples/leptos-axum/styles/app.scss b/examples/leptos-axum/styles/app.scss new file mode 100644 index 0000000..9e4155f --- /dev/null +++ b/examples/leptos-axum/styles/app.scss @@ -0,0 +1,5 @@ +@use 'theme'; + +html { + @include theme.surface(primary); +} diff --git a/examples/leptos-axum/styles/prelude.css b/examples/leptos-axum/styles/prelude.css new file mode 100644 index 0000000..66e2b6f --- /dev/null +++ b/examples/leptos-axum/styles/prelude.css @@ -0,0 +1,4 @@ +html, body { + margin: 0; + padding: 0; +} diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index fe3043c..0e66c96 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -13,7 +13,7 @@ use sabry_intrnl::{ config::{manifest::ManifestError, BehavHashCollision, BehavSassModCollision, SabryConfig}, scoper::{hash::ScopeHash, ArbitraryScope, ScopeError}, }; -use sabry_procmacro_impl::impls::styly; +use sabry_procmacro_impl::impls::{styly, ArbitraryStyleSyntax}; use walkdir::WalkDir; use crate::filevisit::{self, FileVisitError}; @@ -164,6 +164,7 @@ impl SabryBuilder { println!("🧙 sabry didn't load any usable styles"); } + // compile styly! macro parsed styles for styly in &self.state.loaded_stylyses { let scope = ArbitraryScope::from_source( styly.syntax.into(), @@ -193,6 +194,12 @@ impl SabryBuilder { .push((scope.original_scope.name.to_string(), css)); } + // compile sass preludes into the CSS prelude + for pre in &self.state.sass_prelude { + let css = self.css_compiler.compile_module(pre.syntax.into(), &pre.code)?; + self.state.css_prelude.push_str(&css); + } + Ok(()) } @@ -230,12 +237,12 @@ impl SabryBuilder { Ok(()) } - /// Load up configured preludes as side modules + /// Load up configured preludes and side modules pub fn load_preludes(&mut self) -> BuilderResult { // load sass modules from config let mut modules: Vec<StyleModule> = vec![]; - if let Some(sass_pre) = &self.config.sass.modules { - for pre in sass_pre { + if let Some(sass_mods) = &self.config.sass.modules { + for pre in sass_mods { let pre_path = PathBuf::from_str(pre)?; let pre_name = pre_path .file_name() @@ -250,8 +257,26 @@ impl SabryBuilder { self.load_side_module(name, code)?; } + // load SASS preludes + if let Some(sass_pres) = &self.config.sass.prelude { + let mut sass_preludes: Vec<SassPreludeModule> = vec![]; + for pre in sass_pres { + let pre_path = PathBuf::from_str(pre)?; + + let syntax = pre_path.extension().unwrap_or_default().to_str().unwrap_or_default(); + let syntax = match ArbitraryStyleSyntax::try_from(syntax) { + Ok(s) => s, + Err(_) => return Err(SabryBuildError::Another(format!("Unknown syntax for sass prelude {pre}"))) + }; + + let code = fs::read_to_string(pre_path)?; + sass_preludes.push(SassPreludeModule {syntax, code}); + } + self.state.sass_prelude.extend(sass_preludes); + } + // load css preludes - if let Some(css_pre) = &self.config.css.bundle_prelude { + if let Some(css_pre) = &self.config.css.prelude { for pre in css_pre { let code = fs::read_to_string(pre)?; self.state.css_prelude.push_str(&code); @@ -309,11 +334,30 @@ impl SabryBuilder { #[derive(Default)] pub struct SabryBuildState { + /// HashSet of scope hashes known by builder + /// Used to determine hash collision known_scope_hashes: HashSet<ScopeHash>, + /// HashSet of module names known by builder + /// Used to determine module name collision known_side_modules: HashSet<ModuleName>, + /// styly! macro uses, parsed loaded_stylyses: Vec<styly::MacroSyntax>, + /// CSS modules to form bundle/write separately loaded_css_modules: Vec<StyleModule>, + /// CSS prelude to write into bundle + /// Lives separately from [loaded_css_modules] to avoid name collision css_prelude: String, + /// SASS preludes loaded from config + /// Should be compiled into loaded_css_modules as well + sass_prelude: Vec<SassPreludeModule> +} + +/// Convenience struct for [SabryBuildState::sass_prelude] +pub struct SassPreludeModule { + /// syntax for the prelude + syntax: ArbitraryStyleSyntax, + /// code of the prelude + code: String } #[derive(Debug, thiserror::Error)] @@ -342,4 +386,6 @@ pub enum SabryBuildError { CssCompile(#[from] SabryCompilerError), #[error("Failed to load config/manifest")] Manifest(#[from] ManifestError), + #[error("Another error")] + Another(String) } diff --git a/sabry_intrnl/src/config/mod.rs b/sabry_intrnl/src/config/mod.rs index 0903929..7fdfa13 100644 --- a/sabry_intrnl/src/config/mod.rs +++ b/sabry_intrnl/src/config/mod.rs @@ -41,7 +41,7 @@ impl From<&ValuableManifest> for SabryConfig { pub struct SabryCssConfig { pub bundle: Option<String>, pub scopes: Option<String>, - pub bundle_prelude: Option<Vec<String>>, + pub prelude: Option<Vec<String>>, #[serde(default = "SabryCssConfig::default_minify")] pub minify: bool, } @@ -57,7 +57,7 @@ impl Default for SabryCssConfig { Self { bundle: None, scopes: None, - bundle_prelude: None, + prelude: None, minify: Self::default_minify(), } } @@ -71,6 +71,7 @@ pub struct SabrySassConfig { #[serde(default = "SabrySassConfig::default_scanroot")] pub scanroot: String, pub modules: Option<Vec<String>>, + pub prelude: Option<Vec<String>>, #[serde(default = "SabrySassConfig::default_intermediate_dir")] pub intermediate_dir: String, #[serde(default = "SabrySassConfig::default_module_name_collision")] @@ -94,6 +95,7 @@ impl Default for SabrySassConfig { Self { scanroot: Self::default_scanroot(), modules: None, + prelude: None, intermediate_dir: Self::default_intermediate_dir(), module_name_collision: Self::default_module_name_collision(), } diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index faa10df..0a0bbde 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -117,6 +117,17 @@ impl ToTokens for ArbitraryStyleSyntax { } } +impl TryFrom<&str> for ArbitraryStyleSyntax { + type Error = (); + fn try_from(value: &str) -> Result<Self, Self::Error> { + match value { + "sass" => Ok(Self::Sass), + "scss" => Ok(Self::Scss), + _ => Err(()) + } + } +} + impl Parse for ArbitraryStyleSyntax { fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { match input.parse::<Token![:]>() { @@ -128,10 +139,9 @@ impl Parse for ArbitraryStyleSyntax { } let ident = input.parse::<Ident>()?; - match ident.to_string().as_str() { - "sass" => Ok(Self::Sass), - "scss" => Ok(Self::Scss), - _ => Err(syn::Error::new( + match Self::try_from(ident.to_string().as_str()) { + Ok(v) => Ok(v), + Err(_) => Err(syn::Error::new( ident.span(), format!( "Available syntax are `sass` and `scss`, omit to use default {:?} syntax", From c514a38d3595d75f707b6a37773e7a4de72268da Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 01:52:22 +0500 Subject: [PATCH 126/184] refactor: use single unified syntax shim type instead of many --- sabry_build/src/buildmagic.rs | 2 +- sabry_intrnl/src/compiler/mod.rs | 31 +----------- sabry_intrnl/src/scoper/hash.rs | 6 +-- sabry_intrnl/src/scoper/mod.rs | 10 ++-- sabry_intrnl/src/syntax/mod.rs | 22 ++++++--- sabry_intrnl/src/syntax/ostrta.rs | 64 +++++++++++++++++++++++++ sabry_procmacro_impl/src/impls/mod.rs | 53 ++++---------------- sabry_procmacro_impl/src/impls/sassy.rs | 2 +- sabry_procmacro_impl/src/impls/styly.rs | 4 +- 9 files changed, 102 insertions(+), 92 deletions(-) create mode 100644 sabry_intrnl/src/syntax/ostrta.rs diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index 0e66c96..7faa138 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -186,7 +186,7 @@ impl SabryBuilder { } let css = self.css_compiler.compile_module( - scope.original_scope.adapter().syntax.into(), + scope.original_scope.adapter().syntax, &scope.hashed_code, )?; self.state diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 882a8bf..4fcd129 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -7,7 +7,7 @@ use lightningcss::{ targets::Targets, }; -use crate::config::SabryConfig; +use crate::{config::SabryConfig, syntax::ostrta::OneSyntaxToRuleThemAll}; /// Convenience wrapper on Grass and Lightningcss pub struct CompilerAdapter { @@ -21,7 +21,7 @@ impl CompilerAdapter { pub fn compile_module( &self, - syntax: CompilerSyntax, + syntax: OneSyntaxToRuleThemAll, code: &str, ) -> Result<String, SabryCompilerError> { let options = grass::Options::from(&self.config).input_syntax(syntax.into()); @@ -131,30 +131,3 @@ impl Debug for SabryCompilerError { write!(f, "{explain}") } } - -/// Unification wrapper over all the Syntax enums -#[derive(Clone, Copy)] -pub enum CompilerSyntax { - Sass, - Scss, -} - -impl From<raffia::Syntax> for CompilerSyntax { - fn from(value: raffia::Syntax) -> Self { - match value { - raffia::Syntax::Sass => Self::Sass, - raffia::Syntax::Scss => Self::Scss, - // TODO: fallbacky error-prone - _ => Self::Scss, - } - } -} - -impl From<CompilerSyntax> for grass::InputSyntax { - fn from(value: CompilerSyntax) -> Self { - match value { - CompilerSyntax::Scss => Self::Scss, - CompilerSyntax::Sass => Self::Sass, - } - } -} diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index 4188a39..e40819f 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -69,7 +69,7 @@ impl ScopeHash { mod test { use syn::Ident; - use crate::{config::SabryHashConfig, scoper::ArbitraryScope}; + use crate::{config::SabryHashConfig, scoper::ArbitraryScope, syntax::ostrta::OneSyntaxToRuleThemAll}; use super::ScopeHash; @@ -78,7 +78,7 @@ mod test { let source = ".cls1{color:red; &-dark{color: black} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; let scope1 = ArbitraryScope::from_source( - raffia::Syntax::Scss, + OneSyntaxToRuleThemAll::Scss, syn::parse_str::<Ident>("lasifudm").unwrap(), source, ) @@ -86,7 +86,7 @@ mod test { let hash1 = ScopeHash::new(&scope1, &SabryHashConfig::default()); let scope2 = ArbitraryScope::from_source( - raffia::Syntax::Scss, + OneSyntaxToRuleThemAll::Scss, syn::parse_str::<Ident>("lasifudm").unwrap(), source, ) diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index d89f7b0..934d646 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -5,7 +5,7 @@ use hash::ScopeHash; use raffia::Spanned; use regex::Regex; -use crate::{config::SabryHashConfig, syntax::StylesheetAdapter}; +use crate::{config::SabryHashConfig, syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}}; pub mod hash; @@ -35,7 +35,7 @@ pub struct ArbitraryScope<'s> { impl<'s> ArbitraryScope<'s> { /// Parse given source code with given syntax and assign given name pub fn from_source( - syntax: raffia::Syntax, + syntax: OneSyntaxToRuleThemAll, name: syn::Ident, source: &'s str, ) -> Result<Self, ScopeError> { @@ -375,7 +375,7 @@ mod test { use crate::{ config::SabryHashConfig, - scoper::{hash::ScopeHash, HashedScope}, + scoper::{hash::ScopeHash, HashedScope}, syntax::ostrta::OneSyntaxToRuleThemAll, }; use super::ArbitraryScope; @@ -415,7 +415,7 @@ mod test { } let scope = ArbitraryScope::from_source( - raffia::Syntax::Scss, + OneSyntaxToRuleThemAll::Scss, syn::parse_str("scope1").unwrap(), code, ) @@ -463,7 +463,7 @@ mod test { let hash_cfg = SabryHashConfig::default(); let scope = ArbitraryScope::from_source( - raffia::Syntax::Scss, + OneSyntaxToRuleThemAll::Scss, syn::parse_str::<Ident>("scope2oiej").unwrap(), code, ) diff --git a/sabry_intrnl/src/syntax/mod.rs b/sabry_intrnl/src/syntax/mod.rs index a52d7d6..ba85336 100644 --- a/sabry_intrnl/src/syntax/mod.rs +++ b/sabry_intrnl/src/syntax/mod.rs @@ -1,24 +1,30 @@ +use ostrta::OneSyntaxToRuleThemAll; use raffia::{ ast::{ ClassSelector, CompoundSelector, IdSelector, NestingSelector, SimpleSelector, Statement, Stylesheet, TypeSelector, }, - ParserBuilder, Syntax, + ParserBuilder, }; +pub mod ostrta; + /// Convenience wrapper for [Stylesheet] pub struct StylesheetAdapter<'s> { - pub syntax: Syntax, + pub syntax: OneSyntaxToRuleThemAll, source: &'s str, stylesheet: Stylesheet<'s>, } impl<'s> StylesheetAdapter<'s> { - pub fn new(source: &'s str, syntax: Syntax) -> Result<Self, raffia::error::Error> { + pub fn new( + source: &'s str, + syntax: OneSyntaxToRuleThemAll, + ) -> Result<Self, raffia::error::Error> { Ok(Self { stylesheet: ParserBuilder::new(source) .ignore_comments() - .syntax(syntax) + .syntax(syntax.into()) .build() .parse()?, syntax, @@ -103,6 +109,8 @@ mod test { use raffia::Spanned; + use crate::syntax::ostrta::OneSyntaxToRuleThemAll; + use super::StylesheetAdapter; #[test] @@ -157,7 +165,7 @@ div#id2 let expect_tags = HashSet::from(["ul", "div", "span"]); //scss - let adp = StylesheetAdapter::new(source_scss, raffia::Syntax::Scss).unwrap(); + let adp = StylesheetAdapter::new(source_scss, OneSyntaxToRuleThemAll::Scss).unwrap(); let classes = adp .class_selectors() @@ -183,7 +191,7 @@ div#id2 assert_eq!(expect_tags, tags); //sass - let adp = StylesheetAdapter::new(source_sass, raffia::Syntax::Sass).unwrap(); + let adp = StylesheetAdapter::new(source_sass, OneSyntaxToRuleThemAll::Sass).unwrap(); let classes = adp .class_selectors() @@ -215,7 +223,7 @@ div#id2 let newname = "cls203-jg7ihgjhftyfhjh"; let expect = ".cls1{color:red; .cls203-jg7ihgjhftyfhjh{color:green;}}"; - let adp = StylesheetAdapter::new(scss, raffia::Syntax::Scss).unwrap(); + let adp = StylesheetAdapter::new(scss, OneSyntaxToRuleThemAll::Scss).unwrap(); let classes = adp.class_selectors(); let target_class = classes[0].clone(); diff --git a/sabry_intrnl/src/syntax/ostrta.rs b/sabry_intrnl/src/syntax/ostrta.rs new file mode 100644 index 0000000..1edbf1c --- /dev/null +++ b/sabry_intrnl/src/syntax/ostrta.rs @@ -0,0 +1,64 @@ +/// Convenience unification entrypoint +/// to make friends with all the different syntax-consumers +#[derive(Debug, Clone, Copy)] +pub enum OneSyntaxToRuleThemAll { + Sass, + Scss +} + +impl Default for OneSyntaxToRuleThemAll { + fn default() -> Self { + Self::Scss + } +} + +impl TryFrom<&str> for OneSyntaxToRuleThemAll { + type Error = (); + fn try_from(value: &str) -> Result<Self, Self::Error> { + match value { + "sass" => Ok(Self::Sass), + "scss" => Ok(Self::Scss), + _ => Err(()) + } + } +} + +impl TryFrom<raffia::Syntax> for OneSyntaxToRuleThemAll { + type Error = (); + fn try_from(value: raffia::Syntax) -> Result<Self, Self::Error> { + match value { + raffia::Syntax::Sass => Ok(Self::Sass), + raffia::Syntax::Scss => Ok(Self::Scss), + _ => Err(()) + } + } +} + +impl TryFrom<grass::InputSyntax> for OneSyntaxToRuleThemAll { + type Error = (); + fn try_from(value: grass::InputSyntax) -> Result<Self, Self::Error> { + match value { + grass::InputSyntax::Sass => Ok(Self::Sass), + grass::InputSyntax::Scss => Ok(Self::Scss), + _ => Err(()) + } + } +} + +impl From<OneSyntaxToRuleThemAll> for raffia::Syntax { + fn from(value: OneSyntaxToRuleThemAll) -> Self { + match value { + OneSyntaxToRuleThemAll::Sass => Self::Sass, + OneSyntaxToRuleThemAll::Scss => Self::Scss + } + } +} + +impl From<OneSyntaxToRuleThemAll> for grass::InputSyntax { + fn from(value: OneSyntaxToRuleThemAll) -> Self { + match value { + OneSyntaxToRuleThemAll::Scss => Self::Scss, + OneSyntaxToRuleThemAll::Sass => Self::Sass + } + } +} diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index 0a0bbde..009df1f 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -3,7 +3,7 @@ use std::{fmt::Debug, fs, path::PathBuf, str::FromStr}; use proc_macro2::{Span, TokenStream}; use quote::{quote, ToTokens, TokenStreamExt}; use regex::Regex; -use sabry_intrnl::compiler::CompilerSyntax; +use sabry_intrnl::syntax::ostrta::OneSyntaxToRuleThemAll; use syn::{braced, parse::Parse, Ident, LitStr, Token}; pub mod sassy; @@ -93,26 +93,20 @@ impl ToString for ArbitraryStyleBlock { } } -#[derive(Clone, Copy)] -pub enum ArbitraryStyleSyntax { - Scss, - Sass, -} +#[derive(Default, Debug, Clone, Copy)] +pub struct ArbitraryStyleSyntax(OneSyntaxToRuleThemAll); -impl From<ArbitraryStyleSyntax> for CompilerSyntax { +impl From<ArbitraryStyleSyntax> for OneSyntaxToRuleThemAll { fn from(value: ArbitraryStyleSyntax) -> Self { - match value { - ArbitraryStyleSyntax::Sass => Self::Sass, - ArbitraryStyleSyntax::Scss => Self::Scss, - } + value.0 } } impl ToTokens for ArbitraryStyleSyntax { fn to_tokens(&self, tokens: &mut TokenStream) { - match self { - Self::Sass => tokens.append_all(quote! {"sass"}), - Self::Scss => tokens.append_all(quote! {"scss"}), + match self.0 { + OneSyntaxToRuleThemAll::Sass => tokens.append_all(quote! {"sass"}), + OneSyntaxToRuleThemAll::Scss => tokens.append_all(quote! {"scss"}), } } } @@ -120,11 +114,7 @@ impl ToTokens for ArbitraryStyleSyntax { impl TryFrom<&str> for ArbitraryStyleSyntax { type Error = (); fn try_from(value: &str) -> Result<Self, Self::Error> { - match value { - "sass" => Ok(Self::Sass), - "scss" => Ok(Self::Scss), - _ => Err(()) - } + Ok(Self(OneSyntaxToRuleThemAll::try_from(value)?)) } } @@ -152,31 +142,6 @@ impl Parse for ArbitraryStyleSyntax { } } -impl Debug for ArbitraryStyleSyntax { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let name = match self { - Self::Sass => "sass", - Self::Scss => "scss", - }; - write!(f, "{name}") - } -} - -impl Default for ArbitraryStyleSyntax { - fn default() -> Self { - Self::Scss - } -} - -impl From<ArbitraryStyleSyntax> for raffia::Syntax { - fn from(value: ArbitraryStyleSyntax) -> Self { - match value { - ArbitraryStyleSyntax::Sass => Self::Sass, - ArbitraryStyleSyntax::Scss => Self::Scss, - } - } -} - #[cfg(test)] mod test { #[test] diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index e8149bc..c15c303 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -22,7 +22,7 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { }; // quick raffia syntax check - match ArbitraryScope::from_source(mode.into(), ident.clone(), &code.code) { + match ArbitraryScope::from_source(mode.0, ident.clone(), &code.code) { Ok(_) => {} Err(e) => return syn::Error::new(code.span, format!("{e:?}")).into_compile_error(), } diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 4a157d2..296fc4f 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -45,7 +45,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { Err(e) => return e.to_compile_error(), }; - let scope = match ArbitraryScope::from_source(ms.syntax.into(), ms.scope.clone(), &ms.code.code) + let scope = match ArbitraryScope::from_source(ms.syntax.0, ms.scope.clone(), &ms.code.code) { Ok(s) => match s.hashed(&config.hash) { Ok(hs) => Ok(hs), @@ -134,7 +134,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { if constant { let compiler = CompilerAdapter::new(config.clone()); - let css = match compiler.compile_module(ms.syntax.into(), &ms.code.code) { + let css = match compiler.compile_module(ms.syntax.0, &ms.code.code) { Ok(c) => c, Err(e) => { return syn::Error::new( From 8a65cfd1fbc1a656659260aad6077b78777d7027 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 01:59:17 +0500 Subject: [PATCH 127/184] idk!: dont see any reason to have Cargo.lock here --- .gitignore | 1 + Cargo.lock | 2524 ---------------------------------------------------- 2 files changed, 1 insertion(+), 2524 deletions(-) delete mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index f276f31..e2bc000 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ rust-toolchain.toml .vscode .profile +/Cargo.lock diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 27e224e..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,2524 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "anstream" -version = "0.6.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "any_spawner" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9747eb01aed7603aba23f7c869d5d7e5d37aab9c3501aced42d8fdb786f1f6e3" -dependencies = [ - "futures", - "thiserror", - "wasm-bindgen-futures", -] - -[[package]] -name = "anyhow" -version = "1.0.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "attribute-derive" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f1ee502851995027b06f99f5ffbeffa1406b38d0b318a1ebfa469332c6cbafd" -dependencies = [ - "attribute-derive-macro", - "derive-where", - "manyhow", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "attribute-derive-macro" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3601467f634cfe36c4780ca9c75dea9a5b34529c1f2810676a337e7e0997f954" -dependencies = [ - "collection_literals", - "interpolator", - "manyhow", - "proc-macro-utils 0.8.0", - "proc-macro2", - "quote", - "quote-use", - "syn 2.0.85", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64-simd" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" -dependencies = [ - "simd-abstraction", -] - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake3" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" - -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" - -[[package]] -name = "cc" -version = "1.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - -[[package]] -name = "codee" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3ad3122b0001c7f140cf4d605ef9a9e2c24d96ab0b4fb4347b76de2425f445" -dependencies = [ - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "codemap" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" - -[[package]] -name = "collection_literals" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" - -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "config" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" -dependencies = [ - "convert_case", - "nom", - "pathdiff", - "serde", - "toml", -] - -[[package]] -name = "const-str" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" -dependencies = [ - "const-str-proc-macro", -] - -[[package]] -name = "const-str-proc-macro" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "const_format" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "const_str_slice_concat" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f67855af358fcb20fac58f9d714c94e2b228fe5694c1c9b4ead4a366343eda1b" - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "cssparser" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "phf 0.11.2", - "smallvec", -] - -[[package]] -name = "cssparser-color" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" -dependencies = [ - "cssparser", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.85", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "data-url" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" -dependencies = [ - "matches", -] - -[[package]] -name = "derive-where" -version = "1.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "drain_filter_polyfill" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" - -[[package]] -name = "dtoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "either_of" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6e22feb4d5cacf9f2c64902a1c35ef0f2d766e42db316a98b93992bbce669cb" -dependencies = [ - "pin-project-lite", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "event-listener" -version = "5.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "http", - "js-sys", - "pin-project", - "serde", - "serde_json", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "grass" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" -dependencies = [ - "clap", - "getrandom", - "grass_compiler", -] - -[[package]] -name = "grass_compiler" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" -dependencies = [ - "codemap", - "indexmap", - "lasso", - "once_cell", - "phf 0.11.2", - "rand", -] - -[[package]] -name = "guardian" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "493913a18c0d7bebb75127a26a432162c59edbe06f6cf712001e3e769345e8b5" - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.11", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "html-escape" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" -dependencies = [ - "utf8-width", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "hydration_context" -version = "0.2.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3572b2778f74f110d907744b8d44be3602f1588aa5b7a098d8911a5d806b7f1" -dependencies = [ - "futures", - "once_cell", - "or_poisoned", - "pin-project-lite", - "serde", - "throw_error", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" -dependencies = [ - "equivalent", - "hashbrown 0.15.0", -] - -[[package]] -name = "interpolator" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lasso" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "leptos" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf56a5fa2a3ca01c4b49255a66375612ddd138aeef2ffe11f7157ea3e349a82" -dependencies = [ - "any_spawner", - "cfg-if", - "either_of", - "futures", - "hydration_context", - "leptos_config", - "leptos_dom", - "leptos_hot_reload", - "leptos_macro", - "leptos_server", - "oco_ref", - "or_poisoned", - "paste", - "reactive_graph", - "rustc-hash", - "send_wrapper", - "serde", - "serde_qs", - "server_fn", - "slotmap", - "tachys", - "thiserror", - "throw_error", - "typed-builder", - "typed-builder-macro", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "leptos_config" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b972bec4a29c0a351fa54736b70eb9eda05938f732d1ec659f63887a5208c4bd" -dependencies = [ - "config", - "regex", - "serde", - "thiserror", - "typed-builder", -] - -[[package]] -name = "leptos_dom" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ccab6ce79c7428460451e43edf052c5344a682058666f8ef19c19e898387fca" -dependencies = [ - "js-sys", - "or_poisoned", - "reactive_graph", - "send_wrapper", - "tachys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "leptos_hot_reload" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1406f4641b5521324f3c5845f065e8a67b60147ee1aae56721dc2ba7c317dc2" -dependencies = [ - "anyhow", - "camino", - "indexmap", - "parking_lot", - "proc-macro2", - "quote", - "rstml", - "serde", - "syn 2.0.85", - "walkdir", -] - -[[package]] -name = "leptos_macro" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62fa728becd72d6f08cc9f93db3a712b4e068edb8b8af2da5b933bd3d1dcede" -dependencies = [ - "attribute-derive", - "cfg-if", - "convert_case", - "html-escape", - "itertools 0.13.0", - "leptos_hot_reload", - "prettyplease", - "proc-macro-error2", - "proc-macro2", - "quote", - "rstml", - "server_fn_macro", - "syn 2.0.85", - "uuid", -] - -[[package]] -name = "leptos_server" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc869a5f93379eec0b4af337bfe953a6b6b7a20223c56ab6dbde7798d0296b4" -dependencies = [ - "any_spawner", - "base64", - "codee", - "futures", - "hydration_context", - "or_poisoned", - "reactive_graph", - "send_wrapper", - "serde", - "serde_json", - "server_fn", - "tachys", -] - -[[package]] -name = "libc" -version = "0.2.161" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" - -[[package]] -name = "lightningcss" -version = "1.0.0-alpha.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" -dependencies = [ - "ahash 0.8.11", - "bitflags", - "const-str", - "cssparser", - "cssparser-color", - "dashmap 5.5.3", - "data-encoding", - "getrandom", - "itertools 0.10.5", - "lazy_static", - "lightningcss-derive", - "parcel_selectors", - "parcel_sourcemap", - "paste", - "pathdiff", - "rayon", - "serde", - "smallvec", -] - -[[package]] -name = "lightningcss-derive" -version = "1.0.0-alpha.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "linear-map" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "manyhow" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91ea592d76c0b6471965708ccff7e6a5d277f676b90ab31f4d3f3fc77fade64" -dependencies = [ - "manyhow-macros", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "manyhow-macros" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64621e2c08f2576e4194ea8be11daf24ac01249a4f53cd8befcbb7077120ead" -dependencies = [ - "proc-macro-utils 0.8.0", - "proc-macro2", - "quote", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "next_tuple" -version = "0.1.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5154cd29823504d933fa19d02dd52f9f692cf9e337653f1409db70863fa5cd49" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "oco_ref" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b94982fe39a861561cf67ff17a7849f2cedadbbad960a797634032b7abb998" -dependencies = [ - "serde", - "thiserror", -] - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "or_poisoned" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" - -[[package]] -name = "outref" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" - -[[package]] -name = "parcel_selectors" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" -dependencies = [ - "bitflags", - "cssparser", - "fxhash", - "log", - "phf 0.10.1", - "phf_codegen", - "precomputed-hash", - "smallvec", -] - -[[package]] -name = "parcel_sourcemap" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" -dependencies = [ - "base64-simd", - "data-url", - "rkyv", - "serde", - "serde_json", - "vlq", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pathdiff" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_shared 0.10.0", -] - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared 0.11.2", -] - -[[package]] -name = "phf_codegen" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared 0.11.2", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "prettyplease" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" -dependencies = [ - "proc-macro2", - "syn 2.0.85", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "proc-macro-utils" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f59e109e2f795a5070e69578c4dc101068139f74616778025ae1011d4cd41a8" -dependencies = [ - "proc-macro2", - "quote", - "smallvec", -] - -[[package]] -name = "proc-macro-utils" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" -dependencies = [ - "proc-macro2", - "quote", - "smallvec", -] - -[[package]] -name = "proc-macro2" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", - "version_check", - "yansi", -] - -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "quote-use" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9619db1197b497a36178cfc736dc96b271fe918875fbf1344c436a7e93d0321e" -dependencies = [ - "quote", - "quote-use-macros", -] - -[[package]] -name = "quote-use-macros" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82ebfb7faafadc06a7ab141a6f67bcfb24cb8beb158c6fe933f2f035afa99f35" -dependencies = [ - "proc-macro-utils 0.10.0", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "raffia" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" -dependencies = [ - "raffia_macro", - "smallvec", -] - -[[package]] -name = "raffia_macro" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" -dependencies = [ - "heck", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "reactive_graph" -version = "0.1.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e99ef30cfb23ffd2da6bbfcfa218c043003fdc40909102b52e9cc48707894e8" -dependencies = [ - "any_spawner", - "async-lock", - "futures", - "guardian", - "hydration_context", - "or_poisoned", - "pin-project-lite", - "rustc-hash", - "send_wrapper", - "serde", - "slotmap", - "thiserror", - "web-sys", -] - -[[package]] -name = "reactive_stores" -version = "0.1.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8062a7f178f934c17145a4dab0e8f0bf8879975ce72e1146b9bcd3bc6f342c19" -dependencies = [ - "guardian", - "itertools 0.13.0", - "or_poisoned", - "paste", - "reactive_graph", - "reactive_stores_macro", - "rustc-hash", -] - -[[package]] -name = "reactive_stores_macro" -version = "0.1.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1262c9b4c1633da17472d69a2bc7d4709780c616e919b236e51949f160d2ab2e" -dependencies = [ - "convert_case", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "redox_syscall" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rkyv" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rstml" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51187e564f12336ef40cd04f6f4d805d6919188001dcf1e0a021898ea0fe28ce" -dependencies = [ - "derive-where", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.85", - "syn_derive", - "thiserror", -] - -[[package]] -name = "rustc-hash" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "sabry" -version = "0.0.1-beta.2" -dependencies = [ - "leptos", - "sabry_build", - "sabry_intrnl", - "sabry_procmacro", -] - -[[package]] -name = "sabry_build" -version = "0.0.1-beta.2" -dependencies = [ - "proc-macro2", - "sabry_intrnl", - "sabry_procmacro_impl", - "syn 2.0.85", - "thiserror", - "walkdir", -] - -[[package]] -name = "sabry_intrnl" -version = "0.0.1-beta.2" -dependencies = [ - "base64", - "blake3", - "cfg-if", - "grass", - "lightningcss", - "proc-macro2", - "quote", - "raffia", - "regex", - "serde", - "syn 2.0.85", - "thiserror", - "toml", -] - -[[package]] -name = "sabry_procmacro" -version = "0.0.1-beta.2" -dependencies = [ - "sabry_procmacro_impl", -] - -[[package]] -name = "sabry_procmacro_impl" -version = "0.0.1-beta.2" -dependencies = [ - "proc-macro2", - "quote", - "raffia", - "regex", - "sabry_intrnl", - "syn 2.0.85", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" -dependencies = [ - "futures-core", -] - -[[package]] -name = "serde" -version = "1.0.214" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.214" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "serde_json" -version = "1.0.132" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_qs" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6" -dependencies = [ - "percent-encoding", - "serde", - "thiserror", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[package]] -name = "server_fn" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2397ddd8c45c2379d3b596e978f8edc6548572c669730d0e69c8aac3117679c2" -dependencies = [ - "bytes", - "const_format", - "dashmap 6.1.0", - "futures", - "gloo-net", - "http", - "js-sys", - "once_cell", - "pin-project-lite", - "send_wrapper", - "serde", - "serde_json", - "serde_qs", - "server_fn_macro_default", - "thiserror", - "throw_error", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "xxhash-rust", -] - -[[package]] -name = "server_fn_macro" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0965c30b56ec0f1cdd15464f4ce4abd83d06fe582c9c2fbcf61ee7e1453c805" -dependencies = [ - "const_format", - "convert_case", - "proc-macro2", - "quote", - "syn 2.0.85", - "xxhash-rust", -] - -[[package]] -name = "server_fn_macro_default" -version = "0.7.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08bce1bdbe13e78fba58b3e1323b25597bc9c14ae59825299d7f6b10f819286" -dependencies = [ - "server_fn_macro", - "syn 2.0.85", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "simd-abstraction" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" -dependencies = [ - "outref", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "slotmap" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "tachys" -version = "0.1.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4061a2262552cb95969488266f015c14b52539e92d2ada077ac170b3a1b458ba" -dependencies = [ - "any_spawner", - "const_str_slice_concat", - "drain_filter_polyfill", - "either_of", - "futures", - "html-escape", - "indexmap", - "itertools 0.13.0", - "js-sys", - "linear-map", - "next_tuple", - "oco_ref", - "once_cell", - "or_poisoned", - "parking_lot", - "paste", - "reactive_graph", - "reactive_stores", - "rustc-hash", - "send_wrapper", - "slotmap", - "throw_error", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "thiserror" -version = "1.0.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "throw_error" -version = "0.2.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f94a0abd02fad5a46b04748c89c32d2b5784bbb046fb6675f186e0bd45cd415c" -dependencies = [ - "pin-project-lite", -] - -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "toml" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "typed-builder" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06fbd5b8de54c5f7c91f6fe4cebb949be2125d7758e630bb58b1d831dbce600" -dependencies = [ - "typed-builder-macro", -] - -[[package]] -name = "typed-builder-macro" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9534daa9fd3ed0bd911d462a37f172228077e7abf18c18a5f67199d959205f8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - -[[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8-width" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" -dependencies = [ - "getrandom", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vlq" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.85", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" - -[[package]] -name = "wasm-streams" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" -dependencies = [ - "memchr", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "xxhash-rust" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" - -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] From e066ef87f31f846bd317486a12cd95287a0fb3c9 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 02:03:50 +0500 Subject: [PATCH 128/184] idk!: reduce MSRV a bit --- Cargo.toml | 2 +- README.md | 4 ++-- examples/leptos-axum/Cargo.toml | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index defdf56..8af57cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ sabry_build = {path = "sabry_build", version = "0.0.1-beta.2" } [workspace.package] version = "0.0.1-beta.2" edition = "2021" -rust-version = "1.82" +rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] repository = "https://github.com/yiffyrusdev/sabry" license = "MIT" diff --git a/README.md b/README.md index 25774c6..187e999 100644 --- a/README.md +++ b/README.md @@ -682,9 +682,9 @@ If you'd like to lend a paw - feel free to check the [WIP](#wip) section out, or ## MSRV -Sabry passes its own tests on 1.82 nightly. +Sabry passes its own tests on 1.78 nightly/stable. -There *were* some strange parsing issues reports on *stable* channel, seems to be fixed. idk. +Examples are on 1.82. ## License diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index f1aadcd..848c699 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -1,6 +1,7 @@ [package] name = "leptos-axum-sabry" version = "0.1.0" +rust-version = "1.82" edition = "2021" publish = false From 247ca01d9bee01be62a751869bf541372555f9dc Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 02:04:10 +0500 Subject: [PATCH 129/184] fmt: fmt --- sabry_build/src/buildmagic.rs | 31 ++++++++++++++++--------- sabry_intrnl/src/scoper/hash.rs | 4 +++- sabry_intrnl/src/scoper/mod.rs | 8 +++++-- sabry_intrnl/src/syntax/ostrta.rs | 12 +++++----- sabry_procmacro_impl/src/impls/styly.rs | 3 +-- 5 files changed, 36 insertions(+), 22 deletions(-) diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index 7faa138..8d7bcff 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -185,10 +185,9 @@ impl SabryBuilder { } } - let css = self.css_compiler.compile_module( - scope.original_scope.adapter().syntax, - &scope.hashed_code, - )?; + let css = self + .css_compiler + .compile_module(scope.original_scope.adapter().syntax, &scope.hashed_code)?; self.state .loaded_css_modules .push((scope.original_scope.name.to_string(), css)); @@ -196,7 +195,9 @@ impl SabryBuilder { // compile sass preludes into the CSS prelude for pre in &self.state.sass_prelude { - let css = self.css_compiler.compile_module(pre.syntax.into(), &pre.code)?; + let css = self + .css_compiler + .compile_module(pre.syntax.into(), &pre.code)?; self.state.css_prelude.push_str(&css); } @@ -263,14 +264,22 @@ impl SabryBuilder { for pre in sass_pres { let pre_path = PathBuf::from_str(pre)?; - let syntax = pre_path.extension().unwrap_or_default().to_str().unwrap_or_default(); + let syntax = pre_path + .extension() + .unwrap_or_default() + .to_str() + .unwrap_or_default(); let syntax = match ArbitraryStyleSyntax::try_from(syntax) { Ok(s) => s, - Err(_) => return Err(SabryBuildError::Another(format!("Unknown syntax for sass prelude {pre}"))) + Err(_) => { + return Err(SabryBuildError::Another(format!( + "Unknown syntax for sass prelude {pre}" + ))) + } }; let code = fs::read_to_string(pre_path)?; - sass_preludes.push(SassPreludeModule {syntax, code}); + sass_preludes.push(SassPreludeModule { syntax, code }); } self.state.sass_prelude.extend(sass_preludes); } @@ -349,7 +358,7 @@ pub struct SabryBuildState { css_prelude: String, /// SASS preludes loaded from config /// Should be compiled into loaded_css_modules as well - sass_prelude: Vec<SassPreludeModule> + sass_prelude: Vec<SassPreludeModule>, } /// Convenience struct for [SabryBuildState::sass_prelude] @@ -357,7 +366,7 @@ pub struct SassPreludeModule { /// syntax for the prelude syntax: ArbitraryStyleSyntax, /// code of the prelude - code: String + code: String, } #[derive(Debug, thiserror::Error)] @@ -387,5 +396,5 @@ pub enum SabryBuildError { #[error("Failed to load config/manifest")] Manifest(#[from] ManifestError), #[error("Another error")] - Another(String) + Another(String), } diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index e40819f..21a875c 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -69,7 +69,9 @@ impl ScopeHash { mod test { use syn::Ident; - use crate::{config::SabryHashConfig, scoper::ArbitraryScope, syntax::ostrta::OneSyntaxToRuleThemAll}; + use crate::{ + config::SabryHashConfig, scoper::ArbitraryScope, syntax::ostrta::OneSyntaxToRuleThemAll, + }; use super::ScopeHash; diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 934d646..fdfb84e 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -5,7 +5,10 @@ use hash::ScopeHash; use raffia::Spanned; use regex::Regex; -use crate::{config::SabryHashConfig, syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}}; +use crate::{ + config::SabryHashConfig, + syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}, +}; pub mod hash; @@ -375,7 +378,8 @@ mod test { use crate::{ config::SabryHashConfig, - scoper::{hash::ScopeHash, HashedScope}, syntax::ostrta::OneSyntaxToRuleThemAll, + scoper::{hash::ScopeHash, HashedScope}, + syntax::ostrta::OneSyntaxToRuleThemAll, }; use super::ArbitraryScope; diff --git a/sabry_intrnl/src/syntax/ostrta.rs b/sabry_intrnl/src/syntax/ostrta.rs index 1edbf1c..6dd4f69 100644 --- a/sabry_intrnl/src/syntax/ostrta.rs +++ b/sabry_intrnl/src/syntax/ostrta.rs @@ -3,7 +3,7 @@ #[derive(Debug, Clone, Copy)] pub enum OneSyntaxToRuleThemAll { Sass, - Scss + Scss, } impl Default for OneSyntaxToRuleThemAll { @@ -18,7 +18,7 @@ impl TryFrom<&str> for OneSyntaxToRuleThemAll { match value { "sass" => Ok(Self::Sass), "scss" => Ok(Self::Scss), - _ => Err(()) + _ => Err(()), } } } @@ -29,7 +29,7 @@ impl TryFrom<raffia::Syntax> for OneSyntaxToRuleThemAll { match value { raffia::Syntax::Sass => Ok(Self::Sass), raffia::Syntax::Scss => Ok(Self::Scss), - _ => Err(()) + _ => Err(()), } } } @@ -40,7 +40,7 @@ impl TryFrom<grass::InputSyntax> for OneSyntaxToRuleThemAll { match value { grass::InputSyntax::Sass => Ok(Self::Sass), grass::InputSyntax::Scss => Ok(Self::Scss), - _ => Err(()) + _ => Err(()), } } } @@ -49,7 +49,7 @@ impl From<OneSyntaxToRuleThemAll> for raffia::Syntax { fn from(value: OneSyntaxToRuleThemAll) -> Self { match value { OneSyntaxToRuleThemAll::Sass => Self::Sass, - OneSyntaxToRuleThemAll::Scss => Self::Scss + OneSyntaxToRuleThemAll::Scss => Self::Scss, } } } @@ -58,7 +58,7 @@ impl From<OneSyntaxToRuleThemAll> for grass::InputSyntax { fn from(value: OneSyntaxToRuleThemAll) -> Self { match value { OneSyntaxToRuleThemAll::Scss => Self::Scss, - OneSyntaxToRuleThemAll::Sass => Self::Sass + OneSyntaxToRuleThemAll::Sass => Self::Sass, } } } diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 296fc4f..82801ea 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -45,8 +45,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { Err(e) => return e.to_compile_error(), }; - let scope = match ArbitraryScope::from_source(ms.syntax.0, ms.scope.clone(), &ms.code.code) - { + let scope = match ArbitraryScope::from_source(ms.syntax.0, ms.scope.clone(), &ms.code.code) { Ok(s) => match s.hashed(&config.hash) { Ok(hs) => Ok(hs), Err(e) => Err(e), From 2641c29d9445e49c2bb3dab7201ac4f53a4645d7 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 09:15:11 +0500 Subject: [PATCH 130/184] fix: apply lightningcss to bundle once again. Seems the right thing to do --- sabry_build/src/buildmagic.rs | 8 ++- sabry_intrnl/src/compiler/mod.rs | 90 ++++++++++++++++++-------------- 2 files changed, 57 insertions(+), 41 deletions(-) diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index 8d7bcff..be71ab7 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -145,10 +145,14 @@ impl SabryBuilder { .append(true) .open(path)?; + // merged bundle CSS does require another lightningcss pass + let mut buffer = String::new(); for (_, code) in &self.state.loaded_css_modules { - write!(file, " {}", self.state.css_prelude)?; - write!(file, " {code}")?; + buffer.push_str(code); } + buffer = self.css_compiler.lightningcss(&buffer)?; + + write!(file, "{buffer}")?; } Ok(()) diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 4fcd129..a789585 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -19,6 +19,8 @@ impl CompilerAdapter { Self { config } } + /// Compile given SASS/SCSS into CSS + /// with respect to self.config pub fn compile_module( &self, syntax: OneSyntaxToRuleThemAll, @@ -28,48 +30,58 @@ impl CompilerAdapter { let mut css = grass::from_string(code, &options)?; + css = match self.lightningcss(&css) { + Ok(c) => c, + Err(e) => return Err(e), + }; + + Ok(css) + } + + /// Perform lightningcss transformations on given css + /// with respect to self.config.css.minify on minification + pub fn lightningcss(&self, css: &str) -> Result<String, SabryCompilerError> { + let mut lightsheet = match lightningcss::stylesheet::StyleSheet::parse( + css, + lightningcss::stylesheet::ParserOptions::default(), + ) { + Ok(s) => s, + Err(e) => { + return Err(SabryCompilerError::LightParse { + kind: e.kind.to_string(), + loc: e.loc, + }) + } + }; + + let targets = Targets { + browsers: Some(self.config.lightningcss.targets.clone().into()), + ..Default::default() + }; + + let printer_options = PrinterOptions { + minify: self.config.css.minify, + targets, + ..Default::default() + }; + + let minify_options = MinifyOptions { + targets, + ..Default::default() + }; + if self.config.css.minify { - //its lightningcss time! - let mut lightsheet = match lightningcss::stylesheet::StyleSheet::parse( - &css, - lightningcss::stylesheet::ParserOptions::default(), - ) { - Ok(s) => s, - Err(e) => { - return Err(SabryCompilerError::LightParse { - kind: e.kind.to_string(), - loc: e.loc, - }) - } - }; - - let targets = Targets { - browsers: Some(self.config.lightningcss.targets.clone().into()), - ..Default::default() - }; - - let printer_options = PrinterOptions { - minify: self.config.css.minify, - targets, - ..Default::default() - }; - - let minify_options = MinifyOptions { - targets, - ..Default::default() - }; - - lightsheet.minify(minify_options)?; - - css = match lightsheet.to_css(printer_options) { - Ok(c) => { - drop(lightsheet); - c.code - } - Err(e) => return Err(SabryCompilerError::LightPrint(e)), - }; + lightsheet.minify(minify_options)? } + let css = match lightsheet.to_css(printer_options) { + Ok(c) => { + drop(lightsheet); + c.code + } + Err(e) => return Err(SabryCompilerError::LightPrint(e)), + }; + Ok(css) } } From 5cea7ee7f48842f2f76dd4d19fbb47fe94a777bc Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 09:20:00 +0500 Subject: [PATCH 131/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8af57cd..8db224a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.2" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.2" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.2" } -sabry_build = {path = "sabry_build", version = "0.0.1-beta.2" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.3" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.3" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.3" } +sabry_build = {path = "sabry_build", version = "0.0.1-beta.3" } [workspace.package] -version = "0.0.1-beta.2" +version = "0.0.1-beta.3" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From e91086e26ff864fd14893282468949aa2770a598 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 09:56:15 +0500 Subject: [PATCH 132/184] feat!: use macro call name for scss module name in usey --- sabry_procmacro/tests/macros.rs | 84 +++++++++++++++++++++++++ sabry_procmacro/tests/samicro.sass | 2 + sabry_procmacro/tests/scmicro.scss | 3 + sabry_procmacro_impl/src/impls/sassy.rs | 2 - sabry_procmacro_impl/src/impls/usey.rs | 8 ++- 5 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 sabry_procmacro/tests/macros.rs create mode 100644 sabry_procmacro/tests/samicro.sass create mode 100644 sabry_procmacro/tests/scmicro.scss diff --git a/sabry_procmacro/tests/macros.rs b/sabry_procmacro/tests/macros.rs new file mode 100644 index 0000000..22bd4a3 --- /dev/null +++ b/sabry_procmacro/tests/macros.rs @@ -0,0 +1,84 @@ +use std::{collections::HashSet, fs}; + +use sabry_procmacro::{sassy, usey}; + +sassy!(scmod:scss {" + @mixin abc(){ + color: red; + } + .sel1{ + @include abc; + } +"}); +sassy!(samod:sass {" + @mixin abc() + color: green + .sel1 + @include abc +"}); + +sassy!(scmicromod:scss "sabry_procmacro/tests/scmicro.scss"); +sassy!(samicromod:sass "sabry_procmacro/tests/samicro.sass"); + +#[test] +fn sassy_contract() { + assert_eq!(scmod!(syntax), "scss"); + assert_eq!( + scmod!(), + " +@mixin abc(){ + color: red; +} +.sel1{ + @include abc; +} +" + ); + + assert_eq!(scmicromod!(syntax), "scss"); + assert_eq!( + scmicromod!(), + fs::read_to_string("tests/scmicro.scss").unwrap() + ); + + assert_eq!(samod!(syntax), "sass"); + assert_eq!( + samod!(), + " +@mixin abc() + color: green +.sel1 + @include abc +" + ); + + assert_eq!(samicromod!(syntax), "sass"); + assert_eq!( + samicromod!(), + fs::read_to_string("tests/samicro.sass").unwrap() + ); +} + +#[test] +fn usey_contract() { + use samicromod as aliasedmod; + + let _usey = usey!(aliasedmod!(), scmicromod!()); + let expect_modules = + HashSet::from(["aliasedmod.sass".to_string(), "scmicromod.scss".to_string()]); + let expect_codes = HashSet::from([ + fs::read_to_string("tests/samicro.sass").unwrap(), + fs::read_to_string("tests/scmicro.scss").unwrap(), + ]); + + let mut real_modules = HashSet::new(); + let mut real_codes = HashSet::new(); + + _usey.iter().for_each(|(module, code)| { + real_modules.insert(module.clone()); + real_codes.insert(code.clone()); + }); + + assert_eq!(expect_modules, real_modules); + assert_eq!(expect_codes, real_codes) +} diff --git a/sabry_procmacro/tests/samicro.sass b/sabry_procmacro/tests/samicro.sass new file mode 100644 index 0000000..7bc961b --- /dev/null +++ b/sabry_procmacro/tests/samicro.sass @@ -0,0 +1,2 @@ +.sel1 + color: red diff --git a/sabry_procmacro/tests/scmicro.scss b/sabry_procmacro/tests/scmicro.scss new file mode 100644 index 0000000..07d5482 --- /dev/null +++ b/sabry_procmacro/tests/scmicro.scss @@ -0,0 +1,3 @@ +.sel1 { + color: red; +} diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/sassy.rs index c15c303..ef5d401 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/sassy.rs @@ -28,7 +28,6 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { } let sourcesass = code.to_string(); - let identname = ident.to_string(); let macro_doc = format!("Arbitrary {:?} code declared with `sassy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); quote! { @@ -36,7 +35,6 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { #[macro_export] macro_rules! #ident { () => {#sourcesass}; - (module) => {#identname}; (syntax) => {#mode}; } } diff --git a/sabry_procmacro_impl/src/impls/usey.rs b/sabry_procmacro_impl/src/impls/usey.rs index 730bb4e..caf31ef 100644 --- a/sabry_procmacro_impl/src/impls/usey.rs +++ b/sabry_procmacro_impl/src/impls/usey.rs @@ -34,7 +34,11 @@ impl StyleCall { let call_bang = &self.call.bang_token; // the following calls are expected by macro genereted by `sassy!` let call_syntax = quote! {#call_path #call_bang (syntax)}; - let call_file = quote! {#call_path #call_bang (module)}; + + let module_name = call_path + .get_ident() + .expect("BUG: failed to get identifier for macro call") + .to_string(); if self.vis_pub { quote! { @@ -42,7 +46,7 @@ impl StyleCall { } } else { quote! { - (format!("{}.{}", #call_file, #call_syntax), #call_code .to_string()) + (format!("{}.{}", #module_name, #call_syntax), #call_code .to_string()) } } } From e70109d0a2085173da76cff09c414f218fdf0a68 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 10:00:05 +0500 Subject: [PATCH 133/184] docs: update for the changed usey module name check --- README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 187e999..6f530d9 100644 --- a/README.md +++ b/README.md @@ -565,9 +565,8 @@ buildy( The `usey!` macro accepts the following syntax: `#($macro,)*`, where -- *$macro* is a macro which handles three expansions: +- *$macro* is a macro which handles two expansions: - `() => { $code }` - - `(name) => { $name }` - `(syntax) => { $syntax }` Where for the *$macro*: @@ -576,6 +575,20 @@ Where for the *$macro*: - *$name* is a name of module without extension as a string literal - *$syntax* is either "sass" or "scss" +`usey!` macro will put the module full name from macro call identifier and the `syntax` expansion, so you could +resolve potential naming conflicts: + +```rust,ignore +use tgk_brandstyle::theme; +use basestyle::theme as base_theme; + +sabry::buildy( + sabry::usey!( + theme!(), + base_theme!() + ) +)?; +``` Exactly this kind of macros is produced by [`sassy!`](#style-definition-with-sassy). From c1cdaf76673bdb3500c73092c07f68a5c1ada558 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 2 Nov 2024 10:00:36 +0500 Subject: [PATCH 134/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8db224a..ffb981b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.3" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.3" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.3" } -sabry_build = {path = "sabry_build", version = "0.0.1-beta.3" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.4" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.4" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.4" } +sabry_build = {path = "sabry_build", version = "0.0.1-beta.4" } [workspace.package] -version = "0.0.1-beta.3" +version = "0.0.1-beta.4" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 1f7c18300a2f51c54f24f31aea6d38226ddcd4ba Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sun, 3 Nov 2024 17:12:01 +0500 Subject: [PATCH 135/184] tests: ufix: usey macro didn`t recognize qualified path --- sabry_procmacro_impl/src/impls/usey.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sabry_procmacro_impl/src/impls/usey.rs b/sabry_procmacro_impl/src/impls/usey.rs index caf31ef..56b2ba5 100644 --- a/sabry_procmacro_impl/src/impls/usey.rs +++ b/sabry_procmacro_impl/src/impls/usey.rs @@ -36,9 +36,10 @@ impl StyleCall { let call_syntax = quote! {#call_path #call_bang (syntax)}; let module_name = call_path - .get_ident() - .expect("BUG: failed to get identifier for macro call") - .to_string(); + .segments + .last() + .map(|l| l.ident.to_string()) + .expect("BUG: failed to get identifier for macro call"); if self.vis_pub { quote! { From 9a18eca0d86ae91500c870b15bef9d234ca5c3ff Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sun, 3 Nov 2024 17:51:24 +0500 Subject: [PATCH 136/184] refactor: make the default build workflow a part of SabryBuilder API --- sabry_build/src/buildmagic.rs | 48 +++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index be71ab7..7ea2af9 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -47,27 +47,9 @@ type BuilderResult = Result<(), SabryBuildError>; /// /// This function is intended to run at build time, however, you're free to use it however you please pub fn buildy(inline_side_modules: impl IntoIterator<Item = StyleModule>) -> BuilderResult { - println!("🧙: This is probably the stderr. Something went wrong:"); - let config = SabryConfig::require()?; let mut builder = SabryBuilder::new(config); - - println!("🧙 loading preludes"); - builder.load_preludes()?; - - println!("🧙 loading `buildy` modules"); - for (name, code) in inline_side_modules { - builder.load_side_module(name, code)?; - } - - println!("🧙 loading this crate"); - builder.load_styles_from_this_crate()?; - - println!("🧙 compiling CSS"); - builder.compile_everything()?; - - println!("🧙 writing an output"); - builder.generate_output()?; + builder.build(inline_side_modules)?; Ok(()) } @@ -108,6 +90,33 @@ impl SabryBuilder { } } + /// Default building workflow implementation + pub fn build( + &mut self, + inline_side_modules: impl IntoIterator<Item = StyleModule>, + ) -> BuilderResult { + println!("🧙: This is probably the stderr. Something went wrong:"); + + println!("🧙 loading preludes"); + self.load_preludes()?; + + println!("🧙 loading `buildy` modules"); + for (name, code) in inline_side_modules { + self.load_side_module(name, code)?; + } + + println!("🧙 loading this crate"); + self.load_styles_from_this_crate()?; + + println!("🧙 compiling CSS"); + self.compile_everything()?; + + println!("🧙 writing an output"); + self.generate_output()?; + + Ok(()) + } + /// Write all the loaded CSS /// /// - Bundle file (if configured) @@ -228,6 +237,7 @@ impl SabryBuilder { let entry_path = entry.path(); let ext = entry_path.extension().unwrap_or_default(); if ext == "rs" { + println!(".. reading {entry_path:?}"); let visitor = filevisit::visit_file(entry_path)?; self.state.loaded_stylyses.extend(visitor.found_stylys); } From fb2e9f1358a0c5e51b027dcb615a6b399c21026e Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sun, 3 Nov 2024 17:52:28 +0500 Subject: [PATCH 137/184] test: add more integration tests with insta. Like it! --- .gitignore | 3 + Cargo.toml | 1 + README.md | 14 +- tests/assets/mixin-module.sass | 19 ++ tests/assets/mixin-module.scss | 24 +++ tests/assets/mixins.sass | 5 - tests/assets/mixins.scss | 9 - tests/assets/module-forward.sass | 3 + tests/assets/module-forward.scss | 3 + tests/assets/module-usage.sass | 15 ++ tests/assets/module-usage.scss | 20 ++ tests/assets/prelude.css | 3 + tests/assets/prelude.sass | 5 + tests/assets/prelude.scss | 6 + tests/assets/sole-code.sass | 17 ++ tests/assets/sole-code.scss | 22 +++ tests/assets/use-forwarded.sass | 14 ++ tests/assets/use-forwarded.scss | 20 ++ tests/macros.rs | 182 ++++++++++++++++++ .../compilation_with_buildy@bundle.css.snap | 7 + ..._buildy@scopes__module_usage_sass.css.snap | 7 + ..._buildy@scopes__module_usage_scss.css.snap | 7 + ...ith_buildy@scopes__sole_code_sass.css.snap | 7 + ...ith_buildy@scopes__sole_code_scss.css.snap | 7 + ...buildy@scopes__use_forwarded_sass.css.snap | 7 + ...buildy@scopes__use_forwarded_scss.css.snap | 7 + 26 files changed, 413 insertions(+), 21 deletions(-) create mode 100644 tests/assets/mixin-module.sass create mode 100644 tests/assets/mixin-module.scss delete mode 100644 tests/assets/mixins.sass delete mode 100644 tests/assets/mixins.scss create mode 100644 tests/assets/module-forward.sass create mode 100644 tests/assets/module-forward.scss create mode 100644 tests/assets/module-usage.sass create mode 100644 tests/assets/module-usage.scss create mode 100644 tests/assets/prelude.css create mode 100644 tests/assets/prelude.sass create mode 100644 tests/assets/prelude.scss create mode 100644 tests/assets/sole-code.sass create mode 100644 tests/assets/sole-code.scss create mode 100644 tests/assets/use-forwarded.sass create mode 100644 tests/assets/use-forwarded.scss create mode 100644 tests/macros.rs create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap diff --git a/.gitignore b/.gitignore index e2bc000..ae8e48f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ rust-toolchain.toml .vscode .profile /Cargo.lock +/tests/sabry_intermediate +/tests/sabry_output +/playground diff --git a/Cargo.toml b/Cargo.toml index ffb981b..ed2ec1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,6 +43,7 @@ sabry_intrnl = {workspace = true} [dev-dependencies] leptos = {version = "0.7.0-gamma3"} +insta = {version = "^1.41", features = ["glob"]} [features] default = ["procmacro"] diff --git a/README.md b/README.md index 6f530d9..0a4e396 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Code your SASS in separate files to get proper syntax highlighting, or do sass-i ```rust sabry::styly!(component {".btn {color: green;}"}); -sabry::styly!(extras "tests/assets/mixins.scss"); +sabry::styly!(extras "tests/assets/mixin-module.scss"); ``` </td> @@ -88,7 +88,7 @@ sabry::styly!(breadbadge {" Keep things as private and modular as you wish ```rust -sabry::styly!(pub cats "tests/assets/mixins.scss"); +sabry::styly!(pub cats "tests/assets/mixin-module.scss"); sabry::styly!(dogs {"#howl {border: none;}"}); ``` ```rust,ignore @@ -148,7 +148,7 @@ And a proc-macro // lib.rs use sabry::sassy; -sassy!(mixins "tests/assets/mixins.scss"); +sassy!(mixins "tests/assets/mixin-module.scss"); sassy!(styles {" $primary-color: black; @mixin colored($col: primary) { @@ -443,8 +443,8 @@ Examples: use sabry::sassy; sassy!(module1 {"$primary-color: red;"}); -sassy!(module2 "tests/assets/mixins.scss"); -sassy!(module3:sass "tests/assets/mixins.sass"); +sassy!(module2 "tests/assets/mixin-module.scss"); +sassy!(module3:sass "tests/assets/mixin-module.sass"); // works, but there are catches. sassy!(module4:sass {" @mixin colored($col: primary) @@ -514,7 +514,7 @@ You can read more about scoping and hashing in the [scoping](#scoping) section. By default generated `mod` is private. You can make both mod and wrapper style constant public by adding the `pub` to macro call: ```rust -sabry::styly!(pub whatever "tests/assets/mixins.scss"); +sabry::styly!(pub whatever "tests/assets/mixin-module.scss"); ``` #### Constant styly scopes @@ -524,7 +524,7 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: ```rust -sabry::styly!(const scope "tests/assets/mixins.scss"); +sabry::styly!(const scope "tests/assets/mixin-module.scss"); ``` Which results in following: ```rust,ignore diff --git a/tests/assets/mixin-module.sass b/tests/assets/mixin-module.sass new file mode 100644 index 0000000..cff411f --- /dev/null +++ b/tests/assets/mixin-module.sass @@ -0,0 +1,19 @@ + +@mixin color($color: black) + @if $color == black + color: white + background-color: green + @else if $color == white + color: red + background-color: black + @else + color: #c6c6c6 + background-color: #00ffff + &::after + content: 'Colored' + color: $color + background-color: blue + &:hover + transform: scale(2) + &:hover + transform: translateX(10%) diff --git a/tests/assets/mixin-module.scss b/tests/assets/mixin-module.scss new file mode 100644 index 0000000..f8887c0 --- /dev/null +++ b/tests/assets/mixin-module.scss @@ -0,0 +1,24 @@ + +@mixin surface($color: black){ + @if $color == black{ + color: white; + background-color: green; + }@else if $color == white{ + color: red; + background-color: black; + }@else{ + color: #c6c6c6; + background-color: #00ffff; + } + &::after{ + content: 'Colored'; + color: $color; + background-color: blue; + &:hover{ + transform: scale(2); + } + } + &:hover{ + transform: translateX(10%); + } +} diff --git a/tests/assets/mixins.sass b/tests/assets/mixins.sass deleted file mode 100644 index 45a1ec6..0000000 --- a/tests/assets/mixins.sass +++ /dev/null @@ -1,5 +0,0 @@ -@mixin colored($color: primary) - @if $color == primary - color: white - @else - color: $col diff --git a/tests/assets/mixins.scss b/tests/assets/mixins.scss deleted file mode 100644 index d201fd0..0000000 --- a/tests/assets/mixins.scss +++ /dev/null @@ -1,9 +0,0 @@ -$primary-color: black; - -@mixin colored($col: primary) { - @if $col == primary { - color: $primary-color; - } @else { - color: $col; - } -} diff --git a/tests/assets/module-forward.sass b/tests/assets/module-forward.sass new file mode 100644 index 0000000..ad1e734 --- /dev/null +++ b/tests/assets/module-forward.sass @@ -0,0 +1,3 @@ + +@forward 'mixins_a' +@forward 'mixins_c' diff --git a/tests/assets/module-forward.scss b/tests/assets/module-forward.scss new file mode 100644 index 0000000..8352864 --- /dev/null +++ b/tests/assets/module-forward.scss @@ -0,0 +1,3 @@ + +@forward 'mixins_a'; +@forward 'mixins_c'; diff --git a/tests/assets/module-usage.sass b/tests/assets/module-usage.sass new file mode 100644 index 0000000..3137332 --- /dev/null +++ b/tests/assets/module-usage.sass @@ -0,0 +1,15 @@ +@use 'mixins_a' as * +@use 'mixins_c' as * + +.coated + @include color(green) + @include surface(black) + &-dark + @include surface(red) + a + @include surface(blue) + img + @include color(black) + span + @include color(green) + display: block diff --git a/tests/assets/module-usage.scss b/tests/assets/module-usage.scss new file mode 100644 index 0000000..921333c --- /dev/null +++ b/tests/assets/module-usage.scss @@ -0,0 +1,20 @@ +@use 'mixins_a' as *; +@use 'mixins_c' as *; + +.coated{ + @include color(green); + @include surface(black); + &-dark{ + @include surface(red); + a{ + @include surface(blue); + img{ + @include color(black); + } + } + } + span{ + @include color(green); + display: block; + } +} diff --git a/tests/assets/prelude.css b/tests/assets/prelude.css new file mode 100644 index 0000000..0995dad --- /dev/null +++ b/tests/assets/prelude.css @@ -0,0 +1,3 @@ +html { + background-color: dark; +} diff --git a/tests/assets/prelude.sass b/tests/assets/prelude.sass new file mode 100644 index 0000000..c78cbb1 --- /dev/null +++ b/tests/assets/prelude.sass @@ -0,0 +1,5 @@ +@use 'mixins_a' as * +@use 'mixins_c' as * + +body + @include color() diff --git a/tests/assets/prelude.scss b/tests/assets/prelude.scss new file mode 100644 index 0000000..28384b9 --- /dev/null +++ b/tests/assets/prelude.scss @@ -0,0 +1,6 @@ +@use 'mixins_a' as *; +@use 'mixins_c' as *; + +body { + @include surface(); +} diff --git a/tests/assets/sole-code.sass b/tests/assets/sole-code.sass new file mode 100644 index 0000000..ccc06a1 --- /dev/null +++ b/tests/assets/sole-code.sass @@ -0,0 +1,17 @@ +.fuzz + background-color: red + display: block + &-dark + background-color: black + color: white + a + text-transform: uppercase + img + position: absolute + top: 0 + left: 10rem + span + position: relative + display: grid + grid-template-areas: 'a b c' 'd e f' 'x x x' + display: block diff --git a/tests/assets/sole-code.scss b/tests/assets/sole-code.scss new file mode 100644 index 0000000..dcb73cc --- /dev/null +++ b/tests/assets/sole-code.scss @@ -0,0 +1,22 @@ +.fuzz{ + background-color: red; + display: block; + &-dark{ + background-color: black; + color: white; + a{ + text-transform: uppercase; + img{ + position: absolute; + top: 0; + left: 10rem; + } + } + } + span{ + position: relative; + display: grid; + grid-template-areas: 'a b c' 'd e f' 'x x x'; + display: block; + } +} diff --git a/tests/assets/use-forwarded.sass b/tests/assets/use-forwarded.sass new file mode 100644 index 0000000..e1b91e3 --- /dev/null +++ b/tests/assets/use-forwarded.sass @@ -0,0 +1,14 @@ +@use 'module_a' as * + +.coated + @include color(green) + @include surface(black) + &-dark + @include surface(red) + a + @include surface(blue) + img + @include color(black) + span + @include color(green) + display: block diff --git a/tests/assets/use-forwarded.scss b/tests/assets/use-forwarded.scss new file mode 100644 index 0000000..ce68c48 --- /dev/null +++ b/tests/assets/use-forwarded.scss @@ -0,0 +1,20 @@ +@use 'module_c' as *; + + +.coated{ + @include color(green); + @include surface(black); + &-dark{ + @include surface(red); + a{ + @include surface(blue); + img{ + @include color(black); + } + } + } + span{ + @include color(green); + display: block; + } +} diff --git a/tests/macros.rs b/tests/macros.rs new file mode 100644 index 0000000..e944f3d --- /dev/null +++ b/tests/macros.rs @@ -0,0 +1,182 @@ +use std::fs; + +use insta::{glob, Settings}; + +use sabry::{ + buildmagic::SabryBuilder, + config::{BehavHashCollision, BehavSassModCollision, SabryConfig}, + sassy, styly, usey, +}; + +pub mod sass { + use sabry::sassy; + + sassy!(mixins_sass:sass "tests/assets/mixin-module.sass"); + sassy!(mixins_inline_sass:sass {" + @mixin color($color: black) + @if $color == black + color: white + background-color: green + @else if $color == white + color: red + background-color: black + @else + color: #c6c6c6 + background-color: #00ffff + &::after + content: 'Colored' + color: $color + background-color: blue + &:hover + transform: scale(2) + &:hover + transform: translateX(10%) +"}); + sassy!(module_sass:sass "tests/assets/module-forward.sass"); + sassy!(module_inline_sass:sass {" +@forward 'mixins_a' +@forward 'mixins_c' +"}); + pub(crate) use mixins_inline_sass as mixins_inline_a; + pub(crate) use mixins_sass as mixins_a; + pub(crate) use module_inline_sass as module_inline_a; + pub(crate) use module_sass as module_a; +} + +pub mod scss { + use sabry::sassy; + + sassy!(mixins_scss:scss "tests/assets/mixin-module.scss"); + sassy!(mixins_inline_scss:scss {" + @mixin surface($color: black){ + @if $color == black{ + color: white; + background-color: green; + }@else if $color == white{ + color: red; + background-color: black; + }@else{ + color: #c6c6c6; + background-color: #00ffff; + } + &::after{ + content: 'Colored'; + color: $color; + background-color: blue; + &:hover{ + transform: scale(2); + } + } + &:hover{ + transform: translateX(10%); + } + } +"}); + sassy!(module_scss:scss "tests/assets/module-forward.scss"); + sassy!(module_inline_scss:scss {" +@forward 'mixins_a'; +@forward 'mixins_c'; +"}); + + pub(crate) use mixins_inline_scss as mixins_inline_c; + pub(crate) use mixins_scss as mixins_c; + pub(crate) use module_inline_scss as module_inline_c; + pub(crate) use module_scss as module_c; +} + +styly!(sole_code_sass:sass "tests/assets/sole-code.sass"); +styly!(sole_code_scss:scss "tests/assets/sole-code.scss"); +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"); + +#[test] +fn ensure_inline_matches_file() { + assert_eq!(sass::mixins_a!(), sass::mixins_inline_a!()); + assert_eq!(scss::mixins_c!(), scss::mixins_inline_c!()); + + assert_eq!(sass::module_a!(), sass::module_inline_a!()); + assert_eq!(scss::module_c!(), scss::module_inline_c!()); +} + +#[test] +fn syntax_contract() { + assert_eq!(scss::mixins_inline_c!(syntax), "scss"); + assert_eq!(scss::mixins_c!(syntax), "scss"); + assert_eq!(scss::module_inline_c!(syntax), "scss"); + assert_eq!(scss::module_c!(syntax), "scss"); + + assert_eq!(sass::mixins_a!(syntax), "sass"); + assert_eq!(sass::mixins_inline_a!(syntax), "sass"); + assert_eq!(sass::module_a!(syntax), "sass"); + assert_eq!(sass::module_inline_a!(syntax), "sass"); +} + +fn gen_config() -> SabryConfig { + let mut config = SabryConfig::require().unwrap(); + config.css.bundle = Some("tests/sabry_output/bundle.css".into()); + config.css.scopes = Some("tests/sabry_output/scopes".into()); + config.css.minify = true; + config.css.prelude = Some(vec!["tests/assets/prelude.css".into()]); + + config.sass.prelude = Some(vec![ + "tests/assets/prelude.sass".into(), + "tests/assets/prelude.scss".into(), + ]); + config.sass.intermediate_dir = "tests/sabry_intermediate".into(); + config.sass.scanroot = "tests".into(); + config.sass.module_name_collision = BehavSassModCollision::Merge; + + config.hash.collision = BehavHashCollision::Error; + config.hash.size = 16; + config.hash.use_code_size = true; + config.hash.use_code_text = true; + config.hash.use_item_names = true; + config.hash.use_scope_name = true; + + config.lightningcss.targets.android = Some("10".into()); + config.lightningcss.targets.chrome = Some("100".into()); + config.lightningcss.targets.edge = Some("80".into()); + config.lightningcss.targets.firefox = Some("100".into()); + config.lightningcss.targets.ie = Some("8".into()); + config.lightningcss.targets.ios_saf = Some("13.2".into()); + config.lightningcss.targets.opera = Some("80".into()); + config.lightningcss.targets.safari = Some("11".into()); + config.lightningcss.targets.samsung = Some("80".into()); + + config +} + +fn gen_builder() -> SabryBuilder { + let config = gen_config(); + let builder = SabryBuilder::new(config); + + builder +} + +#[test] +fn compilation_with_buildy() { + let mut builder = gen_builder(); + builder + .build(usey!( + sass::mixins_a!(), + sass::module_a!(), + scss::mixins_c!(), + scss::module_c!() + )) + .unwrap(); + + glob!("sabry_output/**/*.css", |path| { + let generated = fs::read_to_string(path).unwrap(); + + let mut settings = Settings::clone_current(); + settings.set_snapshot_path("sabry_output_snapshots"); + settings.set_prepend_module_to_snapshot(false); + settings.set_omit_expression(true); + settings.remove_info(); + settings.bind(|| { + insta::assert_snapshot!(generated); + }); + }); +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap new file mode 100644 index 0000000..e0d861c --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +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%)} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap new file mode 100644 index 0000000..e26b0f4 --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/module_usage_sass.css +snapshot_kind: text +--- +.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%)} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap new file mode 100644 index 0000000..c24335b --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/module_usage_scss.css +snapshot_kind: text +--- +.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%)} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap new file mode 100644 index 0000000..922db8e --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/sole_code_sass.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} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap new file mode 100644 index 0000000..a7760eb --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/sole_code_scss.css +snapshot_kind: text +--- +.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} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap new file mode 100644 index 0000000..3695b70 --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/use_forwarded_sass.css +snapshot_kind: text +--- +.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%)} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap new file mode 100644 index 0000000..b8adffa --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 170 +input_file: tests/sabry_output/scopes/use_forwarded_scss.css +snapshot_kind: text +--- +.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%)} From 47486415bf39976830e4ff963c4a0dbf7992340f Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sun, 3 Nov 2024 18:08:39 +0500 Subject: [PATCH 138/184] fix(tests): proper flag handling --- tests/macros.rs | 131 ++++++++++++++++++++++++------------------------ 1 file changed, 66 insertions(+), 65 deletions(-) diff --git a/tests/macros.rs b/tests/macros.rs index e944f3d..eb583b4 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -1,12 +1,4 @@ -use std::fs; - -use insta::{glob, Settings}; - -use sabry::{ - buildmagic::SabryBuilder, - config::{BehavHashCollision, BehavSassModCollision, SabryConfig}, - sassy, styly, usey, -}; +use sabry::styly; pub mod sass { use sabry::sassy; @@ -113,70 +105,79 @@ fn syntax_contract() { assert_eq!(sass::module_inline_a!(syntax), "sass"); } -fn gen_config() -> SabryConfig { - let mut config = SabryConfig::require().unwrap(); - config.css.bundle = Some("tests/sabry_output/bundle.css".into()); - config.css.scopes = Some("tests/sabry_output/scopes".into()); - config.css.minify = true; - config.css.prelude = Some(vec!["tests/assets/prelude.css".into()]); +#[cfg(test)] +#[cfg(all(feature = "procmacro", feature = "build"))] +mod build_tests { + use std::fs; - config.sass.prelude = Some(vec![ - "tests/assets/prelude.sass".into(), - "tests/assets/prelude.scss".into(), - ]); - config.sass.intermediate_dir = "tests/sabry_intermediate".into(); - config.sass.scanroot = "tests".into(); - config.sass.module_name_collision = BehavSassModCollision::Merge; + use insta::{glob, Settings}; + use sabry::{usey, buildmagic::SabryBuilder, config::{BehavHashCollision, BehavSassModCollision, SabryConfig}}; - config.hash.collision = BehavHashCollision::Error; - config.hash.size = 16; - config.hash.use_code_size = true; - config.hash.use_code_text = true; - config.hash.use_item_names = true; - config.hash.use_scope_name = true; + fn gen_config() -> SabryConfig { + let mut config = SabryConfig::require().unwrap(); + config.css.bundle = Some("tests/sabry_output/bundle.css".into()); + config.css.scopes = Some("tests/sabry_output/scopes".into()); + config.css.minify = true; + config.css.prelude = Some(vec!["tests/assets/prelude.css".into()]); - config.lightningcss.targets.android = Some("10".into()); - config.lightningcss.targets.chrome = Some("100".into()); - config.lightningcss.targets.edge = Some("80".into()); - config.lightningcss.targets.firefox = Some("100".into()); - config.lightningcss.targets.ie = Some("8".into()); - config.lightningcss.targets.ios_saf = Some("13.2".into()); - config.lightningcss.targets.opera = Some("80".into()); - config.lightningcss.targets.safari = Some("11".into()); - config.lightningcss.targets.samsung = Some("80".into()); + config.sass.prelude = Some(vec![ + "tests/assets/prelude.sass".into(), + "tests/assets/prelude.scss".into(), + ]); + config.sass.intermediate_dir = "tests/sabry_intermediate".into(); + config.sass.scanroot = "tests".into(); + config.sass.module_name_collision = BehavSassModCollision::Merge; - config -} + config.hash.collision = BehavHashCollision::Error; + config.hash.size = 16; + config.hash.use_code_size = true; + config.hash.use_code_text = true; + config.hash.use_item_names = true; + config.hash.use_scope_name = true; -fn gen_builder() -> SabryBuilder { - let config = gen_config(); - let builder = SabryBuilder::new(config); + config.lightningcss.targets.android = Some("10".into()); + config.lightningcss.targets.chrome = Some("100".into()); + config.lightningcss.targets.edge = Some("80".into()); + config.lightningcss.targets.firefox = Some("100".into()); + config.lightningcss.targets.ie = Some("8".into()); + config.lightningcss.targets.ios_saf = Some("13.2".into()); + config.lightningcss.targets.opera = Some("80".into()); + config.lightningcss.targets.safari = Some("11".into()); + config.lightningcss.targets.samsung = Some("80".into()); - builder -} + config + } -#[test] -fn compilation_with_buildy() { - let mut builder = gen_builder(); - builder - .build(usey!( - sass::mixins_a!(), - sass::module_a!(), - scss::mixins_c!(), - scss::module_c!() - )) - .unwrap(); + fn gen_builder() -> SabryBuilder { + let config = gen_config(); + let builder = SabryBuilder::new(config); - glob!("sabry_output/**/*.css", |path| { - let generated = fs::read_to_string(path).unwrap(); + builder + } - let mut settings = Settings::clone_current(); - settings.set_snapshot_path("sabry_output_snapshots"); - settings.set_prepend_module_to_snapshot(false); - settings.set_omit_expression(true); - settings.remove_info(); - settings.bind(|| { - insta::assert_snapshot!(generated); + #[test] + fn compilation_with_buildy() { + let mut builder = gen_builder(); + builder + .build(usey!( + super::sass::mixins_a!(), + super::sass::module_a!(), + super::scss::mixins_c!(), + super::scss::module_c!() + )) + .unwrap(); + + glob!("sabry_output/**/*.css", |path| { + let generated = fs::read_to_string(path).unwrap(); + + let mut settings = Settings::clone_current(); + settings.set_snapshot_path("sabry_output_snapshots"); + settings.set_prepend_module_to_snapshot(false); + settings.set_omit_expression(true); + settings.remove_info(); + settings.bind(|| { + insta::assert_snapshot!(generated); + }); }); - }); + } } From 40e4d368cf228ef3c2de0eb88e8034ad6cad8bbe Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Mon, 4 Nov 2024 22:06:29 +0500 Subject: [PATCH 139/184] fix: found that macro name was nasty. Also my team starts a production with sabry, so lets call it release --- README.md | 28 +++++++++---------- examples/define-styles/src/lib.rs | 10 +++---- examples/use-styles/build.rs | 4 +-- sabry_build/src/buildmagic.rs | 2 +- sabry_procmacro/src/lib.rs | 16 +++++------ sabry_procmacro/tests/macros.rs | 12 ++++---- sabry_procmacro_impl/src/impls/mod.rs | 2 +- .../src/impls/{sassy.rs => scssy.rs} | 4 +-- sabry_procmacro_impl/src/impls/usey.rs | 2 +- tests/macros.rs | 20 ++++++------- 10 files changed, 50 insertions(+), 50 deletions(-) rename sabry_procmacro_impl/src/impls/{sassy.rs => scssy.rs} (92%) diff --git a/README.md b/README.md index 0a4e396..ae87410 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ At first, I'll show how this crate "tastes". With SABRY, its in your power to: Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with modules, with feature flags, etc. Say "bye" to manual copying, cli-tools and consts. ```rust -sabry::sassy!(tokens {"@mixin colored{color: red;}"}); +sabry::scssy!(tokens {"@mixin colored{color: red;}"}); ``` </td> @@ -146,10 +146,10 @@ sabry = {version = "0.0.1"} And a proc-macro ```rust // lib.rs -use sabry::sassy; +use sabry::scssy; -sassy!(mixins "tests/assets/mixin-module.scss"); -sassy!(styles {" +scssy!(mixins "tests/assets/mixin-module.scss"); +scssy!(styles {" $primary-color: black; @mixin colored($col: primary) { @if $col == primary { @@ -290,7 +290,7 @@ use leptos::prelude::*; use sabry::styly; styly!(scope {" - // assuming we have tokens!() macro generated by `sassy!`, which is handled by `buildy` + // assuming we have tokens!() macro generated by `scssy!`, which is handled by `buildy` @use 'tokens'; h1 { @include tokens.sectionhead(); @@ -427,9 +427,9 @@ For example `{ie = "9", saf_ios = "13.2"}` will try to generate CSS supported on ## Detailed guide -### Style definition with `sassy!` +### Style definition with `scssy!` -The `sassy!` macro is available with *procmacro* feature which is enabled by default. +The `scssy!` macro is available with *procmacro* feature which is enabled by default. It does accept the following syntax: `$name(:$syntax)? ({ $code })|($filename)`, where @@ -440,13 +440,13 @@ It does accept the following syntax: `$name(:$syntax)? ({ $code })|($filename)`, Examples: ```rust -use sabry::sassy; +use sabry::scssy; -sassy!(module1 {"$primary-color: red;"}); -sassy!(module2 "tests/assets/mixin-module.scss"); -sassy!(module3:sass "tests/assets/mixin-module.sass"); +scssy!(module1 {"$primary-color: red;"}); +scssy!(module2 "tests/assets/mixin-module.scss"); +scssy!(module3:sass "tests/assets/mixin-module.sass"); // works, but there are catches. -sassy!(module4:sass {" +scssy!(module4:sass {" @mixin colored($col: primary) @if $col == primary color: white @@ -457,7 +457,7 @@ sassy!(module4:sass {" You may omit the syntax specifier - sabry uses SCSS as the default one. -The given code to `sassy!` is not checked to be valid code in given syntax (wip). +The given code to `scssy!` is not checked to be valid code in given syntax (wip). > SASS support inside of rust files is experimental. If you do want to use SASS tabbed syntax - consider to use files path instead of sass-in-rust option. @@ -590,7 +590,7 @@ sabry::buildy( )?; ``` -Exactly this kind of macros is produced by [`sassy!`](#style-definition-with-sassy). +Exactly this kind of macros is produced by [`scssy!`](#style-definition-with-scssy). ### Scoping diff --git a/examples/define-styles/src/lib.rs b/examples/define-styles/src/lib.rs index 9850a64..0640d6e 100644 --- a/examples/define-styles/src/lib.rs +++ b/examples/define-styles/src/lib.rs @@ -1,8 +1,8 @@ -use sabry::sassy; +use sabry::scssy; -sassy!(style "src/style.scss"); +scssy!(style "src/style.scss"); -sassy!(utils {" +scssy!(utils {" @mixin flex($direction, $align, $justify, $gap: .5rem) { display: flex; list-style: none; @@ -31,7 +31,7 @@ sassy!(utils {" } "}); -sassy!(theme {" +scssy!(theme {" $thm-surface-primary: #2b2a29; $thm-surface-secondary: #6C6C6C; $thm-surface-tertiary: #4C4C4C; @@ -77,7 +77,7 @@ sassy!(theme {" } "}); -sassy!(tokens {" +scssy!(tokens {" @use 'theme'; @mixin clickable($style: accent, $scale: 1.2, $clickscale: 0.9){ diff --git a/examples/use-styles/build.rs b/examples/use-styles/build.rs index d8b254f..ec066dc 100644 --- a/examples/use-styles/build.rs +++ b/examples/use-styles/build.rs @@ -1,9 +1,9 @@ use define_styles::{theme, tokens, utils as utils_dup}; -use sabry::{sassy, usey}; +use sabry::{scssy, usey}; // This module will have the same name as define_styles_example::utils // and sabry is configured to merge them -sassy!(utils {" +scssy!(utils {" @mixin nonclickable(){ display: none; } diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index 7ea2af9..bd476a7 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -34,7 +34,7 @@ type BuilderResult = Result<(), SabryBuildError>; /// ).expect("Sabry failed to build CSS"); /// ``` /// -/// Also you could use style-macros defined anywhere with `sabry::sassy!` procmacro: +/// Also you could use style-macros defined anywhere with `sabry::scssy!` procmacro: /// ```ignore /// buildy( /// sabry::usey!( diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index 6500413..aed8a2c 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -2,7 +2,7 @@ use proc_macro::TokenStream; use sabry_procmacro_impl::impls::{ - sassy::sassy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, + scssy::scssy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, }; /// Macro that makes sass code rusty. @@ -13,28 +13,28 @@ use sabry_procmacro_impl::impls::{ /// ## Usage /// /// ```ignore -/// sassy!(scssmodule { +/// scssy!(scssmodule { /// /* SCSS */ /// }); -/// sassy!(sassmodule:sass { +/// scssy!(sassmodule:sass { /// /* SASS (WIP) */ /// }); -/// sassy!(scssmod2:scss { +/// scssy!(scssmod2:scss { /// /* SCSS */ /// }); /// ``` /// Or read code from file /// ```ignore -/// sassy!(filemodule "src/styles/a.scss"); -/// sassy!(filemodule:sass "src/styles/b.sass"); +/// scssy!(filemodule "src/styles/a.scss"); +/// scssy!(filemodule:sass "src/styles/b.sass"); /// ``` /// /// \[SCSS syntax requires 'scss' feature\] /// \[SASS syntax requires 'sass' feature (WIP)\] /// #[proc_macro] -pub fn sassy(input: TokenStream) -> TokenStream { - sassy_macro_impl(input.into()).into() +pub fn scssy(input: TokenStream) -> TokenStream { + scssy_macro_impl(input.into()).into() } /// Macro that brings sass code into app diff --git a/sabry_procmacro/tests/macros.rs b/sabry_procmacro/tests/macros.rs index 22bd4a3..84376af 100644 --- a/sabry_procmacro/tests/macros.rs +++ b/sabry_procmacro/tests/macros.rs @@ -1,8 +1,8 @@ use std::{collections::HashSet, fs}; -use sabry_procmacro::{sassy, usey}; +use sabry_procmacro::{scssy, usey}; -sassy!(scmod:scss {" +scssy!(scmod:scss {" @mixin abc(){ color: red; } @@ -10,18 +10,18 @@ sassy!(scmod:scss {" @include abc; } "}); -sassy!(samod:sass {" +scssy!(samod:sass {" @mixin abc() color: green .sel1 @include abc "}); -sassy!(scmicromod:scss "sabry_procmacro/tests/scmicro.scss"); -sassy!(samicromod:sass "sabry_procmacro/tests/samicro.sass"); +scssy!(scmicromod:scss "sabry_procmacro/tests/scmicro.scss"); +scssy!(samicromod:sass "sabry_procmacro/tests/samicro.sass"); #[test] -fn sassy_contract() { +fn scssy_contract() { assert_eq!(scmod!(syntax), "scss"); assert_eq!( scmod!(), diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index 009df1f..47a6939 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -6,7 +6,7 @@ use regex::Regex; use sabry_intrnl::syntax::ostrta::OneSyntaxToRuleThemAll; use syn::{braced, parse::Parse, Ident, LitStr, Token}; -pub mod sassy; +pub mod scssy; pub mod styly; pub mod usey; diff --git a/sabry_procmacro_impl/src/impls/sassy.rs b/sabry_procmacro_impl/src/impls/scssy.rs similarity index 92% rename from sabry_procmacro_impl/src/impls/sassy.rs rename to sabry_procmacro_impl/src/impls/scssy.rs index ef5d401..b82718d 100644 --- a/sabry_procmacro_impl/src/impls/sassy.rs +++ b/sabry_procmacro_impl/src/impls/scssy.rs @@ -11,7 +11,7 @@ use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; /// `$syntax`: sass/scss /// /// `$code`: intended to be valid based on $syntax -pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { +pub fn scssy_macro_impl(input: TokenStream) -> TokenStream { let MacroSyntax { ident, syntax: mode, @@ -28,7 +28,7 @@ pub fn sassy_macro_impl(input: TokenStream) -> TokenStream { } let sourcesass = code.to_string(); - let macro_doc = format!("Arbitrary {:?} code declared with `sassy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); + let macro_doc = format!("Arbitrary {:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); quote! { #[doc = #macro_doc] diff --git a/sabry_procmacro_impl/src/impls/usey.rs b/sabry_procmacro_impl/src/impls/usey.rs index 56b2ba5..95d2dc8 100644 --- a/sabry_procmacro_impl/src/impls/usey.rs +++ b/sabry_procmacro_impl/src/impls/usey.rs @@ -32,7 +32,7 @@ impl StyleCall { let call_code = &self.call; let call_path = &self.call.path; let call_bang = &self.call.bang_token; - // the following calls are expected by macro genereted by `sassy!` + // the following calls are expected by macro genereted by `scssy!` let call_syntax = quote! {#call_path #call_bang (syntax)}; let module_name = call_path diff --git a/tests/macros.rs b/tests/macros.rs index eb583b4..f8f2ea0 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -1,10 +1,10 @@ use sabry::styly; pub mod sass { - use sabry::sassy; + use sabry::scssy; - sassy!(mixins_sass:sass "tests/assets/mixin-module.sass"); - sassy!(mixins_inline_sass:sass {" + scssy!(mixins_sass:sass "tests/assets/mixin-module.sass"); + scssy!(mixins_inline_sass:sass {" @mixin color($color: black) @if $color == black color: white @@ -24,8 +24,8 @@ pub mod sass { &:hover transform: translateX(10%) "}); - sassy!(module_sass:sass "tests/assets/module-forward.sass"); - sassy!(module_inline_sass:sass {" + scssy!(module_sass:sass "tests/assets/module-forward.sass"); + scssy!(module_inline_sass:sass {" @forward 'mixins_a' @forward 'mixins_c' "}); @@ -36,10 +36,10 @@ pub mod sass { } pub mod scss { - use sabry::sassy; + use sabry::scssy; - sassy!(mixins_scss:scss "tests/assets/mixin-module.scss"); - sassy!(mixins_inline_scss:scss {" + scssy!(mixins_scss:scss "tests/assets/mixin-module.scss"); + scssy!(mixins_inline_scss:scss {" @mixin surface($color: black){ @if $color == black{ color: white; @@ -64,8 +64,8 @@ pub mod scss { } } "}); - sassy!(module_scss:scss "tests/assets/module-forward.scss"); - sassy!(module_inline_scss:scss {" + scssy!(module_scss:scss "tests/assets/module-forward.scss"); + scssy!(module_inline_scss:scss {" @forward 'mixins_a'; @forward 'mixins_c'; "}); From 05ab164118c6b377d87bd87775f414f11044bec2 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Mon, 4 Nov 2024 22:15:20 +0500 Subject: [PATCH 140/184] fix(cfg): replacement --- release.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.toml b/release.toml index ac70f3c..7667a01 100644 --- a/release.toml +++ b/release.toml @@ -4,5 +4,5 @@ sign-tag = true target = "x86_64-unknown-linux-gnu" pre-release-replacements = [ - {file="README.md", search='sabry = {\s?version = "[0-9a-z\-\.]*"', replace='sabry = { version = "{{version}}"'}, + {file="README.md", search='sabry = \{\s?version = "[0-9a-z\-\.]*"', replace='sabry = {version = "{{version}}"'}, ] From 8ee0e11ade3eecac27477d703b33534c2ee1ecc9 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Mon, 4 Nov 2024 22:16:02 +0500 Subject: [PATCH 141/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ed2ec1b..5c90aae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1-beta.4" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1-beta.4" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1-beta.4" } -sabry_build = {path = "sabry_build", version = "0.0.1-beta.4" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1" } +sabry_build = {path = "sabry_build", version = "0.0.1" } [workspace.package] -version = "0.0.1-beta.4" +version = "0.0.1" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 96b411a1903ad9dc6684f3028dee361099a94f3b Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 16 Nov 2024 19:55:27 +0500 Subject: [PATCH 142/184] fix: use hashed style code for const styly! macro --- examples/use-styles/Cargo.lock | 37 ++++--------------------- examples/use-styles/src/main.rs | 8 ++++-- sabry_procmacro_impl/src/impls/styly.rs | 2 +- 3 files changed, 12 insertions(+), 35 deletions(-) diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index a75ee98..0807c2c 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -268,26 +268,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "const_format" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - [[package]] name = "constant_time_eq" version = "0.3.1" @@ -994,7 +974,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "sabry_build", "sabry_intrnl", @@ -1003,7 +983,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,12 +995,11 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "base64", "blake3", "cfg-if", - "const_format", "grass", "lightningcss", "proc-macro2", @@ -1035,14 +1014,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "proc-macro2", "quote", @@ -1262,12 +1241,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "use-styles" version = "0.0.0" diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index a029637..269cd12 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -19,10 +19,14 @@ styly!(pub const bundlemod {" styly!(pub filemod:sass "src/main.sass"); -fn main(){ +fn main() { println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); - println!("someth-dark selector will be: {}", bundlemod::___dark(bundlemod::someth)); + println!( + "someth-dark selector will be: {}", + bundlemod::___dark(bundlemod::someth) + ); println!("#fox id will be: {}", bundlemod::thefox); + println!("Bundles const CSS will be: {}", BUNDLEMOD_CSS); println!("Thats how we used the styles! Good luck!!"); } diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 82801ea..8d6ae1d 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -133,7 +133,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { if constant { let compiler = CompilerAdapter::new(config.clone()); - let css = match compiler.compile_module(ms.syntax.0, &ms.code.code) { + let css = match compiler.compile_module(ms.syntax.0, &scope.hashed_code) { Ok(c) => c, Err(e) => { return syn::Error::new( From d24f68e6eeba65eaa3d8ddd134c3872aaa862bee Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 16 Nov 2024 22:32:38 +0500 Subject: [PATCH 143/184] feat: relative style paths & component crate example --- .github/workflows/cbt.yml | 53 ++++++++++++++++--------- Cargo.toml | 3 ++ README.md | 29 +++++++++++++- examples/define-styles/Cargo.lock | 9 +++-- examples/define-styles/Cargo.toml | 2 +- examples/define-styles/src/lib.rs | 4 +- examples/leptos-axum/Cargo.toml | 13 +++--- examples/leptos-axum/src/main.rs | 1 + examples/leptos-axum/src/routes/home.rs | 1 + examples/leptos-axum/src/shell.rs | 11 ++++- examples/leptos-components/.gitignore | 14 +++++++ examples/leptos-components/Cargo.toml | 33 +++++++++++++++ examples/leptos-components/LICENSE | 24 +++++++++++ examples/leptos-components/README.md | 6 +++ examples/leptos-components/build.rs | 11 +++++ examples/leptos-components/src/lib.rs | 52 ++++++++++++++++++++++++ examples/use-styles/Cargo.lock | 1 + examples/use-styles/Cargo.toml | 4 +- examples/use-styles/build.rs | 12 ++---- examples/use-styles/src/main.rs | 5 ++- sabry_build/src/filevisit.rs | 27 +++++++++---- sabry_procmacro/Cargo.toml | 2 + sabry_procmacro/src/lib.rs | 23 +++++++++-- sabry_procmacro_impl/Cargo.toml | 1 + sabry_procmacro_impl/src/impls/mod.rs | 33 +++++++++------ sabry_procmacro_impl/src/impls/scssy.rs | 45 +++++++++++++++------ sabry_procmacro_impl/src/impls/styly.rs | 40 +++++++++++++++---- tests/macros.rs | 6 ++- 28 files changed, 376 insertions(+), 89 deletions(-) create mode 100644 examples/leptos-components/.gitignore create mode 100644 examples/leptos-components/Cargo.toml create mode 100644 examples/leptos-components/LICENSE create mode 100644 examples/leptos-components/README.md create mode 100644 examples/leptos-components/build.rs create mode 100644 examples/leptos-components/src/lib.rs diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index b8773f0..23416dd 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -1,26 +1,41 @@ name: cargo basic build-test on: - push: - branches: ["window", "master"] - pull_request: - branches: ["window"] + push: + branches: ["window", "master"] + pull_request: + branches: ["window"] env: - CARGO_TERM_COLOR: always + CARGO_TERM_COLOR: always jobs: - build_and_test: - name: Sabry - latest - runs-on: ubuntu-latest - strategy: - matrix: - toolchain: - - stable - - nightly - steps: - - uses: actions/checkout@v4 - - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - - run: cargo build --verbose - - run: cargo test --verbose --all - - run: cargo test --verbose --all --all-features + build_and_test: + name: Sabry - latest + runs-on: ubuntu-latest + strategy: + matrix: + toolchain: + - stable + - nightly + steps: + - uses: actions/checkout@v4 + - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} + - run: cargo build --verbose + - run: cargo test --verbose --all + - run: cargo test --verbose --all --all-features + + build_examples: + name: Sabry - latset - examples + runs-on: ubuntu-latest + strategy: + matrix: + example: + - define-styles + - use-styles + - leptos-axum + steps: + - uses: actions/checkout@v4 + - run: rustup update nightly && rustup default nightly + - run: cd examples/${{ matrix.example }} + - run: cargo build --verbose diff --git a/Cargo.toml b/Cargo.toml index 5c90aae..38499c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,6 +59,9 @@ build = [ net-files = [ "sabry_build/net-files" ] +nightly = [ + "sabry_procmacro?/nightly" +] internals = [] [package.metadata.docs.rs] diff --git a/README.md b/README.md index ae87410..afb8f1d 100644 --- a/README.md +++ b/README.md @@ -130,8 +130,8 @@ Also, just about everything is pub-available in this crate (with *internals* fea Feel free to check out examples: -|[crate of styles](https://github.com/yiffyrusdev/sabry/tree/master/examples/define-styles)|[style usage](https://github.com/yiffyrusdev/sabry/tree/master/examples/use-styles)|[leptos-axum with sabry](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum)| -|-|-|-| +|[crate of styles](https://github.com/yiffyrusdev/sabry/tree/master/examples/define-styles)|[style usage](https://github.com/yiffyrusdev/sabry/tree/master/examples/use-styles)|[leptos-axum with sabry](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum)|[leptos components](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-components)| +|-|-|-|-| ### Create a crate full of arbitrary SASS @@ -256,6 +256,23 @@ styly!(styles {" ``` So the `mixins!` macro we just passed to the `usey!` macro inside of `buildy` function call is now accessible with simple and natural `@use "mixins"` SASS rule! +### Create crate of styled components + +This is currently an alpha-testing-early-concept feature which comes +with some things to avoid. + +While the process depends much on the framework you prefer, there are +some limitations and essential recommendations: + +- Sabry will scope (hash) your styles at build time, which means +higher collision probability between the component crate and the main application, which *can not* be currently +detected by sabry. +- You have to write style scopes for components with `const` styly macro flavour: `styly!(const whatever {""})` + - And then you have to solve the task of injecting those generated CSS for your component manually. +- If you want to write styles in separate SASS/SCSS files, you need the nightly rust and the 'nightly' feature flag set +for sabry, so you can use styles from relative paths `styly!(const comp "./style.scss")` + - Which will give you an error from rust-analyzer wether file exists or not. However, if the path is correct, it will build fine. + ### Leptos specials With [leptos](https://github.com/leptos-rs/leptos) framework you can do the trick to apply some class to most of HtmlElements for the entire component/island: @@ -461,6 +478,8 @@ The given code to `scssy!` is not checked to be valid code in given syntax (wip) > SASS support inside of rust files is experimental. If you do want to use SASS tabbed syntax - consider to use files path instead of sass-in-rust option. +> With *nightly* feature flag if using the relative path like `scssy!(module "./module.scss")` you'll get false-positive error even if file exists. Also you won't get autocompletion and rust-analyzer will complain on `module!` macro. WIP. + ### Scoping with `styly!` The `styly!` macro is available with *procmacro* feature flag which is enabled by default. @@ -541,6 +560,8 @@ mod scope {/* selector collection */} > > Worth of notice: sabry will still include const-flavored styles into the CSS bundle during build time. +> With *nightly* feature flag if using the relative path like `styly!(const scope "./sctyle.scss")` you'll get false-positive error even if file exists. Also you won't get autocompletion and rust-analyzer will complain on `SCOPE_CSS`, `scope::whatever` etc. WIP. + ### Building with `buildy` and `usey!` The `buildy` function is available with *build* feature which needs to be enabled explicitly. @@ -658,6 +679,8 @@ Not any valid CSS selector is a valid rust identifier. In general this section s **lepty-scoping** - overhauls the scope generation logic, best suitable for the leptos. Check out the [section](#leptos-specials) and an [example](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum) +**nightly** - allows relative path selection with `scssy!` and `styly!` macros. However rust-analyzer will raise false-positives for reachable files as well. + ## WIP *(sorted by my own priority)*, "dones" are excluded @@ -666,6 +689,8 @@ Not any valid CSS selector is a valid rust identifier. In general this section s - [ ] some weird unrelated stuff I can see in autocompletion - [ ] Crates of styled components - currently the only way to create them seems to be const styly. - [ ] CSS support + - [x] Allow relative path selection (with 'nightly' feature on nightly rust) + - [ ] Somehow get rid of false-positives AND retain proper autocompletion - [ ] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance - [ ] Use sass-in-rust without quoted styles for variable injection: ```rust, ignore diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index 73cad63..87b2f50 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -974,7 +974,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "sabry_intrnl", "sabry_procmacro", @@ -982,7 +982,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "base64", "blake3", @@ -1001,14 +1001,15 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ + "cfg-if", "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.1-beta.2" +version = "0.0.1" dependencies = [ "proc-macro2", "quote", diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml index 4e80fbe..4288abb 100644 --- a/examples/define-styles/Cargo.toml +++ b/examples/define-styles/Cargo.toml @@ -6,4 +6,4 @@ rust-version = "1.82" publish = false [dependencies] -sabry = {path = "../../"} +sabry = {path = "../../", features = ["nightly"]} diff --git a/examples/define-styles/src/lib.rs b/examples/define-styles/src/lib.rs index 0640d6e..7b1b5ee 100644 --- a/examples/define-styles/src/lib.rs +++ b/examples/define-styles/src/lib.rs @@ -1,6 +1,8 @@ use sabry::scssy; -scssy!(style "src/style.scss"); +// relative path is available because 'nightly' feature flag is set. +// If you don't - this will be "src/style.scss" +scssy!(style "./style.scss"); scssy!(utils {" @mixin flex($direction, $align, $justify, $gap: .5rem) { diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 848c699..6fe0d77 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -9,16 +9,16 @@ publish = false crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "0.7.0-gamma3" } -leptos_axum = { version = "0.7.0-gamma3", optional = true } -leptos_meta = { version = "0.7.0-gamma3" } -leptos_router = { version = "0.7.0-gamma3" } +leptos = { version = "0.7.0-rc1" } +leptos_axum = { version = "0.7.0-rc1", optional = true } +leptos_meta = { version = "0.7.0-rc1" } +leptos_router = { version = "0.7.0-rc1" } axum = { version = "0.7", optional = true } console_error_panic_hook = "0.1" tokio = { version = "1", features = ["rt-multi-thread"], optional = true } tower = { version = "0.4", optional = true } tower-http = { version = "0.5", features = ["fs"], optional = true } -wasm-bindgen = "=0.2.93" +wasm-bindgen = "=0.2.95" thiserror = "1" tracing = { version = "0.1", optional = true } http = "1" @@ -26,6 +26,9 @@ http = "1" # sabry with sass sabry = {path = "../../", features = ["lepty-scoping"]} +# our component library +leptos-components = {path = "../leptos-components"} + [build-dependencies] # sabry for build with sass sabry = {path = "../../", features = ["build", "lepty-scoping"]} diff --git a/examples/leptos-axum/src/main.rs b/examples/leptos-axum/src/main.rs index 355d992..d4b5b24 100644 --- a/examples/leptos-axum/src/main.rs +++ b/examples/leptos-axum/src/main.rs @@ -4,6 +4,7 @@ async fn main() { use axum::Router; use leptos::prelude::*; + use leptos::logging::*; use leptos_axum::{generate_route_list, LeptosRoutes}; use leptos_axum_sabry::shell::*; diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index c8b8d4b..6d5e942 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -45,6 +45,7 @@ pub fn Route() -> impl IntoView { let on_click = move |_| *count.write() += 1; view! {class = STYLE, + <leptos_components::Aside/> // lets use our component <section class=style::table> <h2>"Welcome to Leptos"</h2> <h2 class=""> diff --git a/examples/leptos-axum/src/shell.rs b/examples/leptos-axum/src/shell.rs index 125c90d..d1d757e 100644 --- a/examples/leptos-axum/src/shell.rs +++ b/examples/leptos-axum/src/shell.rs @@ -4,6 +4,7 @@ use leptos_router::{ components::{Route, Router, Routes}, StaticSegment, }; +use sabry::styly; use crate::routes; @@ -29,7 +30,7 @@ pub fn shell(options: LeptosOptions) -> impl IntoView { pub fn App() -> impl IntoView { provide_meta_context(); - view! { + view! {class=APP, <Stylesheet id="leptos" href="/pkg/leptos-axum.css"/> <Title text="Welcome to Leptos"/> <Router> @@ -41,3 +42,11 @@ pub fn App() -> impl IntoView { </Router> } } + +styly!(app:scss {" + @use 'theme'; + + main { + @include theme.surface(primary); + } +"}); diff --git a/examples/leptos-components/.gitignore b/examples/leptos-components/.gitignore new file mode 100644 index 0000000..6985cf1 --- /dev/null +++ b/examples/leptos-components/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml new file mode 100644 index 0000000..2359885 --- /dev/null +++ b/examples/leptos-components/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "leptos-components" +version = "0.1.0" +rust-version = "1.82" +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +leptos = { version = "0.7.0-rc1" } +leptos_meta = { version = "0.7.0-rc1" } +leptos_router = { version = "0.7.0-rc1" } + +sabry = {path = "../../", features = ["lepty-scoping"]} + +[build-dependencies] +sabry = {path = "../../", features = ["build", "lepty-scoping"]} +define-styles = {path = "../define-styles"} + +[features] +hydrate = ["leptos/hydrate"] +ssr = [ + "leptos/ssr", + "leptos_meta/ssr", + "leptos_router/ssr", +] + +[package.metadata.sabry] +css.minify = true +# No need for bundle +# css.bundle = "target/.sabry/target/bundle.css" diff --git a/examples/leptos-components/LICENSE b/examples/leptos-components/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/examples/leptos-components/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to <https://unlicense.org> diff --git a/examples/leptos-components/README.md b/examples/leptos-components/README.md new file mode 100644 index 0000000..bbfcf13 --- /dev/null +++ b/examples/leptos-components/README.md @@ -0,0 +1,6 @@ +<picture> + <source srcset="https://raw.githubusercontent.com/leptos-rs/leptos/main/docs/logos/Leptos_logo_Solid_White.svg" media="(prefers-color-scheme: dark)"> + <img src="https://raw.githubusercontent.com/leptos-rs/leptos/main/docs/logos/Leptos_logo_RGB.svg" alt="Leptos Logo"> +</picture> + +This is an example of sabry with leptos-axum, made with [leptos-axum sterter template](https://github.com/leptos-rs/start-axum) diff --git a/examples/leptos-components/build.rs b/examples/leptos-components/build.rs new file mode 100644 index 0000000..be74188 --- /dev/null +++ b/examples/leptos-components/build.rs @@ -0,0 +1,11 @@ +use define_styles::{theme, utils, tokens}; + +fn main(){ + sabry::buildy( + sabry::usey!( + utils!(), + theme!(), + tokens!() + ) + ).expect("Failed to build with sabry"); +} diff --git a/examples/leptos-components/src/lib.rs b/examples/leptos-components/src/lib.rs new file mode 100644 index 0000000..33a2aaf --- /dev/null +++ b/examples/leptos-components/src/lib.rs @@ -0,0 +1,52 @@ +use leptos::prelude::*; +use leptos_meta::Style; +use sabry::styly; + +#[component] +pub fn Aside() -> impl IntoView { + let showme = RwSignal::new(true); + + view!{class=SCOPE, + <Style>{SCOPE_CSS}</Style> + <Show when=move|| *showme.read()> + <aside> + <h1>"Welcome to 'sabried' leptos!"</h1> + <p>"This is the 'Aside' component"</p> + <p>"which we declared in another crate"</p> + <p>"styled with sabry too!"</p> + <br/> + <button class="btn" on:click=move|_| *showme.write() = false> + "Click me to hide aside!" + </button> + </aside> + </Show> + } +} + +styly!(const scope:scss {" + @use 'theme'; + @use 'utils'; + @use 'tokens'; + + aside { + @include theme.surface(secondary); + @include utils.flex(column, center, center); + + position: fixed; + top: 0; + left: 0; + bottom: 0; + width: max-content; + z-index: 1000; + } + + p { + @include theme.txt(primary); + font-size: 1rem; + } + + .btn { + @include theme.surface(accent); + @include tokens.clickable(); + } +"}); diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 0807c2c..2ab59b6 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -1016,6 +1016,7 @@ dependencies = [ name = "sabry_procmacro" version = "0.0.1" dependencies = [ + "cfg-if", "sabry_procmacro_impl", ] diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml index 29e0a32..c6241e0 100644 --- a/examples/use-styles/Cargo.toml +++ b/examples/use-styles/Cargo.toml @@ -6,10 +6,10 @@ rust-version = "1.82" publish = false [dependencies] -sabry = {path = "../../"} +sabry = {path = "../../", features = ["nightly"]} [build-dependencies] -sabry = {path = "../../", features = ["build"]} +sabry = {path = "../../", features = ["build", "nightly"]} define-styles = {path = "../define-styles"} [package.metadata.sabry] diff --git a/examples/use-styles/build.rs b/examples/use-styles/build.rs index ec066dc..904431c 100644 --- a/examples/use-styles/build.rs +++ b/examples/use-styles/build.rs @@ -9,14 +9,8 @@ scssy!(utils {" } "}); -fn main(){ +fn main() { /* Declare modules to use with sabry */ - sabry::buildy( - usey!( - theme!(), - tokens!(), - utils_dup!(), - utils!() - ) - ).expect("Failed to build sabry styles"); + sabry::buildy(usey!(theme!(), tokens!(), utils_dup!(), utils!())) + .expect("Failed to build sabry styles"); } diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 269cd12..f9cf8ac 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -17,7 +17,9 @@ styly!(pub const bundlemod {" } "}); -styly!(pub filemod:sass "src/main.sass"); +// relative path is available because 'nightly' feature flag is set. +// If you don't - this will be "src/main.sass" +styly!(pub const filemod:sass "./main.sass"); fn main() { println!("someth class codemod styles: {}", bundlemod::someth); @@ -28,5 +30,6 @@ fn main() { ); println!("#fox id will be: {}", bundlemod::thefox); println!("Bundles const CSS will be: {}", BUNDLEMOD_CSS); + println!("Bundles const CSS from file will be: {}", FILEMOD_CSS); // false-positive from relative file. println!("Thats how we used the styles! Good luck!!"); } diff --git a/sabry_build/src/filevisit.rs b/sabry_build/src/filevisit.rs index 2844469..8574a4b 100644 --- a/sabry_build/src/filevisit.rs +++ b/sabry_build/src/filevisit.rs @@ -1,4 +1,7 @@ -use std::{fs, io, path::Path}; +use std::{ + fs, io, + path::{Path, PathBuf}, +}; use proc_macro2::TokenStream; use sabry_procmacro_impl::impls::styly; @@ -6,7 +9,7 @@ use syn::{spanned::Spanned, visit::Visit}; #[derive(Debug, thiserror::Error)] pub enum FileVisitError { - #[error("Could not read file")] + #[error("tt read file")] Read(#[from] io::Error), #[error("styly! macro found, yet invalid")] Styly(#[from] syn::Error), @@ -19,6 +22,7 @@ pub fn visit_file(path: &Path) -> Result<StylyVisitor, FileVisitError> { let mut styly_visitor = StylyVisitor { found_stylys: vec![], + path: path.to_owned(), }; styly_visitor.visit_file(&code_file); @@ -34,17 +38,26 @@ pub fn visit_file(path: &Path) -> Result<StylyVisitor, FileVisitError> { #[derive(Debug)] pub struct StylyVisitor { pub found_stylys: Vec<styly::MacroSyntax>, + pub path: PathBuf, } impl<'ast> Visit<'ast> for StylyVisitor { fn visit_item_macro(&mut self, node: &'ast syn::ItemMacro) { if node.mac.path.get_ident().is_some_and(|i| i == "styly") { - let body = node.mac.parse_body::<TokenStream>().unwrap_or_else(|_| { - panic!("could not parse `styly!` macro at {:?}", node.mac.span()) - }); - let macro_data = styly::parse_macro_syntax(body).unwrap_or_else(|_| { - panic!("could not parse `styly!` macro at {:?}", node.mac.span()) + let body = node.mac.parse_body::<TokenStream>().unwrap_or_else(|e| { + panic!( + "could not parse `styly!` macro at {:?}: {e:?}", + node.mac.span() + ) }); + let macro_data = + styly::parse_macro_syntax(body, self.path.parent().map(|p| p.to_owned())) + .unwrap_or_else(|e| { + panic!( + "could not parse `styly!` macro at {:?}: {e:?}", + node.mac.span() + ) + }); self.found_stylys.push(macro_data); } } diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 570fccf..cb2c1bd 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -13,8 +13,10 @@ proc-macro = true [dependencies] sabry_procmacro_impl = {workspace = true} +cfg-if = {version = "^1.0"} [features] +nightly = [] [package.metadata.docs.rs] all-features = true diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index aed8a2c..5c9ffba 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -1,6 +1,8 @@ #![doc = include_str!("../README.md")] +#![cfg_attr(feature = "nightly", feature(proc_macro_span))] -use proc_macro::TokenStream; +use cfg_if::cfg_if; +use proc_macro::{Span, TokenStream}; use sabry_procmacro_impl::impls::{ scssy::scssy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, }; @@ -34,7 +36,14 @@ use sabry_procmacro_impl::impls::{ /// #[proc_macro] pub fn scssy(input: TokenStream) -> TokenStream { - scssy_macro_impl(input.into()).into() + cfg_if! { + if #[cfg(feature = "nightly")] { + let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); + } else { + let source_path = None; + } + } + scssy_macro_impl(input.into(), source_path).into() } /// Macro that brings sass code into app @@ -96,7 +105,15 @@ pub fn scssy(input: TokenStream) -> TokenStream { /// ``` #[proc_macro] pub fn styly(input: TokenStream) -> TokenStream { - styly_macro_impl(input.into()).into() + cfg_if! { + if #[cfg(feature = "nightly")] { + let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); + } else { + let source_path = None; + } + } + + styly_macro_impl(input.into(), source_path).into() } /// Macro that brings external sass code into app diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index a7a1927..522fa2f 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -18,6 +18,7 @@ raffia = {version = "^0.9"} regex = {version = "^1.11"} [features] +nightly = [] [package.metadata.docs.rs] all-features = true diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index 47a6939..c82f67f 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -30,28 +30,29 @@ impl ArbitraryStyleBlock { pub fn code(&self) -> &str { &self.code } -} -impl Parse for ArbitraryStyleBlock { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + pub fn parse_syn( + input: syn::parse::ParseStream, + use_code_path_prefix: Option<PathBuf>, + ) -> syn::Result<Self> { let (code, span) = if let Ok(path_tok) = input.parse::<LitStr>() { - let path = path_tok.value(); - - let path = match PathBuf::from_str(&path) { - Ok(p) => p, - Err(_) => { - return Err(syn::Error::new( - path_tok.span(), - format!("Could not read {} as a path: Infallible", path), - )) + let path = if let Some(prefix) = use_code_path_prefix { + let p = path_tok.value(); + if let Some(pp) = p.strip_prefix("./") { + prefix.join(pp) + } else { + PathBuf::from_str(&p).expect("Unable to convert path into PathBuf") } + } else { + PathBuf::from_str(&path_tok.value()).expect("Unable to convert path into PathBuf") }; + let fullpath = match path.canonicalize() { Ok(cp) => cp, Err(e) => { return Err(syn::Error::new( path_tok.span(), - format!("Could not use path {path:?}: {:?}", e.kind()), + format!("Could not use path {path:?}: {:?}. If the path is relative and 'nightly' feature flag is set - this is likely false-positive", e.kind()), )) } }; @@ -86,6 +87,12 @@ impl Parse for ArbitraryStyleBlock { } } +impl Parse for ArbitraryStyleBlock { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + Self::parse_syn(input, None) + } +} + #[allow(clippy::to_string_trait_impl)] impl ToString for ArbitraryStyleBlock { fn to_string(&self) -> String { diff --git a/sabry_procmacro_impl/src/impls/scssy.rs b/sabry_procmacro_impl/src/impls/scssy.rs index b82718d..0684b70 100644 --- a/sabry_procmacro_impl/src/impls/scssy.rs +++ b/sabry_procmacro_impl/src/impls/scssy.rs @@ -1,7 +1,12 @@ +use std::path::PathBuf; + use proc_macro2::TokenStream; use quote::quote; use sabry_intrnl::scoper::ArbitraryScope; -use syn::{parse::Parse, Ident}; +use syn::{ + parse::{Parse, ParseStream}, + Ident, +}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -11,31 +16,34 @@ use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; /// `$syntax`: sass/scss /// /// `$code`: intended to be valid based on $syntax -pub fn scssy_macro_impl(input: TokenStream) -> TokenStream { +pub fn scssy_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> TokenStream { let MacroSyntax { ident, - syntax: mode, + syntax, code, - } = match syn::parse2::<MacroSyntax>(input) { + } = match syn::parse::Parser::parse2( + |input: ParseStream<'_>| MacroSyntax::parse_syn(input, source_path), + input, + ) { Ok(m) => m, Err(e) => return e.to_compile_error(), }; // quick raffia syntax check - match ArbitraryScope::from_source(mode.0, ident.clone(), &code.code) { + match ArbitraryScope::from_source(syntax.0, ident.clone(), &code.code) { Ok(_) => {} Err(e) => return syn::Error::new(code.span, format!("{e:?}")).into_compile_error(), } let sourcesass = code.to_string(); - let macro_doc = format!("Arbitrary {:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `magic()` at build time", mode); + let macro_doc = format!("Arbitrary {:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `buildy` at build time", syntax); quote! { #[doc = #macro_doc] #[macro_export] macro_rules! #ident { () => {#sourcesass}; - (syntax) => {#mode}; + (syntax) => {#syntax}; } } } @@ -46,19 +54,32 @@ pub struct MacroSyntax { code: ArbitraryStyleBlock, } -impl Parse for MacroSyntax { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { +impl MacroSyntax { + pub fn parse_syn( + input: syn::parse::ParseStream, + source_path: Option<PathBuf>, + ) -> syn::Result<Self> { let ident = input.parse::<Ident>()?; - let mode = input.parse::<ArbitraryStyleSyntax>()?; - let code = input.parse::<ArbitraryStyleBlock>()?; + let syntax = input.parse::<ArbitraryStyleSyntax>()?; + + let code = match source_path { + Some(sp) => ArbitraryStyleBlock::parse_syn(input, Some(sp))?, + None => input.parse::<ArbitraryStyleBlock>()?, + }; Ok(Self { ident, - syntax: mode, + syntax, code, }) } } +impl Parse for MacroSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + Self::parse_syn(input, None) + } +} + #[cfg(test)] mod test {} diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 8d6ae1d..8231201 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use proc_macro2::{Span, TokenStream}; use quote::quote; use sabry_intrnl::{ @@ -5,7 +7,10 @@ use sabry_intrnl::{ config::SabryConfig, scoper::{apply_basic_rusty_member_gen_rules, ArbitraryScope, ScopedSelector}, }; -use syn::{parse::Parse, Ident, Token}; +use syn::{ + parse::{Parse, ParseStream}, + Ident, Token, +}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -26,7 +31,7 @@ use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; /// /// The machine-readable output may also be forced by use `machine_readable: true` arg on `parse_macro_syntax` function /// without modifying tokenstream -pub fn styly_macro_impl(input: TokenStream) -> TokenStream { +pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> TokenStream { let config = match SabryConfig::require() { Ok(c) => c, Err(e) => { @@ -40,7 +45,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { .to_compile_error() } }; - let ms = match parse_macro_syntax(input) { + let ms = match parse_macro_syntax(input, source_path) { Ok(ms) => ms, Err(e) => return e.to_compile_error(), }; @@ -180,8 +185,14 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { } // reusable function, that does not return tokenstream for machine-processing at build time -pub fn parse_macro_syntax(input: TokenStream) -> Result<MacroSyntax, syn::Error> { - syn::parse2::<MacroSyntax>(input) +pub fn parse_macro_syntax( + input: TokenStream, + source_path: Option<PathBuf>, +) -> Result<MacroSyntax, syn::Error> { + syn::parse::Parser::parse2( + |input: ParseStream<'_>| MacroSyntax::parse_syn(input, source_path), + input, + ) } #[derive(Debug)] @@ -215,12 +226,19 @@ pub struct MacroSyntax { pub code: ArbitraryStyleBlock, } -impl Parse for MacroSyntax { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { +impl MacroSyntax { + pub fn parse_syn( + input: syn::parse::ParseStream, + source_path: Option<PathBuf>, + ) -> syn::Result<Self> { let mut generator = input.parse::<ScopeGenerator>()?; let scope = input.parse::<Ident>()?; let syntax = input.parse::<ArbitraryStyleSyntax>()?; - let code = input.parse::<ArbitraryStyleBlock>()?; + let code = if source_path.is_some() { + ArbitraryStyleBlock::parse_syn(input, source_path) + } else { + input.parse::<ArbitraryStyleBlock>() + }?; if input.parse::<Token![#]>().is_ok() { generator = ScopeGenerator::MachineReadable @@ -234,3 +252,9 @@ impl Parse for MacroSyntax { }) } } + +impl Parse for MacroSyntax { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + Self::parse_syn(input, None) + } +} diff --git a/tests/macros.rs b/tests/macros.rs index f8f2ea0..bcb013a 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -111,7 +111,11 @@ mod build_tests { use std::fs; use insta::{glob, Settings}; - use sabry::{usey, buildmagic::SabryBuilder, config::{BehavHashCollision, BehavSassModCollision, SabryConfig}}; + use sabry::{ + buildmagic::SabryBuilder, + config::{BehavHashCollision, BehavSassModCollision, SabryConfig}, + usey, + }; fn gen_config() -> SabryConfig { let mut config = SabryConfig::require().unwrap(); From 20a25d7409da3807168d73b31b99bc8cd3f7d583 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 16 Nov 2024 22:37:31 +0500 Subject: [PATCH 144/184] oops: rearrange uses --- sabry_procmacro/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index 5c9ffba..71136a5 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -2,7 +2,7 @@ #![cfg_attr(feature = "nightly", feature(proc_macro_span))] use cfg_if::cfg_if; -use proc_macro::{Span, TokenStream}; +use proc_macro::TokenStream; use sabry_procmacro_impl::impls::{ scssy::scssy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, }; @@ -38,6 +38,7 @@ use sabry_procmacro_impl::impls::{ pub fn scssy(input: TokenStream) -> TokenStream { cfg_if! { if #[cfg(feature = "nightly")] { + use proc_macro::Span; let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); } else { let source_path = None; @@ -107,6 +108,7 @@ pub fn scssy(input: TokenStream) -> TokenStream { pub fn styly(input: TokenStream) -> TokenStream { cfg_if! { if #[cfg(feature = "nightly")] { + use proc_macro::Span; let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); } else { let source_path = None; From 9a8544d4259d3a78f02be2b8706503420be89322 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Sat, 16 Nov 2024 22:39:35 +0500 Subject: [PATCH 145/184] chore: Release --- Cargo.toml | 10 +++++----- README.md | 12 ++++++------ sabry_build/README.md | 2 +- sabry_intrnl/README.md | 2 +- sabry_procmacro/README.md | 2 +- sabry_procmacro_impl/README.md | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 38499c1..cc8a3c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.1" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.1" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.1" } -sabry_build = {path = "sabry_build", version = "0.0.1" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.2" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.2" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.2" } +sabry_build = {path = "sabry_build", version = "0.0.2" } [workspace.package] -version = "0.0.1" +version = "0.0.2" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] diff --git a/README.md b/README.md index afb8f1d..ec284c2 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ The only need is the dependency #Cargo.toml [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` And a proc-macro ```rust @@ -174,7 +174,7 @@ Depend on sabry # Cargo.toml [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` And create a style scope wherever you want: ```rust @@ -214,10 +214,10 @@ To be able to compile all styles sabry also needs the *build* feature flag: # Cargo.toml [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} [build-dependencies] -sabry = {version = "0.0.1", features = ["build"]} +sabry = {version = "0.0.2", features = ["build"]} ``` > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. @@ -296,10 +296,10 @@ So, if you're on leptos, and don't mind to take this approach, I'd highly recomm # Cargo.toml [dependencies] -sabry = {version = "0.0.1", features = ["lepty-scoping"]} +sabry = {version = "0.0.2", features = ["lepty-scoping"]} [build-dependencies] -sabry = {version = "0.0.1", features = ["build", "lepty-scoping"]} +sabry = {version = "0.0.2", features = ["build", "lepty-scoping"]} ``` ```rust diff --git a/sabry_build/README.md b/sabry_build/README.md index 51da6c9..6171d6f 100644 --- a/sabry_build/README.md +++ b/sabry_build/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md index 7c3e17d..c67c372 100644 --- a/sabry_intrnl/README.md +++ b/sabry_intrnl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md index 6de0068..93779e0 100644 --- a/sabry_procmacro/README.md +++ b/sabry_procmacro/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md index eb13d81..e442bb3 100644 --- a/sabry_procmacro_impl/README.md +++ b/sabry_procmacro_impl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.1"} +sabry = {version = "0.0.2"} ``` From 337a866bfb33b1013398d2eb4d3d10a2dfcbc2b8 Mon Sep 17 00:00:00 2001 From: Yiffy Dev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 01:26:23 +0500 Subject: [PATCH 146/184] 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<String, SabryCompilerError> { 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<PathBuf>) -> Tok interp }) }) + .unique() .map(|s| { let ident = apply_basic_rusty_member_gen_rules(&s); let fnident = syn::parse_str::<Ident>(format!("_{ident}").as_str()) @@ -110,6 +112,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> 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} From fe39789ac5ea2a6527ebc8a53cb7f6d2d643fcf4 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 01:39:35 +0500 Subject: [PATCH 147/184] fix: allchore: bump example deps --- examples/define-styles/Cargo.lock | 242 ++++++++++++------------- examples/leptos-axum/Cargo.toml | 10 +- examples/leptos-components/Cargo.toml | 6 +- examples/use-styles/Cargo.lock | 246 ++++++++++++-------------- 4 files changed, 232 insertions(+), 272 deletions(-) diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index 87b2f50..d1a55eb 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -37,15 +37,15 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -58,9 +58,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" @@ -143,9 +143,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" dependencies = [ "arrayref", "arrayvec", @@ -190,15 +190,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" dependencies = [ "shlex", ] @@ -211,18 +211,18 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -232,9 +232,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "codemap" @@ -317,7 +317,7 @@ dependencies = [ "cssparser-macros", "dtoa-short", "itoa", - "phf 0.11.2", + "phf", "smallvec", ] @@ -337,7 +337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -408,15 +408,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -451,7 +442,7 @@ dependencies = [ "indexmap", "lasso", "once_cell", - "phf 0.11.2", + "phf", "rand", ] @@ -476,9 +467,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -488,12 +479,12 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", ] [[package]] @@ -512,17 +503,27 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.11" +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -543,15 +544,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "lightningcss" -version = "1.0.0-alpha.59" +version = "1.0.0-alpha.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" +checksum = "20c9e1f991b3861d25bf872ecca2eb6a73f7a9fe671da047cd1f9b49c65cbc40" dependencies = [ "ahash 0.8.11", "bitflags", @@ -561,7 +562,8 @@ dependencies = [ "dashmap", "data-encoding", "getrandom", - "itertools", + "indexmap", + "itertools 0.10.5", "lazy_static", "lightningcss-derive", "parcel_selectors", @@ -627,17 +629,17 @@ checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" [[package]] name = "parcel_selectors" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" +checksum = "7645c578d3a5c4cdf667af1ad39765f5f751c4883d251e050d5e1204b5cad0a9" dependencies = [ "bitflags", "cssparser", - "fxhash", "log", - "phf 0.10.1", + "phf", "phf_codegen", "precomputed-hash", + "rustc-hash", "smallvec", ] @@ -676,18 +678,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_shared 0.10.0", -] +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "phf" @@ -696,27 +689,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ "phf_macros", - "phf_shared 0.11.2", + "phf_shared", ] [[package]] name = "phf_codegen" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand", + "phf_generator", + "phf_shared", ] [[package]] @@ -725,7 +708,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ - "phf_shared 0.11.2", + "phf_shared", "rand", ] @@ -735,20 +718,11 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", + "phf_generator", + "phf_shared", "proc-macro2", "quote", - "syn 2.0.85", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", + "syn 2.0.90", ] [[package]] @@ -777,9 +751,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -837,7 +811,7 @@ checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" dependencies = [ "heck", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -892,9 +866,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags", ] @@ -913,9 +887,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -966,6 +940,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rustc-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" + [[package]] name = "ryu" version = "1.0.18" @@ -974,7 +954,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1" +version = "0.0.2" dependencies = [ "sabry_intrnl", "sabry_procmacro", @@ -982,7 +962,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.1" +version = "0.0.2" dependencies = [ "base64", "blake3", @@ -994,14 +974,14 @@ dependencies = [ "raffia", "regex", "serde", - "syn 2.0.85", + "syn 2.0.90", "thiserror", "toml", ] [[package]] name = "sabry_procmacro" -version = "0.0.1" +version = "0.0.2" dependencies = [ "cfg-if", "sabry_procmacro_impl", @@ -1009,14 +989,15 @@ dependencies = [ [[package]] name = "sabry_procmacro_impl" -version = "0.0.1" +version = "0.0.2" dependencies = [ + "itertools 0.13.0", "proc-macro2", "quote", "raffia", "regex", "sabry_intrnl", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1033,29 +1014,29 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "serde" -version = "1.0.213" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -1124,9 +1105,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -1141,22 +1122,22 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1210,9 +1191,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-segmentation" @@ -1252,9 +1233,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -1263,24 +1244,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1288,22 +1268,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "windows-sys" @@ -1414,5 +1394,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 6fe0d77..659fbf9 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -9,16 +9,16 @@ publish = false crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "0.7.0-rc1" } -leptos_axum = { version = "0.7.0-rc1", optional = true } -leptos_meta = { version = "0.7.0-rc1" } -leptos_router = { version = "0.7.0-rc1" } +leptos = { version = "^0.7" } +leptos_axum = { version = "^0.7", optional = true } +leptos_meta = { version = "^0.7" } +leptos_router = { version = "^0.7" } axum = { version = "0.7", optional = true } console_error_panic_hook = "0.1" tokio = { version = "1", features = ["rt-multi-thread"], optional = true } tower = { version = "0.4", optional = true } tower-http = { version = "0.5", features = ["fs"], optional = true } -wasm-bindgen = "=0.2.95" +wasm-bindgen = "=0.2.96" thiserror = "1" tracing = { version = "0.1", optional = true } http = "1" diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml index 2359885..4b9f858 100644 --- a/examples/leptos-components/Cargo.toml +++ b/examples/leptos-components/Cargo.toml @@ -9,9 +9,9 @@ publish = false crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "0.7.0-rc1" } -leptos_meta = { version = "0.7.0-rc1" } -leptos_router = { version = "0.7.0-rc1" } +leptos = { version = "^0.7" } +leptos_meta = { version = "^0.7" } +leptos_router = { version = "^0.7" } sabry = {path = "../../", features = ["lepty-scoping"]} diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 2ab59b6..1e07093 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -37,15 +37,15 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -58,9 +58,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" @@ -143,9 +143,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" dependencies = [ "arrayref", "arrayvec", @@ -190,15 +190,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" dependencies = [ "shlex", ] @@ -211,18 +211,18 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -232,9 +232,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "codemap" @@ -317,7 +317,7 @@ dependencies = [ "cssparser-macros", "dtoa-short", "itoa", - "phf 0.11.2", + "phf", "smallvec", ] @@ -337,7 +337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -408,15 +408,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -451,7 +442,7 @@ dependencies = [ "indexmap", "lasso", "once_cell", - "phf 0.11.2", + "phf", "rand", ] @@ -476,9 +467,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -488,12 +479,12 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", ] [[package]] @@ -512,17 +503,27 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.11" +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -543,15 +544,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "lightningcss" -version = "1.0.0-alpha.59" +version = "1.0.0-alpha.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e225b3fa0a8bd5562c8833b1a32afa88761c4e661d3177b8cdc4e13cbf078e" +checksum = "20c9e1f991b3861d25bf872ecca2eb6a73f7a9fe671da047cd1f9b49c65cbc40" dependencies = [ "ahash 0.8.11", "bitflags", @@ -561,7 +562,8 @@ dependencies = [ "dashmap", "data-encoding", "getrandom", - "itertools", + "indexmap", + "itertools 0.10.5", "lazy_static", "lightningcss-derive", "parcel_selectors", @@ -627,17 +629,17 @@ checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" [[package]] name = "parcel_selectors" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4d26c18a8377a64728c04bf3b2e48ec43b0c77e687a18e03eb837d65e08a14" +checksum = "7645c578d3a5c4cdf667af1ad39765f5f751c4883d251e050d5e1204b5cad0a9" dependencies = [ "bitflags", "cssparser", - "fxhash", "log", - "phf 0.10.1", + "phf", "phf_codegen", "precomputed-hash", + "rustc-hash", "smallvec", ] @@ -676,18 +678,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_shared 0.10.0", -] +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "phf" @@ -696,27 +689,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ "phf_macros", - "phf_shared 0.11.2", + "phf_shared", ] [[package]] name = "phf_codegen" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand", + "phf_generator", + "phf_shared", ] [[package]] @@ -725,7 +708,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ - "phf_shared 0.11.2", + "phf_shared", "rand", ] @@ -735,20 +718,11 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", + "phf_generator", + "phf_shared", "proc-macro2", "quote", - "syn 2.0.85", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", + "syn 2.0.90", ] [[package]] @@ -777,9 +751,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -837,7 +811,7 @@ checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" dependencies = [ "heck", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -892,9 +866,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags", ] @@ -913,9 +887,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -966,6 +940,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rustc-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" + [[package]] name = "ryu" version = "1.0.18" @@ -974,7 +954,7 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sabry" -version = "0.0.1" +version = "0.0.2" dependencies = [ "sabry_build", "sabry_intrnl", @@ -983,19 +963,19 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.1" +version = "0.0.2" dependencies = [ "proc-macro2", "sabry_intrnl", "sabry_procmacro_impl", - "syn 2.0.85", + "syn 2.0.90", "thiserror", "walkdir", ] [[package]] name = "sabry_intrnl" -version = "0.0.1" +version = "0.0.2" dependencies = [ "base64", "blake3", @@ -1007,14 +987,14 @@ dependencies = [ "raffia", "regex", "serde", - "syn 2.0.85", + "syn 2.0.90", "thiserror", "toml", ] [[package]] name = "sabry_procmacro" -version = "0.0.1" +version = "0.0.2" dependencies = [ "cfg-if", "sabry_procmacro_impl", @@ -1022,14 +1002,15 @@ dependencies = [ [[package]] name = "sabry_procmacro_impl" -version = "0.0.1" +version = "0.0.2" dependencies = [ + "itertools 0.13.0", "proc-macro2", "quote", "raffia", "regex", "sabry_intrnl", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1055,29 +1036,29 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "serde" -version = "1.0.213" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -1146,9 +1127,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -1163,22 +1144,22 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1232,9 +1213,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-segmentation" @@ -1292,9 +1273,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -1303,24 +1284,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1328,22 +1308,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "winapi-util" @@ -1463,5 +1443,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] From cf28ebcd31291ddee9cbe6b1f5e51c3e9c76a252 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:33:59 +0500 Subject: [PATCH 148/184] tests: prepare to the glob & clean a bit --- tests/assets/global.scss | 31 +++++++++++++++++++ tests/macros.rs | 11 ------- .../compilation_with_buildy@bundle.css.snap | 4 +-- ...ompilation_with_buildy@bundle.css.snap.new | 7 +++++ ...n_with_buildy@scopes__global_scss.css.snap | 7 +++++ ...th_buildy@scopes__global_scss.css.snap.new | 7 +++++ tests/styly_global.rs | 3 ++ tests/styly_module_usage.rs | 4 +++ tests/styly_repeating_selector.rs | 4 +++ tests/styly_sole_code.rs | 4 +++ tests/styly_use_forwarded.rs | 4 +++ 11 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 tests/assets/global.scss create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new create mode 100644 tests/styly_global.rs create mode 100644 tests/styly_module_usage.rs create mode 100644 tests/styly_repeating_selector.rs create mode 100644 tests/styly_sole_code.rs create mode 100644 tests/styly_use_forwarded.rs diff --git a/tests/assets/global.scss b/tests/assets/global.scss new file mode 100644 index 0000000..8c74805 --- /dev/null +++ b/tests/assets/global.scss @@ -0,0 +1,31 @@ +.p1 { + font-size: 10px; + color: white; + &-dark { + color: black; + } + + :global(html.mob) & { + font-size: 1rem; + + &-dark { + color: green; + } + + :global(ie) some & { + border: 1px; + } + } + + :global(html.dark) & { + color: orange; + } + + :global(whatever) & { + background: yellow; + + :global(ooops) & { + border: none; + } + } +} diff --git a/tests/macros.rs b/tests/macros.rs index 765a63b..30237f0 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -1,5 +1,3 @@ -use sabry::styly; - pub mod sass { use sabry::scssy; @@ -76,15 +74,6 @@ pub mod scss { pub(crate) use module_scss as module_c; } -styly!(sole_code_sass:sass "tests/assets/sole-code.sass"); -styly!(sole_code_scss:scss "tests/assets/sole-code.scss"); -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() { assert_eq!(sass::mixins_a!(), sass::mixins_inline_a!()); 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 a577331..0877132 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: 183 +assertion_line: 172 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%)}.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@bundle.css.snap.new b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new new file mode 100644 index 0000000..057646a --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 172 +input_file: tests/sabry_output/bundle.css +snapshot_kind: text +--- +.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%)}.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}.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}.wZIQboPSLZ8aKu0MjXHwYg.p1{color:#fff;font-size:10px}.wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:#000}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{font-size:1rem}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:green}ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{border:1px}html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1{color:orange}whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{background:#ff0}ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{border:none} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap new file mode 100644 index 0000000..31b7e63 --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 184 +input_file: tests/sabry_output/scopes/global_scss.css +snapshot_kind: text +--- +.qbRV6eFWg6fUikzGqcGvZg.p1{color:#fff;font-size:10px}.qbRV6eFWg6fUikzGqcGvZg.p1-dark{color:#000}html.mob .qbRV6eFWg6fUikzGqcGvZg.p1{font-size:1rem}html.mob .qbRV6eFWg6fUikzGqcGvZg.p1-dark{color:green}html.dark .qbRV6eFWg6fUikzGqcGvZg.p1{color:purple}whatever .qbRV6eFWg6fUikzGqcGvZg.p1{background:#ff0} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new new file mode 100644 index 0000000..db27d21 --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 172 +input_file: tests/sabry_output/scopes/global_scss.css +snapshot_kind: text +--- +.wZIQboPSLZ8aKu0MjXHwYg.p1{color:#fff;font-size:10px}.wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:#000}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{font-size:1rem}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:green}ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{border:1px}html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1{color:orange}whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{background:#ff0}ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{border:none} diff --git a/tests/styly_global.rs b/tests/styly_global.rs new file mode 100644 index 0000000..6e96aa5 --- /dev/null +++ b/tests/styly_global.rs @@ -0,0 +1,3 @@ +use sabry::styly; + +styly!(global_scss:scss "tests/assets/global.scss"); diff --git a/tests/styly_module_usage.rs b/tests/styly_module_usage.rs new file mode 100644 index 0000000..0b1bf9d --- /dev/null +++ b/tests/styly_module_usage.rs @@ -0,0 +1,4 @@ +use sabry::styly; + +styly!(module_usage_sass:sass "tests/assets/module-usage.sass"); +styly!(module_usage_scss:scss "tests/assets/module-usage.scss"); diff --git a/tests/styly_repeating_selector.rs b/tests/styly_repeating_selector.rs new file mode 100644 index 0000000..430ac62 --- /dev/null +++ b/tests/styly_repeating_selector.rs @@ -0,0 +1,4 @@ +use sabry::styly; + +styly!(repeating_selector_sass:sass "tests/assets/repeating-selector.sass"); +styly!(repeating_selector_scss:scss "tests/assets/repeating-selector.scss"); diff --git a/tests/styly_sole_code.rs b/tests/styly_sole_code.rs new file mode 100644 index 0000000..4d7ece1 --- /dev/null +++ b/tests/styly_sole_code.rs @@ -0,0 +1,4 @@ +use sabry::styly; + +styly!(sole_code_sass:sass "tests/assets/sole-code.sass"); +styly!(sole_code_scss:scss "tests/assets/sole-code.scss"); diff --git a/tests/styly_use_forwarded.rs b/tests/styly_use_forwarded.rs new file mode 100644 index 0000000..958d33e --- /dev/null +++ b/tests/styly_use_forwarded.rs @@ -0,0 +1,4 @@ +use sabry::styly; + +styly!(use_forwarded_sass:sass "tests/assets/use-forwarded.sass"); +styly!(use_forwarded_scss:scss "tests/assets/use-forwarded.scss"); From 28fd7da1079febec8cd49358d97e629a134daf11 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:34:23 +0500 Subject: [PATCH 149/184] feature: implement :glob() --- sabry_intrnl/src/scoper/mod.rs | 89 +++++++++++++++++++++---- sabry_intrnl/src/syntax/mod.rs | 25 ++++++- sabry_procmacro_impl/src/impls/styly.rs | 3 +- 3 files changed, 100 insertions(+), 17 deletions(-) diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 112ffe3..24696d3 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -2,7 +2,7 @@ use std::fmt::Debug; use cfg_if::cfg_if; use hash::ScopeHash; -use raffia::Spanned; +use raffia::{Span, Spanned}; use regex::Regex; use crate::{ @@ -109,7 +109,33 @@ impl<'s> HashedScope<'s> { .filter_map(|t| t.as_tag_name()) .map(|c| HashedSelector::from_tag(&hash, c)); - let mut hashed_selectors = classes.chain(ids).chain(tags).collect::<Vec<_>>(); + // get global selectors + let globs = scope.adapter().glob_modified_selectors(); + let globs = globs + .iter() + .filter_map(|g| { + // we do ignore the latter selectors from :global(a, b) because there's no clear decision: + // how should we treat :glob(a, b) c {} + // as `a c {}` `b c {}` + // or as `a, b c {}` ? + g.arg.clone().and_then(|a| { + if let raffia::ast::PseudoClassSelectorArgKind::SelectorList(list) = a.kind { + list.selectors + .first() + .cloned() + .map(|fcl| (g.span.clone(), fcl.span.clone())) + } else { + None + } + }) + }) + .map(|c| HashedSelector::from_glob_mod(&hash, c, scope.adapter().source())); + + let mut hashed_selectors = classes + .chain(ids) + .chain(tags) + .chain(globs) + .collect::<Vec<_>>(); // sorting by span start is important because of how hashed code construction works hashed_selectors.sort_by(|a, b| { @@ -151,6 +177,18 @@ pub struct HashedSelector { } impl HashedSelector { + pub fn from_glob_mod(hash: &ScopeHash, sel: (Span, Span), source: &str) -> Self { + let sel = ScopedSelector::from_glob_mod(sel, source); + let css_ident = Self::make_hashed_css(&sel, hash); + let html_ident = Self::make_hashed_html(&sel, hash); + + Self { + sel, + css_ident, + html_ident, + } + } + /// Construct the [HashedSelector], with given hash and parsed class selector pub fn from_class(hash: &ScopeHash, sel: &raffia::ast::ClassSelector) -> Self { let sel = ScopedSelector::from_class(sel); @@ -220,6 +258,7 @@ impl HashedSelector { } } } + ScopedSelector::Glob { raw, .. } => raw.clone(), } } @@ -254,6 +293,7 @@ impl HashedSelector { } } ScopedSelector::Tag(_) => None, + ScopedSelector::Glob { .. } => None, } } } @@ -264,7 +304,7 @@ pub struct ArbitrarySelector { /// CSS-ish identifier pub ident: String, /// Span in original CSS code where it comes from - pub span: raffia::Span, + pub span: Span, } /// Any unary CSS-ish selector, that's able to be scoped, and then hashed @@ -273,6 +313,11 @@ pub enum ScopedSelector { Class(ArbitrarySelector), Id(ArbitrarySelector), Tag(ArbitrarySelector), + Glob { + origin: ArbitrarySelector, + inner_span: Span, + raw: String, + }, } impl ScopedSelector { @@ -282,24 +327,40 @@ impl ScopedSelector { Self::Class(a) => a, Self::Id(a) => a, Self::Tag(a) => a, + Self::Glob { origin, .. } => origin, } } /// Generate rusty member ident based on selector type and CSS ident - pub fn gen_rusty_ident(&self) -> syn::Ident { - let basic = apply_basic_rusty_member_gen_rules(&self.as_arbitrary().ident); + pub fn gen_rusty_ident(&self) -> Option<syn::Ident> { + let arb = &self.as_arbitrary().ident; + let basic = apply_basic_rusty_member_gen_rules(arb); let ready = match self { - Self::Class(_) => basic, - Self::Id(_) => { - format!("the{basic}") - } - Self::Tag(_) => { - format!("any{basic}") - } + Self::Class(_) => Some(basic), + Self::Id(_) => Some(format!("the{basic}")), + Self::Tag(_) => Some(format!("any{basic}")), + Self::Glob { .. } => None, }; - syn::parse_str::<syn::Ident>(&ready).expect("BUG: formed ident is not Rust Ident") + ready.map(|rs| { + syn::parse_str::<syn::Ident>(&rs).expect("BUG: formed ident is not Rust Ident") + }) + } + + /// Construct this from glob complex selector + pub fn from_glob_mod(s: (Span, Span), source: &str) -> Self { + let inner_span = s.1; + let origin_ident = source[s.0.start..s.0.end].to_owned(); + + Self::Glob { + origin: ArbitrarySelector { + span: s.0, + ident: origin_ident, + }, + raw: source[inner_span.start..inner_span.end].to_owned(), + inner_span, + } } /// Construct this from class selector @@ -482,7 +543,7 @@ mod test { .hashed_selectors .iter() .map(|s| s.sel.gen_rusty_ident()) - .map(|i| i.to_string()) + .flat_map(|i| i.map(|is| is.to_string())) .collect::<HashSet<_>>(); assert_eq!(expect_ident_names, sels); diff --git a/sabry_intrnl/src/syntax/mod.rs b/sabry_intrnl/src/syntax/mod.rs index ba85336..9feccd4 100644 --- a/sabry_intrnl/src/syntax/mod.rs +++ b/sabry_intrnl/src/syntax/mod.rs @@ -1,8 +1,8 @@ use ostrta::OneSyntaxToRuleThemAll; use raffia::{ ast::{ - ClassSelector, CompoundSelector, IdSelector, NestingSelector, SimpleSelector, Statement, - Stylesheet, TypeSelector, + ClassSelector, CompoundSelector, IdSelector, NestingSelector, PseudoClassSelector, + SimpleSelector, Statement, Stylesheet, TypeSelector, }, ParserBuilder, }; @@ -56,6 +56,27 @@ impl<'s> StylesheetAdapter<'s> { self.selectors_by(|c| c.as_nesting().cloned()) } + /// special selector case searching for :g(whatever), :glob(whatever), :global(whatever) + pub fn glob_modified_selectors(&self) -> Vec<PseudoClassSelector<'s>> { + self.selectors_by(|c| { + let cps = match c.as_pseudo_class() { + Some(s) => s.clone(), + _ => return None, + }; + + let ident = match cps.name.as_literal().map(|r| r.raw) { + Some(i) => i, + _ => return None, + }; + + if ident == "global" { + Some(cps) + } else { + None + } + }) + } + /// Return collected [Vec] of owned values modulo `T`, filtered by `F`. /// /// This is preferred way to apply custom filtering on selectors over diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 5d896d3..e49a577 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -119,13 +119,14 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok ScopedSelector::Class(_) => "class", ScopedSelector::Id(_) => "id", ScopedSelector::Tag(_) => "tagname", + ScopedSelector::Glob { .. } => "glob", }; (name, hs.sel.gen_rusty_ident(), html, hs.css_ident.clone()) }) }) .map(|(name, ident, html, css)| { - let docs = format!("'{}' {}. CSS selector '{}'", ident, name, css); + let docs = format!("'{:?}' {}. CSS selector '{}'", ident, name, css); quote! { #[doc = #docs] #[allow(non_upper_case_globals)] From 274aefb409462a6dc1400b2c2107340a733ee3f3 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:35:47 +0500 Subject: [PATCH 150/184] tests: use uncompressed. Lets pray that those can be trusted on the edge --- tests/macros.rs | 2 +- .../compilation_with_buildy@bundle.css.snap | 593 ++++++++++++++++++ ...ompilation_with_buildy@bundle.css.snap.new | 7 - ...n_with_buildy@scopes__global_scss.css.snap | 35 +- ...th_buildy@scopes__global_scss.css.snap.new | 7 - ..._buildy@scopes__module_usage_sass.css.snap | 114 +++- ..._buildy@scopes__module_usage_scss.css.snap | 114 +++- ...y@scopes__repeating_selector_sass.css.snap | 30 +- ...y@scopes__repeating_selector_scss.css.snap | 30 +- ...ith_buildy@scopes__sole_code_sass.css.snap | 31 +- ...ith_buildy@scopes__sole_code_scss.css.snap | 31 +- ...buildy@scopes__use_forwarded_sass.css.snap | 114 +++- ...buildy@scopes__use_forwarded_scss.css.snap | 114 +++- 13 files changed, 1189 insertions(+), 33 deletions(-) delete mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new delete mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new diff --git a/tests/macros.rs b/tests/macros.rs index 30237f0..e3e56e4 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -112,7 +112,7 @@ mod build_tests { let mut config = SabryConfig::require().unwrap(); config.css.bundle = Some("tests/sabry_output/bundle.css".into()); config.css.scopes = Some("tests/sabry_output/scopes".into()); - config.css.minify = true; + config.css.minify = false; config.css.prelude = Some(vec!["tests/assets/prelude.css".into()]); config.sass.prelude = Some(vec![ 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 0877132..c8a14ae 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -4,4 +4,597 @@ assertion_line: 172 input_file: tests/sabry_output/bundle.css snapshot_kind: text --- +.n5vGKZlIscA58H8d7ZMOhSw.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} +.n5vGKZlIscA58H8d7ZMOhSw.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { + transform: translateX(10%); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(10%); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:hover { + transform: translateX(10%); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(10%); +} + +.smfXzGrnTs2kl9jPP0nk6w.fuzz { + background-color: red; + display: block; +} + +.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark { + background-color: #000; + color: #fff; +} + +.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 { + position: relative; + display: grid; + grid-template-areas: "a b c" + "d e f" + "x x x"; + display: block; +} + +.FT5yVVwswyLvNU3dIk0qw.fuzz { + background-color: red; + display: block; +} + +.FT5yVVwswyLvNU3dIk0qw.fuzz-dark { + background-color: #000; + color: #fff; +} + +.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 { + position: relative; + display: grid; + grid-template-areas: "a b c" + "d e f" + "x x x"; + display: block; +} + +.qK4fsMeZRSTGObSesXXRBA.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:hover { + transform: translateX(10%); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(10%); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:hover { + transform: translateX(10%); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(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; +} + +.wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 10px; + color: #fff; +} + +.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: #000; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 1rem; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: green; +} + +ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: 1px; +} + +html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { + color: orange; +} + +whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + background: #ff0; +} + +ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: none; +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new deleted file mode 100644 index 057646a..0000000 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap.new +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/macros.rs -assertion_line: 172 -input_file: tests/sabry_output/bundle.css -snapshot_kind: text ---- -.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%)}.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}.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}.wZIQboPSLZ8aKu0MjXHwYg.p1{color:#fff;font-size:10px}.wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:#000}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{font-size:1rem}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:green}ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{border:1px}html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1{color:orange}whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{background:#ff0}ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{border:none} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap index 31b7e63..a2a6ddf 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap @@ -1,7 +1,38 @@ --- source: tests/macros.rs -assertion_line: 184 +assertion_line: 172 input_file: tests/sabry_output/scopes/global_scss.css snapshot_kind: text --- -.qbRV6eFWg6fUikzGqcGvZg.p1{color:#fff;font-size:10px}.qbRV6eFWg6fUikzGqcGvZg.p1-dark{color:#000}html.mob .qbRV6eFWg6fUikzGqcGvZg.p1{font-size:1rem}html.mob .qbRV6eFWg6fUikzGqcGvZg.p1-dark{color:green}html.dark .qbRV6eFWg6fUikzGqcGvZg.p1{color:purple}whatever .qbRV6eFWg6fUikzGqcGvZg.p1{background:#ff0} +.wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 10px; + color: #fff; +} + +.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: #000; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 1rem; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: green; +} + +ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: 1px; +} + +html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { + color: orange; +} + +whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + background: #ff0; +} + +ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: none; +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new deleted file mode 100644 index db27d21..0000000 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap.new +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/macros.rs -assertion_line: 172 -input_file: tests/sabry_output/scopes/global_scss.css -snapshot_kind: text ---- -.wZIQboPSLZ8aKu0MjXHwYg.p1{color:#fff;font-size:10px}.wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:#000}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{font-size:1rem}html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark{color:green}ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1{border:1px}html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1{color:orange}whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{background:#ff0}ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1{border:none} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap index e26b0f4..59776f1 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap @@ -1,7 +1,117 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/module_usage_sass.css snapshot_kind: text --- -.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%)} +.n5vGKZlIscA58H8d7ZMOhSw.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { + transform: translateX(10%); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:hover { + transform: translateX(10%); +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap index c24335b..f26df0f 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap @@ -1,7 +1,117 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/module_usage_scss.css snapshot_kind: text --- -.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%)} +.n6ROVrVzYikGtxgKBYy11kA.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:hover { + transform: translateX(10%); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:hover { + transform: translateX(10%); +} 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 index 904488c..ecff4e6 100644 --- 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 @@ -1,7 +1,33 @@ --- source: tests/macros.rs -assertion_line: 183 +assertion_line: 172 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} +.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 index efc723b..9c06115 100644 --- 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 @@ -1,7 +1,33 @@ --- source: tests/macros.rs -assertion_line: 183 +assertion_line: 172 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} +.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__sole_code_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap index 922db8e..2b91afc 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap @@ -1,7 +1,34 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/sole_code_sass.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} +.smfXzGrnTs2kl9jPP0nk6w.fuzz { + background-color: red; + display: block; +} + +.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark { + background-color: #000; + color: #fff; +} + +.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 { + position: relative; + display: grid; + grid-template-areas: "a b c" + "d e f" + "x x x"; + display: block; +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap index a7760eb..7cb4253 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap @@ -1,7 +1,34 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/sole_code_scss.css snapshot_kind: text --- -.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} +.FT5yVVwswyLvNU3dIk0qw.fuzz { + background-color: red; + display: block; +} + +.FT5yVVwswyLvNU3dIk0qw.fuzz-dark { + background-color: #000; + color: #fff; +} + +.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 { + position: relative; + display: grid; + grid-template-areas: "a b c" + "d e f" + "x x x"; + display: block; +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap index 3695b70..5f18c81 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap @@ -1,7 +1,117 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/use_forwarded_sass.css snapshot_kind: text --- -.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%)} +.qK4fsMeZRSTGObSesXXRBA.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:hover { + transform: translateX(10%); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(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 { + transform: scale(2); +} + +.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:hover { + transform: translateX(10%); +} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap index b8adffa..68599c1 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap @@ -1,7 +1,117 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 172 input_file: tests/sabry_output/scopes/use_forwarded_scss.css snapshot_kind: text --- -.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%)} +.FMHIHNH4_QHxbUqdVmS1A.coated { + color: #c6c6c6; + background-color: #0ff; + color: #fff; + background-color: green; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after { + content: "Colored"; + color: green; + background-color: #00f; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:hover { + transform: translateX(10%); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after { + content: "Colored"; + color: #000; + background-color: #00f; +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(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 { + transform: scale(2); +} + +.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover { + transform: translateX(10%); +} From d2a87204b7e41cec3d7e0f757fdd8331fb1d1b5f Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:49:49 +0500 Subject: [PATCH 151/184] chore: allow publish from 'window' for early stages --- release.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.toml b/release.toml index 7667a01..ebe3dfb 100644 --- a/release.toml +++ b/release.toml @@ -1,4 +1,4 @@ -allow-branch = ["master"] +allow-branch = ["master", "window"] sign-commit = true sign-tag = true target = "x86_64-unknown-linux-gnu" From 6f547ce62d4f355639ead738f71b484d6d12f3a4 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:53:43 +0500 Subject: [PATCH 152/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cc8a3c7..2093233 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.2" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.2" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.2" } -sabry_build = {path = "sabry_build", version = "0.0.2" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.3-alpha.1" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.3-alpha.1" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.3-alpha.1" } +sabry_build = {path = "sabry_build", version = "0.0.3-alpha.1" } [workspace.package] -version = "0.0.2" +version = "0.0.3-alpha.1" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 62eab114332ba572de2efd68258bb6254adf147a Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 13 Dec 2024 10:57:29 +0500 Subject: [PATCH 153/184] chore: bump lightningcss --- sabry_intrnl/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 3d2a39e..8d516e3 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -15,7 +15,7 @@ proc-macro2 = {version = "^1.0"} raffia = {version = "^0.9"} regex = {version = "^1.11"} grass = {version = "^0.13"} -lightningcss = {version = "1.0.0-alpha.59"} +lightningcss = {version = "1.0.0-alpha.61"} blake3 = {version = "^1.5"} base64 = {version = "^0.22"} From 866b2a892c79acff3795f13bd97d9819296af155 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Sat, 14 Dec 2024 10:21:41 +0500 Subject: [PATCH 154/184] fix: repeating non-parent selectors --- sabry_procmacro_impl/src/impls/styly.rs | 3 +- tests/assets/repeating-selector.scss | 15 ++++++++++ .../compilation_with_buildy@bundle.css.snap | 30 ++++++++++++++----- ...y@scopes__repeating_selector_scss.css.snap | 30 ++++++++++++++----- 4 files changed, 63 insertions(+), 15 deletions(-) diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index e49a577..7e9d68d 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -112,7 +112,8 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok let scope_members = scope .hashed_selectors .iter() - .unique() + // not pretty sure about the best way to do this + .unique_by(|hs| hs.sel.as_arbitrary().ident.clone()) .filter_map(|hs| { hs.html_ident.clone().map(|html| { let name = match hs.sel { diff --git a/tests/assets/repeating-selector.scss b/tests/assets/repeating-selector.scss index 7cf81f6..3150f9b 100644 --- a/tests/assets/repeating-selector.scss +++ b/tests/assets/repeating-selector.scss @@ -7,6 +7,13 @@ &__blist { list-style: none; } + + &.sub { + margin: 0; + } + .bus & { + padding: 0; + } } .el2 { @@ -21,4 +28,12 @@ background: black; } } + + &.sub { + margin: 0; + } + + .bus { + margin: 0; + } } 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 c8a14ae..af1132e 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -538,34 +538,50 @@ snapshot_kind: text background: #000; } -.YYYksiQMfU3exD720ckMbA.el1 { +.n9m9Me_zRl6xP8NIGObY_A.el1 { color: red; } -.YYYksiQMfU3exD720ckMbA.el1-mob { +.n9m9Me_zRl6xP8NIGObY_A.el1-mob { color: #00f; } -.YYYksiQMfU3exD720ckMbA.el1__blist { +.n9m9Me_zRl6xP8NIGObY_A.el1__blist { list-style: none; } -.YYYksiQMfU3exD720ckMbA.el2 { +.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { + padding: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 { color: #fff; } -.YYYksiQMfU3exD720ckMbA.el2-mob { +.n9m9Me_zRl6xP8NIGObY_A.el2-mob { color: #000; } -.YYYksiQMfU3exD720ckMbA.el2__blist { +.n9m9Me_zRl6xP8NIGObY_A.el2__blist { background: #fff; } -.YYYksiQMfU3exD720ckMbA.el2__blist-mob { +.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { background: #000; } +.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { + margin: 0; +} + .wZIQboPSLZ8aKu0MjXHwYg.p1 { font-size: 10px; color: #fff; 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 index 9c06115..e40637f 100644 --- 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 @@ -4,30 +4,46 @@ assertion_line: 172 input_file: tests/sabry_output/scopes/repeating_selector_scss.css snapshot_kind: text --- -.YYYksiQMfU3exD720ckMbA.el1 { +.n9m9Me_zRl6xP8NIGObY_A.el1 { color: red; } -.YYYksiQMfU3exD720ckMbA.el1-mob { +.n9m9Me_zRl6xP8NIGObY_A.el1-mob { color: #00f; } -.YYYksiQMfU3exD720ckMbA.el1__blist { +.n9m9Me_zRl6xP8NIGObY_A.el1__blist { list-style: none; } -.YYYksiQMfU3exD720ckMbA.el2 { +.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { + padding: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 { color: #fff; } -.YYYksiQMfU3exD720ckMbA.el2-mob { +.n9m9Me_zRl6xP8NIGObY_A.el2-mob { color: #000; } -.YYYksiQMfU3exD720ckMbA.el2__blist { +.n9m9Me_zRl6xP8NIGObY_A.el2__blist { background: #fff; } -.YYYksiQMfU3exD720ckMbA.el2__blist-mob { +.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { background: #000; } + +.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { + margin: 0; +} From b80240b7fd77d4e24d9f1c1c84a24be331588f80 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Sat, 14 Dec 2024 10:25:37 +0500 Subject: [PATCH 155/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2093233..db19f52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ exclude = [ ] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.3-alpha.1" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.3-alpha.1" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.3-alpha.1" } -sabry_build = {path = "sabry_build", version = "0.0.3-alpha.1" } +sabry_intrnl = {path = "sabry_intrnl", version = "0.0.3-alpha.2" } +sabry_procmacro = {path = "sabry_procmacro", version = "0.0.3-alpha.2" } +sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.3-alpha.2" } +sabry_build = {path = "sabry_build", version = "0.0.3-alpha.2" } [workspace.package] -version = "0.0.3-alpha.1" +version = "0.0.3-alpha.2" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 4250bbd50bd12d184865088aea73dac595a1fc0e Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Sat, 14 Dec 2024 10:44:04 +0500 Subject: [PATCH 156/184] fix: improve docs --- README.md | 108 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index ec284c2..be7fb6f 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,7 @@ At first, I'll show how this crate "tastes". With SABRY, its in your power to: -<table> -<tr> -<td> +<hr/> Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with modules, with feature flags, etc. Say "bye" to manual copying, cli-tools and consts. @@ -28,10 +26,7 @@ Write arbitrary SASS/SCSS code and ship it *as a crate* however you please: with sabry::scssy!(tokens {"@mixin colored{color: red;}"}); ``` -</td> -</tr> -<tr> -<td> +<hr/> Get the *(almost)* proper autocompletion for your scope from rust-analyzer @@ -42,10 +37,7 @@ scope::cls1; scope::theid1; ``` -</td> -</tr> -<tr> -<td> +<hr/> Code your SASS in separate files to get proper syntax highlighting, or do sass-in-the-rust to keep things in one place @@ -54,22 +46,18 @@ sabry::styly!(component {".btn {color: green;}"}); sabry::styly!(extras "tests/assets/mixin-module.scss"); ``` -</td> -</tr> -<tr> -<td> +<hr/> Depend on styles with cargo, at build time, which brings all the rusty sweeties in: versions, updates, cratesio, local registries, workspaces, etc. ```toml -[build-dependencies] -tgk_brandstyle = {version = "0.0.1", features = ["utils"]} +[build-dependencies.your_styles] +registry = "your_registry_isnt_that_cool" +version = "^0.1" +features = ["darkmode", "mobile"] ``` -</td> -</tr> -<tr> -<td> +<hr/> `@use` your style-crates in sass code *naturally* @@ -80,10 +68,7 @@ sabry::styly!(breadbadge {" "}); ``` -</td> -</tr> -<tr> -<td> +<hr/> Keep things as private and modular as you wish @@ -100,10 +85,7 @@ sabry::styly!(dogs {"#howl {border: none;}"}); } ``` -</td> -</tr> -<tr> -<td> +<hr/> Compile all the sweet SASS/SCSS into the optimized CSS bundle, ship it in CSS shunks or even include the compiled style into the binary @@ -112,9 +94,7 @@ sabry::styly!(cssbundle {".c1 {color: white;}"}); sabry::styly!(const binary {".c2 {color: black;}"}); ``` -</td> -</tr> -</table> +<hr/> Sabry will gladly: @@ -160,7 +140,7 @@ scssy!(styles {" } "}); ``` -*\* Unlike most of other crates that do sass-in-the-rust, sabry currently does not allow unquoted sass/scss. You still have to write it in a string-quotes. Unquoted sass/scss is reserved for the future, where we shall introduce variable injection.* +*\* Unlike most of other crates that do sass-in-the-rust, sabry currently does not allow unquoted sass/scss. You still have to write it in a string-quotes. Unquoted sass/scss is reserved for the future, where, hopefully, I'll find more exciting usage for it. In the meantime it does look like Zed, for example, still highlights your code (:* Now you can build and see two ready for export macros: `mixins!` and `styles!`. These are usefull on their own, as invocation of `mixins!()` or `styles!()` - both shall give you the code literal. @@ -273,6 +253,68 @@ detected by sabry. for sabry, so you can use styles from relative paths `styly!(const comp "./style.scss")` - Which will give you an error from rust-analyzer wether file exists or not. However, if the path is correct, it will build fine. +<details> +<summary>I'd suggest something like this</summary> + +```rust,ignore +// lib.rs +pub mod utils; +pub mod form; + +pub const fn css() -> &'static str { + concatcp!(utils::css(), form::css()) +} +``` + +```rust,ignore +// utils.rs +use sabry::styly; + +styly!(pub const scope:scss {" + .whatever { + &__code {} + &[you-please] {} + } +"}); + +styly!(pub const another:scss {" + .whatever { + &__code {} + &[you-please] {} + } +"}); + +pub const fn css() -> &'static str { + concatcp!(SCOPE, ANOTHER) +} +``` + +```rust,ignore +// form.rs +use sabry::styly; + +styly!(pub const scope:scss {" + .whatever { + &__code {} + &[you-please] {} + } +"}); + +styly!(pub const another:scss {" + .whatever { + &__code {} + &[you-please] {} + } +"}); + +pub const fn css() -> &'static str { + concatcp!(SCOPE, ANOTHER) +} +``` +So I'd say - do the const function back-propogation and let the consumer decide how to include the CSS of the component crate. + +</details> + ### Leptos specials With [leptos](https://github.com/leptos-rs/leptos) framework you can do the trick to apply some class to most of HtmlElements for the entire component/island: From da9c34ffe543339d173632ac7e6269f88ca4e0b5 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Sat, 14 Dec 2024 10:47:55 +0500 Subject: [PATCH 157/184] fix: improve docs --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index be7fb6f..e6dbb59 100644 --- a/README.md +++ b/README.md @@ -372,8 +372,8 @@ fn component() -> impl IntoView { "Head" <img src="whatever"/> </h1> - <ul class=scope::breadcumbs> - <li class=scope::___item(scope::breadcumbs)> + <ul class="breadcumbs"> + <li class="breadcumbs__item"> "Home page" </li> </ul> @@ -385,6 +385,7 @@ That will perform *much* better: - All scope members - like `scope::breadcumbs` - wont contain repeating scope hash, just the original class/id selector - So instead of scope members (which [aren't](https://github.com/yiffyrusdev/sabry/issues/2) autocompleted for sass-in-the-rust yet) you could just write bare selectors, as you do, for example, with svelte: `<li class="breadcumbs__item">` + - You'll still have the rusty mod generated: its just the `scope::breadcumbs` is the `"breadcumbs"` without the hash - You will not encounter [the catch](#scoping) with nested tagname selectors Also, this isn't really exclusive leptos-supporting feature. It just changes scoping behavour. From 1fa5511f63e840b790b82cef758a422827d24736 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Sat, 14 Dec 2024 10:52:47 +0500 Subject: [PATCH 158/184] fix: improve docs --- README.md | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index e6dbb59..768863f 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,11 @@ \* sabry isn't "syntactically awesome", it refers to SASS abbr expansion. -> **Project status** - early, good enough for my team's non-critical "for-fun" pre-production, on demand. WIP features have no ETA. I'm pretty happy with ergonomics and taste of the crate, and I'll do my best to keep DX the way it is between minor versions - but there's no guarantee on backwards-compatibility and no refunds if something breaks. +> **Project status** - early, my team uses it now and again in production, and the most of features/fixes do come on demand. I'm pretty happy with ergonomics and taste of the crate, and I'll do my best to keep DX the way it is between minor versions - but there's no guarantee on backwards-compatibility and no refunds if something breaks. > > "master" branch is what's currently on crates.io > -> each version ever been on crates.io (except the latest release) is available in "r_x.x.x" branch +> each version ever been on crates.io (except the latest release) is available in "vX.X.X" branch > > the latest-trashy state is in the "window" branch @@ -729,23 +729,12 @@ Not any valid CSS selector is a valid rust identifier. In general this section s *(sorted by my own priority)*, "dones" are excluded - [x] Somehow achieve the autocompletion for scopes. The problem is explained in details [here](https://github.com/yiffyrusdev/sabry/issues/2) - - [ ] some weird unrelated stuff I can see in autocompletion -- [ ] Crates of styled components - currently the only way to create them seems to be const styly. - - [ ] CSS support - - [x] Allow relative path selection (with 'nightly' feature on nightly rust) - - [ ] Somehow get rid of false-positives AND retain proper autocompletion + - [x] some weird unrelated stuff I can see in autocompletion (still investigating btw) +- [ ] Support for direct CSS syntax - [ ] Currently the crate causes "dependency inheritance" infection. We cant get rid of it, however should be doable to at least get rid of flag inheritance -- [ ] Use sass-in-rust without quoted styles for variable injection: - ```rust, ignore - let myvar = "content"; - styly!(scope { - .c::after { - content: somehow(myvar); - } - }) - ``` -- [ ] There are some strange parsing errors, seems like a bug, however very hard to reproduce. Have to investigate. Maybe do more tests. -- [ ] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it. +- [ ] Experience with cargo-leptos is fine, and we do use it, however its a bit "raughy". Need to do something about it: + - [ ] We have to save file twice with cargo leptos for changed styles to take effect + - [ ] Seems like turning on the "hashing" with leptos requires a hard-restart of cargo-leptos ## Contributions From 9d148cbb9bde9ece79b855d93de3e1386e3b3b51 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Wed, 9 Apr 2025 05:55:41 +0500 Subject: [PATCH 159/184] weaken & bump versions: = weaken = * regex * thiserror * cfg-if * serde * syn * quote * proc-macro2 * walkdir = bump = * thiserror -> 2 * lightningcss -> alpha.65 * itertools -> 0.14 --- Cargo.toml | 50 +++++++++++---------------------- sabry_build/Cargo.toml | 12 ++++---- sabry_intrnl/Cargo.toml | 24 ++++++++-------- sabry_procmacro/Cargo.toml | 4 +-- sabry_procmacro_impl/Cargo.toml | 13 ++++----- 5 files changed, 42 insertions(+), 61 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index db19f52..9e1d672 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,22 +1,16 @@ [workspace] resolver = "2" -members = [ - "sabry_procmacro", - "sabry_procmacro_impl", - "sabry_intrnl", -] -exclude = [ - "examples" -] +members = ["sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl"] +exclude = ["examples"] [workspace.dependencies] -sabry_intrnl = {path = "sabry_intrnl", version = "0.0.3-alpha.2" } -sabry_procmacro = {path = "sabry_procmacro", version = "0.0.3-alpha.2" } -sabry_procmacro_impl = {path = "sabry_procmacro_impl", version = "0.0.3-alpha.2" } -sabry_build = {path = "sabry_build", version = "0.0.3-alpha.2" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.3" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.3" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.3" } +sabry_build = { path = "sabry_build", version = "0.0.3" } [workspace.package] -version = "0.0.3-alpha.2" +version = "0.0.3" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] @@ -37,31 +31,21 @@ license.workspace = true publish.workspace = true [dependencies] -sabry_procmacro = {workspace = true, optional = true} -sabry_build = {workspace = true, optional = true} -sabry_intrnl = {workspace = true} +sabry_procmacro = { workspace = true, optional = true } +sabry_build = { workspace = true, optional = true } +sabry_intrnl = { workspace = true } [dev-dependencies] -leptos = {version = "0.7.0-gamma3"} -insta = {version = "^1.41", features = ["glob"]} +leptos = { version = "0.7.0-gamma3" } +insta = { version = "^1.41", features = ["glob"] } [features] default = ["procmacro"] -lepty-scoping = [ - "sabry_intrnl/lepty-scoping" -] -procmacro = [ - "dep:sabry_procmacro" -] -build = [ - "dep:sabry_build" -] -net-files = [ - "sabry_build/net-files" -] -nightly = [ - "sabry_procmacro?/nightly" -] +lepty-scoping = ["sabry_intrnl/lepty-scoping"] +procmacro = ["dep:sabry_procmacro"] +build = ["dep:sabry_build"] +net-files = ["sabry_build/net-files"] +nightly = ["sabry_procmacro?/nightly"] internals = [] [package.metadata.docs.rs] diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index 400a3a0..ce81bbc 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -9,13 +9,13 @@ authors.workspace = true license.workspace = true [dependencies] -sabry_intrnl = {workspace = true} -sabry_procmacro_impl = {workspace = true} +sabry_intrnl = { workspace = true } +sabry_procmacro_impl = { workspace = true } -syn = {version = "^2.0", features = ["visit", "derive", "parsing", "full"]} -proc-macro2 = {version = "^1.0", features = ["span-locations"]} -thiserror = {version = "^1.0"} -walkdir = {version = "^2.5"} +syn = { version = "^2", features = ["visit", "derive", "parsing", "full"] } +proc-macro2 = { version = "^1", features = ["span-locations"] } +thiserror = { version = "^2" } +walkdir = { version = "^2" } [features] net-files = [] diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 8d516e3..85d7a9f 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -9,20 +9,18 @@ authors.workspace = true license.workspace = true [dependencies] -syn = {version = "^2.0"} -quote = {version = "^1.0"} -proc-macro2 = {version = "^1.0"} -raffia = {version = "^0.9"} -regex = {version = "^1.11"} -grass = {version = "^0.13"} -lightningcss = {version = "1.0.0-alpha.61"} -blake3 = {version = "^1.5"} -base64 = {version = "^0.22"} +syn = { version = "^2" } +raffia = { version = "^0.9" } +regex = { version = "^1" } +grass = { version = "^0.13" } +lightningcss = { version = "1.0.0-alpha.65" } +blake3 = { version = "^1.5" } +base64 = { version = "^0.22" } -thiserror = {version = "^1.0"} -serde = {version = "^1.0", features = ["derive"]} -toml = {version = "^0.8"} -cfg-if = {version = "^1.0"} +thiserror = { version = "^2" } +serde = { version = "^1", features = ["derive"] } +toml = { version = "^0.8" } +cfg-if = { version = "^1" } [features] lepty-scoping = [] diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index cb2c1bd..fb95447 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -12,8 +12,8 @@ license.workspace = true proc-macro = true [dependencies] -sabry_procmacro_impl = {workspace = true} -cfg-if = {version = "^1.0"} +sabry_procmacro_impl = { workspace = true } +cfg-if = { version = "^1" } [features] nightly = [] diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index e4a2b50..e121b3f 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -9,14 +9,13 @@ authors.workspace = true license.workspace = true [dependencies] -sabry_intrnl = {workspace = true} +sabry_intrnl = { workspace = true } -syn = {version = "^2.0", features = ["parsing"]} -quote = {version = "^1.0"} -proc-macro2 = {version = "^1.0", features = ["span-locations"]} -raffia = {version = "^0.9"} -regex = {version = "^1.11"} -itertools = {version = "^0.13"} +syn = { version = "^2", features = ["parsing"] } +quote = { version = "^1" } +proc-macro2 = { version = "^1", features = ["span-locations"] } +regex = { version = "^1" } +itertools = { version = "^0.14" } [features] nightly = [] From cc6a844e0c8f64d29039f2b5d13284c9f55f72d6 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Wed, 9 Apr 2025 05:58:50 +0500 Subject: [PATCH 160/184] fix: verify test snapshot --- .../compilation_with_buildy@bundle.css.snap | 211 +++++++++--------- 1 file changed, 105 insertions(+), 106 deletions(-) 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 af1132e..9b70a49 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -2,8 +2,40 @@ source: tests/macros.rs assertion_line: 172 input_file: tests/sabry_output/bundle.css -snapshot_kind: text --- +.wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 10px; + color: #fff; +} + +.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: #000; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + font-size: 1rem; +} + +html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { + color: green; +} + +ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: 1px; +} + +html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { + color: orange; +} + +whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + background: #ff0; +} + +ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { + border: none; +} + .n5vGKZlIscA58H8d7ZMOhSw.coated { color: #c6c6c6; background-color: #0ff; @@ -228,6 +260,78 @@ snapshot_kind: text transform: translateX(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; +} + +.n9m9Me_zRl6xP8NIGObY_A.el1 { + color: red; +} + +.n9m9Me_zRl6xP8NIGObY_A.el1-mob { + color: #00f; +} + +.n9m9Me_zRl6xP8NIGObY_A.el1__blist { + list-style: none; +} + +.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { + padding: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 { + color: #fff; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2-mob { + color: #000; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2__blist { + background: #fff; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { + background: #000; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { + margin: 0; +} + +.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { + margin: 0; +} + .smfXzGrnTs2kl9jPP0nk6w.fuzz { background-color: red; display: block; @@ -509,108 +613,3 @@ snapshot_kind: text .FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover { transform: translateX(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; -} - -.n9m9Me_zRl6xP8NIGObY_A.el1 { - color: red; -} - -.n9m9Me_zRl6xP8NIGObY_A.el1-mob { - color: #00f; -} - -.n9m9Me_zRl6xP8NIGObY_A.el1__blist { - list-style: none; -} - -.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { - margin: 0; -} - -.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { - padding: 0; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2 { - color: #fff; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2-mob { - color: #000; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2__blist { - background: #fff; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { - background: #000; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { - margin: 0; -} - -.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { - margin: 0; -} - -.wZIQboPSLZ8aKu0MjXHwYg.p1 { - font-size: 10px; - color: #fff; -} - -.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { - color: #000; -} - -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { - font-size: 1rem; -} - -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { - color: green; -} - -ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { - border: 1px; -} - -html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { - color: orange; -} - -whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { - background: #ff0; -} - -ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { - border: none; -} From 6d10dd02732f1d6428841183f6786525ea493f0f Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Wed, 9 Apr 2025 06:00:59 +0500 Subject: [PATCH 161/184] chore: Release --- Cargo.toml | 10 +++++----- README.md | 12 ++++++------ sabry_build/README.md | 2 +- sabry_intrnl/README.md | 2 +- sabry_procmacro/README.md | 2 +- sabry_procmacro_impl/README.md | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9e1d672..7b79f09 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,13 @@ members = ["sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl"] exclude = ["examples"] [workspace.dependencies] -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.3" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.3" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.3" } -sabry_build = { path = "sabry_build", version = "0.0.3" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.4" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.4" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.4" } +sabry_build = { path = "sabry_build", version = "0.0.4" } [workspace.package] -version = "0.0.3" +version = "0.0.4" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] diff --git a/README.md b/README.md index 768863f..885c0d0 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ The only need is the dependency #Cargo.toml [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` And a proc-macro ```rust @@ -154,7 +154,7 @@ Depend on sabry # Cargo.toml [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` And create a style scope wherever you want: ```rust @@ -194,10 +194,10 @@ To be able to compile all styles sabry also needs the *build* feature flag: # Cargo.toml [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} [build-dependencies] -sabry = {version = "0.0.2", features = ["build"]} +sabry = {version = "0.0.4", features = ["build"]} ``` > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. @@ -338,10 +338,10 @@ So, if you're on leptos, and don't mind to take this approach, I'd highly recomm # Cargo.toml [dependencies] -sabry = {version = "0.0.2", features = ["lepty-scoping"]} +sabry = {version = "0.0.4", features = ["lepty-scoping"]} [build-dependencies] -sabry = {version = "0.0.2", features = ["build", "lepty-scoping"]} +sabry = {version = "0.0.4", features = ["build", "lepty-scoping"]} ``` ```rust diff --git a/sabry_build/README.md b/sabry_build/README.md index 6171d6f..217437d 100644 --- a/sabry_build/README.md +++ b/sabry_build/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md index c67c372..8e5b154 100644 --- a/sabry_intrnl/README.md +++ b/sabry_intrnl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md index 93779e0..02c5683 100644 --- a/sabry_procmacro/README.md +++ b/sabry_procmacro/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md index e442bb3..b0a825c 100644 --- a/sabry_procmacro_impl/README.md +++ b/sabry_procmacro_impl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.2"} +sabry = {version = "0.0.4"} ``` From 91fb1260a2a51846ebeb0354d63b52fe767158de Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Wed, 30 Apr 2025 17:36:24 +0500 Subject: [PATCH 162/184] breaking: sync with latest proc_macro function signatures on nightly. Shall break with nightly before 2025-04-(~28). --- sabry_procmacro/src/lib.rs | 12 ++++++++++-- sabry_procmacro_impl/Cargo.toml | 1 - 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index 71136a5..98f056a 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -1,6 +1,8 @@ #![doc = include_str!("../README.md")] #![cfg_attr(feature = "nightly", feature(proc_macro_span))] +use std::str::FromStr; + use cfg_if::cfg_if; use proc_macro::TokenStream; use sabry_procmacro_impl::impls::{ @@ -39,7 +41,10 @@ pub fn scssy(input: TokenStream) -> TokenStream { cfg_if! { if #[cfg(feature = "nightly")] { use proc_macro::Span; - let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); + use std::path::PathBuf; + let source_path = Some(PathBuf::from_str( + &Span::call_site().file()).expect("&str to be Infallible converted into PathBuf") + ); } else { let source_path = None; } @@ -109,7 +114,10 @@ pub fn styly(input: TokenStream) -> TokenStream { cfg_if! { if #[cfg(feature = "nightly")] { use proc_macro::Span; - let source_path = Span::call_site().source_file().path().parent().map(|p| p.to_owned()); + use std::path::PathBuf; + let source_path = Some(PathBuf::from_str( + &Span::call_site().file()).expect("&str to be Infallible converted into PathBuf") + ); } else { let source_path = None; } diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index e121b3f..8e468f6 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -10,7 +10,6 @@ license.workspace = true [dependencies] sabry_intrnl = { workspace = true } - syn = { version = "^2", features = ["parsing"] } quote = { version = "^1" } proc-macro2 = { version = "^1", features = ["span-locations"] } From aa0f426ecbb5ed270827e7634637ca369ecd72aa Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Wed, 30 Apr 2025 17:37:43 +0500 Subject: [PATCH 163/184] chore: Release --- Cargo.toml | 10 +++++----- README.md | 12 ++++++------ sabry_build/README.md | 2 +- sabry_intrnl/README.md | 2 +- sabry_procmacro/README.md | 2 +- sabry_procmacro_impl/README.md | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7b79f09..595e861 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,13 @@ members = ["sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl"] exclude = ["examples"] [workspace.dependencies] -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.4" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.4" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.4" } -sabry_build = { path = "sabry_build", version = "0.0.4" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.5" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.5" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.5" } +sabry_build = { path = "sabry_build", version = "0.0.5" } [workspace.package] -version = "0.0.4" +version = "0.0.5" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] diff --git a/README.md b/README.md index 885c0d0..443dbec 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ The only need is the dependency #Cargo.toml [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` And a proc-macro ```rust @@ -154,7 +154,7 @@ Depend on sabry # Cargo.toml [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` And create a style scope wherever you want: ```rust @@ -194,10 +194,10 @@ To be able to compile all styles sabry also needs the *build* feature flag: # Cargo.toml [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} [build-dependencies] -sabry = {version = "0.0.4", features = ["build"]} +sabry = {version = "0.0.5", features = ["build"]} ``` > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. @@ -338,10 +338,10 @@ So, if you're on leptos, and don't mind to take this approach, I'd highly recomm # Cargo.toml [dependencies] -sabry = {version = "0.0.4", features = ["lepty-scoping"]} +sabry = {version = "0.0.5", features = ["lepty-scoping"]} [build-dependencies] -sabry = {version = "0.0.4", features = ["build", "lepty-scoping"]} +sabry = {version = "0.0.5", features = ["build", "lepty-scoping"]} ``` ```rust diff --git a/sabry_build/README.md b/sabry_build/README.md index 217437d..4f8f220 100644 --- a/sabry_build/README.md +++ b/sabry_build/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md index 8e5b154..2e53d53 100644 --- a/sabry_intrnl/README.md +++ b/sabry_intrnl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md index 02c5683..0944f74 100644 --- a/sabry_procmacro/README.md +++ b/sabry_procmacro/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md index b0a825c..d92d7ed 100644 --- a/sabry_procmacro_impl/README.md +++ b/sabry_procmacro_impl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.4"} +sabry = {version = "0.0.5"} ``` From 425933092562dae56bac9c8fc90e6f1985188675 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Thu, 8 May 2025 19:42:06 +0500 Subject: [PATCH 164/184] breaking: gate 'styly!(const scope...' behind the const-scoping feature.\nFor some reason it did only become a problem recently, but it appears that having lightningcss/grass unconditionally will break WASM builds by having getrandom dependency --- Cargo.toml | 25 +++++++++ README.md | 4 +- examples/leptos-components/Cargo.toml | 16 +++--- sabry_build/Cargo.toml | 16 +++--- sabry_intrnl/Cargo.toml | 31 +++++++---- sabry_intrnl/src/compiler/mod.rs | 27 +++++----- sabry_intrnl/src/config/mod.rs | 1 + sabry_intrnl/src/scoper/hash.rs | 13 +++-- sabry_intrnl/src/scoper/mod.rs | 16 +++--- sabry_intrnl/src/syntax/ostrta.rs | 2 + sabry_procmacro/Cargo.toml | 5 +- sabry_procmacro_impl/Cargo.toml | 17 +++--- sabry_procmacro_impl/src/impls/scssy.rs | 2 +- sabry_procmacro_impl/src/impls/styly.rs | 72 ++++++++++++++----------- 14 files changed, 150 insertions(+), 97 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 595e861..8742652 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,10 +4,33 @@ members = ["sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl"] exclude = ["examples"] [workspace.dependencies] +## Workspace sabry_intrnl = { path = "sabry_intrnl", version = "0.0.5" } sabry_procmacro = { path = "sabry_procmacro", version = "0.0.5" } sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.5" } sabry_build = { path = "sabry_build", version = "0.0.5" } +## Package +## Package +lightningcss.version = "1.0.0-alpha.65" +lightningcss.default-features = false +grass.version = "^0.13" +grass.default-features = false +raffia.version = "^0.9" +#/ +serde.version = "^1" +toml.version = "^0.8" +blake3.version = "^1" +base64.version = "^0.22" +regex.version = "^1" +#/ +itertools.version = "^0.14" +walkdir.version = "^2" +#/ +cfg-if.version = "^1" +thiserror.version = "^2" +proc-macro2.version = "^1" +quote.version = "^1" +syn.version = "^2" [workspace.package] version = "0.0.5" @@ -31,6 +54,7 @@ license.workspace = true publish.workspace = true [dependencies] +## Workspace sabry_procmacro = { workspace = true, optional = true } sabry_build = { workspace = true, optional = true } sabry_intrnl = { workspace = true } @@ -42,6 +66,7 @@ insta = { version = "^1.41", features = ["glob"] } [features] default = ["procmacro"] lepty-scoping = ["sabry_intrnl/lepty-scoping"] +const-scoping = ["sabry_procmacro?/const-compile"] procmacro = ["dep:sabry_procmacro"] build = ["dep:sabry_build"] net-files = ["sabry_build/net-files"] diff --git a/README.md b/README.md index 443dbec..857ad5e 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,6 @@ > > "master" branch is what's currently on crates.io > -> each version ever been on crates.io (except the latest release) is available in "vX.X.X" branch -> -> the latest-trashy state is in the "window" branch [![Crates.io](https://img.shields.io/crates/v/sabry.svg)](https://crates.io/crates/sabry) [![Docs.rs](https://img.shields.io/docsrs/sabry/latest.svg)](https://docs.rs/sabry) @@ -586,6 +583,7 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: ```rust +// Requires `const-scoping` feature sabry::styly!(const scope "tests/assets/mixin-module.scss"); ``` Which results in following: diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml index 4b9f858..9e8b6d6 100644 --- a/examples/leptos-components/Cargo.toml +++ b/examples/leptos-components/Cargo.toml @@ -13,19 +13,19 @@ leptos = { version = "^0.7" } leptos_meta = { version = "^0.7" } leptos_router = { version = "^0.7" } -sabry = {path = "../../", features = ["lepty-scoping"]} +sabry = { path = "../../", features = ["lepty-scoping", "const-scoping"] } [build-dependencies] -sabry = {path = "../../", features = ["build", "lepty-scoping"]} -define-styles = {path = "../define-styles"} +sabry = { path = "../../", features = [ + "build", + "lepty-scoping", + "const-scoping", +] } +define-styles = { path = "../define-styles" } [features] hydrate = ["leptos/hydrate"] -ssr = [ - "leptos/ssr", - "leptos_meta/ssr", - "leptos_router/ssr", -] +ssr = ["leptos/ssr", "leptos_meta/ssr", "leptos_router/ssr"] [package.metadata.sabry] css.minify = true diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index ce81bbc..dfa13e8 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -9,13 +9,17 @@ authors.workspace = true license.workspace = true [dependencies] -sabry_intrnl = { workspace = true } -sabry_procmacro_impl = { workspace = true } +sabry_intrnl.workspace = true +sabry_intrnl.features = ["compile", "scope"] +sabry_procmacro_impl.workspace = true +sabry_procmacro_impl.features = ["const-compile"] -syn = { version = "^2", features = ["visit", "derive", "parsing", "full"] } -proc-macro2 = { version = "^1", features = ["span-locations"] } -thiserror = { version = "^2" } -walkdir = { version = "^2" } +syn.workspace = true +syn.features = ["visit", "derive", "parsing", "full"] +proc-macro2.workspace = true +proc-macro2.features = ["span-locations"] +thiserror.workspace = true +walkdir.workspace = true [features] net-files = [] diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 85d7a9f..b39c615 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -9,21 +9,30 @@ authors.workspace = true license.workspace = true [dependencies] -syn = { version = "^2" } -raffia = { version = "^0.9" } -regex = { version = "^1" } -grass = { version = "^0.13" } -lightningcss = { version = "1.0.0-alpha.65" } -blake3 = { version = "^1.5" } -base64 = { version = "^0.22" } +syn.workspace = true +raffia.workspace = true +regex.workspace = true +regex.optional = true +grass.workspace = true +grass.optional = true +lightningcss.workspace = true +lightningcss.features = ["grid"] +lightningcss.optional = true +blake3.workspace = true +blake3.optional = true +base64.workspace = true +base64.optional = true -thiserror = { version = "^2" } -serde = { version = "^1", features = ["derive"] } -toml = { version = "^0.8" } -cfg-if = { version = "^1" } +thiserror.workspace = true +serde.workspace = true +serde.features = ["derive"] +toml.workspace = true +cfg-if.workspace = true [features] lepty-scoping = [] +scope = ["dep:blake3", "dep:base64", "dep:regex"] +compile = ["dep:lightningcss", "dep:grass"] [package.metadata.docs.rs] all-features = true diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index 374d527..adc398f 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -1,16 +1,8 @@ -use std::fmt::Debug; - -use lightningcss::{ - error::{MinifyErrorKind, PrinterErrorKind}, - printer::PrinterOptions, - stylesheet::MinifyOptions, - targets::Targets, -}; - -use crate::{config::SabryConfig, syntax::ostrta::OneSyntaxToRuleThemAll}; +use crate::config::SabryConfig; /// Convenience wrapper on Grass and Lightningcss pub struct CompilerAdapter { + #[allow(dead_code)] // without 'compile' feature, still want to set this config: SabryConfig, } @@ -21,9 +13,10 @@ impl CompilerAdapter { /// Compile given SASS/SCSS into CSS /// with respect to self.config + #[cfg(feature = "compile")] pub fn compile_module( &self, - syntax: OneSyntaxToRuleThemAll, + syntax: crate::syntax::ostrta::OneSyntaxToRuleThemAll, code: &str, ) -> Result<String, SabryCompilerError> { let options = grass::Options::from(&self.config).input_syntax(syntax.into()); @@ -35,7 +28,10 @@ impl CompilerAdapter { /// Perform lightningcss transformations on given css /// with respect to self.config.css.minify on minification + #[cfg(feature = "compile")] pub fn lightningcss(&self, css: &str) -> Result<String, SabryCompilerError> { + use lightningcss::{printer::PrinterOptions, stylesheet::MinifyOptions, targets::Targets}; + let mut lightsheet = match lightningcss::stylesheet::StyleSheet::parse( css, lightningcss::stylesheet::ParserOptions::default(), @@ -81,6 +77,7 @@ impl CompilerAdapter { } } +#[cfg(feature = "compile")] impl From<&SabryConfig> for grass::Options<'_> { fn from(config: &SabryConfig) -> Self { let mut options = grass::Options::default(); @@ -95,14 +92,15 @@ impl From<&SabryConfig> for grass::Options<'_> { } } +#[cfg(feature = "compile")] #[derive(thiserror::Error)] pub enum SabryCompilerError { #[error("Could not compile into CSS with grass")] GrassCompile(#[from] Box<grass::Error>), #[error("Could not print compiled CSS with lightningcss")] - LightPrint(#[from] lightningcss::error::Error<PrinterErrorKind>), + LightPrint(#[from] lightningcss::error::Error<lightningcss::error::PrinterErrorKind>), #[error("Could not minify CSS with lightningcss")] - LightMinify(#[from] lightningcss::error::Error<MinifyErrorKind>), + LightMinify(#[from] lightningcss::error::Error<lightningcss::error::MinifyErrorKind>), #[error("Could not parse CSS with lightningcss")] LightParse { kind: String, @@ -110,7 +108,8 @@ pub enum SabryCompilerError { }, } -impl Debug for SabryCompilerError { +#[cfg(feature = "compile")] +impl std::fmt::Debug for SabryCompilerError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let explain = match self { Self::LightPrint(e) => format!( diff --git a/sabry_intrnl/src/config/mod.rs b/sabry_intrnl/src/config/mod.rs index 7fdfa13..dfa13bc 100644 --- a/sabry_intrnl/src/config/mod.rs +++ b/sabry_intrnl/src/config/mod.rs @@ -199,6 +199,7 @@ impl SabryLightTargets { } } +#[cfg(feature = "compile")] impl From<SabryLightTargets> for lightningcss::targets::Browsers { fn from(value: SabryLightTargets) -> Self { Self { diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index 21a875c..df21766 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -1,15 +1,14 @@ -use base64::Engine; - -use crate::config::SabryHashConfig; - -use super::{apply_basic_rusty_member_gen_rules, ArbitraryScope}; - /// Convenience wrapper for String-being-a-hash #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ScopeHash(String); impl ScopeHash { - pub fn new(scope: &ArbitraryScope, config: &SabryHashConfig) -> Self { + #[cfg(feature = "scope")] + pub fn new(scope: &super::ArbitraryScope, config: &crate::config::SabryHashConfig) -> Self { + use base64::Engine; + + use crate::scoper::apply_basic_rusty_member_gen_rules; + let mut hasher = blake3::Hasher::new(); if config.use_scope_name { diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 24696d3..408b417 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -3,12 +3,8 @@ use std::fmt::Debug; use cfg_if::cfg_if; use hash::ScopeHash; use raffia::{Span, Spanned}; -use regex::Regex; -use crate::{ - config::SabryHashConfig, - syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}, -}; +use crate::syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}; pub mod hash; @@ -56,7 +52,11 @@ impl<'s> ArbitraryScope<'s> { /// Consume arbitrary scope and create a [HashedScope] in its basis /// /// This function calls [HashedScope::new] under the hood - pub fn hashed(self, config: &SabryHashConfig) -> Result<HashedScope<'s>, ScopeError> { + #[cfg(feature = "scope")] + pub fn hashed( + self, + config: &crate::config::SabryHashConfig, + ) -> Result<HashedScope<'s>, ScopeError> { let hash = ScopeHash::new(&self, config); HashedScope::new(hash, self) } @@ -332,6 +332,7 @@ impl ScopedSelector { } /// Generate rusty member ident based on selector type and CSS ident + #[cfg(feature = "scope")] pub fn gen_rusty_ident(&self) -> Option<syn::Ident> { let arb = &self.as_arbitrary().ident; let basic = apply_basic_rusty_member_gen_rules(arb); @@ -401,8 +402,9 @@ impl ScopedSelector { } } +#[cfg(feature = "scope")] pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { - let omit_regex = Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") + let omit_regex = regex::Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") .expect("BUG: can not build omition regex for rusty member generation"); // omit forbidden chars diff --git a/sabry_intrnl/src/syntax/ostrta.rs b/sabry_intrnl/src/syntax/ostrta.rs index 6dd4f69..8d6826c 100644 --- a/sabry_intrnl/src/syntax/ostrta.rs +++ b/sabry_intrnl/src/syntax/ostrta.rs @@ -34,6 +34,7 @@ impl TryFrom<raffia::Syntax> for OneSyntaxToRuleThemAll { } } +#[cfg(feature = "compile")] impl TryFrom<grass::InputSyntax> for OneSyntaxToRuleThemAll { type Error = (); fn try_from(value: grass::InputSyntax) -> Result<Self, Self::Error> { @@ -54,6 +55,7 @@ impl From<OneSyntaxToRuleThemAll> for raffia::Syntax { } } +#[cfg(feature = "compile")] impl From<OneSyntaxToRuleThemAll> for grass::InputSyntax { fn from(value: OneSyntaxToRuleThemAll) -> Self { match value { diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index fb95447..12758de 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -12,11 +12,12 @@ license.workspace = true proc-macro = true [dependencies] -sabry_procmacro_impl = { workspace = true } -cfg-if = { version = "^1" } +sabry_procmacro_impl.workspace = true +cfg-if.workspace = true [features] nightly = [] +const-compile = ["sabry_procmacro_impl/const-compile"] [package.metadata.docs.rs] all-features = true diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index 8e468f6..ae8189a 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -9,15 +9,20 @@ authors.workspace = true license.workspace = true [dependencies] -sabry_intrnl = { workspace = true } -syn = { version = "^2", features = ["parsing"] } -quote = { version = "^1" } -proc-macro2 = { version = "^1", features = ["span-locations"] } -regex = { version = "^1" } -itertools = { version = "^0.14" } +sabry_intrnl.workspace = true +sabry_intrnl.features = ["scope"] +syn.workspace = true +syn.features = ["parsing"] +quote.workspace = true +proc-macro2.workspace = true +proc-macro2.features = ["span-locations"] +regex.workspace = true +itertools.workspace = true +cfg-if.workspace = true [features] nightly = [] +const-compile = ["sabry_intrnl/compile"] [package.metadata.docs.rs] all-features = true diff --git a/sabry_procmacro_impl/src/impls/scssy.rs b/sabry_procmacro_impl/src/impls/scssy.rs index 0684b70..ddbee04 100644 --- a/sabry_procmacro_impl/src/impls/scssy.rs +++ b/sabry_procmacro_impl/src/impls/scssy.rs @@ -36,7 +36,7 @@ pub fn scssy_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok } let sourcesass = code.to_string(); - let macro_doc = format!("Arbitrary {:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `buildy` at build time", syntax); + let macro_doc = format!("Arbitrary {syntax:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `buildy` at build time"); quote! { #[doc = #macro_doc] diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 7e9d68d..a0a7e23 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -1,10 +1,10 @@ use std::path::PathBuf; +use cfg_if::cfg_if; use itertools::Itertools; use proc_macro2::{Span, TokenStream}; use quote::quote; use sabry_intrnl::{ - compiler::CompilerAdapter, config::SabryConfig, scoper::{apply_basic_rusty_member_gen_rules, ArbitraryScope, ScopedSelector}, }; @@ -38,10 +38,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok Err(e) => { return syn::Error::new( Span::call_site(), - format!( - "Could not read sabry configuration required by this macro: {:?}", - e - ), + format!("Could not read sabry configuration required by this macro: {e:?}",), ) .to_compile_error() } @@ -63,7 +60,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok Err(e) => { return syn::Error::new( Span::call_site(), - format!("Could not generate scope: {:?}", e), + format!("Could not generate scope: {e:?}"), ) .to_compile_error() } @@ -127,7 +124,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok }) }) .map(|(name, ident, html, css)| { - let docs = format!("'{:?}' {}. CSS selector '{}'", ident, name, css); + let docs = format!("'{ident:?}' {name}. CSS selector '{css}'"); quote! { #[doc = #docs] #[allow(non_upper_case_globals)] @@ -142,33 +139,44 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok let wrp_docs = format!("wrapper class for '{}' scope. If you have any tagname selectors - they should live as children of element with this class applied.", &scope_ident); if constant { - let compiler = CompilerAdapter::new(config.clone()); - let css = match compiler.compile_module(ms.syntax.0, &scope.hashed_code) { - Ok(c) => c, - Err(e) => { - return syn::Error::new( - ms.code.span, - format!("Could not compile const inline: {e:?}"), + cfg_if! { + if #[cfg(feature = "const-compile")] { + use sabry_intrnl::compiler::CompilerAdapter; + let compiler = CompilerAdapter::new(config.clone()); + let css = match compiler.compile_module(ms.syntax.0, &scope.hashed_code) { + Ok(c) => c, + Err(e) => { + return syn::Error::new( + ms.code.span, + format!("Could not compile const inline: {e:?}"), + ) + .to_compile_error() + } + }; + + let const_docs = format!("The compiled CSS style for {} scope", &scope_ident); + let const_wrapper_ident = syn::parse_str::<Ident>( + format!("{}_CSS", &scope_ident.to_string().to_uppercase()).as_str(), ) - .to_compile_error() - } - }; + .expect("BUG: We just converted valid Ident to string and uppercased"); - let const_docs = format!("The compiled CSS style for {} scope", &scope_ident); - let const_wrapper_ident = syn::parse_str::<Ident>( - format!("{}_CSS", &scope_ident.to_string().to_uppercase()).as_str(), - ) - .expect("BUG: We just converted valid Ident to string and uppercased"); - - quote! { - #[doc = #const_docs] - #scope_vis const #const_wrapper_ident: &str = #css ; - #[doc = #wrp_docs] - #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; - #[doc = #mod_docs] - #scope_vis mod #scope_ident { - #(#scope_members)* - #(#special_nesting_members)* + quote! { + #[doc = #const_docs] + #scope_vis const #const_wrapper_ident: &str = #css ; + #[doc = #wrp_docs] + #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; + #[doc = #mod_docs] + #scope_vis mod #scope_ident { + #(#scope_members)* + #(#special_nesting_members)* + } + } + } else { + return syn::Error::new( + Span::call_site(), + "`styly!(const scope...` requires `experimental-const-scoping` feature flag", + ) + .to_compile_error(); } } } else { From 9473913c8fcd806929c162516448893d9adaddb0 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Thu, 8 May 2025 19:52:13 +0500 Subject: [PATCH 165/184] fix: update doctests --- .github/workflows/cbt.yml | 3 +-- README.md | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index 23416dd..ad3f3f1 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -17,13 +17,12 @@ jobs: matrix: toolchain: - stable - - nightly steps: - uses: actions/checkout@v4 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - run: cargo build --verbose - run: cargo test --verbose --all - - run: cargo test --verbose --all --all-features + - run: cargo test --verbose --all --features "const-scoping lepty-scoping" build_examples: name: Sabry - latset - examples diff --git a/README.md b/README.md index 857ad5e..29b42b7 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,10 @@ Compile all the sweet SASS/SCSS into the optimized CSS bundle, ship it in CSS sh ```rust sabry::styly!(cssbundle {".c1 {color: white;}"}); +``` + +```rust,ignore +// requires `const-scoping` feature sabry::styly!(const binary {".c2 {color: black;}"}); ``` @@ -158,7 +162,7 @@ And create a style scope wherever you want: // breadbadgelist.rs use sabry::styly; -styly!(const styles {" +styly!(styles {" .badges { display: flex; &__list { @@ -173,9 +177,7 @@ styly!(const styles {" /* Now you can use all scoped selectors: */ let badges_scoped_class = styles::badges; let wolf_scoped_id = styles::thewolf; -let badges__list_scoped_class = styles::___list(styles::badges); ``` -> That `const` usage is covered in the [following](#constant-styly-scopes) section. In this example we dont invoke sabry build-magic, so, to be as close to real life as possible, I used a const. Every selector, if that does make sense, now available for you as a member of `styles` scope. In this example - `styles::badges`, `styles::thewolf` and `styles::_list()`. More about scoping and member names you can read [here](#styly-scopes). @@ -267,6 +269,7 @@ pub const fn css() -> &'static str { // utils.rs use sabry::styly; +// required `const-scoping` feature styly!(pub const scope:scss {" .whatever { &__code {} @@ -274,6 +277,7 @@ styly!(pub const scope:scss {" } "}); +// requires `const-scoping` feature styly!(pub const another:scss {" .whatever { &__code {} @@ -290,6 +294,7 @@ pub const fn css() -> &'static str { // form.rs use sabry::styly; +// requires `const-scoping` feature styly!(pub const scope:scss {" .whatever { &__code {} @@ -297,6 +302,7 @@ styly!(pub const scope:scss {" } "}); +// requires `const-scoping` feature styly!(pub const another:scss {" .whatever { &__code {} @@ -539,6 +545,9 @@ use sabry::styly; styly!(private_fox {".fur {color: red; &-dark {color: black;}}"}); styly!(pub public_fox {".fur {color: red; &-dark {color: black;}}"}); +``` +```rust,ignore +// requires `const-scoping` feature styly!(pub const pub_compiletime_fox:sass {" .fur color: red @@ -546,6 +555,7 @@ styly!(pub const pub_compiletime_fox:sass {" color: black "}); ``` + Every of those calls will produce the styling scope as a module. Differences are explained right below. In general the scope does look like this: @@ -582,7 +592,7 @@ As you've seen above, scope doe not contain any style code by itself. That's the However you could still compile styles into the artifact by simply adding the `const` to the macro call: -```rust +```rust,ignore // Requires `const-scoping` feature sabry::styly!(const scope "tests/assets/mixin-module.scss"); ``` @@ -720,12 +730,15 @@ Not any valid CSS selector is a valid rust identifier. In general this section s **lepty-scoping** - overhauls the scope generation logic, best suitable for the leptos. Check out the [section](#leptos-specials) and an [example](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum) +**const-scoping** - unlocks `styly!(const scope...` compile-time SASS->CSS generation, which seems to break WASM builds without special treatment (https://docs.rs/getrandom/latest/getrandom/#webassembly-support). Idk why, but it started to happen just recently + **nightly** - allows relative path selection with `scssy!` and `styly!` macros. However rust-analyzer will raise false-positives for reachable files as well. ## WIP *(sorted by my own priority)*, "dones" are excluded +- [ ] Why does `const scope` break WASM build? Everything was fine untill recent. This feature isn't top-priority, I dont personally use it, but still curious - [x] Somehow achieve the autocompletion for scopes. The problem is explained in details [here](https://github.com/yiffyrusdev/sabry/issues/2) - [x] some weird unrelated stuff I can see in autocompletion (still investigating btw) - [ ] Support for direct CSS syntax From 7b97ee3b861661afd00e9d59c1367b25035e4699 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Thu, 8 May 2025 19:54:32 +0500 Subject: [PATCH 166/184] chore: Release --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8742652..95acb73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,10 +5,10 @@ exclude = ["examples"] [workspace.dependencies] ## Workspace -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.5" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.5" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.5" } -sabry_build = { path = "sabry_build", version = "0.0.5" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6-rc.1" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6-rc.1" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6-rc.1" } +sabry_build = { path = "sabry_build", version = "0.0.6-rc.1" } ## Package ## Package lightningcss.version = "1.0.0-alpha.65" @@ -33,7 +33,7 @@ quote.version = "^1" syn.version = "^2" [workspace.package] -version = "0.0.5" +version = "0.0.6-rc.1" edition = "2021" rust-version = "1.78" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] From 995cd31aabd541e21d8d5892542e7c4df668c924 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 12 Sep 2025 14:15:47 +0500 Subject: [PATCH 167/184] refactor!: remove `lepty-scoping` feature and make its behaviour the default; deprecate scope members; bump MSRV; bump deps --- .github/workflows/cbt.yml | 64 ++++----- Cargo.toml | 16 +-- README.md | 178 +++++------------------- examples/define-styles/Cargo.toml | 4 +- examples/leptos-axum/Cargo.toml | 28 ++-- examples/leptos-components/Cargo.toml | 10 +- examples/use-styles/Cargo.toml | 10 +- sabry_intrnl/Cargo.toml | 2 - sabry_intrnl/src/config/mod.rs | 20 +-- sabry_intrnl/src/scoper/hash.rs | 7 +- sabry_intrnl/src/scoper/mod.rs | 142 ++++++++----------- sabry_intrnl/src/syntax/mod.rs | 124 +++++++++++------ sabry_intrnl/src/syntax/ostrta.rs | 11 +- sabry_procmacro_impl/Cargo.toml | 1 + sabry_procmacro_impl/src/impls/styly.rs | 37 ++++- 15 files changed, 282 insertions(+), 372 deletions(-) diff --git a/.github/workflows/cbt.yml b/.github/workflows/cbt.yml index ad3f3f1..97fdacb 100644 --- a/.github/workflows/cbt.yml +++ b/.github/workflows/cbt.yml @@ -1,40 +1,40 @@ name: cargo basic build-test on: - push: - branches: ["window", "master"] - pull_request: - branches: ["window"] + push: + branches: ["window", "master"] + pull_request: + branches: ["window"] env: - CARGO_TERM_COLOR: always + CARGO_TERM_COLOR: always jobs: - build_and_test: - name: Sabry - latest - runs-on: ubuntu-latest - strategy: - matrix: - toolchain: - - stable - steps: - - uses: actions/checkout@v4 - - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - - run: cargo build --verbose - - run: cargo test --verbose --all - - run: cargo test --verbose --all --features "const-scoping lepty-scoping" + build_and_test: + name: Sabry - latest + runs-on: ubuntu-latest + strategy: + matrix: + toolchain: + - stable + steps: + - uses: actions/checkout@v4 + - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} + - run: cargo build --verbose + - run: cargo test --verbose --all + - run: cargo test --verbose --all --features "const-scoping" - build_examples: - name: Sabry - latset - examples - runs-on: ubuntu-latest - strategy: - matrix: - example: - - define-styles - - use-styles - - leptos-axum - steps: - - uses: actions/checkout@v4 - - run: rustup update nightly && rustup default nightly - - run: cd examples/${{ matrix.example }} - - run: cargo build --verbose + build_examples: + name: Sabry - latset - examples + runs-on: ubuntu-latest + strategy: + matrix: + example: + - define-styles + - use-styles + - leptos-axum + steps: + - uses: actions/checkout@v4 + - run: rustup update nightly && rustup default nightly + - run: cd examples/${{ matrix.example }} + - run: cargo build --verbose diff --git a/Cargo.toml b/Cargo.toml index 95acb73..d3fa278 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,16 +9,15 @@ sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6-rc.1" } sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6-rc.1" } sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6-rc.1" } sabry_build = { path = "sabry_build", version = "0.0.6-rc.1" } -## Package -## Package -lightningcss.version = "1.0.0-alpha.65" +#/ +lightningcss.version = "1.0.0-alpha.67" lightningcss.default-features = false grass.version = "^0.13" grass.default-features = false -raffia.version = "^0.9" +raffia.version = "^0.11" #/ serde.version = "^1" -toml.version = "^0.8" +toml.version = "^0.9" blake3.version = "^1" base64.version = "^0.22" regex.version = "^1" @@ -35,7 +34,7 @@ syn.version = "^2" [workspace.package] version = "0.0.6-rc.1" edition = "2021" -rust-version = "1.78" +rust-version = "1.88" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] repository = "https://github.com/yiffyrusdev/sabry" license = "MIT" @@ -60,12 +59,11 @@ sabry_build = { workspace = true, optional = true } sabry_intrnl = { workspace = true } [dev-dependencies] -leptos = { version = "0.7.0-gamma3" } -insta = { version = "^1.41", features = ["glob"] } +leptos = { version = "^0.8" } +insta = { version = "^1", features = ["glob"] } [features] default = ["procmacro"] -lepty-scoping = ["sabry_intrnl/lepty-scoping"] const-scoping = ["sabry_procmacro?/const-compile"] procmacro = ["dep:sabry_procmacro"] build = ["dep:sabry_build"] diff --git a/README.md b/README.md index 29b42b7..5c47c88 100644 --- a/README.md +++ b/README.md @@ -25,17 +25,6 @@ sabry::scssy!(tokens {"@mixin colored{color: red;}"}); <hr/> -Get the *(almost)* proper autocompletion for your scope from rust-analyzer - -```rust -sabry::styly!(scope {".cls1{} #id1{}"}); -/* autocompleted for you */ -scope::cls1; -scope::theid1; -``` - -<hr/> - Code your SASS in separate files to get proper syntax highlighting, or do sass-in-the-rust to keep things in one place ```rust @@ -71,13 +60,23 @@ Keep things as private and modular as you wish ```rust sabry::styly!(pub cats "tests/assets/mixin-module.scss"); -sabry::styly!(dogs {"#howl {border: none;}"}); +sabry::styly!(dogs {".howl {border: none;}"}); ``` -```rust,ignore +```html /// something like render function { - <div class={cats::meow}> - <ul id={dogs::thehowl}></ul> + <div class={concatcp!("meow ", CATS)}> + <ul class={concatcp!("howl ", DOGS)}></ul> + </div> +} +``` +```html +/// or even better with leptos +view!{class=CATS + <div class="meow"> + {move || view!{class=DOGS, + <ul class="howl"></ul> + }} </div> } ``` @@ -122,7 +121,7 @@ The only need is the dependency #Cargo.toml [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` And a proc-macro ```rust @@ -155,7 +154,7 @@ Depend on sabry # Cargo.toml [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` And create a style scope wherever you want: ```rust @@ -173,18 +172,18 @@ styly!(styles {" color: white; } "}); - -/* Now you can use all scoped selectors: */ -let badges_scoped_class = styles::badges; -let wolf_scoped_id = styles::thewolf; ``` -Every selector, if that does make sense, now available for you as a member of `styles` scope. In this example - `styles::badges`, `styles::thewolf` and `styles::_list()`. More about scoping and member names you can read [here](#styly-scopes). +```html +<ul class={concatcp!("badges ", STYLES)}> + <li class={STYLES} id="wolf"> + "HOOOOWL!" + </li> +</ul> +``` ### Use styles earlier created in another crate -> **Tip** | If you use [leptos](https://github.com/leptos-rs/leptos) - check [this](#leptos-specials) section as well - The combination of previous two, with some additional work to do and some extra sugar to enjoy. Sabry is needed as both dependency and build-dependency. @@ -193,10 +192,10 @@ To be able to compile all styles sabry also needs the *build* feature flag: # Cargo.toml [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} [build-dependencies] -sabry = {version = "0.0.5", features = ["build"]} +sabry = {version = "0.0.6", features = ["build"]} ``` > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. @@ -318,81 +317,6 @@ So I'd say - do the const function back-propogation and let the consumer decide </details> -### Leptos specials - -With [leptos](https://github.com/leptos-rs/leptos) framework you can do the trick to apply some class to most of HtmlElements for the entire component/island: - -```rust -use leptos::prelude::*; - -#[component] -fn component() -> impl IntoView { - view! {class="cls1", /* <- here */ - <h1>"Head"</h1> - <p>"text"</p> - } -} -``` -... and have "cls1" on both `h1` and `p` auto-assigned. Isn't that cool? - -So, if you're on leptos, and don't mind to take this approach, I'd highly recommend turning the *lepty-scoping* feature on: - -```toml -# Cargo.toml - -[dependencies] -sabry = {version = "0.0.5", features = ["lepty-scoping"]} - -[build-dependencies] -sabry = {version = "0.0.5", features = ["build", "lepty-scoping"]} -``` - -```rust -use leptos::prelude::*; -use sabry::styly; - -styly!(scope {" - // assuming we have tokens!() macro generated by `scssy!`, which is handled by `buildy` - @use 'tokens'; - h1 { - @include tokens.sectionhead(); - img { - @include tokens.sectionimg(); - } - } - .breadcumbs { - @include tokens.badgelist(); - &__item { - @include tokens.badge(secondary); - } - } -"}); - -#[component] -fn component() -> impl IntoView { - view! {class=SCOPE, - <h1> - "Head" - <img src="whatever"/> - </h1> - <ul class="breadcumbs"> - <li class="breadcumbs__item"> - "Home page" - </li> - </ul> - } -} -``` - -That will perform *much* better: - -- All scope members - like `scope::breadcumbs` - wont contain repeating scope hash, just the original class/id selector - - So instead of scope members (which [aren't](https://github.com/yiffyrusdev/sabry/issues/2) autocompleted for sass-in-the-rust yet) you could just write bare selectors, as you do, for example, with svelte: `<li class="breadcumbs__item">` - - You'll still have the rusty mod generated: its just the `scope::breadcumbs` is the `"breadcumbs"` without the hash -- You will not encounter [the catch](#scoping) with nested tagname selectors - -Also, this isn't really exclusive leptos-supporting feature. It just changes scoping behavour. - ## Configuration Sabry configuration lives in `[package.metadata.sabry]` table of the manifest file. @@ -562,8 +486,8 @@ In general the scope does look like this: ```rust,ignore const FOX: &str = "J9k_s9"; mod fox { - pub const fur: &str = "J9k_s9 fur"; - pub fn _dark(c: &str) -> String {format!("{c}-dark")} + #[deprecated(since = "0.0.6", note = "will remove")] + pub const fur: &str = "fur J9k_s9"; } ``` @@ -572,9 +496,6 @@ mod fox { Styly macro itself does not generate the scope. It is done in the `sabry_intrnl::scoper`. However, as a result, you will have the following: - `const` with the UPPER_CASE name of the scope, which contains its hash -- `mod` with exact scope name which is the scope you're going to use - - for simple selectors, like `.fur` you will have a const members with hashed original selectors to use wherever you need a class/id/etc. - - for parent-selectors like `&-dark` you will have a non-const function, which will create matching the selector from any other. You can read more about scoping and hashing in the [scoping](#scoping) section. @@ -600,7 +521,6 @@ Which results in following: ```rust,ignore const SCOPE: &str = /* scope hash */; const SCOPE_CSS: &str = /* compiled from src/assets/scope.scss */; -mod scope {/* selector collection */} ``` > **There is a catch** | with the `const` modifier macro must compile CSS at compile-time. That results in several game changers: @@ -666,15 +586,15 @@ Exactly this kind of macros is produced by [`scssy!`](#style-definition-with-scs ### Scoping -Sabry handles scoping by restriction or mutation of existing selectors +Sabry handles scoping by restriction of existing selectors with the hash. Hash is calculated for the entire scope by the [`styly!`](#scoping-with-styly) macro. Currently the following types of selectors are scoped: - class - id +- tagname - SASS parent selectors (see below, there is a catch) -- tagname (see below, there is a catch) Sabry does not make difference between top-level and nested selectors, also selector complexity isn't taken into account: sabry simply walks through all compound selectors @@ -683,40 +603,8 @@ and apply scoping for supported ones. Different selector types are scoped differently: - class selectors are restricted with scope hash: `.class` -> `.HASH.class` -- id selector are mutated with scope hash: `#id` -> `#id-HASH` -- tagname selectors are changed into indirect descendance: `div` -> `.HASH div` - -> **There is a catch** | currently tagname selectors are scoped with indirect descendancy -> hash restriction. That means - if you do use tagnames in scoped stylesheets, you have to wrap your markdown -> with `SCOPE` class generated by `styly!` macro. -> -> Also if there are nested tagname selectors - sabry won't take this into account and you'll -> have to wrap them with `SCOPE` class as well -> -> **However** If you are able to apply some class to all html elements you have - like `view!{class=CLASS...}` with Leptos - you could use *lepty-scoping* feature flag for sabry and get rid of this catch! See more [here](#leptos-specials). - -As for **SASS parent selectors**: they are currently handled in different way. Instead of -walking up the syntax tree sabry just creates function member for the scope and leave the rest to grass: - -```rust -sabry::styly!(scope {" - .cls1 { - &-dark {} - } -"}); -``` -is something like -```rust,ignore -const SCOPE: &str = "Ut8CskJ"; -mod scope { - pub const cls1: &str = "Ut8CskJ cls1"; - pub fn _dark(c: &str) -> String {format!("{c}-dark")} -} -``` - -So you still can get the scoped variant of `cls1-dark` class: `scope::_dark(scope::cls1)`. - -This isn't very handy, also isn't strict enough, and is a high-priority subject to change. wip. +- id selector are mutated with scope hash: `#id` -> `.HASH#id` +- tagname selectors are changed into indirect descendance: `div` -> `div.HASH` #### Scope member naming rules @@ -763,9 +651,9 @@ If you'd like to lend a paw - feel free to check the [WIP](#wip) section out, or ## MSRV -Sabry passes its own tests on 1.78 nightly/stable. +Sabry passes its own tests on 1.88 nightly/stable. -Examples are on 1.82. +Examples are on 1.88. ## License diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml index 4288abb..e7a8b65 100644 --- a/examples/define-styles/Cargo.toml +++ b/examples/define-styles/Cargo.toml @@ -2,8 +2,8 @@ name = "define-styles" version = "0.0.0" edition = "2021" -rust-version = "1.82" +rust-version = "1.88" publish = false [dependencies] -sabry = {path = "../../", features = ["nightly"]} +sabry = { path = "../../", features = ["nightly"] } diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 659fbf9..162c94a 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "leptos-axum-sabry" version = "0.1.0" -rust-version = "1.82" +rust-version = "1.88" edition = "2021" publish = false @@ -9,31 +9,31 @@ publish = false crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "^0.7" } -leptos_axum = { version = "^0.7", optional = true } -leptos_meta = { version = "^0.7" } -leptos_router = { version = "^0.7" } -axum = { version = "0.7", optional = true } +leptos = { version = "^0.8" } +leptos_axum = { version = "^0.8", optional = true } +leptos_meta = { version = "^0.8" } +leptos_router = { version = "^0.8" } +axum = { version = "0.8", optional = true } console_error_panic_hook = "0.1" tokio = { version = "1", features = ["rt-multi-thread"], optional = true } -tower = { version = "0.4", optional = true } -tower-http = { version = "0.5", features = ["fs"], optional = true } +tower = { version = "0.5", optional = true } +tower-http = { version = "0.6", features = ["fs"], optional = true } wasm-bindgen = "=0.2.96" -thiserror = "1" +thiserror = "^1" tracing = { version = "0.1", optional = true } -http = "1" +http = "^1" # sabry with sass -sabry = {path = "../../", features = ["lepty-scoping"]} +sabry = { path = "../../" } # our component library -leptos-components = {path = "../leptos-components"} +leptos-components = { path = "../leptos-components" } [build-dependencies] # sabry for build with sass -sabry = {path = "../../", features = ["build", "lepty-scoping"]} +sabry = { path = "../../", features = ["build"] } # lets depend on our styles -define-styles = {path = "../define-styles"} +define-styles = { path = "../define-styles" } [features] hydrate = ["leptos/hydrate"] diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml index 9e8b6d6..2d0f28b 100644 --- a/examples/leptos-components/Cargo.toml +++ b/examples/leptos-components/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "leptos-components" version = "0.1.0" -rust-version = "1.82" +rust-version = "1.88" edition = "2021" publish = false @@ -13,14 +13,10 @@ leptos = { version = "^0.7" } leptos_meta = { version = "^0.7" } leptos_router = { version = "^0.7" } -sabry = { path = "../../", features = ["lepty-scoping", "const-scoping"] } +sabry = { path = "../../", features = ["const-scoping"] } [build-dependencies] -sabry = { path = "../../", features = [ - "build", - "lepty-scoping", - "const-scoping", -] } +sabry = { path = "../../", features = ["build", "const-scoping"] } define-styles = { path = "../define-styles" } [features] diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml index c6241e0..fa3bd23 100644 --- a/examples/use-styles/Cargo.toml +++ b/examples/use-styles/Cargo.toml @@ -2,15 +2,15 @@ name = "use-styles" version = "0.0.0" edition = "2021" -rust-version = "1.82" +rust-version = "1.88" publish = false [dependencies] -sabry = {path = "../../", features = ["nightly"]} +sabry = { path = "../../", features = ["nightly"] } [build-dependencies] -sabry = {path = "../../", features = ["build", "nightly"]} -define-styles = {path = "../define-styles"} +sabry = { path = "../../", features = ["build", "nightly"] } +define-styles = { path = "../define-styles" } [package.metadata.sabry] css.bundle = "target/static/style.css" @@ -21,4 +21,4 @@ hash.size = 6 hash.collision = "error" [package.metadata.sabry.lightningcss] -targets = {chrome = "120", firefox = "120", ie = "8"} +targets = { chrome = "120", firefox = "120", ie = "8" } diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index b39c615..939f3e1 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -16,7 +16,6 @@ regex.optional = true grass.workspace = true grass.optional = true lightningcss.workspace = true -lightningcss.features = ["grid"] lightningcss.optional = true blake3.workspace = true blake3.optional = true @@ -30,7 +29,6 @@ toml.workspace = true cfg-if.workspace = true [features] -lepty-scoping = [] scope = ["dep:blake3", "dep:base64", "dep:regex"] compile = ["dep:lightningcss", "dep:grass"] diff --git a/sabry_intrnl/src/config/mod.rs b/sabry_intrnl/src/config/mod.rs index dfa13bc..5c4f63b 100644 --- a/sabry_intrnl/src/config/mod.rs +++ b/sabry_intrnl/src/config/mod.rs @@ -217,31 +217,21 @@ impl From<SabryLightTargets> for lightningcss::targets::Browsers { } /// \[package.metadata.sabry.sass\].module_name_collision option -#[derive(Deserialize, Clone, Copy)] +#[derive(Default, Deserialize, Clone, Copy)] #[serde(rename_all = "lowercase")] pub enum BehavSassModCollision { + #[default] Merge, Error, } -impl Default for BehavSassModCollision { - fn default() -> Self { - Self::Merge - } -} - /// \[package.metadata.sabry.hash\].collision option -#[derive(Deserialize, Clone, Copy)] +#[derive(Default, Deserialize, Clone, Copy)] #[serde(rename_all = "lowercase")] pub enum BehavHashCollision { - Error, + #[default] Ignore, -} - -impl Default for BehavHashCollision { - fn default() -> Self { - Self::Ignore - } + Error, } #[cfg(test)] diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index df21766..34ef46d 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -1,3 +1,5 @@ +use raffia::ast::InterpolableIdent; + /// Convenience wrapper for String-being-a-hash #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ScopeHash(String); @@ -30,7 +32,10 @@ impl ScopeHash { .iter() .map(|s| &s.name) .chain(ids.iter().map(|i| &i.name)) - .map(|ident| ident.as_literal()) + .map(|ident| match ident { + InterpolableIdent::Literal(lit) => Some(lit), + _ => None, + }) .filter_map(|mbl| mbl.map(|l| l.raw)) .collect::<String>(); diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 408b417..2b0d2dd 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -1,8 +1,10 @@ use std::fmt::Debug; -use cfg_if::cfg_if; use hash::ScopeHash; -use raffia::{Span, Spanned}; +use raffia::{ + ast::{InterpolableIdent, TypeSelector}, + Span, Spanned, +}; use crate::syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}; @@ -106,7 +108,10 @@ impl<'s> HashedScope<'s> { let tags = scope.adapter().type_selectors(); let tags = tags .iter() - .filter_map(|t| t.as_tag_name()) + .filter_map(|t| match t { + TypeSelector::TagName(tag) => Some(tag), + _ => None, + }) .map(|c| HashedSelector::from_tag(&hash, c)); // get global selectors @@ -234,29 +239,17 @@ impl HashedSelector { /// whats this function returns will be usable in HTML with to_hashed_html_def() pub fn make_hashed_css(value: &ScopedSelector, hash: &ScopeHash) -> String { match value { - // Class scoping is done with class composition ScopedSelector::Class(a) => { + // Class scoping is done by composition format!("{}.{}", hash.as_str(), a.ident) } - // As we dont want to use two HTML props for a single ID, - // ID scoping is done with id modification - ScopedSelector::Id(a) => { - cfg_if! { - if #[cfg(feature = "lepty-scoping")] { - format!("{}.{}", a.ident, hash.as_str()) - } else { - format!("{}-{}", hash.as_str(), a.ident) - } - } - } ScopedSelector::Tag(a) => { - cfg_if! { - if #[cfg(feature = "lepty-scoping")] { - format!("{}.{}", a.ident, hash.as_str()) - } else { - format!(".{} {}", hash.as_str(), a.ident) - } - } + // Tag scoping is done by composition + format!("{}.{}", a.ident, hash.as_str()) + } + ScopedSelector::Id(a) => { + // ID scoping is done by class composition + format!("{}.{}", a.ident, hash.as_str()) } ScopedSelector::Glob { raw, .. } => raw.clone(), } @@ -267,31 +260,15 @@ impl HashedSelector { /// Cooperates with the [HashedSelector::make_hashed_css], so /// whats this function returns will be usable in CSS with to_hashed_code() /// - /// Not every hashed selector is presentable for HTML-ish use: like `div`, in that case - /// returns [None] - pub fn make_hashed_html(value: &ScopedSelector, _hash: &ScopeHash) -> Option<String> { + /// Since 0.0.6 all scoping is done via classes, so this function + /// persists for bw-compat for everything except for class. + /// + /// Global and Tag selectors are never transformed; + pub fn make_hashed_html(value: &ScopedSelector, hash: &ScopeHash) -> Option<String> { match value { // Class scoping is done with class composition - ScopedSelector::Class(a) => { - cfg_if! { - if #[cfg(feature = "lepty-scoping")] { - Some(a.ident.to_string()) - } else { - Some(format!("{} {}", _hash.as_str(), a.ident)) - } - } - } - // As we dont want to use two HTML props for a single ID, - // ID scoping is done with id modification - ScopedSelector::Id(a) => { - cfg_if! { - if #[cfg(feature = "lepty-scoping")] { - Some(a.ident.to_string()) - } else { - Some(format!("{}-{}", _hash.as_str(), a.ident)) - } - } - } + ScopedSelector::Class(a) => Some(format!("{} {}", a.ident, hash.as_str())), + ScopedSelector::Id(id) => Some(id.ident.clone()), ScopedSelector::Tag(_) => None, ScopedSelector::Glob { .. } => None, } @@ -366,10 +343,9 @@ impl ScopedSelector { /// Construct this from class selector pub fn from_class(s: &raffia::ast::ClassSelector) -> Self { - let lit = s - .name - .as_literal() - .expect("BUG: class selector is not a literal"); + let InterpolableIdent::Literal(lit) = &s.name else { + panic!("BUG: class selector was not a literal") + }; Self::Class(ArbitrarySelector { ident: lit.raw.to_string(), span: lit.span().clone(), @@ -378,10 +354,9 @@ impl ScopedSelector { /// Construct this from id selector pub fn from_id(s: &raffia::ast::IdSelector) -> Self { - let lit = s - .name - .as_literal() - .expect("BUG: id selector is not a literal"); + let InterpolableIdent::Literal(lit) = &s.name else { + panic!("BUG: id selector was not a literal") + }; Self::Id(ArbitrarySelector { ident: lit.raw.to_string(), span: lit.span().clone(), @@ -390,11 +365,9 @@ impl ScopedSelector { /// Construct this from tagname selector pub fn from_tag(s: &raffia::ast::TagNameSelector) -> Self { - let lit = s - .name - .name - .as_literal() - .expect("BUG: tag selector is not a literal"); + let InterpolableIdent::Literal(lit) = &s.name.name else { + panic!("BUG: tag selector was not a literal") + }; Self::Tag(ArbitrarySelector { ident: lit.raw.to_string(), span: lit.span().clone(), @@ -439,7 +412,6 @@ pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { mod test { use std::collections::HashSet; - use cfg_if::cfg_if; use syn::Ident; use crate::{ @@ -456,33 +428,33 @@ mod test { ".cls1{color:red; &-dark{color: black;} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; let hash = ScopeHash::test_init("F2kf8nMs".into()); - cfg_if! { - if #[cfg(feature = "lepty-scoping")]{ - let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #id1.F2kf8nMs {color:green;} div.F2kf8nMs {color:blue;}} .F2kf8nMs.cls3#id2.F2kf8nMs{color: black;}"; - } else { - let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; - } - } + //cfg_if! { + //if #[cfg(feature = "lepty-scoping")]{ + let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #id1.F2kf8nMs {color:green;} div.F2kf8nMs {color:blue;}} .F2kf8nMs.cls3#id2.F2kf8nMs{color: black;}"; + //} else { + // let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; + //} + //} - cfg_if! { - if #[cfg(feature = "lepty-scoping")] { - let expect_selector_htmls = HashSet::from([ - "cls1".to_string(), - "id1".to_string(), - "cls3".to_string(), - "id2".to_string(), - "".to_string(), // comes from `div` which has no html hashed code, still want to check presense - ]); - } else { - let expect_selector_htmls = HashSet::from([ - "F2kf8nMs cls1".to_string(), - "F2kf8nMs-id1".to_string(), - "F2kf8nMs cls3".to_string(), - "F2kf8nMs-id2".to_string(), - "".to_string(), // comes from `div` which has no html hashed code, still want to check presense - ]); - } - } + // cfg_if! { + // if #[cfg(feature = "lepty-scoping")] { + let expect_selector_htmls = HashSet::from([ + "cls1".to_string(), + "id1".to_string(), + "cls3".to_string(), + "id2".to_string(), + "".to_string(), // comes from `div` which has no html hashed code, still want to check presense + ]); + // } else { + // let expect_selector_htmls = HashSet::from([ + // "F2kf8nMs cls1".to_string(), + // "F2kf8nMs-id1".to_string(), + // "F2kf8nMs cls3".to_string(), + // "F2kf8nMs-id2".to_string(), + // "".to_string(), // comes from `div` which has no html hashed code, still want to check presense + // ]); + // } + //} let scope = ArbitraryScope::from_source( OneSyntaxToRuleThemAll::Scss, diff --git a/sabry_intrnl/src/syntax/mod.rs b/sabry_intrnl/src/syntax/mod.rs index 9feccd4..d1d8c67 100644 --- a/sabry_intrnl/src/syntax/mod.rs +++ b/sabry_intrnl/src/syntax/mod.rs @@ -1,8 +1,8 @@ use ostrta::OneSyntaxToRuleThemAll; use raffia::{ ast::{ - ClassSelector, CompoundSelector, IdSelector, NestingSelector, PseudoClassSelector, - SimpleSelector, Statement, Stylesheet, TypeSelector, + ClassSelector, ComplexSelectorChild, CompoundSelector, IdSelector, InterpolableIdent, + NestingSelector, PseudoClassSelector, SimpleSelector, Statement, Stylesheet, TypeSelector, }, ParserBuilder, }; @@ -41,38 +41,49 @@ impl<'s> StylesheetAdapter<'s> { } pub fn class_selectors(&self) -> Vec<ClassSelector<'s>> { - self.selectors_by(|c| c.as_class().cloned()) + self.selectors_by(|c| match c { + SimpleSelector::Class(sel) => Some(sel), + _ => None, + }) } pub fn id_selectors(&self) -> Vec<IdSelector<'s>> { - self.selectors_by(|c| c.as_id().cloned()) + self.selectors_by(|c| match c { + SimpleSelector::Id(sel) => Some(sel), + _ => None, + }) } pub fn type_selectors(&self) -> Vec<TypeSelector<'s>> { - self.selectors_by(|c| c.as_type().cloned()) + self.selectors_by(|c| match c { + SimpleSelector::Type(sel) => Some(sel), + _ => None, + }) } pub fn nesting_selectors(&self) -> Vec<NestingSelector<'s>> { - self.selectors_by(|c| c.as_nesting().cloned()) + self.selectors_by(|c| match c { + SimpleSelector::Nesting(sel) => Some(sel), + _ => None, + }) } /// special selector case searching for :g(whatever), :glob(whatever), :global(whatever) pub fn glob_modified_selectors(&self) -> Vec<PseudoClassSelector<'s>> { self.selectors_by(|c| { - let cps = match c.as_pseudo_class() { - Some(s) => s.clone(), + let cps = match c { + SimpleSelector::PseudoClass(sel) => sel, _ => return None, }; - let ident = match cps.name.as_literal().map(|r| r.raw) { - Some(i) => i, - _ => return None, - }; - - if ident == "global" { - Some(cps) - } else { - None + match &cps.name { + InterpolableIdent::Literal(lit) => match lit.raw { + "g" => Some(cps), + "glob" => Some(cps), + "global" => Some(cps), + _ => None, + }, + _ => None, } }) } @@ -106,21 +117,27 @@ impl<'s> StylesheetAdapter<'s> { // 4 - Danik // 5 - Yiffy // 8 - Danik - c.filter_map(|s| s.as_qualified_rule().cloned()) - .flat_map(|q| { - let thissels = q - .selector - .selectors - .iter() - .flat_map(|sel| &sel.children) - .filter_map(|sc| sc.as_compound_selector()) - .cloned(); + c.filter_map(|s| match s { + Statement::QualifiedRule(stmt) => Some(stmt), + _ => None, + }) + .flat_map(|q| { + let thissels = q + .selector + .selectors + .iter() + .flat_map(|sel| &sel.children) + .filter_map(|sc| match sc { + ComplexSelectorChild::CompoundSelector(sel) => Some(sel), + _ => None, + }) + .cloned(); - let blockstmt = q.block.statements.iter().cloned(); - Self::selectors_of(blockstmt) - .chain(thissels) - .collect::<Vec<_>>() - }) + let blockstmt = q.block.statements.iter().cloned(); + Self::selectors_of(blockstmt) + .chain(thissels) + .collect::<Vec<_>>() + }) } } @@ -128,7 +145,10 @@ impl<'s> StylesheetAdapter<'s> { mod test { use std::collections::HashSet; - use raffia::Spanned; + use raffia::{ + ast::{InterpolableIdent, TypeSelector}, + Spanned, + }; use crate::syntax::ostrta::OneSyntaxToRuleThemAll; @@ -191,20 +211,32 @@ div#id2 let classes = adp .class_selectors() .iter() - .filter_map(|c| c.name.as_literal().map(|l| l.raw)) + .filter_map(|c| match &c.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); let ids = adp .id_selectors() .iter() - .filter_map(|i| i.name.as_literal().map(|l| l.raw)) + .filter_map(|i| match &i.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); let tags = adp .type_selectors() .iter() - .filter_map(|t| t.as_tag_name()) - .filter_map(|t| t.name.name.as_literal().map(|l| l.raw)) + .filter_map(|t| match t { + TypeSelector::TagName(tag) => Some(tag), + _ => None, + }) + .filter_map(|t| match &t.name.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); assert_eq!(expect_classes, classes); @@ -217,20 +249,32 @@ div#id2 let classes = adp .class_selectors() .iter() - .filter_map(|c| c.name.as_literal().map(|l| l.raw)) + .filter_map(|c| match &c.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); let ids = adp .id_selectors() .iter() - .filter_map(|i| i.name.as_literal().map(|l| l.raw)) + .filter_map(|i| match &i.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); let tags = adp .type_selectors() .iter() - .filter_map(|t| t.as_tag_name()) - .filter_map(|t| t.name.name.as_literal().map(|l| l.raw)) + .filter_map(|t| match t { + TypeSelector::TagName(tag) => Some(tag), + _ => None, + }) + .filter_map(|t| match &t.name.name { + InterpolableIdent::Literal(lit) => Some(lit.raw), + _ => None, + }) .collect::<HashSet<_>>(); assert_eq!(expect_classes, classes); diff --git a/sabry_intrnl/src/syntax/ostrta.rs b/sabry_intrnl/src/syntax/ostrta.rs index 8d6826c..bf320a0 100644 --- a/sabry_intrnl/src/syntax/ostrta.rs +++ b/sabry_intrnl/src/syntax/ostrta.rs @@ -1,15 +1,10 @@ /// Convenience unification entrypoint /// to make friends with all the different syntax-consumers -#[derive(Debug, Clone, Copy)] +#[derive(Default, Debug, Clone, Copy)] pub enum OneSyntaxToRuleThemAll { - Sass, + #[default] Scss, -} - -impl Default for OneSyntaxToRuleThemAll { - fn default() -> Self { - Self::Scss - } + Sass, } impl TryFrom<&str> for OneSyntaxToRuleThemAll { diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index ae8189a..05646ba 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -11,6 +11,7 @@ license.workspace = true [dependencies] sabry_intrnl.workspace = true sabry_intrnl.features = ["scope"] +raffia.workspace = true syn.workspace = true syn.features = ["parsing"] quote.workspace = true diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index a0a7e23..0297c06 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -84,10 +84,17 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok .iter() .filter_map(|ns| { ns.suffix.clone().and_then(|s| { - let interp = s - .as_sass_interpolated() - .and_then(|i| i.elements.first()) - .and_then(|e| e.as_static().map(|s| s.raw.to_string())); + let interp = match s { + raffia::ast::InterpolableIdent::SassInterpolated(int) => Some(int), + _ => None, + }; + + let interp = interp.and_then(|i| match i.elements.first() { + Some(raffia::ast::SassInterpolatedIdentElement::Static(i)) => { + Some(i.raw.to_string()) + } + _ => None, + }); interp }) @@ -102,6 +109,10 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok quote! { #[doc = #doc] + #[deprecated( + since = "0.0.6", + note = "All scoping is done by directly applying hash classes to elements now - this is useless for everything except of classes" + )] pub fn #fnident(c: &str) -> String {format!(#formatstr)} } }); @@ -120,23 +131,35 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok ScopedSelector::Glob { .. } => "glob", }; - (name, hs.sel.gen_rusty_ident(), html, hs.css_ident.clone()) + ( + name, + hs.sel.gen_rusty_ident(), + html, + hs.css_ident.clone(), + ) }) }) .map(|(name, ident, html, css)| { let docs = format!("'{ident:?}' {name}. CSS selector '{css}'"); quote! { #[doc = #docs] + #[deprecated( + since = "0.0.6", + note = "All scoping is done by directly applying hash classes to elements now - this is useless for everything except of classes" + )] #[allow(non_upper_case_globals)] pub const #ident : &str = #html ; } }); let mod_docs = format!( - "'{}' style scope. The wrapper class for scoped tagnames is {}", + "'{}' style scope. The hash class is `{}`", &scope_ident, &scope_wrapper_ident ); - let wrp_docs = format!("wrapper class for '{}' scope. If you have any tagname selectors - they should live as children of element with this class applied.", &scope_ident); + let wrp_docs = format!( + "hash class for '{}' scope. All HTML elements should have this class applied", + &scope_ident + ); if constant { cfg_if! { From 825daa26fd547b2ab01607ec112891742733dd2a Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 12 Sep 2025 14:21:20 +0500 Subject: [PATCH 168/184] fix: dont know why sabry_build wasn't a member --- Cargo.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index d3fa278..e9cb58a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,11 @@ [workspace] resolver = "2" -members = ["sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl"] +members = [ + "sabry_procmacro", + "sabry_procmacro_impl", + "sabry_intrnl", + "sabry_build", +] exclude = ["examples"] [workspace.dependencies] From e7825bbdd7820d5b06f9b6c3cf131799e4f4f140 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 12 Sep 2025 14:24:36 +0500 Subject: [PATCH 169/184] fix: use under feature --- sabry_intrnl/src/scoper/hash.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index 34ef46d..fe539fe 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -1,5 +1,3 @@ -use raffia::ast::InterpolableIdent; - /// Convenience wrapper for String-being-a-hash #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ScopeHash(String); @@ -8,6 +6,7 @@ impl ScopeHash { #[cfg(feature = "scope")] pub fn new(scope: &super::ArbitraryScope, config: &crate::config::SabryHashConfig) -> Self { use base64::Engine; + use raffia::ast::InterpolableIdent; use crate::scoper::apply_basic_rusty_member_gen_rules; From 88ce8a17dd8991f6980d780bc5f9725478e1add7 Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Fri, 12 Sep 2025 14:27:58 +0500 Subject: [PATCH 170/184] chore: Release --- Cargo.toml | 10 +++++----- sabry_build/README.md | 2 +- sabry_intrnl/README.md | 2 +- sabry_procmacro/README.md | 2 +- sabry_procmacro_impl/README.md | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e9cb58a..5036882 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,10 +10,10 @@ exclude = ["examples"] [workspace.dependencies] ## Workspace -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6-rc.1" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6-rc.1" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6-rc.1" } -sabry_build = { path = "sabry_build", version = "0.0.6-rc.1" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6" } +sabry_build = { path = "sabry_build", version = "0.0.6" } #/ lightningcss.version = "1.0.0-alpha.67" lightningcss.default-features = false @@ -37,7 +37,7 @@ quote.version = "^1" syn.version = "^2" [workspace.package] -version = "0.0.6-rc.1" +version = "0.0.6" edition = "2021" rust-version = "1.88" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] diff --git a/sabry_build/README.md b/sabry_build/README.md index 4f8f220..e08a18f 100644 --- a/sabry_build/README.md +++ b/sabry_build/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md index 2e53d53..c9cabbd 100644 --- a/sabry_intrnl/README.md +++ b/sabry_intrnl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md index 0944f74..29fef06 100644 --- a/sabry_procmacro/README.md +++ b/sabry_procmacro/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md index d92d7ed..c0e51bf 100644 --- a/sabry_procmacro_impl/README.md +++ b/sabry_procmacro_impl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.5"} +sabry = {version = "0.0.6"} ``` From bfe28820e3fc216215e09e5691b46173a5ac4060 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Wed, 13 May 2026 13:05:54 +0500 Subject: [PATCH 171/184] chore(repo)!: move --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 5c47c88..0fe9f97 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,10 @@ +> **Repository moved** +> +> On GithHub this repository is now a [push-mirror](https://source.spushk.ru/rustyworks/sabry) +> and will be removed from GH at 07-2026 +> +> Crate will remain maintained + # 🧙🏻 SABRY - Syntactically Awesome, But RustY **Y**et another **R**usty **B**oilerplate-free **A**gnostic **S**tyling crate, which brings your SASS/SCSS style into Rust. Written by a fox this time. From 5d18f9201e4114d25d9079a70cddeecf5799459e Mon Sep 17 00:00:00 2001 From: yiffyrusdev <yiffyrusdev@yandex.ru> Date: Tue, 24 Mar 2026 05:53:08 +0500 Subject: [PATCH 172/184] chore: pre0.1 --- Cargo.toml | 36 +++++----- examples/define-styles/Cargo.toml | 2 +- examples/leptos-axum/Cargo.toml | 30 ++++++--- examples/leptos-components/Cargo.toml | 8 +-- examples/use-styles/Cargo.toml | 2 +- sabry_intrnl/Cargo.toml | 6 +- sabry_intrnl/src/scoper/hash.rs | 28 +++----- sabry_intrnl/src/scoper/mod.rs | 56 ++++++--------- sabry_procmacro/Cargo.toml | 2 - sabry_procmacro/src/lib.rs | 30 ++------- sabry_procmacro_impl/src/impls/mod.rs | 90 +++++-------------------- sabry_procmacro_impl/src/impls/scssy.rs | 31 ++++----- sabry_procmacro_impl/src/impls/styly.rs | 31 +++------ 13 files changed, 114 insertions(+), 238 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5036882..195a87b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -resolver = "2" +resolver = "3" members = [ "sabry_procmacro", "sabry_procmacro_impl", @@ -8,43 +8,42 @@ members = [ ] exclude = ["examples"] +[workspace.package] +version = "0.0.6" +edition = "2024" +rust-version = "1.88" +authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] +repository = "https://github.com/yiffyrusdev/sabry" +license = "MIT" +publish = true + [workspace.dependencies] ## Workspace sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6" } sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6" } sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6" } sabry_build = { path = "sabry_build", version = "0.0.6" } -#/ -lightningcss.version = "1.0.0-alpha.67" +## CSS +lightningcss.version = "1.0.0-alpha.71" lightningcss.default-features = false grass.version = "^0.13" grass.default-features = false -raffia.version = "^0.11" -#/ +raffia.version = "^0.12" +## Marshall serde.version = "^1" -toml.version = "^0.9" -blake3.version = "^1" +toml.version = "^1" base64.version = "^0.22" regex.version = "^1" -#/ +## Util itertools.version = "^0.14" walkdir.version = "^2" -#/ +## Codegen cfg-if.version = "^1" thiserror.version = "^2" proc-macro2.version = "^1" quote.version = "^1" syn.version = "^2" -[workspace.package] -version = "0.0.6" -edition = "2021" -rust-version = "1.88" -authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] -repository = "https://github.com/yiffyrusdev/sabry" -license = "MIT" -publish = true - [package] name = "sabry" description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust" @@ -73,7 +72,6 @@ const-scoping = ["sabry_procmacro?/const-compile"] procmacro = ["dep:sabry_procmacro"] build = ["dep:sabry_build"] net-files = ["sabry_build/net-files"] -nightly = ["sabry_procmacro?/nightly"] internals = [] [package.metadata.docs.rs] diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml index e7a8b65..e235bcc 100644 --- a/examples/define-styles/Cargo.toml +++ b/examples/define-styles/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "define-styles" version = "0.0.0" -edition = "2021" +edition = "2024" rust-version = "1.88" publish = false diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 162c94a..4a2994b 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -2,25 +2,33 @@ name = "leptos-axum-sabry" version = "0.1.0" rust-version = "1.88" -edition = "2021" +edition = "2024" publish = false [lib] crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "^0.8" } -leptos_axum = { version = "^0.8", optional = true } -leptos_meta = { version = "^0.8" } -leptos_router = { version = "^0.8" } -axum = { version = "0.8", optional = true } +leptos.version = "^0.8" +leptos_axum.version = "^0.8" +leptos_axum.optional = true +leptos_meta.version = "^0.8" +leptos_router.version = "^0.8" +axum.version = "0.8" +axum.optional = true console_error_panic_hook = "0.1" -tokio = { version = "1", features = ["rt-multi-thread"], optional = true } -tower = { version = "0.5", optional = true } -tower-http = { version = "0.6", features = ["fs"], optional = true } -wasm-bindgen = "=0.2.96" +tokio.version = "1" +tokio.features = ["rt-multi-thread"] +tokio.optional = true +tower.version = "0.5" +tower.optional = true +tower-http.version = "0.6" +tower-http.features = ["fs"] +tower-http.optional = true +wasm-bindgen = "=0.2.114" thiserror = "^1" -tracing = { version = "0.1", optional = true } +tracing.version = "0.1" +tracing.optional = true http = "^1" # sabry with sass diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml index 2d0f28b..2a7cd5b 100644 --- a/examples/leptos-components/Cargo.toml +++ b/examples/leptos-components/Cargo.toml @@ -2,16 +2,16 @@ name = "leptos-components" version = "0.1.0" rust-version = "1.88" -edition = "2021" +edition = "2024" publish = false [lib] crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "^0.7" } -leptos_meta = { version = "^0.7" } -leptos_router = { version = "^0.7" } +leptos.version = "^0.8" +leptos_meta.version = "^0.8" +leptos_router.version = "^0.8" sabry = { path = "../../", features = ["const-scoping"] } diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml index fa3bd23..9a665b8 100644 --- a/examples/use-styles/Cargo.toml +++ b/examples/use-styles/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "use-styles" version = "0.0.0" -edition = "2021" +edition = "2024" rust-version = "1.88" publish = false diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index 939f3e1..e078f81 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -11,14 +11,10 @@ license.workspace = true [dependencies] syn.workspace = true raffia.workspace = true -regex.workspace = true -regex.optional = true grass.workspace = true grass.optional = true lightningcss.workspace = true lightningcss.optional = true -blake3.workspace = true -blake3.optional = true base64.workspace = true base64.optional = true @@ -29,7 +25,7 @@ toml.workspace = true cfg-if.workspace = true [features] -scope = ["dep:blake3", "dep:base64", "dep:regex"] +scope = ["dep:base64"] compile = ["dep:lightningcss", "dep:grass"] [package.metadata.docs.rs] diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs index fe539fe..c6e6844 100644 --- a/sabry_intrnl/src/scoper/hash.rs +++ b/sabry_intrnl/src/scoper/hash.rs @@ -7,19 +7,20 @@ impl ScopeHash { pub fn new(scope: &super::ArbitraryScope, config: &crate::config::SabryHashConfig) -> Self { use base64::Engine; use raffia::ast::InterpolableIdent; + use std::hash::Hasher; - use crate::scoper::apply_basic_rusty_member_gen_rules; + use crate::scoper::sanitize_css_member; - let mut hasher = blake3::Hasher::new(); + let mut hasher = std::hash::DefaultHasher::new(); if config.use_scope_name { - hasher.update(scope.name.to_string().as_bytes()); + hasher.write(scope.name.to_string().as_bytes()); } if config.use_code_text { - hasher.update(scope.adapter().source().as_bytes()); + hasher.write(scope.adapter().source().as_bytes()); } if config.use_code_size { - hasher.update(&scope.adapter().source().len().to_ne_bytes()); + hasher.write(&scope.adapter().source().len().to_ne_bytes()); } if config.use_item_names { let classes = scope.adapter().class_selectors(); @@ -38,22 +39,13 @@ impl ScopeHash { .filter_map(|mbl| mbl.map(|l| l.raw)) .collect::<String>(); - hasher.update(merged_items.as_bytes()); + hasher.write(merged_items.as_bytes()); } - let size = if config.size >= blake3::OUT_LEN { - blake3::OUT_LEN - } else { - config.size - }; + let hash = hasher.finish().to_be_bytes(); - let hash = hasher.finalize(); - let hash = hash.as_bytes(); - - //? This isn't right. "size" is size of hash in symbols. - // naaah, its fine :D (Dan) - let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(&hash[..size]); - let hash = apply_basic_rusty_member_gen_rules(&hash); + let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(hash); + let hash = sanitize_css_member(&hash); Self(hash) } diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 2b0d2dd..ab3b5d6 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -2,11 +2,11 @@ use std::fmt::Debug; use hash::ScopeHash; use raffia::{ - ast::{InterpolableIdent, TypeSelector}, Span, Spanned, + ast::{InterpolableIdent, TypeSelector}, }; -use crate::syntax::{ostrta::OneSyntaxToRuleThemAll, StylesheetAdapter}; +use crate::syntax::{StylesheetAdapter, ostrta::OneSyntaxToRuleThemAll}; pub mod hash; @@ -312,7 +312,7 @@ impl ScopedSelector { #[cfg(feature = "scope")] pub fn gen_rusty_ident(&self) -> Option<syn::Ident> { let arb = &self.as_arbitrary().ident; - let basic = apply_basic_rusty_member_gen_rules(arb); + let basic = sanitize_css_member(arb); let ready = match self { Self::Class(_) => Some(basic), @@ -376,34 +376,35 @@ impl ScopedSelector { } #[cfg(feature = "scope")] -pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { - let omit_regex = regex::Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") - .expect("BUG: can not build omition regex for rusty member generation"); - - // omit forbidden chars - let cleaned = omit_regex.replace_all(source, "").to_string(); - - // other not-so-obvious rules - let mut target = String::with_capacity(cleaned.len()); +pub fn sanitize_css_member(source: &str) -> String { + let mut target = String::with_capacity(source.len()); let mut next_uppercase: bool = false; - for (i, c) in cleaned.chars().enumerate() { + for (i, c) in source + .chars() + .filter(|c| c.is_alphanumeric() || *c == '-') + .enumerate() + { // first gidit is prepended with 'n' if i == 0 && c.is_numeric() { target.push('n'); target.push(c); continue; } - // dash is omitted and next is uppercase if may be + + // dash is omitted, replacing the next char with its uppercase if c == '-' { next_uppercase = true; continue; } - target.push(if next_uppercase { + + let char = if next_uppercase { next_uppercase = false; c.to_ascii_uppercase() } else { c - }); + }; + + target.push(char); } target } @@ -416,7 +417,7 @@ mod test { use crate::{ config::SabryHashConfig, - scoper::{hash::ScopeHash, HashedScope}, + scoper::{HashedScope, hash::ScopeHash}, syntax::ostrta::OneSyntaxToRuleThemAll, }; @@ -424,20 +425,11 @@ mod test { #[test] fn scope_hash_codegen() { - let code = - ".cls1{color:red; &-dark{color: black;} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; + let code = ".cls1{color:red; &-dark{color: black;} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; let hash = ScopeHash::test_init("F2kf8nMs".into()); - //cfg_if! { - //if #[cfg(feature = "lepty-scoping")]{ let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #id1.F2kf8nMs {color:green;} div.F2kf8nMs {color:blue;}} .F2kf8nMs.cls3#id2.F2kf8nMs{color: black;}"; - //} else { - // let expect_code = ".F2kf8nMs.cls1{color:red; &-dark{color: black;} #F2kf8nMs-id1 {color:green;} .F2kf8nMs div {color:blue;}} .F2kf8nMs.cls3#F2kf8nMs-id2{color: black;}"; - //} - //} - // cfg_if! { - // if #[cfg(feature = "lepty-scoping")] { let expect_selector_htmls = HashSet::from([ "cls1".to_string(), "id1".to_string(), @@ -445,16 +437,6 @@ mod test { "id2".to_string(), "".to_string(), // comes from `div` which has no html hashed code, still want to check presense ]); - // } else { - // let expect_selector_htmls = HashSet::from([ - // "F2kf8nMs cls1".to_string(), - // "F2kf8nMs-id1".to_string(), - // "F2kf8nMs cls3".to_string(), - // "F2kf8nMs-id2".to_string(), - // "".to_string(), // comes from `div` which has no html hashed code, still want to check presense - // ]); - // } - //} let scope = ArbitraryScope::from_source( OneSyntaxToRuleThemAll::Scss, diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 12758de..13e4092 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -13,10 +13,8 @@ proc-macro = true [dependencies] sabry_procmacro_impl.workspace = true -cfg-if.workspace = true [features] -nightly = [] const-compile = ["sabry_procmacro_impl/const-compile"] [package.metadata.docs.rs] diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index 98f056a..827576c 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -1,9 +1,8 @@ #![doc = include_str!("../README.md")] -#![cfg_attr(feature = "nightly", feature(proc_macro_span))] +use std::path::PathBuf; use std::str::FromStr; -use cfg_if::cfg_if; use proc_macro::TokenStream; use sabry_procmacro_impl::impls::{ scssy::scssy_macro_impl, styly::styly_macro_impl, usey::usey_macro_impl, @@ -38,17 +37,8 @@ use sabry_procmacro_impl::impls::{ /// #[proc_macro] pub fn scssy(input: TokenStream) -> TokenStream { - cfg_if! { - if #[cfg(feature = "nightly")] { - use proc_macro::Span; - use std::path::PathBuf; - let source_path = Some(PathBuf::from_str( - &Span::call_site().file()).expect("&str to be Infallible converted into PathBuf") - ); - } else { - let source_path = None; - } - } + let source_path = + PathBuf::from_str(&proc_macro::Span::call_site().file()).expect("Irrefutable result"); scssy_macro_impl(input.into(), source_path).into() } @@ -111,18 +101,8 @@ pub fn scssy(input: TokenStream) -> TokenStream { /// ``` #[proc_macro] pub fn styly(input: TokenStream) -> TokenStream { - cfg_if! { - if #[cfg(feature = "nightly")] { - use proc_macro::Span; - use std::path::PathBuf; - let source_path = Some(PathBuf::from_str( - &Span::call_site().file()).expect("&str to be Infallible converted into PathBuf") - ); - } else { - let source_path = None; - } - } - + let source_path = + PathBuf::from_str(&proc_macro::Span::call_site().file()).expect("Irrefutable result"); styly_macro_impl(input.into(), source_path).into() } diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index c82f67f..59b79d8 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -1,10 +1,10 @@ use std::{fmt::Debug, fs, path::PathBuf, str::FromStr}; use proc_macro2::{Span, TokenStream}; -use quote::{quote, ToTokens, TokenStreamExt}; +use quote::{ToTokens, TokenStreamExt, quote}; use regex::Regex; use sabry_intrnl::syntax::ostrta::OneSyntaxToRuleThemAll; -use syn::{braced, parse::Parse, Ident, LitStr, Token}; +use syn::{Ident, LitStr, Token, braced, parse::Parse}; pub mod scssy; pub mod styly; @@ -31,20 +31,15 @@ impl ArbitraryStyleBlock { &self.code } - pub fn parse_syn( - input: syn::parse::ParseStream, - use_code_path_prefix: Option<PathBuf>, - ) -> syn::Result<Self> { + pub fn parse_syn(input: syn::parse::ParseStream, path_prefix: PathBuf) -> syn::Result<Self> { let (code, span) = if let Ok(path_tok) = input.parse::<LitStr>() { - let path = if let Some(prefix) = use_code_path_prefix { + let path = { let p = path_tok.value(); if let Some(pp) = p.strip_prefix("./") { - prefix.join(pp) + path_prefix.join(pp) } else { - PathBuf::from_str(&p).expect("Unable to convert path into PathBuf") + PathBuf::from_str(&p).unwrap() // infallible } - } else { - PathBuf::from_str(&path_tok.value()).expect("Unable to convert path into PathBuf") }; let fullpath = match path.canonicalize() { @@ -52,8 +47,11 @@ impl ArbitraryStyleBlock { Err(e) => { return Err(syn::Error::new( path_tok.span(), - format!("Could not use path {path:?}: {:?}. If the path is relative and 'nightly' feature flag is set - this is likely false-positive", e.kind()), - )) + format!( + "Could not use path {path:?}: {:?}. If the path is relative and 'nightly' feature flag is set - this is likely false-positive", + e.kind() + ), + )); } }; @@ -63,7 +61,7 @@ impl ArbitraryStyleBlock { return Err(syn::Error::new( path_tok.span(), format!("Could not read file at {fullpath:?}"), - )) + )); } }; let code = String::from_utf8_lossy(&iofile).to_string(); @@ -79,7 +77,10 @@ impl ArbitraryStyleBlock { let c = ident_regex.replace_all(&c, "\n").to_string(); (c, stream.span()) } else { - return Err(syn::Error::new(s.span(), "Use \"\" within the braces to specify your SASS/SCSS. Unquoted style syntax is reserved for the future. Unquoted SCSS/SASS doesnt make sense though, as you won't benefit from it in rust file.\n\ntip: use `{\"style\"}` instead of `{style}`")); + return Err(syn::Error::new( + s.span(), + "Use \"\" within the braces to specify your SASS/SCSS. Unquoted style syntax is reserved for the future. Unquoted SCSS/SASS doesnt make sense though, as you won't benefit from it in rust file.\n\ntip: use `{\"style\"}` instead of `{style}`", + )); } }; @@ -87,12 +88,6 @@ impl ArbitraryStyleBlock { } } -impl Parse for ArbitraryStyleBlock { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { - Self::parse_syn(input, None) - } -} - #[allow(clippy::to_string_trait_impl)] impl ToString for ArbitraryStyleBlock { fn to_string(&self) -> String { @@ -148,56 +143,3 @@ impl Parse for ArbitraryStyleSyntax { } } } - -#[cfg(test)] -mod test { - #[test] - fn arbitrary_style_block_sass() { - use super::ArbitraryStyleBlock; - - let code = " - #a - co: red - .sel - co: white - &-dark - & > div - co: blue"; - let expect_code = " -#a - co: red -.sel - co: white -&-dark - & > div - co: blue"; - let input = format!("{{\"{code}\"}}"); - let block = syn::parse_str::<ArbitraryStyleBlock>(&input).unwrap(); - - assert_eq!(expect_code, block.code); - } - - #[test] - fn arbitrary_style_block_scss() { - use super::ArbitraryStyleBlock; - - let code = " - #a { - c: r; - } - .b.c { - c: 'into'; - }"; - let expect_code = " -#a { - c: r; -} -.b.c { - c: 'into'; -}"; - let input = format!("{{\"{code}\"}}"); - let block = syn::parse_str::<ArbitraryStyleBlock>(&input).unwrap(); - - assert_eq!(expect_code, block.code) - } -} diff --git a/sabry_procmacro_impl/src/impls/scssy.rs b/sabry_procmacro_impl/src/impls/scssy.rs index ddbee04..7ab9854 100644 --- a/sabry_procmacro_impl/src/impls/scssy.rs +++ b/sabry_procmacro_impl/src/impls/scssy.rs @@ -3,10 +3,7 @@ use std::path::PathBuf; use proc_macro2::TokenStream; use quote::quote; use sabry_intrnl::scoper::ArbitraryScope; -use syn::{ - parse::{Parse, ParseStream}, - Ident, -}; +use syn::{Ident, parse::ParseStream}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -16,7 +13,7 @@ use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; /// `$syntax`: sass/scss /// /// `$code`: intended to be valid based on $syntax -pub fn scssy_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> TokenStream { +pub fn scssy_macro_impl(input: TokenStream, source_path: PathBuf) -> TokenStream { let MacroSyntax { ident, syntax, @@ -36,7 +33,9 @@ pub fn scssy_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok } let sourcesass = code.to_string(); - let macro_doc = format!("Arbitrary {syntax:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `buildy` at build time"); + let macro_doc = format!( + "Arbitrary {syntax:?} code declared with `scssy!`. Pretty usable in tandem with `usey!` and `buildy` at build time" + ); quote! { #[doc = #macro_doc] @@ -55,17 +54,11 @@ pub struct MacroSyntax { } impl MacroSyntax { - pub fn parse_syn( - input: syn::parse::ParseStream, - source_path: Option<PathBuf>, - ) -> syn::Result<Self> { + pub fn parse_syn(input: syn::parse::ParseStream, source_path: PathBuf) -> syn::Result<Self> { let ident = input.parse::<Ident>()?; let syntax = input.parse::<ArbitraryStyleSyntax>()?; - let code = match source_path { - Some(sp) => ArbitraryStyleBlock::parse_syn(input, Some(sp))?, - None => input.parse::<ArbitraryStyleBlock>()?, - }; + let code = ArbitraryStyleBlock::parse_syn(input, source_path)?; Ok(Self { ident, @@ -75,11 +68,11 @@ impl MacroSyntax { } } -impl Parse for MacroSyntax { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { - Self::parse_syn(input, None) - } -} +// impl Parse for MacroSyntax { +// fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { +// Self::parse_syn(input, None) +// } +// } #[cfg(test)] mod test {} diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 0297c06..d8b6f91 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -6,11 +6,11 @@ use proc_macro2::{Span, TokenStream}; use quote::quote; use sabry_intrnl::{ config::SabryConfig, - scoper::{apply_basic_rusty_member_gen_rules, ArbitraryScope, ScopedSelector}, + scoper::{ArbitraryScope, ScopedSelector, sanitize_css_member}, }; use syn::{ - parse::{Parse, ParseStream}, Ident, Token, + parse::{Parse, ParseStream}, }; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -32,7 +32,7 @@ use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; /// /// The machine-readable output may also be forced by use `machine_readable: true` arg on `parse_macro_syntax` function /// without modifying tokenstream -pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> TokenStream { +pub fn styly_macro_impl(input: TokenStream, source_path: PathBuf) -> TokenStream { let config = match SabryConfig::require() { Ok(c) => c, Err(e) => { @@ -40,7 +40,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok Span::call_site(), format!("Could not read sabry configuration required by this macro: {e:?}",), ) - .to_compile_error() + .to_compile_error(); } }; let ms = match parse_macro_syntax(input, source_path) { @@ -62,7 +62,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok Span::call_site(), format!("Could not generate scope: {e:?}"), ) - .to_compile_error() + .to_compile_error(); } }; @@ -101,7 +101,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok }) .unique() .map(|s| { - let ident = apply_basic_rusty_member_gen_rules(&s); + let ident = sanitize_css_member(&s); let fnident = syn::parse_str::<Ident>(format!("_{ident}").as_str()) .expect("BUG: invalid ident for nesting selector formed"); let formatstr = format!("{{c}}{}", &s); @@ -223,7 +223,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option<PathBuf>) -> Tok // reusable function, that does not return tokenstream for machine-processing at build time pub fn parse_macro_syntax( input: TokenStream, - source_path: Option<PathBuf>, + source_path: PathBuf, ) -> Result<MacroSyntax, syn::Error> { syn::parse::Parser::parse2( |input: ParseStream<'_>| MacroSyntax::parse_syn(input, source_path), @@ -263,18 +263,11 @@ pub struct MacroSyntax { } impl MacroSyntax { - pub fn parse_syn( - input: syn::parse::ParseStream, - source_path: Option<PathBuf>, - ) -> syn::Result<Self> { + pub fn parse_syn(input: syn::parse::ParseStream, source_path: PathBuf) -> syn::Result<Self> { let mut generator = input.parse::<ScopeGenerator>()?; let scope = input.parse::<Ident>()?; let syntax = input.parse::<ArbitraryStyleSyntax>()?; - let code = if source_path.is_some() { - ArbitraryStyleBlock::parse_syn(input, source_path) - } else { - input.parse::<ArbitraryStyleBlock>() - }?; + let code = ArbitraryStyleBlock::parse_syn(input, source_path)?; if input.parse::<Token![#]>().is_ok() { generator = ScopeGenerator::MachineReadable @@ -288,9 +281,3 @@ impl MacroSyntax { }) } } - -impl Parse for MacroSyntax { - fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { - Self::parse_syn(input, None) - } -} From 8b8047de37b91abdf5f324270e895b5e9d6cea4a Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Mon, 5 Oct 2026 23:43:03 +0300 Subject: [PATCH 173/184] chore: 0.0.7: bump deps & light code cleanup --- Cargo.toml | 25 +- examples/define-styles/Cargo.lock | 1278 ++------------------- examples/define-styles/Cargo.toml | 3 +- examples/leptos-axum/Cargo.toml | 31 +- examples/leptos-axum/src/routes/home.rs | 53 +- examples/leptos-axum/src/routes/home.scss | 0 examples/leptos-components/Cargo.toml | 12 +- examples/use-styles/Cargo.lock | 1137 ++++++------------ examples/use-styles/Cargo.toml | 10 +- sabry_build/Cargo.toml | 18 +- sabry_build/src/filevisit.rs | 21 +- sabry_intrnl/Cargo.toml | 46 +- sabry_intrnl/src/scoper/mod.rs | 60 +- sabry_procmacro/Cargo.toml | 15 +- sabry_procmacro/src/lib.rs | 7 +- sabry_procmacro_impl/Cargo.toml | 40 +- sabry_procmacro_impl/src/impls/mod.rs | 2 +- sabry_procmacro_impl/src/impls/styly.rs | 6 +- tombi.toml | 9 + 19 files changed, 630 insertions(+), 2143 deletions(-) delete mode 100644 examples/leptos-axum/src/routes/home.scss create mode 100644 tombi.toml diff --git a/Cargo.toml b/Cargo.toml index 195a87b..b1bf54b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,15 +1,15 @@ [workspace] resolver = "3" members = [ - "sabry_procmacro", - "sabry_procmacro_impl", - "sabry_intrnl", - "sabry_build", + "sabry_procmacro", + "sabry_procmacro_impl", + "sabry_intrnl", + "sabry_build", ] exclude = ["examples"] [workspace.package] -version = "0.0.6" +version = "0.0.7" edition = "2024" rust-version = "1.88" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] @@ -19,12 +19,12 @@ publish = true [workspace.dependencies] ## Workspace -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.6" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.6" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.6" } -sabry_build = { path = "sabry_build", version = "0.0.6" } +sabry_intrnl = { path = "sabry_intrnl", version = "0.0.7" } +sabry_procmacro = { path = "sabry_procmacro", version = "0.0.7" } +sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.7" } +sabry_build = { path = "sabry_build", version = "0.0.7" } ## CSS -lightningcss.version = "1.0.0-alpha.71" +lightningcss.version = "1.0.0-alpha.72" lightningcss.default-features = false grass.version = "^0.13" grass.default-features = false @@ -32,7 +32,7 @@ raffia.version = "^0.12" ## Marshall serde.version = "^1" toml.version = "^1" -base64.version = "^0.22" +base64.version = "^0.23" regex.version = "^1" ## Util itertools.version = "^0.14" @@ -42,7 +42,7 @@ cfg-if.version = "^1" thiserror.version = "^2" proc-macro2.version = "^1" quote.version = "^1" -syn.version = "^2" +syn.version = "^3" [package] name = "sabry" @@ -73,6 +73,7 @@ procmacro = ["dep:sabry_procmacro"] build = ["dep:sabry_build"] net-files = ["sabry_build/net-files"] internals = [] +nightly = ["sabry_procmacro?/nightly"] [package.metadata.docs.rs] all-features = true diff --git a/examples/define-styles/Cargo.lock b/examples/define-styles/Cargo.lock index d1a55eb..d34dc05 100644 --- a/examples/define-styles/Cargo.lock +++ b/examples/define-styles/Cargo.lock @@ -2,371 +2,26 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - [[package]] name = "base64" -version = "0.22.1" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64-simd" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" -dependencies = [ - "simd-abstraction", -] - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake3" -version = "1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" - -[[package]] -name = "cc" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" -dependencies = [ - "shlex", -] +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" - -[[package]] -name = "codemap" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" - -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "const-str" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" -dependencies = [ - "const-str-proc-macro", -] - -[[package]] -name = "const-str-proc-macro" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "cssparser" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "phf", - "smallvec", -] - -[[package]] -name = "cssparser-color" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" -dependencies = [ - "cssparser", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.90", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "data-url" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" -dependencies = [ - "matches", -] +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "define-styles" @@ -375,101 +30,23 @@ dependencies = [ "sabry", ] -[[package]] -name = "dtoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - [[package]] name = "either" -version = "1.13.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "grass" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" -dependencies = [ - "clap", - "getrandom", - "grass_compiler", -] - -[[package]] -name = "grass_compiler" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" -dependencies = [ - "codemap", - "indexmap", - "lasso", - "once_cell", - "phf", - "rand", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.11", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" @@ -479,325 +56,52 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indexmap" -version = "2.7.0" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", - "hashbrown 0.15.2", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", + "hashbrown", ] [[package]] name = "itertools" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "js-sys" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "lasso" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.168" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" - -[[package]] -name = "lightningcss" -version = "1.0.0-alpha.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c9e1f991b3861d25bf872ecca2eb6a73f7a9fe671da047cd1f9b49c65cbc40" -dependencies = [ - "ahash 0.8.11", - "bitflags", - "const-str", - "cssparser", - "cssparser-color", - "dashmap", - "data-encoding", - "getrandom", - "indexmap", - "itertools 0.10.5", - "lazy_static", - "lightningcss-derive", - "parcel_selectors", - "parcel_sourcemap", - "paste", - "pathdiff", - "rayon", - "serde", - "smallvec", -] - -[[package]] -name = "lightningcss-derive" -version = "1.0.0-alpha.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "outref" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" - -[[package]] -name = "parcel_selectors" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7645c578d3a5c4cdf667af1ad39765f5f751c4883d251e050d5e1204b5cad0a9" -dependencies = [ - "bitflags", - "cssparser", - "log", - "phf", - "phf_codegen", - "precomputed-hash", - "rustc-hash", - "smallvec", -] - -[[package]] -name = "parcel_sourcemap" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" -dependencies = [ - "base64-simd", - "data-url", - "rkyv", - "serde", - "serde_json", - "vlq", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "quote" -version = "1.0.37" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - [[package]] name = "raffia" -version = "0.9.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" +checksum = "a589c5611a5f7713bf0c13e949c4c791a359ff517a9f27552475b470e8873229" dependencies = [ "raffia_macro", "smallvec", @@ -805,79 +109,20 @@ dependencies = [ [[package]] name = "raffia_macro" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" +checksum = "8ac21f5e4bc6b29ea5d5e691a9aa08b2b9fd8891f48a99157b9f02d8a48e1318" dependencies = [ "heck", "quote", - "syn 2.0.90", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags", + "syn 2.0.119", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -887,9 +132,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -898,63 +143,13 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rkyv" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rustc-hash" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "sabry" -version = "0.0.2" +version = "0.0.7" dependencies = [ "sabry_intrnl", "sabry_procmacro", @@ -962,141 +157,88 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.2" +version = "0.0.7" dependencies = [ "base64", - "blake3", "cfg-if", - "grass", - "lightningcss", - "proc-macro2", - "quote", "raffia", - "regex", "serde", - "syn 2.0.90", + "syn 3.0.6", "thiserror", "toml", ] [[package]] name = "sabry_procmacro" -version = "0.0.2" +version = "0.0.7" dependencies = [ - "cfg-if", "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.2" +version = "0.0.7" dependencies = [ - "itertools 0.13.0", + "cfg-if", + "itertools", "proc-macro2", "quote", "raffia", "regex", "sabry_intrnl", - "syn 2.0.90", + "syn 3.0.6", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "serde" -version = "1.0.216" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", -] - -[[package]] -name = "serde_json" -version = "1.0.133" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", + "syn 3.0.6", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ - "serde", + "serde_core", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "simd-abstraction" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" -dependencies = [ - "outref", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - [[package]] name = "smallvec" -version = "1.13.2" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -1105,294 +247,82 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "thiserror" -version = "1.0.69" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 3.0.6", ] -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "toml" -version = "0.8.19" +version = "1.1.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" dependencies = [ "indexmap", - "serde", + "serde_core", "serde_spanned", "toml_datetime", + "toml_parser", + "toml_writer", "winnow", ] +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vlq" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.90", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "winnow" -version = "0.6.20" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" -dependencies = [ - "memchr", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" diff --git a/examples/define-styles/Cargo.toml b/examples/define-styles/Cargo.toml index e235bcc..e6ca652 100644 --- a/examples/define-styles/Cargo.toml +++ b/examples/define-styles/Cargo.toml @@ -6,4 +6,5 @@ rust-version = "1.88" publish = false [dependencies] -sabry = { path = "../../", features = ["nightly"] } +sabry.path = "../../" +sabry.features = ["nightly"] diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 4a2994b..f5eea60 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -30,31 +30,32 @@ thiserror = "^1" tracing.version = "0.1" tracing.optional = true http = "^1" - # sabry with sass -sabry = { path = "../../" } - +sabry.path = "../../" # our component library -leptos-components = { path = "../leptos-components" } +leptos-components.version = "0.0.0" +leptos-components.path = "../leptos-components" [build-dependencies] # sabry for build with sass -sabry = { path = "../../", features = ["build"] } +sabry.path = "../../" +sabry.features = ["build"] # lets depend on our styles -define-styles = { path = "../define-styles" } +define-styles.version = "0.0.0" +define-styles.path = "../define-styles" [features] hydrate = ["leptos/hydrate"] ssr = [ - "dep:axum", - "dep:tokio", - "dep:tower", - "dep:tower-http", - "dep:leptos_axum", - "leptos/ssr", - "leptos_meta/ssr", - "leptos_router/ssr", - "dep:tracing", + "dep:axum", + "dep:tokio", + "dep:tower", + "dep:tower-http", + "dep:leptos_axum", + "leptos/ssr", + "leptos_meta/ssr", + "leptos_router/ssr", + "dep:tracing", ] [package.metadata.sabry] diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index 6d5e942..f077197 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -1,6 +1,32 @@ use leptos::prelude::*; use sabry::styly; +/// Renders the home page of your application. +#[component] +pub fn Route() -> impl IntoView { + // Creates a reactive value to update the button + let count = RwSignal::new(0); + let on_click = move |_| *count.write() += 1; + + view! {class = STYLE, + <leptos_components::Aside/> // lets use our component + <section class=style::table> + <h2>"Welcome to Leptos"</h2> + <h2 class=""> + "This head is styled with lepty-scopes feature" + <br/> + <span class="">"And this child too!"</span> + </h2> + + <button class=style::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <button class=style::_dark(style::btn) on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <span class=style::card>"DISCLAIMER:"</span> + <p class=style::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> + <p class=style::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> + </section> + } +} + styly!(style {" @use 'tokens'; @use 'utils'; @@ -34,31 +60,4 @@ styly!(style {" @include theme.surface(secondary); text-transform: uppercase; } - "}); - -/// Renders the home page of your application. -#[component] -pub fn Route() -> impl IntoView { - // Creates a reactive value to update the button - let count = RwSignal::new(0); - let on_click = move |_| *count.write() += 1; - - view! {class = STYLE, - <leptos_components::Aside/> // lets use our component - <section class=style::table> - <h2>"Welcome to Leptos"</h2> - <h2 class=""> - "This head is styled with lepty-scopes feature" - <br/> - <span class="">"And this child too!"</span> - </h2> - - <button class=style::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> - <button class=style::_dark(style::btn) on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> - <span class=style::card>"DISCLAIMER:"</span> - <p class=style::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> - <p class=style::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> - </section> - } -} diff --git a/examples/leptos-axum/src/routes/home.scss b/examples/leptos-axum/src/routes/home.scss deleted file mode 100644 index e69de29..0000000 diff --git a/examples/leptos-components/Cargo.toml b/examples/leptos-components/Cargo.toml index 2a7cd5b..bc1572c 100644 --- a/examples/leptos-components/Cargo.toml +++ b/examples/leptos-components/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "leptos-components" -version = "0.1.0" +version = "0.0.0" rust-version = "1.88" edition = "2024" publish = false @@ -12,12 +12,14 @@ crate-type = ["cdylib", "rlib"] leptos.version = "^0.8" leptos_meta.version = "^0.8" leptos_router.version = "^0.8" - -sabry = { path = "../../", features = ["const-scoping"] } +sabry.path = "../../" +sabry.features = ["const-scoping"] [build-dependencies] -sabry = { path = "../../", features = ["build", "const-scoping"] } -define-styles = { path = "../define-styles" } +sabry.path = "../../" +sabry.features = ["build", "const-scoping"] +define-styles.version = "0.0.0" +define-styles.path = "../define-styles" [features] hydrate = ["leptos/hydrate"] diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 1e07093..5405d75 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -4,23 +4,12 @@ version = 4 [[package]] name = "ahash" -version = "0.7.8" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -28,9 +17,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] @@ -41,200 +30,29 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - [[package]] name = "base64" -version = "0.22.1" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64-simd" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" -dependencies = [ - "simd-abstraction", -] +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake3" -version = "1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" - -[[package]] -name = "cc" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" -dependencies = [ - "shlex", -] +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "codemap" @@ -242,37 +60,11 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - [[package]] name = "const-str" -version = "0.3.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" -dependencies = [ - "const-str-proc-macro", -] - -[[package]] -name = "const-str-proc-macro" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "18f12cc9948ed9604230cdddc7c86e270f9401ccbe3c2e98a4378c5e7632212f" [[package]] name = "convert_case" @@ -283,90 +75,43 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - [[package]] name = "cssparser" -version = "0.33.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98" dependencies = [ "cssparser-macros", "dtoa-short", "itoa", - "phf", + "phf 0.13.1", "smallvec", ] [[package]] name = "cssparser-color" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +checksum = "bbaa233e1dcd9c13a5d3e3a8a2c0f5a727bac380398345dbcb31db4597edc86b" dependencies = [ "cssparser", ] [[package]] name = "cssparser-macros" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a" dependencies = [ "quote", - "syn 2.0.90", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", + "syn 3.0.6", ] [[package]] name = "data-encoding" -version = "2.6.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "data-url" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" -dependencies = [ - "matches", -] +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" [[package]] name = "define-styles" @@ -377,9 +122,9 @@ dependencies = [ [[package]] name = "dtoa" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" [[package]] name = "dtoa-short" @@ -392,27 +137,51 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "funty" -version = "2.0.0" +name = "fastrand" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -421,14 +190,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + [[package]] name = "grass" version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" dependencies = [ - "clap", - "getrandom", + "getrandom 0.2.17", "grass_compiler", ] @@ -442,17 +222,7 @@ dependencies = [ "indexmap", "lasso", "once_cell", - "phf", - "rand", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", + "phf 0.11.3", ] [[package]] @@ -461,15 +231,15 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", + "ahash", "allocator-api2", ] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" @@ -479,20 +249,16 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indexmap" -version = "2.7.0" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.17.1", + "serde", + "serde_core", ] -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - [[package]] name = "itertools" version = "0.10.5" @@ -504,26 +270,27 @@ dependencies = [ [[package]] name = "itertools" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] @@ -538,40 +305,36 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" [[package]] name = "libc" -version = "0.2.168" +version = "0.2.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] name = "lightningcss" -version = "1.0.0-alpha.61" +version = "1.0.0-alpha.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c9e1f991b3861d25bf872ecca2eb6a73f7a9fe671da047cd1f9b49c65cbc40" +checksum = "d31b760f96e8fdfe1d0c295e4bf76c503d6f15d2d470d53bd8cd1f7aa8c7d934" dependencies = [ - "ahash 0.8.11", + "ahash", "bitflags", "const-str", "cssparser", "cssparser-color", - "dashmap", "data-encoding", - "getrandom", + "getrandom 0.3.4", "indexmap", "itertools 0.10.5", "lazy_static", "lightningcss-derive", "parcel_selectors", - "parcel_sourcemap", - "paste", + "pastey", "pathdiff", - "rayon", - "serde", "smallvec", ] @@ -587,56 +350,34 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" -version = "0.4.22" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "outref" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "parcel_selectors" -version = "0.28.0" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7645c578d3a5c4cdf667af1ad39765f5f751c4883d251e050d5e1204b5cad0a9" +checksum = "d05f71e01edca03d245ab0a9f7ce13a974ceb79baaae8faf2ba0b11de6b90913" dependencies = [ "bitflags", "cssparser", "log", - "phf", + "phf 0.11.3", "phf_codegen", "precomputed-hash", "rustc-hash", @@ -644,37 +385,10 @@ dependencies = [ ] [[package]] -name = "parcel_sourcemap" -version = "2.1.1" +name = "pastey" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" -dependencies = [ - "base64-simd", - "data-url", - "rkyv", - "serde", - "serde_json", - "vlq", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] name = "pathdiff" @@ -684,65 +398,105 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_macros", - "phf_shared", + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", ] [[package]] name = "phf_codegen" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.11.3", + "phf_shared 0.11.3", ] [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared", + "phf_shared 0.11.3", "rand", ] [[package]] -name = "phf_macros" -version = "0.11.2" +name = "phf_generator" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ - "phf_generator", - "phf_shared", + "fastrand", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.119", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", ] [[package]] -name = "ppv-lite86" -version = "0.2.20" +name = "phf_shared" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" dependencies = [ - "zerocopy", + "siphasher", ] +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + [[package]] name = "precomputed-hash" version = "0.1.1" @@ -751,53 +505,33 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "quote" -version = "1.0.37" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] [[package]] -name = "radium" -version = "0.7.0" +name = "r-efi" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "raffia" -version = "0.9.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c36f58fa7ad2f26bca656054c902becddeac5582df2bb31d4b4d2a148c62cfd5" +checksum = "a589c5611a5f7713bf0c13e949c4c791a359ff517a9f27552475b470e8873229" dependencies = [ "raffia_macro", "smallvec", @@ -805,33 +539,21 @@ dependencies = [ [[package]] name = "raffia_macro" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fdb50eb5bf734fa5a770680a61876a6ec77b99c1e0e52d1f18ad6ebfa85759f" +checksum = "8ac21f5e4bc6b29ea5d5e691a9aa08b2b9fd8891f48a99157b9f02d8a48e1318" dependencies = [ "heck", "quote", - "syn 2.0.90", + "syn 2.0.119", ] [[package]] name = "rand" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", "rand_core", ] @@ -840,44 +562,12 @@ name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags", -] [[package]] name = "regex" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -887,9 +577,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -898,63 +588,25 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rkyv" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rustc-hash" -version = "2.1.0" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] -name = "ryu" -version = "1.0.18" +name = "rustversion" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "sabry" -version = "0.0.2" +version = "0.0.7" dependencies = [ "sabry_build", "sabry_intrnl", @@ -963,54 +615,50 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.2" +version = "0.0.7" dependencies = [ "proc-macro2", "sabry_intrnl", "sabry_procmacro_impl", - "syn 2.0.90", + "syn 3.0.6", "thiserror", "walkdir", ] [[package]] name = "sabry_intrnl" -version = "0.0.2" +version = "0.0.7" dependencies = [ "base64", - "blake3", "cfg-if", "grass", "lightningcss", - "proc-macro2", - "quote", "raffia", - "regex", "serde", - "syn 2.0.90", + "syn 3.0.6", "thiserror", "toml", ] [[package]] name = "sabry_procmacro" -version = "0.0.2" +version = "0.0.7" dependencies = [ - "cfg-if", "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.2" +version = "0.0.7" dependencies = [ - "itertools 0.13.0", + "cfg-if", + "itertools 0.14.0", "proc-macro2", "quote", "raffia", "regex", "sabry_intrnl", - "syn 2.0.90", + "syn 3.0.6", ] [[package]] @@ -1022,97 +670,62 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "serde" -version = "1.0.216" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", -] - -[[package]] -name = "serde_json" -version = "1.0.133" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", + "syn 3.0.6", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ - "serde", + "serde_core", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "simd-abstraction" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" -dependencies = [ - "outref", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - [[package]] name = "siphasher" -version = "0.3.11" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.13.2" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" [[package]] name = "syn" @@ -1127,9 +740,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -1137,91 +750,86 @@ dependencies = [ ] [[package]] -name = "tap" -version = "1.0.1" +name = "syn" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] [[package]] name = "thiserror" -version = "1.0.69" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 3.0.6", ] -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "toml" -version = "0.8.19" +version = "1.1.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" dependencies = [ "indexmap", - "serde", + "serde_core", "serde_spanned", "toml_datetime", + "toml_parser", + "toml_writer", "winnow", ] [[package]] -name = "unicode-ident" -version = "1.0.14" +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "use-styles" @@ -1231,30 +839,12 @@ dependencies = [ "sabry", ] -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" - [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vlq" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" - [[package]] name = "walkdir" version = "2.5.0" @@ -1267,40 +857,37 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasm-bindgen" -version = "0.2.99" +name = "wasip2" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.99" +name = "wasm-bindgen" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.90", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1308,140 +895,78 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.90", - "wasm-bindgen-backend", + "syn 3.0.6", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +dependencies = [ + "unicode-ident", +] [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-targets", + "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - [[package]] name = "winnow" -version = "0.6.20" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" -dependencies = [ - "memchr", -] +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" [[package]] -name = "wyz" -version = "0.5.1" +name = "wit-bindgen" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.119", ] diff --git a/examples/use-styles/Cargo.toml b/examples/use-styles/Cargo.toml index 9a665b8..4992bc1 100644 --- a/examples/use-styles/Cargo.toml +++ b/examples/use-styles/Cargo.toml @@ -6,11 +6,15 @@ rust-version = "1.88" publish = false [dependencies] -sabry = { path = "../../", features = ["nightly"] } +sabry.version = "0.0.7" +sabry.path = "../../" +sabry.features = ["nightly"] [build-dependencies] -sabry = { path = "../../", features = ["build", "nightly"] } -define-styles = { path = "../define-styles" } +sabry.path = "../../" +sabry.features = ["build"] +define-styles.version = "0.0.0" +define-styles.path = "../define-styles" [package.metadata.sabry] css.bundle = "target/static/style.css" diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index dfa13e8..3ac6e7f 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -1,29 +1,29 @@ [package] name = "sabry_build" -description = "Sabry build magic as a separate crate" version.workspace = true -repository.workspace = true +authors.workspace = true edition.workspace = true rust-version.workspace = true -authors.workspace = true +description = "Sabry build magic as a separate crate" +repository.workspace = true license.workspace = true +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + [dependencies] sabry_intrnl.workspace = true sabry_intrnl.features = ["compile", "scope"] sabry_procmacro_impl.workspace = true sabry_procmacro_impl.features = ["const-compile"] -syn.workspace = true -syn.features = ["visit", "derive", "parsing", "full"] proc-macro2.workspace = true proc-macro2.features = ["span-locations"] +syn.workspace = true +syn.features = ["derive", "full", "parsing", "visit"] thiserror.workspace = true walkdir.workspace = true [features] net-files = [] - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] diff --git a/sabry_build/src/filevisit.rs b/sabry_build/src/filevisit.rs index 8574a4b..4faf3fa 100644 --- a/sabry_build/src/filevisit.rs +++ b/sabry_build/src/filevisit.rs @@ -50,14 +50,19 @@ impl<'ast> Visit<'ast> for StylyVisitor { node.mac.span() ) }); - let macro_data = - styly::parse_macro_syntax(body, self.path.parent().map(|p| p.to_owned())) - .unwrap_or_else(|e| { - panic!( - "could not parse `styly!` macro at {:?}: {e:?}", - node.mac.span() - ) - }); + let source_path = self.path.parent().unwrap_or_else(|| { + panic!( + "could not find source_file at {:?}: none parent exists", + node.mac.span() + ) + }); + let macro_data = styly::parse_macro_syntax(body, source_path.to_owned()) + .unwrap_or_else(|e| { + panic!( + "could not parse `styly!` macro at {:?}: {e:?}", + node.mac.span() + ) + }); self.found_stylys.push(macro_data); } } diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index e078f81..d6e7339 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -1,33 +1,33 @@ [package] name = "sabry_intrnl" -description = "Sabry internal, yet still public library" version.workspace = true -repository.workspace = true +authors.workspace = true edition.workspace = true rust-version.workspace = true -authors.workspace = true +description = "Sabry internal, yet still public library" +repository.workspace = true license.workspace = true -[dependencies] -syn.workspace = true -raffia.workspace = true -grass.workspace = true -grass.optional = true -lightningcss.workspace = true -lightningcss.optional = true -base64.workspace = true -base64.optional = true - -thiserror.workspace = true -serde.workspace = true -serde.features = ["derive"] -toml.workspace = true -cfg-if.workspace = true - -[features] -scope = ["dep:base64"] -compile = ["dep:lightningcss", "dep:grass"] - [package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +base64.workspace = true +base64.optional = true +grass.workspace = true +grass.optional = true +lightningcss.workspace = true +lightningcss.optional = true +raffia.workspace = true +syn.workspace = true + +cfg-if.workspace = true +serde.workspace = true +serde.features = ["derive"] +thiserror.workspace = true +toml.workspace = true + +[features] +compile = ["dep:grass", "dep:lightningcss"] +scope = ["dep:base64"] diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index ab3b5d6..4d6ad29 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -377,35 +377,43 @@ impl ScopedSelector { #[cfg(feature = "scope")] pub fn sanitize_css_member(source: &str) -> String { - let mut target = String::with_capacity(source.len()); - let mut next_uppercase: bool = false; - for (i, c) in source - .chars() - .filter(|c| c.is_alphanumeric() || *c == '-') - .enumerate() - { - // first gidit is prepended with 'n' - if i == 0 && c.is_numeric() { - target.push('n'); - target.push(c); - continue; + let mut target = String::with_capacity(source.len() + 1); + + for part in source.split('-').filter(|p| !p.is_empty()) { + let mut chars = part.chars().filter(|c| c.is_ascii() && c.is_alphanumeric()); + match (chars.next(), chars.next()) { + (None, None) => continue, + (Some(f), None) => { + target.push(f); + continue; + } + (Some(f), Some(s)) => { + target.push(f.to_ascii_uppercase()); + target.push(s); + } + (None, Some(s)) => { + target.push(s); + continue; + } } - // dash is omitted, replacing the next char with its uppercase - if c == '-' { - next_uppercase = true; - continue; - } - - let char = if next_uppercase { - next_uppercase = false; - c.to_ascii_uppercase() - } else { - c - }; - - target.push(char); + chars.for_each(|c| target.push(c)); } + + match target.chars().next() { + Some(c) if c.is_numeric() => { + target.insert(0, 'n'); + } + Some(c) => { + target.replace_range(..1, &c.to_ascii_lowercase().to_string()); + } + _ => { + /* has to produce valid rust ident */ + target.clear(); + target.push_str("unknown"); + } + } + target } diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 13e4092..99262d8 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -1,13 +1,17 @@ [package] name = "sabry_procmacro" -description = "Sabry proc-macro declarations" version.workspace = true -repository.workspace = true +authors.workspace = true edition.workspace = true rust-version.workspace = true -authors.workspace = true +description = "Sabry proc-macro declarations" +repository.workspace = true license.workspace = true +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + [lib] proc-macro = true @@ -16,7 +20,4 @@ sabry_procmacro_impl.workspace = true [features] const-compile = ["sabry_procmacro_impl/const-compile"] - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] +nightly = ["sabry_procmacro_impl/nightly"] diff --git a/sabry_procmacro/src/lib.rs b/sabry_procmacro/src/lib.rs index 827576c..84363ea 100644 --- a/sabry_procmacro/src/lib.rs +++ b/sabry_procmacro/src/lib.rs @@ -37,8 +37,11 @@ use sabry_procmacro_impl::impls::{ /// #[proc_macro] pub fn scssy(input: TokenStream) -> TokenStream { - let source_path = - PathBuf::from_str(&proc_macro::Span::call_site().file()).expect("Irrefutable result"); + let source_path = PathBuf::from_str(&proc_macro::Span::call_site().file()) + .expect("Irrefutable result") + .parent() + .expect("The scssy procmacro callsite source file has no parent dir") + .to_owned(); scssy_macro_impl(input.into(), source_path).into() } diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index 05646ba..229540a 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -1,30 +1,30 @@ [package] name = "sabry_procmacro_impl" -description = "Sabry proc-macro internals reusable outside of proc-macro context" version.workspace = true -repository.workspace = true +authors.workspace = true edition.workspace = true rust-version.workspace = true -authors.workspace = true +description = "Sabry proc-macro internals reusable outside of proc-macro context" +repository.workspace = true license.workspace = true -[dependencies] -sabry_intrnl.workspace = true -sabry_intrnl.features = ["scope"] -raffia.workspace = true -syn.workspace = true -syn.features = ["parsing"] -quote.workspace = true -proc-macro2.workspace = true -proc-macro2.features = ["span-locations"] -regex.workspace = true -itertools.workspace = true -cfg-if.workspace = true - -[features] -nightly = [] -const-compile = ["sabry_intrnl/compile"] - [package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +cfg-if.workspace = true +itertools.workspace = true +proc-macro2.workspace = true +proc-macro2.features = ["span-locations"] +quote.workspace = true +raffia.workspace = true +regex.workspace = true +sabry_intrnl.workspace = true +sabry_intrnl.features = ["scope"] +syn.workspace = true +syn.features = ["parsing"] + +[features] +const-compile = ["sabry_intrnl/compile"] +nightly = [] diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index 59b79d8..eaac922 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -48,7 +48,7 @@ impl ArbitraryStyleBlock { return Err(syn::Error::new( path_tok.span(), format!( - "Could not use path {path:?}: {:?}. If the path is relative and 'nightly' feature flag is set - this is likely false-positive", + "Could not use path {path:?}: {:?}. If the path is relative, nightly rust has to be used and `nightly` feature flag has to be set", e.kind() ), )); diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index d8b6f91..cf0d81b 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -89,14 +89,12 @@ pub fn styly_macro_impl(input: TokenStream, source_path: PathBuf) -> TokenStream _ => None, }; - let interp = interp.and_then(|i| match i.elements.first() { + interp.and_then(|i| match i.elements.first() { Some(raffia::ast::SassInterpolatedIdentElement::Static(i)) => { Some(i.raw.to_string()) } _ => None, - }); - - interp + }) }) }) .unique() diff --git a/tombi.toml b/tombi.toml new file mode 100644 index 0000000..9d8da2c --- /dev/null +++ b/tombi.toml @@ -0,0 +1,9 @@ +[[schemas]] +path = "tombi://www.schemastore.org/cargo.json" +include = ["Cargo.toml"] +format.rules.array-values-order.enabled = false +format.rules.table-keys-order.enabled = false + +[[schemas.overrides]] +targets = ["workspace.dependencies", "dependencies", "dev-dependencies", "build-dependencies"] +format.rules = { table-keys-order.enabled = false } From e4d042660d1510505071b226105f6b819fc5c90e Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Mon, 5 Oct 2026 23:58:44 +0300 Subject: [PATCH 174/184] chore: 0.0.7 cleanup --- .gitignore | 1 + Cargo.toml | 6 +++--- deny.toml | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 deny.toml diff --git a/.gitignore b/.gitignore index ae8e48f..5a8005a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ rust-toolchain.toml .vscode .profile +.envrc /Cargo.lock /tests/sabry_intermediate /tests/sabry_output diff --git a/Cargo.toml b/Cargo.toml index b1bf54b..78f0188 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ exclude = ["examples"] [workspace.package] version = "0.0.7" edition = "2024" -rust-version = "1.88" +rust-version = "1.89" authors = ["Svyatoslav Pushkarev <yiffyrusdev@yandex.ru>"] repository = "https://github.com/yiffyrusdev/sabry" license = "MIT" @@ -28,14 +28,14 @@ lightningcss.version = "1.0.0-alpha.72" lightningcss.default-features = false grass.version = "^0.13" grass.default-features = false -raffia.version = "^0.12" +raffia.version = "^0.13" ## Marshall serde.version = "^1" toml.version = "^1" base64.version = "^0.23" regex.version = "^1" ## Util -itertools.version = "^0.14" +itertools.version = "^0.15" walkdir.version = "^2" ## Codegen cfg-if.version = "^1" diff --git a/deny.toml b/deny.toml new file mode 100644 index 0000000..d7a99c2 --- /dev/null +++ b/deny.toml @@ -0,0 +1,52 @@ +[graph] +targets = [ + {triple = "x86_64-unknown-linux-gnu"}, +] +all-features = false +no-default-features = false + +[output] +feature-depth = 1 + +[advisories] +db-urls = ["https://github.com/rustsec/advisory-db"] +ignore = [] + +[licenses] +allow = [ + "MIT", + "Apache-2.0", + "Apache-2.0 WITH LLVM-exception", + "BSD-2-Clause", + "CC0-1.0", + "Unlicense", + "Unicode-3.0", +] +confidence-threshold = 0.8 +exceptions = [] + +[licenses.private] +ignore = true +registries = [] + +[bans] +multiple-versions = "warn" +wildcards = "deny" +highlight = "simplest-path" +workspace-default-features = "allow" +external-default-features = "allow" +allow = [] +allow-workspace = false +deny = [] +skip-tree = [] + +[sources] +unknown-registry = "warn" +unknown-git = "warn" +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +allow-git = [] + +[sources.allow-org] +github = [] +gitlab = [] +bitbucket = [] From 8ac175433ad96263eb844351c6f4298a1c732f5e Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:02:58 +0300 Subject: [PATCH 175/184] chore: 0.0.7 approve new test snapshots --- .../compilation_with_buildy@bundle.css.snap | 257 +++++++++--------- ...n_with_buildy@scopes__global_scss.css.snap | 18 +- ..._buildy@scopes__module_usage_sass.css.snap | 48 ++-- ..._buildy@scopes__module_usage_scss.css.snap | 48 ++-- ...y@scopes__repeating_selector_sass.css.snap | 16 +- ...y@scopes__repeating_selector_scss.css.snap | 24 +- ...ith_buildy@scopes__sole_code_sass.css.snap | 12 +- ...ith_buildy@scopes__sole_code_scss.css.snap | 12 +- ...buildy@scopes__use_forwarded_sass.css.snap | 48 ++-- ...buildy@scopes__use_forwarded_scss.css.snap | 48 ++-- 10 files changed, 256 insertions(+), 275 deletions(-) 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 9b70a49..f40ca0f 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -1,358 +1,357 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/bundle.css --- -.wZIQboPSLZ8aKu0MjXHwYg.p1 { +.n4aLPsz0DYTE.p1 { font-size: 10px; color: #fff; } -.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { +.n4aLPsz0DYTE.p1-dark { color: #000; } -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { +html.mob .n4aLPsz0DYTE.p1 { font-size: 1rem; } -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { +html.mob .n4aLPsz0DYTE.p1-dark { color: green; } -ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { +ie some.n4aLPsz0DYTE html.mob .n4aLPsz0DYTE.p1 { border: 1px; } -html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { +html.dark .n4aLPsz0DYTE.p1 { color: orange; } -whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { +whatever .n4aLPsz0DYTE.p1 { background: #ff0; } -ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { +ooops whatever .n4aLPsz0DYTE.p1 { border: none; } -.n5vGKZlIscA58H8d7ZMOhSw.coated { +.nKenbAxSNs.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after { +.nKenbAxSNs.coated:after { content: "Colored"; color: green; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { +.nKenbAxSNs.coated:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { +.nKenbAxSNs.coated:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after { +.nKenbAxSNs.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { +.nKenbAxSNs.coated:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { +.nKenbAxSNs.coated:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark { +.nKenbAxSNs.coated-dark { color: #c6c6c6; background-color: #0ff; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after { +.nKenbAxSNs.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after:hover { +.nKenbAxSNs.coated-dark:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:hover { +.nKenbAxSNs.coated-dark:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated-dark a.nKenbAxSNs { color: #c6c6c6; background-color: #0ff; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:after { content: "Colored"; color: #00f; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs { color: #fff; background-color: green; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:after { content: "Colored"; color: #000; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated span.nKenbAxSNs { color: #c6c6c6; background-color: #0ff; display: block; } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated span.nKenbAxSNs:after { content: "Colored"; color: green; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated span.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated span.nKenbAxSNs:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated { +.mMNbTGLet9k.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after { +.mMNbTGLet9k.coated:after { content: "Colored"; color: green; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { +.mMNbTGLet9k.coated:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated:hover { +.mMNbTGLet9k.coated:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated:after { +.mMNbTGLet9k.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { +.mMNbTGLet9k.coated:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated:hover { +.mMNbTGLet9k.coated:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark { +.mMNbTGLet9k.coated-dark { color: #c6c6c6; background-color: #0ff; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after { +.mMNbTGLet9k.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after:hover { +.mMNbTGLet9k.coated-dark:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:hover { +.mMNbTGLet9k.coated-dark:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k { color: #c6c6c6; background-color: #0ff; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:after { content: "Colored"; color: #00f; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k { color: #fff; background-color: green; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:after { content: "Colored"; color: #000; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated span.mMNbTGLet9k { color: #c6c6c6; background-color: #0ff; display: block; } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated span.mMNbTGLet9k:after { content: "Colored"; color: green; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated span.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated span.mMNbTGLet9k:hover { transform: translateX(10%); } -.rWkBO00R__2y_lbRfXlyg.el1 { +.xm0JxM8Vqpg.el1 { color: red; } -.rWkBO00R__2y_lbRfXlyg.el1-mob { +.xm0JxM8Vqpg.el1-mob { color: #00f; } -.rWkBO00R__2y_lbRfXlyg.el1__blist { +.xm0JxM8Vqpg.el1__blist { list-style: none; } -.rWkBO00R__2y_lbRfXlyg.el2 { +.xm0JxM8Vqpg.el2 { color: #fff; } -.rWkBO00R__2y_lbRfXlyg.el2-mob { +.xm0JxM8Vqpg.el2-mob { color: #000; } -.rWkBO00R__2y_lbRfXlyg.el2__blist { +.xm0JxM8Vqpg.el2__blist { background: #fff; } -.rWkBO00R__2y_lbRfXlyg.el2__blist-mob { +.xm0JxM8Vqpg.el2__blist-mob { background: #000; } -.n9m9Me_zRl6xP8NIGObY_A.el1 { +.wCmhvw6X7vw.el1 { color: red; } -.n9m9Me_zRl6xP8NIGObY_A.el1-mob { +.wCmhvw6X7vw.el1-mob { color: #00f; } -.n9m9Me_zRl6xP8NIGObY_A.el1__blist { +.wCmhvw6X7vw.el1__blist { list-style: none; } -.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { +.wCmhvw6X7vw.el1.wCmhvw6X7vw.sub { margin: 0; } -.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { +.wCmhvw6X7vw.bus .wCmhvw6X7vw.el1 { padding: 0; } -.n9m9Me_zRl6xP8NIGObY_A.el2 { +.wCmhvw6X7vw.el2 { color: #fff; } -.n9m9Me_zRl6xP8NIGObY_A.el2-mob { +.wCmhvw6X7vw.el2-mob { color: #000; } -.n9m9Me_zRl6xP8NIGObY_A.el2__blist { +.wCmhvw6X7vw.el2__blist { background: #fff; } -.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { +.wCmhvw6X7vw.el2__blist-mob { background: #000; } -.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { +.wCmhvw6X7vw.el2.wCmhvw6X7vw.sub { margin: 0; } -.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { +.wCmhvw6X7vw.el2 .wCmhvw6X7vw.bus { margin: 0; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz { +.vnm6NZhBSSY.fuzz { background-color: red; display: block; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark { +.vnm6NZhBSSY.fuzz-dark { background-color: #000; color: #fff; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz-dark a.vnm6NZhBSSY { text-transform: uppercase; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w img.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz-dark a.vnm6NZhBSSY img.vnm6NZhBSSY { position: absolute; top: 0; left: 10rem; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz span.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz span.vnm6NZhBSSY { position: relative; display: grid; grid-template-areas: "a b c" @@ -361,27 +360,27 @@ ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { display: block; } -.FT5yVVwswyLvNU3dIk0qw.fuzz { +.n3N0gcUIyf7I.fuzz { background-color: red; display: block; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark { +.n3N0gcUIyf7I.fuzz-dark { background-color: #000; color: #fff; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz-dark a.n3N0gcUIyf7I { text-transform: uppercase; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw img.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz-dark a.n3N0gcUIyf7I img.n3N0gcUIyf7I { position: absolute; top: 0; left: 10rem; } -.FT5yVVwswyLvNU3dIk0qw.fuzz span.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz span.n3N0gcUIyf7I { position: relative; display: grid; grid-template-areas: "a b c" @@ -390,226 +389,226 @@ ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { display: block; } -.qK4fsMeZRSTGObSesXXRBA.coated { +.dGuHauwffw.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.qK4fsMeZRSTGObSesXXRBA.coated:after { +.dGuHauwffw.coated:after { content: "Colored"; color: green; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { +.dGuHauwffw.coated:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated:hover { +.dGuHauwffw.coated:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated:after { +.dGuHauwffw.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { +.dGuHauwffw.coated:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated:hover { +.dGuHauwffw.coated:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark { +.dGuHauwffw.coated-dark { color: #c6c6c6; background-color: #0ff; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:after { +.dGuHauwffw.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:after:hover { +.dGuHauwffw.coated-dark:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:hover { +.dGuHauwffw.coated-dark:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated-dark a.dGuHauwffw { color: #c6c6c6; background-color: #0ff; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated-dark a.dGuHauwffw:after { content: "Colored"; color: #00f; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw { color: #fff; background-color: green; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:after { content: "Colored"; color: #000; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated span.dGuHauwffw { color: #c6c6c6; background-color: #0ff; display: block; } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated span.dGuHauwffw:after { content: "Colored"; color: green; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated span.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated span.dGuHauwffw:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated { +.h9QvS1beJbo.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after { +.h9QvS1beJbo.coated:after { content: "Colored"; color: green; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { +.h9QvS1beJbo.coated:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated:hover { +.h9QvS1beJbo.coated:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated:after { +.h9QvS1beJbo.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { +.h9QvS1beJbo.coated:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated:hover { +.h9QvS1beJbo.coated:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark { +.h9QvS1beJbo.coated-dark { color: #c6c6c6; background-color: #0ff; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after { +.h9QvS1beJbo.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after:hover { +.h9QvS1beJbo.coated-dark:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:hover { +.h9QvS1beJbo.coated-dark:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo { color: #c6c6c6; background-color: #0ff; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:after { content: "Colored"; color: #00f; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo { color: #fff; background-color: green; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:after { content: "Colored"; color: #000; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated span.h9QvS1beJbo { color: #c6c6c6; background-color: #0ff; display: block; } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated span.h9QvS1beJbo:after { content: "Colored"; color: green; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated span.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated span.h9QvS1beJbo:hover { transform: translateX(10%); } diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap index a2a6ddf..e7abc3b 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__global_scss.css.snap @@ -1,38 +1,36 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/global_scss.css -snapshot_kind: text --- -.wZIQboPSLZ8aKu0MjXHwYg.p1 { +.n4aLPsz0DYTE.p1 { font-size: 10px; color: #fff; } -.wZIQboPSLZ8aKu0MjXHwYg.p1-dark { +.n4aLPsz0DYTE.p1-dark { color: #000; } -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { +html.mob .n4aLPsz0DYTE.p1 { font-size: 1rem; } -html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1-dark { +html.mob .n4aLPsz0DYTE.p1-dark { color: green; } -ie some.wZIQboPSLZ8aKu0MjXHwYg html.mob .wZIQboPSLZ8aKu0MjXHwYg.p1 { +ie some.n4aLPsz0DYTE html.mob .n4aLPsz0DYTE.p1 { border: 1px; } -html.dark .wZIQboPSLZ8aKu0MjXHwYg.p1 { +html.dark .n4aLPsz0DYTE.p1 { color: orange; } -whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { +whatever .n4aLPsz0DYTE.p1 { background: #ff0; } -ooops whatever .wZIQboPSLZ8aKu0MjXHwYg.p1 { +ooops whatever .n4aLPsz0DYTE.p1 { border: none; } diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap index 59776f1..57adc44 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_sass.css.snap @@ -1,117 +1,115 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/module_usage_sass.css -snapshot_kind: text --- -.n5vGKZlIscA58H8d7ZMOhSw.coated { +.nKenbAxSNs.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after { +.nKenbAxSNs.coated:after { content: "Colored"; color: green; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { +.nKenbAxSNs.coated:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { +.nKenbAxSNs.coated:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after { +.nKenbAxSNs.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover { +.nKenbAxSNs.coated:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated:hover { +.nKenbAxSNs.coated:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark { +.nKenbAxSNs.coated-dark { color: #c6c6c6; background-color: #0ff; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after { +.nKenbAxSNs.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after:hover { +.nKenbAxSNs.coated-dark:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:hover { +.nKenbAxSNs.coated-dark:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated-dark a.nKenbAxSNs { color: #c6c6c6; background-color: #0ff; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:after { content: "Colored"; color: #00f; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs { color: #fff; background-color: green; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:after { content: "Colored"; color: #000; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated-dark a.nKenbAxSNs img.nKenbAxSNs:hover { transform: translateX(10%); } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw { +.nKenbAxSNs.coated span.nKenbAxSNs { color: #c6c6c6; background-color: #0ff; display: block; } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after { +.nKenbAxSNs.coated span.nKenbAxSNs:after { content: "Colored"; color: green; background-color: #00f; } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after:hover { +.nKenbAxSNs.coated span.nKenbAxSNs:after:hover { transform: scale(2); } -.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:hover { +.nKenbAxSNs.coated span.nKenbAxSNs:hover { transform: translateX(10%); } diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap index f26df0f..14bfd30 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__module_usage_scss.css.snap @@ -1,117 +1,115 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/module_usage_scss.css -snapshot_kind: text --- -.n6ROVrVzYikGtxgKBYy11kA.coated { +.mMNbTGLet9k.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after { +.mMNbTGLet9k.coated:after { content: "Colored"; color: green; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { +.mMNbTGLet9k.coated:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated:hover { +.mMNbTGLet9k.coated:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated:after { +.mMNbTGLet9k.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover { +.mMNbTGLet9k.coated:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated:hover { +.mMNbTGLet9k.coated:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark { +.mMNbTGLet9k.coated-dark { color: #c6c6c6; background-color: #0ff; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after { +.mMNbTGLet9k.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after:hover { +.mMNbTGLet9k.coated-dark:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark:hover { +.mMNbTGLet9k.coated-dark:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k { color: #c6c6c6; background-color: #0ff; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:after { content: "Colored"; color: #00f; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k { color: #fff; background-color: green; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:after { content: "Colored"; color: #000; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated-dark a.mMNbTGLet9k img.mMNbTGLet9k:hover { transform: translateX(10%); } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA { +.mMNbTGLet9k.coated span.mMNbTGLet9k { color: #c6c6c6; background-color: #0ff; display: block; } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after { +.mMNbTGLet9k.coated span.mMNbTGLet9k:after { content: "Colored"; color: green; background-color: #00f; } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after:hover { +.mMNbTGLet9k.coated span.mMNbTGLet9k:after:hover { transform: scale(2); } -.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:hover { +.mMNbTGLet9k.coated span.mMNbTGLet9k:hover { transform: translateX(10%); } 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 index ecff4e6..3fbd4b8 100644 --- 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 @@ -1,33 +1,31 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/repeating_selector_sass.css -snapshot_kind: text --- -.rWkBO00R__2y_lbRfXlyg.el1 { +.xm0JxM8Vqpg.el1 { color: red; } -.rWkBO00R__2y_lbRfXlyg.el1-mob { +.xm0JxM8Vqpg.el1-mob { color: #00f; } -.rWkBO00R__2y_lbRfXlyg.el1__blist { +.xm0JxM8Vqpg.el1__blist { list-style: none; } -.rWkBO00R__2y_lbRfXlyg.el2 { +.xm0JxM8Vqpg.el2 { color: #fff; } -.rWkBO00R__2y_lbRfXlyg.el2-mob { +.xm0JxM8Vqpg.el2-mob { color: #000; } -.rWkBO00R__2y_lbRfXlyg.el2__blist { +.xm0JxM8Vqpg.el2__blist { background: #fff; } -.rWkBO00R__2y_lbRfXlyg.el2__blist-mob { +.xm0JxM8Vqpg.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 index e40637f..b461f46 100644 --- 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 @@ -1,49 +1,47 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/repeating_selector_scss.css -snapshot_kind: text --- -.n9m9Me_zRl6xP8NIGObY_A.el1 { +.wCmhvw6X7vw.el1 { color: red; } -.n9m9Me_zRl6xP8NIGObY_A.el1-mob { +.wCmhvw6X7vw.el1-mob { color: #00f; } -.n9m9Me_zRl6xP8NIGObY_A.el1__blist { +.wCmhvw6X7vw.el1__blist { list-style: none; } -.n9m9Me_zRl6xP8NIGObY_A.el1.n9m9Me_zRl6xP8NIGObY_A.sub { +.wCmhvw6X7vw.el1.wCmhvw6X7vw.sub { margin: 0; } -.n9m9Me_zRl6xP8NIGObY_A.bus .n9m9Me_zRl6xP8NIGObY_A.el1 { +.wCmhvw6X7vw.bus .wCmhvw6X7vw.el1 { padding: 0; } -.n9m9Me_zRl6xP8NIGObY_A.el2 { +.wCmhvw6X7vw.el2 { color: #fff; } -.n9m9Me_zRl6xP8NIGObY_A.el2-mob { +.wCmhvw6X7vw.el2-mob { color: #000; } -.n9m9Me_zRl6xP8NIGObY_A.el2__blist { +.wCmhvw6X7vw.el2__blist { background: #fff; } -.n9m9Me_zRl6xP8NIGObY_A.el2__blist-mob { +.wCmhvw6X7vw.el2__blist-mob { background: #000; } -.n9m9Me_zRl6xP8NIGObY_A.el2.n9m9Me_zRl6xP8NIGObY_A.sub { +.wCmhvw6X7vw.el2.wCmhvw6X7vw.sub { margin: 0; } -.n9m9Me_zRl6xP8NIGObY_A.el2 .n9m9Me_zRl6xP8NIGObY_A.bus { +.wCmhvw6X7vw.el2 .wCmhvw6X7vw.bus { margin: 0; } diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap index 2b91afc..95c53a7 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_sass.css.snap @@ -1,30 +1,28 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/sole_code_sass.css -snapshot_kind: text --- -.smfXzGrnTs2kl9jPP0nk6w.fuzz { +.vnm6NZhBSSY.fuzz { background-color: red; display: block; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark { +.vnm6NZhBSSY.fuzz-dark { background-color: #000; color: #fff; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz-dark a.vnm6NZhBSSY { text-transform: uppercase; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w img.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz-dark a.vnm6NZhBSSY img.vnm6NZhBSSY { position: absolute; top: 0; left: 10rem; } -.smfXzGrnTs2kl9jPP0nk6w.fuzz span.smfXzGrnTs2kl9jPP0nk6w { +.vnm6NZhBSSY.fuzz span.vnm6NZhBSSY { position: relative; display: grid; grid-template-areas: "a b c" diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap index 7cb4253..d5e3d9a 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__sole_code_scss.css.snap @@ -1,30 +1,28 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/sole_code_scss.css -snapshot_kind: text --- -.FT5yVVwswyLvNU3dIk0qw.fuzz { +.n3N0gcUIyf7I.fuzz { background-color: red; display: block; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark { +.n3N0gcUIyf7I.fuzz-dark { background-color: #000; color: #fff; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz-dark a.n3N0gcUIyf7I { text-transform: uppercase; } -.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw img.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz-dark a.n3N0gcUIyf7I img.n3N0gcUIyf7I { position: absolute; top: 0; left: 10rem; } -.FT5yVVwswyLvNU3dIk0qw.fuzz span.FT5yVVwswyLvNU3dIk0qw { +.n3N0gcUIyf7I.fuzz span.n3N0gcUIyf7I { position: relative; display: grid; grid-template-areas: "a b c" diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap index 5f18c81..c65d115 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_sass.css.snap @@ -1,117 +1,115 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/use_forwarded_sass.css -snapshot_kind: text --- -.qK4fsMeZRSTGObSesXXRBA.coated { +.dGuHauwffw.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.qK4fsMeZRSTGObSesXXRBA.coated:after { +.dGuHauwffw.coated:after { content: "Colored"; color: green; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { +.dGuHauwffw.coated:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated:hover { +.dGuHauwffw.coated:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated:after { +.dGuHauwffw.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated:after:hover { +.dGuHauwffw.coated:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated:hover { +.dGuHauwffw.coated:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark { +.dGuHauwffw.coated-dark { color: #c6c6c6; background-color: #0ff; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:after { +.dGuHauwffw.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:after:hover { +.dGuHauwffw.coated-dark:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark:hover { +.dGuHauwffw.coated-dark:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated-dark a.dGuHauwffw { color: #c6c6c6; background-color: #0ff; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated-dark a.dGuHauwffw:after { content: "Colored"; color: #00f; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw { color: #fff; background-color: green; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:after { content: "Colored"; color: #000; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated-dark a.dGuHauwffw img.dGuHauwffw:hover { transform: translateX(10%); } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA { +.dGuHauwffw.coated span.dGuHauwffw { color: #c6c6c6; background-color: #0ff; display: block; } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after { +.dGuHauwffw.coated span.dGuHauwffw:after { content: "Colored"; color: green; background-color: #00f; } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after:hover { +.dGuHauwffw.coated span.dGuHauwffw:after:hover { transform: scale(2); } -.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:hover { +.dGuHauwffw.coated span.dGuHauwffw:hover { transform: translateX(10%); } diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap index 68599c1..dfab0b5 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__use_forwarded_scss.css.snap @@ -1,117 +1,115 @@ --- source: tests/macros.rs -assertion_line: 172 input_file: tests/sabry_output/scopes/use_forwarded_scss.css -snapshot_kind: text --- -.FMHIHNH4_QHxbUqdVmS1A.coated { +.h9QvS1beJbo.coated { color: #c6c6c6; background-color: #0ff; color: #fff; background-color: green; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after { +.h9QvS1beJbo.coated:after { content: "Colored"; color: green; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { +.h9QvS1beJbo.coated:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated:hover { +.h9QvS1beJbo.coated:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated:after { +.h9QvS1beJbo.coated:after { content: "Colored"; color: #000; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover { +.h9QvS1beJbo.coated:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated:hover { +.h9QvS1beJbo.coated:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark { +.h9QvS1beJbo.coated-dark { color: #c6c6c6; background-color: #0ff; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after { +.h9QvS1beJbo.coated-dark:after { content: "Colored"; color: red; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after:hover { +.h9QvS1beJbo.coated-dark:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark:hover { +.h9QvS1beJbo.coated-dark:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo { color: #c6c6c6; background-color: #0ff; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:after { content: "Colored"; color: #00f; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo { color: #fff; background-color: green; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:after { content: "Colored"; color: #000; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated-dark a.h9QvS1beJbo img.h9QvS1beJbo:hover { transform: translateX(10%); } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A { +.h9QvS1beJbo.coated span.h9QvS1beJbo { color: #c6c6c6; background-color: #0ff; display: block; } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after { +.h9QvS1beJbo.coated span.h9QvS1beJbo:after { content: "Colored"; color: green; background-color: #00f; } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after:hover { +.h9QvS1beJbo.coated span.h9QvS1beJbo:after:hover { transform: scale(2); } -.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover { +.h9QvS1beJbo.coated span.h9QvS1beJbo:hover { transform: translateX(10%); } From fb2d8b23b943c0576a7cbb8750243d339ac1ca46 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:08:35 +0300 Subject: [PATCH 176/184] chore: 0.0.7 update example usage --- examples/leptos-axum/src/routes/home.rs | 16 ++++++++-------- examples/leptos-axum/src/shell.rs | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/leptos-axum/src/routes/home.rs b/examples/leptos-axum/src/routes/home.rs index f077197..989aeec 100644 --- a/examples/leptos-axum/src/routes/home.rs +++ b/examples/leptos-axum/src/routes/home.rs @@ -10,19 +10,19 @@ pub fn Route() -> impl IntoView { view! {class = STYLE, <leptos_components::Aside/> // lets use our component - <section class=style::table> + <section class="table"> <h2>"Welcome to Leptos"</h2> - <h2 class=""> + <h2> "This head is styled with lepty-scopes feature" <br/> - <span class="">"And this child too!"</span> + <span>"And this child too!"</span> </h2> - <button class=style::btn on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> - <button class=style::_dark(style::btn) on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> - <span class=style::card>"DISCLAIMER:"</span> - <p class=style::pocwarn>"This isn't a design example! Its just proof of sabry's capabilities."</p> - <p class=style::pocwarn>"Plz dont make websites/apps which look like this page :D"</p> + <button class="btn" on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <button class="btn btn-dark" on:click=on_click>"Ima CRAZY button, clicked: " {count} " times!"</button> + <span class="card">"DISCLAIMER:"</span> + <p class="pocwarn">"This isn't a design example! Its just proof of sabry's capabilities."</p> + <p class="pocwarn">"Plz dont make websites/apps which look like this page :D"</p> </section> } } diff --git a/examples/leptos-axum/src/shell.rs b/examples/leptos-axum/src/shell.rs index d1d757e..323a55f 100644 --- a/examples/leptos-axum/src/shell.rs +++ b/examples/leptos-axum/src/shell.rs @@ -1,8 +1,8 @@ use leptos::prelude::*; -use leptos_meta::{provide_meta_context, MetaTags, Stylesheet, Title}; +use leptos_meta::{MetaTags, Stylesheet, Title, provide_meta_context}; use leptos_router::{ - components::{Route, Router, Routes}, StaticSegment, + components::{Route, Router, Routes}, }; use sabry::styly; From 28bf4980051650a83ff0b12a96837ca9826b6a91 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:10:28 +0300 Subject: [PATCH 177/184] chore: 0.0.7 upade README links for examples --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0fe9f97..e4f0e35 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ Also, just about everything is pub-available in this crate (with *internals* fea Feel free to check out examples: -|[crate of styles](https://github.com/yiffyrusdev/sabry/tree/master/examples/define-styles)|[style usage](https://github.com/yiffyrusdev/sabry/tree/master/examples/use-styles)|[leptos-axum with sabry](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-axum)|[leptos components](https://github.com/yiffyrusdev/sabry/tree/master/examples/leptos-components)| +|[crate of styles](./examples/define-styles)|[style usage](./examples/use-styles)|[leptos-axum with sabry](./examples/leptos-axum)|[leptos components](./examples/leptos-components)| |-|-|-|-| ### Create a crate full of arbitrary SASS From 65faa81b9c2d17f3ec2be4542d5ad11a56e1d029 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:18:41 +0300 Subject: [PATCH 178/184] chore: Release --- sabry_intrnl/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sabry_intrnl/README.md b/sabry_intrnl/README.md index c9cabbd..65e87f3 100644 --- a/sabry_intrnl/README.md +++ b/sabry_intrnl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` From c1546235af150043b416bb7498295e260c83b691 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:20:15 +0300 Subject: [PATCH 179/184] chore: Release --- sabry_procmacro_impl/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sabry_procmacro_impl/README.md b/sabry_procmacro_impl/README.md index c0e51bf..7631af2 100644 --- a/sabry_procmacro_impl/README.md +++ b/sabry_procmacro_impl/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` From 02918af43923504da3da4ca736a4d11caeb84973 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:20:40 +0300 Subject: [PATCH 180/184] chore: Release --- sabry_procmacro/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sabry_procmacro/README.md b/sabry_procmacro/README.md index 29fef06..285dc7f 100644 --- a/sabry_procmacro/README.md +++ b/sabry_procmacro/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` From d0caa5e7e052afb3b4045a86a1552a2fdf8cca7d Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:21:10 +0300 Subject: [PATCH 181/184] chore: Release --- sabry_build/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sabry_build/README.md b/sabry_build/README.md index e08a18f..7b8ddc7 100644 --- a/sabry_build/README.md +++ b/sabry_build/README.md @@ -4,5 +4,5 @@ There is very low probability, that you should depend on this crate, instead do: ```rust,ignore [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` From 75154f451601430bd4de5c26734d20fdc7b6f7ed Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Tue, 6 Oct 2026 00:21:38 +0300 Subject: [PATCH 182/184] chore: Release --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e4f0e35..a1a5e1d 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ The only need is the dependency #Cargo.toml [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` And a proc-macro ```rust @@ -161,7 +161,7 @@ Depend on sabry # Cargo.toml [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} ``` And create a style scope wherever you want: ```rust @@ -199,10 +199,10 @@ To be able to compile all styles sabry also needs the *build* feature flag: # Cargo.toml [dependencies] -sabry = {version = "0.0.6"} +sabry = {version = "0.0.7"} [build-dependencies] -sabry = {version = "0.0.6", features = ["build"]} +sabry = {version = "0.0.7", features = ["build"]} ``` > If you do use some non-default feature flags make sure to keep them in sync between sabry-dependency and sabry-build-dependency. From f30a053f1fdaf56f957d5e4565f973dd4a36fbd6 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.ru> Date: Sun, 11 Oct 2026 22:57:27 +0300 Subject: [PATCH 183/184] fix!: bring `const` scopes back - replace grass with sasso - drop lightningcss - rearrange crate and workspace hierarchy & features --- .gitignore | 1 - Cargo.lock | 2030 +++++++++++++++++ Cargo.toml | 62 +- sabry/Cargo.toml | 28 + sabry/src/lib.rs | 4 + sabry_build/Cargo.toml | 7 +- sabry_build/src/buildmagic.rs | 70 +- sabry_build/src/lib.rs | 3 + sabry_intrnl/Cargo.toml | 26 +- sabry_intrnl/src/compiler/mod.rs | 139 -- sabry_intrnl/src/{config => conf}/manifest.rs | 0 sabry_intrnl/src/conf/mod.rs | 210 ++ sabry_intrnl/src/config/mod.rs | 246 -- sabry_intrnl/src/lib.rs | 8 +- sabry_intrnl/src/scoper/hash.rs | 95 - sabry_intrnl/src/style/compiler.rs | 49 + sabry_intrnl/src/style/mod.rs | 5 + .../src/{scoper/mod.rs => style/scope.rs} | 123 +- .../src/{syntax/mod.rs => style/syntax.rs} | 88 +- sabry_intrnl/src/syntax/ostrta.rs | 61 - sabry_procmacro/Cargo.toml | 1 - sabry_procmacro_impl/Cargo.toml | 15 +- sabry_procmacro_impl/src/impls/mod.rs | 13 +- sabry_procmacro_impl/src/impls/scssy.rs | 11 +- sabry_procmacro_impl/src/impls/styly.rs | 73 +- src/lib.rs | 18 - 26 files changed, 2616 insertions(+), 770 deletions(-) create mode 100644 Cargo.lock create mode 100644 sabry/Cargo.toml create mode 100644 sabry/src/lib.rs delete mode 100644 sabry_intrnl/src/compiler/mod.rs rename sabry_intrnl/src/{config => conf}/manifest.rs (100%) create mode 100644 sabry_intrnl/src/conf/mod.rs delete mode 100644 sabry_intrnl/src/config/mod.rs delete mode 100644 sabry_intrnl/src/scoper/hash.rs create mode 100644 sabry_intrnl/src/style/compiler.rs create mode 100644 sabry_intrnl/src/style/mod.rs rename sabry_intrnl/src/{scoper/mod.rs => style/scope.rs} (84%) rename sabry_intrnl/src/{syntax/mod.rs => style/syntax.rs} (78%) delete mode 100644 sabry_intrnl/src/syntax/ostrta.rs delete mode 100644 src/lib.rs diff --git a/.gitignore b/.gitignore index 5a8005a..24b4f0e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ rust-toolchain.toml .vscode .profile .envrc -/Cargo.lock /tests/sabry_intermediate /tests/sabry_output /playground diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..aeed6ed --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2030 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "any_spawner" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1384d3fe1eecb464229fcf6eebb72306591c56bf27b373561489458a7c73027d" +dependencies = [ + "futures", + "thiserror 2.0.21", + "wasm-bindgen-futures", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-once-cell" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288f83726785267c6f2ef073a3d83dc3f9b81464e9f99898240cced85fce35a" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "attribute-derive" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f9ef7a68684657ce9da341c934c73b63df7a3585a61e366d84c84ed5d3d167" +dependencies = [ + "attribute-derive-macro", + "manyhow", + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "attribute-derive-macro" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300d426e5e73549125bb8e4649bdd5508f82c94ddf898fb0517246e71dfb8e98" +dependencies = [ + "collection_literals", + "interpolator", + "manyhow", + "proc-macro-utils", + "proc-macro2", + "quote", + "quote-use", + "syn 3.0.6", +] + +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bstr" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" +dependencies = [ + "memchr", + "serde_core", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "camino" +version = "1.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbad30e4b4c14a39e3cc8aed085a12a327257c316619c93581e017bc52be591" + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "codee" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9dbbdc4b4d349732bc6690de10a9de952bd39ba6a065c586e26600b6b0b91f5" +dependencies = [ + "serde", + "serde_json", + "thiserror 2.0.21", +] + +[[package]] +name = "collection_literals" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2550f75b8cfac212855f6b1885455df8eaee8fe8e246b647d69146142e016084" + +[[package]] +name = "config" +version = "0.15.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e9fbc53afcec54441422f1c596cd054655b32e70e1cbac956651b7b175a404" +dependencies = [ + "convert_case 0.6.0", + "pathdiff", + "serde_core", + "toml", + "winnow", +] + +[[package]] +name = "console" +version = "0.16.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96a4956774c13c126a8b5af4daa79384f4d826534c95a02d76afb39e2ab64e3" +dependencies = [ + "encode_unicode", + "libc", + "windows-sys", +] + +[[package]] +name = "const-str" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18f12cc9948ed9604230cdddc7c86e270f9401ccbe3c2e98a4378c5e7632212f" + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "const_str_slice_concat" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67855af358fcb20fac58f9d714c94e2b228fe5694c1c9b4ead4a366343eda1b" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "convert_case" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "convert_case_extras" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589c70f0faf8aa9d17787557d5eae854d7755cac50f5c3d12c81d3d57661cebb" +dependencies = [ + "convert_case 0.11.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derive-where" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e2b94854e8576378ccda7c8de8a66ed8b4e8acbd2c50ec3418ea6c8aaf4b567" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "drain_filter_polyfill" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" + +[[package]] +name = "either" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" + +[[package]] +name = "either_of" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5060e0a4cbf26a87550792688ade88e6b8aec9208613631a7a363bda7bc2d4cd" +dependencies = [ + "paste", + "pin-project-lite", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1731451909bde27714eacba19c2566362a7f35224f52b153d3f42cf60f72472" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "globset" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "guardian" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e2ac29387b1aa07a1e448f7bb4f35b500787971e965b02842b900afa5c8f6f" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "html-escape" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9356095b4b41197bba32173600e1582792cda618f65d12f68e2e77d273413c5" + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "hydration_context" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "285b05858fe7d58c5eff059f7b46c228fd86996d996c59eb35fc0340d174f640" +dependencies = [ + "futures", + "or_poisoned", + "pin-project-lite", + "serde", + "throw_error", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "insta" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67d3d2e287e4b86c10b3f3b641033d1f89b74bdb39d05f34952e2b9a6fe21cd" +dependencies = [ + "console", + "globset", + "once_cell", + "similar", + "tempfile", + "walkdir", +] + +[[package]] +name = "interpolator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "leptos" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713ee6895e3d1126ea9781280d01414f5643f3f201a949b71efffac07d735f00" +dependencies = [ + "any_spawner", + "cfg-if", + "either_of", + "futures", + "hydration_context", + "leptos_config", + "leptos_dom", + "leptos_hot_reload", + "leptos_macro", + "leptos_server", + "oco_ref", + "or_poisoned", + "paste", + "reactive_graph", + "rustc-hash", + "rustc_version", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn", + "slotmap", + "tachys", + "thiserror 2.0.21", + "throw_error", + "typed-builder", + "typed-builder-macro", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm_split_helpers", + "web-sys", +] + +[[package]] +name = "leptos_config" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c06f751315bccc0d193fab302ac01d25bcfcd97474d4676440e7e3250dc3fc3" +dependencies = [ + "config", + "regex", + "serde", + "thiserror 2.0.21", + "typed-builder", +] + +[[package]] +name = "leptos_dom" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35742e9ed8f8aaf9e549b454c68a7ac0992536e06856365639b111f72ab07884" +dependencies = [ + "js-sys", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "tachys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_hot_reload" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d84989bd3d604e66adbfe13a32bec2ea47bdcb6c9fcd643f784facbb32f6ef10" +dependencies = [ + "anyhow", + "camino", + "indexmap", + "or_poisoned", + "proc-macro2", + "quote", + "rstml", + "serde", + "syn 3.0.6", + "walkdir", +] + +[[package]] +name = "leptos_macro" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0902af1e6947ffc7e906b7003a165f76f178dc711a47b74241025090b0c32a72" +dependencies = [ + "attribute-derive", + "cfg-if", + "convert_case 0.11.0", + "convert_case_extras", + "html-escape", + "itertools 0.14.0", + "leptos_hot_reload", + "prettyplease", + "proc-macro2", + "quote", + "rstml", + "rustc_version", + "server_fn_macro", + "syn 3.0.6", + "uuid", +] + +[[package]] +name = "leptos_server" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202b2d1261c22d886f307934760a6bb566444f68f39b24f6f10defdc23633049" +dependencies = [ + "any_spawner", + "base64 0.22.1", + "codee", + "futures", + "hydration_context", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "serde", + "serde_json", + "server_fn", + "tachys", +] + +[[package]] +name = "libc" +version = "0.2.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "manyhow" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c69ea6e469ca785c846b25dd69eac9e9c916b51d8ada1f212866787ee1da12d" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "manyhow-macros" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22fc5c1b2c4000056dae3619fea36e79ce79dabfee4907d2dcad6612b189e370" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "next_tuple" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60993920e071b0c9b66f14e2b32740a4e27ffc82854dcd72035887f336a09a28" + +[[package]] +name = "oco_ref" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0423ff9973dea4d6bd075934fdda86ebb8c05bdf9d6b0507067d4a1226371d" +dependencies = [ + "serde", + "thiserror 2.0.21", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "or_poisoned" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "prettyplease" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bfe0f4c752e450fc2faf62654f1c134747922825d5b04ca717b8874f41a40c0" +dependencies = [ + "proc-macro2", + "syn 3.0.6", +] + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df921e1ef974ebc8dd9effdb0c037a96928ae8cbf871438e02d6fd67204b595e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "version_check", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quote-use" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48356e493823dc3c1d7e9fc7b3ff204ecec48afbdd718fc4134091b88eb63f3d" +dependencies = [ + "quote", + "quote-use-macros", +] + +[[package]] +name = "quote-use-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf1c5de6a7cc231c71e03c77aa4c7019097859ea7029156b54d2894a8430704" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "raffia" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a83eb5987650fcfc3f2e912d3a718f19b8e87c0d980e12e36edf79fa0221d93" +dependencies = [ + "raffia_macro", + "smallvec", +] + +[[package]] +name = "raffia_macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ac21f5e4bc6b29ea5d5e691a9aa08b2b9fd8891f48a99157b9f02d8a48e1318" +dependencies = [ + "heck", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "reactive_graph" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79f11fac67625645add76313dab8dae510fca0654d96ef98fd8f961a7d2e22c1" +dependencies = [ + "any_spawner", + "async-lock", + "futures", + "guardian", + "hydration_context", + "indexmap", + "or_poisoned", + "paste", + "pin-project-lite", + "rustc-hash", + "rustc_version", + "send_wrapper", + "serde", + "slotmap", + "thiserror 2.0.21", + "web-sys", +] + +[[package]] +name = "reactive_stores" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a29e469b556f25486678e9f5f65fa21a0351d98affde9a7eea9fee286bf8ebd6" +dependencies = [ + "guardian", + "indexmap", + "itertools 0.14.0", + "or_poisoned", + "paste", + "reactive_graph", + "reactive_stores_macro", + "rustc-hash", + "send_wrapper", +] + +[[package]] +name = "reactive_stores_macro" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d11f1b82859d94577892b8037c35f8a4f066cbb3864583e22e68def0af49a88" +dependencies = [ + "convert_case 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rstml" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6bd1bfba3c4c0b57aae906204d9e5744f3f65800ce6c75bd4cc162f2c26f3aa" +dependencies = [ + "derive-where", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 3.0.6", + "thiserror 2.0.21", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "sabry" +version = "0.0.7" +dependencies = [ + "insta", + "leptos", + "sabry_intrnl", + "sabry_procmacro", +] + +[[package]] +name = "sabry_build" +version = "0.0.7" +dependencies = [ + "proc-macro2", + "sabry_intrnl", + "sabry_procmacro", + "sabry_procmacro_impl", + "syn 3.0.6", + "thiserror 2.0.21", + "walkdir", +] + +[[package]] +name = "sabry_intrnl" +version = "0.0.7" +dependencies = [ + "base64 0.23.1", + "raffia", + "sasso", + "serde", + "syn 3.0.6", + "thiserror 2.0.21", + "toml", +] + +[[package]] +name = "sabry_procmacro" +version = "0.0.7" +dependencies = [ + "sabry_procmacro_impl", +] + +[[package]] +name = "sabry_procmacro_impl" +version = "0.0.7" +dependencies = [ + "itertools 0.15.0", + "proc-macro2", + "quote", + "raffia", + "regex", + "sabry_intrnl", + "syn 3.0.6", + "thiserror 2.0.21", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "sasso" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de32df330f2607c02458791223064ee98752e719e6f85804953229533c32448" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" +dependencies = [ + "futures-core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_qs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3faaf9e727533a19351a43cc5a8de957372163c7d35cc48c90b75cdda13c352" +dependencies = [ + "percent-encoding", + "serde", + "thiserror 2.0.21", +] + +[[package]] +name = "serde_spanned" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7523beb55eece201a2356bee0bbca0d1ab466c14c07703b2e0ee6d42cb0c2c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "server_fn" +version = "0.8.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8559dd05af1b5b7e363a150616589d5a88af5187273f7f331ba0dae8922812" +dependencies = [ + "base64 0.22.1", + "bytes", + "const-str", + "const_format", + "futures", + "gloo-net", + "http", + "js-sys", + "or_poisoned", + "pin-project-lite", + "rustc_version", + "rustversion", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn_macro_default", + "thiserror 2.0.21", + "throw_error", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce79d7b6ab93f7994e5ff4999eb962f2aea370d7c3b91986eb75da738a8e65f9" +dependencies = [ + "const_format", + "convert_case 0.11.0", + "proc-macro2", + "quote", + "rustc_version", + "syn 3.0.6", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro_default" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9a4f81a0d855f279c3448243138a55cbfdd9851da9341b9c1e5971b90089e61" +dependencies = [ + "server_fn_macro", + "syn 3.0.6", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tachys" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47e2220bb9d2a3be976a22a0fb7685a0b84499bb11ea5cb3bbc82907675ac68" +dependencies = [ + "any_spawner", + "async-trait", + "const_str_slice_concat", + "drain_filter_polyfill", + "either_of", + "erased", + "futures", + "html-escape", + "indexmap", + "itertools 0.14.0", + "js-sys", + "next_tuple", + "oco_ref", + "or_poisoned", + "paste", + "reactive_graph", + "reactive_stores", + "rustc-hash", + "rustc_version", + "send_wrapper", + "slotmap", + "throw_error", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "throw_error" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0ed6038fcbc0795aca7c92963ddda636573b956679204e044492d2b13c8f64" +dependencies = [ + "pin-project-lite", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044" +dependencies = [ + "pin-project-lite", +] + +[[package]] +name = "toml" +version = "1.1.8+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20489e00e4d8741d6be680764cc12e270655e375a20d1011e844a9c3379e678d" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.1.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06bdbd8cfc056b8d2e2e85f29b56a3bdbecb527cef81eb39e3e7b98af4652770" + +[[package]] +name = "typed-builder" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31aa81521b70f94402501d848ccc0ecaa8f93c8eb6999eb9747e72287757ffda" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076a02dc54dd46795c2e9c8282ed40bcfb1e22747e955de9389a1de28190fb26" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97277d36b9c3ace13e58fa6e753f8b0bbbf302a18dd193240d70f9e29681059a" +dependencies = [ + "getrandom", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" +dependencies = [ + "js-sys", + "tokio", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.6", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasm_split_helpers" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab578aae2fe2916edaea06843187d50f87b0965622da0ceef648edca27b385ba" +dependencies = [ + "async-once-cell", + "wasm_split_macros", +] + +[[package]] +name = "wasm_split_macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e653af7ee4a9ef0fce481a9ec6f43cb78de20d0cdb4f4f5862e1dc6e407e6c8" +dependencies = [ + "base16", + "quote", + "sha2", + "syn 2.0.119", +] + +[[package]] +name = "web-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "xxhash-rust" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "550a2b930b62486a393c52d5c3b84bff264b28aa437ed64694d31e93b1757af7" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index 78f0188..2c46e0c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,6 @@ [workspace] resolver = "3" -members = [ - "sabry_procmacro", - "sabry_procmacro_impl", - "sabry_intrnl", - "sabry_build", -] +members = ["sabry", "sabry_procmacro", "sabry_procmacro_impl", "sabry_intrnl", "sabry_build"] exclude = ["examples"] [workspace.package] @@ -19,15 +14,21 @@ publish = true [workspace.dependencies] ## Workspace -sabry_intrnl = { path = "sabry_intrnl", version = "0.0.7" } -sabry_procmacro = { path = "sabry_procmacro", version = "0.0.7" } -sabry_procmacro_impl = { path = "sabry_procmacro_impl", version = "0.0.7" } -sabry_build = { path = "sabry_build", version = "0.0.7" } +sabry.path = "sabry" +sabry.version = "0.0.7" +sabry_intrnl.path = "sabry_intrnl" +sabry_intrnl.version = "0.0.7" +sabry_procmacro.path = "sabry_procmacro" +sabry_procmacro.version = "0.0.7" +sabry_procmacro_impl.path = "sabry_procmacro_impl" +sabry_procmacro_impl.version = "0.0.7" +sabry_build.path = "sabry_build" +sabry_build.version = "0.0.7" ## CSS lightningcss.version = "1.0.0-alpha.72" lightningcss.default-features = false -grass.version = "^0.13" -grass.default-features = false +sasso.version = "^0.21" +sasso.default-features = false raffia.version = "^0.13" ## Marshall serde.version = "^1" @@ -43,38 +44,5 @@ thiserror.version = "^2" proc-macro2.version = "^1" quote.version = "^1" syn.version = "^3" - -[package] -name = "sabry" -description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust" -keywords = ["web", "sass", "scss", "macro"] -repository.workspace = true -version.workspace = true -edition.workspace = true -rust-version.workspace = true -authors.workspace = true -license.workspace = true -publish.workspace = true - -[dependencies] -## Workspace -sabry_procmacro = { workspace = true, optional = true } -sabry_build = { workspace = true, optional = true } -sabry_intrnl = { workspace = true } - -[dev-dependencies] -leptos = { version = "^0.8" } -insta = { version = "^1", features = ["glob"] } - -[features] -default = ["procmacro"] -const-scoping = ["sabry_procmacro?/const-compile"] -procmacro = ["dep:sabry_procmacro"] -build = ["dep:sabry_build"] -net-files = ["sabry_build/net-files"] -internals = [] -nightly = ["sabry_procmacro?/nightly"] - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] +## Testing +insta.version = "^1" diff --git a/sabry/Cargo.toml b/sabry/Cargo.toml new file mode 100644 index 0000000..084c066 --- /dev/null +++ b/sabry/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "sabry" +description = "Syntactically Awesome But RustY - crate that brings SCSS/SASS into rust" +keywords = ["web", "sass", "scss", "macro"] +repository.workspace = true +version.workspace = true +edition.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true +publish.workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +## Workspace +sabry_procmacro.workspace = true +sabry_intrnl.workspace = true + +[dev-dependencies] +leptos.version = "^0.8" +insta.workspace = true +insta.features = ["glob"] + +[features] +nightly = ["sabry_procmacro/nightly", "sabry_intrnl/nightly"] diff --git a/sabry/src/lib.rs b/sabry/src/lib.rs new file mode 100644 index 0000000..152c401 --- /dev/null +++ b/sabry/src/lib.rs @@ -0,0 +1,4 @@ +#![doc = include_str!("../../README.md")] +#![cfg_attr(docsrs, feature(doc_cfg))] + +pub use sabry_procmacro::*; diff --git a/sabry_build/Cargo.toml b/sabry_build/Cargo.toml index 3ac6e7f..5648a52 100644 --- a/sabry_build/Cargo.toml +++ b/sabry_build/Cargo.toml @@ -14,10 +14,9 @@ rustdoc-args = ["--cfg", "docsrs"] [dependencies] sabry_intrnl.workspace = true -sabry_intrnl.features = ["compile", "scope"] +sabry_intrnl.features = ["config-manifest", "style-compiler"] +sabry_procmacro.workspace = true sabry_procmacro_impl.workspace = true -sabry_procmacro_impl.features = ["const-compile"] - proc-macro2.workspace = true proc-macro2.features = ["span-locations"] syn.workspace = true @@ -26,4 +25,4 @@ thiserror.workspace = true walkdir.workspace = true [features] -net-files = [] +nightly = ["sabry_procmacro/nightly", "sabry_procmacro_impl/nightly"] diff --git a/sabry_build/src/buildmagic.rs b/sabry_build/src/buildmagic.rs index bd476a7..eb43b2f 100644 --- a/sabry_build/src/buildmagic.rs +++ b/sabry_build/src/buildmagic.rs @@ -3,17 +3,17 @@ use std::{ convert::Infallible, fs::{self, OpenOptions}, io::{self, Write}, - path::PathBuf, - str::FromStr, vec, }; use sabry_intrnl::{ - compiler::{CompilerAdapter, SabryCompilerError}, - config::{manifest::ManifestError, BehavHashCollision, BehavSassModCollision, SabryConfig}, - scoper::{hash::ScopeHash, ArbitraryScope, ScopeError}, + conf::{BehavHashCollision, BehavSassModCollision, SabryConfig, manifest::ManifestError}, + style::{ + compiler::{CompilerAdapter, SabryCompilerError}, + scope::{ArbitraryScope, ScopeError, ScopeHash}, + }, }; -use sabry_procmacro_impl::impls::{styly, ArbitraryStyleSyntax}; +use sabry_procmacro_impl::impls::{ArbitraryStyleSyntax, styly}; use walkdir::WalkDir; use crate::filevisit::{self, FileVisitError}; @@ -71,7 +71,6 @@ pub struct SabryBuilder { state: SabryBuildState, } -//🧙 impl SabryBuilder { /// Construct new [SabryBuilder] from the config /// @@ -124,42 +123,40 @@ impl SabryBuilder { pub fn generate_output(&mut self) -> BuilderResult { // warn on empty loaded_css_modules if self.state.loaded_css_modules.is_empty() { - println!("🧙 sabry didn't compile any CSS. Perhaps the crate has no styles? Lets write some!\nAlso you should check that you do use `styly!` macro properly - at the top level as an item."); + println!( + "🧙 sabry didn't compile any CSS. Perhaps the crate has no styles? Lets write some!\nAlso you should check that you do use `styly!` macro properly - at the top level as an item." + ); } if let Some(scope_dir) = &self.config.css.scopes { - println!("🧙 writing CSS files for each of loaded scopes into {scope_dir}"); + println!("🧙 writing CSS files for each of loaded scopes into {scope_dir:?}"); fs::create_dir_all(scope_dir)?; for (scope, code) in &self.state.loaded_css_modules { - let scope_path = format!("{}/{}.css", scope_dir, scope); + let scope_path = scope_dir.join(scope).with_extension("css"); fs::write(scope_path, code)?; } } if let Some(bundle_file) = &self.config.css.bundle { - println!("🧙 writing merged CSS for the entire crate into {bundle_file}"); - - let path = PathBuf::from_str(bundle_file)?; - - if let Some(dir) = path.parent() { + println!("🧙 writing merged CSS for the entire crate into {bundle_file:?}"); + if let Some(dir) = bundle_file.parent() { fs::create_dir_all(dir)?; } // remove the file to write new fresh tasty CSS - let _ = fs::remove_file(&path); + let _ = fs::remove_file(bundle_file); // and then reopen it let mut file = OpenOptions::new() .create_new(true) .append(true) - .open(path)?; + .open(bundle_file)?; // merged bundle CSS does require another lightningcss pass let mut buffer = String::new(); for (_, code) in &self.state.loaded_css_modules { buffer.push_str(code); } - buffer = self.css_compiler.lightningcss(&buffer)?; write!(file, "{buffer}")?; } @@ -258,13 +255,12 @@ impl SabryBuilder { let mut modules: Vec<StyleModule> = vec![]; if let Some(sass_mods) = &self.config.sass.modules { for pre in sass_mods { - let pre_path = PathBuf::from_str(pre)?; - let pre_name = pre_path + let pre_name = pre .file_name() .ok_or(SabryBuildError::FileName())? .to_string_lossy() .to_string(); - let code = fs::read_to_string(pre_path)?; + let code = fs::read_to_string(pre)?; modules.push((pre_name, code)); } } @@ -276,9 +272,7 @@ impl SabryBuilder { if let Some(sass_pres) = &self.config.sass.prelude { let mut sass_preludes: Vec<SassPreludeModule> = vec![]; for pre in sass_pres { - let pre_path = PathBuf::from_str(pre)?; - - let syntax = pre_path + let syntax = pre .extension() .unwrap_or_default() .to_str() @@ -287,23 +281,21 @@ impl SabryBuilder { Ok(s) => s, Err(_) => { return Err(SabryBuildError::Another(format!( - "Unknown syntax for sass prelude {pre}" - ))) + "Unknown syntax for sass prelude {pre:?}" + ))); } }; - let code = fs::read_to_string(pre_path)?; + let code = fs::read_to_string(pre)?; sass_preludes.push(SassPreludeModule { syntax, code }); } self.state.sass_prelude.extend(sass_preludes); } // load css preludes - if let Some(css_pre) = &self.config.css.prelude { - for pre in css_pre { - let code = fs::read_to_string(pre)?; - self.state.css_prelude.push_str(&code); - } + for pre in &self.config.css.prelude { + let code = fs::read_to_string(pre)?; + self.state.css_prelude.push_str(&code); } Ok(()) @@ -319,9 +311,9 @@ impl SabryBuilder { /// This function will not overwrite the module file. Never. /// pub fn load_side_module(&mut self, name: ModuleName, code: ModuleCode) -> BuilderResult { - println!("🧙 loading side module '{}'", &name); + println!("🧙 loading side module '{}'", name); - let module_file_path = format!("{}/{}", &self.config.sass.intermediate_dir, &name); + let module_file_path = self.config.sass.intermediate_dir.join(&name); let mut open_options = OpenOptions::new(); let mut open_options = open_options.write(true); @@ -333,10 +325,12 @@ impl SabryBuilder { open_options = if self.state.known_side_modules.contains(&name) { match &self.config.sass.module_name_collision { BehavSassModCollision::Error => { - return Err(SabryBuildError::ModuleCollision { module: name }) + return Err(SabryBuildError::ModuleCollision { module: name }); } BehavSassModCollision::Merge => { - println!("🧙 sabry found duplicate module name '{name}': merging code, as configured"); + println!( + "🧙 sabry found duplicate module name '{name}': merging code, as configured" + ); open_options.append(true) } } @@ -399,7 +393,9 @@ pub enum SabryBuildError { FileVisit(#[from] FileVisitError), #[error("Syntax of style can not be parsed")] SyntaxError(#[from] ScopeError), - #[error("Another scope has the same hash, and sabry is configured to raise an error. Try to adjust config, increase hash size, or change the style code")] + #[error( + "Another scope has the same hash, and sabry is configured to raise an error. Try to adjust config, increase hash size, or change the style code" + )] HashCollision { scope: ModuleName }, #[error("Something's wrong with file path")] Path(#[from] Infallible), diff --git a/sabry_build/src/lib.rs b/sabry_build/src/lib.rs index b2d511e..d8e6863 100644 --- a/sabry_build/src/lib.rs +++ b/sabry_build/src/lib.rs @@ -2,3 +2,6 @@ pub mod buildmagic; pub mod filevisit; + +pub use buildmagic::buildy; +pub use sabry_procmacro::usey; diff --git a/sabry_intrnl/Cargo.toml b/sabry_intrnl/Cargo.toml index d6e7339..01ecd91 100644 --- a/sabry_intrnl/Cargo.toml +++ b/sabry_intrnl/Cargo.toml @@ -13,21 +13,21 @@ all-features = true rustdoc-args = ["--cfg", "docsrs"] [dependencies] +## Css +raffia.version = "^0.13" +sasso.workspace = true +sasso.optional = true base64.workspace = true -base64.optional = true -grass.workspace = true -grass.optional = true -lightningcss.workspace = true -lightningcss.optional = true -raffia.workspace = true -syn.workspace = true - -cfg-if.workspace = true -serde.workspace = true -serde.features = ["derive"] +## Codegen thiserror.workspace = true +syn.workspace = true +## Manifets seri +serde.workspace = true +serde.optional = true +serde.features = ["derive"] toml.workspace = true +toml.optional = true [features] -compile = ["dep:grass", "dep:lightningcss"] -scope = ["dep:base64"] +config-manifest = ["dep:toml", "dep:serde"] +style-compiler = ["dep:sasso"] diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs deleted file mode 100644 index adc398f..0000000 --- a/sabry_intrnl/src/compiler/mod.rs +++ /dev/null @@ -1,139 +0,0 @@ -use crate::config::SabryConfig; - -/// Convenience wrapper on Grass and Lightningcss -pub struct CompilerAdapter { - #[allow(dead_code)] // without 'compile' feature, still want to set this - config: SabryConfig, -} - -impl CompilerAdapter { - pub fn new(config: SabryConfig) -> Self { - Self { config } - } - - /// Compile given SASS/SCSS into CSS - /// with respect to self.config - #[cfg(feature = "compile")] - pub fn compile_module( - &self, - syntax: crate::syntax::ostrta::OneSyntaxToRuleThemAll, - code: &str, - ) -> Result<String, SabryCompilerError> { - let options = grass::Options::from(&self.config).input_syntax(syntax.into()); - - let css = self.lightningcss(&grass::from_string(code, &options)?)?; - - Ok(css) - } - - /// Perform lightningcss transformations on given css - /// with respect to self.config.css.minify on minification - #[cfg(feature = "compile")] - pub fn lightningcss(&self, css: &str) -> Result<String, SabryCompilerError> { - use lightningcss::{printer::PrinterOptions, stylesheet::MinifyOptions, targets::Targets}; - - let mut lightsheet = match lightningcss::stylesheet::StyleSheet::parse( - css, - lightningcss::stylesheet::ParserOptions::default(), - ) { - Ok(s) => s, - Err(e) => { - return Err(SabryCompilerError::LightParse { - kind: e.kind.to_string(), - loc: e.loc, - }) - } - }; - - let targets = Targets { - browsers: Some(self.config.lightningcss.targets.clone().into()), - ..Default::default() - }; - - let printer_options = PrinterOptions { - minify: self.config.css.minify, - targets, - ..Default::default() - }; - - let minify_options = MinifyOptions { - targets, - ..Default::default() - }; - - if self.config.css.minify { - lightsheet.minify(minify_options)? - } - - let css = match lightsheet.to_css(printer_options) { - Ok(c) => { - drop(lightsheet); - c.code - } - Err(e) => return Err(SabryCompilerError::LightPrint(e)), - }; - - Ok(css) - } -} - -#[cfg(feature = "compile")] -impl From<&SabryConfig> for grass::Options<'_> { - fn from(config: &SabryConfig) -> Self { - let mut options = grass::Options::default(); - options = options.style(if config.css.minify { - grass::OutputStyle::Compressed - } else { - grass::OutputStyle::Expanded - }); - options = options.load_path(&config.sass.intermediate_dir); - - options - } -} - -#[cfg(feature = "compile")] -#[derive(thiserror::Error)] -pub enum SabryCompilerError { - #[error("Could not compile into CSS with grass")] - GrassCompile(#[from] Box<grass::Error>), - #[error("Could not print compiled CSS with lightningcss")] - LightPrint(#[from] lightningcss::error::Error<lightningcss::error::PrinterErrorKind>), - #[error("Could not minify CSS with lightningcss")] - LightMinify(#[from] lightningcss::error::Error<lightningcss::error::MinifyErrorKind>), - #[error("Could not parse CSS with lightningcss")] - LightParse { - kind: String, - loc: Option<lightningcss::error::ErrorLocation>, - }, -} - -#[cfg(feature = "compile")] -impl std::fmt::Debug for SabryCompilerError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let explain = match self { - Self::LightPrint(e) => format!( - "{} at {:?}", - e.kind, - e.loc - .clone() - .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) - ), - Self::GrassCompile(err) => format!("{err}"), - Self::LightMinify(e) => format!( - "{} at {:?}", - e.kind, - e.loc - .clone() - .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) - ), - Self::LightParse { kind, loc } => format!( - "{kind} at {:?}", - loc.clone() - .map(|l| format!("file {}, line {}, col {}", l.filename, l.line, l.column)) - ), - }; - - write!(f, "{explain}") - } -} diff --git a/sabry_intrnl/src/config/manifest.rs b/sabry_intrnl/src/conf/manifest.rs similarity index 100% rename from sabry_intrnl/src/config/manifest.rs rename to sabry_intrnl/src/conf/manifest.rs diff --git a/sabry_intrnl/src/conf/mod.rs b/sabry_intrnl/src/conf/mod.rs new file mode 100644 index 0000000..7140697 --- /dev/null +++ b/sabry_intrnl/src/conf/mod.rs @@ -0,0 +1,210 @@ +use std::{path::PathBuf, str::FromStr}; + +#[cfg(feature = "config-manifest")] +pub mod manifest; + +/// Sabry configuration, as it is from package.metadata.sabry +#[derive(Default, Clone)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(default))] +pub struct SabryConfig { + pub css: SabryCssConfig, + pub sass: SabrySassConfig, + pub hash: SabryHashConfig, +} + +impl SabryConfig { + /// Require sabry configuration for the current project from every place in the code + #[cfg(feature = "config-manifest")] + pub fn require() -> Result<Self, manifest::ManifestError> { + let manifest = manifest::read_manifest()?; + Ok(Self::from(&manifest)) + } +} + +#[cfg(feature = "config-manifest")] +impl From<&manifest::ValuableManifest> for SabryConfig { + fn from(value: &manifest::ValuableManifest) -> Self { + value + .package + .as_ref() + .and_then(|p| p.metadata.as_ref()) + .and_then(|m| m.sabry.as_ref()) + .map_or(Self::default(), |sbr| sbr.clone()) + } +} + +/// Sabry `css` configuration table +#[derive(Clone)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(default))] +pub struct SabryCssConfig { + pub bundle: Option<PathBuf>, + pub scopes: Option<PathBuf>, + pub prelude: Vec<PathBuf>, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryCssConfig::default_minify") + )] + pub minify: bool, +} + +impl SabryCssConfig { + fn default_minify() -> bool { + true + } +} + +impl Default for SabryCssConfig { + fn default() -> Self { + Self { + bundle: None, + scopes: None, + prelude: vec![], + minify: Self::default_minify(), + } + } +} + +/// Sabry `sass` configuration table +/// +/// (SASS/SCSS related config) +#[derive(Clone)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(default))] +pub struct SabrySassConfig { + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabrySassConfig::default_scanroot") + )] + pub scanroot: PathBuf, + pub modules: Option<Vec<PathBuf>>, + pub prelude: Option<Vec<PathBuf>>, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabrySassConfig::default_intermediate_dir") + )] + pub intermediate_dir: PathBuf, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabrySassConfig::default_module_name_collision") + )] + pub module_name_collision: BehavSassModCollision, +} + +impl SabrySassConfig { + fn default_scanroot() -> PathBuf { + PathBuf::from_str("src") + .expect("Infallible: default SabrySassConfig::scanroot into PathBuf") + } + fn default_intermediate_dir() -> PathBuf { + PathBuf::from_str("target/.sabry/sass") + .expect("Infallibe: default SabrySassConfig::intermediate_dir into PathBuf") + } + fn default_module_name_collision() -> BehavSassModCollision { + BehavSassModCollision::default() + } +} + +impl Default for SabrySassConfig { + fn default() -> Self { + Self { + scanroot: Self::default_scanroot(), + modules: None, + prelude: None, + intermediate_dir: Self::default_intermediate_dir(), + module_name_collision: Self::default_module_name_collision(), + } + } +} + +/// Sabry `hash` configuration table +#[derive(Clone)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(default))] +pub struct SabryHashConfig { + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_size") + )] + pub size: usize, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_collision") + )] + pub collision: BehavHashCollision, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_use_scope_name") + )] + pub use_scope_name: bool, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_use_item_names") + )] + pub use_item_names: bool, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_use_code_size") + )] + pub use_code_size: bool, + #[cfg_attr( + feature = "config-manifest", + serde(default = "SabryHashConfig::default_use_code_text") + )] + pub use_code_text: bool, +} + +impl SabryHashConfig { + fn default_size() -> usize { + 6 + } + fn default_collision() -> BehavHashCollision { + BehavHashCollision::default() + } + fn default_use_scope_name() -> bool { + true + } + fn default_use_item_names() -> bool { + false + } + fn default_use_code_size() -> bool { + true + } + fn default_use_code_text() -> bool { + false + } +} + +impl Default for SabryHashConfig { + fn default() -> Self { + Self { + size: Self::default_size(), + collision: Self::default_collision(), + use_scope_name: Self::default_use_scope_name(), + use_code_size: Self::default_use_code_size(), + use_code_text: Self::default_use_code_text(), + use_item_names: Self::default_use_item_names(), + } + } +} + +/// \[package.metadata.sabry.sass\].module_name_collision option +#[derive(Default, Clone, Copy)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(rename_all = "lowercase"))] +pub enum BehavSassModCollision { + #[default] + Merge, + Error, +} + +/// \[package.metadata.sabry.hash\].collision option +#[derive(Default, Clone, Copy)] +#[cfg_attr(feature = "config-manifest", derive(serde::Deserialize))] +#[cfg_attr(feature = "config-manifest", serde(rename_all = "lowercase"))] +pub enum BehavHashCollision { + #[default] + Ignore, + Error, +} diff --git a/sabry_intrnl/src/config/mod.rs b/sabry_intrnl/src/config/mod.rs deleted file mode 100644 index 5c4f63b..0000000 --- a/sabry_intrnl/src/config/mod.rs +++ /dev/null @@ -1,246 +0,0 @@ -pub mod manifest; -use manifest::{ManifestError, ValuableManifest}; -use serde::Deserialize; - -/// Sabry configuration, as it is from package.metadata.sabry -#[derive(Default, Deserialize, Clone)] -pub struct SabryConfig { - #[serde(default = "SabryCssConfig::default")] - pub css: SabryCssConfig, - #[serde(default = "SabrySassConfig::default")] - pub sass: SabrySassConfig, - #[serde(default = "SabryHashConfig::default")] - pub hash: SabryHashConfig, - #[serde(default = "SabryGrassConfig::default")] - pub grass: SabryGrassConfig, - #[serde(default = "SabryLightCssConfig::default")] - pub lightningcss: SabryLightCssConfig, -} - -impl SabryConfig { - /// Require sabry configuration for the current project from every place in the code - pub fn require() -> Result<Self, ManifestError> { - let manifest = manifest::read_manifest()?; - Ok(Self::from(&manifest)) - } -} - -impl From<&ValuableManifest> for SabryConfig { - fn from(value: &ValuableManifest) -> Self { - value - .package - .as_ref() - .and_then(|p| p.metadata.as_ref()) - .and_then(|m| m.sabry.as_ref()) - .map_or(Self::default(), |sbr| sbr.clone()) - } -} - -/// Sabry `css` configuration table -#[derive(Deserialize, Clone)] -pub struct SabryCssConfig { - pub bundle: Option<String>, - pub scopes: Option<String>, - pub prelude: Option<Vec<String>>, - #[serde(default = "SabryCssConfig::default_minify")] - pub minify: bool, -} - -impl SabryCssConfig { - fn default_minify() -> bool { - true - } -} - -impl Default for SabryCssConfig { - fn default() -> Self { - Self { - bundle: None, - scopes: None, - prelude: None, - minify: Self::default_minify(), - } - } -} - -/// Sabry `sass` configuration table -/// -/// (SASS/SCSS related config) -#[derive(Deserialize, Clone)] -pub struct SabrySassConfig { - #[serde(default = "SabrySassConfig::default_scanroot")] - pub scanroot: String, - pub modules: Option<Vec<String>>, - pub prelude: Option<Vec<String>>, - #[serde(default = "SabrySassConfig::default_intermediate_dir")] - pub intermediate_dir: String, - #[serde(default = "SabrySassConfig::default_module_name_collision")] - pub module_name_collision: BehavSassModCollision, -} - -impl SabrySassConfig { - fn default_scanroot() -> String { - "src".into() - } - fn default_intermediate_dir() -> String { - "target/.sabry/sass".into() - } - fn default_module_name_collision() -> BehavSassModCollision { - BehavSassModCollision::default() - } -} - -impl Default for SabrySassConfig { - fn default() -> Self { - Self { - scanroot: Self::default_scanroot(), - modules: None, - prelude: None, - intermediate_dir: Self::default_intermediate_dir(), - module_name_collision: Self::default_module_name_collision(), - } - } -} - -/// Sabry `hash` configuration table -#[derive(Deserialize, Clone)] -pub struct SabryHashConfig { - #[serde(default = "SabryHashConfig::default_size")] - pub size: usize, - #[serde(default = "SabryHashConfig::default_collision")] - pub collision: BehavHashCollision, - #[serde(default = "SabryHashConfig::default_use_scope_name")] - pub use_scope_name: bool, - #[serde(default = "SabryHashConfig::default_use_item_names")] - pub use_item_names: bool, - #[serde(default = "SabryHashConfig::default_use_code_size")] - pub use_code_size: bool, - #[serde(default = "SabryHashConfig::default_use_code_text")] - pub use_code_text: bool, -} - -impl SabryHashConfig { - fn default_size() -> usize { - 6 - } - fn default_collision() -> BehavHashCollision { - BehavHashCollision::default() - } - fn default_use_scope_name() -> bool { - true - } - fn default_use_item_names() -> bool { - false - } - fn default_use_code_size() -> bool { - true - } - fn default_use_code_text() -> bool { - false - } -} - -impl Default for SabryHashConfig { - fn default() -> Self { - Self { - size: Self::default_size(), - collision: Self::default_collision(), - use_scope_name: Self::default_use_scope_name(), - use_code_size: Self::default_use_code_size(), - use_code_text: Self::default_use_code_text(), - use_item_names: Self::default_use_item_names(), - } - } -} - -/// [grass] specific configuration for sabry -#[derive(Default, Deserialize, Clone)] -pub struct SabryGrassConfig {} - -/// [lightningcss] specific configuration for sabry -#[derive(Default, Deserialize, Clone)] -pub struct SabryLightCssConfig { - pub targets: SabryLightTargets, -} - -/// \[package.metadata.sabry.lightningcss.targets\] configuration. -/// -/// This is a convenience layer under [lightningcss::targets::Browsers] structure accepted -/// by lightningcss. -/// -/// This structure is a part of [SabryConfig], which faces developer with more convenient -/// `safari = "13.2"` syntax. -#[derive(Default, Deserialize, Clone)] -pub struct SabryLightTargets { - pub android: Option<String>, - pub chrome: Option<String>, - pub edge: Option<String>, - pub firefox: Option<String>, - pub ie: Option<String>, - pub ios_saf: Option<String>, - pub opera: Option<String>, - pub safari: Option<String>, - pub samsung: Option<String>, -} - -impl SabryLightTargets { - pub fn parse_ver(ver: &str) -> u32 { - let mut vercode: u32 = 0; - let vers = ver.split('.'); - for (i, dig) in vers.into_iter().enumerate() { - let dignum = dig - .parse::<u32>() - .unwrap_or_else(|_| panic!("Invalid browser specifier: '{dig}'")); - - let shift = 16 - 8 * i; - vercode |= dignum << shift; - } - vercode - } -} - -#[cfg(feature = "compile")] -impl From<SabryLightTargets> for lightningcss::targets::Browsers { - fn from(value: SabryLightTargets) -> Self { - Self { - android: value.android.map(|s| SabryLightTargets::parse_ver(&s)), - chrome: value.chrome.map(|s| SabryLightTargets::parse_ver(&s)), - edge: value.edge.map(|s| SabryLightTargets::parse_ver(&s)), - firefox: value.firefox.map(|s| SabryLightTargets::parse_ver(&s)), - ie: value.ie.map(|s| SabryLightTargets::parse_ver(&s)), - ios_saf: value.ios_saf.map(|s| SabryLightTargets::parse_ver(&s)), - opera: value.opera.map(|s| SabryLightTargets::parse_ver(&s)), - safari: value.safari.map(|s| SabryLightTargets::parse_ver(&s)), - samsung: value.samsung.map(|s| SabryLightTargets::parse_ver(&s)), - } - } -} - -/// \[package.metadata.sabry.sass\].module_name_collision option -#[derive(Default, Deserialize, Clone, Copy)] -#[serde(rename_all = "lowercase")] -pub enum BehavSassModCollision { - #[default] - Merge, - Error, -} - -/// \[package.metadata.sabry.hash\].collision option -#[derive(Default, Deserialize, Clone, Copy)] -#[serde(rename_all = "lowercase")] -pub enum BehavHashCollision { - #[default] - Ignore, - Error, -} - -#[cfg(test)] -mod test { - use super::{manifest, SabryConfig}; - - #[test] - fn empty_manifest_still_worth_a_read() { - let manifest = manifest::read_manifest().unwrap(); - let _conf = SabryConfig::from(&manifest); - } -} diff --git a/sabry_intrnl/src/lib.rs b/sabry_intrnl/src/lib.rs index 495a300..e23b628 100644 --- a/sabry_intrnl/src/lib.rs +++ b/sabry_intrnl/src/lib.rs @@ -1,6 +1,2 @@ -#![doc = include_str!("../README.md")] - -pub mod compiler; -pub mod config; -pub mod scoper; -pub mod syntax; +pub mod conf; +pub mod style; diff --git a/sabry_intrnl/src/scoper/hash.rs b/sabry_intrnl/src/scoper/hash.rs deleted file mode 100644 index c6e6844..0000000 --- a/sabry_intrnl/src/scoper/hash.rs +++ /dev/null @@ -1,95 +0,0 @@ -/// Convenience wrapper for String-being-a-hash -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct ScopeHash(String); - -impl ScopeHash { - #[cfg(feature = "scope")] - pub fn new(scope: &super::ArbitraryScope, config: &crate::config::SabryHashConfig) -> Self { - use base64::Engine; - use raffia::ast::InterpolableIdent; - use std::hash::Hasher; - - use crate::scoper::sanitize_css_member; - - let mut hasher = std::hash::DefaultHasher::new(); - - if config.use_scope_name { - hasher.write(scope.name.to_string().as_bytes()); - } - if config.use_code_text { - hasher.write(scope.adapter().source().as_bytes()); - } - if config.use_code_size { - hasher.write(&scope.adapter().source().len().to_ne_bytes()); - } - if config.use_item_names { - let classes = scope.adapter().class_selectors(); - let ids = scope.adapter().id_selectors(); - //# types/tags dont participate - //# child-parent dont participate - - let merged_items = classes - .iter() - .map(|s| &s.name) - .chain(ids.iter().map(|i| &i.name)) - .map(|ident| match ident { - InterpolableIdent::Literal(lit) => Some(lit), - _ => None, - }) - .filter_map(|mbl| mbl.map(|l| l.raw)) - .collect::<String>(); - - hasher.write(merged_items.as_bytes()); - } - - let hash = hasher.finish().to_be_bytes(); - - let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(hash); - let hash = sanitize_css_member(&hash); - - Self(hash) - } - - pub fn as_str(&self) -> &str { - &self.0 - } - - #[cfg(test)] - pub fn test_init(v: String) -> Self { - Self(v) - } -} - -#[cfg(test)] -mod test { - use syn::Ident; - - use crate::{ - config::SabryHashConfig, scoper::ArbitraryScope, syntax::ostrta::OneSyntaxToRuleThemAll, - }; - - use super::ScopeHash; - - #[test] - fn hash_matches() { - let source = ".cls1{color:red; &-dark{color: black} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; - - let scope1 = ArbitraryScope::from_source( - OneSyntaxToRuleThemAll::Scss, - syn::parse_str::<Ident>("lasifudm").unwrap(), - source, - ) - .unwrap(); - let hash1 = ScopeHash::new(&scope1, &SabryHashConfig::default()); - - let scope2 = ArbitraryScope::from_source( - OneSyntaxToRuleThemAll::Scss, - syn::parse_str::<Ident>("lasifudm").unwrap(), - source, - ) - .unwrap(); - let hash2 = ScopeHash::new(&scope2, &SabryHashConfig::default()); - - assert_eq!(hash1, hash2); - } -} diff --git a/sabry_intrnl/src/style/compiler.rs b/sabry_intrnl/src/style/compiler.rs new file mode 100644 index 0000000..c875e73 --- /dev/null +++ b/sabry_intrnl/src/style/compiler.rs @@ -0,0 +1,49 @@ +use crate::{conf::SabryConfig, style::syntax::SyntaxKind}; + +/// Convenience wrapper on Grass and Lightningcss +pub struct CompilerAdapter { + #[allow(dead_code)] // without 'compile' feature, still want to set this + config: SabryConfig, +} + +impl CompilerAdapter { + pub fn new(config: SabryConfig) -> Self { + Self { config } + } + + /// Compile given SASS/SCSS into CSS + /// with respect to self.config + pub fn compile_module( + &self, + syntax: SyntaxKind, + code: &str, + ) -> Result<String, SabryCompilerError> { + let importer = sasso::FsImporter::new(self.config.sass.modules.clone().unwrap_or_default()); + let options = sasso::Options::new() + .with_style(if self.config.css.minify { + sasso::OutputStyle::Compressed + } else { + sasso::OutputStyle::Expanded + }) + .with_importer(&importer) + .with_syntax(syntax.into()); + + Ok(sasso::compile(code, &options)?) + } +} + +#[derive(thiserror::Error)] +pub enum SabryCompilerError { + #[error("Could not compile into CSS with sasso")] + Compile(#[from] sasso::Error), +} + +impl std::fmt::Debug for SabryCompilerError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let explain = match self { + Self::Compile(err) => format!("{err}"), + }; + + write!(f, "{explain}") + } +} diff --git a/sabry_intrnl/src/style/mod.rs b/sabry_intrnl/src/style/mod.rs new file mode 100644 index 0000000..3d7d6dc --- /dev/null +++ b/sabry_intrnl/src/style/mod.rs @@ -0,0 +1,5 @@ +pub mod scope; +pub mod syntax; + +#[cfg(feature = "style-compiler")] +pub mod compiler; diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/style/scope.rs similarity index 84% rename from sabry_intrnl/src/scoper/mod.rs rename to sabry_intrnl/src/style/scope.rs index 4d6ad29..f6b79f5 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/style/scope.rs @@ -1,14 +1,14 @@ use std::fmt::Debug; -use hash::ScopeHash; use raffia::{ Span, Spanned, ast::{InterpolableIdent, TypeSelector}, }; -use crate::syntax::{StylesheetAdapter, ostrta::OneSyntaxToRuleThemAll}; - -pub mod hash; +use crate::{ + conf::SabryHashConfig, + style::syntax::{StylesheetAdapter, SyntaxKind}, +}; #[derive(thiserror::Error)] pub enum ScopeError { @@ -36,7 +36,7 @@ pub struct ArbitraryScope<'s> { impl<'s> ArbitraryScope<'s> { /// Parse given source code with given syntax and assign given name pub fn from_source( - syntax: OneSyntaxToRuleThemAll, + syntax: SyntaxKind, name: syn::Ident, source: &'s str, ) -> Result<Self, ScopeError> { @@ -54,11 +54,7 @@ impl<'s> ArbitraryScope<'s> { /// Consume arbitrary scope and create a [HashedScope] in its basis /// /// This function calls [HashedScope::new] under the hood - #[cfg(feature = "scope")] - pub fn hashed( - self, - config: &crate::config::SabryHashConfig, - ) -> Result<HashedScope<'s>, ScopeError> { + pub fn hashed(self, config: &SabryHashConfig) -> Result<HashedScope<'s>, ScopeError> { let hash = ScopeHash::new(&self, config); HashedScope::new(hash, self) } @@ -309,7 +305,6 @@ impl ScopedSelector { } /// Generate rusty member ident based on selector type and CSS ident - #[cfg(feature = "scope")] pub fn gen_rusty_ident(&self) -> Option<syn::Ident> { let arb = &self.as_arbitrary().ident; let basic = sanitize_css_member(arb); @@ -375,7 +370,6 @@ impl ScopedSelector { } } -#[cfg(feature = "scope")] pub fn sanitize_css_member(source: &str) -> String { let mut target = String::with_capacity(source.len() + 1); @@ -417,18 +411,77 @@ pub fn sanitize_css_member(source: &str) -> String { target } +/// Convenience wrapper for String-being-a-hash +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ScopeHash(String); + +impl ScopeHash { + pub fn new(scope: &ArbitraryScope, config: &SabryHashConfig) -> Self { + use base64::Engine; + use raffia::ast::InterpolableIdent; + use std::hash::Hasher; + + let mut hasher = std::hash::DefaultHasher::new(); + + if config.use_scope_name { + hasher.write(scope.name.to_string().as_bytes()); + } + if config.use_code_text { + hasher.write(scope.adapter().source().as_bytes()); + } + if config.use_code_size { + hasher.write(&scope.adapter().source().len().to_ne_bytes()); + } + if config.use_item_names { + let classes = scope.adapter().class_selectors(); + let ids = scope.adapter().id_selectors(); + //# types/tags dont participate + //# child-parent dont participate + + let merged_items = classes + .iter() + .map(|s| &s.name) + .chain(ids.iter().map(|i| &i.name)) + .map(|ident| match ident { + InterpolableIdent::Literal(lit) => Some(lit), + _ => None, + }) + .filter_map(|mbl| mbl.map(|l| l.raw)) + .collect::<String>(); + + hasher.write(merged_items.as_bytes()); + } + + let hash = hasher.finish().to_be_bytes(); + + let hash = base64::prelude::BASE64_URL_SAFE_NO_PAD.encode(hash); + let hash = sanitize_css_member(&hash); + + Self(hash) + } + + pub fn as_str(&self) -> &str { + &self.0 + } + + #[cfg(test)] + pub fn test_init(v: String) -> Self { + Self(v) + } +} + #[cfg(test)] mod test { + use crate::{ + conf::SabryHashConfig, + style::{scope::HashedScope, syntax::SyntaxKind}, + }; + + use super::ScopeHash; use std::collections::HashSet; use syn::Ident; - use crate::{ - config::SabryHashConfig, - scoper::{HashedScope, hash::ScopeHash}, - syntax::ostrta::OneSyntaxToRuleThemAll, - }; - use super::ArbitraryScope; #[test] @@ -446,12 +499,9 @@ mod test { "".to_string(), // comes from `div` which has no html hashed code, still want to check presense ]); - let scope = ArbitraryScope::from_source( - OneSyntaxToRuleThemAll::Scss, - syn::parse_str("scope1").unwrap(), - code, - ) - .unwrap(); + let scope = + ArbitraryScope::from_source(SyntaxKind::Scss, syn::parse_str("scope1").unwrap(), code) + .unwrap(); let scope = HashedScope::new(hash, scope).unwrap(); let scope_selector_htmls = scope .hashed_selectors @@ -495,7 +545,7 @@ mod test { let hash_cfg = SabryHashConfig::default(); let scope = ArbitraryScope::from_source( - OneSyntaxToRuleThemAll::Scss, + SyntaxKind::Scss, syn::parse_str::<Ident>("scope2oiej").unwrap(), code, ) @@ -512,4 +562,27 @@ mod test { assert_eq!(expect_ident_names, sels); } + + #[test] + fn hash_matches() { + let source = ".cls1{color:red; &-dark{color: black} #id1 {color:green;} div {color:blue;}} .cls3#id2{color: black;}"; + + let scope1 = ArbitraryScope::from_source( + SyntaxKind::Scss, + syn::parse_str::<Ident>("lasifudm").unwrap(), + source, + ) + .unwrap(); + let hash1 = ScopeHash::new(&scope1, &SabryHashConfig::default()); + + let scope2 = ArbitraryScope::from_source( + SyntaxKind::Scss, + syn::parse_str::<Ident>("lasifudm").unwrap(), + source, + ) + .unwrap(); + let hash2 = ScopeHash::new(&scope2, &SabryHashConfig::default()); + + assert_eq!(hash1, hash2); + } } diff --git a/sabry_intrnl/src/syntax/mod.rs b/sabry_intrnl/src/style/syntax.rs similarity index 78% rename from sabry_intrnl/src/syntax/mod.rs rename to sabry_intrnl/src/style/syntax.rs index d1d8c67..c2997c8 100644 --- a/sabry_intrnl/src/syntax/mod.rs +++ b/sabry_intrnl/src/style/syntax.rs @@ -1,26 +1,20 @@ -use ostrta::OneSyntaxToRuleThemAll; use raffia::{ + ParserBuilder, ast::{ ClassSelector, ComplexSelectorChild, CompoundSelector, IdSelector, InterpolableIdent, NestingSelector, PseudoClassSelector, SimpleSelector, Statement, Stylesheet, TypeSelector, }, - ParserBuilder, }; -pub mod ostrta; - /// Convenience wrapper for [Stylesheet] pub struct StylesheetAdapter<'s> { - pub syntax: OneSyntaxToRuleThemAll, + pub syntax: SyntaxKind, source: &'s str, stylesheet: Stylesheet<'s>, } impl<'s> StylesheetAdapter<'s> { - pub fn new( - source: &'s str, - syntax: OneSyntaxToRuleThemAll, - ) -> Result<Self, raffia::error::Error> { + pub fn new(source: &'s str, syntax: SyntaxKind) -> Result<Self, raffia::error::Error> { Ok(Self { stylesheet: ParserBuilder::new(source) .ignore_comments() @@ -141,16 +135,82 @@ impl<'s> StylesheetAdapter<'s> { } } +/// Convenience unification entrypoint +/// to make friends with all the different syntax-consumers +#[derive(Default, Debug, Clone, Copy)] +pub enum SyntaxKind { + #[default] + Scss, + Sass, + Css, +} + +impl TryFrom<&str> for SyntaxKind { + type Error = (); + fn try_from(value: &str) -> Result<Self, Self::Error> { + match value { + "sass" => Ok(Self::Sass), + "scss" => Ok(Self::Scss), + "css" => Ok(Self::Css), + _ => Err(()), + } + } +} + +impl TryFrom<raffia::Syntax> for SyntaxKind { + type Error = (); + fn try_from(value: raffia::Syntax) -> Result<Self, Self::Error> { + match value { + raffia::Syntax::Sass => Ok(Self::Sass), + raffia::Syntax::Scss => Ok(Self::Scss), + raffia::Syntax::Css => Ok(Self::Css), + _ => Err(()), + } + } +} + +#[cfg(feature = "style-compiler")] +impl From<sasso::Syntax> for SyntaxKind { + fn from(value: sasso::Syntax) -> Self { + match value { + sasso::Syntax::Sass => Self::Sass, + sasso::Syntax::Scss => Self::Scss, + sasso::Syntax::Css => Self::Css, + } + } +} + +impl From<SyntaxKind> for raffia::Syntax { + fn from(value: SyntaxKind) -> Self { + match value { + SyntaxKind::Sass => Self::Sass, + SyntaxKind::Scss => Self::Scss, + SyntaxKind::Css => Self::Css, + } + } +} + +#[cfg(feature = "style-compiler")] +impl From<SyntaxKind> for sasso::Syntax { + fn from(value: SyntaxKind) -> Self { + match value { + SyntaxKind::Scss => Self::Scss, + SyntaxKind::Sass => Self::Sass, + SyntaxKind::Css => Self::Css, + } + } +} + #[cfg(test)] mod test { use std::collections::HashSet; use raffia::{ - ast::{InterpolableIdent, TypeSelector}, Spanned, + ast::{InterpolableIdent, TypeSelector}, }; - use crate::syntax::ostrta::OneSyntaxToRuleThemAll; + use crate::style::syntax::SyntaxKind; use super::StylesheetAdapter; @@ -206,7 +266,7 @@ div#id2 let expect_tags = HashSet::from(["ul", "div", "span"]); //scss - let adp = StylesheetAdapter::new(source_scss, OneSyntaxToRuleThemAll::Scss).unwrap(); + let adp = StylesheetAdapter::new(source_scss, SyntaxKind::Scss).unwrap(); let classes = adp .class_selectors() @@ -244,7 +304,7 @@ div#id2 assert_eq!(expect_tags, tags); //sass - let adp = StylesheetAdapter::new(source_sass, OneSyntaxToRuleThemAll::Sass).unwrap(); + let adp = StylesheetAdapter::new(source_sass, SyntaxKind::Sass).unwrap(); let classes = adp .class_selectors() @@ -288,7 +348,7 @@ div#id2 let newname = "cls203-jg7ihgjhftyfhjh"; let expect = ".cls1{color:red; .cls203-jg7ihgjhftyfhjh{color:green;}}"; - let adp = StylesheetAdapter::new(scss, OneSyntaxToRuleThemAll::Scss).unwrap(); + let adp = StylesheetAdapter::new(scss, SyntaxKind::Scss).unwrap(); let classes = adp.class_selectors(); let target_class = classes[0].clone(); diff --git a/sabry_intrnl/src/syntax/ostrta.rs b/sabry_intrnl/src/syntax/ostrta.rs deleted file mode 100644 index bf320a0..0000000 --- a/sabry_intrnl/src/syntax/ostrta.rs +++ /dev/null @@ -1,61 +0,0 @@ -/// Convenience unification entrypoint -/// to make friends with all the different syntax-consumers -#[derive(Default, Debug, Clone, Copy)] -pub enum OneSyntaxToRuleThemAll { - #[default] - Scss, - Sass, -} - -impl TryFrom<&str> for OneSyntaxToRuleThemAll { - type Error = (); - fn try_from(value: &str) -> Result<Self, Self::Error> { - match value { - "sass" => Ok(Self::Sass), - "scss" => Ok(Self::Scss), - _ => Err(()), - } - } -} - -impl TryFrom<raffia::Syntax> for OneSyntaxToRuleThemAll { - type Error = (); - fn try_from(value: raffia::Syntax) -> Result<Self, Self::Error> { - match value { - raffia::Syntax::Sass => Ok(Self::Sass), - raffia::Syntax::Scss => Ok(Self::Scss), - _ => Err(()), - } - } -} - -#[cfg(feature = "compile")] -impl TryFrom<grass::InputSyntax> for OneSyntaxToRuleThemAll { - type Error = (); - fn try_from(value: grass::InputSyntax) -> Result<Self, Self::Error> { - match value { - grass::InputSyntax::Sass => Ok(Self::Sass), - grass::InputSyntax::Scss => Ok(Self::Scss), - _ => Err(()), - } - } -} - -impl From<OneSyntaxToRuleThemAll> for raffia::Syntax { - fn from(value: OneSyntaxToRuleThemAll) -> Self { - match value { - OneSyntaxToRuleThemAll::Sass => Self::Sass, - OneSyntaxToRuleThemAll::Scss => Self::Scss, - } - } -} - -#[cfg(feature = "compile")] -impl From<OneSyntaxToRuleThemAll> for grass::InputSyntax { - fn from(value: OneSyntaxToRuleThemAll) -> Self { - match value { - OneSyntaxToRuleThemAll::Scss => Self::Scss, - OneSyntaxToRuleThemAll::Sass => Self::Sass, - } - } -} diff --git a/sabry_procmacro/Cargo.toml b/sabry_procmacro/Cargo.toml index 99262d8..caff4a6 100644 --- a/sabry_procmacro/Cargo.toml +++ b/sabry_procmacro/Cargo.toml @@ -19,5 +19,4 @@ proc-macro = true sabry_procmacro_impl.workspace = true [features] -const-compile = ["sabry_procmacro_impl/const-compile"] nightly = ["sabry_procmacro_impl/nightly"] diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index 229540a..551237e 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -13,18 +13,21 @@ all-features = true rustdoc-args = ["--cfg", "docsrs"] [dependencies] -cfg-if.workspace = true +## Workspace +sabry_intrnl.workspace = true +sabry_intrnl.features = ["config-manifest", "style-compiler"] +## Css +raffia.workspace = true +## Util itertools.workspace = true +regex.workspace = true +## Codegen +thiserror.workspace = true proc-macro2.workspace = true proc-macro2.features = ["span-locations"] quote.workspace = true -raffia.workspace = true -regex.workspace = true -sabry_intrnl.workspace = true -sabry_intrnl.features = ["scope"] syn.workspace = true syn.features = ["parsing"] [features] -const-compile = ["sabry_intrnl/compile"] nightly = [] diff --git a/sabry_procmacro_impl/src/impls/mod.rs b/sabry_procmacro_impl/src/impls/mod.rs index eaac922..a82dcb4 100644 --- a/sabry_procmacro_impl/src/impls/mod.rs +++ b/sabry_procmacro_impl/src/impls/mod.rs @@ -3,7 +3,7 @@ use std::{fmt::Debug, fs, path::PathBuf, str::FromStr}; use proc_macro2::{Span, TokenStream}; use quote::{ToTokens, TokenStreamExt, quote}; use regex::Regex; -use sabry_intrnl::syntax::ostrta::OneSyntaxToRuleThemAll; +use sabry_intrnl::style::syntax::SyntaxKind; use syn::{Ident, LitStr, Token, braced, parse::Parse}; pub mod scssy; @@ -96,9 +96,9 @@ impl ToString for ArbitraryStyleBlock { } #[derive(Default, Debug, Clone, Copy)] -pub struct ArbitraryStyleSyntax(OneSyntaxToRuleThemAll); +pub struct ArbitraryStyleSyntax(SyntaxKind); -impl From<ArbitraryStyleSyntax> for OneSyntaxToRuleThemAll { +impl From<ArbitraryStyleSyntax> for SyntaxKind { fn from(value: ArbitraryStyleSyntax) -> Self { value.0 } @@ -107,8 +107,9 @@ impl From<ArbitraryStyleSyntax> for OneSyntaxToRuleThemAll { impl ToTokens for ArbitraryStyleSyntax { fn to_tokens(&self, tokens: &mut TokenStream) { match self.0 { - OneSyntaxToRuleThemAll::Sass => tokens.append_all(quote! {"sass"}), - OneSyntaxToRuleThemAll::Scss => tokens.append_all(quote! {"scss"}), + SyntaxKind::Sass => tokens.append_all(quote! {"sass"}), + SyntaxKind::Scss => tokens.append_all(quote! {"scss"}), + SyntaxKind::Css => tokens.append_all(quote! {"css"}), } } } @@ -116,7 +117,7 @@ impl ToTokens for ArbitraryStyleSyntax { impl TryFrom<&str> for ArbitraryStyleSyntax { type Error = (); fn try_from(value: &str) -> Result<Self, Self::Error> { - Ok(Self(OneSyntaxToRuleThemAll::try_from(value)?)) + Ok(Self(SyntaxKind::try_from(value)?)) } } diff --git a/sabry_procmacro_impl/src/impls/scssy.rs b/sabry_procmacro_impl/src/impls/scssy.rs index 7ab9854..c3eb91d 100644 --- a/sabry_procmacro_impl/src/impls/scssy.rs +++ b/sabry_procmacro_impl/src/impls/scssy.rs @@ -2,7 +2,7 @@ use std::path::PathBuf; use proc_macro2::TokenStream; use quote::quote; -use sabry_intrnl::scoper::ArbitraryScope; +use sabry_intrnl::style::scope::ArbitraryScope; use syn::{Ident, parse::ParseStream}; use super::{ArbitraryStyleBlock, ArbitraryStyleSyntax}; @@ -67,12 +67,3 @@ impl MacroSyntax { }) } } - -// impl Parse for MacroSyntax { -// fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { -// Self::parse_syn(input, None) -// } -// } - -#[cfg(test)] -mod test {} diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index cf0d81b..459e175 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -1,12 +1,14 @@ use std::path::PathBuf; -use cfg_if::cfg_if; use itertools::Itertools; use proc_macro2::{Span, TokenStream}; use quote::quote; use sabry_intrnl::{ - config::SabryConfig, - scoper::{ArbitraryScope, ScopedSelector, sanitize_css_member}, + conf::SabryConfig, + style::{ + compiler::CompilerAdapter, + scope::{ArbitraryScope, ScopedSelector, sanitize_css_member}, + }, }; use syn::{ Ident, Token, @@ -102,7 +104,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: PathBuf) -> TokenStream let ident = sanitize_css_member(&s); let fnident = syn::parse_str::<Ident>(format!("_{ident}").as_str()) .expect("BUG: invalid ident for nesting selector formed"); - let formatstr = format!("{{c}}{}", &s); + let formatstr = format!("{{c}}{}", s); let doc = format!("Nesting selector. Originated from '&{s}'"); quote! { @@ -152,53 +154,42 @@ pub fn styly_macro_impl(input: TokenStream, source_path: PathBuf) -> TokenStream let mod_docs = format!( "'{}' style scope. The hash class is `{}`", - &scope_ident, &scope_wrapper_ident + scope_ident, scope_wrapper_ident ); let wrp_docs = format!( "hash class for '{}' scope. All HTML elements should have this class applied", - &scope_ident + scope_ident ); if constant { - cfg_if! { - if #[cfg(feature = "const-compile")] { - use sabry_intrnl::compiler::CompilerAdapter; - let compiler = CompilerAdapter::new(config.clone()); - let css = match compiler.compile_module(ms.syntax.0, &scope.hashed_code) { - Ok(c) => c, - Err(e) => { - return syn::Error::new( - ms.code.span, - format!("Could not compile const inline: {e:?}"), - ) - .to_compile_error() - } - }; - - let const_docs = format!("The compiled CSS style for {} scope", &scope_ident); - let const_wrapper_ident = syn::parse_str::<Ident>( - format!("{}_CSS", &scope_ident.to_string().to_uppercase()).as_str(), - ) - .expect("BUG: We just converted valid Ident to string and uppercased"); - - quote! { - #[doc = #const_docs] - #scope_vis const #const_wrapper_ident: &str = #css ; - #[doc = #wrp_docs] - #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; - #[doc = #mod_docs] - #scope_vis mod #scope_ident { - #(#scope_members)* - #(#special_nesting_members)* - } - } - } else { + let compiler = CompilerAdapter::new(config.clone()); + let css = match compiler.compile_module(ms.syntax.0, &scope.hashed_code) { + Ok(c) => c, + Err(e) => { return syn::Error::new( - Span::call_site(), - "`styly!(const scope...` requires `experimental-const-scoping` feature flag", + ms.code.span, + format!("Could not compile const inline: {e:?}"), ) .to_compile_error(); } + }; + + let const_docs = format!("The compiled CSS style for {} scope", scope_ident); + let const_wrapper_ident = syn::parse_str::<Ident>( + format!("{}_CSS", scope_ident.to_string().to_uppercase()).as_str(), + ) + .expect("BUG: We just converted valid Ident to string and uppercased"); + + quote! { + #[doc = #const_docs] + #scope_vis const #const_wrapper_ident: &str = #css ; + #[doc = #wrp_docs] + #scope_vis const #scope_wrapper_ident : &str = #scope_hash ; + #[doc = #mod_docs] + #scope_vis mod #scope_ident { + #(#scope_members)* + #(#special_nesting_members)* + } } } else { quote! { diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 4cc9d27..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,18 +0,0 @@ -#![doc = include_str!("../README.md")] -#![cfg_attr(docsrs, feature(doc_cfg))] - -#[cfg_attr(docsrs, doc(cfg(feature = "build")))] -#[cfg(feature = "build")] -pub use sabry_build::buildmagic::buildy; -#[cfg_attr(docsrs, doc(cfg(feature = "procmacro")))] -#[cfg(feature = "procmacro")] -pub use sabry_procmacro::*; - -// reexports -#[cfg_attr(docsrs, doc(cfg(all(feature = "build", feature = "internals"))))] -#[cfg(all(feature = "build", feature = "internals"))] -pub use sabry_build::*; - -#[cfg_attr(docsrs, doc(cfg(all(feature = "procmacro", feature = "internals"))))] -#[cfg(all(feature = "procmacro", feature = "internals"))] -pub use sabry_intrnl::*; From f0796aff9447add5d54936ce47891f91c283d199 Mon Sep 17 00:00:00 2001 From: spushk <spushk@spushk.work> Date: Wed, 21 Oct 2026 01:22:08 +0300 Subject: [PATCH 184/184] repo move --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a1a5e1d..2aa1b01 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ > **Repository moved** > -> On GithHub this repository is now a [push-mirror](https://source.spushk.ru/rustyworks/sabry) -> and will be removed from GH at 07-2026 +> On GithHub this repository is now a [push-mirror](https://git.spushk.work/rustyworks/sabry) > -> Crate will remain maintained +> Crate is still kinda maintained # 🧙🏻 SABRY - Syntactically Awesome, But RustY