create-fluxstack 1.9.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/LIVE_COMPONENTS_REVIEW.md +781 -0
- 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 +109 -156
- 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 -65
- 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 +13 -10
- package/app/client/src/pages/ApiTestPage.tsx +108 -0
- package/app/client/src/pages/HomePage.tsx +76 -0
- package/app/client/src/vite-env.d.ts +1 -1
- package/app/server/app.ts +1 -4
- package/app/server/controllers/users.controller.ts +36 -44
- package/app/server/index.ts +24 -107
- 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/live/register-components.ts +19 -19
- 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/bundler.ts +4 -1
- package/core/build/flux-plugins-generator.ts +325 -325
- package/core/build/index.ts +159 -27
- package/core/build/live-components-generator.ts +70 -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 -558
- package/core/cli/plugin-discovery.ts +2 -2
- package/core/client/LiveComponentsProvider.tsx +63 -17
- 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 -0
- package/core/client/hooks/state-validator.ts +1 -1
- package/core/client/hooks/useAuth.ts +48 -48
- package/core/client/hooks/useChunkedUpload.ts +170 -69
- 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 +18 -51
- 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 +227 -47
- package/core/framework/types.ts +2 -2
- package/core/index.ts +23 -4
- package/core/live/ComponentRegistry.ts +7 -3
- package/core/live/types.ts +77 -0
- package/core/plugins/built-in/index.ts +134 -131
- package/core/plugins/built-in/live-components/commands/create-live-component.ts +242 -1074
- 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 +94 -306
- package/core/plugins/built-in/vite/vite-dev.ts +82 -0
- 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 +309 -21
- package/core/plugins/types.ts +106 -55
- package/core/server/framework.ts +66 -43
- package/core/server/index.ts +15 -16
- package/core/server/live/ComponentRegistry.ts +91 -75
- package/core/server/live/FileUploadManager.ts +41 -31
- 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 +41 -26
- package/core/server/live/index.ts +14 -0
- package/core/server/live/websocket-plugin.ts +233 -72
- 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 -260
- package/core/server/plugins/swagger.ts +33 -33
- 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 -218
- package/core/types/config.ts +56 -26
- package/core/types/index.ts +4 -4
- package/core/types/plugin.ts +107 -99
- package/core/types/types.ts +490 -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 -66
- 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/eslint.config.js +23 -23
- package/package.json +14 -15
- 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/plugins/crypto-auth/server/middlewares.ts +19 -19
- package/tsconfig.api-strict.json +16 -0
- package/tsconfig.json +10 -14
- package/{app/client/tsconfig.node.json → tsconfig.node.json} +1 -1
- 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/workspace.json +5 -5
- 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/tsconfig.app.json +0 -44
- 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/routes/env-test.ts +0 -110
- package/core/client/hooks/index.ts +0 -7
- package/core/client/hooks/useHybridLiveComponent.ts +0 -631
- package/core/client/hooks/useWebSocket.ts +0 -373
- 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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Elysia, t } from 'elysia'
|
|
2
|
-
import { UsersController } from '
|
|
2
|
+
import { UsersController } from '@app/server/controllers/users.controller'
|
|
3
|
+
import type { CreateUserRequest } from '@app/shared/types'
|
|
3
4
|
|
|
4
5
|
// ===== Request/Response Schemas =====
|
|
5
6
|
|
|
@@ -77,9 +78,7 @@ const ErrorResponseSchema = t.Object({
|
|
|
77
78
|
*/
|
|
78
79
|
export const usersRoutes = new Elysia({ prefix: '/users', tags: ['Users'] })
|
|
79
80
|
// GET /users - Get all users
|
|
80
|
-
.get('/', async () => {
|
|
81
|
-
return await UsersController.getUsers()
|
|
82
|
-
}, {
|
|
81
|
+
.get('/', async () => UsersController.getUsers(), {
|
|
83
82
|
detail: {
|
|
84
83
|
summary: 'Get All Users',
|
|
85
84
|
description: 'Retrieves a list of all registered users',
|
|
@@ -90,19 +89,18 @@ export const usersRoutes = new Elysia({ prefix: '/users', tags: ['Users'] })
|
|
|
90
89
|
|
|
91
90
|
// GET /users/:id - Get user by ID
|
|
92
91
|
.get('/:id', async ({ params, set }) => {
|
|
93
|
-
const id =
|
|
92
|
+
const id = Number(params.id)
|
|
94
93
|
|
|
95
|
-
|
|
96
|
-
if (isNaN(id)) {
|
|
94
|
+
if (!Number.isFinite(id)) {
|
|
97
95
|
set.status = 400
|
|
98
|
-
return { error: 'ID
|
|
96
|
+
return { success: false, error: 'ID invalido' }
|
|
99
97
|
}
|
|
100
98
|
|
|
101
99
|
const result = await UsersController.getUserById(id)
|
|
102
100
|
|
|
103
|
-
if (!result) {
|
|
101
|
+
if (!result.success) {
|
|
104
102
|
set.status = 404
|
|
105
|
-
return
|
|
103
|
+
return result
|
|
106
104
|
}
|
|
107
105
|
|
|
108
106
|
return result
|
|
@@ -124,17 +122,17 @@ export const usersRoutes = new Elysia({ prefix: '/users', tags: ['Users'] })
|
|
|
124
122
|
|
|
125
123
|
// POST /users - Create new user
|
|
126
124
|
.post('/', async ({ body, set }) => {
|
|
127
|
-
|
|
128
|
-
|
|
125
|
+
const payload = body as CreateUserRequest
|
|
126
|
+
|
|
127
|
+
if (!payload.name || !payload.email) {
|
|
129
128
|
set.status = 400
|
|
130
129
|
return {
|
|
131
130
|
success: false,
|
|
132
|
-
error: 'Nome e email
|
|
131
|
+
error: 'Nome e email sao obrigatorios'
|
|
133
132
|
}
|
|
134
133
|
}
|
|
135
134
|
|
|
136
|
-
|
|
137
|
-
if (body.name.length < 2) {
|
|
135
|
+
if (payload.name.trim().length < 2) {
|
|
138
136
|
set.status = 400
|
|
139
137
|
return {
|
|
140
138
|
success: false,
|
|
@@ -142,23 +140,28 @@ export const usersRoutes = new Elysia({ prefix: '/users', tags: ['Users'] })
|
|
|
142
140
|
}
|
|
143
141
|
}
|
|
144
142
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
if (!emailRegex.test(body.email)) {
|
|
143
|
+
const emailRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/
|
|
144
|
+
if (!emailRegex.test(payload.email)) {
|
|
148
145
|
set.status = 400
|
|
149
146
|
return {
|
|
150
147
|
success: false,
|
|
151
|
-
error: 'Email
|
|
148
|
+
error: 'Email invalido'
|
|
152
149
|
}
|
|
153
150
|
}
|
|
154
151
|
|
|
155
|
-
const
|
|
152
|
+
const sanitizedPayload: CreateUserRequest = {
|
|
153
|
+
name: payload.name.trim(),
|
|
154
|
+
email: payload.email.trim()
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const result = await UsersController.createUser(sanitizedPayload)
|
|
156
158
|
|
|
157
|
-
// If email is duplicate, still return 200 but with success: false
|
|
158
159
|
if (!result.success) {
|
|
160
|
+
set.status = 409
|
|
159
161
|
return result
|
|
160
162
|
}
|
|
161
163
|
|
|
164
|
+
set.status = 201
|
|
162
165
|
return result
|
|
163
166
|
}, {
|
|
164
167
|
detail: {
|
|
@@ -168,30 +171,34 @@ export const usersRoutes = new Elysia({ prefix: '/users', tags: ['Users'] })
|
|
|
168
171
|
},
|
|
169
172
|
body: CreateUserRequestSchema,
|
|
170
173
|
response: {
|
|
171
|
-
|
|
174
|
+
201: CreateUserResponseSchema,
|
|
172
175
|
400: t.Object({
|
|
173
176
|
success: t.Literal(false),
|
|
174
177
|
error: t.String()
|
|
178
|
+
}),
|
|
179
|
+
409: t.Object({
|
|
180
|
+
success: t.Literal(false),
|
|
181
|
+
error: t.String()
|
|
175
182
|
})
|
|
176
183
|
}
|
|
177
184
|
})
|
|
178
185
|
|
|
179
186
|
// DELETE /users/:id - Delete user
|
|
180
187
|
.delete('/:id', async ({ params, set }) => {
|
|
181
|
-
const id =
|
|
188
|
+
const id = Number(params.id)
|
|
182
189
|
|
|
183
|
-
if (
|
|
190
|
+
if (!Number.isFinite(id)) {
|
|
184
191
|
set.status = 400
|
|
185
192
|
return {
|
|
186
193
|
success: false,
|
|
187
|
-
message: 'ID
|
|
194
|
+
message: 'ID invalido'
|
|
188
195
|
}
|
|
189
196
|
}
|
|
190
197
|
|
|
191
198
|
const result = await UsersController.deleteUser(id)
|
|
192
199
|
|
|
193
200
|
if (!result.success) {
|
|
194
|
-
|
|
201
|
+
set.status = 404
|
|
195
202
|
return result
|
|
196
203
|
}
|
|
197
204
|
|
|
@@ -210,6 +217,7 @@ export const usersRoutes = new Elysia({ prefix: '/users', tags: ['Users'] })
|
|
|
210
217
|
400: t.Object({
|
|
211
218
|
success: t.Literal(false),
|
|
212
219
|
message: t.String()
|
|
213
|
-
})
|
|
220
|
+
}),
|
|
221
|
+
404: DeleteUserResponseSchema
|
|
214
222
|
}
|
|
215
223
|
})
|
|
@@ -11,8 +11,20 @@ export interface CreateUserRequest {
|
|
|
11
11
|
email: string
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
export interface
|
|
14
|
+
export interface UserListResponse {
|
|
15
|
+
success: true
|
|
16
|
+
users: User[]
|
|
17
|
+
count: number
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface UserDetailResponse {
|
|
15
21
|
success: boolean
|
|
16
22
|
user?: User
|
|
23
|
+
error?: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface MutationResponse {
|
|
27
|
+
success: boolean
|
|
17
28
|
message?: string
|
|
18
|
-
|
|
29
|
+
error?: string
|
|
30
|
+
}
|
package/config/app.config.ts
CHANGED
|
@@ -1,62 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Core application metadata and global settings
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { defineConfig, config } from '@/core/utils/config-schema'
|
|
7
|
-
import { FLUXSTACK_VERSION } from '@/core/utils/version'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* App configuration schema
|
|
11
|
-
* Contains only app-level metadata and global feature flags
|
|
12
|
-
*/
|
|
13
|
-
const appConfigSchema = {
|
|
14
|
-
// App basics
|
|
15
|
-
name: config.string('APP_NAME', 'FluxStack', true),
|
|
16
|
-
|
|
17
|
-
version: {
|
|
18
|
-
type: 'string' as const,
|
|
19
|
-
env: 'APP_VERSION',
|
|
20
|
-
default: FLUXSTACK_VERSION,
|
|
21
|
-
validate: (value: string) => /^\d+\.\d+\.\d+$/.test(value) || 'Version must be semver format (e.g., 1.0.0)'
|
|
22
|
-
},
|
|
23
|
-
|
|
24
|
-
description: config.string('APP_DESCRIPTION', 'A FluxStack application'),
|
|
25
|
-
|
|
26
|
-
// Environment
|
|
27
|
-
env: config.enum('NODE_ENV', ['development', 'production', 'test'] as const, 'development', true),
|
|
28
|
-
|
|
29
|
-
// URLs
|
|
30
|
-
url: config.string('APP_URL', undefined, false),
|
|
31
|
-
|
|
32
|
-
// Security
|
|
33
|
-
trustProxy: config.boolean('TRUST_PROXY', false),
|
|
34
|
-
|
|
35
|
-
sessionSecret: {
|
|
36
|
-
type: 'string' as const,
|
|
37
|
-
env: 'SESSION_SECRET',
|
|
38
|
-
default: undefined,
|
|
39
|
-
required: false,
|
|
40
|
-
validate: (value: string) => {
|
|
41
|
-
if (!value) return true // Optional
|
|
42
|
-
if (value.length < 32) {
|
|
43
|
-
return 'Session secret must be at least 32 characters'
|
|
44
|
-
}
|
|
45
|
-
return true
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
} as const
|
|
49
|
-
|
|
50
|
-
export const appConfig = defineConfig(appConfigSchema)
|
|
51
|
-
|
|
52
|
-
// Export type for use in other files
|
|
53
|
-
export type AppConfig = typeof appConfig
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Type-safe environment type
|
|
57
|
-
* Use this when you need the literal type explicitly
|
|
58
|
-
*/
|
|
59
|
-
export type Environment = typeof appConfig.env
|
|
60
|
-
|
|
61
|
-
// Export default
|
|
62
|
-
export default appConfig
|
|
1
|
+
export { appConfig as default, appConfig } from './system/app.config'
|
|
2
|
+
export type { AppConfig } from './system/app.config'
|
package/config/client.config.ts
CHANGED
|
@@ -1,95 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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', false),
|
|
18
|
-
|
|
19
|
-
open: config.boolean('VITE_OPEN', false),
|
|
20
|
-
|
|
21
|
-
enableLogging: config.boolean('ENABLE_VITE_PROXY_LOGS', false)
|
|
22
|
-
} as const
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* API Proxy Configuration
|
|
26
|
-
*/
|
|
27
|
-
const proxySchema = {
|
|
28
|
-
target: {
|
|
29
|
-
type: 'string' as const,
|
|
30
|
-
env: 'PROXY_TARGET',
|
|
31
|
-
default: helpers.getServerUrl(),
|
|
32
|
-
required: false,
|
|
33
|
-
validate: (value: string) => {
|
|
34
|
-
if (!value) return true
|
|
35
|
-
try {
|
|
36
|
-
new URL(value)
|
|
37
|
-
return true
|
|
38
|
-
} catch {
|
|
39
|
-
return 'Proxy target must be a valid URL'
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
|
|
44
|
-
changeOrigin: config.boolean('PROXY_CHANGE_ORIGIN', true),
|
|
45
|
-
|
|
46
|
-
secure: config.boolean('PROXY_SECURE', false),
|
|
47
|
-
|
|
48
|
-
ws: config.boolean('PROXY_WS', true), // WebSocket support
|
|
49
|
-
|
|
50
|
-
rewrite: {
|
|
51
|
-
type: 'object' as const,
|
|
52
|
-
env: 'PROXY_REWRITE',
|
|
53
|
-
default: {},
|
|
54
|
-
required: false
|
|
55
|
-
}
|
|
56
|
-
} as const
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Client Build Configuration
|
|
60
|
-
*/
|
|
61
|
-
const buildSchema = {
|
|
62
|
-
outDir: config.string('CLIENT_OUTDIR', 'dist/client'),
|
|
63
|
-
|
|
64
|
-
sourceMaps: config.boolean('CLIENT_SOURCEMAPS', helpers.isDevelopment()),
|
|
65
|
-
|
|
66
|
-
minify: config.boolean('CLIENT_MINIFY', helpers.isProduction()),
|
|
67
|
-
|
|
68
|
-
target: config.string('CLIENT_TARGET', 'esnext'),
|
|
69
|
-
|
|
70
|
-
assetsDir: config.string('CLIENT_ASSETS_DIR', 'assets'),
|
|
71
|
-
|
|
72
|
-
cssCodeSplit: config.boolean('CLIENT_CSS_CODE_SPLIT', true),
|
|
73
|
-
|
|
74
|
-
chunkSizeWarningLimit: config.number('CLIENT_CHUNK_SIZE_WARNING', 500), // KB
|
|
75
|
-
|
|
76
|
-
emptyOutDir: config.boolean('CLIENT_EMPTY_OUTDIR', true)
|
|
77
|
-
} as const
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Client Configuration (nested)
|
|
81
|
-
*/
|
|
82
|
-
export const clientConfig = defineNestedConfig({
|
|
83
|
-
vite: viteSchema,
|
|
84
|
-
proxy: proxySchema,
|
|
85
|
-
build: buildSchema
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
// Export types
|
|
89
|
-
export type ViteConfig = typeof clientConfig.vite
|
|
90
|
-
export type ProxyConfig = typeof clientConfig.proxy
|
|
91
|
-
export type ClientBuildConfig = typeof clientConfig.build
|
|
92
|
-
export type ClientConfig = typeof clientConfig
|
|
93
|
-
|
|
94
|
-
// Export default
|
|
95
|
-
export default clientConfig
|
|
1
|
+
export { clientConfig as default, clientConfig } from './system/client.config'
|
|
2
|
+
export type { ClientConfig, ViteConfig, ClientBuildConfig } from './system/client.config'
|
|
@@ -1,99 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Laravel-style declarative config with validation
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { defineConfig, config } from '@/core/utils/config-schema'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Database configuration schema
|
|
10
|
-
*/
|
|
11
|
-
export const databaseConfig = defineConfig({
|
|
12
|
-
// Connection
|
|
13
|
-
url: {
|
|
14
|
-
type: 'string',
|
|
15
|
-
env: 'DATABASE_URL',
|
|
16
|
-
default: undefined,
|
|
17
|
-
required: false,
|
|
18
|
-
validate: (value) => {
|
|
19
|
-
if (!value) return true // Optional
|
|
20
|
-
if (!value.includes('://')) {
|
|
21
|
-
return 'DATABASE_URL must be a valid connection string (e.g., postgres://...)'
|
|
22
|
-
}
|
|
23
|
-
return true
|
|
24
|
-
},
|
|
25
|
-
description: 'Full database connection URL (overrides individual settings)'
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
host: config.string('DB_HOST', 'localhost'),
|
|
29
|
-
|
|
30
|
-
port: config.number('DB_PORT', 5432),
|
|
31
|
-
|
|
32
|
-
database: {
|
|
33
|
-
type: 'string',
|
|
34
|
-
env: 'DB_NAME',
|
|
35
|
-
default: undefined,
|
|
36
|
-
required: false,
|
|
37
|
-
description: 'Database name'
|
|
38
|
-
},
|
|
39
|
-
|
|
40
|
-
user: {
|
|
41
|
-
type: 'string',
|
|
42
|
-
env: 'DB_USER',
|
|
43
|
-
default: undefined,
|
|
44
|
-
required: false
|
|
45
|
-
},
|
|
46
|
-
|
|
47
|
-
password: {
|
|
48
|
-
type: 'string',
|
|
49
|
-
env: 'DB_PASSWORD',
|
|
50
|
-
default: undefined,
|
|
51
|
-
required: false
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
// Connection pool
|
|
55
|
-
poolMin: {
|
|
56
|
-
type: 'number',
|
|
57
|
-
env: 'DB_POOL_MIN',
|
|
58
|
-
default: 2,
|
|
59
|
-
validate: (value) => value >= 0 || 'Pool min must be >= 0'
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
poolMax: {
|
|
63
|
-
type: 'number',
|
|
64
|
-
env: 'DB_POOL_MAX',
|
|
65
|
-
default: 10,
|
|
66
|
-
validate: (value) => value > 0 || 'Pool max must be > 0'
|
|
67
|
-
},
|
|
68
|
-
|
|
69
|
-
// SSL
|
|
70
|
-
ssl: config.boolean('DB_SSL', false),
|
|
71
|
-
|
|
72
|
-
// Timeouts
|
|
73
|
-
connectionTimeout: {
|
|
74
|
-
type: 'number',
|
|
75
|
-
env: 'DB_CONNECTION_TIMEOUT',
|
|
76
|
-
default: 30000,
|
|
77
|
-
description: 'Connection timeout in milliseconds'
|
|
78
|
-
},
|
|
79
|
-
|
|
80
|
-
queryTimeout: {
|
|
81
|
-
type: 'number',
|
|
82
|
-
env: 'DB_QUERY_TIMEOUT',
|
|
83
|
-
default: 60000,
|
|
84
|
-
description: 'Query timeout in milliseconds'
|
|
85
|
-
},
|
|
86
|
-
|
|
87
|
-
// Features
|
|
88
|
-
enableLogging: config.boolean('DB_ENABLE_LOGGING', false),
|
|
89
|
-
|
|
90
|
-
enableMigrations: config.boolean('DB_ENABLE_MIGRATIONS', true),
|
|
91
|
-
|
|
92
|
-
migrationsTable: config.string('DB_MIGRATIONS_TABLE', 'migrations')
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
// Export type
|
|
96
|
-
export type DatabaseConfig = typeof databaseConfig
|
|
97
|
-
|
|
98
|
-
// Export default
|
|
99
|
-
export default databaseConfig
|
|
1
|
+
export { databaseConfig as default, databaseConfig } from './system/database.config'
|
|
2
|
+
export type { DatabaseConfig } from './system/database.config'
|
|
@@ -1,48 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* FluxStack Configuration - Main Entry Point
|
|
3
|
+
* Re-exports the complete FluxStack configuration from system/
|
|
4
|
+
*
|
|
5
|
+
* ✨ 100% modular configuration using defineConfig
|
|
6
|
+
* ✨ No composer needed - direct config composition
|
|
7
|
+
* ✨ All configs are type-safe with automatic validation
|
|
8
|
+
*
|
|
9
|
+
* To customize configuration, edit the individual config files:
|
|
10
|
+
* - system/app.config.ts - Application metadata
|
|
11
|
+
* - system/server.config.ts - Server and CORS settings
|
|
12
|
+
* - system/client.config.ts - Vite, proxy, and client build
|
|
13
|
+
* - system/build.config.ts - Server build and optimization
|
|
14
|
+
* - system/logger.config.ts - Logging configuration
|
|
15
|
+
* - system/plugins.config.ts - Plugin management
|
|
16
|
+
* - system/monitoring.config.ts - Monitoring and metrics
|
|
17
|
+
* - system/runtime.config.ts - Runtime-reloadable settings
|
|
18
|
+
* - system/system.config.ts - System information
|
|
19
|
+
* - database.config.ts - Database connection (optional)
|
|
20
|
+
* - services.config.ts - JWT, Email, Storage (optional)
|
|
5
21
|
*/
|
|
6
22
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
// Create legacy configuration format for backward compatibility
|
|
14
|
-
const legacyConfig = createLegacyConfig(newConfig)
|
|
15
|
-
|
|
16
|
-
// Export in the old format
|
|
17
|
-
export const config = legacyConfig
|
|
18
|
-
|
|
19
|
-
// Also export the environment config for backward compatibility
|
|
20
|
-
export const envConfig = {
|
|
21
|
-
NODE_ENV: process.env.NODE_ENV || 'development',
|
|
22
|
-
HOST: newConfig.server.host,
|
|
23
|
-
PORT: newConfig.server.port,
|
|
24
|
-
FRONTEND_PORT: newConfig.client.port,
|
|
25
|
-
BACKEND_PORT: newConfig.server.port,
|
|
26
|
-
VITE_API_URL: newConfig.client.proxy.target,
|
|
27
|
-
API_URL: newConfig.client.proxy.target,
|
|
28
|
-
CORS_ORIGINS: newConfig.server.cors.origins,
|
|
29
|
-
CORS_METHODS: newConfig.server.cors.methods,
|
|
30
|
-
CORS_HEADERS: newConfig.server.cors.headers,
|
|
31
|
-
LOG_LEVEL: newConfig.logging.level,
|
|
32
|
-
BUILD_TARGET: newConfig.build.target,
|
|
33
|
-
BUILD_OUTDIR: newConfig.build.outDir,
|
|
34
|
-
// Add other legacy environment variables as needed
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Warn about deprecated usage in development
|
|
38
|
-
if (process.env.NODE_ENV === 'development') {
|
|
39
|
-
console.warn(
|
|
40
|
-
'⚠️ DEPRECATED: Importing from config/fluxstack.config.ts is deprecated.\n' +
|
|
41
|
-
' Please update your imports to use the new configuration system:\n' +
|
|
42
|
-
' import { getConfig } from "./core/config"\n' +
|
|
43
|
-
' or import config from "./fluxstack.config.ts"'
|
|
44
|
-
)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Export types for backward compatibility
|
|
48
|
-
export type { FluxStackConfig }
|
|
23
|
+
export {
|
|
24
|
+
fluxStackConfig,
|
|
25
|
+
fluxStackConfig as config,
|
|
26
|
+
fluxStackConfig as default,
|
|
27
|
+
type FluxStackConfig
|
|
28
|
+
} from './system/fluxstack.config'
|
package/config/index.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
* ```ts
|
|
8
|
-
* import { appConfig, serverConfig, databaseConfig } from '
|
|
8
|
+
* import { appConfig, serverConfig, databaseConfig } from '@config'
|
|
9
9
|
*
|
|
10
10
|
* // All configs are type-safe and validated!
|
|
11
11
|
* console.log(appConfig.name) // string
|
|
@@ -16,22 +16,33 @@
|
|
|
16
16
|
* console.log(servicesConfig.email.host) // string
|
|
17
17
|
* console.log(monitoringConfig.metrics.enabled) // boolean
|
|
18
18
|
* ```
|
|
19
|
+
*
|
|
20
|
+
* ✨ For type safety with optional features (database, auth, email, storage):
|
|
21
|
+
* Import types from this file instead of core:
|
|
22
|
+
* ```ts
|
|
23
|
+
* import type { DatabaseConfig, JWTConfig, EmailConfig, StorageConfig } from '@config'
|
|
24
|
+
* ```
|
|
19
25
|
*/
|
|
20
26
|
|
|
21
27
|
// ============================================================================
|
|
22
28
|
// 📦 CONFIG EXPORTS
|
|
23
29
|
// ============================================================================
|
|
24
30
|
|
|
25
|
-
|
|
26
|
-
export {
|
|
27
|
-
export {
|
|
28
|
-
export {
|
|
29
|
-
export {
|
|
30
|
-
export { loggerConfig } from './logger.config'
|
|
31
|
-
export { pluginsConfig } from './plugins.config'
|
|
32
|
-
export { monitoringConfig } from './monitoring.config'
|
|
33
|
-
export { appRuntimeConfig } from './runtime.config'
|
|
34
|
-
export { systemConfig, systemRuntimeInfo } from './system.config'
|
|
31
|
+
// System configs (from config/system/)
|
|
32
|
+
export { appConfig } from './system/app.config'
|
|
33
|
+
export { serverConfig } from './system/server.config'
|
|
34
|
+
export { clientConfig } from './system/client.config'
|
|
35
|
+
export { buildConfig } from './system/build.config'
|
|
36
|
+
export { loggerConfig } from './system/logger.config'
|
|
37
|
+
export { pluginsConfig } from './system/plugins.config'
|
|
38
|
+
export { monitoringConfig } from './system/monitoring.config'
|
|
39
|
+
export { appRuntimeConfig } from './system/runtime.config'
|
|
40
|
+
export { systemConfig, systemRuntimeInfo } from './system/system.config'
|
|
41
|
+
export { databaseConfig } from './system/database.config'
|
|
42
|
+
export { servicesConfig } from './system/services.config'
|
|
43
|
+
|
|
44
|
+
// Main FluxStack config (composed)
|
|
45
|
+
export { fluxStackConfig, config as fluxConfig, type FluxStackConfig } from './fluxstack.config'
|
|
35
46
|
|
|
36
47
|
// Plugin configs (re-exported for convenience)
|
|
37
48
|
export { cryptoAuthConfig } from '../plugins/crypto-auth/config'
|
|
@@ -40,35 +51,35 @@ export { cryptoAuthConfig } from '../plugins/crypto-auth/config'
|
|
|
40
51
|
// 📝 TYPE EXPORTS
|
|
41
52
|
// ============================================================================
|
|
42
53
|
|
|
43
|
-
//
|
|
44
|
-
export type { AppConfig
|
|
54
|
+
// System config types
|
|
55
|
+
export type { AppConfig } from './system/app.config'
|
|
45
56
|
export type {
|
|
46
57
|
ServerConfig,
|
|
47
58
|
CorsConfig,
|
|
48
59
|
ServerFullConfig
|
|
49
|
-
} from './server.config'
|
|
60
|
+
} from './system/server.config'
|
|
50
61
|
export type {
|
|
51
62
|
ClientConfig,
|
|
52
63
|
ViteConfig,
|
|
53
|
-
ProxyConfig,
|
|
54
64
|
ClientBuildConfig
|
|
55
|
-
} from './client.config'
|
|
56
|
-
export type { DatabaseConfig } from './database.config'
|
|
65
|
+
} from './system/client.config'
|
|
57
66
|
export type {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
} from './
|
|
63
|
-
export type {
|
|
64
|
-
export type { PluginsConfig } from './plugins.config'
|
|
67
|
+
BuildConfig,
|
|
68
|
+
OptimizationConfig,
|
|
69
|
+
BuildFullConfig
|
|
70
|
+
} from './system/build.config'
|
|
71
|
+
export type { LoggerConfig } from './system/logger.config'
|
|
72
|
+
export type { PluginsConfig } from './system/plugins.config'
|
|
65
73
|
export type {
|
|
66
74
|
MonitoringConfig,
|
|
67
75
|
MetricsConfig,
|
|
68
76
|
ProfilingConfig,
|
|
69
77
|
MonitoringFullConfig
|
|
70
|
-
} from './monitoring.config'
|
|
71
|
-
export type { SystemConfig, SystemRuntimeInfo } from './system.config'
|
|
78
|
+
} from './system/monitoring.config'
|
|
79
|
+
export type { SystemConfig, SystemRuntimeInfo } from './system/system.config'
|
|
80
|
+
export type { AppRuntimeConfig } from './system/runtime.config'
|
|
81
|
+
export type { DatabaseConfig } from './system/database.config'
|
|
82
|
+
export type { ServicesConfig } from './system/services.config'
|
|
72
83
|
|
|
73
84
|
// Plugin types
|
|
74
85
|
export type { CryptoAuthConfig } from '../plugins/crypto-auth/config'
|
|
@@ -77,34 +88,42 @@ export type { CryptoAuthConfig } from '../plugins/crypto-auth/config'
|
|
|
77
88
|
// 🎯 UNIFIED CONFIG OBJECT
|
|
78
89
|
// ============================================================================
|
|
79
90
|
|
|
80
|
-
import { appConfig } from './app.config'
|
|
81
|
-
import { serverConfig } from './server.config'
|
|
82
|
-
import { clientConfig } from './client.config'
|
|
83
|
-
import {
|
|
84
|
-
import {
|
|
85
|
-
import {
|
|
86
|
-
import {
|
|
87
|
-
import {
|
|
88
|
-
import {
|
|
89
|
-
import {
|
|
91
|
+
import { appConfig } from './system/app.config'
|
|
92
|
+
import { serverConfig } from './system/server.config'
|
|
93
|
+
import { clientConfig } from './system/client.config'
|
|
94
|
+
import { buildConfig } from './system/build.config'
|
|
95
|
+
import { loggerConfig } from './system/logger.config'
|
|
96
|
+
import { pluginsConfig } from './system/plugins.config'
|
|
97
|
+
import { monitoringConfig } from './system/monitoring.config'
|
|
98
|
+
import { appRuntimeConfig } from './system/runtime.config'
|
|
99
|
+
import { systemConfig, systemRuntimeInfo } from './system/system.config'
|
|
100
|
+
import { databaseConfig } from './system/database.config'
|
|
101
|
+
import { servicesConfig } from './system/services.config'
|
|
90
102
|
import { cryptoAuthConfig } from '../plugins/crypto-auth/config'
|
|
91
103
|
|
|
92
104
|
/**
|
|
93
105
|
* All configs in one object
|
|
94
106
|
* Use this when you need access to multiple configs at once
|
|
107
|
+
*
|
|
108
|
+
* For the complete FluxStack configuration with proper structure,
|
|
109
|
+
* use `fluxStackConfig` from './fluxstack.config'
|
|
95
110
|
*/
|
|
96
111
|
export const config = {
|
|
112
|
+
// System configs
|
|
97
113
|
app: appConfig,
|
|
98
114
|
server: serverConfig,
|
|
99
115
|
client: clientConfig,
|
|
100
|
-
|
|
101
|
-
services: servicesConfig,
|
|
116
|
+
build: buildConfig,
|
|
102
117
|
logger: loggerConfig,
|
|
103
118
|
plugins: pluginsConfig,
|
|
104
119
|
monitoring: monitoringConfig,
|
|
105
120
|
runtime: appRuntimeConfig,
|
|
106
121
|
system: systemConfig,
|
|
107
122
|
systemRuntime: systemRuntimeInfo,
|
|
123
|
+
database: databaseConfig,
|
|
124
|
+
services: servicesConfig,
|
|
125
|
+
|
|
126
|
+
// Plugin configs
|
|
108
127
|
cryptoAuth: cryptoAuthConfig
|
|
109
128
|
} as const
|
|
110
129
|
|