docusaurus 0.0.0-alpha.0

Drop-in Docusaurus CLI with Rust-native config (docusaurus.config.rs)
Documentation
use docusaurus::config::{DocusaurusConfig, PluginConfig, ReportingSeverity};

#[test]
fn default_values_match_upstream() {
    let cfg = DocusaurusConfig::default();
    assert!(!cfg.no_index);
    assert_eq!(cfg.on_broken_links, ReportingSeverity::Throw);
    assert_eq!(cfg.on_broken_anchors, ReportingSeverity::Warn);
    assert_eq!(cfg.on_broken_markdown_links, Some(ReportingSeverity::Warn));
    assert_eq!(cfg.on_duplicate_routes, ReportingSeverity::Warn);
    assert!(cfg.base_url_issue_banner);
    assert_eq!(cfg.static_directories, vec!["static"]);
    assert_eq!(cfg.title_delimiter, Some("|".to_string()));
}

#[test]
fn serializes_camel_case() {
    let cfg = DocusaurusConfig {
        title: "My Site".into(),
        url: "https://example.com".into(),
        base_url: "/".into(),
        no_index: true,
        on_broken_links: ReportingSeverity::Warn,
        ..Default::default()
    };
    let json = serde_json::to_value(&cfg).unwrap();
    assert!(json.get("baseUrl").is_some(), "baseUrl must be camelCase");
    assert!(json.get("base_url").is_none(), "snake_case must not appear");
    assert!(json.get("noIndex").is_some());
    assert!(json.get("onBrokenLinks").is_some());
    assert!(json.get("staticDirectories").is_some());
}

#[test]
fn reporting_severity_serializes_lowercase() {
    assert_eq!(
        serde_json::to_string(&ReportingSeverity::Ignore).unwrap(),
        r#""ignore""#
    );
    assert_eq!(
        serde_json::to_string(&ReportingSeverity::Log).unwrap(),
        r#""log""#
    );
    assert_eq!(
        serde_json::to_string(&ReportingSeverity::Warn).unwrap(),
        r#""warn""#
    );
    assert_eq!(
        serde_json::to_string(&ReportingSeverity::Throw).unwrap(),
        r#""throw""#
    );
}

#[test]
fn plugin_config_named_serializes_as_string() {
    let plugin = PluginConfig::Named("@docusaurus/plugin-content-docs".into());
    let json = serde_json::to_string(&plugin).unwrap();
    assert_eq!(json, r#""@docusaurus/plugin-content-docs""#);
}

#[test]
fn plugin_config_with_options_serializes_as_array() {
    let plugin = PluginConfig::WithOptions(
        "@docusaurus/plugin-content-docs".into(),
        serde_json::json!({ "path": "docs" }),
    );
    let json = serde_json::to_value(&plugin).unwrap();
    assert!(json.is_array());
    let arr = json.as_array().unwrap();
    assert_eq!(arr.len(), 2);
    assert_eq!(arr[0].as_str().unwrap(), "@docusaurus/plugin-content-docs");
    assert_eq!(arr[1]["path"].as_str().unwrap(), "docs");
}

#[test]
fn round_trip_serialization() {
    let cfg = DocusaurusConfig {
        title: "Test".into(),
        url: "https://test.com".into(),
        base_url: "/base/".into(),
        plugins: vec![
            PluginConfig::Named("@docusaurus/plugin-sitemap".into()),
            PluginConfig::WithOptions(
                "@docusaurus/plugin-content-docs".into(),
                serde_json::json!({ "path": "docs" }),
            ),
        ],
        ..Default::default()
    };

    let json = serde_json::to_string(&cfg).unwrap();
    let restored: DocusaurusConfig = serde_json::from_str(&json).unwrap();
    assert_eq!(cfg, restored);
}