jsxrs 0.1.4

A Rust library for rendering JSX/TSX to complete HTML documents at build-time or server-side.
Documentation
mod common;

use jsxrs::render_string;
use serde_json::json;

use common::{config_with_tailwind, extract_head, minimal_config};

#[test]
fn should_generate_tailwind_css_in_head_when_classes_used() {
    // Given
    let source = r#"export default function Page() {
  return <div className="bg-blue-500 text-white p-4">content</div>;
}"#;
    let config = config_with_tailwind();

    // When
    let result = render_string(source, "page.jsx", &json!({}), &config).unwrap();

    // Then
    let head = extract_head(&result);
    assert!(head.contains("<style>"));
    assert!(head.contains("</style>"));
}

#[test]
fn should_not_add_style_tag_when_no_tailwind_classes_used() {
    // Given
    let source = r#"export default function Page() {
  return <div>plain content</div>;
}"#;
    let config = config_with_tailwind();

    // When
    let result = render_string(source, "page.jsx", &json!({}), &config).unwrap();

    // Then
    let head = extract_head(&result);
    assert!(!head.contains("<style>"));
}

#[test]
fn should_not_process_tailwind_when_disabled_in_config() {
    // Given
    let source = r#"export default function Page() {
  return <div className="bg-blue-500 text-white">content</div>;
}"#;
    let config = minimal_config(); // tailwind: false

    // When
    let result = render_string(source, "page.jsx", &json!({}), &config).unwrap();

    // Then
    let head = extract_head(&result);
    assert!(!head.contains("<style>"));
}

#[test]
fn should_collect_classes_from_nested_elements() {
    // Given
    let source = r#"export default function Page() {
  return (
    <div className="p-4">
      <h1 className="text-xl font-bold">title</h1>
      <p className="mt-2">text</p>
    </div>
  );
}"#;
    let config = config_with_tailwind();

    // When
    let result = render_string(source, "page.jsx", &json!({}), &config).unwrap();

    // Then
    let head = extract_head(&result);
    assert!(head.contains("<style>"));
}

#[test]
fn should_render_tailwind_css_from_fixture_file() {
    // Given
    let path = common::fixtures_dir().join("tailwind.jsx");
    let mut config = config_with_tailwind();
    config.base_dir = Some(common::fixtures_dir());

    // When
    let result = jsxrs::render_file(&path, &json!({}), &config).unwrap();

    // Then
    let head = extract_head(&result);
    assert!(head.contains("<style>"));
}