From f61157940d6379c61e9cd6139d3debff99db9f51 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Thu, 11 Sep 2025 13:57:11 +0900 Subject: [PATCH 1/3] Fix kebab issue --- .changeset/big-lights-tease.md | 5 + .changeset/sour-carrots-flow.md | 5 + Cargo.lock | 129 ++++++++++-------- bindings/devup-ui-wasm/Cargo.toml | 8 +- libs/extractor/Cargo.toml | 16 +-- .../extract_style_from_expression.rs | 42 +++--- libs/extractor/src/lib.rs | 67 +++++++++ ...extractor__tests__extract_selector-10.snap | 35 +++++ ...extractor__tests__extract_selector-11.snap | 35 +++++ ...extractor__tests__extract_selector-12.snap | 22 +++ libs/sheet/Cargo.toml | 2 +- .../src/__tests__/css-loader.test.ts | 7 +- packages/webpack-plugin/src/css-loader.ts | 15 +- 13 files changed, 281 insertions(+), 107 deletions(-) create mode 100644 .changeset/big-lights-tease.md create mode 100644 .changeset/sour-carrots-flow.md create mode 100644 libs/extractor/src/snapshots/extractor__tests__extract_selector-10.snap create mode 100644 libs/extractor/src/snapshots/extractor__tests__extract_selector-11.snap create mode 100644 libs/extractor/src/snapshots/extractor__tests__extract_selector-12.snap diff --git a/.changeset/big-lights-tease.md b/.changeset/big-lights-tease.md new file mode 100644 index 00000000..84852e37 --- /dev/null +++ b/.changeset/big-lights-tease.md @@ -0,0 +1,5 @@ +--- +"@devup-ui/webpack-plugin": patch +--- + +Rm css cache for supporting turbopack and split css diff --git a/.changeset/sour-carrots-flow.md b/.changeset/sour-carrots-flow.md new file mode 100644 index 00000000..06afe95f --- /dev/null +++ b/.changeset/sour-carrots-flow.md @@ -0,0 +1,5 @@ +--- +"@devup-ui/wasm": patch +--- + +Fix convert kebab issue in selectors diff --git a/Cargo.lock b/Cargo.lock index b9ddd544..d32a9d54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,9 +86,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.18" +version = "1.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c" +checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" dependencies = [ "shlex", ] @@ -474,6 +474,15 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +dependencies = [ + "allocator-api2", +] + [[package]] name = "heck" version = "0.5.0" @@ -487,14 +496,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.4", ] [[package]] name = "insta" -version = "1.43.1" +version = "1.43.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "154934ea70c58054b556dd430b99a98c2a7ff5309ac9891597e339b5c28f4371" +checksum = "46fdb647ebde000f43b5b53f773c30cf9b0cb4300453208713fa38b2c70935a0" dependencies = [ "console", "once_cell", @@ -527,9 +536,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" dependencies = [ "once_cell", "wasm-bindgen", @@ -537,9 +546,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.172" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "lock_api" @@ -658,27 +667,28 @@ dependencies = [ [[package]] name = "oxc_allocator" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bdf7abfb88ad84430ccaf674d3fa463af5dceb0fd21ddaae83e7d2057668ce3" +checksum = "90237f36cf0cd3ea2dcf9682b48fa0c1762a4b407fdcc630f60a72c277877c9f" dependencies = [ "allocator-api2", "bumpalo", - "hashbrown", + "hashbrown 0.16.0", "oxc_data_structures", "rustc-hash", ] [[package]] name = "oxc_ast" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6a0d0ba1b1115575d35bfcd64f1458fe5db70fd988c08b742da223be2ea65f" +checksum = "a73ff824d44e51ac6c20381b644d48db4326935e811eeab29d52ca45e4d19670" dependencies = [ "bitflags", "oxc_allocator", "oxc_ast_macros", "oxc_data_structures", + "oxc_diagnostics", "oxc_estree", "oxc_regular_expression", "oxc_span", @@ -687,9 +697,9 @@ dependencies = [ [[package]] name = "oxc_ast_macros" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55f299cae11166ffa2fe60a87df1de417f2ac05f21b7dffba173a004f667f321" +checksum = "4f6af164ffae11248f32c449dad6a15f85d2154fe398bfec75502e0e2af5767a" dependencies = [ "phf", "proc-macro2", @@ -699,9 +709,9 @@ dependencies = [ [[package]] name = "oxc_ast_visit" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b27334d066366a5d1289f0de12725be057ff1ac90e5b8fe6589d94d14c8a1fa" +checksum = "a0ff52052e2cfb72fff062d4b7a393f9e9bded601dc16df796e3e460e17a9031" dependencies = [ "oxc_allocator", "oxc_ast", @@ -711,9 +721,9 @@ dependencies = [ [[package]] name = "oxc_cfg" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b807d606f5fe3ccf7ea64d2d857b755b6d31e8120c9de73591dd5851e6fe59a" +checksum = "859f43d20760f159a0b94264bd4d1d0b3c062b69c074d894e80e65295117719b" dependencies = [ "bitflags", "itertools 0.14.0", @@ -726,9 +736,9 @@ dependencies = [ [[package]] name = "oxc_codegen" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bca273354501a56cad5f7705cf857ace9d3a1a0c767503df323e0b5be30dffa" +checksum = "08e84ab41c9f848471f206674c94781bdc0364699fb14574a3d26dd2a2985844" dependencies = [ "bitflags", "cow-utils", @@ -748,15 +758,15 @@ dependencies = [ [[package]] name = "oxc_data_structures" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39656fa64b09714c36416d954897e8fb0f42c462c3082fda22c8760282f55a15" +checksum = "7f048c4ae3569bcc9dbbed29730b5c5f6dd3a35e9f5c3750cd4b3ed72381fbd0" [[package]] name = "oxc_diagnostics" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da029cea375d098fc97993afe96413563a55ebc80ff704b831e1dddea2e78911" +checksum = "7d96c95294deec2f038e8c7749a751f929c263da34cc68a621472c57c916c14e" dependencies = [ "cow-utils", "oxc-miette", @@ -765,9 +775,9 @@ dependencies = [ [[package]] name = "oxc_ecmascript" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b868985647967b7b173c9681a6486691cf9c5d0fb4e64d114e65cc8a8978657a" +checksum = "aa7b86782020722b3190c083dfc3de59cb73425d1fa275ff6f91b5b4ee509550" dependencies = [ "cow-utils", "num-bigint", @@ -780,9 +790,9 @@ dependencies = [ [[package]] name = "oxc_estree" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c20498f0f4b7afec0a8b772174bf7736d79ff31a8e0073dd9081747801407c5" +checksum = "97f7078ef0c6da21657f5dcade4540c65a460d2a26a42e4418d12ecac860143a" [[package]] name = "oxc_index" @@ -792,9 +802,9 @@ checksum = "2fa07b0cfa997730afed43705766ef27792873fdf5215b1391949fec678d2392" [[package]] name = "oxc_parser" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df72e23adc7a481f60a1410fafc3833a5411c077271e2a5bb97083c93b274683" +checksum = "ef71ea1e9bde8ff15f89b60874363359fc7e9796de7bf6cdff69fa54f6869bba" dependencies = [ "bitflags", "cow-utils", @@ -815,9 +825,9 @@ dependencies = [ [[package]] name = "oxc_regular_expression" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97247d67a14e17dcb004ca57e59283b235e1a84813a2048e0585ca901a64eb99" +checksum = "60a4df17b1c47c7fe749208f3a32158dfe90dca5ce630ce86cb9415521f87eb3" dependencies = [ "bitflags", "oxc_allocator", @@ -831,9 +841,9 @@ dependencies = [ [[package]] name = "oxc_semantic" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b81b3fd1c502c5179740c1688a4062f4db35cf4107da311786c2005809f542b5" +checksum = "8239fa4e6eaee7a16039a3292a3adbaa645ba3013bf2f801517d8fadc4396557" dependencies = [ "itertools 0.14.0", "oxc_allocator", @@ -867,9 +877,9 @@ dependencies = [ [[package]] name = "oxc_span" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b70dfb43ba1c04ae09ba4c0e85dbb7af2260ff029458fe45a7f4e7d0384442c" +checksum = "7d88265af3fb8fc2a2317144dfc40b5e120e0ebe21693cfbf7508d4d3ec6d74f" dependencies = [ "compact_str", "oxc-miette", @@ -880,9 +890,9 @@ dependencies = [ [[package]] name = "oxc_syntax" -version = "0.86.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5478a4c0b503ac61c09e5450a607517ad7f8dba36b7bea53db17d4b7221ef7df" +checksum = "b2596e7891b08899f7b74a1fb87b5f5c14153918bb2966648c84581f0a7e6795" dependencies = [ "bitflags", "cow-utils", @@ -935,7 +945,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54acf3a685220b533e437e264e4d932cfbdc4cc7ec0cd232ed73c08d03b8a7ca" dependencies = [ "fixedbitset", - "hashbrown", + "hashbrown 0.15.4", "indexmap", "serde", ] @@ -1472,21 +1482,22 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" dependencies = [ "bumpalo", "log", @@ -1498,9 +1509,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" dependencies = [ "cfg-if", "js-sys", @@ -1511,9 +1522,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1521,9 +1532,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" dependencies = [ "proc-macro2", "quote", @@ -1534,18 +1545,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.50" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" +checksum = "80cc7f8a4114fdaa0c58383caf973fc126cf004eba25c9dc639bccd3880d55ad" dependencies = [ "js-sys", "minicov", @@ -1556,9 +1567,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.50" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" +checksum = "c5ada2ab788d46d4bda04c9d567702a79c8ced14f51f221646a16ed39d0e6a5d" dependencies = [ "proc-macro2", "quote", @@ -1567,9 +1578,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/bindings/devup-ui-wasm/Cargo.toml b/bindings/devup-ui-wasm/Cargo.toml index b8502e0d..3043d3c0 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.100" +wasm-bindgen = "0.2.101" 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.77" +js-sys = "0.3.78" serde_json = "1.0.143" serde-wasm-bindgen = "0.6.5" bimap = { version = "0.6.3", features = ["serde"] } [dev-dependencies] -wasm-bindgen-test = "0.3.50" +wasm-bindgen-test = "0.3.51" serial_test = "3.2.0" -insta = "1.43.1" +insta = "1.43.2" rstest = "0.26.1" diff --git a/libs/extractor/Cargo.toml b/libs/extractor/Cargo.toml index a356f71d..777d0b16 100644 --- a/libs/extractor/Cargo.toml +++ b/libs/extractor/Cargo.toml @@ -4,19 +4,19 @@ version = "0.1.0" edition = "2024" [dependencies] -oxc_parser = "0.86.0" -oxc_syntax = "0.86.0" -oxc_span = "0.86.0" -oxc_allocator = "0.86.0" -oxc_ast = "0.86.0" -oxc_ast_visit = "0.86.0" -oxc_codegen = "0.86.0" +oxc_parser = "0.87.0" +oxc_syntax = "0.87.0" +oxc_span = "0.87.0" +oxc_allocator = "0.87.0" +oxc_ast = "0.87.0" +oxc_ast_visit = "0.87.0" +oxc_codegen = "0.87.0" css = { path = "../css" } phf = "0.13" strum = "0.27.2" strum_macros = "0.27.2" [dev-dependencies] -insta = "1.43.1" +insta = "1.43.2" serial_test = "3.2.0" rstest = "0.26.1" diff --git a/libs/extractor/src/extractor/extract_style_from_expression.rs b/libs/extractor/src/extractor/extract_style_from_expression.rs index a99e0aca..00fab3ac 100644 --- a/libs/extractor/src/extractor/extract_style_from_expression.rs +++ b/libs/extractor/src/extractor/extract_style_from_expression.rs @@ -185,38 +185,46 @@ pub fn extract_style_from_expression<'a>( level -= 1; } if c == ',' && level == 0 { - part_of_selector.push(&name[last_idx..idx]); + part_of_selector.push(name[last_idx..idx].trim()); last_idx = idx + 1; } if idx == name.len() - 1 { - part_of_selector.push(&name[last_idx..]); + part_of_selector.push(name[last_idx..].trim()); } } let sel = part_of_selector .iter() .map(|name| { - let name = name.trim(); if let Some(selector) = selector { - if name.starts_with("_theme") { - StyleSelector::from([ - to_kebab_case(name.replace("_theme", "theme").as_str()) - .as_str(), - &selector.to_string(), - ]) - .to_string() + if name.starts_with("_") { + if name.starts_with("_theme") { + StyleSelector::from([ + to_kebab_case(name.replace("_", "").as_str()).as_str(), + &selector.to_string(), + ]) + .to_string() + } else { + StyleSelector::from([ + &selector.to_string(), + to_kebab_case(name.replace("_", "").as_str()).as_str(), + ]) + .to_string() + } } else if name.contains("&") { - to_kebab_case(&name.replace("&", &selector.to_string())) + name.replace("&", &selector.to_string()) } else { - StyleSelector::from([ - selector.to_string().replace("_", "").as_str(), - &to_kebab_case(&name.replace("_", "")), - ]) - .to_string() + StyleSelector::from([&selector.to_string(), *name]).to_string() } } else { - StyleSelector::from(to_kebab_case(&name.replace("_", "")).as_str()) + if name.starts_with("_") { + StyleSelector::from( + to_kebab_case(&name.replace("_", "")).as_str(), + ) .to_string() + } else { + StyleSelector::from(name.replace("_", "").as_str()).to_string() + } } }) .collect::>() diff --git a/libs/extractor/src/lib.rs b/libs/extractor/src/lib.rs index c32e29a2..73a464ce 100644 --- a/libs/extractor/src/lib.rs +++ b/libs/extractor/src/lib.rs @@ -1960,6 +1960,73 @@ import clsx from 'clsx' ) .unwrap() )); + + reset_class_map(); + assert_debug_snapshot!(ToBTreeSet::from( + extract( + "test.tsx", + r#"import {Box} from '@devup-ui/core' + &": { + mx: 1 + } + }} /> + "#, + ExtractOption { + package: "@devup-ui/core".to_string(), + css_dir: "@devup-ui/core".to_string(), + single_css: true, + 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: true, + import_main_css: false + } + ) + .unwrap() + )); + + reset_class_map(); + assert_debug_snapshot!(ToBTreeSet::from( + extract( + "test.tsx", + r#"import {Box} from '@devup-ui/core' + &": { + color: "red" + } + } + } + }} /> + "#, + ExtractOption { + package: "@devup-ui/core".to_string(), + css_dir: "@devup-ui/core".to_string(), + single_css: true, + import_main_css: false + } + ) + .unwrap() + )); } #[test] diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_selector-10.snap b/libs/extractor/src/snapshots/extractor__tests__extract_selector-10.snap new file mode 100644 index 00000000..9d73a6cc --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_selector-10.snap @@ -0,0 +1,35 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n &\": {\n mx: 1\n }\n }} />\n \"#,\nExtractOption\n{\n package: \"@devup-ui/core\".to_string(), css_dir:\n \"@devup-ui/core\".to_string(), single_css: true, import_main_css: false\n}).unwrap())" +--- +ToBTreeSet { + styles: { + Static( + ExtractStaticStyle { + property: "margin-left", + value: "4px", + level: 0, + selector: Some( + Selector( + ".dataTestId > &", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "margin-right", + value: "4px", + level: 0, + selector: Some( + Selector( + ".dataTestId > &", + ), + ), + style_order: None, + }, + ), + }, + code: "import \"@devup-ui/core/devup-ui.css\";\n
;\n", +} diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_selector-11.snap b/libs/extractor/src/snapshots/extractor__tests__extract_selector-11.snap new file mode 100644 index 00000000..79249216 --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_selector-11.snap @@ -0,0 +1,35 @@ +--- +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: true, import_main_css: false\n}).unwrap())" +--- +ToBTreeSet { + styles: { + Static( + ExtractStaticStyle { + property: "margin-left", + value: "4px", + level: 0, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "margin-right", + value: "4px", + level: 0, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + }, + code: "import \"@devup-ui/core/devup-ui.css\";\n
;\n", +} diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_selector-12.snap b/libs/extractor/src/snapshots/extractor__tests__extract_selector-12.snap new file mode 100644 index 00000000..2cb4a6c7 --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_selector-12.snap @@ -0,0 +1,22 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n &\": {\n color: \"red\"\n }\n }\n }\n }} />\n \"#,\nExtractOption\n{\n package: \"@devup-ui/core\".to_string(), css_dir:\n \"@devup-ui/core\".to_string(), single_css: true, import_main_css: false\n}).unwrap())" +--- +ToBTreeSet { + styles: { + Static( + ExtractStaticStyle { + property: "color", + value: "red", + level: 0, + selector: Some( + Selector( + ".dataTestId > &:hover", + ), + ), + style_order: None, + }, + ), + }, + code: "import \"@devup-ui/core/devup-ui.css\";\n
;\n", +} diff --git a/libs/sheet/Cargo.toml b/libs/sheet/Cargo.toml index 137b2bc5..641cb644 100644 --- a/libs/sheet/Cargo.toml +++ b/libs/sheet/Cargo.toml @@ -11,7 +11,7 @@ once_cell = "1.21.3" extractor = { path = "../extractor" } [dev-dependencies] -insta = "1.43.1" +insta = "1.43.2" serde_json = "1.0.143" criterion = { version = "0.7", features = ["html_reports"] } rstest = "0.26.1" diff --git a/packages/webpack-plugin/src/__tests__/css-loader.test.ts b/packages/webpack-plugin/src/__tests__/css-loader.test.ts index 965842a0..3bebd1b1 100644 --- a/packages/webpack-plugin/src/__tests__/css-loader.test.ts +++ b/packages/webpack-plugin/src/__tests__/css-loader.test.ts @@ -47,20 +47,17 @@ describe('devupUICssLoader', () => { resourcePath: 'devup-ui.css', } as any)(Buffer.from('data'), '') - expect(getCss).toBeCalledTimes(0) + expect(getCss).toBeCalledTimes(1) vi.mocked(getCss).mockReset() devupUICssLoader.bind({ callback, addContextDependency, - _compiler: { - __DEVUP_CACHE: 'data', - }, getOptions: () => ({ watch: true }), resourcePath: 'devup-ui-10.css', } as any)(Buffer.from(''), '') - expect(getCss).toBeCalledTimes(0) + expect(getCss).toBeCalledTimes(1) }) }) diff --git a/packages/webpack-plugin/src/css-loader.ts b/packages/webpack-plugin/src/css-loader.ts index 0f1bce9b..678435e1 100644 --- a/packages/webpack-plugin/src/css-loader.ts +++ b/packages/webpack-plugin/src/css-loader.ts @@ -1,9 +1,6 @@ import { getCss } from '@devup-ui/wasm' import type { RawLoaderDefinitionFunction } from 'webpack' -let prevData = '' -let prevTime = '' - function getFileNumByFilename(filename: string) { if (filename.endsWith('devup-ui.css')) return null return parseInt(filename.split('devup-ui-')[1].split('.')[0]) @@ -11,18 +8,10 @@ function getFileNumByFilename(filename: string) { const devupUICssLoader: RawLoaderDefinitionFunction<{ watch: boolean -}> = function (source, map, meta) { +}> = function (_, map, meta) { const { watch } = this.getOptions() const fileNum = getFileNumByFilename(this.resourcePath) if (!watch) return this.callback(null, getCss(fileNum, true)) - const stringSource = - (this._compiler as any)?.__DEVUP_CACHE || source.toString() - - if (prevTime === stringSource) { - this.callback(null, prevData, map, meta) - return - } - prevTime = stringSource - this.callback(null, (prevData = getCss(fileNum, true)), map, meta) + this.callback(null, getCss(fileNum, true), map, meta) } export default devupUICssLoader From 9282943d36ac8c69bdb6f0e742329cb37a2ca0b1 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Thu, 11 Sep 2025 14:03:25 +0900 Subject: [PATCH 2/3] Fix lint --- .../src/extractor/extract_style_from_expression.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/libs/extractor/src/extractor/extract_style_from_expression.rs b/libs/extractor/src/extractor/extract_style_from_expression.rs index 00fab3ac..c9dd6684 100644 --- a/libs/extractor/src/extractor/extract_style_from_expression.rs +++ b/libs/extractor/src/extractor/extract_style_from_expression.rs @@ -216,15 +216,13 @@ pub fn extract_style_from_expression<'a>( } else { StyleSelector::from([&selector.to_string(), *name]).to_string() } + } else if name.starts_with("_") { + StyleSelector::from( + to_kebab_case(&name.replace("_", "")).as_str(), + ) + .to_string() } else { - if name.starts_with("_") { - StyleSelector::from( - to_kebab_case(&name.replace("_", "")).as_str(), - ) - .to_string() - } else { - StyleSelector::from(name.replace("_", "").as_str()).to_string() - } + StyleSelector::from(name.replace("_", "").as_str()).to_string() } }) .collect::>() From ebe3761cf7f9ee64c33e8542c78ab2444b4c5cc2 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Thu, 11 Sep 2025 14:08:11 +0900 Subject: [PATCH 3/3] Fix lint --- .../src/extractor/extract_style_from_expression.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libs/extractor/src/extractor/extract_style_from_expression.rs b/libs/extractor/src/extractor/extract_style_from_expression.rs index c9dd6684..01ec40c4 100644 --- a/libs/extractor/src/extractor/extract_style_from_expression.rs +++ b/libs/extractor/src/extractor/extract_style_from_expression.rs @@ -217,10 +217,8 @@ pub fn extract_style_from_expression<'a>( StyleSelector::from([&selector.to_string(), *name]).to_string() } } else if name.starts_with("_") { - StyleSelector::from( - to_kebab_case(&name.replace("_", "")).as_str(), - ) - .to_string() + StyleSelector::from(to_kebab_case(&name.replace("_", "")).as_str()) + .to_string() } else { StyleSelector::from(name.replace("_", "").as_str()).to_string() }