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,401 @@
1
+ # Runtime Configuration Reload
2
+
3
+ **Version:** 1.11.0 | **Updated:** 2025-02-08
4
+
5
+ ## Quick Facts
6
+
7
+ - `ReactiveConfig` enables runtime config updates without server restart
8
+ - Watches environment variable changes
9
+ - Notifies listeners on reload
10
+ - Used for feature flags, rate limits, maintenance mode
11
+ - Implementation: `config/system/runtime.config.ts`
12
+
13
+ ## ReactiveConfig Class
14
+
15
+ ### Creating Reactive Config
16
+
17
+ ```typescript
18
+ import { defineReactiveConfig, config } from '@core/utils/config-schema'
19
+
20
+ const reactiveConfig = defineReactiveConfig({
21
+ featureEnabled: config.boolean('FEATURE_FLAG', false),
22
+ maxRequests: config.number('MAX_REQUESTS', 100)
23
+ })
24
+ ```
25
+
26
+ ### Accessing Values
27
+
28
+ ```typescript
29
+ // Get all values
30
+ const values = reactiveConfig.values
31
+ console.log(values.featureEnabled) // false
32
+ console.log(values.maxRequests) // 100
33
+
34
+ // Get specific value
35
+ const enabled = reactiveConfig.get('featureEnabled')
36
+
37
+ // Check if value exists
38
+ if (reactiveConfig.has('featureEnabled')) {
39
+ // ...
40
+ }
41
+ ```
42
+
43
+ ### Reloading Configuration
44
+
45
+ ```typescript
46
+ // Reload from environment (clears env cache)
47
+ const newConfig = reactiveConfig.reload()
48
+
49
+ // All watchers are notified automatically
50
+ ```
51
+
52
+ ### Watching for Changes
53
+
54
+ ```typescript
55
+ // Register watcher
56
+ const unwatch = reactiveConfig.watch((newConfig) => {
57
+ console.log('Config updated!')
58
+ console.log('Feature enabled:', newConfig.featureEnabled)
59
+ console.log('Max requests:', newConfig.maxRequests)
60
+ })
61
+
62
+ // Later: stop watching
63
+ unwatch()
64
+ ```
65
+
66
+ ## Runtime Config Example
67
+
68
+ FluxStack includes `appRuntimeConfig` for runtime-reloadable settings:
69
+
70
+ ```typescript
71
+ // config/system/runtime.config.ts
72
+ export const appRuntimeConfig = defineReactiveConfig({
73
+ // Feature toggles
74
+ enableSwagger: config.boolean('ENABLE_SWAGGER', true),
75
+ enableMetrics: config.boolean('ENABLE_METRICS', false),
76
+ enableDebugMode: config.boolean('DEBUG', false),
77
+
78
+ // Rate limiting
79
+ rateLimitEnabled: config.boolean('RATE_LIMIT_ENABLED', true),
80
+ rateLimitMax: config.number('RATE_LIMIT_MAX', 100),
81
+ rateLimitWindow: config.number('RATE_LIMIT_WINDOW', 60000),
82
+
83
+ // Request settings
84
+ requestTimeout: config.number('REQUEST_TIMEOUT', 30000),
85
+ maxUploadSize: config.number('MAX_UPLOAD_SIZE', 10485760),
86
+
87
+ // Maintenance mode
88
+ maintenanceMode: config.boolean('MAINTENANCE_MODE', false),
89
+ maintenanceMessage: config.string(
90
+ 'MAINTENANCE_MESSAGE',
91
+ 'System is under maintenance. Please try again later.'
92
+ )
93
+ })
94
+
95
+ // Setup watcher
96
+ appRuntimeConfig.watch((newConfig) => {
97
+ console.log('🔄 Runtime config reloaded')
98
+ console.log(' Debug:', newConfig.enableDebugMode)
99
+ console.log(' Maintenance:', newConfig.maintenanceMode)
100
+ })
101
+ ```
102
+
103
+ ## Use Cases
104
+
105
+ ### Feature Flags
106
+
107
+ Toggle features without restart:
108
+
109
+ ```typescript
110
+ // Check feature flag
111
+ if (appRuntimeConfig.values.enableSwagger) {
112
+ // Enable Swagger UI
113
+ }
114
+
115
+ // Update .env: ENABLE_SWAGGER=false
116
+ // Reload config
117
+ appRuntimeConfig.reload()
118
+ // Swagger now disabled
119
+ ```
120
+
121
+ ### Rate Limiting
122
+
123
+ Adjust rate limits dynamically:
124
+
125
+ ```typescript
126
+ const { rateLimitMax, rateLimitWindow } = appRuntimeConfig.values
127
+
128
+ // Apply rate limit
129
+ if (requestCount > rateLimitMax) {
130
+ throw new Error('Rate limit exceeded')
131
+ }
132
+
133
+ // Update .env: RATE_LIMIT_MAX=200
134
+ // Reload config
135
+ appRuntimeConfig.reload()
136
+ // New limit applied
137
+ ```
138
+
139
+ ### Maintenance Mode
140
+
141
+ Enable maintenance without downtime:
142
+
143
+ ```typescript
144
+ // Middleware check
145
+ if (appRuntimeConfig.values.maintenanceMode) {
146
+ return new Response(appRuntimeConfig.values.maintenanceMessage, {
147
+ status: 503
148
+ })
149
+ }
150
+
151
+ // Update .env: MAINTENANCE_MODE=true
152
+ // Reload config
153
+ appRuntimeConfig.reload()
154
+ // Maintenance mode active
155
+ ```
156
+
157
+ ### Debug Mode
158
+
159
+ Toggle debug logging:
160
+
161
+ ```typescript
162
+ appRuntimeConfig.watch((config) => {
163
+ if (config.enableDebugMode) {
164
+ logger.setLevel('debug')
165
+ } else {
166
+ logger.setLevel('info')
167
+ }
168
+ })
169
+
170
+ // Update .env: DEBUG=true
171
+ // Reload triggers watcher
172
+ appRuntimeConfig.reload()
173
+ ```
174
+
175
+ ## Reload Mechanism
176
+
177
+ ### How It Works
178
+
179
+ 1. **Clear env cache**: `env.clearCache()` forces fresh read
180
+ 2. **Reload config**: Re-reads all env vars and validates
181
+ 3. **Notify watchers**: Calls all registered watch callbacks
182
+ 4. **Return new config**: Returns updated values
183
+
184
+ ### Manual Reload
185
+
186
+ ```typescript
187
+ // In your code
188
+ import { appRuntimeConfig } from '@config/system/runtime.config'
189
+
190
+ // Reload when needed
191
+ appRuntimeConfig.reload()
192
+ ```
193
+
194
+ ### Automatic Reload
195
+
196
+ Create a reload endpoint:
197
+
198
+ ```typescript
199
+ // app/server/routes/admin.ts
200
+ import { Elysia, t } from 'elysia'
201
+ import { appRuntimeConfig } from '@config/system/runtime.config'
202
+
203
+ export const adminRoutes = new Elysia({ prefix: '/admin' })
204
+ .post('/reload-config', async () => {
205
+ const newConfig = appRuntimeConfig.reload()
206
+
207
+ return {
208
+ success: true,
209
+ message: 'Configuration reloaded',
210
+ config: {
211
+ maintenanceMode: newConfig.maintenanceMode,
212
+ debugMode: newConfig.enableDebugMode
213
+ }
214
+ }
215
+ }, {
216
+ detail: {
217
+ tags: ['Admin'],
218
+ summary: 'Reload runtime configuration'
219
+ },
220
+ response: t.Object({
221
+ success: t.Boolean(),
222
+ message: t.String(),
223
+ config: t.Object({
224
+ maintenanceMode: t.Boolean(),
225
+ debugMode: t.Boolean()
226
+ })
227
+ })
228
+ })
229
+ ```
230
+
231
+ ## Watch Callbacks
232
+
233
+ ### Multiple Watchers
234
+
235
+ ```typescript
236
+ // Watcher 1: Update logger
237
+ appRuntimeConfig.watch((config) => {
238
+ logger.setLevel(config.enableDebugMode ? 'debug' : 'info')
239
+ })
240
+
241
+ // Watcher 2: Update metrics
242
+ appRuntimeConfig.watch((config) => {
243
+ if (config.enableMetrics) {
244
+ metricsCollector.start()
245
+ } else {
246
+ metricsCollector.stop()
247
+ }
248
+ })
249
+
250
+ // Both called on reload
251
+ ```
252
+
253
+ ### Cleanup
254
+
255
+ ```typescript
256
+ const unwatch1 = appRuntimeConfig.watch(callback1)
257
+ const unwatch2 = appRuntimeConfig.watch(callback2)
258
+
259
+ // Later: cleanup
260
+ unwatch1()
261
+ unwatch2()
262
+ ```
263
+
264
+ ### Error Handling
265
+
266
+ ```typescript
267
+ appRuntimeConfig.watch((config) => {
268
+ try {
269
+ // Apply config changes
270
+ applyRateLimits(config.rateLimitMax)
271
+ } catch (error) {
272
+ logger.error('Failed to apply config:', error)
273
+ }
274
+ })
275
+ ```
276
+
277
+ ## Static vs Reactive Config
278
+
279
+ ### Static Config (defineConfig)
280
+
281
+ ```typescript
282
+ // Loaded once on startup
283
+ const serverConfig = defineConfig({
284
+ port: config.number('PORT', 3000)
285
+ })
286
+
287
+ // Cannot reload
288
+ // serverConfig.reload() ❌ Not available
289
+ ```
290
+
291
+ Use for:
292
+ - Server port/host
293
+ - Build settings
294
+ - Database connection
295
+ - Settings that require restart
296
+
297
+ ### Reactive Config (defineReactiveConfig)
298
+
299
+ ```typescript
300
+ // Can reload at runtime
301
+ const runtimeConfig = defineReactiveConfig({
302
+ feature: config.boolean('FEATURE_FLAG', false)
303
+ })
304
+
305
+ // Can reload
306
+ runtimeConfig.reload() ✅
307
+ ```
308
+
309
+ Use for:
310
+ - Feature flags
311
+ - Rate limits
312
+ - Maintenance mode
313
+ - Debug settings
314
+ - Non-critical settings
315
+
316
+ ## Performance Considerations
317
+
318
+ ### Reload Cost
319
+
320
+ - Clears env cache
321
+ - Re-validates all fields
322
+ - Notifies all watchers
323
+ - Minimal overhead (~1-5ms)
324
+
325
+ ### When to Reload
326
+
327
+ - On admin request (manual trigger)
328
+ - On file watch (advanced)
329
+ - On schedule (cron job)
330
+ - NOT on every request (too expensive)
331
+
332
+ ### Caching
333
+
334
+ ```typescript
335
+ // Cache config values if accessed frequently
336
+ let cachedRateLimit = appRuntimeConfig.values.rateLimitMax
337
+
338
+ appRuntimeConfig.watch((config) => {
339
+ cachedRateLimit = config.rateLimitMax
340
+ })
341
+
342
+ // Use cached value
343
+ if (requestCount > cachedRateLimit) {
344
+ // ...
345
+ }
346
+ ```
347
+
348
+ ## Validation on Reload
349
+
350
+ Validation runs on every reload:
351
+
352
+ ```typescript
353
+ const config = defineReactiveConfig({
354
+ maxRequests: {
355
+ type: 'number',
356
+ env: 'MAX_REQUESTS',
357
+ default: 100,
358
+ validate: (value) => {
359
+ if (value < 1) {
360
+ return 'Max requests must be positive'
361
+ }
362
+ return true
363
+ }
364
+ }
365
+ })
366
+
367
+ // Update .env: MAX_REQUESTS=-10
368
+ // Reload throws validation error
369
+ config.reload()
370
+ // ❌ Configuration validation failed:
371
+ // - Max requests must be positive (got: -10)
372
+ ```
373
+
374
+ ## Integration with Plugins
375
+
376
+ Plugins can use reactive config:
377
+
378
+ ```typescript
379
+ // plugins/my-plugin/index.ts
380
+ import { appRuntimeConfig } from '@config/system/runtime.config'
381
+
382
+ export default {
383
+ name: 'my-plugin',
384
+ version: '1.0.0',
385
+
386
+ setup: async (app, config) => {
387
+ // Watch for config changes
388
+ appRuntimeConfig.watch((runtimeConfig) => {
389
+ if (runtimeConfig.maintenanceMode) {
390
+ // Disable plugin features
391
+ }
392
+ })
393
+ }
394
+ }
395
+ ```
396
+
397
+ ## Related
398
+
399
+ - [Declarative System](./declarative-system.md) - Config schema and defineConfig
400
+ - [Environment Variables](./environment-vars.md) - All available env vars
401
+ - [Plugin System](../core/plugin-system.md) - Plugin lifecycle hooks
@@ -0,0 +1 @@
1
+ # Core documentation directory