diff --git a/.changeset/fuzzy-rules-press.md b/.changeset/fuzzy-rules-press.md new file mode 100644 index 00000000..c986d7d4 --- /dev/null +++ b/.changeset/fuzzy-rules-press.md @@ -0,0 +1,5 @@ +--- +'@devup-ui/eslint-plugin': patch +--- + +Fix imports issue on globalCss diff --git a/.changeset/mean-socks-attend.md b/.changeset/mean-socks-attend.md new file mode 100644 index 00000000..4e41780b --- /dev/null +++ b/.changeset/mean-socks-attend.md @@ -0,0 +1,5 @@ +--- +'@devup-ui/react': patch +--- + +Support query on imports diff --git a/.changeset/ten-beds-punch.md b/.changeset/ten-beds-punch.md new file mode 100644 index 00000000..58a8dc00 --- /dev/null +++ b/.changeset/ten-beds-punch.md @@ -0,0 +1,5 @@ +--- +'@devup-ui/wasm': patch +--- + +Support layer on imports of globalCss diff --git a/Cargo.lock b/Cargo.lock index bdbdfc3f..895e0a56 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -95,9 +95,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "ciborium" @@ -527,6 +527,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json-escape-simd" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3c2a6c0b4b5637c41719973ef40c6a1cf564f9db6958350de6193fbee9c23f5" + [[package]] name = "libc" version = "0.2.175" @@ -551,9 +557,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "minicov" @@ -651,9 +657,9 @@ dependencies = [ [[package]] name = "oxc_allocator" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "014a6bc98da00c997b35db73a7aced63d9e148ddcfe1a6bd759e87b903d95757" +checksum = "433214c659b860685d987ca25a523a544d35ebf87ee3658a942fd1c664cfa49b" dependencies = [ "allocator-api2", "bumpalo", @@ -664,9 +670,9 @@ dependencies = [ [[package]] name = "oxc_ast" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f88ca3bb0ed59cebad6883e7a09e16e19fd1dbec7fcd7659c5e696456f3ea37" +checksum = "0e78ea25d23521092edcd509198635dd0bd96df7fb71349bcd8087bb8f6a615d" dependencies = [ "bitflags", "oxc_allocator", @@ -681,9 +687,9 @@ dependencies = [ [[package]] name = "oxc_ast_macros" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf7bc9985027ebc3b8daaa4bcdeeafe8d027fb6f3ffed3dfc496a851d7b3ffe" +checksum = "d3f29bf83925451a7ebbd30d3ff449414cc230c9b63aba70487c2ca74ea1e3ed" dependencies = [ "phf", "proc-macro2", @@ -693,9 +699,9 @@ dependencies = [ [[package]] name = "oxc_ast_visit" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2750ee1156a0700d483c2b148dac6d45fbbdbbc44dfae973ab36fc8d92811259" +checksum = "808862f42c9331954cf187261d6a48dbf471ccbe60b6a35f6b1056c11f32e95b" dependencies = [ "oxc_allocator", "oxc_ast", @@ -705,15 +711,14 @@ dependencies = [ [[package]] name = "oxc_codegen" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b5e6819479a869dc791c98e23007b3dfc6c888b79b63691c0919d8db1f64e0" +checksum = "480bab938439c921d34750708abf15aacf253ea11e2f348e4b085cbf697f4ea2" dependencies = [ "bitflags", "cow-utils", "dragonbox_ecma", "itoa", - "nonmax", "oxc_allocator", "oxc_ast", "oxc_data_structures", @@ -727,15 +732,15 @@ dependencies = [ [[package]] name = "oxc_data_structures" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45904e6b2cf3e05e586a526f4668dac3ab3cb1a88f8ef065503d1336e85e64d2" +checksum = "dd090988aa69c1e394f424289abb9bb1281448a072419ca556a07228ad36b854" [[package]] name = "oxc_diagnostics" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0976fcb5e3093b08e384b87dd660029ff99ac3a4ba5f57a2eebcb6d1fd2e3a" +checksum = "9b8a09558d38ee7f23faf0249cdb37b5b26f53a7375941f8636c41c661b283ce" dependencies = [ "cow-utils", "oxc-miette", @@ -744,9 +749,9 @@ dependencies = [ [[package]] name = "oxc_ecmascript" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5a38604b87cf5c118aad0a20b3197d44439bcf59680fb7d3e13dff605a27d6b" +checksum = "c0002ece1cc266aa6654913d39cf552b0cf501afce9d953b87c283dfcd307266" dependencies = [ "cow-utils", "num-bigint", @@ -759,21 +764,25 @@ dependencies = [ [[package]] name = "oxc_estree" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f909b432bafad7fe98609e2fd00b6b046c143fda4246a4e7bb7e41b47cf65e" +checksum = "af85b24b7e10bf0ccb252f16d38492f51236c1ba146f62013993667cbf7fa649" [[package]] name = "oxc_index" -version = "3.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fa07b0cfa997730afed43705766ef27792873fdf5215b1391949fec678d2392" +checksum = "eb3e6120999627ec9703025eab7c9f410ebb7e95557632a8902ca48210416c2b" +dependencies = [ + "nonmax", + "serde", +] [[package]] name = "oxc_parser" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ea8250a9ba1b4690a9e0a545cde6e0c676c4ad788a2711dbbaa4429faec3d1" +checksum = "fb730ab93ff23bbc471ef7109f847afa709bb284dd52a5d3366283d724858158" dependencies = [ "bitflags", "cow-utils", @@ -794,9 +803,9 @@ dependencies = [ [[package]] name = "oxc_regular_expression" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e783f03017ed46d9d50aed65de775fdcc57914d0a997300ea5816e1ed5d583" +checksum = "27bafc3035e3b0fe555ae56f7bbc108a7ee520b0858250ba16d197e44ca83746" dependencies = [ "bitflags", "oxc_allocator", @@ -810,9 +819,9 @@ dependencies = [ [[package]] name = "oxc_semantic" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f4bac78c59d63b90a5b39702ae259adfdb84fc69d61490c43c6547ab3bb3823" +checksum = "578e5fa0b975a28e1d1ffa6c81c8df094545fe3c3225956d4e93ffe1ade3dae0" dependencies = [ "itertools 0.14.0", "oxc_allocator", @@ -831,13 +840,12 @@ dependencies = [ [[package]] name = "oxc_sourcemap" -version = "4.0.2" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d67e919c42bd488a737dea98b42d90b4d9ab735a603fa9de9bc45e6c0a682f4" +checksum = "0bd56ed0ec53da593c43d9ea65ced157fe319e454888eb65b239a275e3696499" dependencies = [ "base64-simd", - "cfg-if", - "cow-utils", + "json-escape-simd", "rustc-hash", "serde", "serde_json", @@ -845,9 +853,9 @@ dependencies = [ [[package]] name = "oxc_span" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b10b09752e1043e988081be2aabcc2abb948da5339adf66623c84fe959fd6f" +checksum = "71243fe1ece27f71a6be5e2ab11d051792eeb578f3b056d7c9bbe82ec8043bf3" dependencies = [ "compact_str", "oxc-miette", @@ -858,9 +866,9 @@ dependencies = [ [[package]] name = "oxc_syntax" -version = "0.93.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60dbb25911dbbd22ac87792d208030d21ec077e8e6938990803685637ef201e" +checksum = "93c99e555ed497111004a71fb2aa6f8fb90b0d3e2733aceeb035e24701d69634" dependencies = [ "bitflags", "cow-utils", @@ -999,18 +1007,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.97" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -1046,9 +1054,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.3" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -1058,9 +1066,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -1069,9 +1077,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "c3160422bbd54dd5ecfdca71e5fd59b7b8fe2b1697ab2baf64f6d05dcc66d298" [[package]] name = "relative-path" @@ -1125,9 +1133,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -1339,9 +1347,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.105" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -1361,18 +1369,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -1414,9 +1422,9 @@ checksum = "2f322b60f6b9736017344fa0635d64be2f458fbc04eef65f6be22976dd1ffd5b" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-linebreak" @@ -1432,9 +1440,9 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "vsimd" diff --git a/libs/css/Cargo.toml b/libs/css/Cargo.toml index c330a7b0..25ed7164 100644 --- a/libs/css/Cargo.toml +++ b/libs/css/Cargo.toml @@ -8,7 +8,7 @@ once_cell = "1.21.3" phf = { version = "0.13", features = ["macros"] } serial_test = "3.2.0" serde = { version = "1.0.228", features = ["derive"] } -regex = "1.11.3" +regex = "1.12.2" bimap = { version = "0.6.3" } [dev-dependencies] diff --git a/libs/extractor/Cargo.toml b/libs/extractor/Cargo.toml index 1c63d406..c68c687f 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.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" +oxc_parser = "0.95.0" +oxc_syntax = "0.95.0" +oxc_span = "0.95.0" +oxc_allocator = "0.95.0" +oxc_ast = "0.95.0" +oxc_ast_visit = "0.95.0" +oxc_codegen = "0.95.0" css = { path = "../css" } phf = "0.13" strum = "0.27.2" diff --git a/libs/extractor/src/extractor/extract_global_style_from_expression.rs b/libs/extractor/src/extractor/extract_global_style_from_expression.rs index 33843b20..b1988c38 100644 --- a/libs/extractor/src/extractor/extract_global_style_from_expression.rs +++ b/libs/extractor/src/extractor/extract_global_style_from_expression.rs @@ -50,22 +50,44 @@ pub fn extract_global_style_from_expression<'a>( if name == "imports" { if let Expression::ArrayExpression(arr) = &o.value { for p in arr.elements.iter() { - if let Some(url) = - if let ArrayExpressionElement::StringLiteral(s) = p { - Some(s.value.trim().to_string()) - } else if let ArrayExpressionElement::TemplateLiteral(t) = p - { - Some( - t.quasis - .iter() - .map(|q| q.value.raw.as_str()) - .collect::() - .trim() - .to_string(), - ) - } else { - None + if let Expression::ObjectExpression(obj) = p.to_expression() { + let mut url = None; + let mut query = None; + for p in obj.properties.iter() { + if let ObjectPropertyKind::ObjectProperty(o) = p + && let Some(ident) = o.key.as_expression() + && let Some(ident) = + get_string_by_literal_expression(ident) + { + if ident == "url" { + url = + get_string_by_literal_expression(&o.value); + } else if ident == "query" { + query = + get_string_by_literal_expression(&o.value); + } + } + } + if let Some(url) = url { + styles.push(ExtractStyleProp::Static( + ExtractStyleValue::Import(ExtractImport { + url: format!( + "\"{url}\"{}", + if let Some(query) = query { + format!(" {query}") + } else { + "".to_string() + } + ), + file: file.to_string(), + }), + )); } + } else if !matches!( + p.to_expression(), + Expression::NumericLiteral(_) + ) && let Some(url) = + get_string_by_literal_expression(p.to_expression()) { styles.push(ExtractStyleProp::Static( ExtractStyleValue::Import(ExtractImport { diff --git a/libs/extractor/src/lib.rs b/libs/extractor/src/lib.rs index 83b98aeb..032a879d 100644 --- a/libs/extractor/src/lib.rs +++ b/libs/extractor/src/lib.rs @@ -6481,6 +6481,63 @@ globalCss({ }, ] }) +"#, + 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 { globalCss } from "@devup-ui/core"; +globalCss({ + imports: [{"url": "@devup-ui/core/css/global.css"}] +}) +"#, + 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 { globalCss } from "@devup-ui/core"; +globalCss({ + imports: [{"url": "@devup-ui/core/css/global.css", "query": "layer"}] +}) +"#, + 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 { globalCss } from "@devup-ui/core"; +globalCss({ + imports: [{"query": "layer"}] +}) "#, ExtractOption { package: "@devup-ui/core".to_string(), diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_global_css_with_font_faces-10.snap b/libs/extractor/src/snapshots/extractor__tests__extract_global_css_with_font_faces-10.snap new file mode 100644 index 00000000..92e8f79b --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_global_css_with_font_faces-10.snap @@ -0,0 +1,8 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import { globalCss } from \"@devup-ui/core\";\nglobalCss({\n imports: [{\"query\": \"layer\"}]\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: {}, + code: ";\n", +} diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_global_css_with_font_faces-8.snap b/libs/extractor/src/snapshots/extractor__tests__extract_global_css_with_font_faces-8.snap new file mode 100644 index 00000000..cd62e520 --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_global_css_with_font_faces-8.snap @@ -0,0 +1,15 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import { globalCss } from \"@devup-ui/core\";\nglobalCss({\n imports: [{\"url\": \"@devup-ui/core/css/global.css\"}]\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: { + Import( + ExtractImport { + url: "\"@devup-ui/core/css/global.css\"", + file: "test.tsx", + }, + ), + }, + code: "import \"@devup-ui/core/devup-ui.css\";\n;\n", +} diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_global_css_with_font_faces-9.snap b/libs/extractor/src/snapshots/extractor__tests__extract_global_css_with_font_faces-9.snap new file mode 100644 index 00000000..1594e4a1 --- /dev/null +++ b/libs/extractor/src/snapshots/extractor__tests__extract_global_css_with_font_faces-9.snap @@ -0,0 +1,15 @@ +--- +source: libs/extractor/src/lib.rs +expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import { globalCss } from \"@devup-ui/core\";\nglobalCss({\n imports: [{\"url\": \"@devup-ui/core/css/global.css\", \"query\": \"layer\"}]\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: { + Import( + ExtractImport { + url: "\"@devup-ui/core/css/global.css\" layer", + file: "test.tsx", + }, + ), + }, + code: "import \"@devup-ui/core/devup-ui.css\";\n;\n", +} diff --git a/libs/sheet/Cargo.toml b/libs/sheet/Cargo.toml index 1f4e52f1..c49df41d 100644 --- a/libs/sheet/Cargo.toml +++ b/libs/sheet/Cargo.toml @@ -6,7 +6,7 @@ edition = "2024" [dependencies] css = { path = "../css" } serde = { version = "1.0.228", features = ["derive"] } -regex = "1.11.3" +regex = "1.12.2" once_cell = "1.21.3" extractor = { path = "../extractor" } diff --git a/libs/sheet/src/lib.rs b/libs/sheet/src/lib.rs index a763789c..f41b161c 100644 --- a/libs/sheet/src/lib.rs +++ b/libs/sheet/src/lib.rs @@ -553,7 +553,13 @@ impl StyleSheet { .imports .values() .flatten() - .map(|import| format!("@import \"{import}\";")) + .map(|import| { + if import.starts_with("\"") { + format!("@import {import};") + } else { + format!("@import \"{import}\";") + } + }) .collect::(); let write_global = filename.is_none(); @@ -1582,6 +1588,12 @@ mod tests { sheet.add_import("test.tsx", "@devup-ui/core/css/global.css"); assert_debug_snapshot!(sheet.create_css(None, false).split("*/").nth(1).unwrap()); } + { + let mut sheet = StyleSheet::default(); + sheet.add_import("test.tsx", "\"@devup-ui/core/css/global.css\" layer"); + sheet.add_import("test.tsx", "@devup-ui/core/css/global.css"); + assert_debug_snapshot!(sheet.create_css(None, false).split("*/").nth(1).unwrap()); + } } #[test] diff --git a/libs/sheet/src/snapshots/sheet__tests__create_css_with_imports-4.snap b/libs/sheet/src/snapshots/sheet__tests__create_css_with_imports-4.snap new file mode 100644 index 00000000..f541a1aa --- /dev/null +++ b/libs/sheet/src/snapshots/sheet__tests__create_css_with_imports-4.snap @@ -0,0 +1,5 @@ +--- +source: libs/sheet/src/lib.rs +expression: "sheet.create_css(None, false).split(\"*/\").nth(1).unwrap()" +--- +"@import \"@devup-ui/core/css/global.css\" layer;@import \"@devup-ui/core/css/global.css\";" diff --git a/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts index 62c5b85a..2941496a 100644 --- a/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts +++ b/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts @@ -75,6 +75,14 @@ describe('no-useless-responsive rule', () => { code: 'import { css } from "other-package";\ncss()', filename: 'src/app/page.tsx', }, + { + code: 'import { globalCss } from "@devup-ui/react";\nglobalCss({ imports: ["@devup-ui/react/css/global.css"] })', + filename: 'src/app/page.tsx', + }, + { + code: 'import { globalCss } from "@devup-ui/react";\nglobalCss({ imports: [{"url": "@devup-ui/react/css/global.css"}] })', + filename: 'src/app/page.tsx', + }, ], invalid: [ { diff --git a/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts b/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts index 4d7721f6..dec11483 100644 --- a/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts +++ b/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts @@ -94,6 +94,15 @@ export const noUselessResponsive = createRule({ devupContext = null } }, + Property(node) { + if ( + devupContext && + node.key.type === AST_NODE_TYPES.Identifier && + node.key.name === 'imports' + ) { + devupContext = null + } + }, ArrayExpression(node) { if (devupContext) checkUselessResponsive( diff --git a/packages/react/src/utils/global-css.ts b/packages/react/src/utils/global-css.ts index 6d364141..4264c8a5 100644 --- a/packages/react/src/utils/global-css.ts +++ b/packages/react/src/utils/global-css.ts @@ -37,11 +37,12 @@ interface FontFaceProps { fontVariationSettings?: string } +type Import = { url: string; query?: string } | string export function globalCss( strings?: | TemplateStringsArray | (Omit & { - imports?: string[] + imports?: Import[] fontFaces?: FontFaceProps[] }), ): void @@ -53,7 +54,7 @@ export function globalCss( strings?: | TemplateStringsArray | (Omit & { - imports?: string[] + imports?: Import[] }), ): void { throw new Error('Cannot run on the runtime')