create-fluxstack 1.10.1 → 1.12.1
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.
- package/.dockerignore +1 -2
- package/Dockerfile +8 -8
- package/LLMD/INDEX.md +64 -0
- package/LLMD/MAINTENANCE.md +197 -0
- package/LLMD/MIGRATION.md +156 -0
- package/LLMD/config/.gitkeep +1 -0
- package/LLMD/config/declarative-system.md +268 -0
- package/LLMD/config/environment-vars.md +327 -0
- package/LLMD/config/runtime-reload.md +401 -0
- package/LLMD/core/.gitkeep +1 -0
- package/LLMD/core/build-system.md +599 -0
- package/LLMD/core/framework-lifecycle.md +229 -0
- package/LLMD/core/plugin-system.md +451 -0
- package/LLMD/patterns/.gitkeep +1 -0
- package/LLMD/patterns/anti-patterns.md +297 -0
- package/LLMD/patterns/project-structure.md +264 -0
- package/LLMD/patterns/type-safety.md +440 -0
- package/LLMD/reference/.gitkeep +1 -0
- package/LLMD/reference/cli-commands.md +250 -0
- package/LLMD/reference/plugin-hooks.md +357 -0
- package/LLMD/reference/routing.md +39 -0
- package/LLMD/reference/troubleshooting.md +364 -0
- package/LLMD/resources/.gitkeep +1 -0
- package/LLMD/resources/controllers.md +465 -0
- package/LLMD/resources/live-components.md +703 -0
- package/LLMD/resources/live-rooms.md +482 -0
- package/LLMD/resources/live-upload.md +130 -0
- package/LLMD/resources/plugins-external.md +617 -0
- package/LLMD/resources/routes-eden.md +254 -0
- package/README.md +37 -17
- package/app/client/index.html +0 -1
- package/app/client/src/App.tsx +107 -150
- package/app/client/src/components/AppLayout.tsx +68 -0
- package/app/client/src/components/BackButton.tsx +13 -0
- package/app/client/src/components/DemoPage.tsx +20 -0
- package/app/client/src/components/LiveUploadWidget.tsx +204 -0
- package/app/client/src/lib/eden-api.ts +85 -60
- package/app/client/src/live/ChatDemo.tsx +107 -0
- package/app/client/src/live/CounterDemo.tsx +206 -0
- package/app/client/src/live/FormDemo.tsx +119 -0
- package/app/client/src/live/RoomChatDemo.tsx +161 -0
- package/app/client/src/live/UploadDemo.tsx +21 -0
- package/app/client/src/main.tsx +4 -1
- package/app/client/src/pages/ApiTestPage.tsx +108 -0
- package/app/client/src/pages/HomePage.tsx +76 -0
- package/app/server/app.ts +1 -4
- package/app/server/controllers/users.controller.ts +36 -44
- package/app/server/index.ts +25 -35
- package/app/server/live/LiveChat.ts +77 -0
- package/app/server/live/LiveCounter.ts +67 -0
- package/app/server/live/LiveForm.ts +63 -0
- package/app/server/live/LiveLocalCounter.ts +32 -0
- package/app/server/live/LiveRoomChat.ts +127 -0
- package/app/server/live/LiveUpload.ts +81 -0
- package/app/server/routes/index.ts +3 -1
- package/app/server/routes/room.routes.ts +117 -0
- package/app/server/routes/users.routes.ts +35 -27
- package/app/shared/types/index.ts +14 -2
- package/config/app.config.ts +2 -62
- package/config/client.config.ts +2 -95
- package/config/database.config.ts +2 -99
- package/config/fluxstack.config.ts +25 -45
- package/config/index.ts +57 -38
- package/config/monitoring.config.ts +2 -114
- package/config/plugins.config.ts +2 -80
- package/config/server.config.ts +2 -68
- package/config/services.config.ts +2 -130
- package/config/system/app.config.ts +29 -0
- package/config/system/build.config.ts +49 -0
- package/config/system/client.config.ts +68 -0
- package/config/system/database.config.ts +17 -0
- package/config/system/fluxstack.config.ts +114 -0
- package/config/{logger.config.ts → system/logger.config.ts} +3 -1
- package/config/system/monitoring.config.ts +114 -0
- package/config/system/plugins.config.ts +84 -0
- package/config/{runtime.config.ts → system/runtime.config.ts} +1 -1
- package/config/system/server.config.ts +68 -0
- package/config/system/services.config.ts +46 -0
- package/config/{system.config.ts → system/system.config.ts} +1 -1
- package/core/build/flux-plugins-generator.ts +325 -325
- package/core/build/index.ts +39 -27
- package/core/build/live-components-generator.ts +3 -3
- package/core/build/optimizer.ts +235 -235
- package/core/cli/command-registry.ts +6 -4
- package/core/cli/commands/build.ts +79 -0
- package/core/cli/commands/create.ts +54 -0
- package/core/cli/commands/dev.ts +101 -0
- package/core/cli/commands/help.ts +34 -0
- package/core/cli/commands/index.ts +34 -0
- package/core/cli/commands/make-plugin.ts +90 -0
- package/core/cli/commands/plugin-add.ts +197 -0
- package/core/cli/commands/plugin-deps.ts +2 -2
- package/core/cli/commands/plugin-list.ts +208 -0
- package/core/cli/commands/plugin-remove.ts +170 -0
- package/core/cli/generators/component.ts +769 -769
- package/core/cli/generators/controller.ts +1 -1
- package/core/cli/generators/index.ts +146 -146
- package/core/cli/generators/interactive.ts +227 -227
- package/core/cli/generators/plugin.ts +2 -2
- package/core/cli/generators/prompts.ts +82 -82
- package/core/cli/generators/route.ts +6 -6
- package/core/cli/generators/service.ts +2 -2
- package/core/cli/generators/template-engine.ts +4 -3
- package/core/cli/generators/types.ts +2 -2
- package/core/cli/generators/utils.ts +191 -191
- package/core/cli/index.ts +115 -686
- package/core/cli/plugin-discovery.ts +2 -2
- package/core/client/LiveComponentsProvider.tsx +60 -8
- package/core/client/api/eden.ts +183 -0
- package/core/client/api/index.ts +11 -0
- package/core/client/components/Live.tsx +104 -0
- package/core/client/fluxstack.ts +1 -9
- package/core/client/hooks/AdaptiveChunkSizer.ts +215 -215
- package/core/client/hooks/state-validator.ts +1 -1
- package/core/client/hooks/useAuth.ts +48 -48
- package/core/client/hooks/useChunkedUpload.ts +85 -35
- package/core/client/hooks/useLiveChunkedUpload.ts +87 -0
- package/core/client/hooks/useLiveComponent.ts +800 -0
- package/core/client/hooks/useLiveUpload.ts +71 -0
- package/core/client/hooks/useRoom.ts +409 -0
- package/core/client/hooks/useRoomProxy.ts +382 -0
- package/core/client/index.ts +17 -68
- package/core/client/standalone-entry.ts +8 -0
- package/core/client/standalone.ts +74 -53
- package/core/client/state/createStore.ts +192 -192
- package/core/client/state/index.ts +14 -14
- package/core/config/index.ts +70 -291
- package/core/config/schema.ts +42 -723
- package/core/framework/client.ts +131 -131
- package/core/framework/index.ts +7 -7
- package/core/framework/server.ts +47 -40
- package/core/framework/types.ts +2 -2
- package/core/index.ts +23 -4
- package/core/live/ComponentRegistry.ts +3 -3
- package/core/live/types.ts +77 -0
- package/core/plugins/built-in/index.ts +134 -134
- package/core/plugins/built-in/live-components/commands/create-live-component.ts +242 -1066
- package/core/plugins/built-in/live-components/index.ts +1 -1
- package/core/plugins/built-in/monitoring/index.ts +111 -47
- package/core/plugins/built-in/static/index.ts +1 -1
- package/core/plugins/built-in/swagger/index.ts +68 -265
- package/core/plugins/built-in/vite/index.ts +85 -185
- package/core/plugins/built-in/vite/vite-dev.ts +10 -16
- package/core/plugins/config.ts +9 -7
- package/core/plugins/dependency-manager.ts +31 -1
- package/core/plugins/discovery.ts +19 -7
- package/core/plugins/executor.ts +2 -2
- package/core/plugins/index.ts +203 -203
- package/core/plugins/manager.ts +27 -39
- package/core/plugins/module-resolver.ts +19 -8
- package/core/plugins/registry.ts +255 -19
- package/core/plugins/types.ts +20 -53
- package/core/server/framework.ts +66 -43
- package/core/server/index.ts +15 -15
- package/core/server/live/ComponentRegistry.ts +78 -71
- package/core/server/live/FileUploadManager.ts +23 -10
- package/core/server/live/LiveComponentPerformanceMonitor.ts +1 -1
- package/core/server/live/LiveRoomManager.ts +261 -0
- package/core/server/live/RoomEventBus.ts +234 -0
- package/core/server/live/RoomStateManager.ts +172 -0
- package/core/server/live/StateSignature.ts +643 -643
- package/core/server/live/WebSocketConnectionManager.ts +30 -19
- package/core/server/live/auto-generated-components.ts +21 -9
- package/core/server/live/index.ts +14 -0
- package/core/server/live/websocket-plugin.ts +214 -67
- package/core/server/middleware/elysia-helpers.ts +7 -2
- package/core/server/middleware/errorHandling.ts +1 -1
- package/core/server/middleware/index.ts +31 -31
- package/core/server/plugins/database.ts +180 -180
- package/core/server/plugins/static-files-plugin.ts +69 -69
- package/core/server/plugins/swagger.ts +1 -1
- package/core/server/rooms/RoomBroadcaster.ts +357 -0
- package/core/server/rooms/RoomSystem.ts +463 -0
- package/core/server/rooms/index.ts +13 -0
- package/core/server/services/BaseService.ts +1 -1
- package/core/server/services/ServiceContainer.ts +1 -1
- package/core/server/services/index.ts +8 -8
- package/core/templates/create-project.ts +12 -12
- package/core/testing/index.ts +9 -9
- package/core/testing/setup.ts +73 -73
- package/core/types/api.ts +168 -168
- package/core/types/build.ts +219 -219
- package/core/types/config.ts +56 -26
- package/core/types/index.ts +4 -4
- package/core/types/plugin.ts +107 -107
- package/core/types/types.ts +353 -14
- package/core/utils/build-logger.ts +324 -324
- package/core/utils/config-schema.ts +480 -480
- package/core/utils/env.ts +2 -8
- package/core/utils/errors/codes.ts +114 -114
- package/core/utils/errors/handlers.ts +36 -1
- package/core/utils/errors/index.ts +49 -5
- package/core/utils/errors/middleware.ts +113 -113
- package/core/utils/helpers.ts +6 -16
- package/core/utils/index.ts +17 -17
- package/core/utils/logger/colors.ts +114 -114
- package/core/utils/logger/config.ts +13 -9
- package/core/utils/logger/formatter.ts +82 -82
- package/core/utils/logger/group-logger.ts +101 -101
- package/core/utils/logger/index.ts +6 -1
- package/core/utils/logger/stack-trace.ts +3 -1
- package/core/utils/logger/startup-banner.ts +82 -82
- package/core/utils/logger/winston-logger.ts +152 -152
- package/core/utils/monitoring/index.ts +211 -211
- package/core/utils/sync-version.ts +66 -66
- package/core/utils/version.ts +1 -1
- package/create-fluxstack.ts +8 -7
- package/package.json +12 -13
- package/plugins/crypto-auth/cli/make-protected-route.command.ts +1 -1
- package/plugins/crypto-auth/client/CryptoAuthClient.ts +302 -302
- package/plugins/crypto-auth/client/components/index.ts +11 -11
- package/plugins/crypto-auth/client/index.ts +11 -11
- package/plugins/crypto-auth/config/index.ts +1 -1
- package/plugins/crypto-auth/index.ts +4 -4
- package/plugins/crypto-auth/package.json +65 -65
- package/plugins/crypto-auth/server/AuthMiddleware.ts +1 -1
- package/plugins/crypto-auth/server/CryptoAuthService.ts +185 -185
- package/plugins/crypto-auth/server/index.ts +21 -21
- package/plugins/crypto-auth/server/middlewares/cryptoAuthAdmin.ts +3 -3
- package/plugins/crypto-auth/server/middlewares/cryptoAuthOptional.ts +1 -1
- package/plugins/crypto-auth/server/middlewares/cryptoAuthPermissions.ts +2 -2
- package/plugins/crypto-auth/server/middlewares/cryptoAuthRequired.ts +2 -2
- package/plugins/crypto-auth/server/middlewares/helpers.ts +1 -1
- package/plugins/crypto-auth/server/middlewares/index.ts +22 -22
- package/tsconfig.api-strict.json +16 -0
- package/tsconfig.json +48 -52
- package/{app/client/tsconfig.node.json → tsconfig.node.json} +25 -25
- package/types/global.d.ts +29 -29
- package/types/vitest.d.ts +8 -8
- package/vite.config.ts +38 -62
- package/vitest.config.live.ts +10 -9
- package/vitest.config.ts +29 -17
- package/app/client/README.md +0 -69
- package/app/client/SIMPLIFICATION.md +0 -140
- package/app/client/frontend-only.ts +0 -12
- package/app/client/src/live/FileUploadExample.tsx +0 -359
- package/app/client/src/live/MinimalLiveClock.tsx +0 -47
- package/app/client/src/live/QuickUploadTest.tsx +0 -193
- package/app/client/tsconfig.app.json +0 -45
- package/app/client/tsconfig.json +0 -7
- package/app/client/zustand-setup.md +0 -65
- package/app/server/backend-only.ts +0 -18
- package/app/server/live/LiveClockComponent.ts +0 -215
- package/app/server/live/LiveFileUploadComponent.ts +0 -77
- package/app/server/routes/env-test.ts +0 -110
- package/core/client/hooks/index.ts +0 -7
- package/core/client/hooks/useHybridLiveComponent.ts +0 -685
- package/core/client/hooks/useTypedLiveComponent.ts +0 -133
- package/core/client/hooks/useWebSocket.ts +0 -361
- package/core/config/env.ts +0 -546
- package/core/config/loader.ts +0 -522
- package/core/config/runtime-config.ts +0 -327
- package/core/config/validator.ts +0 -540
- package/core/server/backend-entry.ts +0 -51
- package/core/server/standalone.ts +0 -106
- package/core/utils/regenerate-files.ts +0 -69
- package/fluxstack.config.ts +0 -354
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build Configuration
|
|
3
|
+
* Server build and optimization settings
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineConfig, defineNestedConfig, config } from '@core/utils/config-schema'
|
|
7
|
+
import { helpers } from '@core/utils/env'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Build optimization schema
|
|
11
|
+
*/
|
|
12
|
+
const optimizationSchema = {
|
|
13
|
+
minify: config.boolean('BUILD_MINIFY', helpers.isProduction()),
|
|
14
|
+
treeshake: config.boolean('BUILD_TREESHAKE', true),
|
|
15
|
+
compress: config.boolean('BUILD_COMPRESS', helpers.isProduction()),
|
|
16
|
+
splitChunks: config.boolean('BUILD_SPLIT_CHUNKS', true),
|
|
17
|
+
bundleAnalyzer: config.boolean('BUILD_BUNDLE_ANALYZER', false),
|
|
18
|
+
removeUnusedCSS: config.boolean('BUILD_REMOVE_UNUSED_CSS', false),
|
|
19
|
+
optimizeImages: config.boolean('BUILD_OPTIMIZE_IMAGES', false)
|
|
20
|
+
} as const
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Build configuration schema
|
|
24
|
+
*/
|
|
25
|
+
const buildSchema = {
|
|
26
|
+
target: config.enum('BUILD_TARGET', ['bun', 'node', 'docker'] as const, 'bun', true),
|
|
27
|
+
outDir: config.string('BUILD_OUT_DIR', 'dist', true),
|
|
28
|
+
sourceMaps: config.boolean('BUILD_SOURCE_MAPS', helpers.isDevelopment()),
|
|
29
|
+
clean: config.boolean('BUILD_CLEAN', true),
|
|
30
|
+
mode: config.enum('BUILD_MODE', ['development', 'production'] as const, helpers.isProduction() ? 'production' : 'development'),
|
|
31
|
+
external: config.array('BUILD_EXTERNAL', []),
|
|
32
|
+
optimize: config.boolean('BUILD_OPTIMIZE', true)
|
|
33
|
+
} as const
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Export build config (nested with optimization)
|
|
37
|
+
*/
|
|
38
|
+
export const buildConfig = defineNestedConfig({
|
|
39
|
+
build: buildSchema,
|
|
40
|
+
optimization: optimizationSchema
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
// Export types
|
|
44
|
+
export type BuildConfig = typeof buildConfig.build
|
|
45
|
+
export type OptimizationConfig = typeof buildConfig.optimization
|
|
46
|
+
export type BuildFullConfig = typeof buildConfig
|
|
47
|
+
|
|
48
|
+
// Export default
|
|
49
|
+
export default buildConfig
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client & Vite Configuration
|
|
3
|
+
* Declarative client, proxy and Vite dev server configuration
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineConfig, defineNestedConfig, config } from '../../core/utils/config-schema'
|
|
7
|
+
import { env, helpers } from '../../core/utils/env'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Vite Dev Server Configuration
|
|
11
|
+
*/
|
|
12
|
+
const viteSchema = {
|
|
13
|
+
port: config.number('VITE_PORT', 5173, true),
|
|
14
|
+
|
|
15
|
+
host: config.string('VITE_HOST', 'localhost'),
|
|
16
|
+
|
|
17
|
+
strictPort: config.boolean('VITE_STRICT_PORT', true),
|
|
18
|
+
|
|
19
|
+
open: config.boolean('VITE_OPEN', false),
|
|
20
|
+
|
|
21
|
+
enableLogging: config.boolean('ENABLE_VITE_PROXY_LOGS', false),
|
|
22
|
+
|
|
23
|
+
logLevel: config.enum('VITE_LOG_LEVEL', ['error' , 'warn' , 'info', 'silent'], undefined),
|
|
24
|
+
|
|
25
|
+
allowedHosts: config.array('VITE_ALLOWED_HOSTS', ['localhost'])
|
|
26
|
+
} as const
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Client Build Configuration
|
|
30
|
+
*/
|
|
31
|
+
const buildSchema = {
|
|
32
|
+
outDir: config.string('CLIENT_OUTDIR', 'dist/client'),
|
|
33
|
+
|
|
34
|
+
sourceMaps: config.boolean('CLIENT_SOURCEMAPS', helpers.isDevelopment()),
|
|
35
|
+
|
|
36
|
+
minify: config.boolean('CLIENT_MINIFY', helpers.isProduction()),
|
|
37
|
+
|
|
38
|
+
target: config.string('CLIENT_TARGET', 'esnext'),
|
|
39
|
+
|
|
40
|
+
assetsDir: config.string('CLIENT_ASSETS_DIR', 'assets'),
|
|
41
|
+
|
|
42
|
+
cssCodeSplit: config.boolean('CLIENT_CSS_CODE_SPLIT', true),
|
|
43
|
+
|
|
44
|
+
chunkSizeWarningLimit: config.number('CLIENT_CHUNK_SIZE_WARNING', 500), // KB
|
|
45
|
+
|
|
46
|
+
emptyOutDir: config.boolean('CLIENT_EMPTY_OUTDIR', true)
|
|
47
|
+
} as const
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Client Configuration (nested)
|
|
51
|
+
*/
|
|
52
|
+
export const clientConfig = defineNestedConfig({
|
|
53
|
+
vite: viteSchema,
|
|
54
|
+
build: buildSchema,
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
// ℹ️ Proxy config removed: Not needed in FluxStack architecture
|
|
58
|
+
// All requests go through Elysia (localhost:3000):
|
|
59
|
+
// - /api, /swagger → Elysia handlers (viteExcludePaths)
|
|
60
|
+
// - Everything else → Proxy to Vite dev server (handled by core/plugins/built-in/vite)
|
|
61
|
+
|
|
62
|
+
// Export types
|
|
63
|
+
export type ViteConfig = typeof clientConfig.vite
|
|
64
|
+
export type ClientBuildConfig = typeof clientConfig.build
|
|
65
|
+
export type ClientConfig = typeof clientConfig
|
|
66
|
+
|
|
67
|
+
// Export default
|
|
68
|
+
export default clientConfig
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Configuration
|
|
3
|
+
* Optional database settings for backward compatibility
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineConfig, config } from '@core/utils/config-schema'
|
|
7
|
+
|
|
8
|
+
export const databaseConfig = defineConfig({
|
|
9
|
+
url: config.string('DATABASE_URL', ''),
|
|
10
|
+
provider: config.enum('DATABASE_PROVIDER', ['postgres', 'mysql', 'sqlite', 'mssql', 'mongodb'] as const, 'postgres'),
|
|
11
|
+
connectionTimeout: config.number('DATABASE_CONNECTION_TIMEOUT', 5000),
|
|
12
|
+
ssl: config.boolean('DATABASE_SSL', false)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
export type DatabaseConfig = typeof databaseConfig
|
|
16
|
+
|
|
17
|
+
export default databaseConfig
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FluxStack Main Configuration
|
|
3
|
+
* Composes all modular system configs into a single unified configuration
|
|
4
|
+
*
|
|
5
|
+
* ✨ 100% modular and type-safe using defineConfig
|
|
6
|
+
* ✨ No composer needed - direct config composition
|
|
7
|
+
* ✨ All configs use defineConfig for automatic validation and inference
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { appConfig } from './app.config'
|
|
11
|
+
import { serverConfig } from './server.config'
|
|
12
|
+
import { clientConfig } from './client.config'
|
|
13
|
+
import { buildConfig } from './build.config'
|
|
14
|
+
import { loggerConfig } from './logger.config'
|
|
15
|
+
import { pluginsConfig } from './plugins.config'
|
|
16
|
+
import { monitoringConfig } from './monitoring.config'
|
|
17
|
+
import { appRuntimeConfig } from './runtime.config'
|
|
18
|
+
import { systemConfig } from './system.config'
|
|
19
|
+
import { databaseConfig } from './database.config'
|
|
20
|
+
import { servicesConfig } from './services.config'
|
|
21
|
+
|
|
22
|
+
const serverWithCors = {
|
|
23
|
+
...serverConfig.server,
|
|
24
|
+
cors: {
|
|
25
|
+
origins: serverConfig.cors.origins,
|
|
26
|
+
methods: serverConfig.cors.methods,
|
|
27
|
+
headers: serverConfig.cors.headers,
|
|
28
|
+
credentials: serverConfig.cors.credentials,
|
|
29
|
+
maxAge: serverConfig.cors.maxAge
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const client = {
|
|
34
|
+
port: clientConfig.vite.port,
|
|
35
|
+
host: clientConfig.vite.host,
|
|
36
|
+
build: {
|
|
37
|
+
...clientConfig.build,
|
|
38
|
+
sourceMaps: true
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const monitoring = {
|
|
43
|
+
...monitoringConfig.monitoring,
|
|
44
|
+
metrics: monitoringConfig.metrics,
|
|
45
|
+
profiling: monitoringConfig.profiling
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const environments = {
|
|
49
|
+
development: {
|
|
50
|
+
logging: { level: 'debug', format: 'pretty' },
|
|
51
|
+
build: { optimization: { ...buildConfig.optimization, minify: false } }
|
|
52
|
+
},
|
|
53
|
+
production: {
|
|
54
|
+
logging: { level: 'warn', format: 'json' },
|
|
55
|
+
monitoring: { enabled: true }
|
|
56
|
+
},
|
|
57
|
+
test: {
|
|
58
|
+
logging: { level: 'error', format: 'pretty' },
|
|
59
|
+
server: { port: 0 },
|
|
60
|
+
client: { port: 0 }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* FluxStack complete configuration
|
|
66
|
+
* Direct composition of all modular configs
|
|
67
|
+
*/
|
|
68
|
+
export const fluxStackConfig = {
|
|
69
|
+
// Core system configs
|
|
70
|
+
app: appConfig,
|
|
71
|
+
server: serverWithCors,
|
|
72
|
+
client,
|
|
73
|
+
build: {
|
|
74
|
+
...buildConfig.build,
|
|
75
|
+
optimization: {
|
|
76
|
+
...buildConfig.optimization,
|
|
77
|
+
minify: true
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
// CORS (from server)
|
|
82
|
+
cors: serverConfig.cors,
|
|
83
|
+
|
|
84
|
+
// Client Build (from client)
|
|
85
|
+
clientBuild: clientConfig.build,
|
|
86
|
+
|
|
87
|
+
// Build optimization
|
|
88
|
+
optimization: buildConfig.optimization,
|
|
89
|
+
|
|
90
|
+
// Logging, plugins, monitoring
|
|
91
|
+
logging: loggerConfig,
|
|
92
|
+
plugins: pluginsConfig,
|
|
93
|
+
monitoring,
|
|
94
|
+
|
|
95
|
+
// Runtime & system
|
|
96
|
+
runtime: appRuntimeConfig.values,
|
|
97
|
+
system: systemConfig,
|
|
98
|
+
database: databaseConfig,
|
|
99
|
+
services: servicesConfig,
|
|
100
|
+
|
|
101
|
+
// Environment defaults (backward compatibility)
|
|
102
|
+
environments
|
|
103
|
+
} as const
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Type for the complete FluxStack configuration
|
|
107
|
+
*/
|
|
108
|
+
export type FluxStackConfig = typeof fluxStackConfig
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Named exports
|
|
112
|
+
*/
|
|
113
|
+
export default fluxStackConfig
|
|
114
|
+
export { fluxStackConfig as config }
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
* Declarative logger config using FluxStack config system
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { defineConfig, config } from '
|
|
6
|
+
import { defineConfig, config } from '@core/utils/config-schema'
|
|
7
7
|
|
|
8
8
|
export const loggerConfig = defineConfig({
|
|
9
9
|
// Log level
|
|
10
10
|
level: config.enum('LOG_LEVEL', ['debug', 'info', 'warn', 'error'] as const, 'info'),
|
|
11
|
+
format: config.enum('LOG_FORMAT', ['pretty', 'json'] as const, 'pretty'),
|
|
11
12
|
|
|
12
13
|
// Format settings
|
|
13
14
|
dateFormat: config.string('LOG_DATE_FORMAT', 'YYYY-MM-DD HH:mm:ss'),
|
|
@@ -17,6 +18,7 @@ export const loggerConfig = defineConfig({
|
|
|
17
18
|
logToFile: config.boolean('LOG_TO_FILE', false),
|
|
18
19
|
maxSize: config.string('LOG_MAX_SIZE', '20m'),
|
|
19
20
|
maxFiles: config.string('LOG_MAX_FILES', '14d'),
|
|
21
|
+
transports: config.array('LOG_TRANSPORTS', ['console']),
|
|
20
22
|
|
|
21
23
|
// Display options
|
|
22
24
|
enableColors: config.boolean('LOG_COLORS', true),
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monitoring Configuration
|
|
3
|
+
* Declarative monitoring, metrics and profiling configuration
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineConfig, defineNestedConfig, config } from '@core/utils/config-schema'
|
|
7
|
+
import { helpers } from '@core/utils/env'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Metrics Configuration Schema
|
|
11
|
+
*/
|
|
12
|
+
const metricsSchema = {
|
|
13
|
+
enabled: config.boolean('ENABLE_METRICS', false),
|
|
14
|
+
|
|
15
|
+
collectInterval: {
|
|
16
|
+
type: 'number' as const,
|
|
17
|
+
env: 'METRICS_INTERVAL',
|
|
18
|
+
default: 5000,
|
|
19
|
+
validate: (value: number) => {
|
|
20
|
+
if (value < 1000) {
|
|
21
|
+
return 'Metrics interval must be at least 1000ms'
|
|
22
|
+
}
|
|
23
|
+
return true
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
httpMetrics: config.boolean('HTTP_METRICS', true),
|
|
28
|
+
|
|
29
|
+
systemMetrics: config.boolean('SYSTEM_METRICS', true),
|
|
30
|
+
|
|
31
|
+
customMetrics: config.boolean('CUSTOM_METRICS', false),
|
|
32
|
+
|
|
33
|
+
// Metric exporters
|
|
34
|
+
exportToConsole: config.boolean('METRICS_EXPORT_CONSOLE', helpers.isDevelopment()),
|
|
35
|
+
|
|
36
|
+
exportToFile: config.boolean('METRICS_EXPORT_FILE', false),
|
|
37
|
+
|
|
38
|
+
exportToHttp: config.boolean('METRICS_EXPORT_HTTP', false),
|
|
39
|
+
|
|
40
|
+
exportHttpUrl: config.string('METRICS_EXPORT_URL'),
|
|
41
|
+
|
|
42
|
+
// Metric storage
|
|
43
|
+
retentionPeriod: config.number('METRICS_RETENTION_PERIOD', 3600000), // 1 hour in ms
|
|
44
|
+
|
|
45
|
+
maxDataPoints: config.number('METRICS_MAX_DATA_POINTS', 1000)
|
|
46
|
+
} as const
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Profiling Configuration Schema
|
|
50
|
+
*/
|
|
51
|
+
const profilingSchema = {
|
|
52
|
+
enabled: config.boolean('PROFILING_ENABLED', false),
|
|
53
|
+
|
|
54
|
+
sampleRate: {
|
|
55
|
+
type: 'number' as const,
|
|
56
|
+
env: 'PROFILING_SAMPLE_RATE',
|
|
57
|
+
default: helpers.isProduction() ? 0.01 : 0.1,
|
|
58
|
+
validate: (value: number) => {
|
|
59
|
+
if (value < 0 || value > 1) {
|
|
60
|
+
return 'Sample rate must be between 0 and 1'
|
|
61
|
+
}
|
|
62
|
+
return true
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
memoryProfiling: config.boolean('MEMORY_PROFILING', false),
|
|
67
|
+
|
|
68
|
+
cpuProfiling: config.boolean('CPU_PROFILING', false),
|
|
69
|
+
|
|
70
|
+
heapSnapshot: config.boolean('HEAP_SNAPSHOT', false),
|
|
71
|
+
|
|
72
|
+
// Profiling output
|
|
73
|
+
outputDir: config.string('PROFILING_OUTPUT_DIR', 'profiling'),
|
|
74
|
+
|
|
75
|
+
maxProfiles: config.number('PROFILING_MAX_PROFILES', 10)
|
|
76
|
+
} as const
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Monitoring Configuration Schema
|
|
80
|
+
*/
|
|
81
|
+
const monitoringSchema = {
|
|
82
|
+
enabled: config.boolean('ENABLE_MONITORING', false),
|
|
83
|
+
|
|
84
|
+
// Exporters
|
|
85
|
+
exporters: config.array('MONITORING_EXPORTERS', []),
|
|
86
|
+
|
|
87
|
+
// Health checks
|
|
88
|
+
enableHealthChecks: config.boolean('ENABLE_HEALTH_CHECKS', true),
|
|
89
|
+
|
|
90
|
+
healthCheckInterval: config.number('HEALTH_CHECK_INTERVAL', 30000), // 30s
|
|
91
|
+
|
|
92
|
+
// Alerting
|
|
93
|
+
enableAlerts: config.boolean('ENABLE_ALERTS', false),
|
|
94
|
+
|
|
95
|
+
alertWebhook: config.string('ALERT_WEBHOOK')
|
|
96
|
+
} as const
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Export monitoring config (nested)
|
|
100
|
+
*/
|
|
101
|
+
export const monitoringConfig = defineNestedConfig({
|
|
102
|
+
monitoring: monitoringSchema,
|
|
103
|
+
metrics: metricsSchema,
|
|
104
|
+
profiling: profilingSchema
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
// Export types
|
|
108
|
+
export type MonitoringConfig = typeof monitoringConfig.monitoring
|
|
109
|
+
export type MetricsConfig = typeof monitoringConfig.metrics
|
|
110
|
+
export type ProfilingConfig = typeof monitoringConfig.profiling
|
|
111
|
+
export type MonitoringFullConfig = typeof monitoringConfig
|
|
112
|
+
|
|
113
|
+
// Export default
|
|
114
|
+
export default monitoringConfig
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugins Configuration
|
|
3
|
+
* Declarative plugin management configuration
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineConfig, config } from '@core/utils/config-schema'
|
|
7
|
+
import { FLUXSTACK_VERSION } from '@core/utils/version'
|
|
8
|
+
|
|
9
|
+
const defaultPluginConfigs = {
|
|
10
|
+
swagger: {
|
|
11
|
+
title: 'FluxStack API',
|
|
12
|
+
version: FLUXSTACK_VERSION,
|
|
13
|
+
description: 'API documentation for FluxStack application',
|
|
14
|
+
path: '/swagger'
|
|
15
|
+
},
|
|
16
|
+
staticFiles: {
|
|
17
|
+
publicDir: 'public',
|
|
18
|
+
uploadsDir: 'uploads'
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const pluginsConfig = defineConfig({
|
|
23
|
+
enabled: config.array(
|
|
24
|
+
'FLUXSTACK_PLUGINS_ENABLED',
|
|
25
|
+
['logger', 'swagger', 'vite', 'cors', 'static-files']
|
|
26
|
+
),
|
|
27
|
+
|
|
28
|
+
disabled: config.array('FLUXSTACK_PLUGINS_DISABLED', []),
|
|
29
|
+
|
|
30
|
+
autoDiscover: config.boolean('PLUGINS_AUTO_DISCOVER', true),
|
|
31
|
+
|
|
32
|
+
pluginsDir: config.string('PLUGINS_DIR', 'plugins'),
|
|
33
|
+
|
|
34
|
+
discoverNpmPlugins: config.boolean('PLUGINS_DISCOVER_NPM', false),
|
|
35
|
+
discoverProjectPlugins: config.boolean('PLUGINS_DISCOVER_PROJECT', true),
|
|
36
|
+
|
|
37
|
+
allowedPlugins: config.array('PLUGINS_ALLOWED', []),
|
|
38
|
+
config: {
|
|
39
|
+
type: 'object' as const,
|
|
40
|
+
default: defaultPluginConfigs
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
loggerEnabled: config.boolean('LOGGER_PLUGIN_ENABLED', true),
|
|
44
|
+
|
|
45
|
+
swaggerEnabled: config.boolean('SWAGGER_ENABLED', true),
|
|
46
|
+
swaggerTitle: config.string('SWAGGER_TITLE', 'FluxStack API'),
|
|
47
|
+
swaggerVersion: config.string('SWAGGER_VERSION', FLUXSTACK_VERSION),
|
|
48
|
+
swaggerDescription: config.string(
|
|
49
|
+
'SWAGGER_DESCRIPTION',
|
|
50
|
+
'API documentation for FluxStack application'
|
|
51
|
+
),
|
|
52
|
+
swaggerPath: config.string('SWAGGER_PATH', '/swagger'),
|
|
53
|
+
|
|
54
|
+
swaggerExcludePaths: config.array('SWAGGER_EXCLUDE_PATHS', []),
|
|
55
|
+
|
|
56
|
+
swaggerServers: config.string('SWAGGER_SERVERS', ''),
|
|
57
|
+
|
|
58
|
+
swaggerPersistAuthorization: config.boolean('SWAGGER_PERSIST_AUTH', true),
|
|
59
|
+
swaggerDisplayRequestDuration: config.boolean('SWAGGER_DISPLAY_DURATION', true),
|
|
60
|
+
swaggerEnableFilter: config.boolean('SWAGGER_ENABLE_FILTER', true),
|
|
61
|
+
swaggerShowExtensions: config.boolean('SWAGGER_SHOW_EXTENSIONS', true),
|
|
62
|
+
swaggerTryItOutEnabled: config.boolean('SWAGGER_TRY_IT_OUT', true),
|
|
63
|
+
|
|
64
|
+
swaggerAuthEnabled: config.boolean('SWAGGER_AUTH_ENABLED', false),
|
|
65
|
+
swaggerAuthUsername: config.string('SWAGGER_AUTH_USERNAME', 'admin'),
|
|
66
|
+
swaggerAuthPassword: config.string('SWAGGER_AUTH_PASSWORD', ''),
|
|
67
|
+
|
|
68
|
+
staticFilesEnabled: config.boolean('STATIC_FILES_ENABLED', true),
|
|
69
|
+
staticPublicDir: config.string('STATIC_PUBLIC_DIR', 'public'),
|
|
70
|
+
staticUploadsDir: config.string('STATIC_UPLOADS_DIR', 'uploads'),
|
|
71
|
+
staticCacheMaxAge: config.number('STATIC_CACHE_MAX_AGE', 31536000),
|
|
72
|
+
staticEnableUploads: config.boolean('STATIC_ENABLE_UPLOADS', true),
|
|
73
|
+
staticEnablePublic: config.boolean('STATIC_ENABLE_PUBLIC', true),
|
|
74
|
+
|
|
75
|
+
viteEnabled: config.boolean('VITE_PLUGIN_ENABLED', true),
|
|
76
|
+
viteExcludePaths: config.array('VITE_EXCLUDE_PATHS', [
|
|
77
|
+
'/api',
|
|
78
|
+
'/swagger'
|
|
79
|
+
])
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
export type PluginsConfig = typeof pluginsConfig
|
|
83
|
+
|
|
84
|
+
export default pluginsConfig
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Configuration
|
|
3
|
+
* Server-specific settings (port, host, CORS, middleware)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineConfig, defineNestedConfig, config } from '@core/utils/config-schema'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* CORS configuration schema
|
|
10
|
+
*/
|
|
11
|
+
const corsSchema = {
|
|
12
|
+
origins: config.array('CORS_ORIGINS', ['http://localhost:3000', 'http://localhost:5173']),
|
|
13
|
+
methods: config.array('CORS_METHODS', ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']),
|
|
14
|
+
headers: config.array('CORS_HEADERS', ['Content-Type', 'Authorization']),
|
|
15
|
+
credentials: config.boolean('CORS_CREDENTIALS', false),
|
|
16
|
+
maxAge: config.number('CORS_MAX_AGE', 86400)
|
|
17
|
+
} as const
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Server configuration schema
|
|
21
|
+
*/
|
|
22
|
+
const serverSchema = {
|
|
23
|
+
// Server basics
|
|
24
|
+
port: {
|
|
25
|
+
type: 'number' as const,
|
|
26
|
+
env: 'PORT',
|
|
27
|
+
default: 3000,
|
|
28
|
+
required: true,
|
|
29
|
+
validate: (value: number) => {
|
|
30
|
+
if (value < 1 || value > 65535) {
|
|
31
|
+
return 'Port must be between 1 and 65535'
|
|
32
|
+
}
|
|
33
|
+
return true
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
host: config.string('HOST', 'localhost', true),
|
|
38
|
+
|
|
39
|
+
apiPrefix: {
|
|
40
|
+
type: 'string' as const,
|
|
41
|
+
env: 'API_PREFIX',
|
|
42
|
+
default: '/api',
|
|
43
|
+
validate: (value: string) => value.startsWith('/') || 'API prefix must start with /'
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
// Backend-only mode
|
|
47
|
+
backendPort: config.number('BACKEND_PORT', 3001),
|
|
48
|
+
|
|
49
|
+
// Features
|
|
50
|
+
enableRequestLogging: config.boolean('ENABLE_REQUEST_LOGGING', true),
|
|
51
|
+
showBanner: config.boolean('SHOW_SERVER_BANNER', true)
|
|
52
|
+
} as const
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Export server config (nested with CORS)
|
|
56
|
+
*/
|
|
57
|
+
export const serverConfig = defineNestedConfig({
|
|
58
|
+
server: serverSchema,
|
|
59
|
+
cors: corsSchema
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
// Export types
|
|
63
|
+
export type ServerConfig = typeof serverConfig.server
|
|
64
|
+
export type CorsConfig = typeof serverConfig.cors
|
|
65
|
+
export type ServerFullConfig = typeof serverConfig
|
|
66
|
+
|
|
67
|
+
// Export default
|
|
68
|
+
export default serverConfig
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Services Configuration
|
|
3
|
+
* Optional service settings (email, JWT, storage, redis) for compatibility
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineNestedConfig, config } from '@core/utils/config-schema'
|
|
7
|
+
|
|
8
|
+
const emailSchema = {
|
|
9
|
+
host: config.string('MAIL_HOST', 'smtp.example.com'),
|
|
10
|
+
port: config.number('MAIL_PORT', 587),
|
|
11
|
+
username: config.string('MAIL_USERNAME', ''),
|
|
12
|
+
password: config.string('MAIL_PASSWORD', ''),
|
|
13
|
+
fromAddress: config.string('MAIL_FROM_ADDRESS', 'no-reply@example.com'),
|
|
14
|
+
secure: config.boolean('MAIL_SECURE', false)
|
|
15
|
+
} as const
|
|
16
|
+
|
|
17
|
+
const jwtSchema = {
|
|
18
|
+
secret: config.string('JWT_SECRET', 'change-me'),
|
|
19
|
+
expiresIn: config.string('JWT_EXPIRES_IN', '1h'),
|
|
20
|
+
audience: config.string('JWT_AUDIENCE', 'fluxstack'),
|
|
21
|
+
issuer: config.string('JWT_ISSUER', 'fluxstack')
|
|
22
|
+
} as const
|
|
23
|
+
|
|
24
|
+
const storageSchema = {
|
|
25
|
+
driver: config.enum('STORAGE_DRIVER', ['local', 's3'] as const, 'local'),
|
|
26
|
+
localDir: config.string('STORAGE_LOCAL_DIR', 'uploads'),
|
|
27
|
+
s3Bucket: config.string('STORAGE_S3_BUCKET', ''),
|
|
28
|
+
s3Region: config.string('STORAGE_S3_REGION', ''),
|
|
29
|
+
s3Endpoint: config.string('STORAGE_S3_ENDPOINT', '')
|
|
30
|
+
} as const
|
|
31
|
+
|
|
32
|
+
const redisSchema = {
|
|
33
|
+
enabled: config.boolean('REDIS_ENABLED', false),
|
|
34
|
+
url: config.string('REDIS_URL', 'redis://localhost:6379')
|
|
35
|
+
} as const
|
|
36
|
+
|
|
37
|
+
export const servicesConfig = defineNestedConfig({
|
|
38
|
+
email: emailSchema,
|
|
39
|
+
jwt: jwtSchema,
|
|
40
|
+
storage: storageSchema,
|
|
41
|
+
redis: redisSchema
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
export type ServicesConfig = typeof servicesConfig
|
|
45
|
+
|
|
46
|
+
export default servicesConfig
|