Files
metabuilder/codegen/docs/JSON_CONSTANTS.md
johndoe6345789 a51130a127 feat: Add external low-code and postgres repositories
- codegen: Low-code React app with JSON-driven component system
- packagerepo: Schema-driven package repository with backend/frontend
- postgres: Next.js app with Drizzle ORM and PostgreSQL

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 16:48:52 +00:00

108 lines
2.9 KiB
Markdown

# JSON Constants Migration Guide
## Overview
This document tracks the extraction of hardcoded constants from JSON component definitions into the centralized constants folder.
## Status
### ✅ Constants Folder Created
Location: `src/lib/json-ui/constants/`
Files:
- `sizes.ts` - Size-related constants
- `placements.ts` - Positioning constants
- `styles.ts` - CSS class constants
- `object-fit.ts` - Image object-fit constants
- `index.ts` - Centralized exports
### 📋 Constants Found in JSON Files
#### CopyButton (`copy-button.json`)
```javascript
// Line 11: sizeStyles
const sizeStyles = { sm: 'p-1', md: 'p-2', lg: 'p-3' }
// → BUTTON_SIZES
// Lines 25, 39: iconSize (duplicated)
const iconSize = { sm: 12, md: 16, lg: 20 }
// → ICON_SIZES
```
#### Popover (`popover.json`)
```javascript
// Line 39: placementStyles
const placementStyles = {
top: 'bottom-full mb-2 left-1/2 -translate-x-1/2',
bottom: 'top-full mt-2 left-1/2 -translate-x-1/2',
left: 'right-full mr-2 top-1/2 -translate-y-1/2',
right: 'left-full ml-2 top-1/2 -translate-y-1/2'
}
// → POPOVER_PLACEMENTS
```
#### Image (`image.json`)
```javascript
// Line 51: Dynamic object-fit (uses template literal)
return `${base} ${opacity} object-${fit}`
// Could use OBJECT_FIT_CLASSES but requires transform refactor
```
## Recommendations
### Option 1: Keep Inline (Current Approach)
**Pros:**
- No changes to component-renderer needed
- Self-contained JSON definitions
- Easy to understand transforms
**Cons:**
- Duplication of constants
- Harder to maintain consistency
- Magic strings scattered across files
### Option 2: Import Constants in Hooks
**Pros:**
- Hooks can use TypeScript constants
- No changes to JSON structure needed
- Immediate benefit for custom hooks
**Cons:**
- Only helps with hook-based logic
- Still have duplication in JSON transforms
### Option 3: Add Constants to Transform Context (Future)
**Pros:**
- Eliminates duplication entirely
- Type-safe constants usage
- Easier to update global styles
**Cons:**
- Requires component-renderer changes
- More complex transform evaluation
- Migration effort for existing JSON files
## Recommended Next Steps
1. **Short term:** Use constants in custom hooks (Option 2)
- Hooks can import from `@/lib/json-ui/constants`
- Reduce duplication in hook code
2. **Medium term:** Document best practices
- Add examples of using constants
- Create migration guide for new components
3. **Long term:** Enhanced transform context (Option 3)
- Update component-renderer to expose constants
- Migrate existing JSON files to use constants
- Remove inline const statements
## Files to Potentially Update
When migrating to Option 3:
- `copy-button.json` - sizeStyles, iconSize
- `popover.json` - placementStyles
- `menu.json` - May have similar patterns
- `file-upload.json` - May have size constants
- Any future components using similar patterns