pub mod autogen;
pub mod docs;
pub mod palette;
pub mod parse;
pub mod transform;
pub mod types;
pub mod vrt;
pub use parse::parse_art;
pub use transform::{transform_to_csf, transform_to_vue};
pub use types::{
ArtDescriptor, ArtDescriptorOwned, ArtMetadata, ArtMetadataOwned, ArtParseError,
ArtParseOptions, ArtParseResult, ArtScriptBlock, ArtScriptBlockOwned, ArtStatus, ArtStyleBlock,
ArtStyleBlockOwned, ArtVariant, ArtVariantOwned, CsfOutput, SourceLocation, ViewportConfig,
};
pub use vize_carton::Bump;
pub fn serve() {
todo!("Component gallery server for Vue SFC - implement with Vite plugin")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_full_workflow() {
let allocator = Bump::new();
let source = r#"
<art title="Button" description="A versatile button component" component="./Button.vue" category="atoms" tags="ui,input">
<variant name="Primary" default>
<Button variant="primary">Primary Button</Button>
</variant>
<variant name="Secondary">
<Button variant="secondary">Secondary Button</Button>
</variant>
<variant name="With Icon">
<Button variant="primary" icon="plus">Add Item</Button>
</variant>
</art>
<script setup lang="ts">
import Button from './Button.vue'
</script>
<style scoped>
.art-container {
padding: 20px;
}
</style>
"#;
let art = parse_art(
&allocator,
source,
ArtParseOptions {
filename: "Button.art.vue".to_string(),
},
)
.unwrap();
assert_eq!(art.metadata.title, "Button");
assert_eq!(
art.metadata.description,
Some("A versatile button component")
);
assert_eq!(art.metadata.category, Some("atoms"));
assert_eq!(art.metadata.tags.len(), 2);
assert_eq!(art.variants.len(), 3);
assert!(art.script_setup.is_some());
assert_eq!(art.styles.len(), 1);
let csf = transform_to_csf(&art);
assert!(csf.code.contains("import type { Meta, StoryObj }"));
assert!(csf.code.contains("title: 'atoms/Button'"));
assert!(csf.code.contains("export const Primary: Story"));
assert!(csf.code.contains("export const Secondary: Story"));
assert!(csf.code.contains("export const WithIcon: Story"));
assert_eq!(csf.filename, "Button.stories.ts");
let vue = transform_to_vue(&art);
assert!(vue.code.contains("export const Primary"));
assert!(vue.code.contains("export const metadata"));
assert!(vue.metadata_code.contains("variantCount: 3"));
}
#[test]
fn test_default_variant() {
let allocator = Bump::new();
let source = r#"
<art title="Test">
<variant name="First">
<div>First</div>
</variant>
<variant name="Second" default>
<div>Second</div>
</variant>
</art>
"#;
let art = parse_art(&allocator, source, ArtParseOptions::default()).unwrap();
let default = art.default_variant().unwrap();
assert_eq!(default.name, "Second");
}
#[test]
fn test_into_owned() {
let allocator = Bump::new();
let source = r#"
<art title="Button" component="./Button.vue">
<variant name="Primary">
<Button>Click</Button>
</variant>
</art>
"#;
let art = parse_art(&allocator, source, ArtParseOptions::default()).unwrap();
let owned: ArtDescriptorOwned = art.into_owned();
assert_eq!(owned.metadata.title, "Button");
assert_eq!(owned.variants.len(), 1);
}
#[test]
fn test_arena_efficiency() {
let allocator = Bump::new();
let sources = [
r#"<art title="A"><variant name="V1"><div>1</div></variant></art>"#,
r#"<art title="B"><variant name="V2"><div>2</div></variant></art>"#,
r#"<art title="C"><variant name="V3"><div>3</div></variant></art>"#,
];
for source in sources {
let art = parse_art(&allocator, source, ArtParseOptions::default()).unwrap();
assert!(!art.metadata.title.is_empty());
}
}
}