create-fluxstack 1.10.1 → 1.12.0

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 (257) hide show
  1. package/.dockerignore +1 -2
  2. package/Dockerfile +8 -8
  3. package/LLMD/INDEX.md +64 -0
  4. package/LLMD/MAINTENANCE.md +197 -0
  5. package/LLMD/MIGRATION.md +156 -0
  6. package/LLMD/config/.gitkeep +1 -0
  7. package/LLMD/config/declarative-system.md +268 -0
  8. package/LLMD/config/environment-vars.md +327 -0
  9. package/LLMD/config/runtime-reload.md +401 -0
  10. package/LLMD/core/.gitkeep +1 -0
  11. package/LLMD/core/build-system.md +599 -0
  12. package/LLMD/core/framework-lifecycle.md +229 -0
  13. package/LLMD/core/plugin-system.md +451 -0
  14. package/LLMD/patterns/.gitkeep +1 -0
  15. package/LLMD/patterns/anti-patterns.md +297 -0
  16. package/LLMD/patterns/project-structure.md +264 -0
  17. package/LLMD/patterns/type-safety.md +440 -0
  18. package/LLMD/reference/.gitkeep +1 -0
  19. package/LLMD/reference/cli-commands.md +250 -0
  20. package/LLMD/reference/plugin-hooks.md +357 -0
  21. package/LLMD/reference/routing.md +39 -0
  22. package/LLMD/reference/troubleshooting.md +364 -0
  23. package/LLMD/resources/.gitkeep +1 -0
  24. package/LLMD/resources/controllers.md +465 -0
  25. package/LLMD/resources/live-components.md +703 -0
  26. package/LLMD/resources/live-rooms.md +482 -0
  27. package/LLMD/resources/live-upload.md +130 -0
  28. package/LLMD/resources/plugins-external.md +617 -0
  29. package/LLMD/resources/routes-eden.md +254 -0
  30. package/README.md +37 -17
  31. package/app/client/index.html +0 -1
  32. package/app/client/src/App.tsx +107 -150
  33. package/app/client/src/components/AppLayout.tsx +68 -0
  34. package/app/client/src/components/BackButton.tsx +13 -0
  35. package/app/client/src/components/DemoPage.tsx +20 -0
  36. package/app/client/src/components/LiveUploadWidget.tsx +204 -0
  37. package/app/client/src/lib/eden-api.ts +85 -60
  38. package/app/client/src/live/ChatDemo.tsx +107 -0
  39. package/app/client/src/live/CounterDemo.tsx +206 -0
  40. package/app/client/src/live/FormDemo.tsx +119 -0
  41. package/app/client/src/live/RoomChatDemo.tsx +242 -0
  42. package/app/client/src/live/UploadDemo.tsx +21 -0
  43. package/app/client/src/main.tsx +4 -1
  44. package/app/client/src/pages/ApiTestPage.tsx +108 -0
  45. package/app/client/src/pages/HomePage.tsx +76 -0
  46. package/app/server/app.ts +1 -4
  47. package/app/server/controllers/users.controller.ts +36 -44
  48. package/app/server/index.ts +25 -35
  49. package/app/server/live/LiveChat.ts +77 -0
  50. package/app/server/live/LiveCounter.ts +67 -0
  51. package/app/server/live/LiveForm.ts +63 -0
  52. package/app/server/live/LiveLocalCounter.ts +32 -0
  53. package/app/server/live/LiveRoomChat.ts +285 -0
  54. package/app/server/live/LiveUpload.ts +81 -0
  55. package/app/server/routes/index.ts +3 -1
  56. package/app/server/routes/room.routes.ts +117 -0
  57. package/app/server/routes/users.routes.ts +35 -27
  58. package/app/shared/types/index.ts +14 -2
  59. package/config/app.config.ts +2 -62
  60. package/config/client.config.ts +2 -95
  61. package/config/database.config.ts +2 -99
  62. package/config/fluxstack.config.ts +25 -45
  63. package/config/index.ts +57 -38
  64. package/config/monitoring.config.ts +2 -114
  65. package/config/plugins.config.ts +2 -80
  66. package/config/server.config.ts +2 -68
  67. package/config/services.config.ts +2 -130
  68. package/config/system/app.config.ts +29 -0
  69. package/config/system/build.config.ts +49 -0
  70. package/config/system/client.config.ts +68 -0
  71. package/config/system/database.config.ts +17 -0
  72. package/config/system/fluxstack.config.ts +114 -0
  73. package/config/{logger.config.ts → system/logger.config.ts} +3 -1
  74. package/config/system/monitoring.config.ts +114 -0
  75. package/config/system/plugins.config.ts +84 -0
  76. package/config/{runtime.config.ts → system/runtime.config.ts} +1 -1
  77. package/config/system/server.config.ts +68 -0
  78. package/config/system/services.config.ts +46 -0
  79. package/config/{system.config.ts → system/system.config.ts} +1 -1
  80. package/core/build/flux-plugins-generator.ts +325 -325
  81. package/core/build/index.ts +39 -27
  82. package/core/build/live-components-generator.ts +3 -3
  83. package/core/build/optimizer.ts +235 -235
  84. package/core/cli/command-registry.ts +6 -4
  85. package/core/cli/commands/build.ts +79 -0
  86. package/core/cli/commands/create.ts +54 -0
  87. package/core/cli/commands/dev.ts +101 -0
  88. package/core/cli/commands/help.ts +34 -0
  89. package/core/cli/commands/index.ts +34 -0
  90. package/core/cli/commands/make-plugin.ts +90 -0
  91. package/core/cli/commands/plugin-add.ts +197 -0
  92. package/core/cli/commands/plugin-deps.ts +2 -2
  93. package/core/cli/commands/plugin-list.ts +208 -0
  94. package/core/cli/commands/plugin-remove.ts +170 -0
  95. package/core/cli/generators/component.ts +769 -769
  96. package/core/cli/generators/controller.ts +1 -1
  97. package/core/cli/generators/index.ts +146 -146
  98. package/core/cli/generators/interactive.ts +227 -227
  99. package/core/cli/generators/plugin.ts +2 -2
  100. package/core/cli/generators/prompts.ts +82 -82
  101. package/core/cli/generators/route.ts +6 -6
  102. package/core/cli/generators/service.ts +2 -2
  103. package/core/cli/generators/template-engine.ts +4 -3
  104. package/core/cli/generators/types.ts +2 -2
  105. package/core/cli/generators/utils.ts +191 -191
  106. package/core/cli/index.ts +115 -686
  107. package/core/cli/plugin-discovery.ts +2 -2
  108. package/core/client/LiveComponentsProvider.tsx +60 -8
  109. package/core/client/api/eden.ts +183 -0
  110. package/core/client/api/index.ts +11 -0
  111. package/core/client/components/Live.tsx +104 -0
  112. package/core/client/fluxstack.ts +1 -9
  113. package/core/client/hooks/AdaptiveChunkSizer.ts +215 -215
  114. package/core/client/hooks/state-validator.ts +1 -1
  115. package/core/client/hooks/useAuth.ts +48 -48
  116. package/core/client/hooks/useChunkedUpload.ts +85 -35
  117. package/core/client/hooks/useLiveChunkedUpload.ts +87 -0
  118. package/core/client/hooks/useLiveComponent.ts +800 -0
  119. package/core/client/hooks/useLiveUpload.ts +71 -0
  120. package/core/client/hooks/useRoom.ts +409 -0
  121. package/core/client/hooks/useRoomProxy.ts +382 -0
  122. package/core/client/index.ts +17 -68
  123. package/core/client/standalone-entry.ts +8 -0
  124. package/core/client/standalone.ts +74 -53
  125. package/core/client/state/createStore.ts +192 -192
  126. package/core/client/state/index.ts +14 -14
  127. package/core/config/index.ts +70 -291
  128. package/core/config/schema.ts +42 -723
  129. package/core/framework/client.ts +131 -131
  130. package/core/framework/index.ts +7 -7
  131. package/core/framework/server.ts +47 -40
  132. package/core/framework/types.ts +2 -2
  133. package/core/index.ts +23 -4
  134. package/core/live/ComponentRegistry.ts +3 -3
  135. package/core/live/types.ts +77 -0
  136. package/core/plugins/built-in/index.ts +134 -134
  137. package/core/plugins/built-in/live-components/commands/create-live-component.ts +242 -1066
  138. package/core/plugins/built-in/live-components/index.ts +1 -1
  139. package/core/plugins/built-in/monitoring/index.ts +111 -47
  140. package/core/plugins/built-in/static/index.ts +1 -1
  141. package/core/plugins/built-in/swagger/index.ts +68 -265
  142. package/core/plugins/built-in/vite/index.ts +85 -185
  143. package/core/plugins/built-in/vite/vite-dev.ts +10 -16
  144. package/core/plugins/config.ts +9 -7
  145. package/core/plugins/dependency-manager.ts +31 -1
  146. package/core/plugins/discovery.ts +19 -7
  147. package/core/plugins/executor.ts +2 -2
  148. package/core/plugins/index.ts +203 -203
  149. package/core/plugins/manager.ts +27 -39
  150. package/core/plugins/module-resolver.ts +19 -8
  151. package/core/plugins/registry.ts +255 -19
  152. package/core/plugins/types.ts +20 -53
  153. package/core/server/framework.ts +66 -43
  154. package/core/server/index.ts +15 -15
  155. package/core/server/live/ComponentRegistry.ts +78 -71
  156. package/core/server/live/FileUploadManager.ts +23 -10
  157. package/core/server/live/LiveComponentPerformanceMonitor.ts +1 -1
  158. package/core/server/live/LiveRoomManager.ts +261 -0
  159. package/core/server/live/RoomEventBus.ts +234 -0
  160. package/core/server/live/RoomStateManager.ts +172 -0
  161. package/core/server/live/StateSignature.ts +643 -643
  162. package/core/server/live/WebSocketConnectionManager.ts +30 -19
  163. package/core/server/live/auto-generated-components.ts +21 -9
  164. package/core/server/live/index.ts +14 -0
  165. package/core/server/live/websocket-plugin.ts +214 -67
  166. package/core/server/middleware/elysia-helpers.ts +7 -2
  167. package/core/server/middleware/errorHandling.ts +1 -1
  168. package/core/server/middleware/index.ts +31 -31
  169. package/core/server/plugins/database.ts +180 -180
  170. package/core/server/plugins/static-files-plugin.ts +69 -69
  171. package/core/server/plugins/swagger.ts +1 -1
  172. package/core/server/rooms/RoomBroadcaster.ts +357 -0
  173. package/core/server/rooms/RoomSystem.ts +463 -0
  174. package/core/server/rooms/index.ts +13 -0
  175. package/core/server/services/BaseService.ts +1 -1
  176. package/core/server/services/ServiceContainer.ts +1 -1
  177. package/core/server/services/index.ts +8 -8
  178. package/core/templates/create-project.ts +12 -12
  179. package/core/testing/index.ts +9 -9
  180. package/core/testing/setup.ts +73 -73
  181. package/core/types/api.ts +168 -168
  182. package/core/types/build.ts +219 -219
  183. package/core/types/config.ts +56 -26
  184. package/core/types/index.ts +4 -4
  185. package/core/types/plugin.ts +107 -107
  186. package/core/types/types.ts +353 -14
  187. package/core/utils/build-logger.ts +324 -324
  188. package/core/utils/config-schema.ts +480 -480
  189. package/core/utils/env.ts +2 -8
  190. package/core/utils/errors/codes.ts +114 -114
  191. package/core/utils/errors/handlers.ts +36 -1
  192. package/core/utils/errors/index.ts +49 -5
  193. package/core/utils/errors/middleware.ts +113 -113
  194. package/core/utils/helpers.ts +6 -16
  195. package/core/utils/index.ts +17 -17
  196. package/core/utils/logger/colors.ts +114 -114
  197. package/core/utils/logger/config.ts +13 -9
  198. package/core/utils/logger/formatter.ts +82 -82
  199. package/core/utils/logger/group-logger.ts +101 -101
  200. package/core/utils/logger/index.ts +6 -1
  201. package/core/utils/logger/stack-trace.ts +3 -1
  202. package/core/utils/logger/startup-banner.ts +82 -82
  203. package/core/utils/logger/winston-logger.ts +152 -152
  204. package/core/utils/monitoring/index.ts +211 -211
  205. package/core/utils/sync-version.ts +66 -66
  206. package/core/utils/version.ts +1 -1
  207. package/create-fluxstack.ts +8 -7
  208. package/package.json +12 -13
  209. package/plugins/crypto-auth/cli/make-protected-route.command.ts +1 -1
  210. package/plugins/crypto-auth/client/CryptoAuthClient.ts +302 -302
  211. package/plugins/crypto-auth/client/components/index.ts +11 -11
  212. package/plugins/crypto-auth/client/index.ts +11 -11
  213. package/plugins/crypto-auth/config/index.ts +1 -1
  214. package/plugins/crypto-auth/index.ts +4 -4
  215. package/plugins/crypto-auth/package.json +65 -65
  216. package/plugins/crypto-auth/server/AuthMiddleware.ts +1 -1
  217. package/plugins/crypto-auth/server/CryptoAuthService.ts +185 -185
  218. package/plugins/crypto-auth/server/index.ts +21 -21
  219. package/plugins/crypto-auth/server/middlewares/cryptoAuthAdmin.ts +3 -3
  220. package/plugins/crypto-auth/server/middlewares/cryptoAuthOptional.ts +1 -1
  221. package/plugins/crypto-auth/server/middlewares/cryptoAuthPermissions.ts +2 -2
  222. package/plugins/crypto-auth/server/middlewares/cryptoAuthRequired.ts +2 -2
  223. package/plugins/crypto-auth/server/middlewares/helpers.ts +1 -1
  224. package/plugins/crypto-auth/server/middlewares/index.ts +22 -22
  225. package/tsconfig.api-strict.json +16 -0
  226. package/tsconfig.json +48 -52
  227. package/{app/client/tsconfig.node.json → tsconfig.node.json} +25 -25
  228. package/types/global.d.ts +29 -29
  229. package/types/vitest.d.ts +8 -8
  230. package/vite.config.ts +38 -62
  231. package/vitest.config.live.ts +10 -9
  232. package/vitest.config.ts +29 -17
  233. package/app/client/README.md +0 -69
  234. package/app/client/SIMPLIFICATION.md +0 -140
  235. package/app/client/frontend-only.ts +0 -12
  236. package/app/client/src/live/FileUploadExample.tsx +0 -359
  237. package/app/client/src/live/MinimalLiveClock.tsx +0 -47
  238. package/app/client/src/live/QuickUploadTest.tsx +0 -193
  239. package/app/client/tsconfig.app.json +0 -45
  240. package/app/client/tsconfig.json +0 -7
  241. package/app/client/zustand-setup.md +0 -65
  242. package/app/server/backend-only.ts +0 -18
  243. package/app/server/live/LiveClockComponent.ts +0 -215
  244. package/app/server/live/LiveFileUploadComponent.ts +0 -77
  245. package/app/server/routes/env-test.ts +0 -110
  246. package/core/client/hooks/index.ts +0 -7
  247. package/core/client/hooks/useHybridLiveComponent.ts +0 -685
  248. package/core/client/hooks/useTypedLiveComponent.ts +0 -133
  249. package/core/client/hooks/useWebSocket.ts +0 -361
  250. package/core/config/env.ts +0 -546
  251. package/core/config/loader.ts +0 -522
  252. package/core/config/runtime-config.ts +0 -327
  253. package/core/config/validator.ts +0 -540
  254. package/core/server/backend-entry.ts +0 -51
  255. package/core/server/standalone.ts +0 -106
  256. package/core/utils/regenerate-files.ts +0 -69
  257. package/fluxstack.config.ts +0 -354
@@ -1,193 +1,193 @@
1
- /**
2
- * Store Factory
3
- * Core FluxStack state management utilities
4
- */
5
-
6
- import { create } from 'zustand'
7
- import { persist, createJSONStorage } from 'zustand/middleware'
8
-
9
- export interface StoreOptions<T> {
10
- name?: string
11
- persist?: boolean
12
- storage?: 'localStorage' | 'sessionStorage'
13
- version?: number
14
- migrate?: (persistedState: unknown, version: number) => T
15
- }
16
-
17
- /**
18
- * Create a Zustand store with FluxStack conventions
19
- */
20
- export function createFluxStore<T>(
21
- storeFactory: (set: any, get: any) => T,
22
- options: StoreOptions<T> = {}
23
- ) {
24
- const { name, persist: shouldPersist = false, storage = 'localStorage', version = 1, migrate } = options
25
-
26
- if (shouldPersist && name) {
27
- return create<T>()(
28
- persist(
29
- storeFactory,
30
- {
31
- name,
32
- storage: createJSONStorage(() =>
33
- storage === 'localStorage' ? localStorage : sessionStorage
34
- ),
35
- version,
36
- migrate: migrate as any,
37
- onRehydrateStorage: () => (state) => {
38
- console.log('FluxStack: Store rehydrated', name, state)
39
- }
40
- }
41
- )
42
- )
43
- }
44
-
45
- return create<T>()(storeFactory)
46
- }
47
-
48
- /**
49
- * Base user store interface
50
- */
51
- export interface BaseUser {
52
- id: string
53
- email: string
54
- name: string
55
- role: 'admin' | 'user'
56
- }
57
-
58
- export interface BaseUserStore {
59
- currentUser: BaseUser | null
60
- isAuthenticated: boolean
61
- isLoading: boolean
62
- error: string | null
63
- login: (credentials: { email: string; password: string }) => Promise<void>
64
- register: (data: { email: string; password: string; name: string }) => Promise<void>
65
- logout: () => void
66
- updateProfile: (data: Partial<BaseUser>) => Promise<void>
67
- clearError: () => void
68
- setLoading: (loading: boolean) => void
69
- }
70
-
71
- /**
72
- * Create user store with FluxStack conventions
73
- */
74
- export function createUserStore(options: StoreOptions<BaseUserStore> = {}) {
75
- return createFluxStore<BaseUserStore>(
76
- (set, get) => ({
77
- currentUser: null,
78
- isAuthenticated: false,
79
- isLoading: false,
80
- error: null,
81
-
82
- login: async (credentials) => {
83
- set({ isLoading: true, error: null })
84
- try {
85
- const response = await fetch('/api/auth/login', {
86
- method: 'POST',
87
- headers: { 'Content-Type': 'application/json' },
88
- body: JSON.stringify(credentials)
89
- })
90
-
91
- if (!response.ok) {
92
- const error = await response.json()
93
- throw new Error(error.message || 'Login 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 : 'Login failed',
105
- isLoading: false
106
- })
107
- throw error
108
- }
109
- },
110
-
111
- register: async (data) => {
112
- set({ isLoading: true, error: null })
113
- try {
114
- const response = await fetch('/api/auth/register', {
115
- method: 'POST',
116
- headers: { 'Content-Type': 'application/json' },
117
- body: JSON.stringify(data)
118
- })
119
-
120
- if (!response.ok) {
121
- const error = await response.json()
122
- throw new Error(error.message || 'Registration failed')
123
- }
124
-
125
- const { user } = await response.json()
126
- set({
127
- currentUser: user,
128
- isAuthenticated: true,
129
- isLoading: false
130
- })
131
- } catch (error) {
132
- set({
133
- error: error instanceof Error ? error.message : 'Registration failed',
134
- isLoading: false
135
- })
136
- throw error
137
- }
138
- },
139
-
140
- logout: () => {
141
- // Call logout API
142
- fetch('/api/auth/logout', { method: 'POST' }).catch(console.error)
143
-
144
- set({
145
- currentUser: null,
146
- isAuthenticated: false,
147
- error: null
148
- })
149
- },
150
-
151
- updateProfile: async (data) => {
152
- const { currentUser } = get()
153
- if (!currentUser) {
154
- throw new Error('No user logged in')
155
- }
156
-
157
- set({ isLoading: true, error: null })
158
- try {
159
- const response = await fetch('/api/user/profile', {
160
- method: 'PUT',
161
- headers: { 'Content-Type': 'application/json' },
162
- body: JSON.stringify(data)
163
- })
164
-
165
- if (!response.ok) {
166
- const error = await response.json()
167
- throw new Error(error.message || 'Profile update failed')
168
- }
169
-
170
- const { user } = await response.json()
171
- set({
172
- currentUser: user,
173
- isLoading: false
174
- })
175
- } catch (error) {
176
- set({
177
- error: error instanceof Error ? error.message : 'Profile update failed',
178
- isLoading: false
179
- })
180
- throw error
181
- }
182
- },
183
-
184
- clearError: () => set({ error: null }),
185
- setLoading: (loading) => set({ isLoading: loading })
186
- }),
187
- {
188
- name: 'user-store',
189
- persist: true,
190
- ...options
191
- }
192
- )
1
+ /**
2
+ * Store Factory
3
+ * Core FluxStack state management utilities
4
+ */
5
+
6
+ import { create } from 'zustand'
7
+ import { persist, createJSONStorage } from 'zustand/middleware'
8
+
9
+ export interface StoreOptions<T> {
10
+ name?: string
11
+ persist?: boolean
12
+ storage?: 'localStorage' | 'sessionStorage'
13
+ version?: number
14
+ migrate?: (persistedState: unknown, version: number) => T
15
+ }
16
+
17
+ /**
18
+ * Create a Zustand store with FluxStack conventions
19
+ */
20
+ export function createFluxStore<T>(
21
+ storeFactory: (set: any, get: any) => T,
22
+ options: StoreOptions<T> = {}
23
+ ) {
24
+ const { name, persist: shouldPersist = false, storage = 'localStorage', version = 1, migrate } = options
25
+
26
+ if (shouldPersist && name) {
27
+ return create<T>()(
28
+ persist(
29
+ storeFactory,
30
+ {
31
+ name,
32
+ storage: createJSONStorage(() =>
33
+ storage === 'localStorage' ? localStorage : sessionStorage
34
+ ),
35
+ version,
36
+ migrate: migrate as any,
37
+ onRehydrateStorage: () => (state) => {
38
+ console.log('FluxStack: Store rehydrated', name, state)
39
+ }
40
+ }
41
+ )
42
+ )
43
+ }
44
+
45
+ return create<T>()(storeFactory)
46
+ }
47
+
48
+ /**
49
+ * Base user store interface
50
+ */
51
+ export interface BaseUser {
52
+ id: string
53
+ email: string
54
+ name: string
55
+ role: 'admin' | 'user'
56
+ }
57
+
58
+ export interface BaseUserStore {
59
+ currentUser: BaseUser | null
60
+ isAuthenticated: boolean
61
+ isLoading: boolean
62
+ error: string | null
63
+ login: (credentials: { email: string; password: string }) => Promise<void>
64
+ register: (data: { email: string; password: string; name: string }) => Promise<void>
65
+ logout: () => void
66
+ updateProfile: (data: Partial<BaseUser>) => Promise<void>
67
+ clearError: () => void
68
+ setLoading: (loading: boolean) => void
69
+ }
70
+
71
+ /**
72
+ * Create user store with FluxStack conventions
73
+ */
74
+ export function createUserStore(options: StoreOptions<BaseUserStore> = {}) {
75
+ return createFluxStore<BaseUserStore>(
76
+ (set, get) => ({
77
+ currentUser: null,
78
+ isAuthenticated: false,
79
+ isLoading: false,
80
+ error: null,
81
+
82
+ login: async (credentials) => {
83
+ set({ isLoading: true, error: null })
84
+ try {
85
+ const response = await fetch('/api/auth/login', {
86
+ method: 'POST',
87
+ headers: { 'Content-Type': 'application/json' },
88
+ body: JSON.stringify(credentials)
89
+ })
90
+
91
+ if (!response.ok) {
92
+ const error = await response.json()
93
+ throw new Error(error.message || 'Login 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 : 'Login failed',
105
+ isLoading: false
106
+ })
107
+ throw error
108
+ }
109
+ },
110
+
111
+ register: async (data) => {
112
+ set({ isLoading: true, error: null })
113
+ try {
114
+ const response = await fetch('/api/auth/register', {
115
+ method: 'POST',
116
+ headers: { 'Content-Type': 'application/json' },
117
+ body: JSON.stringify(data)
118
+ })
119
+
120
+ if (!response.ok) {
121
+ const error = await response.json()
122
+ throw new Error(error.message || 'Registration failed')
123
+ }
124
+
125
+ const { user } = await response.json()
126
+ set({
127
+ currentUser: user,
128
+ isAuthenticated: true,
129
+ isLoading: false
130
+ })
131
+ } catch (error) {
132
+ set({
133
+ error: error instanceof Error ? error.message : 'Registration failed',
134
+ isLoading: false
135
+ })
136
+ throw error
137
+ }
138
+ },
139
+
140
+ logout: () => {
141
+ // Call logout API
142
+ fetch('/api/auth/logout', { method: 'POST' }).catch(console.error)
143
+
144
+ set({
145
+ currentUser: null,
146
+ isAuthenticated: false,
147
+ error: null
148
+ })
149
+ },
150
+
151
+ updateProfile: async (data) => {
152
+ const { currentUser } = get()
153
+ if (!currentUser) {
154
+ throw new Error('No user logged in')
155
+ }
156
+
157
+ set({ isLoading: true, error: null })
158
+ try {
159
+ const response = await fetch('/api/user/profile', {
160
+ method: 'PUT',
161
+ headers: { 'Content-Type': 'application/json' },
162
+ body: JSON.stringify(data)
163
+ })
164
+
165
+ if (!response.ok) {
166
+ const error = await response.json()
167
+ throw new Error(error.message || 'Profile update failed')
168
+ }
169
+
170
+ const { user } = await response.json()
171
+ set({
172
+ currentUser: user,
173
+ isLoading: false
174
+ })
175
+ } catch (error) {
176
+ set({
177
+ error: error instanceof Error ? error.message : 'Profile update failed',
178
+ isLoading: false
179
+ })
180
+ throw error
181
+ }
182
+ },
183
+
184
+ clearError: () => set({ error: null }),
185
+ setLoading: (loading) => set({ isLoading: loading })
186
+ }),
187
+ {
188
+ name: 'user-store',
189
+ persist: true,
190
+ ...options
191
+ }
192
+ )
193
193
  }
@@ -1,15 +1,15 @@
1
- /**
2
- * Core Client State Management
3
- * FluxStack state utilities exports
4
- */
5
-
6
- export {
7
- createFluxStore,
8
- createUserStore
9
- } from './createStore'
10
-
11
- export type {
12
- StoreOptions,
13
- BaseUser,
14
- BaseUserStore
1
+ /**
2
+ * Core Client State Management
3
+ * FluxStack state utilities exports
4
+ */
5
+
6
+ export {
7
+ createFluxStore,
8
+ createUserStore
9
+ } from './createStore'
10
+
11
+ export type {
12
+ StoreOptions,
13
+ BaseUser,
14
+ BaseUserStore
15
15
  } from './createStore'