tailwind_rs_postcss/
lib.rs

1//! # tailwind-rs-postcss
2//!
3//! PostCSS integration for Tailwind-RS Core, providing advanced CSS processing
4//! capabilities with plugin ecosystem compatibility.
5//!
6//! This crate provides the foundation for PostCSS integration, enabling:
7//! - Advanced CSS processing with AST manipulation
8//! - Plugin ecosystem compatibility (NPM plugins)
9//! - Source map generation
10//! - Performance optimization
11//!
12//! ## Features
13//!
14//! - **PostCSS Engine**: Full PostCSS integration with Rust bindings
15//! - **Plugin System**: Support for NPM plugins and native Rust plugins
16//! - **AST Processing**: Advanced CSS AST parsing and manipulation
17//! - **Source Maps**: Complete source map generation and support
18//! - **Performance**: Optimized for large-scale CSS processing
19//!
20//! ## Example
21//!
22//! ```rust
23//! use tailwind_rs_postcss::*;
24//!
25//! #[tokio::main]
26//! async fn main() -> Result<()> {
27//!     let engine = PostCSSEngine::new(PostCSSConfig::default())?;
28//!     
29//!     let input_css = "@tailwind base; @tailwind components; @tailwind utilities;";
30//!     let result = engine.process_css(input_css).await?;
31//!     
32//!     println!("Generated CSS: {}", result.css);
33//!     println!("Source map: {:?}", result.source_map);
34//!     
35//!     Ok(())
36//! }
37//! ```
38
39pub mod advanced_features;
40pub mod ast;
41pub mod autoprefixer;
42pub mod css_optimizer;
43pub mod engine;
44pub mod enhanced_plugin_loader;
45pub mod error;
46pub mod import_processor;
47pub mod js_bridge;
48pub mod parser;
49pub mod plugin_loader;
50pub mod purger;
51pub mod source_map;
52pub mod tailwind_processor;
53pub mod test_integration;
54pub mod transformer;
55
56// Re-export main types
57pub use advanced_features::{
58    AdvancedSourceMapGenerator, CSSLinter, LintResult, LinterConfig, PostCSSDevTools,
59    PostCSSPerformanceMonitor,
60};
61pub use ast::{CSSAtRule, CSSDeclaration, CSSNode, CSSRule};
62pub use autoprefixer::{
63    Autoprefixer, AutoprefixerConfig, PrefixOptions, PrefixResult, PrefixStatistics,
64};
65pub use css_optimizer::{
66    CSSOptimizer, OptimizationConfig, OptimizationMetrics, OptimizationResult,
67};
68pub use engine::{PostCSSConfig, PostCSSEngine, ProcessedCSS};
69pub use enhanced_plugin_loader::{EnhancedPluginLoader, PluginInstance, PluginMetrics};
70pub use error::{PostCSSError, Result};
71pub use import_processor::{
72    ImportConfig, ImportOptions, ImportProcessor, ImportResult, ImportStatistics,
73};
74pub use js_bridge::{JSBridge, JSRuntime};
75pub use parser::{CSSParser, ParseOptions};
76pub use plugin_loader::{PluginConfig, PluginLoader, PluginResult};
77pub use purger::{CSSPurger, PurgeConfig, PurgeOptions, PurgeResult};
78pub use source_map::{SourceMap, SourceMapGenerator};
79pub use tailwind_processor::{ProcessingResult, TailwindConfig, TailwindProcessor};
80pub use transformer::{CSSTransformer, TransformOptions};
81
82/// Version information
83pub const VERSION: &str = env!("CARGO_PKG_VERSION");
84
85/// Default configuration for PostCSS processing
86pub fn default_config() -> PostCSSConfig {
87    PostCSSConfig::default()
88}
89
90/// Create a new PostCSS engine with default configuration
91pub fn new_engine() -> Result<PostCSSEngine> {
92    PostCSSEngine::new(PostCSSConfig::default())
93}
94
95/// Process CSS with PostCSS using default configuration
96pub async fn process_css(input: &str) -> Result<ProcessedCSS> {
97    let engine = new_engine()?;
98    engine.process_css(input).await
99}
100
101#[cfg(test)]
102mod tests {
103    use super::*;
104
105    #[test]
106    fn test_version_constant() {
107        assert!(!VERSION.is_empty());
108        assert!(VERSION.chars().any(|c| c.is_ascii_digit()));
109    }
110
111    #[test]
112    fn test_default_config() {
113        let config = default_config();
114        assert!(config.plugins.is_empty());
115        assert!(config.source_map);
116    }
117
118    #[tokio::test]
119    async fn test_process_css() {
120        let input = ".test { color: red; }";
121        let result = process_css(input).await;
122        assert!(result.is_ok());
123
124        let css = result.unwrap();
125        assert!(css.css.contains(".test"));
126        assert!(css.css.contains("color: red"));
127    }
128}