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.
- 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 +242 -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 +285 -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
package/config/plugins.config.ts
CHANGED
|
@@ -1,80 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Declarative plugin management configuration
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { defineConfig, config } from '@/core/utils/config-schema'
|
|
7
|
-
import { env } from '@/core/utils/env'
|
|
8
|
-
import { FLUXSTACK_VERSION } from '@/core/utils/version'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Plugins configuration schema
|
|
12
|
-
*/
|
|
13
|
-
const pluginsConfigSchema = {
|
|
14
|
-
// Plugin management
|
|
15
|
-
enabled: config.array(
|
|
16
|
-
'FLUXSTACK_PLUGINS_ENABLED',
|
|
17
|
-
['logger', 'swagger', 'vite', 'cors', 'static-files', 'crypto-auth']
|
|
18
|
-
),
|
|
19
|
-
|
|
20
|
-
disabled: config.array('FLUXSTACK_PLUGINS_DISABLED', []),
|
|
21
|
-
|
|
22
|
-
// Auto-discovery
|
|
23
|
-
autoDiscover: config.boolean('PLUGINS_AUTO_DISCOVER', true),
|
|
24
|
-
|
|
25
|
-
pluginsDir: config.string('PLUGINS_DIR', 'plugins'),
|
|
26
|
-
|
|
27
|
-
// Plugin-specific configurations
|
|
28
|
-
// Logger plugin (handled by logger.config.ts)
|
|
29
|
-
loggerEnabled: config.boolean('LOGGER_PLUGIN_ENABLED', true),
|
|
30
|
-
|
|
31
|
-
// Swagger plugin
|
|
32
|
-
swaggerEnabled: config.boolean('SWAGGER_ENABLED', true),
|
|
33
|
-
swaggerTitle: config.string('SWAGGER_TITLE', 'FluxStack API'),
|
|
34
|
-
swaggerVersion: config.string('SWAGGER_VERSION', FLUXSTACK_VERSION),
|
|
35
|
-
swaggerDescription: config.string(
|
|
36
|
-
'SWAGGER_DESCRIPTION',
|
|
37
|
-
'API documentation for FluxStack application'
|
|
38
|
-
),
|
|
39
|
-
swaggerPath: config.string('SWAGGER_PATH', '/swagger'),
|
|
40
|
-
|
|
41
|
-
// Swagger advanced options
|
|
42
|
-
swaggerExcludePaths: config.array('SWAGGER_EXCLUDE_PATHS', []),
|
|
43
|
-
|
|
44
|
-
// Swagger servers (comma-separated list of URLs)
|
|
45
|
-
// Format: "url1|description1,url2|description2"
|
|
46
|
-
// Example: "https://api.prod.com|Production,https://api.staging.com|Staging"
|
|
47
|
-
swaggerServers: config.string('SWAGGER_SERVERS', ''),
|
|
48
|
-
|
|
49
|
-
// Swagger UI options
|
|
50
|
-
swaggerPersistAuthorization: config.boolean('SWAGGER_PERSIST_AUTH', true),
|
|
51
|
-
swaggerDisplayRequestDuration: config.boolean('SWAGGER_DISPLAY_DURATION', true),
|
|
52
|
-
swaggerEnableFilter: config.boolean('SWAGGER_ENABLE_FILTER', true),
|
|
53
|
-
swaggerShowExtensions: config.boolean('SWAGGER_SHOW_EXTENSIONS', true),
|
|
54
|
-
swaggerTryItOutEnabled: config.boolean('SWAGGER_TRY_IT_OUT', true),
|
|
55
|
-
|
|
56
|
-
// Swagger authentication (Basic Auth)
|
|
57
|
-
swaggerAuthEnabled: config.boolean('SWAGGER_AUTH_ENABLED', false),
|
|
58
|
-
swaggerAuthUsername: config.string('SWAGGER_AUTH_USERNAME', 'admin'),
|
|
59
|
-
swaggerAuthPassword: config.string('SWAGGER_AUTH_PASSWORD', ''),
|
|
60
|
-
|
|
61
|
-
// Static files plugin
|
|
62
|
-
staticFilesEnabled: config.boolean('STATIC_FILES_ENABLED', true),
|
|
63
|
-
staticPublicDir: config.string('STATIC_PUBLIC_DIR', 'public'),
|
|
64
|
-
staticUploadsDir: config.string('STATIC_UPLOADS_DIR', 'uploads'),
|
|
65
|
-
staticCacheMaxAge: config.number('STATIC_CACHE_MAX_AGE', 31536000), // 1 year
|
|
66
|
-
staticEnableUploads: config.boolean('STATIC_ENABLE_UPLOADS', true),
|
|
67
|
-
staticEnablePublic: config.boolean('STATIC_ENABLE_PUBLIC', true),
|
|
68
|
-
|
|
69
|
-
// CORS plugin (configuration via server.config.ts)
|
|
70
|
-
// Vite plugin
|
|
71
|
-
viteEnabled: config.boolean('VITE_PLUGIN_ENABLED', true)
|
|
72
|
-
} as const
|
|
73
|
-
|
|
74
|
-
export const pluginsConfig = defineConfig(pluginsConfigSchema)
|
|
75
|
-
|
|
76
|
-
// Export type
|
|
77
|
-
export type PluginsConfig = typeof pluginsConfig
|
|
78
|
-
|
|
79
|
-
// Export default
|
|
80
|
-
export default pluginsConfig
|
|
1
|
+
export { pluginsConfig as default, pluginsConfig } from './system/plugins.config'
|
|
2
|
+
export type { PluginsConfig } from './system/plugins.config'
|
package/config/server.config.ts
CHANGED
|
@@ -1,68 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
|
1
|
+
export { serverConfig as default, serverConfig } from './system/server.config'
|
|
2
|
+
export type { ServerConfig, CorsConfig, ServerFullConfig } from './system/server.config'
|
|
@@ -1,130 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Laravel-style declarative config for third-party services
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { defineConfig, defineNestedConfig, config } from '@/core/utils/config-schema'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Email service configuration
|
|
10
|
-
*/
|
|
11
|
-
const emailSchema = {
|
|
12
|
-
// SMTP
|
|
13
|
-
host: config.string('SMTP_HOST'),
|
|
14
|
-
|
|
15
|
-
port: {
|
|
16
|
-
type: 'number' as const,
|
|
17
|
-
env: 'SMTP_PORT',
|
|
18
|
-
default: 587,
|
|
19
|
-
validate: (value: number) => value > 0 || 'SMTP port must be positive'
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
user: config.string('SMTP_USER'),
|
|
23
|
-
password: config.string('SMTP_PASSWORD'),
|
|
24
|
-
|
|
25
|
-
secure: config.boolean('SMTP_SECURE', false),
|
|
26
|
-
|
|
27
|
-
from: {
|
|
28
|
-
type: 'string' as const,
|
|
29
|
-
env: 'SMTP_FROM',
|
|
30
|
-
default: 'noreply@example.com',
|
|
31
|
-
validate: (value: string) => {
|
|
32
|
-
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
|
33
|
-
return emailRegex.test(value) || 'From email must be valid'
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
replyTo: config.string('SMTP_REPLY_TO')
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* JWT authentication configuration
|
|
42
|
-
*/
|
|
43
|
-
const jwtSchema = {
|
|
44
|
-
secret: {
|
|
45
|
-
type: 'string' as const,
|
|
46
|
-
env: 'JWT_SECRET',
|
|
47
|
-
default: undefined,
|
|
48
|
-
required: false,
|
|
49
|
-
validate: (value: string) => {
|
|
50
|
-
if (!value) return true // Optional
|
|
51
|
-
if (value.length < 32) {
|
|
52
|
-
return 'JWT secret must be at least 32 characters for security'
|
|
53
|
-
}
|
|
54
|
-
return true
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
expiresIn: config.string('JWT_EXPIRES_IN', '24h'),
|
|
59
|
-
|
|
60
|
-
algorithm: config.enum(
|
|
61
|
-
'JWT_ALGORITHM',
|
|
62
|
-
['HS256', 'HS384', 'HS512', 'RS256', 'RS384', 'RS512'] as const,
|
|
63
|
-
'HS256'
|
|
64
|
-
),
|
|
65
|
-
|
|
66
|
-
issuer: config.string('JWT_ISSUER', 'fluxstack'),
|
|
67
|
-
|
|
68
|
-
audience: config.string('JWT_AUDIENCE')
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Storage configuration
|
|
73
|
-
*/
|
|
74
|
-
const storageSchema = {
|
|
75
|
-
provider: config.enum(
|
|
76
|
-
'STORAGE_PROVIDER',
|
|
77
|
-
['local', 's3', 'gcs', 'azure'] as const,
|
|
78
|
-
'local'
|
|
79
|
-
),
|
|
80
|
-
|
|
81
|
-
uploadPath: config.string('UPLOAD_PATH', './uploads'),
|
|
82
|
-
|
|
83
|
-
maxFileSize: {
|
|
84
|
-
type: 'number' as const,
|
|
85
|
-
env: 'MAX_FILE_SIZE',
|
|
86
|
-
default: 10485760, // 10MB
|
|
87
|
-
validate: (value: number) => value > 0 || 'Max file size must be positive'
|
|
88
|
-
},
|
|
89
|
-
|
|
90
|
-
allowedTypes: config.array('ALLOWED_FILE_TYPES', ['image/*', 'application/pdf']),
|
|
91
|
-
|
|
92
|
-
// S3 specific
|
|
93
|
-
s3Bucket: config.string('S3_BUCKET'),
|
|
94
|
-
s3Region: config.string('S3_REGION', 'us-east-1'),
|
|
95
|
-
s3AccessKey: config.string('S3_ACCESS_KEY'),
|
|
96
|
-
s3SecretKey: config.string('S3_SECRET_KEY')
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Redis configuration
|
|
101
|
-
*/
|
|
102
|
-
const redisSchema = {
|
|
103
|
-
host: config.string('REDIS_HOST', 'localhost'),
|
|
104
|
-
port: config.number('REDIS_PORT', 6379),
|
|
105
|
-
password: config.string('REDIS_PASSWORD'),
|
|
106
|
-
db: config.number('REDIS_DB', 0),
|
|
107
|
-
|
|
108
|
-
keyPrefix: config.string('REDIS_KEY_PREFIX', 'fluxstack:'),
|
|
109
|
-
|
|
110
|
-
enableTls: config.boolean('REDIS_TLS', false)
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Export all service configs as nested object
|
|
115
|
-
*/
|
|
116
|
-
export const servicesConfig = defineNestedConfig({
|
|
117
|
-
email: emailSchema,
|
|
118
|
-
jwt: jwtSchema,
|
|
119
|
-
storage: storageSchema,
|
|
120
|
-
redis: redisSchema
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
// Export types
|
|
124
|
-
export type EmailConfig = typeof servicesConfig.email
|
|
125
|
-
export type JWTConfig = typeof servicesConfig.jwt
|
|
126
|
-
export type StorageConfig = typeof servicesConfig.storage
|
|
127
|
-
export type RedisConfig = typeof servicesConfig.redis
|
|
128
|
-
|
|
129
|
-
// Export default
|
|
130
|
-
export default servicesConfig
|
|
1
|
+
export { servicesConfig as default, servicesConfig } from './system/services.config'
|
|
2
|
+
export type { ServicesConfig } from './system/services.config'
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Configuration
|
|
3
|
+
* Core application settings and metadata
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineConfig, config } from '@core/utils/config-schema'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* App configuration schema
|
|
10
|
+
*/
|
|
11
|
+
export const appConfig = defineConfig({
|
|
12
|
+
// Application metadata
|
|
13
|
+
name: config.string('APP_NAME', 'fluxstack-app', true),
|
|
14
|
+
version: config.string('APP_VERSION', '1.0.0', true),
|
|
15
|
+
description: config.string('APP_DESCRIPTION', 'A FluxStack application', false),
|
|
16
|
+
env: config.enum('NODE_ENV', ['development', 'production', 'test'] as const, 'development', false),
|
|
17
|
+
|
|
18
|
+
// Runtime mode (set by CLI: --backend-only, --frontend-only)
|
|
19
|
+
mode: config.enum('FLUXSTACK_MODE', ['full-stack', 'backend-only', 'frontend-only'] as const, 'full-stack', false),
|
|
20
|
+
|
|
21
|
+
// Security
|
|
22
|
+
trustProxy: config.boolean('APP_TRUST_PROXY', false),
|
|
23
|
+
sessionSecret: config.string('APP_SESSION_SECRET', '')
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
// Export type
|
|
27
|
+
export type AppConfig = typeof appConfig
|
|
28
|
+
|
|
29
|
+
export default appConfig
|
|
@@ -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),
|