4.9 KiB
🚀 Quick Start Guide: Size Limits & Refactoring
What Was Done?
A code size limit enforcement system was created for MetaBuilder to maintain code quality and architectural standards.
📏 The Rules
Each TypeScript/React file must stay under:
- 150 lines of code (actual code, not comments/blanks)
- 200 total lines (including comments)
- 3 levels of nesting max
- 5-10 exports per file
- 5 function parameters max
🛠️ How to Check
Run this command to check if your code violates any limits:
npx tsx /workspaces/metabuilder/scripts/enforce-size-limits.ts
Success output:
✅ All files comply with size limits!
Failure output:
❌ ERRORS (3):
📄 src/components/MyComponent.tsx
Lines of Code (LOC): 187 / 150
📋 How to Refactor (Step by Step)
Step 1: Identify the Problem
# Check which files are too large
npx tsx /workspaces/metabuilder/scripts/enforce-size-limits.ts
Step 2: Extract Business Logic
Create a custom hook in src/hooks/:
// src/hooks/useMyFeature.ts
import { useState, useCallback } from 'react'
export function useMyFeature() {
const [data, setData] = useState(null)
const [isLoading, setIsLoading] = useState(false)
const fetch = useCallback(async () => {
setIsLoading(true)
try {
// Your logic here
} finally {
setIsLoading(false)
}
}, [])
return { data, isLoading, fetch }
}
Step 3: Create Small UI Components
Break rendering into focused components:
// src/components/MyItem.tsx
export function MyItem({ item, onSelect }) {
return (
<div onClick={() => onSelect(item)}>
<h3>{item.title}</h3>
</div>
)
}
Step 4: Connect with Container
Create a small container that glues everything together:
// src/components/MyFeature.tsx
import { useMyFeature } from '@/hooks/useMyFeature'
import { MyItem } from './MyItem'
export function MyFeature() {
const { data, isLoading, fetch } = useMyFeature()
return (
<div>
{isLoading ? <p>Loading...</p> : null}
{data?.map(item => (
<MyItem key={item.id} item={item} />
))}
</div>
)
}
Step 5: Verify
# Check your changes pass the limit
npx tsx /workspaces/metabuilder/scripts/enforce-size-limits.ts
🎯 Available Hooks
Pre-made hooks you can use:
useGitHubFetcher
Fetch GitHub workflow runs:
const { data, isLoading, error, fetch } = useGitHubFetcher()
useAutoRefresh
Auto-refresh at intervals:
const { isAutoRefreshing, toggleAutoRefresh } = useAutoRefresh({
intervalMs: 30000,
onRefresh: () => fetch(),
})
useFileTree
Manage file tree structure:
const { files, addChild, deleteNode } = useFileTree(initialFiles)
useCodeEditor
Manage code editor state:
const { activeFile, openFile, saveFile } = useCodeEditor()
See src/hooks/index.ts for all available hooks.
📚 Detailed Resources
- Full Guide:
docs/REFACTORING_ENFORCEMENT_GUIDE.md - Quick Reference:
docs/REFACTORING_QUICK_REFERENCE.md - Strategy:
docs/REFACTORING_STRATEGY.md - Examples: Look at
src/components/GitHubActionsFetcher.refactored.tsx
🔄 Automated Checks
On Each Commit (Local)
The pre-commit hook automatically runs checks before you commit:
git commit -m "my changes"
# → Pre-commit hook checks size limits
# → If violations found, commit is blocked
On Each PR (GitHub)
The GitHub Actions workflow checks your PR:
- Scans changed files
- Posts violations as comments
- Blocks merge if errors found
✅ Dos and Don'ts
DO:
- ✅ Extract logic to custom hooks
- ✅ Create small, focused components
- ✅ Use composition over large components
- ✅ Test hooks in isolation
- ✅ Document your hooks
DON'T:
- ❌ Put all logic in a component
- ❌ Create massive render methods
- ❌ Duplicate logic across files
- ❌ Nest JSX deeply
- ❌ Add too many props
🆘 Help & FAQ
Q: How do I know what to extract? A: If your component has multiple responsibilities (fetching, rendering, state management), extract the non-rendering parts to hooks.
Q: Can I exceed the limits? A: Not recommended. If you absolutely must, discuss with team. The limits exist for good reasons.
Q: What if my hook exceeds 100 LOC? A: Break it into smaller hooks. Each hook should do one thing well.
Q: How do I test hooks?
A: Use React Testing Library's renderHook function. See docs for examples.
📞 Contact
Questions? Check these resources in order:
docs/REFACTORING_QUICK_REFERENCE.md(code examples)docs/REFACTORING_ENFORCEMENT_GUIDE.md(full guide)docs/REFACTORING_STRATEGY.md(deep dive)- Look at example in
src/components/GitHubActionsFetcher.refactored.tsx
Ready to refactor? Start with the Full Guide →