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 engine;
40pub mod ast;
41pub mod parser;
42pub mod transformer;
43pub mod js_bridge;
44pub mod plugin_loader;
45pub mod source_map;
46pub mod error;
47pub mod test_integration;
48pub mod tailwind_processor;
49pub mod purger;
50pub mod autoprefixer;
51pub mod import_processor;
52pub mod css_optimizer;
53pub mod enhanced_plugin_loader;
54pub mod advanced_features;
55
56// Re-export main types
57pub use engine::{PostCSSEngine, PostCSSConfig, ProcessedCSS};
58pub use ast::{CSSNode, CSSRule, CSSDeclaration, CSSAtRule};
59pub use parser::{CSSParser, ParseOptions};
60pub use transformer::{CSSTransformer, TransformOptions};
61pub use js_bridge::{JSBridge, JSRuntime};
62pub use plugin_loader::{PluginLoader, PluginConfig, PluginResult};
63pub use source_map::{SourceMapGenerator, SourceMap};
64pub use error::{PostCSSError, Result};
65pub use tailwind_processor::{TailwindProcessor, TailwindConfig, ProcessingResult};
66pub use purger::{CSSPurger, PurgeConfig, PurgeResult, PurgeOptions};
67pub use autoprefixer::{Autoprefixer, AutoprefixerConfig, PrefixResult, PrefixOptions, PrefixStatistics};
68pub use import_processor::{ImportProcessor, ImportConfig, ImportResult, ImportOptions, ImportStatistics};
69pub use css_optimizer::{CSSOptimizer, OptimizationConfig, OptimizationResult, OptimizationMetrics};
70pub use enhanced_plugin_loader::{EnhancedPluginLoader, PluginInstance, PluginMetrics};
71pub use advanced_features::{CSSLinter, LinterConfig, LintResult, AdvancedSourceMapGenerator, PostCSSPerformanceMonitor, PostCSSDevTools};
72
73/// Version information
74pub const VERSION: &str = env!("CARGO_PKG_VERSION");
75
76/// Default configuration for PostCSS processing
77pub fn default_config() -> PostCSSConfig {
78    PostCSSConfig::default()
79}
80
81/// Create a new PostCSS engine with default configuration
82pub fn new_engine() -> Result<PostCSSEngine> {
83    PostCSSEngine::new(PostCSSConfig::default())
84}
85
86/// Process CSS with PostCSS using default configuration
87pub async fn process_css(input: &str) -> Result<ProcessedCSS> {
88    let engine = new_engine()?;
89    engine.process_css(input).await
90}
91
92#[cfg(test)]
93mod tests {
94    use super::*;
95
96    #[test]
97    fn test_version_constant() {
98        assert!(!VERSION.is_empty());
99        assert!(VERSION.chars().any(|c| c.is_ascii_digit()));
100    }
101
102    #[test]
103    fn test_default_config() {
104        let config = default_config();
105        assert!(config.plugins.is_empty());
106        assert!(config.source_map);
107    }
108
109    #[tokio::test]
110    async fn test_process_css() {
111        let input = ".test { color: red; }";
112        let result = process_css(input).await;
113        assert!(result.is_ok());
114        
115        let css = result.unwrap();
116        assert!(css.css.contains(".test"));
117        assert!(css.css.contains("color: red"));
118    }
119}