@swc/plugin-styled-jsx 1.5.83 → 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,589 +0,0 @@
1
- use std::{
2
- borrow::Cow,
3
- convert::Infallible,
4
- fmt::Debug,
5
- mem::transmute,
6
- panic::{catch_unwind, AssertUnwindSafe},
7
- sync::{Arc, RwLock},
8
- };
9
-
10
- use easy_error::{bail, Error, ResultExt};
11
- use lightningcss::{
12
- error::ParserError,
13
- properties::custom::{TokenList, TokenOrValue},
14
- selector::{Combinator, Component, PseudoClass, Selector},
15
- stylesheet::{MinifyOptions, ParserFlags, ParserOptions, PrinterOptions, StyleSheet},
16
- traits::{ParseWithOptions, ToCss},
17
- values::ident::Ident,
18
- visit_types,
19
- visitor::{Visit, VisitTypes, Visitor},
20
- };
21
- use parcel_selectors::{parser::SelectorIter, SelectorImpl};
22
- use swc_common::{
23
- errors::{DiagnosticBuilder, Level, HANDLER},
24
- BytePos, Loc, SourceMap, Span, DUMMY_SP,
25
- };
26
- use swc_ecma_ast::*;
27
- use tracing::{debug, error, trace};
28
-
29
- use crate::{
30
- lifetime::owned_selector,
31
- style::LocalStyle,
32
- utils::{hash_string, string_literal_expr},
33
- };
34
-
35
- fn report(
36
- cm: &SourceMap,
37
- css_span: Span,
38
- file_lines_cache: &mut Option<Loc>,
39
- err: &lightningcss::error::Error<ParserError>,
40
- level: Level,
41
- ) {
42
- // We need :global(selector) to be parsed as a selector.
43
- if let ParserError::SelectorError(
44
- lightningcss::error::SelectorError::UnsupportedPseudoClassOrElement(..),
45
- ) = &err.kind
46
- {
47
- return;
48
- }
49
-
50
- let file = file_lines_cache.get_or_insert_with(|| cm.lookup_char_pos(css_span.lo));
51
-
52
- let lo = if let Some(loc) = &err.loc {
53
- Some(file.file.lines[(loc.line + 1) as usize] + BytePos(loc.column))
54
- } else {
55
- None
56
- };
57
-
58
- HANDLER.with(|handler| {
59
- //
60
-
61
- let mut db = DiagnosticBuilder::new(handler, level, &err.kind.to_string());
62
- if let Some(lo) = lo {
63
- db.set_span(Span::new(lo, lo, Default::default()));
64
- }
65
-
66
- db.emit();
67
- });
68
- }
69
-
70
- #[cfg_attr(
71
- debug_assertions,
72
- tracing::instrument(skip(cm, style_info, class_name))
73
- )]
74
- pub fn transform_css(
75
- cm: Arc<SourceMap>,
76
- style_info: &LocalStyle,
77
- is_global: bool,
78
- class_name: &Option<String>,
79
- ) -> Result<Expr, Error> {
80
- let mut file_lines_cache = None;
81
-
82
- debug!("CSS: \n{}", style_info.css);
83
- let css_str = strip_comments(&style_info.css);
84
-
85
- let warnings: Arc<RwLock<Vec<lightningcss::error::Error<ParserError>>>> = Arc::default();
86
-
87
- let result: Result<StyleSheet, _> = StyleSheet::parse(
88
- &css_str,
89
- ParserOptions {
90
- // We cannot use css_modules for `:global` because lightningcss does not support
91
- // parsing-only mode.
92
- css_modules: None,
93
- error_recovery: true,
94
- warnings: Some(warnings.clone()),
95
- flags: ParserFlags::all(),
96
- ..Default::default()
97
- },
98
- );
99
-
100
- let mut ss = match result {
101
- Ok(ss) => ss,
102
- Err(err) => {
103
- HANDLER.with(|handler| {
104
- report(
105
- &cm,
106
- style_info.css_span,
107
- &mut file_lines_cache,
108
- &err,
109
- Level::Error,
110
- );
111
-
112
- handler
113
- .struct_span_err(
114
- style_info.css_span,
115
- "Failed to parse css in styled jsx component",
116
- )
117
- .note(&format!("Input to the css parser is {}", style_info.css))
118
- .emit()
119
- });
120
- bail!("Failed to parse css");
121
- }
122
- };
123
-
124
- if let Ok(warnings) = warnings.read() {
125
- for warning in warnings.iter() {
126
- report(
127
- &cm,
128
- style_info.css_span,
129
- &mut file_lines_cache,
130
- warning,
131
- Level::Warning,
132
- );
133
- }
134
- }
135
-
136
- ss.visit(&mut CssNamespace {
137
- class_name: match class_name {
138
- Some(s) => s.clone(),
139
- None => format!("jsx-{}", &hash_string(&style_info.hash)),
140
- },
141
- is_global,
142
- is_dynamic: style_info.is_dynamic,
143
- })
144
- .expect("failed to transform css");
145
-
146
- // Apply auto prefixer
147
- ss.minify(MinifyOptions {
148
- ..Default::default()
149
- })
150
- .expect("failed to minify/auto-prefix css");
151
-
152
- let res = ss
153
- .to_css(PrinterOptions {
154
- minify: true,
155
- // TODO
156
- // targets: (),
157
- ..Default::default()
158
- })
159
- .context("failed to print css")?;
160
-
161
- debug!("Transformed CSS: \n{}", res.code);
162
-
163
- if style_info.expressions.is_empty() {
164
- return Ok(string_literal_expr(&res.code));
165
- }
166
-
167
- let mut parts: Vec<&str> = res.code.split("__styled-jsx-placeholder-").collect();
168
- let mut final_expressions = vec![];
169
- for i in parts.iter_mut().skip(1) {
170
- let (num_len, expression_index) = read_number(i, &style_info.is_expr_property);
171
- final_expressions.push(style_info.expressions[expression_index].clone());
172
- let substring = &i[(num_len + 2)..];
173
- *i = substring;
174
- }
175
-
176
- Ok(Expr::Tpl(Tpl {
177
- quasis: parts
178
- .iter()
179
- .map(|quasi| {
180
- TplElement {
181
- cooked: None, // ? Do we need cooked as well
182
- raw: quasi.replace('`', "\\`").into(),
183
- span: DUMMY_SP,
184
- tail: false,
185
- }
186
- })
187
- .collect(),
188
- exprs: final_expressions,
189
- span: DUMMY_SP,
190
- }))
191
- }
192
-
193
- fn strip_comments(s: &str) -> Cow<str> {
194
- if !s.contains("//") {
195
- return Cow::Borrowed(s);
196
- }
197
-
198
- let mut buf = String::with_capacity(s.len());
199
-
200
- for line in s.lines() {
201
- let line = line.trim();
202
-
203
- if let Some(index) = line.find("//") {
204
- buf.push_str(&line[..index]);
205
- } else {
206
- buf.push_str(line);
207
- }
208
- buf.push('\n');
209
- }
210
-
211
- Cow::Owned(buf)
212
- }
213
-
214
- /// Returns `(length, expression_index)`
215
- fn read_number(s: &str, is_expr_property: &[bool]) -> (usize, usize) {
216
- for (idx, c) in s.char_indices() {
217
- if c.is_ascii_digit() {
218
- continue;
219
- }
220
-
221
- // For 10, we reach here after `0`.
222
- let expression_index = s[0..idx].parse().expect("failed to parse");
223
-
224
- if is_expr_property[expression_index] {
225
- return (idx + 3, expression_index);
226
- }
227
-
228
- return (idx, expression_index);
229
- }
230
-
231
- unreachable!("read_number(`{}`) is invalid because it is empty", s)
232
- }
233
-
234
- struct CssNamespace {
235
- class_name: String,
236
- is_global: bool,
237
- is_dynamic: bool,
238
- }
239
-
240
- impl<'i> Visitor<'i> for CssNamespace {
241
- type Error = Infallible;
242
-
243
- fn visit_types(&self) -> VisitTypes {
244
- visit_types!(SELECTORS)
245
- }
246
-
247
- fn visit_selector(&mut self, selector: &mut Selector<'i>) -> Result<(), Self::Error> {
248
- let mut new_selectors = vec![];
249
- let mut combinator = None;
250
-
251
- #[cfg(debug_assertions)]
252
- let _tracing = tracing::span!(
253
- tracing::Level::ERROR,
254
- "visit_selector",
255
- len = selector.len()
256
- )
257
- .entered();
258
-
259
- let mut iter = selector.iter();
260
- loop {
261
- #[cfg(debug_assertions)]
262
- let _tracing = tracing::span!(
263
- tracing::Level::ERROR,
264
- "visit_selector/loop",
265
- len = iter.selector_length()
266
- )
267
- .entered();
268
-
269
- if combinator.is_none() {
270
- combinator = iter.next_sequence();
271
- }
272
-
273
- match self.get_transformed_selectors(combinator, &mut iter) {
274
- Ok(transformed_selectors) => {
275
- if transformed_selectors.is_empty() {
276
- break;
277
- }
278
-
279
- if cfg!(debug_assertions) {
280
- debug!("Transformed as: {:?}", SafeDebug(&transformed_selectors))
281
- }
282
-
283
- new_selectors.push(transformed_selectors);
284
- }
285
- Err(_) => {
286
- error!("Failed to transform one off global selector");
287
- // TODO:
288
-
289
- // HANDLER.with(|handler| {
290
- // handler
291
- // .struct_span_err(
292
- // selector.span,
293
- // "Failed to transform one off global selector",
294
- // )
295
- // .emit()
296
- // });
297
-
298
- new_selectors.push(iter.clone().cloned().collect());
299
- }
300
- }
301
-
302
- trace!(
303
- "Selector length after transform: {}",
304
- iter.selector_length()
305
- );
306
-
307
- if combinator.is_none() {
308
- combinator = iter.next_sequence();
309
- if combinator.is_none() {
310
- break;
311
- }
312
- } else {
313
- combinator = None;
314
- }
315
- }
316
-
317
- let new: Vec<_> = RemoveWhitespace {
318
- iter: new_selectors.into_iter().rev().flatten(),
319
- prev: None,
320
- }
321
- .collect();
322
- debug!("Selector vector: {:?}", SafeDebug(&new));
323
-
324
- *selector = Selector::from(new);
325
-
326
- Ok(())
327
- }
328
- }
329
-
330
- struct RemoveWhitespace<'i, I> {
331
- iter: I,
332
- prev: Option<Component<'i>>,
333
- }
334
-
335
- impl<'i, I> Iterator for RemoveWhitespace<'i, I>
336
- where
337
- I: Iterator<Item = Component<'i>>,
338
- {
339
- type Item = Component<'i>;
340
-
341
- fn next(&mut self) -> Option<Self::Item> {
342
- match self.prev.take() {
343
- Some(Component::Combinator(Combinator::Descendant)) => {
344
- self.prev = self.iter.next();
345
-
346
- match self.prev {
347
- Some(Component::Combinator(..)) => self.next(),
348
- _ => Some(Component::Combinator(Combinator::Descendant)),
349
- }
350
- }
351
- Some(v) => Some(v),
352
- _ => {
353
- self.prev = self.iter.next();
354
-
355
- if self.prev.is_some() {
356
- self.next()
357
- } else {
358
- None
359
- }
360
- }
361
- }
362
- }
363
- }
364
-
365
- impl CssNamespace {
366
- #[cfg_attr(debug_assertions, tracing::instrument(skip(self, node)))]
367
- fn get_transformed_selectors<'a, 'i, Impl>(
368
- &mut self,
369
- combinator: Option<Combinator>,
370
- node: &mut SelectorIter<'a, 'i, Impl>,
371
- ) -> Result<Vec<Component<'i>>, Error>
372
- where
373
- Impl: SelectorImpl<'i>,
374
- SelectorIter<'a, 'i, Impl>: Iterator<Item = &'a Component<'i>>,
375
- {
376
- let mut result: Vec<Component<'i>> = vec![];
377
-
378
- let mut pseudo_index = None;
379
-
380
- let node: Vec<Component<'i>> = node.fuse().cloned().collect::<Vec<_>>();
381
-
382
- if node.is_empty() {
383
- return Ok(result);
384
- }
385
-
386
- #[cfg(debug_assertions)]
387
- {
388
- let prev_sel = Selector::from(node.clone());
389
- debug!("Input selector: {:?}", SafeDebug(&prev_sel))
390
- }
391
-
392
- for (i, component) in node.iter().enumerate() {
393
- trace!("Selector at {}", i);
394
-
395
- #[cfg(debug_assertions)]
396
- {
397
- debug!("Component: {:?}", SafeDebug(&component))
398
- }
399
-
400
- // Look for :global
401
- let children: Selector<'i> = match &component {
402
- Component::NonTSPseudoClass(PseudoClass::CustomFunction { name, arguments }) => {
403
- if &**name != "global" {
404
- if pseudo_index.is_none() {
405
- pseudo_index = Some(i);
406
- }
407
-
408
- continue;
409
- }
410
-
411
- parse_token_list(arguments)
412
- }
413
- Component::PseudoElement(_)
414
- | Component::NonTSPseudoClass(..)
415
- | Component::Negation(..)
416
- | Component::Root
417
- | Component::Empty
418
- | Component::Scope
419
- | Component::Nth(..)
420
- | Component::NthOf(..)
421
- | Component::Slotted(..)
422
- | Component::Part(..)
423
- | Component::Host(..)
424
- | Component::Where(..)
425
- | Component::Is(..)
426
- | Component::Any(..)
427
- | Component::Has(..) => {
428
- if pseudo_index.is_none() {
429
- pseudo_index = Some(i);
430
- }
431
-
432
- continue;
433
- }
434
- _ => {
435
- continue;
436
- }
437
- };
438
-
439
- let mut complex_selectors =
440
- children.iter_raw_match_order().cloned().collect::<Vec<_>>();
441
-
442
- // Remove `a`
443
- complex_selectors.pop();
444
-
445
- if let Some(Component::Combinator(Combinator::Descendant)) = complex_selectors.last() {
446
- complex_selectors.pop();
447
- }
448
-
449
- if let Component::Combinator(Combinator::Descendant) = complex_selectors[0] {
450
- complex_selectors.remove(0);
451
- }
452
-
453
- if complex_selectors.is_empty() {
454
- bail!("Failed to transform one off global selector");
455
- }
456
-
457
- trace!("Combinator: {:?}", combinator);
458
- // trace!("node: {:?}", node);
459
- // trace!("complex_selectors: {:?}", complex_selectors);
460
-
461
- // result.push(Component::Combinator(Combinator::Descendant));
462
-
463
- complex_selectors.reverse();
464
-
465
- result.extend(complex_selectors);
466
- result.extend(node.into_iter().skip(i + 1));
467
-
468
- if let Some(combinator) = combinator {
469
- result.push(Component::Combinator(combinator));
470
- }
471
-
472
- return Ok(result);
473
- }
474
-
475
- // Pseudo element
476
- if result.is_empty() && node.len() == 1 && pseudo_index.is_some() {
477
- return Ok(node);
478
- }
479
-
480
- let mut node: Vec<Component<'i>> = node.clone();
481
-
482
- let subclass_selector = match self.is_dynamic {
483
- true => Cow::Borrowed("__jsx-style-dynamic-selector"),
484
- false => Cow::Owned(self.class_name.clone()),
485
- };
486
- match pseudo_index {
487
- None => {
488
- if !self.is_global {
489
- node.push(Component::Class(Ident::from(subclass_selector)));
490
- }
491
-
492
- result.extend(node);
493
- }
494
-
495
- Some(insert_index) => {
496
- result.extend(node);
497
-
498
- if !self.is_global {
499
- result.insert(
500
- insert_index,
501
- Component::Class(Ident::from(subclass_selector)),
502
- );
503
- }
504
- }
505
- }
506
-
507
- if let Some(combinator) = combinator {
508
- result.push(Component::Combinator(combinator));
509
- }
510
-
511
- Ok(result)
512
- }
513
- }
514
-
515
- /// Because it is allowed to write `.bar :global(> .foo) {}` or .bar
516
- /// :global(.foo) {}`, so selector can be complex or relative (it violates the
517
- /// specification), but it is popular usage, so we just add `a ` at top and
518
- /// then remove it
519
- fn parse_token_list<'i>(tokens: &TokenList<'i>) -> Selector<'i> {
520
- let mut buf = "a ".to_string();
521
-
522
- for t in tokens.0.iter() {
523
- match t {
524
- TokenOrValue::Token(t) => {
525
- buf.push_str(&t.to_css_string(Default::default()).unwrap());
526
- }
527
- TokenOrValue::Color(t) => {
528
- buf.push_str(&t.to_css_string(Default::default()).unwrap());
529
- }
530
- TokenOrValue::Url(t) => {
531
- buf.push_str(&t.to_css_string(Default::default()).unwrap());
532
- }
533
- TokenOrValue::Var(..) => {
534
- unimplemented!("parse_token_list: var")
535
- }
536
- TokenOrValue::Env(..) => {
537
- unimplemented!("parse_token_list: env var")
538
- }
539
- TokenOrValue::Function(..) => {
540
- unimplemented!("parse_token_list: function")
541
- }
542
- TokenOrValue::Length(t) => {
543
- buf.push_str(&t.to_css_string(Default::default()).unwrap());
544
- }
545
- TokenOrValue::Angle(t) => {
546
- buf.push_str(&t.to_css_string(Default::default()).unwrap());
547
- }
548
- TokenOrValue::Time(t) => {
549
- buf.push_str(&t.to_css_string(Default::default()).unwrap());
550
- }
551
- TokenOrValue::Resolution(t) => {
552
- buf.push_str(&t.to_css_string(Default::default()).unwrap());
553
- }
554
- TokenOrValue::DashedIdent(t) => {
555
- buf.push_str(&t.to_css_string(Default::default()).unwrap());
556
- }
557
- TokenOrValue::UnresolvedColor(..) => {
558
- unimplemented!("parse_token_list: unresolved color")
559
- }
560
- }
561
- }
562
-
563
- if cfg!(debug_assertions) {
564
- debug!("Parsing: {:?}", buf)
565
- }
566
-
567
- let selector = Selector::parse_string_with_options(&buf, Default::default())
568
- .expect("failed to parse selector list");
569
-
570
- unsafe {
571
- // Safety: Selector is variant over 'i
572
- transmute::<Selector, Selector>(owned_selector(&selector))
573
- }
574
- }
575
-
576
- struct SafeDebug<'a>(&'a dyn Debug);
577
-
578
- impl Debug for SafeDebug<'_> {
579
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
580
- let s = catch_unwind(AssertUnwindSafe(|| format!("{:?}", self.0)));
581
-
582
- match s {
583
- Ok(s) => {
584
- write!(f, "{}", s)
585
- }
586
- Err(_) => write!(f, "<panicked>"),
587
- }
588
- }
589
- }