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
@@ -0,0 +1,357 @@
1
+ # Plugin Hooks Reference
2
+
3
+ **Version:** 1.11.0 | **Updated:** 2025-02-08
4
+
5
+ ## Quick Facts
6
+
7
+ - Hooks are defined in `core/plugins/types.ts`
8
+ - Execution order follows plugin priority (highest → lowest)
9
+ - All hooks receive typed contexts
10
+ - Hooks can be async (return Promise)
11
+
12
+ ## Hook Categories
13
+
14
+ 1. **Lifecycle Hooks** - Server startup/shutdown
15
+ 2. **Request Pipeline Hooks** - HTTP request/response processing
16
+ 3. **Build Pipeline Hooks** - Build process events
17
+ 4. **Plugin System Hooks** - Plugin registration events
18
+
19
+ ## Execution Order
20
+
21
+ ### Server Startup Sequence
22
+
23
+ ```
24
+ onConfigLoad → setup → onBeforeServerStart → onServerStart → onAfterServerStart
25
+ ```
26
+
27
+ ### Request Processing Sequence
28
+
29
+ ```
30
+ onRequest → onRequestValidation → onBeforeRoute → [handler] → onAfterRoute → onBeforeResponse → onResponseTransform → onResponse
31
+ ```
32
+
33
+ ### Error Handling
34
+
35
+ ```
36
+ [error occurs] → onError → onBeforeResponse → onResponse
37
+ ```
38
+
39
+ ### Server Shutdown Sequence
40
+
41
+ ```
42
+ onBeforeServerStop → onServerStop
43
+ ```
44
+
45
+ ### Build Sequence
46
+
47
+ ```
48
+ onBeforeBuild → onBuild → onBuildAsset (per asset) → onBuildComplete
49
+ [on error] → onBuildError
50
+ ```
51
+
52
+ ## Lifecycle Hooks
53
+
54
+ | Hook | Context | When Called | Use Case |
55
+ |------|---------|-------------|----------|
56
+ | `setup` | `PluginContext` | After plugin load, before server | Initialize plugin, register Elysia plugins |
57
+ | `onConfigLoad` | `ConfigLoadContext` | Config loaded | Validate/modify configuration |
58
+ | `onBeforeServerStart` | `PluginContext` | Before server.listen() | Pre-flight checks, connections |
59
+ | `onServerStart` | `PluginContext` | Server starting | Register routes, middleware |
60
+ | `onAfterServerStart` | `PluginContext` | Server fully started | Log ready status, health checks |
61
+ | `onBeforeServerStop` | `PluginContext` | Before shutdown | Start graceful shutdown |
62
+ | `onServerStop` | `PluginContext` | Server stopped | Cleanup connections, resources |
63
+
64
+ ### Context Types
65
+
66
+ ```typescript
67
+ interface PluginContext {
68
+ config: FluxStackConfig
69
+ logger: Logger
70
+ app: Elysia // The Elysia app instance
71
+ utils: PluginUtils
72
+ registry?: PluginRegistry
73
+ }
74
+
75
+ interface ConfigLoadContext {
76
+ config: FluxStackConfig
77
+ envVars: Record<string, string | undefined>
78
+ configPath?: string
79
+ }
80
+ ```
81
+
82
+ ### Example: Lifecycle Hook
83
+
84
+ ```typescript
85
+ const myPlugin: FluxStack.Plugin = {
86
+ name: 'my-plugin',
87
+ version: '1.0.0',
88
+
89
+ setup: async ({ app, logger }) => {
90
+ logger.info('Plugin initializing')
91
+
92
+ // Register Elysia plugin
93
+ app.use(myElysiaPlugin())
94
+ },
95
+
96
+ onAfterServerStart: ({ config, logger }) => {
97
+ logger.info(`Server running on port ${config.server.port}`)
98
+ }
99
+ }
100
+ ```
101
+
102
+ ## Request Pipeline Hooks
103
+
104
+ | Hook | Context | When Called | Use Case |
105
+ |------|---------|-------------|----------|
106
+ | `onRequest` | `RequestContext` | Request received | Logging, rate limiting, auth check |
107
+ | `onRequestValidation` | `ValidationContext` | After validation | Custom validation, error formatting |
108
+ | `onBeforeRoute` | `RequestContext` | Before handler | Modify request, inject data |
109
+ | `onAfterRoute` | `RouteContext` | After handler | Logging, metrics |
110
+ | `onBeforeResponse` | `ResponseContext` | Before sending | Modify response, add headers |
111
+ | `onResponseTransform` | `TransformContext` | Transform response | Compression, encryption |
112
+ | `onResponse` | `ResponseContext` | Response sent | Access logs, analytics |
113
+ | `onError` | `ErrorContext` | On any error | Error logging, custom responses |
114
+
115
+ ### Context Types
116
+
117
+ ```typescript
118
+ interface RequestContext {
119
+ request: Request
120
+ path: string
121
+ method: string
122
+ headers: Record<string, string>
123
+ query: Record<string, string>
124
+ params: Record<string, string>
125
+ body?: any
126
+ user?: any
127
+ startTime: number
128
+ handled?: boolean
129
+ response?: Response
130
+ }
131
+
132
+ interface ResponseContext extends RequestContext {
133
+ response: Response
134
+ statusCode: number
135
+ duration: number
136
+ size?: number
137
+ }
138
+
139
+ interface ValidationContext extends RequestContext {
140
+ errors: Array<{ field: string; message: string; code: string }>
141
+ isValid: boolean
142
+ }
143
+
144
+ interface ErrorContext extends RequestContext {
145
+ error: Error
146
+ duration: number
147
+ handled: boolean
148
+ }
149
+
150
+ interface RouteContext extends RequestContext {
151
+ route?: string
152
+ handler?: Function
153
+ params: Record<string, string>
154
+ }
155
+
156
+ interface TransformContext extends ResponseContext {
157
+ transformed: boolean
158
+ originalResponse?: Response
159
+ }
160
+ ```
161
+
162
+ ### Example: Request Hook
163
+
164
+ ```typescript
165
+ const authPlugin: FluxStack.Plugin = {
166
+ name: 'auth-plugin',
167
+
168
+ onRequest: async ({ request, headers }) => {
169
+ const token = headers['authorization']
170
+ if (token) {
171
+ // Validate token and attach user
172
+ const user = await validateToken(token)
173
+ return { user } // Merged into context
174
+ }
175
+ },
176
+
177
+ onError: ({ error, path, method, logger }) => {
178
+ logger.error(`${method} ${path} failed: ${error.message}`)
179
+ }
180
+ }
181
+ ```
182
+
183
+ ## Build Pipeline Hooks
184
+
185
+ | Hook | Context | When Called | Use Case |
186
+ |------|---------|-------------|----------|
187
+ | `onBeforeBuild` | `BuildContext` | Before build starts | Setup, validation |
188
+ | `onBuild` | `BuildContext` | Build in progress | Custom build steps |
189
+ | `onBuildAsset` | `BuildAssetContext` | Per asset processed | Transform, optimize assets |
190
+ | `onBuildComplete` | `BuildContext` | Build finished | Post-processing, notifications |
191
+ | `onBuildError` | `BuildErrorContext` | Build failed | Error reporting |
192
+
193
+ ### Context Types
194
+
195
+ ```typescript
196
+ interface BuildContext {
197
+ target: string
198
+ outDir: string
199
+ mode: 'development' | 'production'
200
+ config: FluxStackConfig
201
+ }
202
+
203
+ interface BuildAssetContext {
204
+ assetPath: string
205
+ assetType: 'js' | 'css' | 'html' | 'image' | 'font' | 'other'
206
+ size: number
207
+ content?: string | Buffer
208
+ }
209
+
210
+ interface BuildErrorContext {
211
+ error: Error
212
+ file?: string
213
+ line?: number
214
+ column?: number
215
+ }
216
+ ```
217
+
218
+ ### Example: Build Hook
219
+
220
+ ```typescript
221
+ const optimizerPlugin: FluxStack.Plugin = {
222
+ name: 'optimizer',
223
+
224
+ onBuildAsset: ({ assetPath, assetType, size }) => {
225
+ console.log(`Processing ${assetType}: ${assetPath} (${size} bytes)`)
226
+ },
227
+
228
+ onBuildComplete: ({ outDir, mode }) => {
229
+ console.log(`Build complete: ${outDir} (${mode})`)
230
+ }
231
+ }
232
+ ```
233
+
234
+ ## Plugin System Hooks
235
+
236
+ | Hook | Context | When Called | Use Case |
237
+ |------|---------|-------------|----------|
238
+ | `onPluginRegister` | `PluginEventContext` | Plugin registered | Log, notify |
239
+ | `onPluginUnregister` | `PluginEventContext` | Plugin removed | Cleanup |
240
+ | `onPluginError` | `PluginEventContext & { error }` | Plugin error | Error handling |
241
+
242
+ ### Context Types
243
+
244
+ ```typescript
245
+ interface PluginEventContext {
246
+ pluginName: string
247
+ pluginVersion?: string
248
+ timestamp: number
249
+ data?: any
250
+ }
251
+ ```
252
+
253
+ ## Plugin Utilities
254
+
255
+ Available via `context.utils`:
256
+
257
+ ```typescript
258
+ interface PluginUtils {
259
+ createTimer: (label: string) => { end: () => number }
260
+ formatBytes: (bytes: number) => string
261
+ isProduction: () => boolean
262
+ isDevelopment: () => boolean
263
+ getEnvironment: () => string
264
+ createHash: (data: string) => string
265
+ deepMerge: (target: any, source: any) => any
266
+ validateSchema: (data: any, schema: any) => { valid: boolean; errors: string[] }
267
+ }
268
+ ```
269
+
270
+ ### Example: Using Utilities
271
+
272
+ ```typescript
273
+ const metricsPlugin: FluxStack.Plugin = {
274
+ name: 'metrics',
275
+
276
+ onRequest: ({ utils }) => {
277
+ const timer = utils.createTimer('request')
278
+ return { timer } // Pass to response hook
279
+ },
280
+
281
+ onResponse: ({ timer, utils }) => {
282
+ const duration = timer?.end()
283
+ if (utils.isProduction()) {
284
+ sendMetric('request_duration', duration)
285
+ }
286
+ }
287
+ }
288
+ ```
289
+
290
+ ## Hook Priority
291
+
292
+ Plugins execute in priority order:
293
+
294
+ ```typescript
295
+ type PluginPriority = 'highest' | 'high' | 'normal' | 'low' | 'lowest' | number
296
+
297
+ const plugin: FluxStack.Plugin = {
298
+ name: 'high-priority-plugin',
299
+ priority: 'high', // or numeric: 100 (higher = earlier)
300
+ // ...
301
+ }
302
+ ```
303
+
304
+ | Priority | Numeric | Order |
305
+ |----------|---------|-------|
306
+ | `highest` | 1000 | First |
307
+ | `high` | 100 | Second |
308
+ | `normal` | 0 | Default |
309
+ | `low` | -100 | Fourth |
310
+ | `lowest` | -1000 | Last |
311
+
312
+ ## Hook Execution Options
313
+
314
+ ```typescript
315
+ interface HookExecutionOptions {
316
+ timeout?: number // Max execution time (ms)
317
+ parallel?: boolean // Run hooks in parallel
318
+ stopOnError?: boolean // Stop chain on error
319
+ retries?: number // Retry on failure
320
+ }
321
+ ```
322
+
323
+ ## Complete Plugin Example
324
+
325
+ ```typescript
326
+ import type { FluxStack } from '@core/plugins/types'
327
+
328
+ export const analyticsPlugin: FluxStack.Plugin = {
329
+ name: 'analytics',
330
+ version: '1.0.0',
331
+ description: 'Request analytics and metrics',
332
+ priority: 'high',
333
+
334
+ setup: async ({ logger }) => {
335
+ logger.info('Analytics plugin initialized')
336
+ },
337
+
338
+ onRequest: ({ path, method }) => {
339
+ return { requestStart: Date.now() }
340
+ },
341
+
342
+ onResponse: ({ path, method, statusCode, requestStart }) => {
343
+ const duration = Date.now() - (requestStart || 0)
344
+ trackRequest({ path, method, statusCode, duration })
345
+ },
346
+
347
+ onError: ({ error, path }) => {
348
+ trackError({ error: error.message, path })
349
+ }
350
+ }
351
+ ```
352
+
353
+ ## Related
354
+
355
+ - [Plugin System](../core/plugin-system.md)
356
+ - [External Plugins](../resources/plugins-external.md)
357
+ - [Framework Lifecycle](../core/framework-lifecycle.md)
@@ -0,0 +1,39 @@
1
+ # Routing (React Router v7)
2
+
3
+ FluxStack uses **React Router v7** via the `react-router` package for web routing.
4
+
5
+ ## Where It Lives
6
+
7
+ - Router provider: `app/client/src/main.tsx`
8
+ - Routes and pages: `app/client/src/App.tsx`
9
+ - Pages: `app/client/src/pages/*`
10
+ - Shared layout: `app/client/src/components/AppLayout.tsx`
11
+
12
+ ## Why `react-router` (not `react-router-dom`)
13
+
14
+ In v7, the React Router team recommends using the core `react-router` package
15
+ directly for web apps. The `react-router-dom` package remains as a compatibility
16
+ re-export for older apps, but new projects should import from `react-router`.
17
+
18
+ ## Example: Adding a New Route
19
+
20
+ 1. Create a page in `app/client/src/pages/MyPage.tsx`
21
+ 2. Add a route in `app/client/src/App.tsx`:
22
+
23
+ ```tsx
24
+ import { MyPage } from './pages/MyPage'
25
+
26
+ <Route path="/my-page" element={<MyPage />} />
27
+ ```
28
+
29
+ 3. Add a nav link in `app/client/src/components/AppLayout.tsx`
30
+
31
+ ## Current Demo Routes
32
+
33
+ - `/` Home
34
+ - `/counter` Live Counter
35
+ - `/form` Live Form
36
+ - `/upload` Live Upload
37
+ - `/chat` Live Chat
38
+ - `/api-test` Eden Treaty API Test
39
+