@swc/plugin-styled-jsx 1.5.84 → 1.5.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/package.json +1 -1
  2. package/swc_plugin_styled_jsx.wasm +0 -0
  3. package/transform/Cargo.toml +0 -39
  4. package/transform/src/lib.rs +0 -7
  5. package/transform/src/lifetime.rs +0 -408
  6. package/transform/src/style.rs +0 -25
  7. package/transform/src/transform_css_lightningcss.rs +0 -589
  8. package/transform/src/transform_css_swc.rs +0 -392
  9. package/transform/src/utils.rs +0 -371
  10. package/transform/src/visitor.rs +0 -963
  11. package/transform/tests/errors/nested-style-tags/input.js +0 -31
  12. package/transform/tests/errors/nested-style-tags/output-lightningcss.js +0 -58
  13. package/transform/tests/errors/nested-style-tags/output-lightningcss.stderr +0 -27
  14. package/transform/tests/errors/nested-style-tags/output-swc.js +0 -58
  15. package/transform/tests/errors/nested-style-tags/output-swc.stderr +0 -27
  16. package/transform/tests/errors/nested-style-tags/output.js +0 -58
  17. package/transform/tests/errors/no-child/input.js +0 -6
  18. package/transform/tests/errors/no-child/output-lightningcss.js +0 -8
  19. package/transform/tests/errors/no-child/output-lightningcss.stderr +0 -9
  20. package/transform/tests/errors/no-child/output-swc.js +0 -8
  21. package/transform/tests/errors/no-child/output-swc.stderr +0 -9
  22. package/transform/tests/errors/no-child/output.js +0 -8
  23. package/transform/tests/errors/ts-with-css-resolve/input.js +0 -10
  24. package/transform/tests/errors/ts-with-css-resolve/output-lightningcss.js +0 -5
  25. package/transform/tests/errors/ts-with-css-resolve/output-lightningcss.stderr +0 -2
  26. package/transform/tests/errors/ts-with-css-resolve/output-swc.js +0 -5
  27. package/transform/tests/errors/ts-with-css-resolve/output-swc.stderr +0 -2
  28. package/transform/tests/errors/ts-with-css-resolve/output.js +0 -5
  29. package/transform/tests/errors/two-children/input.js +0 -8
  30. package/transform/tests/errors/two-children/output-lightningcss.js +0 -12
  31. package/transform/tests/errors/two-children/output-lightningcss.stderr +0 -11
  32. package/transform/tests/errors/two-children/output-swc.js +0 -12
  33. package/transform/tests/errors/two-children/output-swc.stderr +0 -11
  34. package/transform/tests/errors/two-children/output.js +0 -12
  35. package/transform/tests/errors/wrong-child-type/input.js +0 -7
  36. package/transform/tests/errors/wrong-child-type/output-lightningcss.js +0 -10
  37. package/transform/tests/errors/wrong-child-type/output-lightningcss.stderr +0 -10
  38. package/transform/tests/errors/wrong-child-type/output-swc.js +0 -10
  39. package/transform/tests/errors/wrong-child-type/output-swc.stderr +0 -10
  40. package/transform/tests/errors/wrong-child-type/output.js +0 -10
  41. package/transform/tests/errors/wrong-jsx-expression-type/input.js +0 -7
  42. package/transform/tests/errors/wrong-jsx-expression-type/output-lightningcss.js +0 -10
  43. package/transform/tests/errors/wrong-jsx-expression-type/output-lightningcss.stderr +0 -10
  44. package/transform/tests/errors/wrong-jsx-expression-type/output-swc.js +0 -10
  45. package/transform/tests/errors/wrong-jsx-expression-type/output-swc.stderr +0 -10
  46. package/transform/tests/errors/wrong-jsx-expression-type/output.js +0 -10
  47. package/transform/tests/fixture/.expressions/input.js +0 -90
  48. package/transform/tests/fixture/absent/input.js +0 -6
  49. package/transform/tests/fixture/absent/output.lightningcss.js +0 -7
  50. package/transform/tests/fixture/absent/output.swc.js +0 -7
  51. package/transform/tests/fixture/attribute-generation-classname-rewriting/input.js +0 -55
  52. package/transform/tests/fixture/attribute-generation-classname-rewriting/output.lightningcss.js +0 -112
  53. package/transform/tests/fixture/attribute-generation-classname-rewriting/output.swc.js +0 -112
  54. package/transform/tests/fixture/attribute-generation-modes/input.js +0 -166
  55. package/transform/tests/fixture/attribute-generation-modes/output.lightningcss.js +0 -228
  56. package/transform/tests/fixture/attribute-generation-modes/output.swc.js +0 -228
  57. package/transform/tests/fixture/class/input.js +0 -14
  58. package/transform/tests/fixture/class/output.lightningcss.js +0 -12
  59. package/transform/tests/fixture/class/output.swc.js +0 -12
  60. package/transform/tests/fixture/comments/input.js +0 -18
  61. package/transform/tests/fixture/comments/output.lightningcss.js +0 -12
  62. package/transform/tests/fixture/comments/output.swc.js +0 -12
  63. package/transform/tests/fixture/component-attribute/input.js +0 -11
  64. package/transform/tests/fixture/component-attribute/output.lightningcss.js +0 -10
  65. package/transform/tests/fixture/component-attribute/output.swc.js +0 -10
  66. package/transform/tests/fixture/conflicts/input.js +0 -16
  67. package/transform/tests/fixture/conflicts/output.lightningcss.js +0 -14
  68. package/transform/tests/fixture/conflicts/output.swc.js +0 -14
  69. package/transform/tests/fixture/css-selector-after-pseudo/input.js +0 -18
  70. package/transform/tests/fixture/css-selector-after-pseudo/output.lightningcss.js +0 -11
  71. package/transform/tests/fixture/css-selector-after-pseudo/output.swc.js +0 -11
  72. package/transform/tests/fixture/css-tag-same-file/input.js +0 -25
  73. package/transform/tests/fixture/css-tag-same-file/output.lightningcss.js +0 -21
  74. package/transform/tests/fixture/css-tag-same-file/output.swc.js +0 -21
  75. package/transform/tests/fixture/different-jsx-ids/input.js +0 -23
  76. package/transform/tests/fixture/different-jsx-ids/output.lightningcss.js +0 -24
  77. package/transform/tests/fixture/different-jsx-ids/output.swc.js +0 -24
  78. package/transform/tests/fixture/dynamic-element/input.js +0 -56
  79. package/transform/tests/fixture/dynamic-element/output.lightningcss.js +0 -40
  80. package/transform/tests/fixture/dynamic-element/output.swc.js +0 -40
  81. package/transform/tests/fixture/dynamic-element-class/input.js +0 -32
  82. package/transform/tests/fixture/dynamic-element-class/output.lightningcss.js +0 -25
  83. package/transform/tests/fixture/dynamic-element-class/output.swc.js +0 -25
  84. package/transform/tests/fixture/dynamic-element-external/input.js +0 -12
  85. package/transform/tests/fixture/dynamic-element-external/output.lightningcss.js +0 -12
  86. package/transform/tests/fixture/dynamic-element-external/output.swc.js +0 -12
  87. package/transform/tests/fixture/dynamic-this-in-arrow/input.js +0 -41
  88. package/transform/tests/fixture/dynamic-this-in-arrow/output.lightningcss.js +0 -39
  89. package/transform/tests/fixture/dynamic-this-in-arrow/output.swc.js +0 -39
  90. package/transform/tests/fixture/exported-jsx-style/input.js +0 -1
  91. package/transform/tests/fixture/exported-jsx-style/output.lightningcss.js +0 -1
  92. package/transform/tests/fixture/exported-jsx-style/output.swc.js +0 -1
  93. package/transform/tests/fixture/exported-non-jsx-style/input.js +0 -1
  94. package/transform/tests/fixture/exported-non-jsx-style/output.lightningcss.js +0 -1
  95. package/transform/tests/fixture/exported-non-jsx-style/output.swc.js +0 -1
  96. package/transform/tests/fixture/external-nested-scope/input.js +0 -5
  97. package/transform/tests/fixture/external-nested-scope/output.lightningcss.js +0 -7
  98. package/transform/tests/fixture/external-nested-scope/output.swc.js +0 -7
  99. package/transform/tests/fixture/external-stylesheet/input.js +0 -41
  100. package/transform/tests/fixture/external-stylesheet/output.lightningcss.js +0 -34
  101. package/transform/tests/fixture/external-stylesheet/output.swc.js +0 -34
  102. package/transform/tests/fixture/external-stylesheet-global/input.js +0 -19
  103. package/transform/tests/fixture/external-stylesheet-global/output.lightningcss.js +0 -18
  104. package/transform/tests/fixture/external-stylesheet-global/output.swc.js +0 -18
  105. package/transform/tests/fixture/external-stylesheet-multi-line/input.js +0 -9
  106. package/transform/tests/fixture/external-stylesheet-multi-line/output.lightningcss.js +0 -9
  107. package/transform/tests/fixture/external-stylesheet-multi-line/output.swc.js +0 -9
  108. package/transform/tests/fixture/fragment/input.js +0 -51
  109. package/transform/tests/fixture/fragment/output.lightningcss.js +0 -47
  110. package/transform/tests/fixture/fragment/output.swc.js +0 -47
  111. package/transform/tests/fixture/global/input.js +0 -22
  112. package/transform/tests/fixture/global/output.lightningcss.js +0 -7
  113. package/transform/tests/fixture/global/output.swc.js +0 -7
  114. package/transform/tests/fixture/global-child-selector/input.js +0 -10
  115. package/transform/tests/fixture/global-child-selector/output.lightningcss.js +0 -8
  116. package/transform/tests/fixture/global-child-selector/output.swc.js +0 -8
  117. package/transform/tests/fixture/global-redundant/input.js +0 -12
  118. package/transform/tests/fixture/global-redundant/output.lightningcss.js +0 -10
  119. package/transform/tests/fixture/global-redundant/output.swc.js +0 -10
  120. package/transform/tests/fixture/issue-30480/input.js +0 -11
  121. package/transform/tests/fixture/issue-30480/output.lightningcss.js +0 -15
  122. package/transform/tests/fixture/issue-30480/output.swc.js +0 -15
  123. package/transform/tests/fixture/issue-30570/input.js +0 -15
  124. package/transform/tests/fixture/issue-30570/output.lightningcss.js +0 -12
  125. package/transform/tests/fixture/issue-30570/output.swc.js +0 -12
  126. package/transform/tests/fixture/issue-31562-interpolation-in-mdea/input.js +0 -30
  127. package/transform/tests/fixture/issue-31562-interpolation-in-mdea/output.lightningcss.js +0 -43
  128. package/transform/tests/fixture/issue-31562-interpolation-in-mdea/output.swc.js +0 -43
  129. package/transform/tests/fixture/mixed-global-scoped/input.js +0 -9
  130. package/transform/tests/fixture/mixed-global-scoped/output.lightningcss.js +0 -11
  131. package/transform/tests/fixture/mixed-global-scoped/output.swc.js +0 -11
  132. package/transform/tests/fixture/multiple-jsx/input.js +0 -43
  133. package/transform/tests/fixture/multiple-jsx/output.lightningcss.js +0 -32
  134. package/transform/tests/fixture/multiple-jsx/output.swc.js +0 -32
  135. package/transform/tests/fixture/nested-style-tags/index.js +0 -0
  136. package/transform/tests/fixture/next-54653/input.js +0 -10
  137. package/transform/tests/fixture/next-54653/output.lightningcss.js +0 -3
  138. package/transform/tests/fixture/next-54653/output.swc.js +0 -3
  139. package/transform/tests/fixture/non-styled-jsx-style/input.js +0 -7
  140. package/transform/tests/fixture/non-styled-jsx-style/output.lightningcss.js +0 -12
  141. package/transform/tests/fixture/non-styled-jsx-style/output.swc.js +0 -12
  142. package/transform/tests/fixture/not-styled-jsx-tagged-templates/input.js +0 -30
  143. package/transform/tests/fixture/not-styled-jsx-tagged-templates/output.lightningcss.js +0 -23
  144. package/transform/tests/fixture/not-styled-jsx-tagged-templates/output.swc.js +0 -23
  145. package/transform/tests/fixture/number-after-placeholder/input.js +0 -17
  146. package/transform/tests/fixture/number-after-placeholder/output.lightningcss.js +0 -17
  147. package/transform/tests/fixture/number-after-placeholder/output.swc.js +0 -17
  148. package/transform/tests/fixture/one-off-global-selectors/input.js +0 -10
  149. package/transform/tests/fixture/one-off-global-selectors/output.lightningcss.js +0 -8
  150. package/transform/tests/fixture/one-off-global-selectors/output.swc.js +0 -8
  151. package/transform/tests/fixture/source-maps/input.js +0 -8
  152. package/transform/tests/fixture/source-maps/output.lightningcss.js +0 -8
  153. package/transform/tests/fixture/source-maps/output.swc.js +0 -8
  154. package/transform/tests/fixture/stateless/input.js +0 -8
  155. package/transform/tests/fixture/stateless/output.lightningcss.js +0 -12
  156. package/transform/tests/fixture/stateless/output.swc.js +0 -12
  157. package/transform/tests/fixture/styles/input.js +0 -57
  158. package/transform/tests/fixture/styles/output.lightningcss.js +0 -39
  159. package/transform/tests/fixture/styles/output.swc.js +0 -39
  160. package/transform/tests/fixture/styles-external-invalid/input.js +0 -13
  161. package/transform/tests/fixture/styles-external-invalid/output.lightningcss.js +0 -9
  162. package/transform/tests/fixture/styles-external-invalid/output.swc.js +0 -9
  163. package/transform/tests/fixture/styles-external-invalid2/input.js +0 -11
  164. package/transform/tests/fixture/styles-external-invalid2/output.lightningcss.js +0 -8
  165. package/transform/tests/fixture/styles-external-invalid2/output.swc.js +0 -8
  166. package/transform/tests/fixture/styles2/input.js +0 -6
  167. package/transform/tests/fixture/styles2/output.lightningcss.js +0 -5
  168. package/transform/tests/fixture/styles2/output.swc.js +0 -5
  169. package/transform/tests/fixture/too-many/input.js +0 -35
  170. package/transform/tests/fixture/too-many/output.lightningcss.js +0 -49
  171. package/transform/tests/fixture/too-many/output.swc.js +0 -49
  172. package/transform/tests/fixture/tpl-escape-1/input.js +0 -14
  173. package/transform/tests/fixture/tpl-escape-1/output.lightningcss.js +0 -12
  174. package/transform/tests/fixture/tpl-escape-1/output.swc.js +0 -12
  175. package/transform/tests/fixture/tpl-escape-2/input.js +0 -17
  176. package/transform/tests/fixture/tpl-escape-2/output.lightningcss.js +0 -17
  177. package/transform/tests/fixture/tpl-escape-2/output.swc.js +0 -17
  178. package/transform/tests/fixture/tpl-placeholder-1-as-property/input.js +0 -17
  179. package/transform/tests/fixture/tpl-placeholder-1-as-property/output.lightningcss.js +0 -28
  180. package/transform/tests/fixture/tpl-placeholder-1-as-property/output.swc.js +0 -28
  181. package/transform/tests/fixture/tpl-placeholder-2-as-part-of-value/input.js +0 -21
  182. package/transform/tests/fixture/tpl-placeholder-2-as-part-of-value/output.lightningcss.js +0 -34
  183. package/transform/tests/fixture/tpl-placeholder-2-as-part-of-value/output.swc.js +0 -34
  184. package/transform/tests/fixture/tpl-placeholder-3-as-value/input.js +0 -17
  185. package/transform/tests/fixture/tpl-placeholder-3-as-value/output.lightningcss.js +0 -28
  186. package/transform/tests/fixture/tpl-placeholder-3-as-value/output.swc.js +0 -28
  187. package/transform/tests/fixture/tpl-placeholder-4-as-part-of-value-in-multiple/input.js +0 -17
  188. package/transform/tests/fixture/tpl-placeholder-4-as-part-of-value-in-multiple/output.lightningcss.js +0 -31
  189. package/transform/tests/fixture/tpl-placeholder-4-as-part-of-value-in-multiple/output.swc.js +0 -31
  190. package/transform/tests/fixture/tpl-placeholder-5-values-of-multiple-properties/input.js +0 -16
  191. package/transform/tests/fixture/tpl-placeholder-5-values-of-multiple-properties/output.lightningcss.js +0 -31
  192. package/transform/tests/fixture/tpl-placeholder-5-values-of-multiple-properties/output.swc.js +0 -31
  193. package/transform/tests/fixture/transform-css/input.js +0 -176
  194. package/transform/tests/fixture/transform-css/output.lightningcss.js +0 -8
  195. package/transform/tests/fixture/transform-css/output.swc.js +0 -8
  196. package/transform/tests/fixture/transform-css-complex-selector/input.js +0 -116
  197. package/transform/tests/fixture/transform-css-complex-selector/output.lightningcss.js +0 -8
  198. package/transform/tests/fixture/transform-css-complex-selector/output.swc.js +0 -8
  199. package/transform/tests/fixture/transform-css-complex-selector-2/input.js +0 -12
  200. package/transform/tests/fixture/transform-css-complex-selector-2/output.lightningcss.js +0 -8
  201. package/transform/tests/fixture/transform-css-complex-selector-2/output.swc.js +0 -8
  202. package/transform/tests/fixture/transform-css-global/input.js +0 -32
  203. package/transform/tests/fixture/transform-css-global/output.lightningcss.js +0 -8
  204. package/transform/tests/fixture/transform-css-global/output.swc.js +0 -8
  205. package/transform/tests/fixture/transform-css-media-query/input.js +0 -24
  206. package/transform/tests/fixture/transform-css-media-query/output.lightningcss.js +0 -8
  207. package/transform/tests/fixture/transform-css-media-query/output.swc.js +0 -8
  208. package/transform/tests/fixture/transform-css-normal/input.js +0 -22
  209. package/transform/tests/fixture/transform-css-normal/output.lightningcss.js +0 -8
  210. package/transform/tests/fixture/transform-css-normal/output.swc.js +0 -8
  211. package/transform/tests/fixture/transform-css-nth-1/input.js +0 -10
  212. package/transform/tests/fixture/transform-css-nth-1/output.lightningcss.js +0 -8
  213. package/transform/tests/fixture/transform-css-nth-1/output.swc.js +0 -8
  214. package/transform/tests/fixture/whitespace/input.js +0 -12
  215. package/transform/tests/fixture/whitespace/output.lightningcss.js +0 -12
  216. package/transform/tests/fixture/whitespace/output.swc.js +0 -12
  217. package/transform/tests/fixture.rs +0 -129
@@ -1,392 +0,0 @@
1
- use std::{panic, sync::Arc};
2
-
3
- use easy_error::{bail, Error};
4
- use swc_common::{
5
- errors::HANDLER, source_map::Pos, util::take::Take, BytePos, SourceMap, Span, Spanned,
6
- SyntaxContext, DUMMY_SP,
7
- };
8
- use swc_css_ast::{
9
- ClassSelector, Combinator, CombinatorValue, ComplexSelector, ComplexSelectorChildren,
10
- CompoundSelector, Ident, PseudoClassSelector, PseudoClassSelectorChildren, Stylesheet,
11
- SubclassSelector, Token, TokenAndSpan,
12
- };
13
- use swc_css_codegen::{
14
- writer::basic::{BasicCssWriter, BasicCssWriterConfig},
15
- CodeGenerator, CodegenConfig, Emit,
16
- };
17
- use swc_css_parser::{
18
- lexer::Lexer,
19
- parse_input,
20
- parser::{
21
- input::{InputType, Tokens},
22
- Parser, ParserConfig,
23
- },
24
- };
25
- use swc_css_prefixer::prefixer;
26
- use swc_css_visit::{VisitMut, VisitMutWith};
27
- use swc_ecma_ast::*;
28
- use swc_ecma_parser::StringInput;
29
- use tracing::{debug, trace};
30
-
31
- use crate::{
32
- style::LocalStyle,
33
- utils::{hash_string, string_literal_expr},
34
- };
35
-
36
- pub fn transform_css(
37
- _cm: Arc<SourceMap>,
38
- style_info: &LocalStyle,
39
- is_global: bool,
40
- class_name: &Option<String>,
41
- ) -> Result<Expr, Error> {
42
- debug!("CSS: \n{}", style_info.css);
43
-
44
- // TODO use `parse_string_input` in future
45
- let config = ParserConfig {
46
- allow_wrong_line_comments: true,
47
- css_modules: false,
48
- ..Default::default()
49
- };
50
- let lexer = Lexer::new(
51
- StringInput::new(
52
- &style_info.css,
53
- style_info.css_span.lo,
54
- style_info.css_span.hi,
55
- ),
56
- config,
57
- );
58
- let mut parser = Parser::new(lexer, config);
59
-
60
- let result: Result<Stylesheet, _> = parser.parse_all();
61
- let mut ss = match result {
62
- Ok(ss) => ss,
63
- Err(err) => {
64
- HANDLER.with(|handler| {
65
- // Print css parsing errors
66
- err.to_diagnostics(handler).emit();
67
-
68
- // TODO(kdy1): We may print css so the user can see the error, and report it.
69
-
70
- handler
71
- .struct_span_err(
72
- style_info.css_span,
73
- "Failed to parse css in styled jsx component",
74
- )
75
- .note(&format!("Input to the css parser is {}", style_info.css))
76
- .emit()
77
- });
78
- bail!("Failed to parse css");
79
- }
80
- };
81
- // ? Do we need to support optionally prefixing?
82
- ss.visit_mut_with(&mut prefixer(Default::default()));
83
- ss.visit_mut_with(&mut Namespacer {
84
- class_name: match class_name {
85
- Some(s) => s.clone(),
86
- None => format!("jsx-{}", &hash_string(&style_info.hash)),
87
- },
88
- is_global,
89
- is_dynamic: style_info.is_dynamic,
90
- });
91
-
92
- let mut s = String::new();
93
- {
94
- let mut wr = BasicCssWriter::new(&mut s, None, BasicCssWriterConfig::default());
95
- let mut gen = CodeGenerator::new(&mut wr, CodegenConfig { minify: true });
96
-
97
- gen.emit(&ss).unwrap();
98
- }
99
-
100
- if style_info.expressions.is_empty() {
101
- return Ok(string_literal_expr(&s));
102
- }
103
-
104
- let mut parts: Vec<&str> = s.split("__styled-jsx-placeholder-").collect();
105
- let mut final_expressions = vec![];
106
- for i in parts.iter_mut().skip(1) {
107
- let (num_len, expression_index) = read_number(i);
108
- final_expressions.push(style_info.expressions[expression_index].clone());
109
- let substr = &i[(num_len + 2)..];
110
- *i = substr;
111
- }
112
-
113
- Ok(Expr::Tpl(Tpl {
114
- quasis: parts
115
- .iter()
116
- .map(|quasi| {
117
- TplElement {
118
- cooked: None, // ? Do we need cooked as well
119
- raw: quasi.replace('`', "\\`").into(),
120
- span: DUMMY_SP,
121
- tail: false,
122
- }
123
- })
124
- .collect(),
125
- exprs: final_expressions,
126
- span: DUMMY_SP,
127
- }))
128
- }
129
-
130
- /// Returns `(length, value)`
131
- fn read_number(s: &str) -> (usize, usize) {
132
- for (idx, c) in s.char_indices() {
133
- if c.is_ascii_digit() {
134
- continue;
135
- }
136
-
137
- // For 10, we reach here after `0`.
138
- let value = s[0..idx].parse().expect("failed to parse");
139
-
140
- return (idx, value);
141
- }
142
-
143
- unreachable!("read_number(`{}`) is invalid because it is empty", s)
144
- }
145
-
146
- struct Namespacer {
147
- class_name: String,
148
- is_global: bool,
149
- is_dynamic: bool,
150
- }
151
-
152
- impl VisitMut for Namespacer {
153
- fn visit_mut_complex_selector(&mut self, node: &mut ComplexSelector) {
154
- #[cfg(debug_assertions)]
155
- let _tracing = {
156
- // This will add information to the log messages, only for debug build.
157
- // Note that we use cargo feature to remove all logging on production builds.
158
-
159
- let mut code = String::new();
160
- {
161
- let mut wr = BasicCssWriter::new(&mut code, None, BasicCssWriterConfig::default());
162
- let mut gen = CodeGenerator::new(&mut wr, CodegenConfig { minify: true });
163
-
164
- gen.emit(&*node).unwrap();
165
- }
166
-
167
- tracing::span!(
168
- tracing::Level::TRACE,
169
- "Namespacer::visit_mut_complex_selector",
170
- class_name = &*self.class_name,
171
- is_global = self.is_global,
172
- is_dynamic = self.is_dynamic,
173
- input = &*code
174
- )
175
- .entered()
176
- };
177
-
178
- let mut new_selectors = vec![];
179
- let mut combinator = None;
180
-
181
- for sel in node.children.take() {
182
- match &sel {
183
- ComplexSelectorChildren::CompoundSelector(selector) => {
184
- match self.get_transformed_selectors(combinator, selector.clone()) {
185
- Ok(transformed_selectors) => new_selectors.extend(transformed_selectors),
186
- Err(_) => {
187
- HANDLER.with(|handler| {
188
- handler
189
- .struct_span_err(
190
- selector.span,
191
- "Failed to transform one off global selector",
192
- )
193
- .emit()
194
- });
195
- new_selectors.push(sel);
196
- }
197
- }
198
-
199
- combinator = None;
200
- }
201
- ComplexSelectorChildren::Combinator(v) => {
202
- combinator = Some(v.clone());
203
- }
204
- };
205
- }
206
-
207
- node.children = new_selectors;
208
- }
209
- }
210
-
211
- impl Namespacer {
212
- fn get_transformed_selectors(
213
- &mut self,
214
- combinator: Option<Combinator>,
215
- mut node: CompoundSelector,
216
- ) -> Result<Vec<ComplexSelectorChildren>, Error> {
217
- let mut pseudo_index = None;
218
-
219
- for (i, selector) in node.subclass_selectors.iter().enumerate() {
220
- let (name, children) = match &selector {
221
- SubclassSelector::PseudoClass(PseudoClassSelector {
222
- name,
223
- children: Some(children),
224
- ..
225
- }) if &name.value == "global" => (name, children),
226
- SubclassSelector::PseudoClass(_) | SubclassSelector::PseudoElement(_) => {
227
- if pseudo_index.is_none() {
228
- pseudo_index = Some(i);
229
- }
230
-
231
- continue;
232
- }
233
- _ => continue,
234
- };
235
-
236
- // One off global selector
237
- if &name.value == "global" {
238
- // TODO(alexander-akait): in future we should use list of component values
239
- let tokens = children
240
- .iter()
241
- .map(|v| match v {
242
- PseudoClassSelectorChildren::PreservedToken(v) => v.clone(),
243
- _ => {
244
- unreachable!();
245
- }
246
- })
247
- .collect::<Vec<TokenAndSpan>>();
248
- let mut tokens = {
249
- let lo = tokens.first().map(|v| v.span_lo()).unwrap_or(BytePos(0));
250
- let hi = tokens.last().map(|v| v.span_hi()).unwrap_or(BytePos(0));
251
-
252
- Tokens {
253
- span: Span::new(lo, hi, Default::default()),
254
- tokens,
255
- }
256
- };
257
-
258
- // Because it is allowed to write `.bar :global(> .foo) {}` or .bar
259
- // :global(.foo) {}`, so selector can be complex or relative (it violates the
260
- // specification), but it is popular usage, so we just add `a >` at top and then
261
- // remove it
262
- let mut front_tokens = get_front_selector_tokens(&tokens);
263
-
264
- front_tokens.extend(tokens.tokens);
265
-
266
- tokens.tokens = front_tokens;
267
-
268
- let complex_selectors = panic::catch_unwind(|| {
269
- let x: ComplexSelector = parse_input(
270
- InputType::Tokens(&tokens),
271
- ParserConfig {
272
- allow_wrong_line_comments: true,
273
- css_modules: true,
274
- ..Default::default()
275
- },
276
- // TODO(kdy1): We might be able to report syntax errors.
277
- &mut vec![],
278
- )
279
- .unwrap();
280
- x
281
- });
282
-
283
- return match complex_selectors {
284
- Ok(complex_selectors) => {
285
- let mut v = complex_selectors.children[1..].to_vec();
286
-
287
- if let ComplexSelectorChildren::Combinator(Combinator {
288
- value: CombinatorValue::Descendant,
289
- ..
290
- }) = v[0]
291
- {
292
- v.remove(0);
293
- }
294
-
295
- if v.is_empty() {
296
- bail!("Failed to transform one off global selector");
297
- }
298
-
299
- trace!("Combinator: {:?}", combinator);
300
- trace!("v[0]: {:?}", v[0]);
301
-
302
- let mut result = vec![];
303
-
304
- if let Some(combinator) = combinator {
305
- match v.get(0) {
306
- // `Descendant` combinator can't be the first because we removed it
307
- // above
308
- Some(ComplexSelectorChildren::Combinator(..))
309
- if combinator.value == CombinatorValue::Descendant => {}
310
- _ => {
311
- result.push(ComplexSelectorChildren::Combinator(combinator));
312
- }
313
- }
314
- }
315
-
316
- v.iter_mut().for_each(|sel| {
317
- if i < node.subclass_selectors.len() {
318
- if let ComplexSelectorChildren::CompoundSelector(sel) = sel {
319
- sel.subclass_selectors
320
- .extend(node.subclass_selectors[i + 1..].iter().cloned());
321
- }
322
- }
323
- });
324
-
325
- result.extend(v);
326
-
327
- Ok(result)
328
- }
329
- Err(_) => bail!("Failed to transform one off global selector"),
330
- };
331
- }
332
- }
333
-
334
- let subclass_selector = match self.is_dynamic {
335
- true => "__jsx-style-dynamic-selector",
336
- false => &self.class_name,
337
- };
338
- let insert_index = match pseudo_index {
339
- None => node.subclass_selectors.len(),
340
- Some(i) => i,
341
- };
342
-
343
- if !self.is_global {
344
- node.subclass_selectors.insert(
345
- insert_index,
346
- SubclassSelector::Class(ClassSelector {
347
- span: DUMMY_SP,
348
- text: Ident {
349
- raw: Some(subclass_selector.into()),
350
- value: subclass_selector.into(),
351
- span: DUMMY_SP,
352
- },
353
- }),
354
- );
355
- }
356
-
357
- let mut result = vec![];
358
-
359
- if let Some(combinator) = combinator {
360
- result.push(ComplexSelectorChildren::Combinator(combinator));
361
- }
362
-
363
- result.push(ComplexSelectorChildren::CompoundSelector(node));
364
-
365
- Ok(result)
366
- }
367
- }
368
-
369
- fn get_front_selector_tokens(selector_tokens: &Tokens) -> Vec<TokenAndSpan> {
370
- let start_pos = selector_tokens.span.lo.to_u32() - 2;
371
- vec![
372
- TokenAndSpan {
373
- span: Span {
374
- lo: BytePos(start_pos),
375
- hi: BytePos(start_pos + 1),
376
- ctxt: SyntaxContext::empty(),
377
- },
378
- token: Token::Ident {
379
- raw: "a".into(),
380
- value: "a".into(),
381
- },
382
- },
383
- TokenAndSpan {
384
- span: Span {
385
- lo: BytePos(start_pos + 1),
386
- hi: BytePos(start_pos + 2),
387
- ctxt: SyntaxContext::empty(),
388
- },
389
- token: Token::WhiteSpace { value: " ".into() },
390
- },
391
- ]
392
- }