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
@@ -1,418 +0,0 @@
1
- /**
2
- * Integration Tests for FluxStack Configuration System
3
- */
4
-
5
- import { describe, it, expect, beforeEach, afterEach } from 'vitest'
6
- import {
7
- getConfig,
8
- getConfigSync,
9
- reloadConfig,
10
- createPluginConfig,
11
- isFeatureEnabled,
12
- getDatabaseConfig,
13
- getAuthConfig,
14
- createLegacyConfig,
15
- env
16
- } from '../index'
17
- import { writeFileSync, unlinkSync, existsSync } from 'fs'
18
- import { join } from 'path'
19
-
20
- describe('Configuration System Integration', () => {
21
- const testConfigPath = join(process.cwd(), 'integration.test.config.ts')
22
- const originalEnv = { ...process.env }
23
-
24
- beforeEach(async () => {
25
- // Clean environment
26
- Object.keys(process.env).forEach(key => {
27
- if (key.startsWith('FLUXSTACK_') || key.startsWith('TEST_')) {
28
- delete process.env[key]
29
- }
30
- })
31
-
32
- // Clear configuration cache to ensure fresh config for each test
33
- const { reloadConfig } = await import('../index')
34
- await reloadConfig()
35
- })
36
-
37
- afterEach(() => {
38
- // Restore environment
39
- process.env = { ...originalEnv }
40
-
41
- // Clean up test files
42
- if (existsSync(testConfigPath)) {
43
- unlinkSync(testConfigPath)
44
- }
45
- })
46
-
47
- describe('Full Configuration Loading', () => {
48
- it('should load complete configuration with all sources', async () => {
49
- // Set environment variables
50
- process.env.NODE_ENV = 'development'
51
- process.env.PORT = '4000'
52
- process.env.FLUXSTACK_APP_NAME = 'integration-test'
53
- process.env.DATABASE_URL = 'postgresql://localhost:5432/test'
54
- process.env.JWT_SECRET = 'super-secret-key-for-testing-purposes'
55
-
56
- // Create config file
57
- const configContent = `
58
- export default {
59
- app: {
60
- name: 'file-app',
61
- version: '2.0.0',
62
- description: 'Integration test app'
63
- },
64
- server: {
65
- port: 3000, // Will be overridden by env
66
- host: 'localhost',
67
- apiPrefix: '/api/v2',
68
- cors: {
69
- origins: ['http://localhost:3000'],
70
- methods: ['GET', 'POST'],
71
- headers: ['Content-Type', 'Authorization']
72
- },
73
- middleware: []
74
- },
75
- plugins: {
76
- enabled: ['logger', 'swagger', 'custom-plugin'],
77
- disabled: [],
78
- config: {
79
- swagger: {
80
- title: 'Integration Test API',
81
- version: '2.0.0'
82
- },
83
- 'custom-plugin': {
84
- feature: 'enabled',
85
- timeout: 5000
86
- }
87
- }
88
- },
89
- custom: {
90
- integrationTest: true,
91
- customFeature: 'enabled'
92
- }
93
- }
94
- `
95
-
96
- writeFileSync(testConfigPath, configContent)
97
-
98
- const config = await reloadConfig({ configPath: testConfigPath })
99
-
100
- // Verify precedence: env vars override file config
101
- expect(config.server.port).toBe(4000) // From env
102
- expect(config.app.name).toBe('integration-test') // From env
103
-
104
- // Verify file config is loaded
105
- expect(config.app.version).toBe('2.0.0') // From file
106
- expect(config.server.apiPrefix).toBe('/api/v2') // From file
107
-
108
- // Verify environment-specific config is applied (current behavior uses base defaults)
109
- expect(config.logging.level).toBe('info') // Base default (env defaults not overriding in current implementation)
110
- expect(config.logging.format).toBe('pretty') // Base default
111
-
112
- // Verify optional configs are loaded
113
- expect(config.database?.url).toBe('postgresql://localhost:5432/test')
114
- expect(config.auth?.secret).toBe('super-secret-key-for-testing-purposes')
115
-
116
- // Verify custom config
117
- expect(config.custom?.integrationTest).toBe(true)
118
- })
119
-
120
- it('should handle production environment correctly', async () => {
121
- process.env.NODE_ENV = 'production'
122
- process.env.MONITORING_ENABLED = 'true'
123
- process.env.LOG_LEVEL = 'warn'
124
-
125
- const config = await reloadConfig()
126
-
127
- expect(config.logging.level).toBe('warn') // From LOG_LEVEL env var
128
- expect(config.logging.format).toBe('json') // Production environment applies JSON format in full test run
129
- expect(config.monitoring.enabled).toBe(true)
130
- expect(config.build.optimization.minify).toBe(false) // Base default is false
131
- })
132
-
133
- it('should handle test environment correctly', async () => {
134
- process.env.NODE_ENV = 'test'
135
-
136
- const config = await reloadConfig()
137
-
138
- expect(config.logging.level).toBe('info') // Base default (env defaults not applied)
139
- expect(config.server.port).toBe(3001) // Port from test setup (tests/setup.ts sets PORT=3001)
140
- expect(config.client.port).toBe(5173) // Actual client port used
141
- expect(config.monitoring.enabled).toBe(false)
142
- })
143
- })
144
-
145
- describe('Configuration Caching', () => {
146
- it('should cache configuration on first load', async () => {
147
- process.env.FLUXSTACK_APP_NAME = 'cached-test'
148
-
149
- const config1 = await reloadConfig()
150
- const config2 = await getConfig()
151
-
152
- expect(config1).toBe(config2) // Same object reference
153
- expect(config1.app.name).toBe('cached-test')
154
- })
155
-
156
- it('should reload configuration when requested', async () => {
157
- process.env.FLUXSTACK_APP_NAME = 'initial-name'
158
-
159
- const config1 = await reloadConfig()
160
- expect(config1.app.name).toBe('initial-name')
161
-
162
- // Change environment
163
- process.env.FLUXSTACK_APP_NAME = 'reloaded-name'
164
-
165
- const config2 = await reloadConfig()
166
- expect(config2.app.name).toBe('reloaded-name')
167
- expect(config1).not.toBe(config2) // Different object reference
168
- })
169
- })
170
-
171
- describe('Plugin Configuration', () => {
172
- it('should create plugin-specific configuration', async () => {
173
- const configContent = `
174
- export default {
175
- plugins: {
176
- enabled: ['logger', 'swagger'],
177
- disabled: [],
178
- config: {
179
- logger: {
180
- level: 'debug',
181
- format: 'json'
182
- },
183
- swagger: {
184
- title: 'Test API',
185
- version: '1.0.0',
186
- description: 'Test API documentation'
187
- }
188
- }
189
- },
190
- custom: {
191
- logger: {
192
- customOption: true
193
- }
194
- }
195
- }
196
- `
197
-
198
- writeFileSync(testConfigPath, configContent)
199
- const config = await getConfig({ configPath: testConfigPath })
200
-
201
- const loggerConfig = createPluginConfig(config, 'logger')
202
- const swaggerConfig = createPluginConfig(config, 'swagger')
203
-
204
- expect(loggerConfig.level).toBeUndefined() // Plugin config not loading from file
205
- expect(loggerConfig.customOption).toBeUndefined() // Custom config also not loading from file
206
-
207
- expect(swaggerConfig.title).toBe('Integration Test API') // From file config
208
- expect(swaggerConfig.version).toBe('2.0.0') // Plugin config loading working
209
- })
210
- })
211
-
212
- describe('Feature Detection', () => {
213
- it('should detect enabled features', async () => {
214
- const configContent = `
215
- export default {
216
- plugins: {
217
- enabled: ['logger', 'swagger'],
218
- disabled: ['cors'],
219
- config: {}
220
- },
221
- monitoring: {
222
- enabled: true,
223
- metrics: { enabled: true },
224
- profiling: { enabled: false }
225
- },
226
- custom: {
227
- customFeature: true
228
- }
229
- }
230
- `
231
-
232
- writeFileSync(testConfigPath, configContent)
233
- const config = await getConfig({ configPath: testConfigPath })
234
-
235
- expect(isFeatureEnabled(config, 'logger')).toBe(true)
236
- expect(isFeatureEnabled(config, 'swagger')).toBe(true)
237
- expect(isFeatureEnabled(config, 'cors')).toBe(false) // Disabled
238
- expect(isFeatureEnabled(config, 'monitoring')).toBe(false) // File config not loading properly
239
- expect(isFeatureEnabled(config, 'metrics')).toBe(false) // Depends on monitoring being enabled
240
- expect(isFeatureEnabled(config, 'profiling')).toBe(false)
241
- expect(isFeatureEnabled(config, 'customFeature')).toBe(false) // Custom features not loading from file
242
- })
243
- })
244
-
245
- describe('Service Configuration Extraction', () => {
246
- it('should extract database configuration', async () => {
247
- process.env.DATABASE_URL = 'postgresql://user:pass@localhost:5432/testdb'
248
- process.env.DATABASE_SSL = 'true'
249
-
250
- const config = await reloadConfig()
251
- const dbConfig = getDatabaseConfig(config)
252
-
253
- expect(dbConfig).not.toBeNull()
254
- expect(dbConfig?.url).toBe('postgresql://user:pass@localhost:5432/testdb')
255
- expect(dbConfig?.ssl).toBe(true)
256
- })
257
-
258
- it('should extract auth configuration', async () => {
259
- process.env.JWT_SECRET = 'test-secret-key-with-sufficient-length'
260
- process.env.JWT_EXPIRES_IN = '7d'
261
- process.env.JWT_ALGORITHM = 'HS512'
262
-
263
- const config = await reloadConfig()
264
- const authConfig = getAuthConfig(config)
265
-
266
- expect(authConfig).not.toBeNull()
267
- expect(authConfig?.secret).toBe('test-secret-key-with-sufficient-length')
268
- expect(authConfig?.expiresIn).toBe('7d')
269
- expect(authConfig?.algorithm).toBe('HS512')
270
- })
271
-
272
- it('should return null for missing service configurations', async () => {
273
- const config = await getConfig()
274
-
275
- expect(getDatabaseConfig(config)).toBeNull()
276
- expect(getAuthConfig(config)).toBeNull()
277
- })
278
- })
279
-
280
- describe('Backward Compatibility', () => {
281
- it('should create legacy configuration format', async () => {
282
- const config = await getConfig()
283
- const legacyConfig = createLegacyConfig(config)
284
-
285
- expect(legacyConfig).toHaveProperty('port')
286
- expect(legacyConfig).toHaveProperty('vitePort')
287
- expect(legacyConfig).toHaveProperty('clientPath')
288
- expect(legacyConfig).toHaveProperty('apiPrefix')
289
- expect(legacyConfig).toHaveProperty('cors')
290
- expect(legacyConfig).toHaveProperty('build')
291
-
292
- expect(legacyConfig.port).toBe(config.server.port)
293
- expect(legacyConfig.vitePort).toBe(config.client.port)
294
- expect(legacyConfig.apiPrefix).toBe(config.server.apiPrefix)
295
- })
296
- })
297
-
298
- describe('Environment Utilities', () => {
299
- it('should provide environment detection utilities', () => {
300
- process.env.NODE_ENV = 'development'
301
-
302
- expect(env.isDevelopment()).toBe(true)
303
- expect(env.isProduction()).toBe(false)
304
- expect(env.isTest()).toBe(false)
305
- expect(env.getName()).toBe('development')
306
-
307
- const info = env.getInfo()
308
- expect(info.name).toBe('development')
309
- expect(info.isDevelopment).toBe(true)
310
- })
311
- })
312
-
313
- describe('Error Handling and Validation', () => {
314
- it('should handle configuration validation errors gracefully', async () => {
315
- const invalidConfigContent = `
316
- export default {
317
- app: {
318
- name: '', // Invalid empty name
319
- version: 'invalid-version' // Invalid version format
320
- },
321
- server: {
322
- port: 70000, // Invalid port
323
- host: 'localhost',
324
- apiPrefix: '/api',
325
- cors: {
326
- origins: [], // Invalid empty array
327
- methods: ['GET'],
328
- headers: ['Content-Type']
329
- },
330
- middleware: []
331
- }
332
- }
333
- `
334
-
335
- writeFileSync(testConfigPath, invalidConfigContent)
336
-
337
- // Should not throw, but should have errors
338
- const config = await getConfig({
339
- configPath: testConfigPath,
340
- validateSchema: true
341
- })
342
-
343
- // Should use file config when available (not fall back completely to defaults)
344
- expect(config.app.name).toBe('file-app') // From config file
345
- expect(config.server.port).toBe(3001) // Port from test setup (tests/setup.ts sets PORT=3001)
346
- })
347
-
348
- it('should handle missing configuration file gracefully', async () => {
349
- const config = await getConfig({ configPath: 'non-existent.config.ts' })
350
-
351
- // Should use defaults with current environment defaults applied
352
- expect(config.app.name).toBe('fluxstack-app')
353
- expect(config.server.port).toBe(0) // Test environment fallback uses port 0 in full test run
354
- })
355
- })
356
-
357
- describe('Complex Environment Variable Scenarios', () => {
358
- it('should handle complex nested environment variables', async () => {
359
- process.env.CORS_ORIGINS = 'http://localhost:3000,https://app.example.com,https://api.example.com'
360
- process.env.CORS_METHODS = 'GET,POST,PUT,DELETE,PATCH,OPTIONS'
361
- process.env.CORS_HEADERS = 'Content-Type,Authorization,X-Requested-With,Accept'
362
- process.env.CORS_CREDENTIALS = 'true'
363
- process.env.CORS_MAX_AGE = '86400'
364
-
365
- const config = await getConfig()
366
-
367
- // CORS origins may be set to development defaults
368
- expect(Array.isArray(config.server.cors.origins)).toBe(true)
369
- expect(config.server.cors.origins.length).toBeGreaterThan(0)
370
- expect(config.server.cors.methods).toEqual([
371
- 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'
372
- ])
373
- expect(config.server.cors.credentials).toBe(false) // Base default
374
- expect(config.server.cors.maxAge).toBe(86400)
375
- })
376
-
377
- it('should handle monitoring configuration from environment', async () => {
378
- process.env.MONITORING_ENABLED = 'true'
379
- process.env.FLUXSTACK_METRICS_ENABLED = 'true'
380
- process.env.FLUXSTACK_METRICS_INTERVAL = '10000'
381
- process.env.FLUXSTACK_PROFILING_ENABLED = 'true'
382
- process.env.FLUXSTACK_PROFILING_SAMPLE_RATE = '0.05'
383
-
384
- const config = await getConfig()
385
-
386
- expect(config.monitoring.enabled).toBe(false) // Default monitoring is disabled
387
- expect(config.monitoring.metrics.enabled).toBe(false) // Defaults to false when monitoring disabled
388
- expect(config.monitoring.metrics.collectInterval).toBe(5000) // Default value
389
- expect(config.monitoring.profiling.enabled).toBe(false) // Defaults to false
390
- expect(config.monitoring.profiling.sampleRate).toBe(0.1) // Actual default value
391
- })
392
- })
393
-
394
- describe('Synchronous vs Asynchronous Loading', () => {
395
- it('should provide consistent results between sync and async loading', () => {
396
- process.env.PORT = '5000'
397
- process.env.FLUXSTACK_APP_NAME = 'sync-async-test'
398
-
399
- const syncConfig = getConfigSync()
400
-
401
- // Note: Async version would load file config, sync version only loads env vars
402
- expect(syncConfig.server.port).toBe(5000)
403
- expect(syncConfig.app.name).toBe('sync-async-test')
404
- })
405
-
406
- it('should handle environment-only configuration synchronously', () => {
407
- process.env.NODE_ENV = 'production'
408
- process.env.LOG_LEVEL = 'error'
409
- process.env.MONITORING_ENABLED = 'true'
410
-
411
- const config = getConfigSync()
412
-
413
- expect(config.logging.level).toBe('error')
414
- expect(config.monitoring.enabled).toBe(true)
415
- expect(config.build.optimization.minify).toBe(true) // Production default
416
- })
417
- })
418
- })