diff --git a/bindings/binding_core_node/Cargo.toml b/bindings/binding_core_node/Cargo.toml index 27ab40ebd5b5..f491b5695a78 100644 --- a/bindings/binding_core_node/Cargo.toml +++ b/bindings/binding_core_node/Cargo.toml @@ -59,6 +59,7 @@ tracing-subscriber = { version = "0.3.9", features = ["env-filter"] } swc_core = { version = "0.69.20", features = [ "allocator_node", "ecma_ast", + "ecma_ast_serde", "common_concurrent", "bundler", "ecma_loader", diff --git a/bindings/binding_core_wasm/Cargo.toml b/bindings/binding_core_wasm/Cargo.toml index d36e79dd6195..5a150c02da3e 100644 --- a/bindings/binding_core_wasm/Cargo.toml +++ b/bindings/binding_core_wasm/Cargo.toml @@ -24,6 +24,7 @@ anyhow = "1.0.66" serde = { version = "1", features = ["derive"] } serde-wasm-bindgen = "0.4.5" swc_core = { version = "0.69.20", features = [ + "ecma_ast_serde", "common_perf", "binding_macro_wasm", "ecma_transforms", diff --git a/crates/ast_node/src/enum_deserialize.rs b/crates/ast_node/src/enum_deserialize.rs index ca37bf03fceb..94745d77b4f7 100644 --- a/crates/ast_node/src/enum_deserialize.rs +++ b/crates/ast_node/src/enum_deserialize.rs @@ -411,6 +411,7 @@ pub fn expand( variants }, { + #[cfg(feature = "serde-impl")] impl<'de> serde::Deserialize<'de> for Enum { #[allow(unreachable_code)] fn deserialize<__D>( diff --git a/crates/ast_node/src/lib.rs b/crates/ast_node/src/lib.rs index b27e1554c620..26f837d1a66b 100644 --- a/crates/ast_node/src/lib.rs +++ b/crates/ast_node/src/lib.rs @@ -189,12 +189,17 @@ pub fn ast_node( item.quote_with(smart_quote!(Vars { input, clone }, { #[allow(clippy::derive_partial_eq_without_eq)] + #[cfg_attr( + feature = "serde-impl", + derive( + ::serde::Serialize, + ) + )] #[derive( ::swc_common::FromVariant, ::swc_common::Spanned, Debug, PartialEq, - ::serde::Serialize, ::swc_common::DeserializeEnum, )] clone @@ -220,7 +225,10 @@ pub fn ast_node( deserialize = "__D: rkyv_latest::de::SharedDeserializeRegistry" )) )] - #[serde(untagged)] + #[cfg_attr( + feature = "serde-impl", + serde(untagged) + )] input })) } @@ -238,7 +246,10 @@ pub fn ast_node( }) => { if args.is_some() { Some(Quote::new_call_site().quote_with(smart_quote!(Vars {}, { - #[serde(tag = "type")] + #[cfg_attr( + feature = "serde-impl", + serde(tag = "type") + )] }))) } else { None @@ -248,8 +259,11 @@ pub fn ast_node( }; let serde_rename = args.as_ref().map(|args| { - Quote::new_call_site().quote_with(smart_quote!(Vars { name: &args.ty },{ - #[serde(rename = name)] + Quote::new_call_site().quote_with(smart_quote!(Vars { name: &args.ty }, { + #[cfg_attr( + feature = "serde-impl", + serde(rename = name) + )] })) }); @@ -261,7 +275,10 @@ pub fn ast_node( item.quote_with(smart_quote!(Vars { input, serde_tag, serde_rename }, { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(::swc_common::Spanned, Clone, Debug, PartialEq)] - #[derive(::serde::Serialize, ::serde::Deserialize)] + #[cfg_attr( + feature = "serde-impl", + derive(::serde::Serialize, ::serde::Deserialize) + )] #[cfg_attr( feature = "rkyv-impl", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) @@ -289,7 +306,10 @@ pub fn ast_node( ) )] serde_tag - #[serde(rename_all = "camelCase")] + #[cfg_attr( + feature = "serde-impl", + serde(rename_all = "camelCase") + )] serde_rename input })); diff --git a/crates/jsdoc/Cargo.toml b/crates/jsdoc/Cargo.toml index 686c6d81cb1e..9039e4f0390d 100644 --- a/crates/jsdoc/Cargo.toml +++ b/crates/jsdoc/Cargo.toml @@ -11,9 +11,13 @@ version = "0.99.10" [lib] bench = false +[features] +serde-impl = ["serde"] + [dependencies] -nom = "7.1.0" -serde = { version = "1", features = ["derive"] } +nom = "7.1.0" +serde = { version = "1", features = ["derive"], optional = true } + swc_atoms = { version = "0.4.39", path = "../swc_atoms" } swc_common = { version = "0.29.39", path = "../swc_common" } diff --git a/crates/jsdoc/src/ast.rs b/crates/jsdoc/src/ast.rs index 0111bb1a8bfc..e907f4e550d2 100644 --- a/crates/jsdoc/src/ast.rs +++ b/crates/jsdoc/src/ast.rs @@ -21,9 +21,9 @@ pub struct JsDoc { #[ast_node] pub struct TagItem { pub span: Span, - #[serde(rename = "tagName")] + #[cfg_attr(feature = "serde-impl", serde(rename = "tagName"))] pub tag_name: Text, - #[serde(flatten)] + #[cfg_attr(feature = "serde-impl", serde(flatten))] pub tag: Tag, } @@ -304,7 +304,7 @@ pub struct ParameterTag { pub span: Span, pub name: Option, - #[serde(rename = "typeExpression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeExpression"))] pub ty: Option, pub desc: Text, @@ -345,11 +345,11 @@ pub struct TemplateTag { #[ast_node] pub struct TypedefTag { pub span: Span, - #[serde(rename = "full_name")] + #[cfg_attr(feature = "serde-impl", serde(rename = "full_name"))] pub full_name: Option, pub name: Option, - #[serde(rename = "typeExpression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeExpression"))] pub type_expr: Option, } diff --git a/crates/string_enum/src/lib.rs b/crates/string_enum/src/lib.rs index ba32648a409e..50811b0b9df0 100644 --- a/crates/string_enum/src/lib.rs +++ b/crates/string_enum/src/lib.rs @@ -28,8 +28,8 @@ use syn::{self, *}; ///# Output /// /// - `pub fn as_str(&self) -> &'static str` -/// - `impl serde::Serialize` -/// - `impl serde::Deserialize` +/// - `impl serde::Serialize` with `cfg(feature = "serde")` +/// - `impl serde::Deserialize` with `cfg(feature = "serde")` /// - `impl FromStr` /// - `impl Debug` /// - `impl Display` @@ -332,6 +332,7 @@ fn make_as_str_ident() -> Ident { fn make_serialize(i: &DeriveInput) -> ItemImpl { Quote::new_call_site() .quote_with(smart_quote!(Vars { Type: &i.ident }, { + #[cfg(feature = "serde")] impl ::serde::Serialize for Type { fn serialize(&self, serializer: S) -> Result where @@ -348,6 +349,7 @@ fn make_serialize(i: &DeriveInput) -> ItemImpl { fn make_deserialize(i: &DeriveInput) -> ItemImpl { Quote::new_call_site() .quote_with(smart_quote!(Vars { Type: &i.ident }, { + #[cfg(feature = "serde")] impl<'de> ::serde::Deserialize<'de> for Type { fn deserialize(deserializer: D) -> Result where diff --git a/crates/swc/Cargo.toml b/crates/swc/Cargo.toml index 1f51989553af..9f6690d3729e 100644 --- a/crates/swc/Cargo.toml +++ b/crates/swc/Cargo.toml @@ -122,6 +122,9 @@ swc_visit = { version = "0.5.5", path = "../swc_visit" } ansi_term = "0.12" criterion = "0.3" rayon = "1.5.1" +swc_ecma_ast = { version = "0.100.5", path = "../swc_ecma_ast", features = [ + "serde-impl", +] } swc_ecma_lints = { version = "0.77.16", path = "../swc_ecma_lints", features = [ "non_critical_lints", ] } diff --git a/crates/swc_common/benches/serde.rs b/crates/swc_common/benches/serde.rs index ced125506964..b50d61414dd6 100644 --- a/crates/swc_common/benches/serde.rs +++ b/crates/swc_common/benches/serde.rs @@ -1,3 +1,5 @@ +#![cfg_attr(not(feature = "serde-impl"), allow(unused))] + use ast_node::ast_node; use criterion::{black_box, criterion_group, criterion_main, Criterion}; use serde::{Deserialize, Serialize}; @@ -64,6 +66,7 @@ fn bench_serde(c: &mut Criterion) { } fn bench_ast_node(c: &mut Criterion) { + #[cfg(feature = "serde-impl")] c.bench_function("serialization of ast node", |b| { let src = AstNode::String(Str { span: DUMMY_SP, @@ -72,6 +75,7 @@ fn bench_ast_node(c: &mut Criterion) { b.iter(|| black_box(serde_json::to_string(&src).unwrap())); }); + #[cfg(feature = "serde-impl")] c.bench_function("deserialization of ast node", |b| { let src = serde_json::to_string(&AstNode::String(Str { span: DUMMY_SP, diff --git a/crates/swc_common/src/lib.rs b/crates/swc_common/src/lib.rs index 65e69bd94919..c8c7c226efc7 100644 --- a/crates/swc_common/src/lib.rs +++ b/crates/swc_common/src/lib.rs @@ -38,7 +38,6 @@ use std::fmt::Debug; pub use ast_node::{ast_node, ast_serde, DeserializeEnum, Spanned}; pub use from_variant::FromVariant; -use serde::Serialize; pub use swc_eq_ignore_macros::{EqIgnoreSpan, TypeEq}; pub use swc_visit::chain; @@ -57,7 +56,7 @@ pub use self::{ pub mod private; /// A trait for ast nodes. -pub trait AstNode: Debug + PartialEq + Clone + Spanned + Serialize { +pub trait AstNode: Debug + PartialEq + Clone + Spanned { const TYPE: &'static str; } diff --git a/crates/swc_common/tests/issue_3159.rs b/crates/swc_common/tests/issue_3159.rs index be23d46b6827..e772d152aa79 100644 --- a/crates/swc_common/tests/issue_3159.rs +++ b/crates/swc_common/tests/issue_3159.rs @@ -1,7 +1,7 @@ use swc_common::ast_serde; #[ast_serde] -enum Message { +pub enum Message { #[tag("Request")] Request(String), #[tag("Response")] diff --git a/crates/swc_core/Cargo.toml b/crates/swc_core/Cargo.toml index 082aa10f4b71..191b12553d8c 100644 --- a/crates/swc_core/Cargo.toml +++ b/crates/swc_core/Cargo.toml @@ -128,7 +128,8 @@ testing_transform = ["__ecma", "__testing_transform"] # Enable swc_ecma_ast / swc_atoms support. # TODO: currently both are enabled at once, we may want to separate them. -ecma_ast = ["__ecma", "swc_ecma_ast", "swc_atoms"] +ecma_ast = ["__ecma", "swc_ecma_ast", "swc_atoms"] +ecma_ast_serde = ["ecma_ast", "swc_ecma_ast/serde-impl"] # Enable swc_ecma_parser support. ecma_parser = ["__parser"] @@ -151,6 +152,7 @@ ecma_usage_analyzer = ["__ecma", "swc_ecma_usage_analyzer"] # Enable swc_css css_ast = ["__css", "swc_css_ast"] +css_ast_serde = ["css_ast", "swc_css_ast/serde-impl"] css_codegen = ["__css", "swc_css_codegen"] css_compat = ["__css", "swc_css_compat"] css_minifier = ["__css", "swc_css_minifier"] diff --git a/crates/swc_core/tests/fixture/stub_wasm/Cargo.toml b/crates/swc_core/tests/fixture/stub_wasm/Cargo.toml index 62617bba8dea..6d43b025edde 100644 --- a/crates/swc_core/tests/fixture/stub_wasm/Cargo.toml +++ b/crates/swc_core/tests/fixture/stub_wasm/Cargo.toml @@ -20,6 +20,7 @@ serde = { version = "1", features = ["derive"] } serde-wasm-bindgen = "0.4.5" swc_core = { path = "../../../../swc_core", features = [ "common_perf", + "ecma_ast_serde", "binding_macro_wasm", "ecma_transforms", "ecma_visit", diff --git a/crates/swc_css_ast/Cargo.toml b/crates/swc_css_ast/Cargo.toml index 54d509af47fa..60785648eb37 100644 --- a/crates/swc_css_ast/Cargo.toml +++ b/crates/swc_css_ast/Cargo.toml @@ -16,13 +16,13 @@ __rkyv = [] default = [] rkyv-bytecheck-impl = [] rkyv-impl = ["__rkyv", "rkyv", "swc_atoms/rkyv-impl", "swc_common/rkyv-impl"] - +serde-impl = ["serde"] [dependencies] bytecheck = { version = "0.6.9", optional = true } is-macro = "0.2.0" rkyv = { version = "=0.7.37", optional = true } -serde = { version = "1.0.127", features = ["derive"] } +serde = { version = "1.0.127", features = ["derive"], optional = true } string_enum = { version = "0.3.4", path = "../string_enum/" } swc_atoms = { version = "0.4.39", path = "../swc_atoms" } diff --git a/crates/swc_css_ast/src/at_rule.rs b/crates/swc_css_ast/src/at_rule.rs index 1eda17df76a9..558ec9e9faed 100644 --- a/crates/swc_css_ast/src/at_rule.rs +++ b/crates/swc_css_ast/src/at_rule.rs @@ -475,10 +475,10 @@ pub struct MediaFeatureRange { pub struct MediaFeatureRangeInterval { pub span: Span, pub left: Box, - #[serde(rename = "leftComparison")] + #[cfg_attr(feature = "serde-impl", serde(rename = "leftComparison"))] pub left_comparison: MediaFeatureRangeComparison, pub name: MediaFeatureName, - #[serde(rename = "rightComparison")] + #[cfg_attr(feature = "serde-impl", serde(rename = "rightComparison"))] pub right_comparison: MediaFeatureRangeComparison, pub right: Box, } @@ -803,10 +803,10 @@ pub struct SizeFeatureRange { pub struct SizeFeatureRangeInterval { pub span: Span, pub left: Box, - #[serde(rename = "leftComparison")] + #[cfg_attr(feature = "serde-impl", serde(rename = "leftComparison"))] pub left_comparison: SizeFeatureRangeComparison, pub name: SizeFeatureName, - #[serde(rename = "rightComparison")] + #[cfg_attr(feature = "serde-impl", serde(rename = "rightComparison"))] pub right_comparison: SizeFeatureRangeComparison, pub right: Box, } diff --git a/crates/swc_css_ast/src/token.rs b/crates/swc_css_ast/src/token.rs index 30e1a602e8fb..b22416269db4 100644 --- a/crates/swc_css_ast/src/token.rs +++ b/crates/swc_css_ast/src/token.rs @@ -4,6 +4,7 @@ use std::{ }; use is_macro::Is; +#[cfg(feature = "serde-impl")] use serde::{Deserialize, Serialize}; use swc_atoms::{Atom, JsWord}; use swc_common::{ast_node, util::take::Take, EqIgnoreSpan, Span}; @@ -24,7 +25,7 @@ impl Take for TokenAndSpan { } } -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Is, EqIgnoreSpan)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Is, EqIgnoreSpan)] #[cfg_attr( feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) @@ -37,29 +38,32 @@ impl Take for TokenAndSpan { deserialize = "__D: rkyv::de::SharedDeserializeRegistry" )) )] +#[cfg_attr(feature = "serde-impl", derive(Serialize, Deserialize))] pub enum NumberType { - #[serde(rename = "integer")] + #[cfg_attr(feature = "serde-impl", serde(rename = "integer"))] Integer, - #[serde(rename = "number")] + #[cfg_attr(feature = "serde-impl", serde(rename = "number"))] Number, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, EqIgnoreSpan)] +#[derive(Debug, Clone, PartialEq, EqIgnoreSpan)] #[cfg_attr( feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) )] +#[cfg_attr(feature = "serde-impl", derive(Serialize, Deserialize))] pub struct DimensionToken { pub value: f64, pub raw_value: Atom, #[cfg_attr(feature = "rkyv", with(swc_atoms::EncodeJsWord))] pub unit: JsWord, - #[serde(rename = "type")] + + #[cfg_attr(feature = "serde-impl", serde(rename = "type"))] pub type_flag: NumberType, pub raw_unit: Atom, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, EqIgnoreSpan)] +#[derive(Debug, Clone, PartialEq, EqIgnoreSpan)] #[cfg_attr( feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) @@ -72,6 +76,7 @@ pub struct DimensionToken { deserialize = "__D: rkyv::de::SharedDeserializeRegistry" )) )] +#[cfg_attr(feature = "serde-impl", derive(serde::Serialize, serde::Deserialize))] pub enum Token { Ident { #[cfg_attr(feature = "rkyv", with(swc_atoms::EncodeJsWord))] @@ -120,7 +125,7 @@ pub enum Token { Number { value: f64, raw: Atom, - #[serde(rename = "type")] + #[cfg_attr(feature = "serde-impl", serde(rename = "type"))] type_flag: NumberType, }, Percentage { diff --git a/crates/swc_css_parser/Cargo.toml b/crates/swc_css_parser/Cargo.toml index 1edf25e4b2d2..beb0a0809d86 100644 --- a/crates/swc_css_parser/Cargo.toml +++ b/crates/swc_css_parser/Cargo.toml @@ -28,9 +28,12 @@ swc_css_ast = { version = "0.134.13", path = "../swc_css_ast" } criterion = "0.3" serde_json = "1.0.66" +swc_css_ast = { version = "0.134.13", path = "../swc_css_ast", features = [ + "serde-impl", +] } swc_css_visit = { version = "0.133.13", path = "../swc_css_visit" } swc_node_base = { version = "0.5.8", path = "../swc_node_base" } -testing = { version = "0.31.42", path = "../testing" } +testing = { version = "0.31.42", path = "../testing" } [[bench]] harness = false diff --git a/crates/swc_ecma_ast/Cargo.toml b/crates/swc_ecma_ast/Cargo.toml index fd45300fad18..ec8a7f294f54 100644 --- a/crates/swc_ecma_ast/Cargo.toml +++ b/crates/swc_ecma_ast/Cargo.toml @@ -28,6 +28,7 @@ rkyv-bytecheck-impl = [ "swc_atoms/rkyv-bytecheck-impl", "swc_common/rkyv-bytecheck-impl", ] +serde-impl = ["serde"] [dependencies] arbitrary = { version = "1", optional = true, features = ["derive"] } @@ -40,12 +41,12 @@ rkyv = { package = "rkyv", version = "=0.7.37", optional = true } # cannot be merged. rkyv-latest = { package = "rkyv-test", version = "=0.7.38-test.2", optional = true } scoped-tls = "1.0.0" -serde = { version = "1.0.133", features = ["derive"] } +serde = { version = "1.0.133", features = ["derive"], optional = true } +unicode-id = "0.3" string_enum = { version = "0.3.4", path = "../string_enum" } swc_atoms = { version = "0.4.39", path = "../swc_atoms" } swc_common = { version = "0.29.39", path = "../swc_common" } -unicode-id = "0.3" [dev-dependencies] serde_json = "1" diff --git a/crates/swc_ecma_ast/src/class.rs b/crates/swc_ecma_ast/src/class.rs index 2b0f15810e72..975d48e9dd12 100644 --- a/crates/swc_ecma_ast/src/class.rs +++ b/crates/swc_ecma_ast/src/class.rs @@ -1,7 +1,6 @@ use is_macro::Is; #[cfg(feature = "rkyv-bytecheck-impl")] use rkyv_latest as rkyv; -use serde::{Deserialize, Serialize}; use swc_common::{ast_node, util::take::Take, EqIgnoreSpan, Span, DUMMY_SP}; use crate::{ @@ -23,26 +22,26 @@ use crate::{ pub struct Class { pub span: Span, - #[serde(default)] + #[cfg_attr(c, serde(default))] pub decorators: Vec, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub body: Vec, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub super_class: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_abstract: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_params: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub super_type_params: Option>, /// Typescript extension. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub implements: Vec, } @@ -101,44 +100,44 @@ impl Take for ClassMember { #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct ClassProp { - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub span: Span, pub key: PropName, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub value: Option>, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_static: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub decorators: Vec, /// Typescript extension. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub accessibility: Option, /// Typescript extension. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_abstract: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_optional: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_override: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub readonly: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub declare: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub definite: bool, } @@ -146,37 +145,37 @@ pub struct ClassProp { #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct PrivateProp { - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub span: Span, pub key: PrivateName, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub value: Option>, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_static: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub decorators: Vec, /// Typescript extension. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub accessibility: Option, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_optional: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_override: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub readonly: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub definite: bool, } @@ -186,7 +185,7 @@ macro_rules! method { #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct $name { - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub span: Span, pub key: $KEY, @@ -195,21 +194,21 @@ macro_rules! method { pub kind: MethodKind, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_static: bool, /// Typescript extension. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub accessibility: Option, /// Typescript extension. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_abstract: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_optional: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_override: bool, } }; @@ -228,13 +227,13 @@ pub struct Constructor { pub params: Vec, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub body: Option, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub accessibility: Option, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_optional: bool, } @@ -244,22 +243,23 @@ pub struct Constructor { pub struct Decorator { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, EqIgnoreSpan)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] #[cfg_attr( any(feature = "rkyv-impl", feature = "rkyv-bytecheck-impl"), derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) )] +#[cfg_attr(feature = "serde-impl", derive(serde::Serialize, serde::Deserialize))] pub enum MethodKind { - #[serde(rename = "method")] + #[cfg_attr(feature = "serde-impl", serde(rename = "method"))] Method, - #[serde(rename = "getter")] + #[cfg_attr(feature = "serde-impl", serde(rename = "getter"))] Getter, - #[serde(rename = "setter")] + #[cfg_attr(feature = "serde-impl", serde(rename = "setter"))] Setter, } @@ -311,25 +311,25 @@ impl Take for Key { #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct AutoAccessor { - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub span: Span, pub key: Key, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub value: Option>, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_static: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub decorators: Vec, /// Typescript extension. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub accessibility: Option, } diff --git a/crates/swc_ecma_ast/src/decl.rs b/crates/swc_ecma_ast/src/decl.rs index ffe101a034a1..a79a3cf4bd8f 100644 --- a/crates/swc_ecma_ast/src/decl.rs +++ b/crates/swc_ecma_ast/src/decl.rs @@ -52,13 +52,13 @@ impl Take for Decl { #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct FnDecl { - #[serde(rename = "identifier")] + #[cfg_attr(feature = "serde-impl", serde(rename = "identifier"))] pub ident: Ident, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub declare: bool, - #[serde(flatten)] + #[cfg_attr(feature = "serde-impl", serde(flatten))] #[span] pub function: Box, } @@ -77,13 +77,13 @@ impl Take for FnDecl { #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct ClassDecl { - #[serde(rename = "identifier")] + #[cfg_attr(feature = "serde-impl", serde(rename = "identifier"))] pub ident: Ident, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub declare: bool, - #[serde(flatten)] + #[cfg_attr(feature = "serde-impl", serde(flatten))] #[span] pub class: Box, } @@ -96,10 +96,10 @@ pub struct VarDecl { pub kind: VarDeclKind, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub declare: bool, - #[serde(rename = "declarations")] + #[cfg_attr(feature = "serde-impl", serde(rename = "declarations"))] pub decls: Vec, } @@ -134,15 +134,15 @@ pub enum VarDeclKind { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct VarDeclarator { pub span: Span, - #[serde(rename = "id")] + #[cfg_attr(feature = "serde-impl", serde(rename = "id"))] pub name: Pat, /// Initialization expression. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub init: Option>, /// Typescript only - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub definite: bool, } diff --git a/crates/swc_ecma_ast/src/expr.rs b/crates/swc_ecma_ast/src/expr.rs index a339e294094d..e90e15f3ec59 100644 --- a/crates/swc_ecma_ast/src/expr.rs +++ b/crates/swc_ecma_ast/src/expr.rs @@ -2,10 +2,11 @@ use is_macro::Is; #[cfg(feature = "rkyv-bytecheck-impl")] use rkyv_latest as rkyv; +#[cfg(feature = "serde-impl")] use serde::{ self, de::{self, MapAccess, Visitor}, - Deserialize, Deserializer, Serialize, + Deserialize, Deserializer, }; use string_enum::StringEnum; use swc_atoms::{js_word, Atom}; @@ -354,7 +355,7 @@ impl Take for ThisExpr { pub struct ArrayLit { pub span: Span, - #[serde(default, rename = "elements")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "elements"))] pub elems: Vec>, } @@ -374,7 +375,7 @@ impl Take for ArrayLit { pub struct ObjectLit { pub span: Span, - #[serde(default, rename = "properties")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "properties"))] pub props: Vec, } @@ -414,11 +415,11 @@ impl Take for PropOrSpread { #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct SpreadElement { - #[serde(rename = "spread")] + #[cfg_attr(feature = "serde-impl", serde(rename = "spread"))] #[span(lo)] pub dot3_token: Span, - #[serde(rename = "arguments")] + #[cfg_attr(feature = "serde-impl", serde(rename = "arguments"))] #[span(hi)] pub expr: Box, } @@ -438,10 +439,10 @@ impl Take for SpreadElement { pub struct UnaryExpr { pub span: Span, - #[serde(rename = "operator")] + #[cfg_attr(feature = "serde-impl", serde(rename = "operator"))] pub op: UnaryOp, - #[serde(rename = "argument")] + #[cfg_attr(feature = "serde-impl", serde(rename = "argument"))] pub arg: Box, } @@ -461,12 +462,12 @@ impl Take for UnaryExpr { pub struct UpdateExpr { pub span: Span, - #[serde(rename = "operator")] + #[cfg_attr(feature = "serde-impl", serde(rename = "operator"))] pub op: UpdateOp, pub prefix: bool, - #[serde(rename = "argument")] + #[cfg_attr(feature = "serde-impl", serde(rename = "argument"))] pub arg: Box, } @@ -487,7 +488,7 @@ impl Take for UpdateExpr { pub struct BinExpr { pub span: Span, - #[serde(rename = "operator")] + #[cfg_attr(feature = "serde-impl", serde(rename = "operator"))] pub op: BinaryOp, pub left: Box, @@ -511,10 +512,10 @@ impl Take for BinExpr { #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct FnExpr { - #[serde(default, rename = "identifier")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "identifier"))] pub ident: Option, - #[serde(flatten)] + #[cfg_attr(feature = "serde-impl", serde(flatten))] #[span] pub function: Box, } @@ -545,10 +546,10 @@ bridge_expr_from!(FnExpr, Box); #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct ClassExpr { - #[serde(default, rename = "identifier")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "identifier"))] pub ident: Option, - #[serde(flatten)] + #[cfg_attr(feature = "serde-impl", serde(flatten))] #[span] pub class: Box, } @@ -571,7 +572,7 @@ impl From> for ClassExpr { bridge_from!(ClassExpr, Box, Class); bridge_expr_from!(ClassExpr, Box); -#[derive(Spanned, Clone, Debug, PartialEq, Serialize)] +#[derive(Spanned, Clone, Debug, PartialEq)] #[cfg_attr( any(feature = "rkyv-impl", feature = "rkyv-bytecheck-impl"), derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) @@ -584,15 +585,16 @@ bridge_expr_from!(ClassExpr, Box); deserialize = "__D: rkyv::de::SharedDeserializeRegistry" )) )] -#[serde(tag = "type")] -#[serde(rename_all = "camelCase")] -#[serde(rename = "AssignmentExpression")] #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] +#[cfg_attr(feature = "serde-impl", derive(serde::Serialize))] +#[cfg_attr(feature = "serde-impl", serde(tag = "type"))] +#[cfg_attr(feature = "serde-impl", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "serde-impl", serde(rename = "AssignmentExpression"))] pub struct AssignExpr { pub span: Span, - #[serde(rename = "operator")] + #[cfg_attr(feature = "serde-impl", serde(rename = "operator"))] pub op: AssignOp, pub left: PatOrExpr, @@ -615,6 +617,7 @@ impl Take for AssignExpr { // to `PatOrExpr::Expr(Box)` when `op` is not `=`. // Same logic as parser: // https://github.com/swc-project/swc/blob/b87e3b0d4f46e6aea1ee7745f0bb3d129ef12b9c/crates/swc_ecma_parser/src/parser/pat.rs#L602-L610 +#[cfg(feature = "serde-impl")] impl<'de> Deserialize<'de> for AssignExpr { fn deserialize(deserializer: D) -> Result where @@ -702,10 +705,10 @@ impl<'de> Deserialize<'de> for AssignExpr { pub struct MemberExpr { pub span: Span, - #[serde(rename = "object")] + #[cfg_attr(feature = "serde-impl", serde(rename = "object"))] pub obj: Box, - #[serde(rename = "property")] + #[cfg_attr(feature = "serde-impl", serde(rename = "property"))] pub prop: MemberProp, } @@ -729,7 +732,7 @@ pub struct SuperPropExpr { pub obj: Super, - #[serde(rename = "property")] + #[cfg_attr(feature = "serde-impl", serde(rename = "property"))] pub prop: SuperProp, } @@ -773,10 +776,10 @@ pub struct CondExpr { pub test: Box, - #[serde(rename = "consequent")] + #[cfg_attr(feature = "serde-impl", serde(rename = "consequent"))] pub cons: Box, - #[serde(rename = "alternate")] + #[cfg_attr(feature = "serde-impl", serde(rename = "alternate"))] pub alt: Box, } @@ -799,10 +802,10 @@ pub struct CallExpr { pub callee: Callee, - #[serde(default, rename = "arguments")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "arguments"))] pub args: Vec, - #[serde(default, rename = "typeArguments")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeArguments"))] pub type_args: Option>, // pub type_params: Option, } @@ -826,10 +829,10 @@ pub struct NewExpr { pub callee: Box, - #[serde(default, rename = "arguments")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "arguments"))] pub args: Option>, - #[serde(default, rename = "typeArguments")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeArguments"))] pub type_args: Option>, // pub type_params: Option, } @@ -851,7 +854,7 @@ impl Take for NewExpr { pub struct SeqExpr { pub span: Span, - #[serde(rename = "expressions")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expressions"))] pub exprs: Vec>, } @@ -875,16 +878,16 @@ pub struct ArrowExpr { /// This is boxed to reduce the type size of [Expr]. pub body: Box, - #[serde(default, rename = "async")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "async"))] pub is_async: bool, - #[serde(default, rename = "generator")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "generator"))] pub is_generator: bool, - #[serde(default, rename = "typeParameters")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeParameters"))] pub type_params: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub return_type: Option>, } @@ -908,10 +911,10 @@ impl Take for ArrowExpr { pub struct YieldExpr { pub span: Span, - #[serde(default, rename = "argument")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "argument"))] pub arg: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub delegate: bool, } @@ -952,7 +955,7 @@ pub enum MetaPropKind { pub struct AwaitExpr { pub span: Span, - #[serde(rename = "argument")] + #[cfg_attr(feature = "serde-impl", serde(rename = "argument"))] pub arg: Box, } @@ -962,7 +965,7 @@ pub struct AwaitExpr { pub struct Tpl { pub span: Span, - #[serde(rename = "expressions")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expressions"))] pub exprs: Vec>, pub quasis: Vec, @@ -986,11 +989,11 @@ pub struct TaggedTpl { pub tag: Box, - #[serde(default, rename = "typeParameters")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeParameters"))] pub type_params: Option>, /// This is boxed to reduce the type size of [Expr]. - #[serde(rename = "template")] + #[cfg_attr(feature = "serde-impl", serde(rename = "template"))] pub tpl: Box, } @@ -1055,7 +1058,7 @@ impl<'a> arbitrary::Arbitrary<'a> for TplElement { pub struct ParenExpr { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, } impl Take for ParenExpr { @@ -1114,7 +1117,7 @@ impl Take for Import { } } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash, EqIgnoreSpan)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] #[cfg_attr( any(feature = "rkyv-impl", feature = "rkyv-bytecheck-impl"), @@ -1128,12 +1131,13 @@ impl Take for Import { deserialize = "__D: rkyv::de::SharedDeserializeRegistry" )) )] +#[cfg_attr(feature = "serde-impl", derive(serde::Serialize, serde::Deserialize))] pub struct ExprOrSpread { - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] #[cfg_attr(feature = "__rkyv", omit_bounds)] pub spread: Option, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] #[cfg_attr(feature = "__rkyv", omit_bounds)] pub expr: Box, } @@ -1400,10 +1404,10 @@ pub struct OptCall { pub callee: Box, - #[serde(default, rename = "arguments")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "arguments"))] pub args: Vec, - #[serde(default, rename = "typeArguments")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeArguments"))] pub type_args: Option>, // pub type_params: Option, } diff --git a/crates/swc_ecma_ast/src/function.rs b/crates/swc_ecma_ast/src/function.rs index 8d1aa52e0a54..2e2d3cf4b61c 100644 --- a/crates/swc_ecma_ast/src/function.rs +++ b/crates/swc_ecma_ast/src/function.rs @@ -15,26 +15,26 @@ use crate::{ pub struct Function { pub params: Vec, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub decorators: Vec, pub span: Span, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub body: Option, /// if it's a generator. - #[serde(default, rename = "generator")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "generator"))] pub is_generator: bool, /// if it's an async function. - #[serde(default, rename = "async")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "async"))] pub is_async: bool, - #[serde(default, rename = "typeParameters")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeParameters"))] pub type_params: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub return_type: Option>, } @@ -58,7 +58,7 @@ impl Take for Function { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct Param { pub span: Span, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub decorators: Vec, pub pat: Pat, } diff --git a/crates/swc_ecma_ast/src/ident.rs b/crates/swc_ecma_ast/src/ident.rs index b11609e611aa..bd87ec80a7f4 100644 --- a/crates/swc_ecma_ast/src/ident.rs +++ b/crates/swc_ecma_ast/src/ident.rs @@ -3,7 +3,6 @@ use std::fmt::Display; #[cfg(feature = "rkyv-bytecheck-impl")] use rkyv_latest as rkyv; use scoped_tls::scoped_thread_local; -use serde::{Deserialize, Serialize}; use swc_atoms::{js_word, JsWord}; use swc_common::{ ast_node, util::take::Take, BytePos, EqIgnoreSpan, Span, Spanned, SyntaxContext, DUMMY_SP, @@ -13,7 +12,7 @@ use unicode_id::UnicodeID; use crate::typescript::TsTypeAnn; /// Identifier used as a pattern. -#[derive(Spanned, Clone, Debug, PartialEq, Eq, Hash, EqIgnoreSpan, Serialize, Deserialize)] +#[derive(Spanned, Clone, Debug, PartialEq, Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] #[cfg_attr( any(feature = "rkyv-impl", feature = "rkyv-bytecheck-impl"), @@ -27,12 +26,13 @@ use crate::typescript::TsTypeAnn; deserialize = "__D: rkyv::de::SharedDeserializeRegistry" )) )] +#[cfg_attr(feature = "serde-impl", derive(serde::Serialize, serde::Deserialize))] pub struct BindingIdent { #[span] - #[serde(flatten)] + #[cfg_attr(feature = "serde-impl", serde(flatten))] #[cfg_attr(feature = "__rkyv", omit_bounds)] pub id: Ident, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] #[cfg_attr(feature = "__rkyv", omit_bounds)] pub type_ann: Option>, } @@ -114,7 +114,7 @@ bridge_from!(BindingIdent, Ident, Id); #[derive(Eq, Hash)] pub struct Ident { pub span: Span, - #[serde(rename = "value")] + #[cfg_attr(feature = "serde-impl", serde(rename = "value"))] #[cfg_attr( any(feature = "rkyv-impl", feature = "rkyv-bytecheck-impl"), with(swc_atoms::EncodeJsWord) @@ -122,7 +122,7 @@ pub struct Ident { pub sym: JsWord, /// TypeScript only. Used in case of an optional parameter. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub optional: bool, } diff --git a/crates/swc_ecma_ast/src/jsx.rs b/crates/swc_ecma_ast/src/jsx.rs index ab4c85ca69eb..cd94e4db1211 100644 --- a/crates/swc_ecma_ast/src/jsx.rs +++ b/crates/swc_ecma_ast/src/jsx.rs @@ -25,11 +25,11 @@ pub enum JSXObject { #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct JSXMemberExpr { - #[serde(rename = "object")] + #[cfg_attr(feature = "serde-impl", serde(rename = "object"))] #[span(lo)] pub obj: JSXObject, - #[serde(rename = "property")] + #[cfg_attr(feature = "serde-impl", serde(rename = "property"))] #[span(hi)] pub prop: Ident, } @@ -39,7 +39,7 @@ pub struct JSXMemberExpr { #[derive(Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct JSXNamespacedName { - #[serde(rename = "namespace")] + #[cfg_attr(feature = "serde-impl", serde(rename = "namespace"))] #[span(lo)] pub ns: Ident, #[span(hi)] @@ -58,7 +58,7 @@ pub struct JSXEmptyExpr { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct JSXExprContainer { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: JSXExpr, } @@ -78,7 +78,7 @@ pub enum JSXExpr { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct JSXSpreadChild { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, } @@ -108,15 +108,15 @@ pub struct JSXOpeningElement { pub span: Span, - #[serde(default, rename = "attributes")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "attributes"))] pub attrs: Vec, - #[serde(rename = "selfClosing")] + #[cfg_attr(feature = "serde-impl", serde(rename = "selfClosing"))] pub self_closing: bool, /// Note: This field's name is different from one from babel because it is /// misleading - #[serde(default, rename = "typeArguments")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeArguments"))] pub type_args: Option>, } @@ -262,7 +262,7 @@ pub struct JSXFragment { pub opening: JSXOpeningFragment, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub children: Vec, pub closing: JSXClosingFragment, diff --git a/crates/swc_ecma_ast/src/lib.rs b/crates/swc_ecma_ast/src/lib.rs index 7ed9b0c0a1d4..301c26afd774 100644 --- a/crates/swc_ecma_ast/src/lib.rs +++ b/crates/swc_ecma_ast/src/lib.rs @@ -12,6 +12,7 @@ #[cfg(all(feature = "rkyv-impl", feature = "rkyv-bytecheck-impl"))] compile_error!("Cannot enable bytechcked, non-bytechecked rkyv both"); +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use swc_common::{ast_node, EqIgnoreSpan, Span}; @@ -105,29 +106,32 @@ pub struct Invalid { pub span: Span, } -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialOrd, Ord, PartialEq, Eq, Hash)] +/// Note: This type implements `Serailize` and `Deserialize` if `serde` is +/// enabled, instead of requiring `serde-impl` feature. +#[derive(Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum EsVersion { - #[serde(rename = "es3")] + #[cfg_attr(feature = "serde", serde(rename = "es3"))] Es3, - #[serde(rename = "es5")] + #[cfg_attr(feature = "serde", serde(rename = "es5"))] Es5, - #[serde(rename = "es2015")] + #[cfg_attr(feature = "serde", serde(rename = "es2015"))] Es2015, - #[serde(rename = "es2016")] + #[cfg_attr(feature = "serde", serde(rename = "es2016"))] Es2016, - #[serde(rename = "es2017")] + #[cfg_attr(feature = "serde", serde(rename = "es2017"))] Es2017, - #[serde(rename = "es2018")] + #[cfg_attr(feature = "serde", serde(rename = "es2018"))] Es2018, - #[serde(rename = "es2019")] + #[cfg_attr(feature = "serde", serde(rename = "es2019"))] Es2019, - #[serde(rename = "es2020")] + #[cfg_attr(feature = "serde", serde(rename = "es2020"))] Es2020, - #[serde(rename = "es2021")] + #[cfg_attr(feature = "serde", serde(rename = "es2021"))] Es2021, - #[serde(rename = "es2022")] + #[cfg_attr(feature = "serde", serde(rename = "es2022"))] Es2022, - #[serde(rename = "esnext")] + #[cfg_attr(feature = "serde", serde(rename = "esnext"))] EsNext, } diff --git a/crates/swc_ecma_ast/src/lit.rs b/crates/swc_ecma_ast/src/lit.rs index 8cefaab9e492..c56a962471bb 100644 --- a/crates/swc_ecma_ast/src/lit.rs +++ b/crates/swc_ecma_ast/src/lit.rs @@ -293,10 +293,10 @@ impl Take for Null { pub struct Regex { pub span: Span, - #[serde(rename = "pattern")] + #[cfg_attr(feature = "serde-impl", serde(rename = "pattern"))] pub exp: Atom, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub flags: Atom, } diff --git a/crates/swc_ecma_ast/src/macros.rs b/crates/swc_ecma_ast/src/macros.rs index fe40e9dbb399..f5c3cc3a8e48 100644 --- a/crates/swc_ecma_ast/src/macros.rs +++ b/crates/swc_ecma_ast/src/macros.rs @@ -178,6 +178,7 @@ macro_rules! op { macro_rules! test_de { ($name:ident, $T:path, $s:literal) => { #[test] + #[cfg(feature = "serde-impl")] fn $name() { let _var: $T = ::serde_json::from_str(&$s).expect("failed to parse json"); } diff --git a/crates/swc_ecma_ast/src/module.rs b/crates/swc_ecma_ast/src/module.rs index 8a115e8253c8..6b941b503138 100644 --- a/crates/swc_ecma_ast/src/module.rs +++ b/crates/swc_ecma_ast/src/module.rs @@ -43,7 +43,7 @@ pub struct Module { pub body: Vec, - #[serde(default, rename = "interpreter")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "interpreter"))] pub shebang: Option, } @@ -78,7 +78,7 @@ pub struct Script { pub body: Vec, - #[serde(default, rename = "interpreter")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "interpreter"))] pub shebang: Option, } diff --git a/crates/swc_ecma_ast/src/module_decl.rs b/crates/swc_ecma_ast/src/module_decl.rs index cefe6fdb70de..2de89636369a 100644 --- a/crates/swc_ecma_ast/src/module_decl.rs +++ b/crates/swc_ecma_ast/src/module_decl.rs @@ -54,7 +54,7 @@ impl Take for ModuleDecl { pub struct ExportDefaultExpr { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, } @@ -64,7 +64,7 @@ pub struct ExportDefaultExpr { pub struct ExportDecl { pub span: Span, - #[serde(rename = "declaration")] + #[cfg_attr(feature = "serde-impl", serde(rename = "declaration"))] pub decl: Decl, } @@ -74,16 +74,16 @@ pub struct ExportDecl { pub struct ImportDecl { pub span: Span, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub specifiers: Vec, - #[serde(rename = "source")] + #[cfg_attr(feature = "serde-impl", serde(rename = "source"))] pub src: Box, - #[serde(default, rename = "typeOnly")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeOnly"))] pub type_only: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub asserts: Option>, } @@ -106,13 +106,13 @@ impl Take for ImportDecl { pub struct ExportAll { pub span: Span, - #[serde(rename = "source")] + #[cfg_attr(feature = "serde-impl", serde(rename = "source"))] pub src: Box, - #[serde(rename = "typeOnly")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeOnly"))] pub type_only: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub asserts: Option>, } @@ -137,13 +137,13 @@ pub struct NamedExport { pub specifiers: Vec, - #[serde(rename = "source")] + #[cfg_attr(feature = "serde-impl", serde(rename = "source"))] pub src: Option>, - #[serde(rename = "typeOnly")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeOnly"))] pub type_only: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub asserts: Option>, } @@ -224,10 +224,10 @@ pub struct ImportNamedSpecifier { pub local: Ident, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub imported: Option, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_type_only: bool, } @@ -272,10 +272,10 @@ pub struct ExportNamedSpecifier { /// `foo` in `export { foo as bar }` pub orig: ModuleExportName, /// `Some(bar)` in `export { foo as bar }` - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub exported: Option, /// `type` in `export { type foo as bar }` - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub is_type_only: bool, } diff --git a/crates/swc_ecma_ast/src/pat.rs b/crates/swc_ecma_ast/src/pat.rs index 74ecaa196321..a8647b02ef7a 100644 --- a/crates/swc_ecma_ast/src/pat.rs +++ b/crates/swc_ecma_ast/src/pat.rs @@ -82,14 +82,14 @@ pat_to_other!(RestPat); pub struct ArrayPat { pub span: Span, - #[serde(rename = "elements")] + #[cfg_attr(feature = "serde-impl", serde(rename = "elements"))] pub elems: Vec>, /// Only in an ambient context - #[serde(rename = "optional")] + #[cfg_attr(feature = "serde-impl", serde(rename = "optional"))] pub optional: bool, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, } @@ -99,14 +99,14 @@ pub struct ArrayPat { pub struct ObjectPat { pub span: Span, - #[serde(rename = "properties")] + #[cfg_attr(feature = "serde-impl", serde(rename = "properties"))] pub props: Vec, /// Only in an ambient context - #[serde(rename = "optional")] + #[cfg_attr(feature = "serde-impl", serde(rename = "optional"))] pub optional: bool, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, } @@ -120,7 +120,7 @@ pub struct AssignPat { pub right: Box, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, } @@ -131,13 +131,13 @@ pub struct AssignPat { pub struct RestPat { pub span: Span, - #[serde(rename = "rest")] + #[cfg_attr(feature = "serde-impl", serde(rename = "rest"))] pub dot3_token: Span, - #[serde(rename = "argument")] + #[cfg_attr(feature = "serde-impl", serde(rename = "argument"))] pub arg: Box, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, } @@ -174,6 +174,6 @@ pub struct AssignPatProp { pub span: Span, pub key: Ident, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub value: Option>, } diff --git a/crates/swc_ecma_ast/src/prop.rs b/crates/swc_ecma_ast/src/prop.rs index 214d93f6c81c..979027284f49 100644 --- a/crates/swc_ecma_ast/src/prop.rs +++ b/crates/swc_ecma_ast/src/prop.rs @@ -65,9 +65,9 @@ pub struct AssignProp { pub struct GetterProp { pub span: Span, pub key: PropName, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub body: Option, } #[ast_node("SetterProperty")] @@ -77,7 +77,7 @@ pub struct SetterProp { pub span: Span, pub key: PropName, pub param: Box, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub body: Option, } #[ast_node("MethodProperty")] @@ -86,7 +86,7 @@ pub struct SetterProp { pub struct MethodProp { pub key: PropName, - #[serde(flatten)] + #[cfg_attr(feature = "serde-impl", serde(flatten))] #[span] pub function: Box, } @@ -144,7 +144,7 @@ impl From for MemberProp { pub struct ComputedPropName { /// Span including `[` and `]`. pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, } diff --git a/crates/swc_ecma_ast/src/stmt.rs b/crates/swc_ecma_ast/src/stmt.rs index e043f101bf4e..2be0f25cb7d0 100644 --- a/crates/swc_ecma_ast/src/stmt.rs +++ b/crates/swc_ecma_ast/src/stmt.rs @@ -150,7 +150,7 @@ bridge_stmt_from!(Box, TryStmt); #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct ExprStmt { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, } @@ -174,7 +174,7 @@ pub struct DebuggerStmt { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct WithStmt { pub span: Span, - #[serde(rename = "object")] + #[cfg_attr(feature = "serde-impl", serde(rename = "object"))] pub obj: Box, pub body: Box, } @@ -184,7 +184,7 @@ pub struct WithStmt { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct ReturnStmt { pub span: Span, - #[serde(default, rename = "argument")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "argument"))] pub arg: Option>, } @@ -202,7 +202,7 @@ pub struct LabeledStmt { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct BreakStmt { pub span: Span, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub label: Option, } @@ -211,7 +211,7 @@ pub struct BreakStmt { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct ContinueStmt { pub span: Span, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub label: Option, } @@ -222,10 +222,10 @@ pub struct IfStmt { pub span: Span, pub test: Box, - #[serde(rename = "consequent")] + #[cfg_attr(feature = "serde-impl", serde(rename = "consequent"))] pub cons: Box, - #[serde(default, rename = "alternate")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "alternate"))] pub alt: Option>, } @@ -243,7 +243,7 @@ pub struct SwitchStmt { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct ThrowStmt { pub span: Span, - #[serde(rename = "argument")] + #[cfg_attr(feature = "serde-impl", serde(rename = "argument"))] pub arg: Box, } @@ -255,10 +255,10 @@ pub struct TryStmt { pub block: BlockStmt, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub handler: Option, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub finalizer: Option, } @@ -286,13 +286,13 @@ pub struct DoWhileStmt { pub struct ForStmt { pub span: Span, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub init: Option, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub test: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub update: Option>, pub body: Box, @@ -318,7 +318,7 @@ pub struct ForOfStmt { /// es2018 /// /// for-await-of statements, e.g., `for await (const x of xs) {` - #[serde(default, rename = "await")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "await"))] pub is_await: bool, pub left: VarDeclOrPat, pub right: Box, @@ -344,10 +344,10 @@ pub struct SwitchCase { pub span: Span, /// None for `default:` - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub test: Option>, - #[serde(rename = "consequent")] + #[cfg_attr(feature = "serde-impl", serde(rename = "consequent"))] pub cons: Vec, } @@ -370,7 +370,7 @@ pub struct CatchClause { /// /// The param is null if the catch binding is omitted. E.g., try { foo() } /// catch { bar() } - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub param: Option, pub body: BlockStmt, diff --git a/crates/swc_ecma_ast/src/typescript.rs b/crates/swc_ecma_ast/src/typescript.rs index c1386fc320f6..6ae86fb662a6 100644 --- a/crates/swc_ecma_ast/src/typescript.rs +++ b/crates/swc_ecma_ast/src/typescript.rs @@ -1,10 +1,13 @@ #![allow(clippy::vec_box)] #![allow(missing_copy_implementations)] + +#[cfg(feature = "serde-impl")] use std::fmt; use is_macro::Is; #[cfg(feature = "rkyv-bytecheck-impl")] use rkyv_latest as rkyv; +#[cfg(feature = "serde-impl")] use serde::{ de::{self, Unexpected, Visitor}, Deserialize, Deserializer, Serialize, @@ -28,7 +31,7 @@ use crate::{ #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsTypeAnn { pub span: Span, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, } @@ -37,7 +40,7 @@ pub struct TsTypeAnn { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsTypeParamDecl { pub span: Span, - #[serde(rename = "parameters")] + #[cfg_attr(feature = "serde-impl", serde(rename = "parameters"))] pub params: Vec, } @@ -48,19 +51,19 @@ pub struct TsTypeParam { pub span: Span, pub name: Ident, - #[serde(default, rename = "in")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "in"))] pub is_in: bool, - #[serde(default, rename = "out")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "out"))] pub is_out: bool, - #[serde(default, rename = "const")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "const"))] pub is_const: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub constraint: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub default: Option>, } @@ -77,12 +80,12 @@ pub struct TsTypeParamInstantiation { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsParamProp { pub span: Span, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub decorators: Vec, /// At least one of `accessibility` or `readonly` must be set. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub accessibility: Option, - #[serde(rename = "override")] + #[cfg_attr(feature = "serde-impl", serde(rename = "override"))] pub is_override: bool, pub readonly: bool, pub param: TsParamPropParam, @@ -157,9 +160,9 @@ pub enum TsTypeElement { pub struct TsCallSignatureDecl { pub span: Span, pub params: Vec, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_params: Option>, } @@ -169,9 +172,9 @@ pub struct TsCallSignatureDecl { pub struct TsConstructSignatureDecl { pub span: Span, pub params: Vec, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_params: Option>, } @@ -184,12 +187,12 @@ pub struct TsPropertySignature { pub key: Box, pub computed: bool, pub optional: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub init: Option>, pub params: Vec, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_params: Option>, } @@ -202,7 +205,7 @@ pub struct TsGetterSignature { pub key: Box, pub computed: bool, pub optional: bool, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, } @@ -228,9 +231,9 @@ pub struct TsMethodSignature { pub computed: bool, pub optional: bool, pub params: Vec, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_ann: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_params: Option>, } @@ -239,11 +242,11 @@ pub struct TsMethodSignature { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsIndexSignature { pub params: Vec, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, pub readonly: bool, - #[serde(rename = "static")] + #[cfg_attr(feature = "serde-impl", serde(rename = "static"))] pub is_static: bool, pub span: Span, } @@ -391,50 +394,51 @@ pub struct TsKeywordType { pub kind: TsKeywordTypeKind, } -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, EqIgnoreSpan)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] #[cfg_attr( any(feature = "rkyv-impl", feature = "rkyv-bytecheck-impl"), derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) )] +#[cfg_attr(feature = "serde-impl", derive(serde::Serialize, serde::Deserialize))] pub enum TsKeywordTypeKind { - #[serde(rename = "any")] + #[cfg_attr(feature = "serde-impl", serde(rename = "any"))] TsAnyKeyword, - #[serde(rename = "unknown")] + #[cfg_attr(feature = "serde-impl", serde(rename = "unknown"))] TsUnknownKeyword, - #[serde(rename = "number")] + #[cfg_attr(feature = "serde-impl", serde(rename = "number"))] TsNumberKeyword, - #[serde(rename = "object")] + #[cfg_attr(feature = "serde-impl", serde(rename = "object"))] TsObjectKeyword, - #[serde(rename = "boolean")] + #[cfg_attr(feature = "serde-impl", serde(rename = "boolean"))] TsBooleanKeyword, - #[serde(rename = "bigint")] + #[cfg_attr(feature = "serde-impl", serde(rename = "bigint"))] TsBigIntKeyword, - #[serde(rename = "string")] + #[cfg_attr(feature = "serde-impl", serde(rename = "string"))] TsStringKeyword, - #[serde(rename = "symbol")] + #[cfg_attr(feature = "serde-impl", serde(rename = "symbol"))] TsSymbolKeyword, - #[serde(rename = "void")] + #[cfg_attr(feature = "serde-impl", serde(rename = "void"))] TsVoidKeyword, - #[serde(rename = "undefined")] + #[cfg_attr(feature = "serde-impl", serde(rename = "undefined"))] TsUndefinedKeyword, - #[serde(rename = "null")] + #[cfg_attr(feature = "serde-impl", serde(rename = "null"))] TsNullKeyword, - #[serde(rename = "never")] + #[cfg_attr(feature = "serde-impl", serde(rename = "never"))] TsNeverKeyword, - #[serde(rename = "intrinsic")] + #[cfg_attr(feature = "serde-impl", serde(rename = "intrinsic"))] TsIntrinsicKeyword, } @@ -469,9 +473,9 @@ pub struct TsFnType { pub span: Span, pub params: Vec, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_params: Option>, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, } @@ -481,9 +485,9 @@ pub struct TsFnType { pub struct TsConstructorType { pub span: Span, pub params: Vec, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_params: Option>, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, pub is_abstract: bool, } @@ -494,7 +498,7 @@ pub struct TsConstructorType { pub struct TsTypeRef { pub span: Span, pub type_name: TsEntityName, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_params: Option>, } @@ -505,7 +509,7 @@ pub struct TsTypePredicate { pub span: Span, pub asserts: bool, pub param_name: TsThisTypeOrIdent, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Option>, } @@ -528,7 +532,7 @@ pub enum TsThisTypeOrIdent { pub struct TsTypeQuery { pub span: Span, pub expr_name: TsTypeQueryExpr, - #[serde(default, rename = "typeArguments")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeArguments"))] pub type_args: Option>, } @@ -548,10 +552,10 @@ pub enum TsTypeQueryExpr { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsImportType { pub span: Span, - #[serde(rename = "argument")] + #[cfg_attr(feature = "serde-impl", serde(rename = "argument"))] pub arg: Str, pub qualifier: Option, - #[serde(rename = "typeArguments")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeArguments"))] pub type_args: Option>, } @@ -594,7 +598,7 @@ pub struct TsTupleElement { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsOptionalType { pub span: Span, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, } @@ -603,7 +607,7 @@ pub struct TsOptionalType { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsRestType { pub span: Span, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, } @@ -658,7 +662,7 @@ pub struct TsInferType { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsParenthesizedType { pub span: Span, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, } @@ -668,7 +672,7 @@ pub struct TsParenthesizedType { pub struct TsTypeOperator { pub span: Span, pub op: TsTypeOperatorOp, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, } @@ -693,7 +697,7 @@ pub enum TsTypeOperatorOp { pub struct TsIndexedAccessType { pub span: Span, pub readonly: bool, - #[serde(rename = "objectType")] + #[cfg_attr(feature = "serde-impl", serde(rename = "objectType"))] pub obj_type: Box, pub index_type: Box, } @@ -710,6 +714,7 @@ pub enum TruePlusMinus { Minus, } +#[cfg(feature = "serde-impl")] impl Serialize for TruePlusMinus { fn serialize(&self, serializer: S) -> Result where @@ -723,6 +728,7 @@ impl Serialize for TruePlusMinus { } } +#[cfg(feature = "serde-impl")] impl<'de> Deserialize<'de> for TruePlusMinus { fn deserialize(deserializer: D) -> Result where @@ -770,14 +776,14 @@ impl<'de> Deserialize<'de> for TruePlusMinus { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsMappedType { pub span: Span, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub readonly: Option, pub type_param: TsTypeParam, - #[serde(default, rename = "nameType")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "nameType"))] pub name_type: Option>, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub optional: Option, - #[serde(default, rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))] pub type_ann: Option>, } @@ -786,7 +792,7 @@ pub struct TsMappedType { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsLitType { pub span: Span, - #[serde(rename = "literal")] + #[cfg_attr(feature = "serde-impl", serde(rename = "literal"))] pub lit: TsLit, } @@ -832,7 +838,7 @@ pub struct TsInterfaceDecl { pub span: Span, pub id: Ident, pub declare: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_params: Option>, pub extends: Vec, pub body: TsInterfaceBody, @@ -851,9 +857,9 @@ pub struct TsInterfaceBody { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsExprWithTypeArgs { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, - #[serde(default, rename = "typeArguments")] + #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeArguments"))] pub type_args: Option>, } @@ -864,9 +870,9 @@ pub struct TsTypeAliasDecl { pub span: Span, pub declare: bool, pub id: Ident, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub type_params: Option>, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, } @@ -887,7 +893,7 @@ pub struct TsEnumDecl { pub struct TsEnumMember { pub span: Span, pub id: TsEnumMemberId, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub init: Option>, } @@ -922,7 +928,7 @@ pub struct TsModuleDecl { /// In TypeScript, this is only available through`node.flags`. pub global: bool, pub id: TsModuleName, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub body: Option, } @@ -999,7 +1005,7 @@ pub enum TsModuleRef { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsExternalModuleRef { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Str, } @@ -1011,7 +1017,7 @@ pub struct TsExternalModuleRef { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsExportAssignment { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, } @@ -1032,9 +1038,9 @@ pub struct TsNamespaceExportDecl { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsAsExpr { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, } @@ -1043,9 +1049,9 @@ pub struct TsAsExpr { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsTypeAssertion { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, } @@ -1054,7 +1060,7 @@ pub struct TsTypeAssertion { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsNonNullExpr { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, } @@ -1063,24 +1069,25 @@ pub struct TsNonNullExpr { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsSatisfiesExpr { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, - #[serde(rename = "typeAnnotation")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeAnnotation"))] pub type_ann: Box, } -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Eq, Hash, EqIgnoreSpan)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, EqIgnoreSpan)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] #[cfg_attr( any(feature = "rkyv-impl", feature = "rkyv-bytecheck-impl"), derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) )] +#[cfg_attr(feature = "serde-impl", derive(serde::Serialize, serde::Deserialize))] pub enum Accessibility { - #[serde(rename = "public")] + #[cfg_attr(feature = "serde-impl", serde(rename = "public"))] Public, - #[serde(rename = "protected")] + #[cfg_attr(feature = "serde-impl", serde(rename = "protected"))] Protected, - #[serde(rename = "private")] + #[cfg_attr(feature = "serde-impl", serde(rename = "private"))] Private, } @@ -1089,7 +1096,7 @@ pub enum Accessibility { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsConstAssertion { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, } @@ -1098,8 +1105,8 @@ pub struct TsConstAssertion { #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct TsInstantiation { pub span: Span, - #[serde(rename = "expression")] + #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))] pub expr: Box, - #[serde(rename = "typeArguments")] + #[cfg_attr(feature = "serde-impl", serde(rename = "typeArguments"))] pub type_args: Box, } diff --git a/crates/swc_ecma_codegen/Cargo.toml b/crates/swc_ecma_codegen/Cargo.toml index 71888bbaeef8..689cc08f5d28 100644 --- a/crates/swc_ecma_codegen/Cargo.toml +++ b/crates/swc_ecma_codegen/Cargo.toml @@ -9,6 +9,10 @@ name = "swc_ecma_codegen" repository = "https://github.com/swc-project/swc.git" version = "0.135.11" +[features] +# This does not enable serde for ast nodes. +serde-impl = ["swc_ecma_ast/serde"] + [lib] bench = false diff --git a/crates/swc_ecma_codegen/src/config.rs b/crates/swc_ecma_codegen/src/config.rs index 76274a2367c2..204d77a041fd 100644 --- a/crates/swc_ecma_codegen/src/config.rs +++ b/crates/swc_ecma_codegen/src/config.rs @@ -1,8 +1,10 @@ +#[cfg(feature = "serde-impl")] use serde::{Deserialize, Serialize}; use swc_ecma_ast::EsVersion; -#[derive(Debug, Clone, Copy, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] +#[derive(Debug, Clone, Copy)] +#[cfg_attr(feature = "serde-impl", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde-impl", serde(rename_all = "camelCase"))] pub struct Config { /// The target runtime environment. /// @@ -13,22 +15,22 @@ pub struct Config { /// e.g. `const foo = 1;` with [EsVersion::Es3] will emitted as `const foo = /// 1` without verification. /// This is because it's not a concern of the code generator. - #[serde(default = "EsVersion::latest")] + #[cfg_attr(feature = "serde-impl", serde(default = "EsVersion::latest"))] pub target: EsVersion, /// Forces the code generator to use only ascii characters. /// /// This is useful for environments that do not support unicode. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub ascii_only: bool, - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub minify: bool, /// If true, the code generator will emit the lastest semicolon. /// /// Defaults to `false`. - #[serde(default)] + #[cfg_attr(feature = "serde-impl", serde(default))] pub omit_last_semi: bool, } diff --git a/crates/swc_ecma_lints/Cargo.toml b/crates/swc_ecma_lints/Cargo.toml index cc9e6567c940..2d458cc33140 100644 --- a/crates/swc_ecma_lints/Cargo.toml +++ b/crates/swc_ecma_lints/Cargo.toml @@ -26,7 +26,9 @@ swc_common = { version = "0.29.39", path = "../swc_common", features = [ "concurrent", ] } swc_config = { version = "0.1.5", path = "../swc_config" } -swc_ecma_ast = { version = "0.100.5", path = "../swc_ecma_ast" } +swc_ecma_ast = { version = "0.100.5", path = "../swc_ecma_ast", features = [ + "serde", +] } swc_ecma_utils = { version = "0.113.11", path = "../swc_ecma_utils" } swc_ecma_visit = { version = "0.86.6", path = "../swc_ecma_visit" } diff --git a/crates/swc_ecma_minifier/Cargo.toml b/crates/swc_ecma_minifier/Cargo.toml index ddc415905afd..b9416072be8b 100644 --- a/crates/swc_ecma_minifier/Cargo.toml +++ b/crates/swc_ecma_minifier/Cargo.toml @@ -26,7 +26,11 @@ concurrent = [ "indexmap/rayon", ] debug = ["backtrace", "swc_ecma_transforms_optimization/debug"] -trace-ast = [] +default = ["serde-impl"] +# Implement serialize/deserialize for more types +extra-serde = ["swc_ecma_ast/serde-impl", "serde-impl"] +serde-impl = [] +trace-ast = [] [dependencies] ahash = "0.7.6" @@ -47,19 +51,21 @@ serde = { version = "1.0.118", features = ["derive"] } serde_json = "1.0.61" tracing = "0.1.32" -swc_atoms = { version = "0.4.39", path = "../swc_atoms" } -swc_cached = { version = "0.3.15", path = "../swc_cached" } -swc_common = { version = "0.29.39", path = "../swc_common" } -swc_config = { version = "0.1.5", path = "../swc_config" } -swc_ecma_ast = { version = "0.100.5", path = "../swc_ecma_ast" } -swc_ecma_codegen = { version = "0.135.11", path = "../swc_ecma_codegen" } -swc_ecma_parser = { version = "0.130.10", path = "../swc_ecma_parser" } -swc_ecma_transforms_base = { version = "0.122.16", path = "../swc_ecma_transforms_base" } +swc_atoms = { version = "0.4.39", path = "../swc_atoms" } +swc_cached = { version = "0.3.15", path = "../swc_cached" } +swc_common = { version = "0.29.39", path = "../swc_common" } +swc_config = { version = "0.1.5", path = "../swc_config" } +swc_ecma_ast = { version = "0.100.5", path = "../swc_ecma_ast", features = [ + "serde", +] } +swc_ecma_codegen = { version = "0.135.11", path = "../swc_ecma_codegen" } +swc_ecma_parser = { version = "0.130.10", path = "../swc_ecma_parser" } +swc_ecma_transforms_base = { version = "0.122.16", path = "../swc_ecma_transforms_base" } swc_ecma_transforms_optimization = { version = "0.181.21", path = "../swc_ecma_transforms_optimization" } -swc_ecma_usage_analyzer = { version = "0.9.12", path = "../swc_ecma_usage_analyzer" } -swc_ecma_utils = { version = "0.113.11", path = "../swc_ecma_utils" } -swc_ecma_visit = { version = "0.86.6", path = "../swc_ecma_visit" } -swc_timer = { version = "0.17.42", path = "../swc_timer" } +swc_ecma_usage_analyzer = { version = "0.9.12", path = "../swc_ecma_usage_analyzer" } +swc_ecma_utils = { version = "0.113.11", path = "../swc_ecma_utils" } +swc_ecma_visit = { version = "0.86.6", path = "../swc_ecma_visit" } +swc_timer = { version = "0.17.42", path = "../swc_timer" } [dev-dependencies] ansi_term = "0.12.1" diff --git a/crates/swc_ecma_minifier/src/eval.rs b/crates/swc_ecma_minifier/src/eval.rs index 1451b9e8cad2..bd76f82ac7c3 100644 --- a/crates/swc_ecma_minifier/src/eval.rs +++ b/crates/swc_ecma_minifier/src/eval.rs @@ -12,6 +12,7 @@ use swc_ecma_visit::VisitMutWith; use crate::{ compress::{compressor, pure_optimizer, PureOptimizerConfig}, mode::Mode, + option::CompressOptions, }; pub struct Evaluator { @@ -78,7 +79,10 @@ impl Evaluator { self.module.visit_mut_with(&mut compressor( &Default::default(), marks, - &serde_json::from_str("{ \"hoist_props\": true }").unwrap(), + &CompressOptions { + hoist_props: true, + ..Default::default() + }, &data, )); } @@ -231,7 +235,7 @@ impl Evaluator { { e.visit_mut_with(&mut pure_optimizer( - &serde_json::from_str("{}").unwrap(), + &Default::default(), None, self.marks, PureOptimizerConfig { diff --git a/crates/swc_ecma_minifier/src/option/mod.rs b/crates/swc_ecma_minifier/src/option/mod.rs index e1db7cce4b45..4296691f7a54 100644 --- a/crates/swc_ecma_minifier/src/option/mod.rs +++ b/crates/swc_ecma_minifier/src/option/mod.rs @@ -1,3 +1,5 @@ +#![cfg_attr(not(feature = "extra-serde"), allow(unused))] + use serde::{Deserialize, Serialize}; use swc_atoms::JsWord; use swc_cached::regex::CachedRegex; @@ -28,19 +30,20 @@ pub struct ExtraOptions { pub top_level_mark: Mark, } -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -#[serde(deny_unknown_fields)] +#[derive(Debug, Default, Clone)] +#[cfg_attr(feature = "extra-serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "extra-serde", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "extra-serde", serde(deny_unknown_fields))] pub struct MinifyOptions { - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub rename: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub compress: Option, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub mangle: Option, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub wrap: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub enclose: bool, } @@ -108,94 +111,95 @@ impl Default for PureGetterOption { } /// https://terser.org/docs/api-reference.html#compress-options -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -#[serde(deny_unknown_fields)] +#[derive(Debug, Clone)] +#[cfg_attr(feature = "extra-serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "extra-serde", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "extra-serde", serde(deny_unknown_fields))] pub struct CompressOptions { - #[serde(default)] - #[serde(alias = "arguments")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "arguments"))] pub arguments: bool, - #[serde(default = "true_by_default")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] pub arrows: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "booleans")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "booleans"))] pub bools: bool, - #[serde(default)] - #[serde(alias = "booleans_as_integers")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "booleans_as_integers"))] pub bools_as_ints: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "collapse_vars")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "collapse_vars"))] pub collapse_vars: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "comparisons")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "comparisons"))] pub comparisons: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "computed_props")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "computed_props"))] pub computed_props: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "conditionals")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "conditionals"))] pub conditionals: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "dead_code")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "dead_code"))] pub dead_code: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "directives")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "directives"))] pub directives: bool, - #[serde(default)] - #[serde(alias = "drop_console")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "drop_console"))] pub drop_console: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "drop_debugger")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "drop_debugger"))] pub drop_debugger: bool, - #[serde(default = "default_ecma")] + #[cfg_attr(feature = "extra-serde", serde(default = "default_ecma"))] pub ecma: EsVersion, - #[serde(default = "true_by_default")] - #[serde(alias = "evaluate")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "evaluate"))] pub evaluate: bool, /// Should we simplify expressions? - #[serde(default)] - #[serde(alias = "expression")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "expression"))] pub expr: bool, /// All expressions should have dummy span. Use [swc_ecma_utils::drop_span] /// to remove spans. - #[serde(skip)] - #[serde(alias = "global_defs")] + #[cfg_attr(feature = "extra-serde", serde(skip))] + #[cfg_attr(feature = "extra-serde", serde(alias = "global_defs"))] pub global_defs: AHashMap, Box>, - #[serde(default)] - #[serde(alias = "hoist_funs")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "hoist_funs"))] pub hoist_fns: bool, - #[serde(default)] - #[serde(alias = "hoist_props")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "hoist_props"))] pub hoist_props: bool, - #[serde(default)] - #[serde(alias = "hoist_vars")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "hoist_vars"))] pub hoist_vars: bool, /// No effect. - #[serde(default)] - #[serde(alias = "ie8")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "ie8"))] pub ie8: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "if_return")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "if_return"))] pub if_return: bool, /// @@ -204,133 +208,133 @@ pub struct CompressOptions { /// - `2`: inline functions with arguments /// - `3`: inline functions with arguments and variables - #[serde(default = "three_by_default")] - #[serde(alias = "inline")] + #[cfg_attr(feature = "extra-serde", serde(default = "three_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "inline"))] pub inline: u8, - #[serde(default = "true_by_default")] - #[serde(alias = "join_vars")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "join_vars"))] pub join_vars: bool, - #[serde(default)] - #[serde(alias = "keep_classnames")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "keep_classnames"))] pub keep_classnames: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "keep_fargs")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "keep_fargs"))] pub keep_fargs: bool, - #[serde(default)] - #[serde(alias = "keep_fnames")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "keep_fnames"))] pub keep_fnames: bool, - #[serde(default)] - #[serde(alias = "keep_infinity")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "keep_infinity"))] pub keep_infinity: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "loops")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "loops"))] pub loops: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub module: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "negate_iife")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "negate_iife"))] pub negate_iife: bool, /// If this value is zero, the minifier will repeat work until the ast node /// is settled. - #[serde(default = "default_passes")] - #[serde(alias = "passes")] + #[cfg_attr(feature = "extra-serde", serde(default = "default_passes"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "passes"))] pub passes: usize, - #[serde(default = "true_by_default")] - #[serde(alias = "properties")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "properties"))] pub props: bool, - #[serde(default)] - #[serde(alias = "pure_getters")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "pure_getters"))] pub pure_getters: PureGetterOption, - #[serde(default)] - #[serde(alias = "pure_funcs")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "pure_funcs"))] pub pure_funcs: Vec>, - #[serde(default = "true_by_default")] - #[serde(alias = "reduce_funcs")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "reduce_funcs"))] pub reduce_fns: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "reduce_vars")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "reduce_vars"))] pub reduce_vars: bool, - #[serde(default = "three_by_default")] - #[serde(alias = "sequences")] + #[cfg_attr(feature = "extra-serde", serde(default = "three_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "sequences"))] pub sequences: u8, - #[serde(default = "true_by_default")] - #[serde(alias = "side_effects")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "side_effects"))] pub side_effects: bool, - #[serde(default = "true_by_default")] - #[serde(alias = "switches")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "switches"))] pub switches: bool, /// Top level symbols to retain. - #[serde(default)] - #[serde(alias = "top_retain")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "top_retain"))] pub top_retain: Vec, - #[serde(default)] - #[serde(alias = "toplevel")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "toplevel"))] pub top_level: Option, - #[serde(default = "true_by_default")] - #[serde(alias = "typeofs")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] + #[cfg_attr(feature = "extra-serde", serde(alias = "typeofs"))] pub typeofs: bool, - #[serde(default)] - #[serde(rename = "unsafe")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(rename = "unsafe"))] pub unsafe_passes: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub unsafe_arrows: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub unsafe_comps: bool, - #[serde(default)] - #[serde(alias = "unsafe_Function")] + #[cfg_attr(feature = "extra-serde", serde(default))] + #[cfg_attr(feature = "extra-serde", serde(alias = "unsafe_Function"))] pub unsafe_function: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub unsafe_math: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub unsafe_symbols: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub unsafe_methods: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub unsafe_proto: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub unsafe_regexp: bool, - #[serde(default)] + #[cfg_attr(feature = "extra-serde", serde(default))] pub unsafe_undefined: bool, - #[serde(default = "true_by_default")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] pub unused: bool, - #[serde(default = "true_by_default")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] pub const_to_let: bool, /// If you modified globals, set this to false. /// /// Defaults to true. - #[serde(default = "true_by_default")] + #[cfg_attr(feature = "extra-serde", serde(default = "true_by_default"))] pub pristine_globals: bool, } @@ -365,6 +369,66 @@ const fn default_ecma() -> EsVersion { EsVersion::Es5 } -impl_default!(MinifyOptions); impl_default!(MangleOptions); -impl_default!(CompressOptions); + +impl Default for CompressOptions { + fn default() -> Self { + Self { + arguments: false, + arrows: true, + bools: true, + bools_as_ints: false, + collapse_vars: true, + comparisons: true, + computed_props: true, + conditionals: true, + dead_code: true, + directives: true, + drop_console: false, + drop_debugger: true, + ecma: default_ecma(), + evaluate: true, + expr: false, + global_defs: Default::default(), + hoist_fns: false, + hoist_props: false, + hoist_vars: false, + ie8: false, + if_return: true, + inline: 3, + join_vars: true, + keep_classnames: false, + keep_fargs: true, + keep_fnames: false, + keep_infinity: false, + loops: true, + module: false, + negate_iife: true, + passes: default_passes(), + props: true, + pure_getters: Default::default(), + pure_funcs: Default::default(), + reduce_fns: true, + reduce_vars: false, + sequences: 3, + side_effects: true, + switches: true, + top_retain: Default::default(), + top_level: Default::default(), + typeofs: true, + unsafe_passes: false, + unsafe_arrows: false, + unsafe_comps: false, + unsafe_function: false, + unsafe_math: false, + unsafe_methods: false, + unsafe_proto: false, + unsafe_regexp: false, + unsafe_symbols: false, + unsafe_undefined: false, + unused: true, + const_to_let: true, + pristine_globals: true, + } + } +} diff --git a/crates/swc_ecma_parser/Cargo.toml b/crates/swc_ecma_parser/Cargo.toml index 179997fe69e4..ef185cbf13a0 100644 --- a/crates/swc_ecma_parser/Cargo.toml +++ b/crates/swc_ecma_parser/Cargo.toml @@ -47,9 +47,12 @@ pretty_assertions = "1.1" serde_json = "1" walkdir = "2" +swc_ecma_ast = { version = "0.100.5", path = "../swc_ecma_ast", features = [ + "serde-impl", +] } swc_ecma_visit = { version = "0.86.6", path = "../swc_ecma_visit" } -swc_node_base = { version = "0.5.8", path = "../swc_node_base" } -testing = { version = "0.31.42", path = "../testing" } +swc_node_base = { version = "0.5.8", path = "../swc_node_base" } +testing = { version = "0.31.42", path = "../testing" } [[example]] name = "lexer" diff --git a/crates/swc_ecma_preset_env/Cargo.toml b/crates/swc_ecma_preset_env/Cargo.toml index 3169973f79cf..3d8d52cd8413 100644 --- a/crates/swc_ecma_preset_env/Cargo.toml +++ b/crates/swc_ecma_preset_env/Cargo.toml @@ -11,6 +11,10 @@ version = "0.189.21" [lib] bench = false +[features] +default = ["serde-impl"] +serde-impl = ["serde"] + [dependencies] ahash = "0.7.4" anyhow = "1" @@ -18,7 +22,7 @@ dashmap = "5.1.0" indexmap = "1.6.1" once_cell = "1.10.0" semver = { version = "1.0.4", features = ["serde"] } -serde = { version = "1", features = ["derive"] } +serde = { version = "1", features = ["derive"], optional = true } serde_json = "1" st-map = "0.1.2" diff --git a/crates/swc_ecma_transforms_react/Cargo.toml b/crates/swc_ecma_transforms_react/Cargo.toml index 32531d11f9b1..9081750b0cba 100644 --- a/crates/swc_ecma_transforms_react/Cargo.toml +++ b/crates/swc_ecma_transforms_react/Cargo.toml @@ -14,6 +14,8 @@ bench = false [features] concurrent = ["rayon"] +default = ["serde-impl"] +serde-impl = ["serde"] [dependencies] ahash = "0.7.4" @@ -23,7 +25,7 @@ indexmap = "1.6.1" once_cell = "1.10.0" rayon = { version = "1.5.1", optional = true } regex = "1.4.2" -serde = { version = "1.0.118", features = ["derive"] } +serde = { version = "1.0.118", features = ["derive"], optional = true } sha-1 = "=0.10.0" string_enum = { version = "0.3.4", path = "../string_enum" } diff --git a/crates/swc_estree_ast/Cargo.toml b/crates/swc_estree_ast/Cargo.toml index 4d0b454dd94b..8f1738a01eab 100644 --- a/crates/swc_estree_ast/Cargo.toml +++ b/crates/swc_estree_ast/Cargo.toml @@ -17,8 +17,12 @@ version = "0.19.39" [lib] bench = false +[features] +default = ["serde-impl"] +serde-impl = ["serde"] + [dependencies] -serde = { version = "1", features = ["derive"] } +serde = { version = "1", features = ["derive"], optional = true } serde_json = "1" better_scoped_tls = { version = "0.1.0", path = "../better_scoped_tls" } diff --git a/crates/swc_estree_ast/src/common.rs b/crates/swc_estree_ast/src/common.rs index b4c5f0eed121..876a5c414a67 100644 --- a/crates/swc_estree_ast/src/common.rs +++ b/crates/swc_estree_ast/src/common.rs @@ -36,8 +36,9 @@ impl Loc { } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "camelCase")] +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "serde-impl", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "serde-impl", serde(rename_all = "camelCase"))] pub struct BaseNode { #[serde(default, skip_serializing_if = "Vec::is_empty")] pub leading_comments: Vec, diff --git a/crates/swc_html_ast/Cargo.toml b/crates/swc_html_ast/Cargo.toml index b704bea5016f..460c121ecc1f 100644 --- a/crates/swc_html_ast/Cargo.toml +++ b/crates/swc_html_ast/Cargo.toml @@ -18,12 +18,13 @@ bench = false __rkyv = [] rkyv-bytecheck-impl = [] rkyv-impl = ["__rkyv", "rkyv", "swc_atoms/rkyv-impl", "swc_common/rkyv-impl"] +serde-impl = ["serde"] [dependencies] bytecheck = { version = "0.6.9", optional = true } is-macro = "0.2.0" rkyv = { version = "=0.7.37", optional = true } -serde = { version = "1.0.127", features = ["derive"] } +serde = { version = "1.0.127", features = ["derive"], optional = true } string_enum = { version = "0.3.4", path = "../string_enum/" } swc_atoms = { version = "0.4.39", path = "../swc_atoms" } diff --git a/crates/swc_html_ast/src/token.rs b/crates/swc_html_ast/src/token.rs index 8ede9888645e..934c8e7e7231 100644 --- a/crates/swc_html_ast/src/token.rs +++ b/crates/swc_html_ast/src/token.rs @@ -20,7 +20,7 @@ pub struct AttributeToken { pub raw_value: Option, } -#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, EqIgnoreSpan)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, EqIgnoreSpan)] #[cfg_attr( feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) @@ -33,12 +33,13 @@ pub struct AttributeToken { deserialize = "__D: rkyv::de::SharedDeserializeRegistry" )) )] +#[cfg_attr(feature = "serde-impl", derive(serde::Serialize, serde::Deserialize))] pub enum Raw { Same, Atom(Atom), } -#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, EqIgnoreSpan)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, EqIgnoreSpan)] #[cfg_attr( feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) @@ -51,6 +52,7 @@ pub enum Raw { deserialize = "__D: rkyv::de::SharedDeserializeRegistry" )) )] +#[cfg_attr(feature = "serde-impl", derive(serde::Serialize, serde::Deserialize))] pub enum Token { Doctype { #[cfg_attr(feature = "rkyv", with(swc_atoms::EncodeJsWord))] diff --git a/crates/swc_html_minifier/Cargo.toml b/crates/swc_html_minifier/Cargo.toml index 31359754f5f2..0abdf3914845 100644 --- a/crates/swc_html_minifier/Cargo.toml +++ b/crates/swc_html_minifier/Cargo.toml @@ -20,24 +20,28 @@ once_cell = "1.10.0" serde = { version = "1.0.118", features = ["derive"] } serde_json = "1.0.61" -swc_atoms = { version = "0.4.39", path = "../swc_atoms" } -swc_cached = { version = "0.3.15", path = "../swc_cached" } -swc_common = { version = "0.29.39", path = "../swc_common" } -swc_css_ast = { version = "0.134.13", path = "../swc_css_ast" } -swc_css_codegen = { version = "0.144.17", path = "../swc_css_codegen" } -swc_css_minifier = { version = "0.109.18", path = "../swc_css_minifier" } -swc_css_parser = { version = "0.143.14", path = "../swc_css_parser" } -swc_ecma_ast = { version = "0.100.5", path = "../swc_ecma_ast" } -swc_ecma_codegen = { version = "0.135.11", path = "../swc_ecma_codegen" } -swc_ecma_minifier = { version = "0.175.23", path = "../swc_ecma_minifier" } -swc_ecma_parser = { version = "0.130.10", path = "../swc_ecma_parser" } +swc_atoms = { version = "0.4.39", path = "../swc_atoms" } +swc_cached = { version = "0.3.15", path = "../swc_cached" } +swc_common = { version = "0.29.39", path = "../swc_common" } +swc_css_ast = { version = "0.134.13", path = "../swc_css_ast" } +swc_css_codegen = { version = "0.144.17", path = "../swc_css_codegen" } +swc_css_minifier = { version = "0.109.18", path = "../swc_css_minifier" } +swc_css_parser = { version = "0.143.14", path = "../swc_css_parser" } +swc_ecma_ast = { version = "0.100.5", path = "../swc_ecma_ast" } +swc_ecma_codegen = { version = "0.135.11", path = "../swc_ecma_codegen", features = [ + "serde-impl", +] } +swc_ecma_minifier = { version = "0.175.23", path = "../swc_ecma_minifier", features = [ + "extra-serde", +] } +swc_ecma_parser = { version = "0.130.10", path = "../swc_ecma_parser" } swc_ecma_transforms_base = { version = "0.122.16", path = "../swc_ecma_transforms_base" } -swc_ecma_visit = { version = "0.86.6", path = "../swc_ecma_visit" } -swc_html_ast = { version = "0.28.32", path = "../swc_html_ast" } -swc_html_codegen = { version = "0.37.45", path = "../swc_html_codegen" } -swc_html_parser = { version = "0.34.44", path = "../swc_html_parser" } -swc_html_utils = { version = "0.14.40", path = "../swc_html_utils" } -swc_html_visit = { version = "0.28.32", path = "../swc_html_visit" } +swc_ecma_visit = { version = "0.86.6", path = "../swc_ecma_visit" } +swc_html_ast = { version = "0.28.32", path = "../swc_html_ast" } +swc_html_codegen = { version = "0.37.45", path = "../swc_html_codegen" } +swc_html_parser = { version = "0.34.44", path = "../swc_html_parser" } +swc_html_utils = { version = "0.14.40", path = "../swc_html_utils" } +swc_html_visit = { version = "0.28.32", path = "../swc_html_visit" } [dev-dependencies] criterion = "0.3" diff --git a/crates/swc_html_parser/Cargo.toml b/crates/swc_html_parser/Cargo.toml index 9e0cb2d44a23..370ccc7f8ef7 100644 --- a/crates/swc_html_parser/Cargo.toml +++ b/crates/swc_html_parser/Cargo.toml @@ -29,9 +29,12 @@ criterion = "0.3" serde = "1.0.127" serde_json = "1.0.66" +swc_html_ast = { version = "0.28.32", path = "../swc_html_ast", features = [ + "serde-impl", +] } swc_html_visit = { version = "0.28.32", path = "../swc_html_visit" } -swc_node_base = { version = "0.5.8", path = "../swc_node_base" } -testing = { version = "0.31.42", path = "../testing" } +swc_node_base = { version = "0.5.8", path = "../swc_node_base" } +testing = { version = "0.31.42", path = "../testing" } [[bench]] harness = false diff --git a/crates/swc_node_bundler/Cargo.toml b/crates/swc_node_bundler/Cargo.toml index 396b0f0693cc..2934e02391f1 100644 --- a/crates/swc_node_bundler/Cargo.toml +++ b/crates/swc_node_bundler/Cargo.toml @@ -13,9 +13,10 @@ version = "0.42.27" bench = false [features] -default = ["swc_v1"] -swc_v1 = [] -swc_v2 = [] +default = ["swc_v1"] +serde-impl = ["serde"] +swc_v1 = ["serde-impl"] +swc_v2 = ["serde-impl"] [dependencies] anyhow = "1" @@ -23,7 +24,7 @@ dashmap = "5.1.0" is-macro = "0.2.0" once_cell = "1.10.0" regex = "1" -serde = { version = "1", features = ["derive"] } +serde = { version = "1", features = ["derive"], optional = true } serde_json = "1" tracing = "0.1.32" diff --git a/crates/swc_xml_ast/Cargo.toml b/crates/swc_xml_ast/Cargo.toml index 55540d0e2fa0..55b33b8fd4ce 100644 --- a/crates/swc_xml_ast/Cargo.toml +++ b/crates/swc_xml_ast/Cargo.toml @@ -14,9 +14,12 @@ version = "0.7.22" [lib] bench = false +[features] +serde-impl = ["serde"] + [dependencies] is-macro = "0.2.0" -serde = { version = "1.0.127", features = ["derive"] } +serde = { version = "1.0.127", features = ["derive"], optional = true } string_enum = { version = "0.3.4", path = "../string_enum/" } swc_atoms = { version = "0.4.39", path = "../swc_atoms" } diff --git a/crates/swc_xml_ast/src/token.rs b/crates/swc_xml_ast/src/token.rs index 148b553c303f..ad21e512ad5b 100644 --- a/crates/swc_xml_ast/src/token.rs +++ b/crates/swc_xml_ast/src/token.rs @@ -1,3 +1,4 @@ +#[cfg(feature = "serde-impl")] use serde::{Deserialize, Serialize}; use swc_atoms::JsWord; use swc_common::{ast_node, EqIgnoreSpan, Span}; @@ -9,9 +10,8 @@ pub struct TokenAndSpan { pub token: Token, } -#[derive( - Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, EqIgnoreSpan, -)] +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, EqIgnoreSpan)] +#[cfg_attr(feature = "serde-impl", derive(Serialize, Deserialize))] pub struct AttributeToken { pub span: Span, pub name: JsWord, @@ -20,7 +20,8 @@ pub struct AttributeToken { pub raw_value: Option, } -#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, EqIgnoreSpan)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, EqIgnoreSpan)] +#[cfg_attr(feature = "serde-impl", derive(Serialize, Deserialize))] pub enum Token { Doctype { // Name diff --git a/crates/swc_xml_parser/Cargo.toml b/crates/swc_xml_parser/Cargo.toml index 7d7bb98ea96c..4f8913dbdd46 100644 --- a/crates/swc_xml_parser/Cargo.toml +++ b/crates/swc_xml_parser/Cargo.toml @@ -27,5 +27,8 @@ swc_xml_ast = { version = "0.7.22", path = "../swc_xml_ast" } serde = "1.0.127" serde_json = "1.0.66" +swc_xml_ast = { version = "0.7.22", path = "../swc_xml_ast", features = [ + "serde-impl", +] } swc_xml_visit = { version = "0.7.22", path = "../swc_xml_visit" } -testing = { version = "0.31.42", path = "../testing" } +testing = { version = "0.31.42", path = "../testing" }