@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.
- package/package.json +1 -1
- package/swc_plugin_styled_jsx.wasm +0 -0
- package/transform/Cargo.toml +0 -39
- package/transform/src/lib.rs +0 -7
- package/transform/src/lifetime.rs +0 -408
- package/transform/src/style.rs +0 -25
- package/transform/src/transform_css_lightningcss.rs +0 -589
- package/transform/src/transform_css_swc.rs +0 -392
- package/transform/src/utils.rs +0 -371
- package/transform/src/visitor.rs +0 -963
- package/transform/tests/errors/nested-style-tags/input.js +0 -31
- package/transform/tests/errors/nested-style-tags/output-lightningcss.js +0 -58
- package/transform/tests/errors/nested-style-tags/output-lightningcss.stderr +0 -27
- package/transform/tests/errors/nested-style-tags/output-swc.js +0 -58
- package/transform/tests/errors/nested-style-tags/output-swc.stderr +0 -27
- package/transform/tests/errors/nested-style-tags/output.js +0 -58
- package/transform/tests/errors/no-child/input.js +0 -6
- package/transform/tests/errors/no-child/output-lightningcss.js +0 -8
- package/transform/tests/errors/no-child/output-lightningcss.stderr +0 -9
- package/transform/tests/errors/no-child/output-swc.js +0 -8
- package/transform/tests/errors/no-child/output-swc.stderr +0 -9
- package/transform/tests/errors/no-child/output.js +0 -8
- package/transform/tests/errors/ts-with-css-resolve/input.js +0 -10
- package/transform/tests/errors/ts-with-css-resolve/output-lightningcss.js +0 -5
- package/transform/tests/errors/ts-with-css-resolve/output-lightningcss.stderr +0 -2
- package/transform/tests/errors/ts-with-css-resolve/output-swc.js +0 -5
- package/transform/tests/errors/ts-with-css-resolve/output-swc.stderr +0 -2
- package/transform/tests/errors/ts-with-css-resolve/output.js +0 -5
- package/transform/tests/errors/two-children/input.js +0 -8
- package/transform/tests/errors/two-children/output-lightningcss.js +0 -12
- package/transform/tests/errors/two-children/output-lightningcss.stderr +0 -11
- package/transform/tests/errors/two-children/output-swc.js +0 -12
- package/transform/tests/errors/two-children/output-swc.stderr +0 -11
- package/transform/tests/errors/two-children/output.js +0 -12
- package/transform/tests/errors/wrong-child-type/input.js +0 -7
- package/transform/tests/errors/wrong-child-type/output-lightningcss.js +0 -10
- package/transform/tests/errors/wrong-child-type/output-lightningcss.stderr +0 -10
- package/transform/tests/errors/wrong-child-type/output-swc.js +0 -10
- package/transform/tests/errors/wrong-child-type/output-swc.stderr +0 -10
- package/transform/tests/errors/wrong-child-type/output.js +0 -10
- package/transform/tests/errors/wrong-jsx-expression-type/input.js +0 -7
- package/transform/tests/errors/wrong-jsx-expression-type/output-lightningcss.js +0 -10
- package/transform/tests/errors/wrong-jsx-expression-type/output-lightningcss.stderr +0 -10
- package/transform/tests/errors/wrong-jsx-expression-type/output-swc.js +0 -10
- package/transform/tests/errors/wrong-jsx-expression-type/output-swc.stderr +0 -10
- package/transform/tests/errors/wrong-jsx-expression-type/output.js +0 -10
- package/transform/tests/fixture/.expressions/input.js +0 -90
- package/transform/tests/fixture/absent/input.js +0 -6
- package/transform/tests/fixture/absent/output.lightningcss.js +0 -7
- package/transform/tests/fixture/absent/output.swc.js +0 -7
- package/transform/tests/fixture/attribute-generation-classname-rewriting/input.js +0 -55
- package/transform/tests/fixture/attribute-generation-classname-rewriting/output.lightningcss.js +0 -112
- package/transform/tests/fixture/attribute-generation-classname-rewriting/output.swc.js +0 -112
- package/transform/tests/fixture/attribute-generation-modes/input.js +0 -166
- package/transform/tests/fixture/attribute-generation-modes/output.lightningcss.js +0 -228
- package/transform/tests/fixture/attribute-generation-modes/output.swc.js +0 -228
- package/transform/tests/fixture/class/input.js +0 -14
- package/transform/tests/fixture/class/output.lightningcss.js +0 -12
- package/transform/tests/fixture/class/output.swc.js +0 -12
- package/transform/tests/fixture/comments/input.js +0 -18
- package/transform/tests/fixture/comments/output.lightningcss.js +0 -12
- package/transform/tests/fixture/comments/output.swc.js +0 -12
- package/transform/tests/fixture/component-attribute/input.js +0 -11
- package/transform/tests/fixture/component-attribute/output.lightningcss.js +0 -10
- package/transform/tests/fixture/component-attribute/output.swc.js +0 -10
- package/transform/tests/fixture/conflicts/input.js +0 -16
- package/transform/tests/fixture/conflicts/output.lightningcss.js +0 -14
- package/transform/tests/fixture/conflicts/output.swc.js +0 -14
- package/transform/tests/fixture/css-selector-after-pseudo/input.js +0 -18
- package/transform/tests/fixture/css-selector-after-pseudo/output.lightningcss.js +0 -11
- package/transform/tests/fixture/css-selector-after-pseudo/output.swc.js +0 -11
- package/transform/tests/fixture/css-tag-same-file/input.js +0 -25
- package/transform/tests/fixture/css-tag-same-file/output.lightningcss.js +0 -21
- package/transform/tests/fixture/css-tag-same-file/output.swc.js +0 -21
- package/transform/tests/fixture/different-jsx-ids/input.js +0 -23
- package/transform/tests/fixture/different-jsx-ids/output.lightningcss.js +0 -24
- package/transform/tests/fixture/different-jsx-ids/output.swc.js +0 -24
- package/transform/tests/fixture/dynamic-element/input.js +0 -56
- package/transform/tests/fixture/dynamic-element/output.lightningcss.js +0 -40
- package/transform/tests/fixture/dynamic-element/output.swc.js +0 -40
- package/transform/tests/fixture/dynamic-element-class/input.js +0 -32
- package/transform/tests/fixture/dynamic-element-class/output.lightningcss.js +0 -25
- package/transform/tests/fixture/dynamic-element-class/output.swc.js +0 -25
- package/transform/tests/fixture/dynamic-element-external/input.js +0 -12
- package/transform/tests/fixture/dynamic-element-external/output.lightningcss.js +0 -12
- package/transform/tests/fixture/dynamic-element-external/output.swc.js +0 -12
- package/transform/tests/fixture/dynamic-this-in-arrow/input.js +0 -41
- package/transform/tests/fixture/dynamic-this-in-arrow/output.lightningcss.js +0 -39
- package/transform/tests/fixture/dynamic-this-in-arrow/output.swc.js +0 -39
- package/transform/tests/fixture/exported-jsx-style/input.js +0 -1
- package/transform/tests/fixture/exported-jsx-style/output.lightningcss.js +0 -1
- package/transform/tests/fixture/exported-jsx-style/output.swc.js +0 -1
- package/transform/tests/fixture/exported-non-jsx-style/input.js +0 -1
- package/transform/tests/fixture/exported-non-jsx-style/output.lightningcss.js +0 -1
- package/transform/tests/fixture/exported-non-jsx-style/output.swc.js +0 -1
- package/transform/tests/fixture/external-nested-scope/input.js +0 -5
- package/transform/tests/fixture/external-nested-scope/output.lightningcss.js +0 -7
- package/transform/tests/fixture/external-nested-scope/output.swc.js +0 -7
- package/transform/tests/fixture/external-stylesheet/input.js +0 -41
- package/transform/tests/fixture/external-stylesheet/output.lightningcss.js +0 -34
- package/transform/tests/fixture/external-stylesheet/output.swc.js +0 -34
- package/transform/tests/fixture/external-stylesheet-global/input.js +0 -19
- package/transform/tests/fixture/external-stylesheet-global/output.lightningcss.js +0 -18
- package/transform/tests/fixture/external-stylesheet-global/output.swc.js +0 -18
- package/transform/tests/fixture/external-stylesheet-multi-line/input.js +0 -9
- package/transform/tests/fixture/external-stylesheet-multi-line/output.lightningcss.js +0 -9
- package/transform/tests/fixture/external-stylesheet-multi-line/output.swc.js +0 -9
- package/transform/tests/fixture/fragment/input.js +0 -51
- package/transform/tests/fixture/fragment/output.lightningcss.js +0 -47
- package/transform/tests/fixture/fragment/output.swc.js +0 -47
- package/transform/tests/fixture/global/input.js +0 -22
- package/transform/tests/fixture/global/output.lightningcss.js +0 -7
- package/transform/tests/fixture/global/output.swc.js +0 -7
- package/transform/tests/fixture/global-child-selector/input.js +0 -10
- package/transform/tests/fixture/global-child-selector/output.lightningcss.js +0 -8
- package/transform/tests/fixture/global-child-selector/output.swc.js +0 -8
- package/transform/tests/fixture/global-redundant/input.js +0 -12
- package/transform/tests/fixture/global-redundant/output.lightningcss.js +0 -10
- package/transform/tests/fixture/global-redundant/output.swc.js +0 -10
- package/transform/tests/fixture/issue-30480/input.js +0 -11
- package/transform/tests/fixture/issue-30480/output.lightningcss.js +0 -15
- package/transform/tests/fixture/issue-30480/output.swc.js +0 -15
- package/transform/tests/fixture/issue-30570/input.js +0 -15
- package/transform/tests/fixture/issue-30570/output.lightningcss.js +0 -12
- package/transform/tests/fixture/issue-30570/output.swc.js +0 -12
- package/transform/tests/fixture/issue-31562-interpolation-in-mdea/input.js +0 -30
- package/transform/tests/fixture/issue-31562-interpolation-in-mdea/output.lightningcss.js +0 -43
- package/transform/tests/fixture/issue-31562-interpolation-in-mdea/output.swc.js +0 -43
- package/transform/tests/fixture/mixed-global-scoped/input.js +0 -9
- package/transform/tests/fixture/mixed-global-scoped/output.lightningcss.js +0 -11
- package/transform/tests/fixture/mixed-global-scoped/output.swc.js +0 -11
- package/transform/tests/fixture/multiple-jsx/input.js +0 -43
- package/transform/tests/fixture/multiple-jsx/output.lightningcss.js +0 -32
- package/transform/tests/fixture/multiple-jsx/output.swc.js +0 -32
- package/transform/tests/fixture/nested-style-tags/index.js +0 -0
- package/transform/tests/fixture/next-54653/input.js +0 -10
- package/transform/tests/fixture/next-54653/output.lightningcss.js +0 -3
- package/transform/tests/fixture/next-54653/output.swc.js +0 -3
- package/transform/tests/fixture/non-styled-jsx-style/input.js +0 -7
- package/transform/tests/fixture/non-styled-jsx-style/output.lightningcss.js +0 -12
- package/transform/tests/fixture/non-styled-jsx-style/output.swc.js +0 -12
- package/transform/tests/fixture/not-styled-jsx-tagged-templates/input.js +0 -30
- package/transform/tests/fixture/not-styled-jsx-tagged-templates/output.lightningcss.js +0 -23
- package/transform/tests/fixture/not-styled-jsx-tagged-templates/output.swc.js +0 -23
- package/transform/tests/fixture/number-after-placeholder/input.js +0 -17
- package/transform/tests/fixture/number-after-placeholder/output.lightningcss.js +0 -17
- package/transform/tests/fixture/number-after-placeholder/output.swc.js +0 -17
- package/transform/tests/fixture/one-off-global-selectors/input.js +0 -10
- package/transform/tests/fixture/one-off-global-selectors/output.lightningcss.js +0 -8
- package/transform/tests/fixture/one-off-global-selectors/output.swc.js +0 -8
- package/transform/tests/fixture/source-maps/input.js +0 -8
- package/transform/tests/fixture/source-maps/output.lightningcss.js +0 -8
- package/transform/tests/fixture/source-maps/output.swc.js +0 -8
- package/transform/tests/fixture/stateless/input.js +0 -8
- package/transform/tests/fixture/stateless/output.lightningcss.js +0 -12
- package/transform/tests/fixture/stateless/output.swc.js +0 -12
- package/transform/tests/fixture/styles/input.js +0 -57
- package/transform/tests/fixture/styles/output.lightningcss.js +0 -39
- package/transform/tests/fixture/styles/output.swc.js +0 -39
- package/transform/tests/fixture/styles-external-invalid/input.js +0 -13
- package/transform/tests/fixture/styles-external-invalid/output.lightningcss.js +0 -9
- package/transform/tests/fixture/styles-external-invalid/output.swc.js +0 -9
- package/transform/tests/fixture/styles-external-invalid2/input.js +0 -11
- package/transform/tests/fixture/styles-external-invalid2/output.lightningcss.js +0 -8
- package/transform/tests/fixture/styles-external-invalid2/output.swc.js +0 -8
- package/transform/tests/fixture/styles2/input.js +0 -6
- package/transform/tests/fixture/styles2/output.lightningcss.js +0 -5
- package/transform/tests/fixture/styles2/output.swc.js +0 -5
- package/transform/tests/fixture/too-many/input.js +0 -35
- package/transform/tests/fixture/too-many/output.lightningcss.js +0 -49
- package/transform/tests/fixture/too-many/output.swc.js +0 -49
- package/transform/tests/fixture/tpl-escape-1/input.js +0 -14
- package/transform/tests/fixture/tpl-escape-1/output.lightningcss.js +0 -12
- package/transform/tests/fixture/tpl-escape-1/output.swc.js +0 -12
- package/transform/tests/fixture/tpl-escape-2/input.js +0 -17
- package/transform/tests/fixture/tpl-escape-2/output.lightningcss.js +0 -17
- package/transform/tests/fixture/tpl-escape-2/output.swc.js +0 -17
- package/transform/tests/fixture/tpl-placeholder-1-as-property/input.js +0 -17
- package/transform/tests/fixture/tpl-placeholder-1-as-property/output.lightningcss.js +0 -28
- package/transform/tests/fixture/tpl-placeholder-1-as-property/output.swc.js +0 -28
- package/transform/tests/fixture/tpl-placeholder-2-as-part-of-value/input.js +0 -21
- package/transform/tests/fixture/tpl-placeholder-2-as-part-of-value/output.lightningcss.js +0 -34
- package/transform/tests/fixture/tpl-placeholder-2-as-part-of-value/output.swc.js +0 -34
- package/transform/tests/fixture/tpl-placeholder-3-as-value/input.js +0 -17
- package/transform/tests/fixture/tpl-placeholder-3-as-value/output.lightningcss.js +0 -28
- package/transform/tests/fixture/tpl-placeholder-3-as-value/output.swc.js +0 -28
- package/transform/tests/fixture/tpl-placeholder-4-as-part-of-value-in-multiple/input.js +0 -17
- package/transform/tests/fixture/tpl-placeholder-4-as-part-of-value-in-multiple/output.lightningcss.js +0 -31
- package/transform/tests/fixture/tpl-placeholder-4-as-part-of-value-in-multiple/output.swc.js +0 -31
- package/transform/tests/fixture/tpl-placeholder-5-values-of-multiple-properties/input.js +0 -16
- package/transform/tests/fixture/tpl-placeholder-5-values-of-multiple-properties/output.lightningcss.js +0 -31
- package/transform/tests/fixture/tpl-placeholder-5-values-of-multiple-properties/output.swc.js +0 -31
- package/transform/tests/fixture/transform-css/input.js +0 -176
- package/transform/tests/fixture/transform-css/output.lightningcss.js +0 -8
- package/transform/tests/fixture/transform-css/output.swc.js +0 -8
- package/transform/tests/fixture/transform-css-complex-selector/input.js +0 -116
- package/transform/tests/fixture/transform-css-complex-selector/output.lightningcss.js +0 -8
- package/transform/tests/fixture/transform-css-complex-selector/output.swc.js +0 -8
- package/transform/tests/fixture/transform-css-complex-selector-2/input.js +0 -12
- package/transform/tests/fixture/transform-css-complex-selector-2/output.lightningcss.js +0 -8
- package/transform/tests/fixture/transform-css-complex-selector-2/output.swc.js +0 -8
- package/transform/tests/fixture/transform-css-global/input.js +0 -32
- package/transform/tests/fixture/transform-css-global/output.lightningcss.js +0 -8
- package/transform/tests/fixture/transform-css-global/output.swc.js +0 -8
- package/transform/tests/fixture/transform-css-media-query/input.js +0 -24
- package/transform/tests/fixture/transform-css-media-query/output.lightningcss.js +0 -8
- package/transform/tests/fixture/transform-css-media-query/output.swc.js +0 -8
- package/transform/tests/fixture/transform-css-normal/input.js +0 -22
- package/transform/tests/fixture/transform-css-normal/output.lightningcss.js +0 -8
- package/transform/tests/fixture/transform-css-normal/output.swc.js +0 -8
- package/transform/tests/fixture/transform-css-nth-1/input.js +0 -10
- package/transform/tests/fixture/transform-css-nth-1/output.lightningcss.js +0 -8
- package/transform/tests/fixture/transform-css-nth-1/output.swc.js +0 -8
- package/transform/tests/fixture/whitespace/input.js +0 -12
- package/transform/tests/fixture/whitespace/output.lightningcss.js +0 -12
- package/transform/tests/fixture/whitespace/output.swc.js +0 -12
- 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
|
-
}
|