start-vibing 2.0.11 → 2.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +177 -177
- package/dist/cli.js +19 -2
- package/package.json +42 -42
- package/template/.claude/CLAUDE.md +174 -174
- package/template/.claude/agents/01-orchestration/agent-selector.md +130 -130
- package/template/.claude/agents/01-orchestration/checkpoint-manager.md +142 -142
- package/template/.claude/agents/01-orchestration/context-manager.md +138 -138
- package/template/.claude/agents/01-orchestration/error-recovery.md +182 -182
- package/template/.claude/agents/01-orchestration/orchestrator.md +114 -114
- package/template/.claude/agents/01-orchestration/parallel-coordinator.md +141 -141
- package/template/.claude/agents/01-orchestration/task-decomposer.md +121 -121
- package/template/.claude/agents/01-orchestration/workflow-router.md +114 -114
- package/template/.claude/agents/02-typescript/bun-runtime-expert.md +197 -197
- package/template/.claude/agents/02-typescript/esm-resolver.md +193 -193
- package/template/.claude/agents/02-typescript/import-alias-enforcer.md +158 -158
- package/template/.claude/agents/02-typescript/ts-generics-helper.md +183 -183
- package/template/.claude/agents/02-typescript/ts-migration-helper.md +238 -238
- package/template/.claude/agents/02-typescript/ts-strict-checker.md +180 -180
- package/template/.claude/agents/02-typescript/ts-types-analyzer.md +199 -199
- package/template/.claude/agents/02-typescript/type-definition-writer.md +187 -187
- package/template/.claude/agents/02-typescript/zod-schema-designer.md +212 -212
- package/template/.claude/agents/02-typescript/zod-validator.md +158 -158
- package/template/.claude/agents/03-testing/playwright-assertions.md +265 -265
- package/template/.claude/agents/03-testing/playwright-e2e.md +247 -247
- package/template/.claude/agents/03-testing/playwright-fixtures.md +234 -234
- package/template/.claude/agents/03-testing/playwright-multi-viewport.md +256 -256
- package/template/.claude/agents/03-testing/playwright-page-objects.md +247 -247
- package/template/.claude/agents/03-testing/test-cleanup-manager.md +248 -248
- package/template/.claude/agents/03-testing/test-data-generator.md +254 -254
- package/template/.claude/agents/03-testing/tester-integration.md +278 -278
- package/template/.claude/agents/03-testing/tester-unit.md +207 -207
- package/template/.claude/agents/03-testing/vitest-config.md +287 -287
- package/template/.claude/agents/04-docker/container-health.md +255 -255
- package/template/.claude/agents/04-docker/deployment-validator.md +225 -225
- package/template/.claude/agents/04-docker/docker-compose-designer.md +281 -281
- package/template/.claude/agents/04-docker/docker-env-manager.md +235 -235
- package/template/.claude/agents/04-docker/docker-multi-stage.md +241 -241
- package/template/.claude/agents/04-docker/dockerfile-optimizer.md +208 -208
- package/template/.claude/agents/05-database/database-seeder.md +273 -273
- package/template/.claude/agents/05-database/mongodb-query-optimizer.md +230 -230
- package/template/.claude/agents/05-database/mongoose-aggregation.md +306 -306
- package/template/.claude/agents/05-database/mongoose-index-optimizer.md +182 -182
- package/template/.claude/agents/05-database/mongoose-schema-designer.md +267 -267
- package/template/.claude/agents/06-security/auth-session-validator.md +68 -68
- package/template/.claude/agents/06-security/input-sanitizer.md +80 -80
- package/template/.claude/agents/06-security/owasp-checker.md +97 -97
- package/template/.claude/agents/06-security/permission-auditor.md +100 -100
- package/template/.claude/agents/06-security/security-auditor.md +84 -84
- package/template/.claude/agents/06-security/sensitive-data-scanner.md +83 -83
- package/template/.claude/agents/07-documentation/api-documenter.md +136 -136
- package/template/.claude/agents/07-documentation/changelog-manager.md +105 -105
- package/template/.claude/agents/07-documentation/documenter.md +76 -76
- package/template/.claude/agents/07-documentation/domain-updater.md +81 -81
- package/template/.claude/agents/07-documentation/jsdoc-generator.md +114 -114
- package/template/.claude/agents/07-documentation/readme-generator.md +135 -135
- package/template/.claude/agents/08-git/branch-manager.md +58 -58
- package/template/.claude/agents/08-git/commit-manager.md +63 -63
- package/template/.claude/agents/08-git/pr-creator.md +76 -76
- package/template/.claude/agents/09-quality/code-reviewer.md +71 -71
- package/template/.claude/agents/09-quality/quality-checker.md +67 -67
- package/template/.claude/agents/10-research/best-practices-finder.md +89 -89
- package/template/.claude/agents/10-research/competitor-analyzer.md +106 -106
- package/template/.claude/agents/10-research/pattern-researcher.md +93 -93
- package/template/.claude/agents/10-research/research-cache-manager.md +76 -76
- package/template/.claude/agents/10-research/research-web.md +98 -98
- package/template/.claude/agents/10-research/tech-evaluator.md +101 -101
- package/template/.claude/agents/11-ui-ux/accessibility-auditor.md +136 -136
- package/template/.claude/agents/11-ui-ux/design-system-enforcer.md +125 -125
- package/template/.claude/agents/11-ui-ux/skeleton-generator.md +118 -118
- package/template/.claude/agents/11-ui-ux/ui-desktop.md +132 -132
- package/template/.claude/agents/11-ui-ux/ui-mobile.md +98 -98
- package/template/.claude/agents/11-ui-ux/ui-tablet.md +110 -110
- package/template/.claude/agents/12-performance/api-latency-analyzer.md +156 -156
- package/template/.claude/agents/12-performance/bundle-analyzer.md +113 -113
- package/template/.claude/agents/12-performance/memory-leak-detector.md +137 -137
- package/template/.claude/agents/12-performance/performance-profiler.md +115 -115
- package/template/.claude/agents/12-performance/query-optimizer.md +124 -124
- package/template/.claude/agents/12-performance/render-optimizer.md +154 -154
- package/template/.claude/agents/13-debugging/build-error-fixer.md +207 -207
- package/template/.claude/agents/13-debugging/debugger.md +149 -149
- package/template/.claude/agents/13-debugging/error-stack-analyzer.md +141 -141
- package/template/.claude/agents/13-debugging/network-debugger.md +208 -208
- package/template/.claude/agents/13-debugging/runtime-error-fixer.md +181 -181
- package/template/.claude/agents/13-debugging/type-error-resolver.md +185 -185
- package/template/.claude/agents/14-validation/final-validator.md +93 -93
- package/template/.claude/agents/_backup/analyzer.md +134 -134
- package/template/.claude/agents/_backup/code-reviewer.md +279 -279
- package/template/.claude/agents/_backup/commit-manager.md +219 -219
- package/template/.claude/agents/_backup/debugger.md +280 -280
- package/template/.claude/agents/_backup/documenter.md +237 -237
- package/template/.claude/agents/_backup/domain-updater.md +197 -197
- package/template/.claude/agents/_backup/final-validator.md +169 -169
- package/template/.claude/agents/_backup/orchestrator.md +149 -149
- package/template/.claude/agents/_backup/performance.md +232 -232
- package/template/.claude/agents/_backup/quality-checker.md +240 -240
- package/template/.claude/agents/_backup/research.md +315 -315
- package/template/.claude/agents/_backup/security-auditor.md +192 -192
- package/template/.claude/agents/_backup/tester.md +566 -566
- package/template/.claude/agents/_backup/ui-ux-reviewer.md +247 -247
- package/template/.claude/config/README.md +30 -30
- package/template/.claude/config/mcp-config.json +344 -344
- package/template/.claude/config/project-config.json +53 -53
- package/template/.claude/config/quality-gates.json +46 -46
- package/template/.claude/config/security-rules.json +45 -45
- package/template/.claude/config/testing-config.json +164 -164
- package/template/.claude/hooks/SETUP.md +126 -126
- package/template/.claude/hooks/run-hook.ts +176 -176
- package/template/.claude/hooks/stop-validator.ts +914 -824
- package/template/.claude/hooks/user-prompt-submit.ts +886 -886
- package/template/.claude/scripts/mcp-quick-install.ts +151 -151
- package/template/.claude/scripts/setup-mcps.ts +651 -651
- package/template/.claude/settings.json +275 -275
- package/template/.claude/skills/bun-runtime/SKILL.md +430 -430
- package/template/.claude/skills/codebase-knowledge/domains/claude-system.md +431 -431
- package/template/.claude/skills/codebase-knowledge/domains/mcp-integration.md +295 -295
- package/template/.claude/skills/debugging-patterns/SKILL.md +485 -485
- package/template/.claude/skills/docker-patterns/SKILL.md +555 -555
- package/template/.claude/skills/git-workflow/SKILL.md +454 -454
- package/template/.claude/skills/mongoose-patterns/SKILL.md +499 -499
- package/template/.claude/skills/nextjs-app-router/SKILL.md +327 -327
- package/template/.claude/skills/performance-patterns/SKILL.md +547 -547
- package/template/.claude/skills/playwright-automation/SKILL.md +438 -438
- package/template/.claude/skills/react-patterns/SKILL.md +389 -389
- package/template/.claude/skills/research-cache/SKILL.md +222 -222
- package/template/.claude/skills/shadcn-ui/SKILL.md +511 -511
- package/template/.claude/skills/tailwind-patterns/SKILL.md +465 -465
- package/template/.claude/skills/test-coverage/SKILL.md +467 -467
- package/template/.claude/skills/trpc-api/SKILL.md +434 -434
- package/template/.claude/skills/typescript-strict/SKILL.md +367 -367
- package/template/.claude/skills/zod-validation/SKILL.md +403 -403
- package/template/CLAUDE.md +117 -117
|
@@ -1,181 +1,181 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: runtime-error-fixer
|
|
3
|
-
description: "AUTOMATICALLY invoke on runtime crashes or exceptions. Triggers: runtime crash, 'crash', 'exception', uncaught error. Fixes runtime errors. PROACTIVELY handles JS/TS runtime issues."
|
|
4
|
-
model: sonnet
|
|
5
|
-
tools: Read, Write, Edit, Grep, Glob
|
|
6
|
-
skills: debugging-patterns
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Runtime Error Fixer Agent
|
|
10
|
-
|
|
11
|
-
You fix JavaScript/TypeScript runtime errors.
|
|
12
|
-
|
|
13
|
-
## Common Runtime Errors
|
|
14
|
-
|
|
15
|
-
### 1. Null/Undefined Access
|
|
16
|
-
|
|
17
|
-
```typescript
|
|
18
|
-
// Error: Cannot read property 'x' of undefined
|
|
19
|
-
|
|
20
|
-
// ❌ Unsafe
|
|
21
|
-
const name = user.profile.name;
|
|
22
|
-
|
|
23
|
-
// ✅ Safe
|
|
24
|
-
const name = user?.profile?.name ?? 'Unknown';
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### 2. Array Index Out of Bounds
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
// Error: undefined is not an object
|
|
31
|
-
|
|
32
|
-
// ❌ Unsafe
|
|
33
|
-
const first = items[0].name;
|
|
34
|
-
|
|
35
|
-
// ✅ Safe
|
|
36
|
-
const first = items[0]?.name ?? 'None';
|
|
37
|
-
// OR
|
|
38
|
-
const first = items.at(0)?.name ?? 'None';
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### 3. Invalid JSON Parse
|
|
42
|
-
|
|
43
|
-
```typescript
|
|
44
|
-
// Error: Unexpected token in JSON
|
|
45
|
-
|
|
46
|
-
// ❌ Unsafe
|
|
47
|
-
const data = JSON.parse(response);
|
|
48
|
-
|
|
49
|
-
// ✅ Safe
|
|
50
|
-
let data;
|
|
51
|
-
try {
|
|
52
|
-
data = JSON.parse(response);
|
|
53
|
-
} catch (e) {
|
|
54
|
-
console.error('Invalid JSON:', response);
|
|
55
|
-
data = {};
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### 4. Async/Await Errors
|
|
60
|
-
|
|
61
|
-
```typescript
|
|
62
|
-
// Error: Unhandled promise rejection
|
|
63
|
-
|
|
64
|
-
// ❌ Unsafe
|
|
65
|
-
async function getData() {
|
|
66
|
-
const result = await fetch(url);
|
|
67
|
-
return result.json();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// ✅ Safe
|
|
71
|
-
async function getData() {
|
|
72
|
-
try {
|
|
73
|
-
const result = await fetch(url);
|
|
74
|
-
if (!result.ok) throw new Error(`HTTP ${result.status}`);
|
|
75
|
-
return result.json();
|
|
76
|
-
} catch (error) {
|
|
77
|
-
console.error('Fetch failed:', error);
|
|
78
|
-
throw error; // Re-throw for caller to handle
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### 5. Type Coercion Issues
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
// Error: x.toLowerCase is not a function
|
|
87
|
-
|
|
88
|
-
// ❌ Unsafe (value might not be string)
|
|
89
|
-
const lower = value.toLowerCase();
|
|
90
|
-
|
|
91
|
-
// ✅ Safe
|
|
92
|
-
const lower = String(value).toLowerCase();
|
|
93
|
-
// OR
|
|
94
|
-
const lower = typeof value === 'string' ? value.toLowerCase() : '';
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## Fix Patterns
|
|
98
|
-
|
|
99
|
-
### Optional Chaining + Nullish Coalescing
|
|
100
|
-
|
|
101
|
-
```typescript
|
|
102
|
-
// Pattern: obj?.prop ?? default
|
|
103
|
-
const email = user?.email ?? 'no-email@example.com';
|
|
104
|
-
const count = data?.items?.length ?? 0;
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### Type Guards
|
|
108
|
-
|
|
109
|
-
```typescript
|
|
110
|
-
function isUser(obj: unknown): obj is User {
|
|
111
|
-
return typeof obj === 'object' && obj !== null && 'id' in obj && 'email' in obj;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (isUser(data)) {
|
|
115
|
-
console.log(data.email); // TypeScript knows it's a User
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Error Boundaries (React)
|
|
120
|
-
|
|
121
|
-
```typescript
|
|
122
|
-
class ErrorBoundary extends React.Component {
|
|
123
|
-
state = { hasError: false };
|
|
124
|
-
|
|
125
|
-
static getDerivedStateFromError(error) {
|
|
126
|
-
return { hasError: true };
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
render() {
|
|
130
|
-
if (this.state.hasError) {
|
|
131
|
-
return <FallbackUI />;
|
|
132
|
-
}
|
|
133
|
-
return this.props.children;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## Output Format
|
|
139
|
-
|
|
140
|
-
```markdown
|
|
141
|
-
## Runtime Error Fix
|
|
142
|
-
|
|
143
|
-
### Error
|
|
144
|
-
|
|
145
|
-
\`\`\`
|
|
146
|
-
TypeError: Cannot read properties of null (reading 'map')
|
|
147
|
-
\`\`\`
|
|
148
|
-
|
|
149
|
-
### Location
|
|
150
|
-
|
|
151
|
-
File: `src/components/List.tsx`
|
|
152
|
-
Line: 12
|
|
153
|
-
|
|
154
|
-
### Root Cause
|
|
155
|
-
|
|
156
|
-
`items` prop is null on initial render before data loads.
|
|
157
|
-
|
|
158
|
-
### Fix Applied
|
|
159
|
-
|
|
160
|
-
\`\`\`typescript
|
|
161
|
-
// Before
|
|
162
|
-
{items.map(item => <Item key={item.id} {...item} />)}
|
|
163
|
-
|
|
164
|
-
// After
|
|
165
|
-
{items?.map(item => <Item key={item.id} {...item} />) ?? <EmptyState />}
|
|
166
|
-
\`\`\`
|
|
167
|
-
|
|
168
|
-
### Prevention
|
|
169
|
-
|
|
170
|
-
Added default value in component:
|
|
171
|
-
\`\`\`typescript
|
|
172
|
-
function List({ items = [] }: Props) {
|
|
173
|
-
\`\`\`
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
## Critical Rules
|
|
177
|
-
|
|
178
|
-
1. **DEFENSIVE CODING** - Assume data can be null/undefined
|
|
179
|
-
2. **VALIDATE INPUTS** - Check before using
|
|
180
|
-
3. **HANDLE ERRORS** - try/catch for risky operations
|
|
181
|
-
4. **TYPE GUARDS** - Narrow types before access
|
|
1
|
+
---
|
|
2
|
+
name: runtime-error-fixer
|
|
3
|
+
description: "AUTOMATICALLY invoke on runtime crashes or exceptions. Triggers: runtime crash, 'crash', 'exception', uncaught error. Fixes runtime errors. PROACTIVELY handles JS/TS runtime issues."
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Write, Edit, Grep, Glob
|
|
6
|
+
skills: debugging-patterns
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Runtime Error Fixer Agent
|
|
10
|
+
|
|
11
|
+
You fix JavaScript/TypeScript runtime errors.
|
|
12
|
+
|
|
13
|
+
## Common Runtime Errors
|
|
14
|
+
|
|
15
|
+
### 1. Null/Undefined Access
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// Error: Cannot read property 'x' of undefined
|
|
19
|
+
|
|
20
|
+
// ❌ Unsafe
|
|
21
|
+
const name = user.profile.name;
|
|
22
|
+
|
|
23
|
+
// ✅ Safe
|
|
24
|
+
const name = user?.profile?.name ?? 'Unknown';
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 2. Array Index Out of Bounds
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
// Error: undefined is not an object
|
|
31
|
+
|
|
32
|
+
// ❌ Unsafe
|
|
33
|
+
const first = items[0].name;
|
|
34
|
+
|
|
35
|
+
// ✅ Safe
|
|
36
|
+
const first = items[0]?.name ?? 'None';
|
|
37
|
+
// OR
|
|
38
|
+
const first = items.at(0)?.name ?? 'None';
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 3. Invalid JSON Parse
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
// Error: Unexpected token in JSON
|
|
45
|
+
|
|
46
|
+
// ❌ Unsafe
|
|
47
|
+
const data = JSON.parse(response);
|
|
48
|
+
|
|
49
|
+
// ✅ Safe
|
|
50
|
+
let data;
|
|
51
|
+
try {
|
|
52
|
+
data = JSON.parse(response);
|
|
53
|
+
} catch (e) {
|
|
54
|
+
console.error('Invalid JSON:', response);
|
|
55
|
+
data = {};
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 4. Async/Await Errors
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// Error: Unhandled promise rejection
|
|
63
|
+
|
|
64
|
+
// ❌ Unsafe
|
|
65
|
+
async function getData() {
|
|
66
|
+
const result = await fetch(url);
|
|
67
|
+
return result.json();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ✅ Safe
|
|
71
|
+
async function getData() {
|
|
72
|
+
try {
|
|
73
|
+
const result = await fetch(url);
|
|
74
|
+
if (!result.ok) throw new Error(`HTTP ${result.status}`);
|
|
75
|
+
return result.json();
|
|
76
|
+
} catch (error) {
|
|
77
|
+
console.error('Fetch failed:', error);
|
|
78
|
+
throw error; // Re-throw for caller to handle
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 5. Type Coercion Issues
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
// Error: x.toLowerCase is not a function
|
|
87
|
+
|
|
88
|
+
// ❌ Unsafe (value might not be string)
|
|
89
|
+
const lower = value.toLowerCase();
|
|
90
|
+
|
|
91
|
+
// ✅ Safe
|
|
92
|
+
const lower = String(value).toLowerCase();
|
|
93
|
+
// OR
|
|
94
|
+
const lower = typeof value === 'string' ? value.toLowerCase() : '';
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Fix Patterns
|
|
98
|
+
|
|
99
|
+
### Optional Chaining + Nullish Coalescing
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
// Pattern: obj?.prop ?? default
|
|
103
|
+
const email = user?.email ?? 'no-email@example.com';
|
|
104
|
+
const count = data?.items?.length ?? 0;
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Type Guards
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
function isUser(obj: unknown): obj is User {
|
|
111
|
+
return typeof obj === 'object' && obj !== null && 'id' in obj && 'email' in obj;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (isUser(data)) {
|
|
115
|
+
console.log(data.email); // TypeScript knows it's a User
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Error Boundaries (React)
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
class ErrorBoundary extends React.Component {
|
|
123
|
+
state = { hasError: false };
|
|
124
|
+
|
|
125
|
+
static getDerivedStateFromError(error) {
|
|
126
|
+
return { hasError: true };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
render() {
|
|
130
|
+
if (this.state.hasError) {
|
|
131
|
+
return <FallbackUI />;
|
|
132
|
+
}
|
|
133
|
+
return this.props.children;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Output Format
|
|
139
|
+
|
|
140
|
+
```markdown
|
|
141
|
+
## Runtime Error Fix
|
|
142
|
+
|
|
143
|
+
### Error
|
|
144
|
+
|
|
145
|
+
\`\`\`
|
|
146
|
+
TypeError: Cannot read properties of null (reading 'map')
|
|
147
|
+
\`\`\`
|
|
148
|
+
|
|
149
|
+
### Location
|
|
150
|
+
|
|
151
|
+
File: `src/components/List.tsx`
|
|
152
|
+
Line: 12
|
|
153
|
+
|
|
154
|
+
### Root Cause
|
|
155
|
+
|
|
156
|
+
`items` prop is null on initial render before data loads.
|
|
157
|
+
|
|
158
|
+
### Fix Applied
|
|
159
|
+
|
|
160
|
+
\`\`\`typescript
|
|
161
|
+
// Before
|
|
162
|
+
{items.map(item => <Item key={item.id} {...item} />)}
|
|
163
|
+
|
|
164
|
+
// After
|
|
165
|
+
{items?.map(item => <Item key={item.id} {...item} />) ?? <EmptyState />}
|
|
166
|
+
\`\`\`
|
|
167
|
+
|
|
168
|
+
### Prevention
|
|
169
|
+
|
|
170
|
+
Added default value in component:
|
|
171
|
+
\`\`\`typescript
|
|
172
|
+
function List({ items = [] }: Props) {
|
|
173
|
+
\`\`\`
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Critical Rules
|
|
177
|
+
|
|
178
|
+
1. **DEFENSIVE CODING** - Assume data can be null/undefined
|
|
179
|
+
2. **VALIDATE INPUTS** - Check before using
|
|
180
|
+
3. **HANDLE ERRORS** - try/catch for risky operations
|
|
181
|
+
4. **TYPE GUARDS** - Narrow types before access
|