Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(css/parser): parse custom media #6152

Merged
merged 3 commits into from Oct 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
36 changes: 36 additions & 0 deletions crates/swc_css_ast/src/at_rule.rs
@@ -1,5 +1,6 @@
use is_macro::Is;
use string_enum::StringEnum;
use swc_atoms::JsWord;
use swc_common::{ast_node, EqIgnoreSpan, Span};

use crate::{
Expand Down Expand Up @@ -63,6 +64,8 @@ pub enum AtRulePrelude {
LayerPrelude(LayerPrelude),
#[tag("ContainerCondition")]
ContainerPrelude(ContainerCondition),
#[tag("CustomMedia")]
CustomMediaPrelude(CustomMediaQuery),
}

#[ast_node]
Expand Down Expand Up @@ -801,3 +804,36 @@ pub enum SizeFeatureName {
#[tag("Ident")]
Ident(Ident),
}

#[ast_node("ExtensionName")]
#[derive(Eq, Hash)]
pub struct ExtensionName {
pub span: Span,
#[cfg_attr(feature = "rkyv", with(swc_atoms::EncodeJsWord))]
pub value: JsWord,
#[cfg_attr(feature = "rkyv", with(swc_atoms::EncodeJsWord))]
pub raw: Option<JsWord>,
kdy1 marked this conversation as resolved.
Show resolved Hide resolved
}

impl EqIgnoreSpan for ExtensionName {
fn eq_ignore_span(&self, other: &Self) -> bool {
self.value == other.value
}
}

#[ast_node("CustomMedia")]
#[derive(Eq, Hash, EqIgnoreSpan)]
pub struct CustomMediaQuery {
pub span: Span,
pub name: ExtensionName,
pub media: CustomMediaQueryMediaType,
}

#[ast_node]
#[derive(Eq, Hash, Is, EqIgnoreSpan)]
pub enum CustomMediaQueryMediaType {
#[tag("Ident")]
Ident(Ident),
#[tag("MediaQueryList")]
MediaQueryList(MediaQueryList),
}
68 changes: 51 additions & 17 deletions crates/swc_css_codegen/src/lib.rs
Expand Up @@ -138,27 +138,27 @@ where
AtRulePrelude::ListOfComponentValues(n) => emit!(self, n),
AtRulePrelude::CharsetPrelude(n) => {
space!(self);
emit!(self, n)
emit!(self, n);
}
AtRulePrelude::PropertyPrelude(n) => {
space!(self);
emit!(self, n)
emit!(self, n);
}
AtRulePrelude::CounterStylePrelude(n) => {
space!(self);
emit!(self, n)
emit!(self, n);
}
AtRulePrelude::ColorProfilePrelude(n) => {
space!(self);
emit!(self, n);
}
AtRulePrelude::DocumentPrelude(n) => {
space!(self);
emit!(self, n)
emit!(self, n);
}
AtRulePrelude::FontPaletteValuesPrelude(n) => {
space!(self);
emit!(self, n)
emit!(self, n);
}
AtRulePrelude::FontFeatureValuesPrelude(n) => {
let need_space = !matches!(n.font_family.get(0), Some(FamilyName::Str(_)));
Expand All @@ -169,11 +169,11 @@ where
formatting_space!(self);
}

emit!(self, n)
emit!(self, n);
}
AtRulePrelude::NestPrelude(n) => {
space!(self);
emit!(self, n)
emit!(self, n);
}
AtRulePrelude::KeyframesPrelude(n) => {
match n {
Expand All @@ -187,7 +187,7 @@ where
}
}

emit!(self, n)
emit!(self, n);
}
AtRulePrelude::ImportPrelude(n) => {
match &*n.href {
Expand All @@ -199,7 +199,7 @@ where
}
}

emit!(self, n)
emit!(self, n);
}
AtRulePrelude::NamespacePrelude(n) => emit!(self, n),
AtRulePrelude::MediaPrelude(n) => {
Expand Down Expand Up @@ -230,7 +230,7 @@ where
formatting_space!(self);
}

emit!(self, n)
emit!(self, n);
}
AtRulePrelude::SupportsPrelude(n) => {
let need_space = !matches!(
Expand Down Expand Up @@ -262,11 +262,11 @@ where
}
}

emit!(self, n)
emit!(self, n);
}
AtRulePrelude::LayerPrelude(n) => {
space!(self);
emit!(self, n)
emit!(self, n);
}
AtRulePrelude::ContainerPrelude(n) => {
let need_space = match n.name {
Expand All @@ -289,7 +289,11 @@ where
formatting_space!(self);
}

emit!(self, n)
emit!(self, n);
}
AtRulePrelude::CustomMediaPrelude(n) => {
space!(self);
emit!(self, n);
}
}
}
Expand Down Expand Up @@ -1088,6 +1092,21 @@ where
emit!(self, n.right);
}

#[emitter]
fn emit_custom_media_query(&mut self, n: &CustomMediaQuery) -> Result {
emit!(self, n.name);
space!(self);
emit!(self, n.media);
}

#[emitter]
fn emit_custom_media_query_media_type(&mut self, n: &CustomMediaQueryMediaType) -> Result {
match n {
CustomMediaQueryMediaType::MediaQueryList(n) => emit!(self, n),
CustomMediaQueryMediaType::Ident(n) => emit!(self, n),
}
}

fn emit_list_of_component_values_inner(
&mut self,
nodes: &[ComponentValue],
Expand Down Expand Up @@ -1473,22 +1492,22 @@ where
}

#[emitter]
fn emit_custom_highlight_name(&mut self, n: &CustomHighlightName) -> Result {
fn emit_custom_ident(&mut self, n: &CustomIdent) -> Result {
if self.config.minify {
let serialized = serialize_ident(&n.value, n.raw.as_deref(), true);

write_raw!(self, n.span, &serialized);
} else if let Some(raw) = &n.raw {
write_raw!(self, n.span, raw);
} else {
let serialized = serialize_ident(&n.value, n.raw.as_deref(), true);
let serialized = serialize_ident(&n.value, n.raw.as_deref(), false);

write_raw!(self, n.span, &serialized);
}
}

#[emitter]
fn emit_custom_ident(&mut self, n: &CustomIdent) -> Result {
fn emit_dashed_ident(&mut self, n: &DashedIdent) -> Result {
if self.config.minify {
let serialized = serialize_ident(&n.value, n.raw.as_deref(), true);

Expand All @@ -1503,7 +1522,7 @@ where
}

#[emitter]
fn emit_dashed_ident(&mut self, n: &DashedIdent) -> Result {
fn emit_extension_name(&mut self, n: &ExtensionName) -> Result {
if self.config.minify {
let serialized = serialize_ident(&n.value, n.raw.as_deref(), true);

Expand All @@ -1517,6 +1536,21 @@ where
}
}

#[emitter]
fn emit_custom_highlight_name(&mut self, n: &CustomHighlightName) -> Result {
if self.config.minify {
let serialized = serialize_ident(&n.value, n.raw.as_deref(), true);

write_raw!(self, n.span, &serialized);
} else if let Some(raw) = &n.raw {
write_raw!(self, n.span, raw);
} else {
let serialized = serialize_ident(&n.value, n.raw.as_deref(), true);

write_raw!(self, n.span, &serialized);
}
}

#[emitter]
fn emit_custom_property_name(&mut self, n: &CustomPropertyName) -> Result {
if let Some(raw) = &n.raw {
Expand Down