Schema System
The QwickApps Schema System provides type-safe data validation, CMS integration patterns, and automatic component configuration for dynamic applications.
Overview
The schema system bridges the gap between content management systems and React components by providing:
- Type-safe validation of CMS data at runtime
- Component schema definitions that describe expected data structure
- Data transformation patterns for clean content integration
- Editor guidance for non-technical content creators
- Automatic prop generation from validated data sources
Core Concepts
Schema Models
Schema models define the expected structure and validation rules for component data:
import { Schema, Model, Field, Editor, FieldType } from '@qwickapps/schema';
@Schema('Button', '1.0.0')
export class ButtonModel extends Model {
@Field()
@Editor({
field_type: FieldType.TEXT,
label: 'Button Label',
description: 'Text to display on the button',
placeholder: 'Enter button text...'
})
@IsString()
label!: string;
@Field()
@Editor({
field_type: FieldType.SELECT,
label: 'Button Variant',
validation: {
options: [
{ label: 'Primary', value: 'primary' },
{ label: 'Secondary', value: 'secondary' }
]
}
})
@IsIn(['primary', 'secondary'])
variant?: 'primary' | 'secondary';
}
Data Providers
Data providers fetch and validate content from various sources:
import { JsonDataProvider, CachedDataProvider } from '@qwickapps/schema';
// Simple JSON data provider
const jsonProvider = new JsonDataProvider({
data: {
'buttons.cta': [{
label: 'Get Started',
variant: 'primary'
}]
}
});
// Cached provider for performance
const cachedProvider = new CachedDataProvider(jsonProvider, {
maxSize: 100,
defaultTTL: 60000
});
Schema Validation
Runtime validation ensures content meets component requirements:
// Automatic validation in components
<Button dataSource="buttons.cta" />
// Manual validation with hooks
const buttonData = useDataBinding<ButtonModel>(
'buttons.cta',
{ label: 'Fallback', variant: 'primary' },
ButtonModel
);
Data Flow
- CMS Content → Data provider loads content from external source
- Schema Validation → Runtime validation against component schema
- Type Safety → TypeScript ensures correct prop types
- Component Rendering → Validated data populates component props
- Error Handling → Graceful fallbacks for invalid or missing data
Key Features
Type Safety
- Runtime validation of CMS data
- TypeScript integration for development
- Automatic error detection and reporting
- Graceful degradation for invalid content
CMS Integration
- Works with any headless CMS (Strapi, Contentful, WordPress)
- REST API and GraphQL support
- Custom data provider implementations
- Flexible content transformation patterns
Performance
- Built-in caching mechanisms
- Lazy loading of schema definitions
- Efficient re-validation strategies
- Memory optimization for large datasets
Developer Experience
- Clear error messages and debugging info
- IDE integration with TypeScript
- Hot reloading during development
- Comprehensive testing utilities
Quick Start
1. Define Component Schema
@Schema('MyComponent', '1.0.0')
export class MyComponentModel extends Model {
@Field()
@Editor({
field_type: FieldType.TEXT,
label: 'Title'
})
@IsString()
title!: string;
}
2. Setup Data Provider
const dataProvider = new JsonDataProvider({
data: {
'my.content': [{
title: 'Hello World'
}]
}
});
3. Use in Components
function MyComponent({ dataSource }: { dataSource: string }) {
const data = useDataBinding<MyComponentModel>(
dataSource,
{ title: 'Default Title' },
MyComponentModel
);
return <h1>{data.title}</h1>;
}
// Usage
<MyComponent dataSource="my.content" />
Advanced Topics
- Custom Data Providers - Create providers for your CMS
- Schema Composition - Combine schemas for complex components
- Validation Patterns - Advanced validation techniques
- Performance Optimization - Optimize for large datasets
- Testing Strategies - Test schema-driven components
Next Steps
- Data Binding Guide - Learn Framework integration
- Component Development - Build schema-aware components
- CMS Integration Examples - Real-world CMS setups