create-fluxstack 1.0.13 → 1.0.15
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/.env.example +29 -29
- package/app/client/README.md +69 -69
- package/app/client/index.html +14 -13
- package/app/client/src/App.tsx +157 -524
- package/app/client/src/components/ErrorBoundary.tsx +107 -0
- package/app/client/src/components/ErrorDisplay.css +365 -0
- package/app/client/src/components/ErrorDisplay.tsx +258 -0
- package/app/client/src/components/FluxStackConfig.tsx +1321 -0
- package/app/client/src/components/HybridLiveCounter.tsx +140 -0
- package/app/client/src/components/LiveClock.tsx +286 -0
- package/app/client/src/components/MainLayout.tsx +390 -0
- package/app/client/src/components/SidebarNavigation.tsx +391 -0
- package/app/client/src/components/StateDemo.tsx +178 -0
- package/app/client/src/components/SystemMonitor.tsx +1038 -0
- package/app/client/src/components/Teste.tsx +104 -0
- package/app/client/src/components/UserProfile.tsx +809 -0
- package/app/client/src/hooks/useAuth.ts +39 -0
- package/app/client/src/hooks/useNotifications.ts +56 -0
- package/app/client/src/lib/eden-api.ts +189 -53
- package/app/client/src/lib/errors.ts +340 -0
- package/app/client/src/lib/hooks/useErrorHandler.ts +258 -0
- package/app/client/src/lib/index.ts +45 -0
- package/app/client/src/main.tsx +3 -2
- package/app/client/src/pages/ApiDocs.tsx +182 -0
- package/app/client/src/pages/Demo.tsx +174 -0
- package/app/client/src/pages/HybridLive.tsx +263 -0
- package/app/client/src/pages/Overview.tsx +155 -0
- package/app/client/src/store/README.md +43 -0
- package/app/client/src/store/index.ts +16 -0
- package/app/client/src/store/slices/uiSlice.ts +151 -0
- package/app/client/src/store/slices/userSlice.ts +161 -0
- package/app/client/src/test/README.md +257 -0
- package/app/client/src/test/setup.ts +70 -0
- package/app/client/src/test/types.ts +12 -0
- package/app/client/src/vite-env.d.ts +1 -1
- package/app/client/tsconfig.app.json +44 -43
- package/app/client/tsconfig.json +7 -7
- package/app/client/tsconfig.node.json +25 -25
- package/app/client/zustand-setup.md +65 -0
- package/app/server/controllers/users.controller.ts +68 -68
- package/app/server/index.ts +9 -1
- package/app/server/live/CounterComponent.ts +191 -0
- package/app/server/live/FluxStackConfig.ts +529 -0
- package/app/server/live/LiveClockComponent.ts +214 -0
- package/app/server/live/SidebarNavigation.ts +156 -0
- package/app/server/live/SystemMonitor.ts +594 -0
- package/app/server/live/SystemMonitorIntegration.ts +151 -0
- package/app/server/live/TesteComponent.ts +87 -0
- package/app/server/live/UserProfileComponent.ts +135 -0
- package/app/server/live/register-components.ts +28 -0
- package/app/server/middleware/auth.ts +136 -0
- package/app/server/middleware/errorHandling.ts +250 -0
- package/app/server/middleware/index.ts +10 -0
- package/app/server/middleware/rateLimit.ts +193 -0
- package/app/server/middleware/requestLogging.ts +215 -0
- package/app/server/middleware/validation.ts +270 -0
- package/app/server/routes/index.ts +14 -2
- package/app/server/routes/upload.ts +92 -0
- package/app/server/routes/users.routes.ts +2 -9
- package/app/server/services/NotificationService.ts +302 -0
- package/app/server/services/UserService.ts +222 -0
- package/app/server/services/index.ts +46 -0
- package/core/cli/commands/plugin-deps.ts +263 -0
- package/core/cli/generators/README.md +339 -0
- package/core/cli/generators/component.ts +770 -0
- package/core/cli/generators/controller.ts +299 -0
- package/core/cli/generators/index.ts +144 -0
- package/core/cli/generators/interactive.ts +228 -0
- package/core/cli/generators/prompts.ts +83 -0
- package/core/cli/generators/route.ts +513 -0
- package/core/cli/generators/service.ts +465 -0
- package/core/cli/generators/template-engine.ts +154 -0
- package/core/cli/generators/types.ts +71 -0
- package/core/cli/generators/utils.ts +192 -0
- package/core/cli/index.ts +69 -0
- package/core/cli/plugin-discovery.ts +16 -85
- package/core/client/fluxstack.ts +17 -0
- package/core/client/hooks/index.ts +7 -0
- package/core/client/hooks/state-validator.ts +130 -0
- package/core/client/hooks/useAuth.ts +49 -0
- package/core/client/hooks/useChunkedUpload.ts +258 -0
- package/core/client/hooks/useHybridLiveComponent.ts +967 -0
- package/core/client/hooks/useWebSocket.ts +373 -0
- package/core/client/index.ts +47 -0
- package/core/client/state/createStore.ts +193 -0
- package/core/client/state/index.ts +15 -0
- package/core/config/env-dynamic.ts +1 -1
- package/core/config/env.ts +2 -1
- package/core/config/runtime-config.ts +3 -3
- package/core/config/schema.ts +84 -49
- package/core/framework/server.ts +30 -0
- package/core/index.ts +25 -0
- package/core/live/ComponentRegistry.ts +399 -0
- package/core/live/types.ts +164 -0
- package/core/plugins/built-in/live-components/commands/create-live-component.ts +1201 -0
- package/core/plugins/built-in/live-components/index.ts +27 -0
- package/core/plugins/built-in/logger/index.ts +1 -1
- package/core/plugins/built-in/monitoring/index.ts +1 -1
- package/core/plugins/built-in/static/index.ts +1 -1
- package/core/plugins/built-in/swagger/index.ts +1 -1
- package/core/plugins/built-in/vite/index.ts +1 -1
- package/core/plugins/dependency-manager.ts +384 -0
- package/core/plugins/index.ts +5 -1
- package/core/plugins/manager.ts +7 -3
- package/core/plugins/registry.ts +88 -10
- package/core/plugins/types.ts +11 -11
- package/core/server/framework.ts +43 -0
- package/core/server/index.ts +11 -1
- package/core/server/live/ComponentRegistry.ts +1017 -0
- package/core/server/live/FileUploadManager.ts +272 -0
- package/core/server/live/LiveComponentPerformanceMonitor.ts +930 -0
- package/core/server/live/SingleConnectionManager.ts +0 -0
- package/core/server/live/StateSignature.ts +644 -0
- package/core/server/live/WebSocketConnectionManager.ts +688 -0
- package/core/server/live/websocket-plugin.ts +435 -0
- package/core/server/middleware/errorHandling.ts +141 -0
- package/core/server/middleware/index.ts +16 -0
- package/core/server/plugins/static-files-plugin.ts +232 -0
- package/core/server/services/BaseService.ts +95 -0
- package/core/server/services/ServiceContainer.ts +144 -0
- package/core/server/services/index.ts +9 -0
- package/core/templates/create-project.ts +196 -33
- package/core/testing/index.ts +10 -0
- package/core/testing/setup.ts +74 -0
- package/core/types/build.ts +38 -14
- package/core/types/types.ts +319 -0
- package/core/utils/env-runtime.ts +7 -0
- package/core/utils/errors/handlers.ts +264 -39
- package/core/utils/errors/index.ts +528 -18
- package/core/utils/errors/middleware.ts +114 -0
- package/core/utils/logger/formatters.ts +222 -0
- package/core/utils/logger/index.ts +167 -48
- package/core/utils/logger/middleware.ts +253 -0
- package/core/utils/logger/performance.ts +384 -0
- package/core/utils/logger/transports.ts +365 -0
- package/create-fluxstack.ts +296 -296
- package/fluxstack.config.ts +17 -1
- package/package-template.json +66 -66
- package/package.json +31 -6
- package/public/README.md +16 -0
- package/vite.config.ts +29 -14
- package/.claude/settings.local.json +0 -74
- package/.github/workflows/ci-build-tests.yml +0 -480
- package/.github/workflows/dependency-management.yml +0 -324
- package/.github/workflows/release-validation.yml +0 -355
- package/.kiro/specs/fluxstack-architecture-optimization/design.md +0 -700
- package/.kiro/specs/fluxstack-architecture-optimization/requirements.md +0 -127
- package/.kiro/specs/fluxstack-architecture-optimization/tasks.md +0 -330
- package/CLAUDE.md +0 -200
- package/Dockerfile +0 -58
- package/Dockerfile.backend +0 -52
- package/Dockerfile.frontend +0 -54
- package/README-Docker.md +0 -85
- package/ai-context/00-QUICK-START.md +0 -86
- package/ai-context/README.md +0 -88
- package/ai-context/development/eden-treaty-guide.md +0 -362
- package/ai-context/development/patterns.md +0 -382
- package/ai-context/development/plugins-guide.md +0 -572
- package/ai-context/examples/crud-complete.md +0 -626
- package/ai-context/project/architecture.md +0 -399
- package/ai-context/project/overview.md +0 -213
- package/ai-context/recent-changes/eden-treaty-refactor.md +0 -281
- package/ai-context/recent-changes/type-inference-fix.md +0 -223
- package/ai-context/reference/environment-vars.md +0 -384
- package/ai-context/reference/troubleshooting.md +0 -407
- package/app/client/src/components/TestPage.tsx +0 -453
- package/bun.lock +0 -1063
- package/bunfig.toml +0 -16
- package/core/__tests__/integration.test.ts +0 -227
- package/core/build/index.ts +0 -186
- package/core/config/__tests__/config-loader.test.ts +0 -554
- package/core/config/__tests__/config-merger.test.ts +0 -657
- package/core/config/__tests__/env-converter.test.ts +0 -372
- package/core/config/__tests__/env-processor.test.ts +0 -431
- package/core/config/__tests__/env.test.ts +0 -452
- package/core/config/__tests__/integration.test.ts +0 -418
- package/core/config/__tests__/loader.test.ts +0 -331
- package/core/config/__tests__/schema.test.ts +0 -129
- package/core/config/__tests__/validator.test.ts +0 -318
- package/core/framework/__tests__/server.test.ts +0 -233
- package/core/plugins/__tests__/built-in.test.ts.disabled +0 -366
- package/core/plugins/__tests__/manager.test.ts +0 -398
- package/core/plugins/__tests__/monitoring.test.ts +0 -401
- package/core/plugins/__tests__/registry.test.ts +0 -335
- package/core/utils/__tests__/errors.test.ts +0 -139
- package/core/utils/__tests__/helpers.test.ts +0 -297
- package/core/utils/__tests__/logger.test.ts +0 -141
- package/create-test-app.ts +0 -156
- package/docker-compose.microservices.yml +0 -75
- package/docker-compose.simple.yml +0 -57
- package/docker-compose.yml +0 -71
- package/eslint.config.js +0 -23
- package/flux-cli.ts +0 -214
- package/nginx-lb.conf +0 -37
- package/publish.sh +0 -63
- package/run-clean.ts +0 -26
- package/run-env-tests.ts +0 -313
- package/tailwind.config.js +0 -34
- package/tests/__mocks__/api.ts +0 -56
- package/tests/fixtures/users.ts +0 -69
- package/tests/integration/api/users.routes.test.ts +0 -221
- package/tests/setup.ts +0 -29
- package/tests/unit/app/client/App-simple.test.tsx +0 -56
- package/tests/unit/app/client/App.test.tsx.skip +0 -237
- package/tests/unit/app/client/eden-api.test.ts +0 -186
- package/tests/unit/app/client/simple.test.tsx +0 -23
- package/tests/unit/app/controllers/users.controller.test.ts +0 -150
- package/tests/unit/core/create-project.test.ts.skip +0 -95
- package/tests/unit/core/framework.test.ts +0 -144
- package/tests/unit/core/plugins/logger.test.ts.skip +0 -268
- package/tests/unit/core/plugins/vite.test.ts.disabled +0 -188
- package/tests/utils/test-helpers.ts +0 -61
- package/vitest.config.ts +0 -50
- package/workspace.json +0 -6
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
# 👨💻 Padrões de Desenvolvimento - FluxStack
|
|
2
|
-
|
|
3
|
-
> **Padrões fundamentais e boas práticas para desenvolvimento eficiente no FluxStack**
|
|
4
|
-
|
|
5
|
-
## 🚨 **Regras Fundamentais**
|
|
6
|
-
|
|
7
|
-
### ❌ **NUNCA FAZER**
|
|
8
|
-
1. **Editar `core/`** - Framework é read-only (alterações serão perdidas)
|
|
9
|
-
2. **Usar `apiCall()` wrapper** - Quebra type inference do Eden Treaty
|
|
10
|
-
3. **Criar types manuais** para Eden Treaty - Use inferência automática
|
|
11
|
-
4. **Ignorar response schemas** - Necessários para documentação e tipos
|
|
12
|
-
5. **Trabalhar fora de `app/`** - Código da aplicação deve ficar em `app/`
|
|
13
|
-
|
|
14
|
-
### ✅ **SEMPRE FAZER**
|
|
15
|
-
1. **Trabalhar em `app/`** - Toda lógica da aplicação
|
|
16
|
-
2. **Usar Eden Treaty nativo** - `const { data, error } = await api.endpoint()`
|
|
17
|
-
3. **Definir response schemas** - Para inferência automática e docs
|
|
18
|
-
4. **Manter types em `app/shared/`** - Compartilhados entre client/server
|
|
19
|
-
5. **Testar com `bun run dev`** - Verificar funcionamento em desenvolvimento
|
|
20
|
-
|
|
21
|
-
## 🏗️ **Padrão de Criação de Features**
|
|
22
|
-
|
|
23
|
-
### **📋 Fluxo Padrão (4 Passos)**
|
|
24
|
-
```
|
|
25
|
-
1. Types (app/shared/) → 2. Controller (app/server/) → 3. Routes (app/server/) → 4. Frontend (app/client/)
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### **1️⃣ Definir Types Compartilhados**
|
|
29
|
-
```typescript
|
|
30
|
-
// app/shared/types/[feature].ts
|
|
31
|
-
export interface Product {
|
|
32
|
-
id: number
|
|
33
|
-
name: string
|
|
34
|
-
price: number
|
|
35
|
-
createdAt: Date
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface CreateProductRequest {
|
|
39
|
-
name: string
|
|
40
|
-
price: number
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export interface ProductResponse {
|
|
44
|
-
success: boolean
|
|
45
|
-
product?: Product
|
|
46
|
-
message?: string
|
|
47
|
-
}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### **2️⃣ Criar Controller**
|
|
51
|
-
```typescript
|
|
52
|
-
// app/server/controllers/[feature].controller.ts
|
|
53
|
-
export class ProductsController {
|
|
54
|
-
static async getProducts() {
|
|
55
|
-
// Lógica de negócio
|
|
56
|
-
return { products: [...] }
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
static async createProduct(data: CreateProductRequest): Promise<ProductResponse> {
|
|
60
|
-
// Validação + criação
|
|
61
|
-
return { success: true, product: newProduct }
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### **3️⃣ Definir Routes com Schemas**
|
|
67
|
-
```typescript
|
|
68
|
-
// app/server/routes/[feature].routes.ts
|
|
69
|
-
import { Elysia, t } from "elysia"
|
|
70
|
-
|
|
71
|
-
export const productsRoutes = new Elysia({ prefix: "/products" })
|
|
72
|
-
.get("/", () => ProductsController.getProducts(), {
|
|
73
|
-
// ✅ CRÍTICO: Response schema para Eden Treaty
|
|
74
|
-
response: t.Object({
|
|
75
|
-
products: t.Array(t.Object({
|
|
76
|
-
id: t.Number(),
|
|
77
|
-
name: t.String(),
|
|
78
|
-
price: t.Number(),
|
|
79
|
-
createdAt: t.Date()
|
|
80
|
-
}))
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
.post("/", async ({ body }) => ProductsController.createProduct(body), {
|
|
84
|
-
body: t.Object({
|
|
85
|
-
name: t.String(),
|
|
86
|
-
price: t.Number({ minimum: 0 })
|
|
87
|
-
}),
|
|
88
|
-
response: t.Object({
|
|
89
|
-
success: t.Boolean(),
|
|
90
|
-
product: t.Optional(t.Object({...})),
|
|
91
|
-
message: t.Optional(t.String())
|
|
92
|
-
})
|
|
93
|
-
})
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### **4️⃣ Usar no Frontend**
|
|
97
|
-
```typescript
|
|
98
|
-
// app/client/src/components/ProductList.tsx
|
|
99
|
-
const { data: products, error } = await api.products.get()
|
|
100
|
-
|
|
101
|
-
if (error) {
|
|
102
|
-
console.log(`Error: ${error.status}`)
|
|
103
|
-
return
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// ✨ Eden Treaty infere: products = { products: Product[] }
|
|
107
|
-
products.products.forEach(product => {
|
|
108
|
-
console.log(product.name) // ✨ Type-safe!
|
|
109
|
-
})
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
## 🎯 **Padrões de Componentes React**
|
|
113
|
-
|
|
114
|
-
### **✅ Hook Personalizado (Recomendado)**
|
|
115
|
-
```typescript
|
|
116
|
-
// app/client/src/hooks/useProducts.ts
|
|
117
|
-
export function useProducts() {
|
|
118
|
-
const [products, setProducts] = useState<Product[]>([])
|
|
119
|
-
const [loading, setLoading] = useState(false)
|
|
120
|
-
|
|
121
|
-
const loadProducts = async () => {
|
|
122
|
-
setLoading(true)
|
|
123
|
-
const { data, error } = await api.products.get()
|
|
124
|
-
|
|
125
|
-
if (error) {
|
|
126
|
-
// Error handling
|
|
127
|
-
return
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
setProducts(data.products)
|
|
131
|
-
setLoading(false)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return { products, loading, loadProducts }
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### **✅ Componente com Hook**
|
|
139
|
-
```typescript
|
|
140
|
-
// app/client/src/components/ProductList.tsx
|
|
141
|
-
export function ProductList() {
|
|
142
|
-
const { products, loading, loadProducts } = useProducts()
|
|
143
|
-
|
|
144
|
-
useEffect(() => {
|
|
145
|
-
loadProducts()
|
|
146
|
-
}, [])
|
|
147
|
-
|
|
148
|
-
if (loading) return <div>Loading...</div>
|
|
149
|
-
|
|
150
|
-
return (
|
|
151
|
-
<div>
|
|
152
|
-
{products.map(product => (
|
|
153
|
-
<ProductCard key={product.id} product={product} />
|
|
154
|
-
))}
|
|
155
|
-
</div>
|
|
156
|
-
)
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
## 🔧 **Padrões de Error Handling**
|
|
161
|
-
|
|
162
|
-
### **✅ Padrão Global**
|
|
163
|
-
```typescript
|
|
164
|
-
// app/client/src/lib/error-utils.ts
|
|
165
|
-
export function getErrorMessage(error: any): string {
|
|
166
|
-
switch (error.status) {
|
|
167
|
-
case 400: return "Dados inválidos"
|
|
168
|
-
case 401: return "Acesso negado"
|
|
169
|
-
case 404: return "Não encontrado"
|
|
170
|
-
case 500: return "Erro do servidor"
|
|
171
|
-
default: return error.message || "Erro desconhecido"
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// Uso nos componentes
|
|
176
|
-
const { data, error } = await api.products.get()
|
|
177
|
-
|
|
178
|
-
if (error) {
|
|
179
|
-
const message = getErrorMessage(error)
|
|
180
|
-
showToast("error", message)
|
|
181
|
-
return
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
### **✅ Error Boundaries (React)**
|
|
186
|
-
```typescript
|
|
187
|
-
// app/client/src/components/ErrorBoundary.tsx
|
|
188
|
-
export class ErrorBoundary extends Component {
|
|
189
|
-
constructor(props) {
|
|
190
|
-
super(props)
|
|
191
|
-
this.state = { hasError: false }
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
static getDerivedStateFromError(error) {
|
|
195
|
-
return { hasError: true }
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
componentDidCatch(error, errorInfo) {
|
|
199
|
-
console.error('Error Boundary:', error, errorInfo)
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
render() {
|
|
203
|
-
if (this.state.hasError) {
|
|
204
|
-
return <div>Algo deu errado. Tente recarregar a página.</div>
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
return this.props.children
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
## 📁 **Estrutura de Arquivos**
|
|
213
|
-
|
|
214
|
-
### **✅ Organização Recomendada**
|
|
215
|
-
```
|
|
216
|
-
app/
|
|
217
|
-
├── shared/
|
|
218
|
-
│ └── types/
|
|
219
|
-
│ ├── index.ts # Re-exports principais
|
|
220
|
-
│ ├── user.ts # Types de usuário
|
|
221
|
-
│ ├── product.ts # Types de produto
|
|
222
|
-
│ └── common.ts # Types compartilhados
|
|
223
|
-
├── server/
|
|
224
|
-
│ ├── controllers/
|
|
225
|
-
│ │ ├── users.controller.ts
|
|
226
|
-
│ │ └── products.controller.ts
|
|
227
|
-
│ ├── routes/
|
|
228
|
-
│ │ ├── index.ts # Agregador de rotas
|
|
229
|
-
│ │ ├── users.routes.ts
|
|
230
|
-
│ │ └── products.routes.ts
|
|
231
|
-
│ └── app.ts # Export para Eden Treaty
|
|
232
|
-
└── client/
|
|
233
|
-
├── src/
|
|
234
|
-
│ ├── components/ # Componentes UI
|
|
235
|
-
│ ├── hooks/ # Hooks personalizados
|
|
236
|
-
│ ├── lib/ # Utilitários (Eden Treaty)
|
|
237
|
-
│ ├── pages/ # Páginas principais
|
|
238
|
-
│ └── utils/ # Funções auxiliares
|
|
239
|
-
└── public/ # Assets estáticos
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
## 🧪 **Padrões de Testing**
|
|
243
|
-
|
|
244
|
-
### **✅ Teste de API (Vitest)**
|
|
245
|
-
```typescript
|
|
246
|
-
// tests/api/products.test.ts
|
|
247
|
-
import { describe, it, expect } from 'vitest'
|
|
248
|
-
import { api } from '@/client/lib/eden-api'
|
|
249
|
-
|
|
250
|
-
describe('Products API', () => {
|
|
251
|
-
it('should create and retrieve product', async () => {
|
|
252
|
-
const { data: createResult, error: createError } = await api.products.post({
|
|
253
|
-
name: "Test Product",
|
|
254
|
-
price: 29.99
|
|
255
|
-
})
|
|
256
|
-
|
|
257
|
-
expect(createError).toBeUndefined()
|
|
258
|
-
expect(createResult.success).toBe(true)
|
|
259
|
-
|
|
260
|
-
const { data: getResult, error: getError } = await api.products.get()
|
|
261
|
-
expect(getError).toBeUndefined()
|
|
262
|
-
expect(getResult.products).toContainEqual(
|
|
263
|
-
expect.objectContaining({ name: "Test Product" })
|
|
264
|
-
)
|
|
265
|
-
})
|
|
266
|
-
})
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
### **✅ Teste de Hook (React Testing Library)**
|
|
270
|
-
```typescript
|
|
271
|
-
// tests/hooks/useProducts.test.ts
|
|
272
|
-
import { renderHook, waitFor } from '@testing-library/react'
|
|
273
|
-
import { useProducts } from '@/client/hooks/useProducts'
|
|
274
|
-
|
|
275
|
-
describe('useProducts', () => {
|
|
276
|
-
it('should load products', async () => {
|
|
277
|
-
const { result } = renderHook(() => useProducts())
|
|
278
|
-
|
|
279
|
-
await waitFor(() => {
|
|
280
|
-
expect(result.current.loading).toBe(false)
|
|
281
|
-
})
|
|
282
|
-
|
|
283
|
-
expect(result.current.products).toBeInstanceOf(Array)
|
|
284
|
-
})
|
|
285
|
-
})
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
## 🚀 **Comandos de Desenvolvimento**
|
|
289
|
-
|
|
290
|
-
### **✅ Desenvolvimento Local**
|
|
291
|
-
```bash
|
|
292
|
-
# Servidor completo (recomendado)
|
|
293
|
-
bun run dev
|
|
294
|
-
|
|
295
|
-
# Output limpo (sem logs HEAD do Elysia)
|
|
296
|
-
bun run dev:clean
|
|
297
|
-
|
|
298
|
-
# Apenas backend (porta 3001)
|
|
299
|
-
bun run dev:backend
|
|
300
|
-
|
|
301
|
-
# Apenas frontend (porta 5173)
|
|
302
|
-
bun run dev:frontend
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
### **✅ Build e Produção**
|
|
306
|
-
```bash
|
|
307
|
-
# Build completo
|
|
308
|
-
bun run build
|
|
309
|
-
|
|
310
|
-
# Servidor de produção
|
|
311
|
-
bun run start
|
|
312
|
-
|
|
313
|
-
# Testes
|
|
314
|
-
bun run test
|
|
315
|
-
bun run test:ui
|
|
316
|
-
bun run test:coverage
|
|
317
|
-
|
|
318
|
-
# Verificação de tipos
|
|
319
|
-
bunx tsc --noEmit
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
## 🔍 **Debugging e Troubleshooting**
|
|
323
|
-
|
|
324
|
-
### **✅ Logs Úteis**
|
|
325
|
-
```typescript
|
|
326
|
-
// Server-side debugging
|
|
327
|
-
console.log('Controller input:', body)
|
|
328
|
-
console.log('Controller output:', result)
|
|
329
|
-
|
|
330
|
-
// Client-side debugging
|
|
331
|
-
console.log('API call:', { endpoint: 'products', data })
|
|
332
|
-
console.log('API response:', { data, error })
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
### **✅ Verificações Comuns**
|
|
336
|
-
```bash
|
|
337
|
-
# 1. API funcionando?
|
|
338
|
-
curl http://localhost:3000/api/health
|
|
339
|
-
|
|
340
|
-
# 2. Swagger funcionando?
|
|
341
|
-
open http://localhost:3000/swagger
|
|
342
|
-
|
|
343
|
-
# 3. Frontend conectando?
|
|
344
|
-
open http://localhost:5173
|
|
345
|
-
|
|
346
|
-
# 4. Types corretos?
|
|
347
|
-
bunx tsc --noEmit
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
### **✅ Problemas Frequentes**
|
|
351
|
-
- **Types `unknown`**: Verificar response schemas nas rotas
|
|
352
|
-
- **CORS errors**: API e frontend em portas diferentes (normal)
|
|
353
|
-
- **404 na API**: Verificar prefix das rotas
|
|
354
|
-
- **Build errors**: Verificar imports e paths
|
|
355
|
-
|
|
356
|
-
## 📈 **Performance e Otimização**
|
|
357
|
-
|
|
358
|
-
### **✅ Boas Práticas**
|
|
359
|
-
```typescript
|
|
360
|
-
// 1. Memo para componentes caros
|
|
361
|
-
const ProductCard = memo(({ product }) => {
|
|
362
|
-
return <div>{product.name}</div>
|
|
363
|
-
})
|
|
364
|
-
|
|
365
|
-
// 2. useCallback para funções
|
|
366
|
-
const handleDelete = useCallback((id: number) => {
|
|
367
|
-
deleteProduct(id)
|
|
368
|
-
}, [deleteProduct])
|
|
369
|
-
|
|
370
|
-
// 3. Lazy loading para rotas
|
|
371
|
-
const ProductsPage = lazy(() => import('./pages/ProductsPage'))
|
|
372
|
-
|
|
373
|
-
// 4. Debounce para search
|
|
374
|
-
const debouncedSearch = useMemo(
|
|
375
|
-
() => debounce(searchProducts, 300),
|
|
376
|
-
[searchProducts]
|
|
377
|
-
)
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
---
|
|
381
|
-
|
|
382
|
-
**🎯 Seguindo estes padrões, você desenvolve features rapidamente com type safety garantida e código de alta qualidade!**
|