create-fluxstack 1.0.13 → 1.0.14

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.
Files changed (214) hide show
  1. package/.env.example +29 -29
  2. package/app/client/README.md +69 -69
  3. package/app/client/index.html +14 -13
  4. package/app/client/src/App.tsx +157 -524
  5. package/app/client/src/components/ErrorBoundary.tsx +107 -0
  6. package/app/client/src/components/ErrorDisplay.css +365 -0
  7. package/app/client/src/components/ErrorDisplay.tsx +258 -0
  8. package/app/client/src/components/FluxStackConfig.tsx +1321 -0
  9. package/app/client/src/components/HybridLiveCounter.tsx +140 -0
  10. package/app/client/src/components/LiveClock.tsx +286 -0
  11. package/app/client/src/components/MainLayout.tsx +390 -0
  12. package/app/client/src/components/SidebarNavigation.tsx +391 -0
  13. package/app/client/src/components/StateDemo.tsx +178 -0
  14. package/app/client/src/components/SystemMonitor.tsx +1038 -0
  15. package/app/client/src/components/Teste.tsx +104 -0
  16. package/app/client/src/components/UserProfile.tsx +809 -0
  17. package/app/client/src/hooks/useAuth.ts +39 -0
  18. package/app/client/src/hooks/useNotifications.ts +56 -0
  19. package/app/client/src/lib/eden-api.ts +189 -53
  20. package/app/client/src/lib/errors.ts +340 -0
  21. package/app/client/src/lib/hooks/useErrorHandler.ts +258 -0
  22. package/app/client/src/lib/index.ts +45 -0
  23. package/app/client/src/main.tsx +3 -2
  24. package/app/client/src/pages/ApiDocs.tsx +182 -0
  25. package/app/client/src/pages/Demo.tsx +174 -0
  26. package/app/client/src/pages/HybridLive.tsx +263 -0
  27. package/app/client/src/pages/Overview.tsx +155 -0
  28. package/app/client/src/store/README.md +43 -0
  29. package/app/client/src/store/index.ts +16 -0
  30. package/app/client/src/store/slices/uiSlice.ts +151 -0
  31. package/app/client/src/store/slices/userSlice.ts +161 -0
  32. package/app/client/src/test/README.md +257 -0
  33. package/app/client/src/test/setup.ts +70 -0
  34. package/app/client/src/test/types.ts +12 -0
  35. package/app/client/src/vite-env.d.ts +1 -1
  36. package/app/client/tsconfig.app.json +44 -43
  37. package/app/client/tsconfig.json +7 -7
  38. package/app/client/tsconfig.node.json +25 -25
  39. package/app/client/zustand-setup.md +65 -0
  40. package/app/server/controllers/users.controller.ts +68 -68
  41. package/app/server/index.ts +9 -1
  42. package/app/server/live/CounterComponent.ts +191 -0
  43. package/app/server/live/FluxStackConfig.ts +529 -0
  44. package/app/server/live/LiveClockComponent.ts +214 -0
  45. package/app/server/live/SidebarNavigation.ts +156 -0
  46. package/app/server/live/SystemMonitor.ts +594 -0
  47. package/app/server/live/SystemMonitorIntegration.ts +151 -0
  48. package/app/server/live/TesteComponent.ts +87 -0
  49. package/app/server/live/UserProfileComponent.ts +135 -0
  50. package/app/server/live/register-components.ts +28 -0
  51. package/app/server/middleware/auth.ts +136 -0
  52. package/app/server/middleware/errorHandling.ts +250 -0
  53. package/app/server/middleware/index.ts +10 -0
  54. package/app/server/middleware/rateLimit.ts +193 -0
  55. package/app/server/middleware/requestLogging.ts +215 -0
  56. package/app/server/middleware/validation.ts +270 -0
  57. package/app/server/routes/index.ts +14 -2
  58. package/app/server/routes/upload.ts +92 -0
  59. package/app/server/routes/users.routes.ts +2 -9
  60. package/app/server/services/NotificationService.ts +302 -0
  61. package/app/server/services/UserService.ts +222 -0
  62. package/app/server/services/index.ts +46 -0
  63. package/core/cli/commands/plugin-deps.ts +263 -0
  64. package/core/cli/generators/README.md +339 -0
  65. package/core/cli/generators/component.ts +770 -0
  66. package/core/cli/generators/controller.ts +299 -0
  67. package/core/cli/generators/index.ts +144 -0
  68. package/core/cli/generators/interactive.ts +228 -0
  69. package/core/cli/generators/prompts.ts +83 -0
  70. package/core/cli/generators/route.ts +513 -0
  71. package/core/cli/generators/service.ts +465 -0
  72. package/core/cli/generators/template-engine.ts +154 -0
  73. package/core/cli/generators/types.ts +71 -0
  74. package/core/cli/generators/utils.ts +192 -0
  75. package/core/cli/index.ts +69 -0
  76. package/core/cli/plugin-discovery.ts +16 -85
  77. package/core/client/fluxstack.ts +17 -0
  78. package/core/client/hooks/index.ts +7 -0
  79. package/core/client/hooks/state-validator.ts +130 -0
  80. package/core/client/hooks/useAuth.ts +49 -0
  81. package/core/client/hooks/useChunkedUpload.ts +258 -0
  82. package/core/client/hooks/useHybridLiveComponent.ts +967 -0
  83. package/core/client/hooks/useWebSocket.ts +373 -0
  84. package/core/client/index.ts +47 -0
  85. package/core/client/state/createStore.ts +193 -0
  86. package/core/client/state/index.ts +15 -0
  87. package/core/config/env-dynamic.ts +1 -1
  88. package/core/config/env.ts +2 -1
  89. package/core/config/runtime-config.ts +3 -3
  90. package/core/config/schema.ts +84 -49
  91. package/core/framework/server.ts +30 -0
  92. package/core/index.ts +25 -0
  93. package/core/live/ComponentRegistry.ts +399 -0
  94. package/core/live/types.ts +164 -0
  95. package/core/plugins/built-in/live-components/commands/create-live-component.ts +1201 -0
  96. package/core/plugins/built-in/live-components/index.ts +27 -0
  97. package/core/plugins/built-in/logger/index.ts +1 -1
  98. package/core/plugins/built-in/monitoring/index.ts +1 -1
  99. package/core/plugins/built-in/static/index.ts +1 -1
  100. package/core/plugins/built-in/swagger/index.ts +1 -1
  101. package/core/plugins/built-in/vite/index.ts +1 -1
  102. package/core/plugins/dependency-manager.ts +384 -0
  103. package/core/plugins/index.ts +5 -1
  104. package/core/plugins/manager.ts +7 -3
  105. package/core/plugins/registry.ts +88 -10
  106. package/core/plugins/types.ts +11 -11
  107. package/core/server/framework.ts +43 -0
  108. package/core/server/index.ts +11 -1
  109. package/core/server/live/ComponentRegistry.ts +1017 -0
  110. package/core/server/live/FileUploadManager.ts +272 -0
  111. package/core/server/live/LiveComponentPerformanceMonitor.ts +930 -0
  112. package/core/server/live/SingleConnectionManager.ts +0 -0
  113. package/core/server/live/StateSignature.ts +644 -0
  114. package/core/server/live/WebSocketConnectionManager.ts +688 -0
  115. package/core/server/live/websocket-plugin.ts +435 -0
  116. package/core/server/middleware/errorHandling.ts +141 -0
  117. package/core/server/middleware/index.ts +16 -0
  118. package/core/server/plugins/static-files-plugin.ts +232 -0
  119. package/core/server/services/BaseService.ts +95 -0
  120. package/core/server/services/ServiceContainer.ts +144 -0
  121. package/core/server/services/index.ts +9 -0
  122. package/core/templates/create-project.ts +46 -2
  123. package/core/testing/index.ts +10 -0
  124. package/core/testing/setup.ts +74 -0
  125. package/core/types/build.ts +38 -14
  126. package/core/types/types.ts +319 -0
  127. package/core/utils/env-runtime.ts +7 -0
  128. package/core/utils/errors/handlers.ts +264 -39
  129. package/core/utils/errors/index.ts +528 -18
  130. package/core/utils/errors/middleware.ts +114 -0
  131. package/core/utils/logger/formatters.ts +222 -0
  132. package/core/utils/logger/index.ts +167 -48
  133. package/core/utils/logger/middleware.ts +253 -0
  134. package/core/utils/logger/performance.ts +384 -0
  135. package/core/utils/logger/transports.ts +365 -0
  136. package/create-fluxstack.ts +296 -296
  137. package/fluxstack.config.ts +17 -1
  138. package/package-template.json +66 -66
  139. package/package.json +31 -6
  140. package/public/README.md +16 -0
  141. package/vite.config.ts +29 -14
  142. package/.claude/settings.local.json +0 -74
  143. package/.github/workflows/ci-build-tests.yml +0 -480
  144. package/.github/workflows/dependency-management.yml +0 -324
  145. package/.github/workflows/release-validation.yml +0 -355
  146. package/.kiro/specs/fluxstack-architecture-optimization/design.md +0 -700
  147. package/.kiro/specs/fluxstack-architecture-optimization/requirements.md +0 -127
  148. package/.kiro/specs/fluxstack-architecture-optimization/tasks.md +0 -330
  149. package/CLAUDE.md +0 -200
  150. package/Dockerfile +0 -58
  151. package/Dockerfile.backend +0 -52
  152. package/Dockerfile.frontend +0 -54
  153. package/README-Docker.md +0 -85
  154. package/ai-context/00-QUICK-START.md +0 -86
  155. package/ai-context/README.md +0 -88
  156. package/ai-context/development/eden-treaty-guide.md +0 -362
  157. package/ai-context/development/patterns.md +0 -382
  158. package/ai-context/development/plugins-guide.md +0 -572
  159. package/ai-context/examples/crud-complete.md +0 -626
  160. package/ai-context/project/architecture.md +0 -399
  161. package/ai-context/project/overview.md +0 -213
  162. package/ai-context/recent-changes/eden-treaty-refactor.md +0 -281
  163. package/ai-context/recent-changes/type-inference-fix.md +0 -223
  164. package/ai-context/reference/environment-vars.md +0 -384
  165. package/ai-context/reference/troubleshooting.md +0 -407
  166. package/app/client/src/components/TestPage.tsx +0 -453
  167. package/bun.lock +0 -1063
  168. package/bunfig.toml +0 -16
  169. package/core/__tests__/integration.test.ts +0 -227
  170. package/core/build/index.ts +0 -186
  171. package/core/config/__tests__/config-loader.test.ts +0 -554
  172. package/core/config/__tests__/config-merger.test.ts +0 -657
  173. package/core/config/__tests__/env-converter.test.ts +0 -372
  174. package/core/config/__tests__/env-processor.test.ts +0 -431
  175. package/core/config/__tests__/env.test.ts +0 -452
  176. package/core/config/__tests__/integration.test.ts +0 -418
  177. package/core/config/__tests__/loader.test.ts +0 -331
  178. package/core/config/__tests__/schema.test.ts +0 -129
  179. package/core/config/__tests__/validator.test.ts +0 -318
  180. package/core/framework/__tests__/server.test.ts +0 -233
  181. package/core/plugins/__tests__/built-in.test.ts.disabled +0 -366
  182. package/core/plugins/__tests__/manager.test.ts +0 -398
  183. package/core/plugins/__tests__/monitoring.test.ts +0 -401
  184. package/core/plugins/__tests__/registry.test.ts +0 -335
  185. package/core/utils/__tests__/errors.test.ts +0 -139
  186. package/core/utils/__tests__/helpers.test.ts +0 -297
  187. package/core/utils/__tests__/logger.test.ts +0 -141
  188. package/create-test-app.ts +0 -156
  189. package/docker-compose.microservices.yml +0 -75
  190. package/docker-compose.simple.yml +0 -57
  191. package/docker-compose.yml +0 -71
  192. package/eslint.config.js +0 -23
  193. package/flux-cli.ts +0 -214
  194. package/nginx-lb.conf +0 -37
  195. package/publish.sh +0 -63
  196. package/run-clean.ts +0 -26
  197. package/run-env-tests.ts +0 -313
  198. package/tailwind.config.js +0 -34
  199. package/tests/__mocks__/api.ts +0 -56
  200. package/tests/fixtures/users.ts +0 -69
  201. package/tests/integration/api/users.routes.test.ts +0 -221
  202. package/tests/setup.ts +0 -29
  203. package/tests/unit/app/client/App-simple.test.tsx +0 -56
  204. package/tests/unit/app/client/App.test.tsx.skip +0 -237
  205. package/tests/unit/app/client/eden-api.test.ts +0 -186
  206. package/tests/unit/app/client/simple.test.tsx +0 -23
  207. package/tests/unit/app/controllers/users.controller.test.ts +0 -150
  208. package/tests/unit/core/create-project.test.ts.skip +0 -95
  209. package/tests/unit/core/framework.test.ts +0 -144
  210. package/tests/unit/core/plugins/logger.test.ts.skip +0 -268
  211. package/tests/unit/core/plugins/vite.test.ts.disabled +0 -188
  212. package/tests/utils/test-helpers.ts +0 -61
  213. package/vitest.config.ts +0 -50
  214. package/workspace.json +0 -6
@@ -0,0 +1,161 @@
1
+ /**
2
+ * User Store
3
+ * App-specific user store using FluxStack core
4
+ */
5
+
6
+ // Temporary direct implementation until module resolution is fixed
7
+ import { create } from 'zustand'
8
+ import { persist, createJSONStorage } from 'zustand/middleware'
9
+
10
+ export interface BaseUser {
11
+ id: string
12
+ email: string
13
+ name: string
14
+ role: 'admin' | 'user'
15
+ }
16
+
17
+ // Type aliases for compatibility
18
+ export type User = BaseUser
19
+
20
+ export interface LoginCredentials {
21
+ email: string
22
+ password: string
23
+ }
24
+
25
+ export interface RegisterData {
26
+ email: string
27
+ password: string
28
+ name: string
29
+ }
30
+
31
+ export interface BaseUserStore {
32
+ currentUser: BaseUser | null
33
+ isAuthenticated: boolean
34
+ isLoading: boolean
35
+ error: string | null
36
+ login: (credentials: { email: string; password: string }) => Promise<void>
37
+ register: (data: { email: string; password: string; name: string }) => Promise<void>
38
+ logout: () => void
39
+ updateProfile: (data: Partial<BaseUser>) => Promise<void>
40
+ clearError: () => void
41
+ setLoading: (loading: boolean) => void
42
+ }
43
+
44
+ // Create user store using Zustand directly (temporary)
45
+ export const useUserStore = create<BaseUserStore>()(
46
+ persist(
47
+ (set, get) => ({
48
+ currentUser: null,
49
+ isAuthenticated: false,
50
+ isLoading: false,
51
+ error: null,
52
+
53
+ login: async (credentials) => {
54
+ set({ isLoading: true, error: null })
55
+ try {
56
+ const response = await fetch('/api/auth/login', {
57
+ method: 'POST',
58
+ headers: { 'Content-Type': 'application/json' },
59
+ body: JSON.stringify(credentials)
60
+ })
61
+
62
+ if (!response.ok) {
63
+ const error = await response.json()
64
+ throw new Error(error.message || 'Login failed')
65
+ }
66
+
67
+ const { user } = await response.json()
68
+ set({
69
+ currentUser: user,
70
+ isAuthenticated: true,
71
+ isLoading: false
72
+ })
73
+ } catch (error) {
74
+ set({
75
+ error: error instanceof Error ? error.message : 'Login failed',
76
+ isLoading: false
77
+ })
78
+ throw error
79
+ }
80
+ },
81
+
82
+ register: async (data) => {
83
+ set({ isLoading: true, error: null })
84
+ try {
85
+ const response = await fetch('/api/auth/register', {
86
+ method: 'POST',
87
+ headers: { 'Content-Type': 'application/json' },
88
+ body: JSON.stringify(data)
89
+ })
90
+
91
+ if (!response.ok) {
92
+ const error = await response.json()
93
+ throw new Error(error.message || 'Registration failed')
94
+ }
95
+
96
+ const { user } = await response.json()
97
+ set({
98
+ currentUser: user,
99
+ isAuthenticated: true,
100
+ isLoading: false
101
+ })
102
+ } catch (error) {
103
+ set({
104
+ error: error instanceof Error ? error.message : 'Registration failed',
105
+ isLoading: false
106
+ })
107
+ throw error
108
+ }
109
+ },
110
+
111
+ logout: () => {
112
+ fetch('/api/auth/logout', { method: 'POST' }).catch(console.error)
113
+ set({
114
+ currentUser: null,
115
+ isAuthenticated: false,
116
+ error: null
117
+ })
118
+ },
119
+
120
+ updateProfile: async (data) => {
121
+ const { currentUser } = get()
122
+ if (!currentUser) {
123
+ throw new Error('No user logged in')
124
+ }
125
+
126
+ set({ isLoading: true, error: null })
127
+ try {
128
+ const response = await fetch('/api/user/profile', {
129
+ method: 'PUT',
130
+ headers: { 'Content-Type': 'application/json' },
131
+ body: JSON.stringify(data)
132
+ })
133
+
134
+ if (!response.ok) {
135
+ const error = await response.json()
136
+ throw new Error(error.message || 'Profile update failed')
137
+ }
138
+
139
+ const { user } = await response.json()
140
+ set({
141
+ currentUser: user,
142
+ isLoading: false
143
+ })
144
+ } catch (error) {
145
+ set({
146
+ error: error instanceof Error ? error.message : 'Profile update failed',
147
+ isLoading: false
148
+ })
149
+ throw error
150
+ }
151
+ },
152
+
153
+ clearError: () => set({ error: null }),
154
+ setLoading: (loading) => set({ isLoading: loading })
155
+ }),
156
+ {
157
+ name: 'user-store',
158
+ storage: createJSONStorage(() => localStorage)
159
+ }
160
+ )
161
+ )
@@ -0,0 +1,257 @@
1
+ # FluxStack Testing Guide
2
+
3
+ Este guia explica como testar o sistema de estado baseado em Zustand no FluxStack.
4
+
5
+ ## 🧪 **Estrutura de Testes**
6
+
7
+ ```
8
+ app/client/src/
9
+ ├── store/
10
+ │ ├── __tests__/
11
+ │ │ ├── userSlice.test.ts # Testes do store de usuário
12
+ │ │ └── uiSlice.test.ts # Testes do store de UI
13
+ ├── hooks/
14
+ │ ├── __tests__/
15
+ │ │ ├── useAuth.test.ts # Testes do hook de auth
16
+ │ │ └── useNotifications.test.ts # Testes do hook de notificações
17
+ ├── components/
18
+ │ └── __tests__/
19
+ │ └── StateDemo.test.tsx # Testes de integração
20
+ └── test/
21
+ ├── setup.ts # Configuração global
22
+ ├── types.ts # Tipos para testes
23
+ └── README.md # Este arquivo
24
+ ```
25
+
26
+ ## 🔧 **Configuração**
27
+
28
+ ### Dependências necessárias:
29
+
30
+ ```json
31
+ {
32
+ "devDependencies": {
33
+ "@testing-library/jest-dom": "^6.1.4",
34
+ "@testing-library/react": "^13.4.0",
35
+ "@testing-library/user-event": "^14.5.1",
36
+ "jsdom": "^22.1.0",
37
+ "vitest": "^0.34.6"
38
+ }
39
+ }
40
+ ```
41
+
42
+ ### Configuração do Vitest:
43
+
44
+ O arquivo `vitest.config.ts` está configurado para:
45
+ - Usar jsdom como ambiente
46
+ - Configurar aliases para imports
47
+ - Incluir setup global
48
+ - Configurar coverage
49
+
50
+ ## 🧪 **Testando Stores Zustand**
51
+
52
+ ### Exemplo básico:
53
+
54
+ ```typescript
55
+ import { renderHook, act } from '@testing-library/react'
56
+ import { useUserStore } from '../slices/userSlice'
57
+
58
+ describe('useUserStore', () => {
59
+ beforeEach(() => {
60
+ // Reset store state
61
+ useUserStore.setState({
62
+ currentUser: null,
63
+ isAuthenticated: false,
64
+ isLoading: false,
65
+ error: null
66
+ })
67
+ })
68
+
69
+ it('should login successfully', async () => {
70
+ const { result } = renderHook(() => useUserStore())
71
+
72
+ await act(async () => {
73
+ await result.current.login({
74
+ email: 'test@example.com',
75
+ password: 'password'
76
+ })
77
+ })
78
+
79
+ expect(result.current.isAuthenticated).toBe(true)
80
+ })
81
+ })
82
+ ```
83
+
84
+ ### Padrões importantes:
85
+
86
+ 1. **Reset do estado**: Sempre resetar o store antes de cada teste
87
+ 2. **act()**: Usar `act()` para mudanças de estado assíncronas
88
+ 3. **Mock de APIs**: Mockar fetch para testes isolados
89
+
90
+ ## 🎯 **Testando Hooks Utilitários**
91
+
92
+ ```typescript
93
+ import { renderHook } from '@testing-library/react'
94
+ import { useAuth } from '../useAuth'
95
+
96
+ describe('useAuth', () => {
97
+ it('should detect admin user', () => {
98
+ // Set admin user in store
99
+ useUserStore.setState({
100
+ currentUser: { role: 'admin', /* ... */ },
101
+ isAuthenticated: true
102
+ })
103
+
104
+ const { result } = renderHook(() => useAuth())
105
+
106
+ expect(result.current.isAdmin).toBe(true)
107
+ })
108
+ })
109
+ ```
110
+
111
+ ## 🧩 **Testando Componentes com Estado**
112
+
113
+ ```typescript
114
+ import { render, screen, fireEvent } from '@testing-library/react'
115
+ import { MyComponent } from '../MyComponent'
116
+ import { useUIStore } from '../../store/slices/uiSlice'
117
+
118
+ describe('MyComponent', () => {
119
+ beforeEach(() => {
120
+ // Reset stores
121
+ useUIStore.setState({ /* initial state */ })
122
+ })
123
+
124
+ it('should update theme when button clicked', () => {
125
+ render(<MyComponent />)
126
+
127
+ fireEvent.click(screen.getByText('Dark Theme'))
128
+
129
+ expect(screen.getByText('Current theme: dark')).toBeInTheDocument()
130
+ })
131
+ })
132
+ ```
133
+
134
+ ## 🔄 **Mocking APIs**
135
+
136
+ ```typescript
137
+ // Mock fetch globally
138
+ global.fetch = vi.fn()
139
+
140
+ beforeEach(() => {
141
+ vi.resetAllMocks()
142
+ })
143
+
144
+ it('should handle API success', async () => {
145
+ // Mock successful response
146
+ ;(global.fetch as any).mockResolvedValueOnce({
147
+ ok: true,
148
+ json: async () => ({ user: mockUser })
149
+ })
150
+
151
+ // Test your component/hook
152
+ })
153
+ ```
154
+
155
+ ## 📊 **Coverage**
156
+
157
+ Execute testes com coverage:
158
+
159
+ ```bash
160
+ npm run test:coverage
161
+ ```
162
+
163
+ Isso gerará um relatório em `coverage/index.html`.
164
+
165
+ ## 🎨 **Boas Práticas**
166
+
167
+ ### 1. **Isolamento de Testes**
168
+ - Sempre resetar stores antes de cada teste
169
+ - Mockar APIs externas
170
+ - Não depender de ordem de execução
171
+
172
+ ### 2. **Testes Descritivos**
173
+ ```typescript
174
+ // ❌ Ruim
175
+ it('should work', () => { /* ... */ })
176
+
177
+ // ✅ Bom
178
+ it('should login successfully with valid credentials', () => { /* ... */ })
179
+ ```
180
+
181
+ ### 3. **Arrange-Act-Assert**
182
+ ```typescript
183
+ it('should add notification', () => {
184
+ // Arrange
185
+ const { result } = renderHook(() => useNotifications())
186
+
187
+ // Act
188
+ act(() => {
189
+ result.current.success('Title', 'Message')
190
+ })
191
+
192
+ // Assert
193
+ expect(result.current.notifications).toHaveLength(1)
194
+ })
195
+ ```
196
+
197
+ ### 4. **Testar Comportamentos, não Implementação**
198
+ ```typescript
199
+ // ❌ Ruim - testa implementação
200
+ expect(mockSetState).toHaveBeenCalledWith({ loading: true })
201
+
202
+ // ✅ Bom - testa comportamento
203
+ expect(result.current.isLoading).toBe(true)
204
+ ```
205
+
206
+ ## 🚀 **Executando Testes**
207
+
208
+ ```bash
209
+ # Todos os testes
210
+ npm run test:run
211
+
212
+ # Modo watch
213
+ npm run test:watch
214
+
215
+ # Com UI
216
+ npm run test:ui
217
+
218
+ # Apenas stores
219
+ npm run test:client -- store
220
+
221
+ # Apenas hooks
222
+ npm run test:client -- hooks
223
+
224
+ # Apenas componentes
225
+ npm run test:client -- components
226
+ ```
227
+
228
+ ## 🐛 **Debugging**
229
+
230
+ ### Console logs em testes:
231
+ ```typescript
232
+ it('should debug state', () => {
233
+ const { result } = renderHook(() => useUserStore())
234
+
235
+ console.log('Current state:', result.current)
236
+
237
+ // Seu teste aqui
238
+ })
239
+ ```
240
+
241
+ ### Usando screen.debug():
242
+ ```typescript
243
+ it('should render correctly', () => {
244
+ render(<MyComponent />)
245
+
246
+ screen.debug() // Mostra o DOM atual
247
+
248
+ // Seu teste aqui
249
+ })
250
+ ```
251
+
252
+ ## 📝 **Exemplos Completos**
253
+
254
+ Veja os arquivos de teste existentes para exemplos completos:
255
+ - `store/__tests__/userSlice.test.ts` - Testes de store
256
+ - `hooks/__tests__/useAuth.test.ts` - Testes de hooks
257
+ - `components/__tests__/StateDemo.test.tsx` - Testes de integração
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Test Setup
3
+ * Global test configuration and mocks
4
+ */
5
+
6
+ import { expect, afterEach, vi } from 'vitest'
7
+ import { cleanup } from '@testing-library/react'
8
+ import * as matchers from '@testing-library/jest-dom/matchers'
9
+
10
+ // Extend Vitest's expect with jest-dom matchers
11
+ expect.extend(matchers)
12
+
13
+ // Mock fetch with proper typing
14
+ global.fetch = vi.fn() as any
15
+
16
+ // Cleanup after each test case (e.g. clearing jsdom)
17
+ afterEach(() => {
18
+ cleanup()
19
+ })
20
+
21
+ // Mock window.matchMedia
22
+ Object.defineProperty(window, 'matchMedia', {
23
+ writable: true,
24
+ value: vi.fn().mockImplementation(query => ({
25
+ matches: false,
26
+ media: query,
27
+ onchange: null,
28
+ addListener: vi.fn(), // deprecated
29
+ removeListener: vi.fn(), // deprecated
30
+ addEventListener: vi.fn(),
31
+ removeEventListener: vi.fn(),
32
+ dispatchEvent: vi.fn(),
33
+ })),
34
+ })
35
+
36
+ // Mock window.ResizeObserver
37
+ global.ResizeObserver = vi.fn().mockImplementation(() => ({
38
+ observe: vi.fn(),
39
+ unobserve: vi.fn(),
40
+ disconnect: vi.fn(),
41
+ }))
42
+
43
+ // Mock localStorage
44
+ const localStorageMock = {
45
+ getItem: vi.fn(),
46
+ setItem: vi.fn(),
47
+ removeItem: vi.fn(),
48
+ clear: vi.fn(),
49
+ }
50
+ vi.stubGlobal('localStorage', localStorageMock)
51
+
52
+ // Mock sessionStorage
53
+ const sessionStorageMock = {
54
+ getItem: vi.fn(),
55
+ setItem: vi.fn(),
56
+ removeItem: vi.fn(),
57
+ clear: vi.fn(),
58
+ }
59
+ vi.stubGlobal('sessionStorage', sessionStorageMock)
60
+
61
+ // Mock console methods to reduce noise in tests
62
+ global.console = {
63
+ ...console,
64
+ // Uncomment to ignore console logs in tests
65
+ // log: vi.fn(),
66
+ // debug: vi.fn(),
67
+ // info: vi.fn(),
68
+ // warn: vi.fn(),
69
+ // error: vi.fn(),
70
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Test Types
3
+ * Type definitions for testing utilities
4
+ */
5
+
6
+ import '@testing-library/jest-dom'
7
+
8
+ declare global {
9
+ namespace Vi {
10
+ interface JestAssertion<T = any> extends jest.Matchers<void, T> {}
11
+ }
12
+ }
@@ -1 +1 @@
1
- /// <reference types="vite/client" />
1
+ /// <reference types="vite/client" />
@@ -1,43 +1,44 @@
1
- {
2
- "compilerOptions": {
3
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
- "target": "ES2022",
5
- "useDefineForClassFields": true,
6
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
- "module": "ESNext",
8
- "skipLibCheck": true,
9
-
10
- /* Bundler mode */
11
- "moduleResolution": "bundler",
12
- "allowImportingTsExtensions": true,
13
- "verbatimModuleSyntax": true,
14
- "moduleDetection": "force",
15
- "noEmit": true,
16
- "jsx": "react-jsx",
17
-
18
- /* Path mapping (alias support) */
19
- "baseUrl": ".",
20
- "paths": {
21
- "@/*": ["./src/*"],
22
- "@/components/*": ["./src/components/*"],
23
- "@/utils/*": ["./src/utils/*"],
24
- "@/hooks/*": ["./src/hooks/*"],
25
- "@/assets/*": ["./src/assets/*"],
26
- "@/lib/*": ["./src/lib/*"],
27
- "@/types/*": ["./src/types/*"],
28
- "@/shared/*": ["../shared/*"],
29
- "@/core/*": ["../../core/*"],
30
- "@/config/*": ["../../config/*"],
31
- "elysia": ["../../node_modules/elysia"]
32
- },
33
-
34
- /* Linting */
35
- "strict": true,
36
- "noUnusedLocals": true,
37
- "noUnusedParameters": true,
38
- "erasableSyntaxOnly": true,
39
- "noFallthroughCasesInSwitch": true,
40
- "noUncheckedSideEffectImports": true
41
- },
42
- "include": ["src"]
43
- }
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+ "target": "ES2022",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "skipLibCheck": true,
9
+
10
+ /* Bundler mode */
11
+ "moduleResolution": "bundler",
12
+ "allowImportingTsExtensions": true,
13
+ "verbatimModuleSyntax": true,
14
+ "moduleDetection": "force",
15
+ "noEmit": true,
16
+ "jsx": "react-jsx",
17
+
18
+ /* Path mapping (alias support) */
19
+ "baseUrl": ".",
20
+ "paths": {
21
+ "@/*": ["./src/*"],
22
+ "@/components/*": ["./src/components/*"],
23
+ "@/utils/*": ["./src/utils/*"],
24
+ "@/hooks/*": ["./src/hooks/*"],
25
+ "@/assets/*": ["./src/assets/*"],
26
+ "@/lib/*": ["./src/lib/*"],
27
+ "@/types/*": ["./src/types/*"],
28
+ "@/shared/*": ["../shared/*"],
29
+ "@/core/*": ["../../core/*"],
30
+ "@/config/*": ["../../config/*"],
31
+ "fluxstack": ["../../core/client/fluxstack"],
32
+ "elysia": ["../../node_modules/elysia"]
33
+ },
34
+
35
+ /* Linting */
36
+ "strict": true,
37
+ "noUnusedLocals": true,
38
+ "noUnusedParameters": true,
39
+ "erasableSyntaxOnly": true,
40
+ "noFallthroughCasesInSwitch": true,
41
+ "noUncheckedSideEffectImports": true
42
+ },
43
+ "include": ["src"]
44
+ }
@@ -1,7 +1,7 @@
1
- {
2
- "files": [],
3
- "references": [
4
- { "path": "./tsconfig.app.json" },
5
- { "path": "./tsconfig.node.json" }
6
- ]
7
- }
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ]
7
+ }
@@ -1,25 +1,25 @@
1
- {
2
- "compilerOptions": {
3
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
- "target": "ES2023",
5
- "lib": ["ES2023"],
6
- "module": "ESNext",
7
- "skipLibCheck": true,
8
-
9
- /* Bundler mode */
10
- "moduleResolution": "bundler",
11
- "allowImportingTsExtensions": true,
12
- "verbatimModuleSyntax": true,
13
- "moduleDetection": "force",
14
- "noEmit": true,
15
-
16
- /* Linting */
17
- "strict": true,
18
- "noUnusedLocals": true,
19
- "noUnusedParameters": true,
20
- "erasableSyntaxOnly": true,
21
- "noFallthroughCasesInSwitch": true,
22
- "noUncheckedSideEffectImports": true
23
- },
24
- "include": ["vite.config.ts"]
25
- }
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2023",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "verbatimModuleSyntax": true,
13
+ "moduleDetection": "force",
14
+ "noEmit": true,
15
+
16
+ /* Linting */
17
+ "strict": true,
18
+ "noUnusedLocals": true,
19
+ "noUnusedParameters": true,
20
+ "erasableSyntaxOnly": true,
21
+ "noFallthroughCasesInSwitch": true,
22
+ "noUncheckedSideEffectImports": true
23
+ },
24
+ "include": ["vite.config.ts"]
25
+ }