From 002fe6ef09fd1642ee0bdfa762f4d3e2d16d385d Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 29 Sep 2025 17:24:57 +0900 Subject: [PATCH 1/5] Add new prop positioning --- libs/css/src/constant.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/libs/css/src/constant.rs b/libs/css/src/constant.rs index ba095ff8..8ceb9aaf 100644 --- a/libs/css/src/constant.rs +++ b/libs/css/src/constant.rs @@ -73,6 +73,39 @@ pub(super) static GLOBAL_STYLE_PROPERTY: phf::Map<&str, &[&str]> = phf_map! { "maskPos" => &["mask-position"], "maskImg" => &["mask-image"], }; + +pub(super) static GLOBAL_ENUM_STYLE_PROPERTY: phf::Map<&str, phf::Map<&str, phf::Map<&str, &str>>> = phf_map! { + "positioning " => phf_map! { + "top" => phf_map! { + "top" => "0", + }, + "right" => phf_map! { + "right" => "0", + }, + "bottom" => phf_map! { + "bottom" => "0", + }, + "left" => phf_map! { + "left" => "0", + }, + "top-right" => phf_map! { + "top" => "0", + "right" => "0", + }, + "top-left" => phf_map! { + "top" => "0", + "left" => "0", + }, + "bottom-left" => phf_map! { + "bottom" => "0", + "left" => "0", + }, + "bottom-right" => phf_map! { + "bottom" => "0", + "right" => "0", + }, + } +}; pub(super) static OPTIMIZE_MULTI_CSS_VALUE_PROPERTY: phf::Set<&str> = phf_set! { "font-family", "src", From f5364ca2244b207c40fcf115383e1a7f5f8cbf34 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Thu, 2 Oct 2025 19:03:42 +0900 Subject: [PATCH 2/5] Impelement enum type --- Cargo.lock | 117 ++++++++-------- bindings/devup-ui-wasm/Cargo.toml | 6 +- libs/css/Cargo.toml | 4 +- libs/css/src/constant.rs | 2 +- libs/css/src/lib.rs | 38 ++++- libs/extractor/Cargo.toml | 14 +- .../extract_style_from_expression.rs | 130 ++++++++++++------ .../extract_style_from_member_expression.rs | 116 ++++++++-------- libs/extractor/src/gen_class_name.rs | 39 ++++++ libs/extractor/src/lib.rs | 115 ++++++++++++++++ ..._tests__extract_enum_style_property-2.snap | 8 ++ ..._tests__extract_enum_style_property-3.snap | 45 ++++++ ..._tests__extract_enum_style_property-4.snap | 54 ++++++++ ..._tests__extract_enum_style_property-5.snap | 45 ++++++ ..._tests__extract_enum_style_property-6.snap | 99 +++++++++++++ ...r__tests__extract_enum_style_property.snap | 27 ++++ ...tests__optimize_multi_css_value_1.snap.new | 37 ----- libs/sheet/Cargo.toml | 4 +- 18 files changed, 683 insertions(+), 217 deletions(-) create mode 100644 libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-2.snap create mode 100644 libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-3.snap create mode 100644 libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-4.snap create mode 100644 libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-5.snap create mode 100644 libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-6.snap create mode 100644 libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property.snap delete mode 100644 libs/extractor/src/snapshots/extractor__tests__optimize_multi_css_value_1.snap.new diff --git a/Cargo.lock b/Cargo.lock index 9967921f..bdbdfc3f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -519,9 +519,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -651,9 +651,9 @@ dependencies = [ [[package]] name = "oxc_allocator" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b810fad23016e9a2a64d3b09f72ead6035312164788715dedd79b223f95b059" +checksum = "014a6bc98da00c997b35db73a7aced63d9e148ddcfe1a6bd759e87b903d95757" dependencies = [ "allocator-api2", "bumpalo", @@ -664,9 +664,9 @@ dependencies = [ [[package]] name = "oxc_ast" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1af40f244ac2215c43baeb5776412caf09777ab176ac49151f4ecb1f424d26b9" +checksum = "8f88ca3bb0ed59cebad6883e7a09e16e19fd1dbec7fcd7659c5e696456f3ea37" dependencies = [ "bitflags", "oxc_allocator", @@ -681,9 +681,9 @@ dependencies = [ [[package]] name = "oxc_ast_macros" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dced6af2266937211ef38e2e57d1f2ba2c380b7be13c856bb33dcd59aefedf" +checksum = "baf7bc9985027ebc3b8daaa4bcdeeafe8d027fb6f3ffed3dfc496a851d7b3ffe" dependencies = [ "phf", "proc-macro2", @@ -693,9 +693,9 @@ dependencies = [ [[package]] name = "oxc_ast_visit" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd60e51a6a2569b0a32a2703c37424c7daca1cff974960055cb643dd7eac8b1f" +checksum = "2750ee1156a0700d483c2b148dac6d45fbbdbbc44dfae973ab36fc8d92811259" dependencies = [ "oxc_allocator", "oxc_ast", @@ -705,9 +705,9 @@ dependencies = [ [[package]] name = "oxc_codegen" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee93207625b3bec356f87f1b1b10b417ca683b0eaa510ccf7f565d1c0078784e" +checksum = "e1b5e6819479a869dc791c98e23007b3dfc6c888b79b63691c0919d8db1f64e0" dependencies = [ "bitflags", "cow-utils", @@ -727,15 +727,15 @@ dependencies = [ [[package]] name = "oxc_data_structures" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11226a027c0320b450943c1d5a0d1eba9079d15c3a9edfbab3ecd4c8fb03d4bf" +checksum = "45904e6b2cf3e05e586a526f4668dac3ab3cb1a88f8ef065503d1336e85e64d2" [[package]] name = "oxc_diagnostics" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "880c30372eb360acfe377008f83a41bc391765b72c00a633f974ef9804282619" +checksum = "6f0976fcb5e3093b08e384b87dd660029ff99ac3a4ba5f57a2eebcb6d1fd2e3a" dependencies = [ "cow-utils", "oxc-miette", @@ -744,9 +744,9 @@ dependencies = [ [[package]] name = "oxc_ecmascript" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e2d1f7ee0df2c512b9219b82504ed6e31d2b04c629c6173e2a3508fc623e422" +checksum = "d5a38604b87cf5c118aad0a20b3197d44439bcf59680fb7d3e13dff605a27d6b" dependencies = [ "cow-utils", "num-bigint", @@ -759,9 +759,9 @@ dependencies = [ [[package]] name = "oxc_estree" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7288d04e52e326681027d44ea1b1545a6f4ab3392cb88a10dba93ebaaaa3f9" +checksum = "a8f909b432bafad7fe98609e2fd00b6b046c143fda4246a4e7bb7e41b47cf65e" [[package]] name = "oxc_index" @@ -771,9 +771,9 @@ checksum = "2fa07b0cfa997730afed43705766ef27792873fdf5215b1391949fec678d2392" [[package]] name = "oxc_parser" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "273778f7be75802da774d17a001c38e75d8387cfcfc2212a76c4625e266777a5" +checksum = "b9ea8250a9ba1b4690a9e0a545cde6e0c676c4ad788a2711dbbaa4429faec3d1" dependencies = [ "bitflags", "cow-utils", @@ -794,9 +794,9 @@ dependencies = [ [[package]] name = "oxc_regular_expression" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a5a3dc8e02a05bd8ccc3888f9ae0dbbcee7da9a677a1f3b7f86254907604ff" +checksum = "93e783f03017ed46d9d50aed65de775fdcc57914d0a997300ea5816e1ed5d583" dependencies = [ "bitflags", "oxc_allocator", @@ -810,9 +810,9 @@ dependencies = [ [[package]] name = "oxc_semantic" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2357277e9ace9b086ded811f9fee3cf1bc943ea226cce4640d88578212937471" +checksum = "9f4bac78c59d63b90a5b39702ae259adfdb84fc69d61490c43c6547ab3bb3823" dependencies = [ "itertools 0.14.0", "oxc_allocator", @@ -845,9 +845,9 @@ dependencies = [ [[package]] name = "oxc_span" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96f74ab03fd114c4ed30011692cc602b2eed51c51ee0eef4d46ca3522adcb6b2" +checksum = "d8b10b09752e1043e988081be2aabcc2abb948da5339adf66623c84fe959fd6f" dependencies = [ "compact_str", "oxc-miette", @@ -858,9 +858,9 @@ dependencies = [ [[package]] name = "oxc_syntax" -version = "0.90.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c0c41d429d7883b00cece42a1285e8ef40ed936d4342e378016b4b2daf4c3e6" +checksum = "f60dbb25911dbbd22ac87792d208030d21ec077e8e6938990803685637ef201e" dependencies = [ "bitflags", "cow-utils", @@ -873,7 +873,6 @@ dependencies = [ "oxc_index", "oxc_span", "phf", - "rustc-hash", "unicode-id-start", ] @@ -1047,9 +1046,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -1059,9 +1058,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -1186,9 +1185,9 @@ checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" [[package]] name = "serde" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -1207,18 +1206,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -1455,9 +1454,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -1468,9 +1467,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -1482,9 +1481,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.53" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -1495,9 +1494,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1505,9 +1504,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -1518,18 +1517,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.53" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aee0a0f5343de9221a0d233b04520ed8dc2e6728dce180b1dcd9288ec9d9fa3c" +checksum = "4e381134e148c1062f965a42ed1f5ee933eef2927c3f70d1812158f711d39865" dependencies = [ "js-sys", "minicov", @@ -1540,9 +1539,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.53" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a369369e4360c2884c3168d22bded735c43cccae97bbc147586d4b480edd138d" +checksum = "b673bca3298fe582aeef8352330ecbad91849f85090805582400850f8270a2e8" dependencies = [ "proc-macro2", "quote", @@ -1551,9 +1550,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/bindings/devup-ui-wasm/Cargo.toml b/bindings/devup-ui-wasm/Cargo.toml index e99db717..179d3f84 100644 --- a/bindings/devup-ui-wasm/Cargo.toml +++ b/bindings/devup-ui-wasm/Cargo.toml @@ -15,7 +15,7 @@ crate-type = ["cdylib", "rlib"] default = ["console_error_panic_hook"] [dependencies] -wasm-bindgen = "0.2.103" +wasm-bindgen = "0.2.104" extractor = { path = "../../libs/extractor" } sheet = { path = "../../libs/sheet" } css = { path = "../../libs/css" } @@ -26,13 +26,13 @@ css = { path = "../../libs/css" } # code size when deploying. console_error_panic_hook = { version = "0.1.7", optional = true } once_cell = "1.21.3" -js-sys = "0.3.80" +js-sys = "0.3.81" serde_json = "1.0.145" serde-wasm-bindgen = "0.6.5" bimap = { version = "0.6.3", features = ["serde"] } [dev-dependencies] -wasm-bindgen-test = "0.3.53" +wasm-bindgen-test = "0.3.54" serial_test = "3.2.0" insta = "1.43.2" rstest = "0.26.1" diff --git a/libs/css/Cargo.toml b/libs/css/Cargo.toml index 486d8897..c330a7b0 100644 --- a/libs/css/Cargo.toml +++ b/libs/css/Cargo.toml @@ -7,8 +7,8 @@ edition = "2024" once_cell = "1.21.3" phf = { version = "0.13", features = ["macros"] } serial_test = "3.2.0" -serde = { version = "1.0.225", features = ["derive"] } -regex = "1.11.2" +serde = { version = "1.0.228", features = ["derive"] } +regex = "1.11.3" bimap = { version = "0.6.3" } [dev-dependencies] diff --git a/libs/css/src/constant.rs b/libs/css/src/constant.rs index 8ceb9aaf..c988ec5b 100644 --- a/libs/css/src/constant.rs +++ b/libs/css/src/constant.rs @@ -75,7 +75,7 @@ pub(super) static GLOBAL_STYLE_PROPERTY: phf::Map<&str, &[&str]> = phf_map! { }; pub(super) static GLOBAL_ENUM_STYLE_PROPERTY: phf::Map<&str, phf::Map<&str, phf::Map<&str, &str>>> = phf_map! { - "positioning " => phf_map! { + "positioning" => phf_map! { "top" => phf_map! { "top" => "0", }, diff --git a/libs/css/src/lib.rs b/libs/css/src/lib.rs index 23e29aab..7e5a865a 100644 --- a/libs/css/src/lib.rs +++ b/libs/css/src/lib.rs @@ -11,10 +11,14 @@ mod selector_separator; pub mod style_selector; pub mod utils; +use std::collections::BTreeMap; use std::hash::{DefaultHasher, Hash, Hasher}; + use crate::class_map::GLOBAL_CLASS_MAP; -use crate::constant::{COLOR_HASH, F_SPACE_RE, GLOBAL_STYLE_PROPERTY, ZERO_RE}; +use crate::constant::{ + COLOR_HASH, F_SPACE_RE, GLOBAL_ENUM_STYLE_PROPERTY, GLOBAL_STYLE_PROPERTY, ZERO_RE, +}; use crate::debug::is_debug; use crate::file_map::get_file_num_by_filename; use crate::num_to_nm_base::num_to_nm_base; @@ -65,6 +69,38 @@ pub fn disassemble_property(property: &str) -> Vec { }) } +pub fn get_enum_property_value(property: &str, value: &str) -> Option> { + if let Some(map) = GLOBAL_ENUM_STYLE_PROPERTY.get(property) { + if let Some(map) = map.get(value) { + Some( + map.entries() + .map(|(k, v)| (k.to_string(), v.to_string())) + .collect(), + ) + } else { + Some(vec![]) + } + } else { + None + } +} + +pub fn get_enum_property_map(property: &str) -> Option>> { + if let Some(map) = GLOBAL_ENUM_STYLE_PROPERTY.get(property) { + let mut ret = BTreeMap::new(); + for (k, v) in map.entries() { + let mut tmp = BTreeMap::new(); + v.entries().for_each(|(k, v)| { + tmp.insert(*k, *v); + }); + ret.insert(*k, tmp); + } + Some(ret) + } else { + None + } +} + pub fn keyframes_to_keyframes_name(keyframes: &str, filename: Option<&str>) -> String { if is_debug() { format!("k-{keyframes}") diff --git a/libs/extractor/Cargo.toml b/libs/extractor/Cargo.toml index a4b037b5..1c63d406 100644 --- a/libs/extractor/Cargo.toml +++ b/libs/extractor/Cargo.toml @@ -4,13 +4,13 @@ version = "0.1.0" edition = "2024" [dependencies] -oxc_parser = "0.90.0" -oxc_syntax = "0.90.0" -oxc_span = "0.90.0" -oxc_allocator = "0.90.0" -oxc_ast = "0.90.0" -oxc_ast_visit = "0.90.0" -oxc_codegen = "0.90.0" +oxc_parser = "0.93.0" +oxc_syntax = "0.93.0" +oxc_span = "0.93.0" +oxc_allocator = "0.93.0" +oxc_ast = "0.93.0" +oxc_ast_visit = "0.93.0" +oxc_codegen = "0.93.0" css = { path = "../css" } phf = "0.13" strum = "0.27.2" diff --git a/libs/extractor/src/extractor/extract_style_from_expression.rs b/libs/extractor/src/extractor/extract_style_from_expression.rs index 7a4498bc..ffbb118d 100644 --- a/libs/extractor/src/extractor/extract_style_from_expression.rs +++ b/libs/extractor/src/extractor/extract_style_from_expression.rs @@ -1,3 +1,4 @@ + use crate::{ ExtractStyleProp, css_utils::css_to_style, @@ -14,8 +15,8 @@ use crate::{ }, }; use css::{ - disassemble_property, is_special_property::is_special_property, style_selector::StyleSelector, - utils::to_kebab_case, + disassemble_property, get_enum_property_map, get_enum_property_value, + is_special_property::is_special_property, style_selector::StyleSelector, utils::to_kebab_case, }; use oxc_allocator::CloneIn; use oxc_ast::{ @@ -37,7 +38,6 @@ pub fn extract_style_from_expression<'a>( selector: &Option, ) -> ExtractResult<'a> { let mut typo = false; - println!("expression: {:?}", expression); if name.is_none() && selector.is_none() { let mut style_order = None; @@ -265,16 +265,26 @@ pub fn extract_style_from_expression<'a>( if let Some(value) = get_string_by_literal_expression(expression) { if let Some(name) = name { ExtractResult { - styles: vec![ExtractStyleProp::Static(if typo { - ExtractStyleValue::Typography(value.to_string()) + styles: if typo { + vec![ExtractStyleProp::Static(ExtractStyleValue::Typography( + value.to_string(), + ))] } else { - ExtractStyleValue::Static(ExtractStaticStyle::new( - name, - &value, - level, - selector.clone(), - )) - })], + // Create a new ExtractStaticStyle + if let Some(map) = get_enum_property_value(name, &value) { + map.into_iter() + .map(|(k, v)| { + ExtractStyleProp::Static(ExtractStyleValue::Static( + ExtractStaticStyle::new(&k, &v, level, selector.clone()), + )) + }) + .collect() + } else { + vec![ExtractStyleProp::Static(ExtractStyleValue::Static( + ExtractStaticStyle::new(name, &value, level, selector.clone()), + ))] + } + }, ..ExtractResult::default() } } else { @@ -292,28 +302,26 @@ pub fn extract_style_from_expression<'a>( styles: if un.operator == UnaryOperator::Void { vec![] } else { - vec![ExtractStyleProp::Static(ExtractStyleValue::Dynamic( - ExtractDynamicStyle::new( - name.unwrap(), - level, - &expression_to_code(expression), - selector.clone(), - ), - ))] + vec![dynamic_style( + ast_builder, + name.unwrap(), + expression, + level, + selector, + )] }, ..ExtractResult::default() }, Expression::BinaryExpression(_) | Expression::StaticMemberExpression(_) | Expression::CallExpression(_) => ExtractResult { - styles: vec![ExtractStyleProp::Static(ExtractStyleValue::Dynamic( - ExtractDynamicStyle::new( - name.unwrap(), - level, - &expression_to_code(expression), - selector.clone(), - ), - ))], + styles: vec![dynamic_style( + ast_builder, + name.unwrap(), + expression, + level, + selector, + )], ..ExtractResult::default() }, Expression::TSAsExpression(exp) => extract_style_from_expression( @@ -355,14 +363,13 @@ pub fn extract_style_from_expression<'a>( styles: vec![], }] } else { - vec![ExtractStyleProp::Static(ExtractStyleValue::Dynamic( - ExtractDynamicStyle::new( - name.unwrap(), - level, - &expression_to_code(expression), - selector.clone(), - ), - ))] + vec![dynamic_style( + ast_builder, + name.unwrap(), + expression, + level, + selector, + )] }, ..ExtractResult::default() }, @@ -410,14 +417,13 @@ pub fn extract_style_from_expression<'a>( } } else { ExtractResult { - styles: vec![ExtractStyleProp::Static(ExtractStyleValue::Dynamic( - ExtractDynamicStyle::new( - name, - level, - &identifier.name, - selector.clone(), - ), - ))], + styles: vec![dynamic_style( + ast_builder, + name, + expression, + level, + selector, + )], ..ExtractResult::default() } } @@ -582,3 +588,39 @@ pub fn extract_style_from_expression<'a>( } } } + +pub fn dynamic_style<'a>( + ast_builder: &AstBuilder<'a>, + name: &str, + expression: &Expression<'a>, + level: u8, + selector: &Option, +) -> ExtractStyleProp<'a> { + if let Some(map) = get_enum_property_map(name) { + ExtractStyleProp::Enum { + condition: expression.clone_in(ast_builder.allocator), + map: map + .into_iter() + .map(|(k, v)| { + ( + k.to_string(), + v.into_iter() + .map(|(k, v)| { + ExtractStyleProp::Static(ExtractStyleValue::Static( + ExtractStaticStyle::new(k, v, level, selector.clone()), + )) + }) + .collect::>(), + ) + }) + .collect(), + } + } else { + ExtractStyleProp::Static(ExtractStyleValue::Dynamic(ExtractDynamicStyle::new( + name, + level, + &expression_to_code(expression), + selector.clone(), + ))) + } +} diff --git a/libs/extractor/src/extractor/extract_style_from_member_expression.rs b/libs/extractor/src/extractor/extract_style_from_member_expression.rs index fba3da51..82590306 100644 --- a/libs/extractor/src/extractor/extract_style_from_member_expression.rs +++ b/libs/extractor/src/extractor/extract_style_from_member_expression.rs @@ -1,11 +1,11 @@ use crate::{ ExtractStyleProp, - extract_style::{ - extract_dynamic_style::ExtractDynamicStyle, extract_style_value::ExtractStyleValue, + extractor::{ + ExtractResult, + extract_style_from_expression::{dynamic_style, extract_style_from_expression}, }, - extractor::{ExtractResult, extract_style_from_expression::extract_style_from_expression}, utils::{ - expression_to_code, get_number_by_literal_expression, get_string_by_literal_expression, + get_number_by_literal_expression, get_string_by_literal_expression, }, }; use css::style_selector::StyleSelector; @@ -51,21 +51,20 @@ pub(super) fn extract_style_from_member_expression<'a>( props: None, styles: etc .map(|etc| { - vec![ExtractStyleProp::Static(ExtractStyleValue::Dynamic( - ExtractDynamicStyle::new( - name.unwrap(), - level, - &expression_to_code(&Expression::ComputedMemberExpression( - ast_builder.alloc_computed_member_expression( - SPAN, - etc, - mem_expression.clone_in(ast_builder.allocator), - false, - ), - )), - selector.clone(), + vec![dynamic_style( + ast_builder, + name.unwrap(), + &Expression::ComputedMemberExpression( + ast_builder.alloc_computed_member_expression( + SPAN, + etc, + mem_expression.clone_in(ast_builder.allocator), + false, + ), ), - ))] + level, + selector, + )] }) .unwrap_or_default(), tag: None, @@ -79,21 +78,20 @@ pub(super) fn extract_style_from_member_expression<'a>( if let ArrayExpressionElement::SpreadElement(sp) = p { map.insert( idx.to_string(), - Box::new(ExtractStyleProp::Static(ExtractStyleValue::Dynamic( - ExtractDynamicStyle::new( - name.unwrap(), - level, - &expression_to_code(&Expression::ComputedMemberExpression( - ast_builder.alloc_computed_member_expression( - SPAN, - sp.argument.clone_in(ast_builder.allocator), - mem_expression.clone_in(ast_builder.allocator), - false, - ), - )), - selector.clone(), + Box::new(dynamic_style( + ast_builder, + name.unwrap(), + &Expression::ComputedMemberExpression( + ast_builder.alloc_computed_member_expression( + SPAN, + sp.argument.clone_in(ast_builder.allocator), + mem_expression.clone_in(ast_builder.allocator), + false, + ), ), - ))), + level, + &selector.clone(), + )), ); } else if let Some(p) = p.as_expression_mut() { map.insert( @@ -139,21 +137,20 @@ pub(super) fn extract_style_from_member_expression<'a>( match etc { None => return ExtractResult::default(), - Some(etc) => ret.push(ExtractStyleProp::Static(ExtractStyleValue::Dynamic( - ExtractDynamicStyle::new( - name.unwrap(), - level, - &expression_to_code(&Expression::ComputedMemberExpression( - ast_builder.alloc_computed_member_expression( - SPAN, - etc, - mem_expression.clone_in(ast_builder.allocator), - false, - ), - )), - selector.clone(), + Some(etc) => ret.push(dynamic_style( + ast_builder, + name.unwrap(), + &Expression::ComputedMemberExpression( + ast_builder.alloc_computed_member_expression( + SPAN, + etc, + mem_expression.clone_in(ast_builder.allocator), + false, + ), ), - ))), + level, + selector, + )), } } @@ -183,21 +180,18 @@ pub(super) fn extract_style_from_member_expression<'a>( map, }); } else if let Expression::Identifier(_) = &mut mem.object { - ret.push(ExtractStyleProp::Static(ExtractStyleValue::Dynamic( - ExtractDynamicStyle::new( - name.unwrap(), - level, - &expression_to_code(&Expression::ComputedMemberExpression( - ast_builder.alloc_computed_member_expression( - SPAN, - mem.object.clone_in(ast_builder.allocator), - mem_expression.clone_in(ast_builder.allocator), - false, - ), - )), - selector.clone(), - ), - ))) + ret.push(dynamic_style( + ast_builder, + name.unwrap(), + &Expression::ComputedMemberExpression(ast_builder.alloc_computed_member_expression( + SPAN, + mem.object.clone_in(ast_builder.allocator), + mem_expression.clone_in(ast_builder.allocator), + false, + )), + level, + selector, + )) } ExtractResult { diff --git a/libs/extractor/src/gen_class_name.rs b/libs/extractor/src/gen_class_name.rs index 1796a098..9ffb45c9 100644 --- a/libs/extractor/src/gen_class_name.rs +++ b/libs/extractor/src/gen_class_name.rs @@ -30,6 +30,45 @@ fn gen_class_name<'a>( filename: Option<&str>, ) -> Option> { match style_prop { + ExtractStyleProp::Enum { map, condition } => { + let properties = map.iter_mut().map(|(key, value)| { + ast_builder.object_property_kind_object_property( + SPAN, + PropertyKind::Init, + PropertyKey::StringLiteral(ast_builder.alloc_string_literal( + SPAN, + ast_builder.atom(key), + None, + )), + merge_expression_for_class_name( + ast_builder, + value + .iter_mut() + .map(|v| gen_class_name(ast_builder, v, style_order, filename).unwrap()) + .collect::>(), + ) + .unwrap(), + false, + false, + false, + ) + }); + let obj = ast_builder.expression_object( + SPAN, + oxc_allocator::Vec::from_iter_in(properties, ast_builder.allocator), + ); + Some(convert_class_name( + ast_builder, + &Expression::ComputedMemberExpression( + ast_builder.alloc_computed_member_expression( + SPAN, + obj, + condition.clone_in(ast_builder.allocator), + false, + ), + ), + )) + } ExtractStyleProp::Static(st) => { if let Some(style_order) = style_order { st.set_style_order(style_order); diff --git a/libs/extractor/src/lib.rs b/libs/extractor/src/lib.rs index 6ea16db1..83b98aeb 100644 --- a/libs/extractor/src/lib.rs +++ b/libs/extractor/src/lib.rs @@ -30,6 +30,10 @@ pub enum ExtractStyleProp<'a> { consequent: Option>>, alternate: Option>>, }, + Enum { + condition: Expression<'a>, + map: BTreeMap>>, + }, Expression { styles: Vec, expression: Expression<'a>, @@ -65,6 +69,10 @@ impl ExtractStyleProp<'_> { ExtractStyleProp::MemberExpression { map, .. } => { map.values().flat_map(|s| s.extract()).collect() } + ExtractStyleProp::Enum { map, .. } => map + .values() + .flat_map(|s| s.iter().flat_map(|s| s.extract())) + .collect(), } } } @@ -7096,4 +7104,111 @@ keyframes({ .unwrap() )); } + + #[test] + #[serial] + fn extract_enum_style_property() { + reset_class_map(); + assert_debug_snapshot!(ToBTreeSet::from( + extract( + "test.tsx", + r#"import {Box} from '@devup-ui/core' + + "#, + ExtractOption { + package: "@devup-ui/core".to_string(), + css_dir: "@devup-ui/core".to_string(), + single_css: false, + import_main_css: false + } + ) + .unwrap() + )); + + // wrong case + reset_class_map(); + assert_debug_snapshot!(ToBTreeSet::from( + extract( + "test.tsx", + r#"import {Box} from '@devup-ui/core' + + "#, + ExtractOption { + package: "@devup-ui/core".to_string(), + css_dir: "@devup-ui/core".to_string(), + single_css: false, + import_main_css: false + } + ) + .unwrap() + )); + + reset_class_map(); + assert_debug_snapshot!(ToBTreeSet::from( + extract( + "test.tsx", + r#"import {Box} from '@devup-ui/core' + + "#, + ExtractOption { + package: "@devup-ui/core".to_string(), + css_dir: "@devup-ui/core".to_string(), + single_css: false, + import_main_css: false + } + ) + .unwrap() + )); + + reset_class_map(); + assert_debug_snapshot!(ToBTreeSet::from( + extract( + "test.tsx", + r#"import {Box} from '@devup-ui/core' + + "#, + ExtractOption { + package: "@devup-ui/core".to_string(), + css_dir: "@devup-ui/core".to_string(), + single_css: false, + import_main_css: false + } + ) + .unwrap() + )); + + reset_class_map(); + assert_debug_snapshot!(ToBTreeSet::from( + extract( + "test.tsx", + r#"import {Box} from '@devup-ui/core' + + "#, + ExtractOption { + package: "@devup-ui/core".to_string(), + css_dir: "@devup-ui/core".to_string(), + single_css: false, + import_main_css: false + } + ) + .unwrap() + )); + + reset_class_map(); + assert_debug_snapshot!(ToBTreeSet::from( + extract( + "test.tsx", + r#"import {Box} from '@devup-ui/core' + + "#, + ExtractOption { + package: "@devup-ui/core".to_string(), + css_dir: "@devup-ui/core".to_string(), + single_css: false, + import_main_css: false + } + ) + .unwrap() + )); + } } diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-2.snap b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-2.snap new file mode 100644 index 00000000..a2d19d4e --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-2.snap @@ -0,0 +1,8 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n \n \"#,\nExtractOption\n{\n package: \"@devup-ui/core\".to_string(), css_dir:\n \"@devup-ui/core\".to_string(), single_css: false, import_main_css: false\n}).unwrap())" +--- +ToBTreeSet { + styles: {}, + code: "
;\n", +} diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-3.snap b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-3.snap new file mode 100644 index 00000000..0163aca1 --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-3.snap @@ -0,0 +1,45 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n \n \"#,\nExtractOption\n{\n package: \"@devup-ui/core\".to_string(), css_dir:\n \"@devup-ui/core\".to_string(), single_css: false, import_main_css: false\n}).unwrap())" +--- +ToBTreeSet { + styles: { + Static( + ExtractStaticStyle { + property: "bottom", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "left", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "right", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "top", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + }, + code: "import \"@devup-ui/core/devup-ui-0.css\";\n
;\n", +} diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-4.snap b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-4.snap new file mode 100644 index 00000000..115f3d38 --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-4.snap @@ -0,0 +1,54 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n \n \"#,\nExtractOption\n{\n package: \"@devup-ui/core\".to_string(), css_dir:\n \"@devup-ui/core\".to_string(), single_css: false, import_main_css: false\n}).unwrap())" +--- +ToBTreeSet { + styles: { + Static( + ExtractStaticStyle { + property: "bottom", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "left", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "right", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "top", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "width", + value: "100%", + level: 0, + selector: None, + style_order: None, + }, + ), + }, + code: "import \"@devup-ui/core/devup-ui-0.css\";\n
;\n", +} diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-5.snap b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-5.snap new file mode 100644 index 00000000..d7790f99 --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-5.snap @@ -0,0 +1,45 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n \n \"#,\nExtractOption\n{\n package: \"@devup-ui/core\".to_string(), css_dir:\n \"@devup-ui/core\".to_string(), single_css: false, import_main_css: false\n}).unwrap())" +--- +ToBTreeSet { + styles: { + Static( + ExtractStaticStyle { + property: "bottom", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "left", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "right", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "top", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + }, + code: "import \"@devup-ui/core/devup-ui-0.css\";\n
;\n", +} diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-6.snap b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-6.snap new file mode 100644 index 00000000..8d8014e6 --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property-6.snap @@ -0,0 +1,99 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n \n \"#,\nExtractOption\n{\n package: \"@devup-ui/core\".to_string(), css_dir:\n \"@devup-ui/core\".to_string(), single_css: false, import_main_css: false\n}).unwrap())" +--- +ToBTreeSet { + styles: { + Static( + ExtractStaticStyle { + property: "bottom", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "bottom", + value: "0", + level: 1, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "left", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "left", + value: "0", + level: 1, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "left", + value: "0", + level: 3, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "right", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "right", + value: "0", + level: 1, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "top", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "top", + value: "0", + level: 1, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "top", + value: "0", + level: 2, + selector: None, + style_order: None, + }, + ), + }, + code: "import \"@devup-ui/core/devup-ui-0.css\";\n
;\n", +} diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property.snap b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property.snap new file mode 100644 index 00000000..d87d3470 --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_enum_style_property.snap @@ -0,0 +1,27 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n \n \"#,\nExtractOption\n{\n package: \"@devup-ui/core\".to_string(), css_dir:\n \"@devup-ui/core\".to_string(), single_css: false, import_main_css: false\n}).unwrap())" +--- +ToBTreeSet { + styles: { + Static( + ExtractStaticStyle { + property: "left", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "top", + value: "0", + level: 0, + selector: None, + style_order: None, + }, + ), + }, + code: "import \"@devup-ui/core/devup-ui-0.css\";\n
;\n", +} diff --git a/libs/extractor/src/snapshots/extractor__tests__optimize_multi_css_value_1.snap.new b/libs/extractor/src/snapshots/extractor__tests__optimize_multi_css_value_1.snap.new deleted file mode 100644 index 7c01e86c..00000000 --- a/libs/extractor/src/snapshots/extractor__tests__optimize_multi_css_value_1.snap.new +++ /dev/null @@ -1,37 +0,0 @@ ---- -source: libs/extractor/src/lib.rs -assertion_line: 7082 -expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr##\"import { jsx as o, jsxs as s } from \"react/jsx-runtime\";\nimport { Button as y, Box as p, Center as F,css as f } from \"@devup-ui/react\";\nimport { clsx as E } from \"clsx\";\nconst g = f({\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\"\n});\n\"##,\nExtractOption\n{\n package: \"@devup-ui/react\".to_string(), css_dir:\n \"@devup-ui/react\".to_string(), single_css: false, import_main_css: false\n}).unwrap())" ---- -ToBTreeSet { - styles: { - Static( - ExtractStaticStyle { - property: "overflow", - value: "hidden", - level: 0, - selector: None, - style_order: None, - }, - ), - Static( - ExtractStaticStyle { - property: "text-overflow", - value: "ellipsis", - level: 0, - selector: None, - style_order: None, - }, - ), - Static( - ExtractStaticStyle { - property: "white-space", - value: "nowrap", - level: 0, - selector: None, - style_order: None, - }, - ), - }, - code: "import \"@devup-ui/react/devup-ui-0.css\";\nimport { jsx as o, jsxs as s } from \"react/jsx-runtime\";\nimport { clsx as E } from \"clsx\";\nconst g = \"a-a a-b a-c\";\n", -} diff --git a/libs/sheet/Cargo.toml b/libs/sheet/Cargo.toml index 1866ccd7..1f4e52f1 100644 --- a/libs/sheet/Cargo.toml +++ b/libs/sheet/Cargo.toml @@ -5,8 +5,8 @@ edition = "2024" [dependencies] css = { path = "../css" } -serde = { version = "1.0.225", features = ["derive"] } -regex = "1.11.2" +serde = { version = "1.0.228", features = ["derive"] } +regex = "1.11.3" once_cell = "1.21.3" extractor = { path = "../extractor" } From 1694702e99eedd0623a1b1ec0222e250f890099d Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Thu, 2 Oct 2025 19:20:20 +0900 Subject: [PATCH 3/5] Fix lint --- packages/rsbuild-plugin/src/__tests__/plugin.test.ts | 1 + packages/vite-plugin/src/__tests__/plugin.test.ts | 3 +++ packages/webpack-plugin/src/__tests__/loader.test.ts | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/packages/rsbuild-plugin/src/__tests__/plugin.test.ts b/packages/rsbuild-plugin/src/__tests__/plugin.test.ts index 8ed56c8a..dde49afa 100644 --- a/packages/rsbuild-plugin/src/__tests__/plugin.test.ts +++ b/packages/rsbuild-plugin/src/__tests__/plugin.test.ts @@ -221,6 +221,7 @@ const App = () => `, map: undefined, updatedBaseStyle: options.updatedBaseStyle, free: vi.fn(), + [Symbol.dispose]: vi.fn(), }) const ret = await transform.mock.calls[1][1]({ code: `import { Box } from '@devup-ui/react' diff --git a/packages/vite-plugin/src/__tests__/plugin.test.ts b/packages/vite-plugin/src/__tests__/plugin.test.ts index 90c3800f..ff464af0 100644 --- a/packages/vite-plugin/src/__tests__/plugin.test.ts +++ b/packages/vite-plugin/src/__tests__/plugin.test.ts @@ -189,6 +189,7 @@ describe('devupUIVitePlugin', () => { map: undefined, updatedBaseStyle: options.updatedBaseStyle, free: vi.fn(), + [Symbol.dispose]: vi.fn(), }) const plugin = DevupUI(options) @@ -218,6 +219,7 @@ describe('devupUIVitePlugin', () => { map: undefined, updatedBaseStyle: options.updatedBaseStyle, free: vi.fn(), + [Symbol.dispose]: vi.fn(), }) expect(writeFile).toHaveBeenCalledWith( join(resolve('df', 'devup-ui'), 'devup-ui.css'), @@ -244,6 +246,7 @@ describe('devupUIVitePlugin', () => { map: undefined, updatedBaseStyle: options.updatedBaseStyle, free: vi.fn(), + [Symbol.dispose]: vi.fn(), }) expect(await (plugin as any).transform('code', 'devup-ui.tsx')).toEqual( options.extractCss ? { code: 'long code' } : undefined, diff --git a/packages/webpack-plugin/src/__tests__/loader.test.ts b/packages/webpack-plugin/src/__tests__/loader.test.ts index adead08e..ed8cd7cc 100644 --- a/packages/webpack-plugin/src/__tests__/loader.test.ts +++ b/packages/webpack-plugin/src/__tests__/loader.test.ts @@ -55,6 +55,7 @@ describe('devupUILoader', () => { map: '{}', cssFile: 'cssFile', updatedBaseStyle: options.updatedBaseStyle, + [Symbol.dispose]: vi.fn(), }) devupUILoader.bind(t as any)(Buffer.from('code'), 'index.tsx') @@ -114,6 +115,7 @@ describe('devupUILoader', () => { map: undefined, cssFile: undefined, updatedBaseStyle: false, + [Symbol.dispose]: vi.fn(), }) devupUILoader.bind(t as any)(Buffer.from('code'), 'index.tsx') @@ -173,6 +175,7 @@ describe('devupUILoader', () => { map: undefined, cssFile: 'cssFile', updatedBaseStyle: false, + [Symbol.dispose]: vi.fn(), }) devupUILoader.bind(t as any)(Buffer.from('code'), 'index.tsx') @@ -207,6 +210,7 @@ describe('devupUILoader', () => { map: undefined, cssFile: 'cssFile', updatedBaseStyle: false, + [Symbol.dispose]: vi.fn(), }) devupUILoader.bind(t as any)(Buffer.from('code'), 'index.tsx') }) From fee97f8a3d79b9a4c62858deb8e1aea8c609e3a2 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Thu, 2 Oct 2025 19:22:16 +0900 Subject: [PATCH 4/5] Add positioning --- .changeset/angry-groups-camp.md | 5 +++++ .changeset/common-foxes-thank.md | 5 +++++ packages/react/src/types/props/position.ts | 10 ++++++++++ 3 files changed, 20 insertions(+) create mode 100644 .changeset/angry-groups-camp.md create mode 100644 .changeset/common-foxes-thank.md diff --git a/.changeset/angry-groups-camp.md b/.changeset/angry-groups-camp.md new file mode 100644 index 00000000..f69c31ba --- /dev/null +++ b/.changeset/angry-groups-camp.md @@ -0,0 +1,5 @@ +--- +'@devup-ui/wasm': patch +--- + +Implement enum prop diff --git a/.changeset/common-foxes-thank.md b/.changeset/common-foxes-thank.md new file mode 100644 index 00000000..da361a65 --- /dev/null +++ b/.changeset/common-foxes-thank.md @@ -0,0 +1,5 @@ +--- +'@devup-ui/react': patch +--- + +Add positioning diff --git a/packages/react/src/types/props/position.ts b/packages/react/src/types/props/position.ts index baca2783..906bc5b1 100644 --- a/packages/react/src/types/props/position.ts +++ b/packages/react/src/types/props/position.ts @@ -4,4 +4,14 @@ import type { ResponsiveValue } from '../responsive-value' export interface DevupUiPositionProps { pos?: ResponsiveValue + positioning?: ResponsiveValue< + | 'top' + | 'right' + | 'bottom' + | 'left' + | 'top-right' + | 'top-left' + | 'bottom-left' + | 'bottom-right' + > } From a67a13d0eb50f77580e23d654cd30532ba1f753e Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Thu, 2 Oct 2025 19:28:13 +0900 Subject: [PATCH 5/5] Fix lint --- libs/css/src/lib.rs | 1 - libs/extractor/src/extractor/extract_style_from_expression.rs | 1 - .../src/extractor/extract_style_from_member_expression.rs | 4 +--- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/libs/css/src/lib.rs b/libs/css/src/lib.rs index 7e5a865a..465b602f 100644 --- a/libs/css/src/lib.rs +++ b/libs/css/src/lib.rs @@ -14,7 +14,6 @@ pub mod utils; use std::collections::BTreeMap; use std::hash::{DefaultHasher, Hash, Hasher}; - use crate::class_map::GLOBAL_CLASS_MAP; use crate::constant::{ COLOR_HASH, F_SPACE_RE, GLOBAL_ENUM_STYLE_PROPERTY, GLOBAL_STYLE_PROPERTY, ZERO_RE, diff --git a/libs/extractor/src/extractor/extract_style_from_expression.rs b/libs/extractor/src/extractor/extract_style_from_expression.rs index ffbb118d..a854aefa 100644 --- a/libs/extractor/src/extractor/extract_style_from_expression.rs +++ b/libs/extractor/src/extractor/extract_style_from_expression.rs @@ -1,4 +1,3 @@ - use crate::{ ExtractStyleProp, css_utils::css_to_style, diff --git a/libs/extractor/src/extractor/extract_style_from_member_expression.rs b/libs/extractor/src/extractor/extract_style_from_member_expression.rs index 82590306..5a5c8b13 100644 --- a/libs/extractor/src/extractor/extract_style_from_member_expression.rs +++ b/libs/extractor/src/extractor/extract_style_from_member_expression.rs @@ -4,9 +4,7 @@ use crate::{ ExtractResult, extract_style_from_expression::{dynamic_style, extract_style_from_expression}, }, - utils::{ - get_number_by_literal_expression, get_string_by_literal_expression, - }, + utils::{get_number_by_literal_expression, get_string_by_literal_expression}, }; use css::style_selector::StyleSelector; use oxc_allocator::CloneIn;