diff --git a/Cargo.lock b/Cargo.lock index 5842d278..25e7d918 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -696,6 +696,7 @@ version = "1.0.0-alpha.35" dependencies = [ "proc-macro2", "quote", + "syn", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1e0a9f9d..3f379d28 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,15 +27,16 @@ path = "src/lib.rs" crate-type = ["rlib"] [features] -default = ["bundler", "grid"] +default = ["bundler", "grid", "nodejs"] browserslist = ["browserslist-rs"] bundler = ["dashmap", "rayon"] cli = ["clap", "serde_json", "browserslist", "jemallocator"] grid = [] -serde = ["smallvec/serde", "cssparser/serde"] +nodejs = ["dep:serde"] +serde = ["dep:serde", "smallvec/serde", "cssparser/serde"] [dependencies] -serde = { version = "1.0.123", features = ["derive"] } +serde = { version = "1.0.123", features = ["derive"], optional = true } cssparser = "0.29.1" parcel_selectors = { version = "0.24.9", path = "./selectors" } itertools = "0.10.1" diff --git a/node/Cargo.toml b/node/Cargo.toml index 33efefe9..534dc350 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -12,7 +12,7 @@ crate-type = ["cdylib"] serde = { version = "1.0.123", features = ["derive"] } serde_bytes = "0.11.5" cssparser = "0.29.1" -lightningcss = { path = "../" } +lightningcss = { path = "../", features = ["nodejs"] } parcel_sourcemap = { version = "2.1.1", features = ["json"] } [target.'cfg(target_os = "macos")'.dependencies] diff --git a/selectors/parser.rs b/selectors/parser.rs index be30a248..f3ef2e84 100644 --- a/selectors/parser.rs +++ b/selectors/parser.rs @@ -2709,7 +2709,7 @@ pub mod tests { use super::*; use crate::builder::SelectorFlags; use crate::parser; - use cssparser::{serialize_identifier, Parser as CssParser, ParserInput, ToCss, serialize_string}; + use cssparser::{serialize_identifier, serialize_string, Parser as CssParser, ParserInput, ToCss}; use std::collections::HashMap; use std::fmt; diff --git a/src/bundler.rs b/src/bundler.rs index 4d1470bf..4be9841a 100644 --- a/src/bundler.rs +++ b/src/bundler.rs @@ -52,7 +52,6 @@ use cssparser::AtRuleParser; use dashmap::DashMap; use parcel_sourcemap::SourceMap; use rayon::prelude::*; -use serde::Serialize; use std::{ collections::HashSet, fs, @@ -144,7 +143,8 @@ impl Drop for FileProvider { } /// An error that could occur during bundling. -#[derive(Debug, Serialize)] +#[derive(Debug)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(serde::Serialize))] pub enum BundleErrorKind<'i, T: std::error::Error> { /// A parser error occurred. ParserError(ParserError<'i>), @@ -155,7 +155,7 @@ pub enum BundleErrorKind<'i, T: std::error::Error> { /// Unsupported media query boolean logic was encountered. UnsupportedMediaBooleanLogic, /// A custom resolver error. - ResolverError(#[serde(skip)] T), + ResolverError(#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(skip))] T), } impl<'i, T: std::error::Error> From>> for Error> { diff --git a/src/css_modules.rs b/src/css_modules.rs index 073babf0..f93d0b9b 100644 --- a/src/css_modules.rs +++ b/src/css_modules.rs @@ -14,6 +14,7 @@ use crate::selector::SelectorList; use data_encoding::{Encoding, Specification}; use lazy_static::lazy_static; use pathdiff::diff_paths; +#[cfg(any(feature = "serde", feature = "nodejs"))] use serde::Serialize; use smallvec::{smallvec, SmallVec}; use std::borrow::Cow; @@ -164,8 +165,9 @@ pub enum Segment<'i> { /// A referenced name within a CSS module, e.g. via the `composes` property. /// /// See [CssModuleExport](CssModuleExport). -#[derive(PartialEq, Debug, Clone, Serialize)] -#[serde(tag = "type", rename_all = "lowercase")] +#[derive(PartialEq, Debug, Clone)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize))] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(tag = "type", rename_all = "lowercase"))] pub enum CssModuleReference { /// A local reference. Local { @@ -187,8 +189,9 @@ pub enum CssModuleReference { } /// An exported value from a CSS module. -#[derive(PartialEq, Debug, Clone, Serialize)] -#[serde(rename_all = "camelCase")] +#[derive(PartialEq, Debug, Clone)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize))] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(rename_all = "camelCase"))] pub struct CssModuleExport { /// The local (compiled) name for this export. pub name: String, diff --git a/src/dependencies.rs b/src/dependencies.rs index af32687d..b131415e 100644 --- a/src/dependencies.rs +++ b/src/dependencies.rs @@ -15,6 +15,7 @@ use crate::traits::ToCss; use crate::values::url::Url; use crate::visitor::Visit; use cssparser::SourceLocation; +#[cfg(any(feature = "serde", feature = "nodejs"))] use serde::Serialize; /// Options for `analyze_dependencies` in `PrinterOptions`. @@ -25,8 +26,9 @@ pub struct DependencyOptions { } /// A dependency. -#[derive(Serialize, Debug)] -#[serde(tag = "type", rename_all = "lowercase")] +#[derive(Debug)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize))] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(tag = "type", rename_all = "lowercase"))] pub enum Dependency { /// An `@import` dependency. Import(ImportDependency), @@ -35,7 +37,8 @@ pub enum Dependency { } /// An `@import` dependency. -#[derive(Serialize, Debug)] +#[derive(Debug)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize))] pub struct ImportDependency { /// The url to import. pub url: String, @@ -87,7 +90,8 @@ impl ImportDependency { } /// A `url()` dependency. -#[derive(Serialize, Debug)] +#[derive(Debug)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize))] pub struct UrlDependency { /// The url of the dependency. pub url: String, @@ -110,8 +114,9 @@ impl UrlDependency { } /// Represents the range of source code where a dependency was found. -#[derive(Serialize, Debug)] -#[serde(rename_all = "camelCase")] +#[derive(Debug)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize))] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(rename_all = "camelCase"))] pub struct SourceRange { /// The filename in which the dependency was found. pub file_path: String, @@ -122,8 +127,9 @@ pub struct SourceRange { } /// A line and column position within a source file. -#[derive(Serialize, Debug, Clone, Copy, PartialEq, Visit)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[derive(Debug, Clone, Copy, PartialEq, Visit)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(serde::Serialize))] +#[cfg_attr(any(feature = "serde"), derive(serde::Deserialize))] pub struct Location { /// The line number, starting from 1. pub line: u32, diff --git a/src/error.rs b/src/error.rs index ecd9c9fd..52c184e6 100644 --- a/src/error.rs +++ b/src/error.rs @@ -5,12 +5,14 @@ use crate::rules::Location; use crate::values::string::CowArcStr; use cssparser::{BasicParseErrorKind, ParseError, ParseErrorKind}; use parcel_selectors::parser::SelectorParseErrorKind; +#[cfg(any(feature = "serde", feature = "nodejs"))] use serde::Serialize; use std::fmt; /// An error with a source location. -#[derive(Debug, PartialEq, Clone, Serialize)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[derive(Debug, PartialEq, Clone)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(serde::Serialize))] +#[cfg_attr(any(feature = "serde"), derive(serde::Deserialize))] pub struct Error { /// The type of error that occurred. pub kind: T, @@ -31,8 +33,9 @@ impl fmt::Display for Error { impl std::error::Error for Error {} /// A line and column location within a source file. -#[derive(Debug, PartialEq, Clone, Serialize)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[derive(Debug, PartialEq, Clone)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(serde::Serialize))] +#[cfg_attr(any(feature = "serde"), derive(serde::Deserialize))] pub struct ErrorLocation { /// The filename in which the error occurred. pub filename: String, @@ -60,8 +63,9 @@ impl fmt::Display for ErrorLocation { } /// A parser error. -#[derive(Debug, PartialEq, Serialize, Clone)] -#[serde(tag = "type", content = "value")] +#[derive(Debug, PartialEq, Clone)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize))] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(tag = "type", content = "value"))] pub enum ParserError<'i> { /// An at rule body was invalid. AtRuleBodyInvalid, @@ -90,7 +94,7 @@ pub enum ParserError<'i> { /// A `@namespace` rule was encountered after any rules besides `@charset`, `@import`, or `@layer`. UnexpectedNamespaceRule, /// An unexpected token was encountered. - UnexpectedToken(#[serde(skip)] Token<'i>), + UnexpectedToken(#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(skip))] Token<'i>), /// Maximum nesting depth was reached. MaximumNestingDepth, } @@ -164,23 +168,24 @@ impl<'i> ParserError<'i> { } /// A selector parsing error. -#[derive(Debug, PartialEq, Serialize, Clone)] -#[serde(tag = "type", content = "value")] +#[derive(Debug, PartialEq, Clone)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize))] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(tag = "type", content = "value"))] pub enum SelectorError<'i> { /// An unexpected token was found in an attribute selector. - BadValueInAttr(#[serde(skip)] Token<'i>), + BadValueInAttr(#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(skip))] Token<'i>), /// An unexpected token was found in a class selector. - ClassNeedsIdent(#[serde(skip)] Token<'i>), + ClassNeedsIdent(#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(skip))] Token<'i>), /// A dangling combinator was found. DanglingCombinator, /// An empty selector. EmptySelector, /// A `|` was expected in an attribute selector. - ExpectedBarInAttr(#[serde(skip)] Token<'i>), + ExpectedBarInAttr(#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(skip))] Token<'i>), /// A namespace was expected. ExpectedNamespace(CowArcStr<'i>), /// An unexpected token was encountered in a namespace. - ExplicitNamespaceUnexpectedToken(#[serde(skip)] Token<'i>), + ExplicitNamespaceUnexpectedToken(#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(skip))] Token<'i>), /// An invalid pseudo class was encountered after a pseudo element. InvalidPseudoClassAfterPseudoElement, /// An invalid pseudo class was encountered after a `-webkit-scrollbar` pseudo element. @@ -188,7 +193,7 @@ pub enum SelectorError<'i> { /// A `-webkit-scrollbar` state was encountered before a `-webkit-scrollbar` pseudo element. InvalidPseudoClassBeforeWebKitScrollbar, /// Invalid qualified name in attribute selector. - InvalidQualNameInAttr(#[serde(skip)] Token<'i>), + InvalidQualNameInAttr(#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(skip))] Token<'i>), /// The current token is not allowed in this state. InvalidState, /// The selector is required to have the `&` nesting selector at the start. @@ -196,13 +201,13 @@ pub enum SelectorError<'i> { /// The selector is missing a `&` nesting selector. MissingNestingSelector, /// No qualified name in attribute selector. - NoQualifiedNameInAttributeSelector(#[serde(skip)] Token<'i>), + NoQualifiedNameInAttributeSelector(#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(skip))] Token<'i>), /// An Invalid token was encountered in a pseudo element. - PseudoElementExpectedIdent(#[serde(skip)] Token<'i>), + PseudoElementExpectedIdent(#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(skip))] Token<'i>), /// An unexpected identifier was encountered. UnexpectedIdent(CowArcStr<'i>), /// An unexpected token was encountered inside an attribute selector. - UnexpectedTokenInAttributeSelector(#[serde(skip)] Token<'i>), + UnexpectedTokenInAttributeSelector(#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(skip))] Token<'i>), /// An unsupported pseudo class or pseudo element was encountered. UnsupportedPseudoClassOrElement(CowArcStr<'i>), } @@ -291,8 +296,9 @@ impl std::error::Error for ErrorWithLocation {} pub(crate) type MinifyError = ErrorWithLocation; /// A transformation error. -#[derive(Debug, PartialEq, Serialize)] -#[serde(tag = "type")] +#[derive(Debug, PartialEq)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize))] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(tag = "type"))] pub enum MinifyErrorKind { /// A circular `@custom-media` rule was detected. CircularCustomMedia { @@ -337,8 +343,9 @@ impl MinifyErrorKind { pub type PrinterError = Error; /// A printer error type. -#[derive(Debug, PartialEq, Serialize)] -#[serde(tag = "type")] +#[derive(Debug, PartialEq)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize))] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), serde(tag = "type"))] pub enum PrinterErrorKind { /// An ambiguous relative `url()` was encountered in a custom property declaration. AmbiguousUrlInCustomProperty { diff --git a/src/rules/mod.rs b/src/rules/mod.rs index 85e16dde..01298f6b 100644 --- a/src/rules/mod.rs +++ b/src/rules/mod.rs @@ -85,7 +85,6 @@ use media::MediaRule; use namespace::NamespaceRule; use nesting::NestingRule; use page::PageRule; -use serde::Serialize; use std::collections::{HashMap, HashSet}; use style::StyleRule; use supports::SupportsRule; @@ -108,7 +107,8 @@ pub(crate) struct StyleContext<'a, 'i, T> { } /// A source location. -#[derive(PartialEq, Eq, Debug, Clone, Copy, Serialize)] +#[derive(PartialEq, Eq, Debug, Clone, Copy)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(serde::Serialize))] #[cfg_attr(feature = "serde", derive(serde::Deserialize))] pub struct Location { /// The index of the source file within the source map. diff --git a/src/targets.rs b/src/targets.rs index c87c92e1..9ca4507d 100644 --- a/src/targets.rs +++ b/src/targets.rs @@ -1,7 +1,8 @@ //! Browser target options. // This file is autogenerated by build-prefixes.js. DO NOT EDIT! -use serde::{Deserialize, Serialize}; +#[cfg(any(feature = "serde", feature = "nodejs"))] +use serde::{Serialize, Deserialize}; /// Browser versions to compile CSS for. /// @@ -20,7 +21,8 @@ use serde::{Deserialize, Serialize}; /// ..Browsers::default() /// }; /// ``` -#[derive(Serialize, Debug, Deserialize, Clone, Copy, Default)] +#[derive(Debug, Clone, Copy, Default)] +#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(Serialize, Deserialize))] #[allow(missing_docs)] pub struct Browsers { pub android: Option, diff --git a/src/values/string.rs b/src/values/string.rs index d97dde70..104c544a 100644 --- a/src/values/string.rs +++ b/src/values/string.rs @@ -5,6 +5,7 @@ use crate::visitor::{Visit, VisitTypes, Visitor}; use cssparser::{serialize_string, CowRcStr}; #[cfg(feature = "serde")] use serde::{Deserialize, Deserializer}; +#[cfg(any(feature = "serde", feature = "nodejs"))] use serde::{Serialize, Serializer}; use std::borrow::Borrow; use std::cmp; @@ -219,6 +220,7 @@ impl<'a> fmt::Debug for CowArcStr<'a> { } } +#[cfg(any(feature = "nodejs", feature = "serde"))] impl<'a> Serialize for CowArcStr<'a> { fn serialize(&self, serializer: S) -> Result { self.as_ref().serialize(serializer)