create-fluxstack 1.0.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 (101) hide show
  1. package/.env +30 -0
  2. package/LICENSE +21 -0
  3. package/README.md +214 -0
  4. package/app/client/README.md +69 -0
  5. package/app/client/frontend-only.ts +12 -0
  6. package/app/client/index.html +13 -0
  7. package/app/client/public/vite.svg +1 -0
  8. package/app/client/src/App.css +883 -0
  9. package/app/client/src/App.tsx +669 -0
  10. package/app/client/src/assets/react.svg +1 -0
  11. package/app/client/src/components/TestPage.tsx +453 -0
  12. package/app/client/src/index.css +51 -0
  13. package/app/client/src/lib/eden-api.ts +110 -0
  14. package/app/client/src/main.tsx +10 -0
  15. package/app/client/src/vite-env.d.ts +1 -0
  16. package/app/client/tsconfig.app.json +43 -0
  17. package/app/client/tsconfig.json +7 -0
  18. package/app/client/tsconfig.node.json +25 -0
  19. package/app/server/app.ts +10 -0
  20. package/app/server/backend-only.ts +15 -0
  21. package/app/server/controllers/users.controller.ts +69 -0
  22. package/app/server/index.ts +104 -0
  23. package/app/server/routes/index.ts +25 -0
  24. package/app/server/routes/users.routes.ts +121 -0
  25. package/app/server/types/index.ts +1 -0
  26. package/app/shared/types/index.ts +18 -0
  27. package/bun.lock +1053 -0
  28. package/core/__tests__/integration.test.ts +227 -0
  29. package/core/build/index.ts +186 -0
  30. package/core/cli/command-registry.ts +334 -0
  31. package/core/cli/index.ts +394 -0
  32. package/core/cli/plugin-discovery.ts +200 -0
  33. package/core/client/standalone.ts +57 -0
  34. package/core/config/__tests__/config-loader.test.ts +591 -0
  35. package/core/config/__tests__/config-merger.test.ts +657 -0
  36. package/core/config/__tests__/env-converter.test.ts +372 -0
  37. package/core/config/__tests__/env-processor.test.ts +431 -0
  38. package/core/config/__tests__/env.test.ts +452 -0
  39. package/core/config/__tests__/integration.test.ts +418 -0
  40. package/core/config/__tests__/loader.test.ts +331 -0
  41. package/core/config/__tests__/schema.test.ts +129 -0
  42. package/core/config/__tests__/validator.test.ts +318 -0
  43. package/core/config/env-dynamic.ts +326 -0
  44. package/core/config/env.ts +597 -0
  45. package/core/config/index.ts +317 -0
  46. package/core/config/loader.ts +546 -0
  47. package/core/config/runtime-config.ts +322 -0
  48. package/core/config/schema.ts +694 -0
  49. package/core/config/validator.ts +540 -0
  50. package/core/framework/__tests__/server.test.ts +233 -0
  51. package/core/framework/client.ts +132 -0
  52. package/core/framework/index.ts +8 -0
  53. package/core/framework/server.ts +501 -0
  54. package/core/framework/types.ts +63 -0
  55. package/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
  56. package/core/plugins/__tests__/manager.test.ts +398 -0
  57. package/core/plugins/__tests__/monitoring.test.ts +401 -0
  58. package/core/plugins/__tests__/registry.test.ts +335 -0
  59. package/core/plugins/built-in/index.ts +142 -0
  60. package/core/plugins/built-in/logger/index.ts +180 -0
  61. package/core/plugins/built-in/monitoring/README.md +193 -0
  62. package/core/plugins/built-in/monitoring/index.ts +912 -0
  63. package/core/plugins/built-in/static/index.ts +289 -0
  64. package/core/plugins/built-in/swagger/index.ts +229 -0
  65. package/core/plugins/built-in/vite/index.ts +316 -0
  66. package/core/plugins/config.ts +348 -0
  67. package/core/plugins/discovery.ts +350 -0
  68. package/core/plugins/executor.ts +351 -0
  69. package/core/plugins/index.ts +195 -0
  70. package/core/plugins/manager.ts +583 -0
  71. package/core/plugins/registry.ts +424 -0
  72. package/core/plugins/types.ts +254 -0
  73. package/core/server/framework.ts +123 -0
  74. package/core/server/index.ts +8 -0
  75. package/core/server/plugins/database.ts +182 -0
  76. package/core/server/plugins/logger.ts +47 -0
  77. package/core/server/plugins/swagger.ts +34 -0
  78. package/core/server/standalone.ts +91 -0
  79. package/core/templates/create-project.ts +455 -0
  80. package/core/types/api.ts +169 -0
  81. package/core/types/build.ts +174 -0
  82. package/core/types/config.ts +68 -0
  83. package/core/types/index.ts +127 -0
  84. package/core/types/plugin.ts +94 -0
  85. package/core/utils/__tests__/errors.test.ts +139 -0
  86. package/core/utils/__tests__/helpers.test.ts +297 -0
  87. package/core/utils/__tests__/logger.test.ts +141 -0
  88. package/core/utils/env-runtime-v2.ts +232 -0
  89. package/core/utils/env-runtime.ts +252 -0
  90. package/core/utils/errors/codes.ts +115 -0
  91. package/core/utils/errors/handlers.ts +63 -0
  92. package/core/utils/errors/index.ts +81 -0
  93. package/core/utils/helpers.ts +180 -0
  94. package/core/utils/index.ts +18 -0
  95. package/core/utils/logger/index.ts +161 -0
  96. package/core/utils/logger.ts +106 -0
  97. package/core/utils/monitoring/index.ts +212 -0
  98. package/create-fluxstack.ts +231 -0
  99. package/package.json +43 -0
  100. package/tsconfig.json +51 -0
  101. package/vite.config.ts +42 -0
@@ -0,0 +1,694 @@
1
+ /**
2
+ * Enhanced Configuration Schema for FluxStack
3
+ * Provides comprehensive type definitions and JSON schema validation
4
+ */
5
+
6
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error'
7
+ export type BuildTarget = 'bun' | 'node' | 'docker'
8
+ export type LogFormat = 'json' | 'pretty'
9
+ export type StorageType = 'localStorage' | 'sessionStorage'
10
+
11
+ // Core configuration interfaces
12
+ export interface AppConfig {
13
+ name: string
14
+ version: string
15
+ description?: string
16
+ }
17
+
18
+ export interface CorsConfig {
19
+ origins: string[]
20
+ methods: string[]
21
+ headers: string[]
22
+ credentials?: boolean
23
+ maxAge?: number
24
+ }
25
+
26
+ export interface MiddlewareConfig {
27
+ name: string
28
+ enabled: boolean
29
+ config?: Record<string, any>
30
+ }
31
+
32
+ export interface ServerConfig {
33
+ port: number
34
+ host: string
35
+ apiPrefix: string
36
+ cors: CorsConfig
37
+ middleware: MiddlewareConfig[]
38
+ }
39
+
40
+ export interface ProxyConfig {
41
+ target: string
42
+ changeOrigin?: boolean
43
+ pathRewrite?: Record<string, string>
44
+ }
45
+
46
+ export interface ClientBuildConfig {
47
+ sourceMaps: boolean
48
+ minify: boolean
49
+ target: string
50
+ outDir: string
51
+ }
52
+
53
+ export interface ClientConfig {
54
+ port: number
55
+ proxy: ProxyConfig
56
+ build: ClientBuildConfig
57
+ }
58
+
59
+ export interface OptimizationConfig {
60
+ minify: boolean
61
+ treeshake: boolean
62
+ compress: boolean
63
+ splitChunks: boolean
64
+ bundleAnalyzer: boolean
65
+ }
66
+
67
+ export interface BuildConfig {
68
+ target: BuildTarget
69
+ outDir: string
70
+ optimization: OptimizationConfig
71
+ sourceMaps: boolean
72
+ clean: boolean
73
+ }
74
+
75
+ export interface LogTransportConfig {
76
+ type: 'console' | 'file' | 'http'
77
+ level: LogLevel
78
+ format: LogFormat
79
+ options?: Record<string, any>
80
+ }
81
+
82
+ export interface LoggingConfig {
83
+ level: LogLevel
84
+ format: LogFormat
85
+ transports: LogTransportConfig[]
86
+ context?: Record<string, any>
87
+ }
88
+
89
+ export interface MetricsConfig {
90
+ enabled: boolean
91
+ collectInterval: number
92
+ httpMetrics: boolean
93
+ systemMetrics: boolean
94
+ customMetrics: boolean
95
+ }
96
+
97
+ export interface ProfilingConfig {
98
+ enabled: boolean
99
+ sampleRate: number
100
+ memoryProfiling: boolean
101
+ cpuProfiling: boolean
102
+ }
103
+
104
+ export interface MonitoringConfig {
105
+ enabled: boolean
106
+ metrics: MetricsConfig
107
+ profiling: ProfilingConfig
108
+ exporters: string[]
109
+ }
110
+
111
+ export interface PluginConfig {
112
+ enabled: string[]
113
+ disabled: string[]
114
+ config: Record<string, any>
115
+ }
116
+
117
+ export interface DatabaseConfig {
118
+ url?: string
119
+ host?: string
120
+ port?: number
121
+ database?: string
122
+ user?: string
123
+ password?: string
124
+ ssl?: boolean
125
+ poolSize?: number
126
+ }
127
+
128
+ export interface AuthConfig {
129
+ secret?: string
130
+ expiresIn?: string
131
+ algorithm?: string
132
+ issuer?: string
133
+ }
134
+
135
+ export interface EmailConfig {
136
+ host?: string
137
+ port?: number
138
+ user?: string
139
+ password?: string
140
+ secure?: boolean
141
+ from?: string
142
+ }
143
+
144
+ export interface StorageConfig {
145
+ uploadPath?: string
146
+ maxFileSize?: number
147
+ allowedTypes?: string[]
148
+ provider?: 'local' | 's3' | 'gcs'
149
+ config?: Record<string, any>
150
+ }
151
+
152
+ // Main configuration interface
153
+ export interface FluxStackConfig {
154
+ // Core settings
155
+ app: AppConfig
156
+
157
+ // Server configuration
158
+ server: ServerConfig
159
+
160
+ // Client configuration
161
+ client: ClientConfig
162
+
163
+ // Build configuration
164
+ build: BuildConfig
165
+
166
+ // Plugin configuration
167
+ plugins: PluginConfig
168
+
169
+ // Logging configuration
170
+ logging: LoggingConfig
171
+
172
+ // Monitoring configuration
173
+ monitoring: MonitoringConfig
174
+
175
+ // Optional service configurations
176
+ database?: DatabaseConfig
177
+ auth?: AuthConfig
178
+ email?: EmailConfig
179
+ storage?: StorageConfig
180
+
181
+ // Environment-specific overrides
182
+ environments?: {
183
+ development?: Partial<FluxStackConfig>
184
+ production?: Partial<FluxStackConfig>
185
+ test?: Partial<FluxStackConfig>
186
+ [key: string]: Partial<FluxStackConfig> | undefined
187
+ }
188
+
189
+ // Custom configuration
190
+ custom?: Record<string, any>
191
+ }
192
+
193
+ // JSON Schema for validation
194
+ export const fluxStackConfigSchema = {
195
+ type: 'object',
196
+ properties: {
197
+ app: {
198
+ type: 'object',
199
+ properties: {
200
+ name: {
201
+ type: 'string',
202
+ minLength: 1,
203
+ description: 'Application name'
204
+ },
205
+ version: {
206
+ type: 'string',
207
+ pattern: '^\\d+\\.\\d+\\.\\d+',
208
+ description: 'Application version (semver format)'
209
+ },
210
+ description: {
211
+ type: 'string',
212
+ description: 'Application description'
213
+ }
214
+ },
215
+ required: ['name', 'version'],
216
+ additionalProperties: false
217
+ },
218
+
219
+ server: {
220
+ type: 'object',
221
+ properties: {
222
+ port: {
223
+ type: 'number',
224
+ minimum: 1,
225
+ maximum: 65535,
226
+ description: 'Server port number'
227
+ },
228
+ host: {
229
+ type: 'string',
230
+ description: 'Server host address'
231
+ },
232
+ apiPrefix: {
233
+ type: 'string',
234
+ pattern: '^/',
235
+ description: 'API route prefix'
236
+ },
237
+ cors: {
238
+ type: 'object',
239
+ properties: {
240
+ origins: {
241
+ type: 'array',
242
+ items: { type: 'string' },
243
+ minItems: 1,
244
+ description: 'Allowed CORS origins'
245
+ },
246
+ methods: {
247
+ type: 'array',
248
+ items: {
249
+ type: 'string',
250
+ enum: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD']
251
+ },
252
+ description: 'Allowed HTTP methods'
253
+ },
254
+ headers: {
255
+ type: 'array',
256
+ items: { type: 'string' },
257
+ description: 'Allowed headers'
258
+ },
259
+ credentials: {
260
+ type: 'boolean',
261
+ description: 'Allow credentials in CORS requests'
262
+ },
263
+ maxAge: {
264
+ type: 'number',
265
+ minimum: 0,
266
+ description: 'CORS preflight cache duration'
267
+ }
268
+ },
269
+ required: ['origins', 'methods', 'headers'],
270
+ additionalProperties: false
271
+ },
272
+ middleware: {
273
+ type: 'array',
274
+ items: {
275
+ type: 'object',
276
+ properties: {
277
+ name: { type: 'string' },
278
+ enabled: { type: 'boolean' },
279
+ config: { type: 'object' }
280
+ },
281
+ required: ['name', 'enabled'],
282
+ additionalProperties: false
283
+ }
284
+ }
285
+ },
286
+ required: ['port', 'host', 'apiPrefix', 'cors', 'middleware'],
287
+ additionalProperties: false
288
+ },
289
+
290
+ client: {
291
+ type: 'object',
292
+ properties: {
293
+ port: {
294
+ type: 'number',
295
+ minimum: 1,
296
+ maximum: 65535,
297
+ description: 'Client development server port'
298
+ },
299
+ proxy: {
300
+ type: 'object',
301
+ properties: {
302
+ target: { type: 'string' },
303
+ changeOrigin: { type: 'boolean' },
304
+ pathRewrite: {
305
+ type: 'object',
306
+ additionalProperties: { type: 'string' }
307
+ }
308
+ },
309
+ required: ['target'],
310
+ additionalProperties: false
311
+ },
312
+ build: {
313
+ type: 'object',
314
+ properties: {
315
+ sourceMaps: { type: 'boolean' },
316
+ minify: { type: 'boolean' },
317
+ target: { type: 'string' },
318
+ outDir: { type: 'string' }
319
+ },
320
+ required: ['sourceMaps', 'minify', 'target', 'outDir'],
321
+ additionalProperties: false
322
+ }
323
+ },
324
+ required: ['port', 'proxy', 'build'],
325
+ additionalProperties: false
326
+ },
327
+
328
+ build: {
329
+ type: 'object',
330
+ properties: {
331
+ target: {
332
+ type: 'string',
333
+ enum: ['bun', 'node', 'docker'],
334
+ description: 'Build target runtime'
335
+ },
336
+ outDir: {
337
+ type: 'string',
338
+ description: 'Build output directory'
339
+ },
340
+ optimization: {
341
+ type: 'object',
342
+ properties: {
343
+ minify: { type: 'boolean' },
344
+ treeshake: { type: 'boolean' },
345
+ compress: { type: 'boolean' },
346
+ splitChunks: { type: 'boolean' },
347
+ bundleAnalyzer: { type: 'boolean' }
348
+ },
349
+ required: ['minify', 'treeshake', 'compress', 'splitChunks', 'bundleAnalyzer'],
350
+ additionalProperties: false
351
+ },
352
+ sourceMaps: { type: 'boolean' },
353
+ clean: { type: 'boolean' }
354
+ },
355
+ required: ['target', 'outDir', 'optimization', 'sourceMaps', 'clean'],
356
+ additionalProperties: false
357
+ },
358
+
359
+ plugins: {
360
+ type: 'object',
361
+ properties: {
362
+ enabled: {
363
+ type: 'array',
364
+ items: { type: 'string' },
365
+ description: 'List of enabled plugins'
366
+ },
367
+ disabled: {
368
+ type: 'array',
369
+ items: { type: 'string' },
370
+ description: 'List of disabled plugins'
371
+ },
372
+ config: {
373
+ type: 'object',
374
+ description: 'Plugin-specific configuration'
375
+ }
376
+ },
377
+ required: ['enabled', 'disabled', 'config'],
378
+ additionalProperties: false
379
+ },
380
+
381
+ logging: {
382
+ type: 'object',
383
+ properties: {
384
+ level: {
385
+ type: 'string',
386
+ enum: ['debug', 'info', 'warn', 'error'],
387
+ description: 'Minimum log level'
388
+ },
389
+ format: {
390
+ type: 'string',
391
+ enum: ['json', 'pretty'],
392
+ description: 'Log output format'
393
+ },
394
+ transports: {
395
+ type: 'array',
396
+ items: {
397
+ type: 'object',
398
+ properties: {
399
+ type: {
400
+ type: 'string',
401
+ enum: ['console', 'file', 'http']
402
+ },
403
+ level: {
404
+ type: 'string',
405
+ enum: ['debug', 'info', 'warn', 'error']
406
+ },
407
+ format: {
408
+ type: 'string',
409
+ enum: ['json', 'pretty']
410
+ },
411
+ options: { type: 'object' }
412
+ },
413
+ required: ['type', 'level', 'format'],
414
+ additionalProperties: false
415
+ }
416
+ },
417
+ context: { type: 'object' }
418
+ },
419
+ required: ['level', 'format', 'transports'],
420
+ additionalProperties: false
421
+ },
422
+
423
+ monitoring: {
424
+ type: 'object',
425
+ properties: {
426
+ enabled: { type: 'boolean' },
427
+ metrics: {
428
+ type: 'object',
429
+ properties: {
430
+ enabled: { type: 'boolean' },
431
+ collectInterval: { type: 'number', minimum: 1000 },
432
+ httpMetrics: { type: 'boolean' },
433
+ systemMetrics: { type: 'boolean' },
434
+ customMetrics: { type: 'boolean' }
435
+ },
436
+ required: ['enabled', 'collectInterval', 'httpMetrics', 'systemMetrics', 'customMetrics'],
437
+ additionalProperties: false
438
+ },
439
+ profiling: {
440
+ type: 'object',
441
+ properties: {
442
+ enabled: { type: 'boolean' },
443
+ sampleRate: { type: 'number', minimum: 0, maximum: 1 },
444
+ memoryProfiling: { type: 'boolean' },
445
+ cpuProfiling: { type: 'boolean' }
446
+ },
447
+ required: ['enabled', 'sampleRate', 'memoryProfiling', 'cpuProfiling'],
448
+ additionalProperties: false
449
+ },
450
+ exporters: {
451
+ type: 'array',
452
+ items: { type: 'string' }
453
+ }
454
+ },
455
+ required: ['enabled', 'metrics', 'profiling', 'exporters'],
456
+ additionalProperties: false
457
+ },
458
+
459
+ // Optional configurations
460
+ database: {
461
+ type: 'object',
462
+ properties: {
463
+ url: { type: 'string' },
464
+ host: { type: 'string' },
465
+ port: { type: 'number', minimum: 1, maximum: 65535 },
466
+ database: { type: 'string' },
467
+ user: { type: 'string' },
468
+ password: { type: 'string' },
469
+ ssl: { type: 'boolean' },
470
+ poolSize: { type: 'number', minimum: 1 }
471
+ },
472
+ additionalProperties: false
473
+ },
474
+
475
+ auth: {
476
+ type: 'object',
477
+ properties: {
478
+ secret: { type: 'string', minLength: 32 },
479
+ expiresIn: { type: 'string' },
480
+ algorithm: { type: 'string' },
481
+ issuer: { type: 'string' }
482
+ },
483
+ additionalProperties: false
484
+ },
485
+
486
+ email: {
487
+ type: 'object',
488
+ properties: {
489
+ host: { type: 'string' },
490
+ port: { type: 'number', minimum: 1, maximum: 65535 },
491
+ user: { type: 'string' },
492
+ password: { type: 'string' },
493
+ secure: { type: 'boolean' },
494
+ from: { type: 'string' }
495
+ },
496
+ additionalProperties: false
497
+ },
498
+
499
+ storage: {
500
+ type: 'object',
501
+ properties: {
502
+ uploadPath: { type: 'string' },
503
+ maxFileSize: { type: 'number', minimum: 1 },
504
+ allowedTypes: {
505
+ type: 'array',
506
+ items: { type: 'string' }
507
+ },
508
+ provider: {
509
+ type: 'string',
510
+ enum: ['local', 's3', 'gcs']
511
+ },
512
+ config: { type: 'object' }
513
+ },
514
+ additionalProperties: false
515
+ },
516
+
517
+ environments: {
518
+ type: 'object',
519
+ additionalProperties: {
520
+ // Recursive reference to partial config
521
+ type: 'object'
522
+ }
523
+ },
524
+
525
+ custom: {
526
+ type: 'object',
527
+ description: 'Custom application-specific configuration'
528
+ }
529
+ },
530
+ required: ['app', 'server', 'client', 'build', 'plugins', 'logging', 'monitoring'],
531
+ additionalProperties: false
532
+ }
533
+
534
+ // Default configuration values
535
+ export const defaultFluxStackConfig: FluxStackConfig = {
536
+ app: {
537
+ name: 'fluxstack-app',
538
+ version: '1.0.0',
539
+ description: 'A FluxStack application'
540
+ },
541
+
542
+ server: {
543
+ port: 3000,
544
+ host: 'localhost',
545
+ apiPrefix: '/api',
546
+ cors: {
547
+ origins: ['http://localhost:3000', 'http://localhost:5173'],
548
+ methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
549
+ headers: ['Content-Type', 'Authorization'],
550
+ credentials: true,
551
+ maxAge: 86400
552
+ },
553
+ middleware: []
554
+ },
555
+
556
+ client: {
557
+ port: 5173,
558
+ proxy: {
559
+ target: 'http://localhost:3000',
560
+ changeOrigin: true
561
+ },
562
+ build: {
563
+ sourceMaps: true,
564
+ minify: false,
565
+ target: 'esnext',
566
+ outDir: 'dist/client'
567
+ }
568
+ },
569
+
570
+ build: {
571
+ target: 'bun',
572
+ outDir: 'dist',
573
+ optimization: {
574
+ minify: true,
575
+ treeshake: true,
576
+ compress: true,
577
+ splitChunks: true,
578
+ bundleAnalyzer: false
579
+ },
580
+ sourceMaps: true,
581
+ clean: true
582
+ },
583
+
584
+ plugins: {
585
+ enabled: ['logger', 'swagger', 'vite', 'cors'],
586
+ disabled: [],
587
+ config: {}
588
+ },
589
+
590
+ logging: {
591
+ level: 'info',
592
+ format: 'pretty',
593
+ transports: [
594
+ {
595
+ type: 'console',
596
+ level: 'info',
597
+ format: 'pretty'
598
+ }
599
+ ]
600
+ },
601
+
602
+ monitoring: {
603
+ enabled: false,
604
+ metrics: {
605
+ enabled: false,
606
+ collectInterval: 5000,
607
+ httpMetrics: true,
608
+ systemMetrics: true,
609
+ customMetrics: false
610
+ },
611
+ profiling: {
612
+ enabled: false,
613
+ sampleRate: 0.1,
614
+ memoryProfiling: false,
615
+ cpuProfiling: false
616
+ },
617
+ exporters: []
618
+ }
619
+ }
620
+
621
+ // Environment-specific default overrides
622
+ export const environmentDefaults = {
623
+ development: {
624
+ logging: {
625
+ level: 'debug' as LogLevel,
626
+ format: 'pretty' as LogFormat
627
+ },
628
+ client: {
629
+ build: {
630
+ minify: false,
631
+ sourceMaps: true
632
+ }
633
+ },
634
+ build: {
635
+ optimization: {
636
+ minify: false,
637
+ compress: false
638
+ }
639
+ }
640
+ },
641
+
642
+ production: {
643
+ logging: {
644
+ level: 'warn' as LogLevel,
645
+ format: 'json' as LogFormat,
646
+ transports: [
647
+ {
648
+ type: 'console' as const,
649
+ level: 'warn' as LogLevel,
650
+ format: 'json' as LogFormat
651
+ },
652
+ {
653
+ type: 'file' as const,
654
+ level: 'error' as LogLevel,
655
+ format: 'json' as LogFormat,
656
+ options: {
657
+ filename: 'logs/error.log',
658
+ maxSize: '10m',
659
+ maxFiles: 5
660
+ }
661
+ }
662
+ ]
663
+ },
664
+ monitoring: {
665
+ enabled: true,
666
+ metrics: {
667
+ enabled: true,
668
+ httpMetrics: true,
669
+ systemMetrics: true
670
+ }
671
+ },
672
+ build: {
673
+ optimization: {
674
+ minify: true,
675
+ treeshake: true,
676
+ compress: true,
677
+ splitChunks: true
678
+ }
679
+ }
680
+ },
681
+
682
+ test: {
683
+ logging: {
684
+ level: 'error' as LogLevel,
685
+ format: 'json' as LogFormat
686
+ },
687
+ server: {
688
+ port: 0 // Use random available port
689
+ },
690
+ client: {
691
+ port: 0 // Use random available port
692
+ }
693
+ }
694
+ } as const