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/core/utils/index.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FluxStack Utilities
|
|
3
|
-
* Main exports for utility functions and classes
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// Logger utilities
|
|
7
|
-
export { logger, log } from "./logger"
|
|
8
|
-
export type { Logger } from "./logger/index"
|
|
9
|
-
|
|
10
|
-
// Error handling
|
|
11
|
-
export * from "./errors"
|
|
12
|
-
|
|
13
|
-
// Monitoring
|
|
14
|
-
export { MetricsCollector } from "./monitoring"
|
|
15
|
-
export type * from "./monitoring"
|
|
16
|
-
|
|
17
|
-
// General helpers
|
|
1
|
+
/**
|
|
2
|
+
* FluxStack Utilities
|
|
3
|
+
* Main exports for utility functions and classes
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Logger utilities
|
|
7
|
+
export { logger, log } from "./logger"
|
|
8
|
+
export type { Logger } from "./logger/index"
|
|
9
|
+
|
|
10
|
+
// Error handling
|
|
11
|
+
export * from "./errors"
|
|
12
|
+
|
|
13
|
+
// Monitoring
|
|
14
|
+
export { MetricsCollector } from "./monitoring"
|
|
15
|
+
export type * from "./monitoring"
|
|
16
|
+
|
|
17
|
+
// General helpers
|
|
18
18
|
export * from "./helpers"
|
|
@@ -1,114 +1,114 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FluxStack Logger - Color Management
|
|
3
|
-
* Generates unique colors for each module
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import chalk, { type ChalkInstance } from 'chalk'
|
|
7
|
-
|
|
8
|
-
// Cache for module colors
|
|
9
|
-
const moduleColors = new Map<string, ChalkInstance>()
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Pre-defined colors for common modules
|
|
13
|
-
*/
|
|
14
|
-
const COMMON_MODULE_COLORS: Record<string, string> = {
|
|
15
|
-
api: '#4CAF50', // Green
|
|
16
|
-
db: '#2196F3', // Blue
|
|
17
|
-
auth: '#FF9800', // Orange
|
|
18
|
-
user: '#9C27B0', // Purple
|
|
19
|
-
config: '#00BCD4', // Cyan
|
|
20
|
-
utils: '#607D8B', // Blue Gray
|
|
21
|
-
routes: '#E91E63', // Pink
|
|
22
|
-
controllers: '#3F51B5', // Indigo
|
|
23
|
-
models: '#009688', // Teal
|
|
24
|
-
services: '#FF5722', // Deep Orange
|
|
25
|
-
plugins: '#673AB7', // Deep Purple
|
|
26
|
-
middleware: '#795548', // Brown
|
|
27
|
-
live: '#00E676', // Green Accent
|
|
28
|
-
websocket: '#00B0FF', // Light Blue Accent
|
|
29
|
-
build: '#FFC107', // Amber
|
|
30
|
-
cli: '#CDDC39' // Lime
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Symbols for different log levels
|
|
35
|
-
*/
|
|
36
|
-
export const LOG_SYMBOLS = {
|
|
37
|
-
error: chalk.red('✖'),
|
|
38
|
-
warn: chalk.yellow('⚠'),
|
|
39
|
-
info: chalk.blue('ℹ'),
|
|
40
|
-
debug: chalk.magenta('⬤'),
|
|
41
|
-
default: chalk.gray('•')
|
|
42
|
-
} as const
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Colors for different log levels
|
|
46
|
-
*/
|
|
47
|
-
export const LEVEL_COLORS = {
|
|
48
|
-
error: chalk.bold.red,
|
|
49
|
-
warn: chalk.bold.yellow,
|
|
50
|
-
info: chalk.bold.blue,
|
|
51
|
-
debug: chalk.bold.magenta,
|
|
52
|
-
default: chalk.bold.gray
|
|
53
|
-
} as const
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Generate a unique color for a module based on its name
|
|
57
|
-
*/
|
|
58
|
-
export function getColorForModule(moduleName: string): ChalkInstance {
|
|
59
|
-
// Check cache first
|
|
60
|
-
if (moduleColors.has(moduleName)) {
|
|
61
|
-
return moduleColors.get(moduleName)!
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Check if module name contains a common module keyword
|
|
65
|
-
for (const [key, hexColor] of Object.entries(COMMON_MODULE_COLORS)) {
|
|
66
|
-
if (moduleName.toLowerCase().includes(key)) {
|
|
67
|
-
const color = chalk.hex(hexColor)
|
|
68
|
-
moduleColors.set(moduleName, color)
|
|
69
|
-
return color
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Generate color from module name hash
|
|
74
|
-
let hash = 0
|
|
75
|
-
for (let i = 0; i < moduleName.length; i++) {
|
|
76
|
-
hash = moduleName.charCodeAt(i) + ((hash << 5) - hash)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Generate pleasant color using HSL
|
|
80
|
-
const h = Math.abs(hash) % 360
|
|
81
|
-
const s = 65 + (Math.abs(hash) % 20) // Saturation 65-85%
|
|
82
|
-
const l = 45 + (Math.abs(hash) % 15) // Lightness 45-60%
|
|
83
|
-
|
|
84
|
-
const hexColor = hslToHex(h, s, l)
|
|
85
|
-
const color = chalk.hex(hexColor)
|
|
86
|
-
|
|
87
|
-
moduleColors.set(moduleName, color)
|
|
88
|
-
return color
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Convert HSL to Hex color
|
|
93
|
-
*/
|
|
94
|
-
function hslToHex(h: number, s: number, l: number): string {
|
|
95
|
-
s /= 100
|
|
96
|
-
l /= 100
|
|
97
|
-
|
|
98
|
-
const k = (n: number) => (n + h / 30) % 12
|
|
99
|
-
const a = s * Math.min(l, 1 - l)
|
|
100
|
-
const f = (n: number) => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)))
|
|
101
|
-
|
|
102
|
-
const r = Math.round(255 * f(0))
|
|
103
|
-
const g = Math.round(255 * f(8))
|
|
104
|
-
const b = Math.round(255 * f(4))
|
|
105
|
-
|
|
106
|
-
return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Clear color cache (useful for testing)
|
|
111
|
-
*/
|
|
112
|
-
export function clearColorCache(): void {
|
|
113
|
-
moduleColors.clear()
|
|
114
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* FluxStack Logger - Color Management
|
|
3
|
+
* Generates unique colors for each module
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import chalk, { type ChalkInstance } from 'chalk'
|
|
7
|
+
|
|
8
|
+
// Cache for module colors
|
|
9
|
+
const moduleColors = new Map<string, ChalkInstance>()
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Pre-defined colors for common modules
|
|
13
|
+
*/
|
|
14
|
+
const COMMON_MODULE_COLORS: Record<string, string> = {
|
|
15
|
+
api: '#4CAF50', // Green
|
|
16
|
+
db: '#2196F3', // Blue
|
|
17
|
+
auth: '#FF9800', // Orange
|
|
18
|
+
user: '#9C27B0', // Purple
|
|
19
|
+
config: '#00BCD4', // Cyan
|
|
20
|
+
utils: '#607D8B', // Blue Gray
|
|
21
|
+
routes: '#E91E63', // Pink
|
|
22
|
+
controllers: '#3F51B5', // Indigo
|
|
23
|
+
models: '#009688', // Teal
|
|
24
|
+
services: '#FF5722', // Deep Orange
|
|
25
|
+
plugins: '#673AB7', // Deep Purple
|
|
26
|
+
middleware: '#795548', // Brown
|
|
27
|
+
live: '#00E676', // Green Accent
|
|
28
|
+
websocket: '#00B0FF', // Light Blue Accent
|
|
29
|
+
build: '#FFC107', // Amber
|
|
30
|
+
cli: '#CDDC39' // Lime
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Symbols for different log levels
|
|
35
|
+
*/
|
|
36
|
+
export const LOG_SYMBOLS = {
|
|
37
|
+
error: chalk.red('✖'),
|
|
38
|
+
warn: chalk.yellow('⚠'),
|
|
39
|
+
info: chalk.blue('ℹ'),
|
|
40
|
+
debug: chalk.magenta('⬤'),
|
|
41
|
+
default: chalk.gray('•')
|
|
42
|
+
} as const
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Colors for different log levels
|
|
46
|
+
*/
|
|
47
|
+
export const LEVEL_COLORS = {
|
|
48
|
+
error: chalk.bold.red,
|
|
49
|
+
warn: chalk.bold.yellow,
|
|
50
|
+
info: chalk.bold.blue,
|
|
51
|
+
debug: chalk.bold.magenta,
|
|
52
|
+
default: chalk.bold.gray
|
|
53
|
+
} as const
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Generate a unique color for a module based on its name
|
|
57
|
+
*/
|
|
58
|
+
export function getColorForModule(moduleName: string): ChalkInstance {
|
|
59
|
+
// Check cache first
|
|
60
|
+
if (moduleColors.has(moduleName)) {
|
|
61
|
+
return moduleColors.get(moduleName)!
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Check if module name contains a common module keyword
|
|
65
|
+
for (const [key, hexColor] of Object.entries(COMMON_MODULE_COLORS)) {
|
|
66
|
+
if (moduleName.toLowerCase().includes(key)) {
|
|
67
|
+
const color = chalk.hex(hexColor)
|
|
68
|
+
moduleColors.set(moduleName, color)
|
|
69
|
+
return color
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Generate color from module name hash
|
|
74
|
+
let hash = 0
|
|
75
|
+
for (let i = 0; i < moduleName.length; i++) {
|
|
76
|
+
hash = moduleName.charCodeAt(i) + ((hash << 5) - hash)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Generate pleasant color using HSL
|
|
80
|
+
const h = Math.abs(hash) % 360
|
|
81
|
+
const s = 65 + (Math.abs(hash) % 20) // Saturation 65-85%
|
|
82
|
+
const l = 45 + (Math.abs(hash) % 15) // Lightness 45-60%
|
|
83
|
+
|
|
84
|
+
const hexColor = hslToHex(h, s, l)
|
|
85
|
+
const color = chalk.hex(hexColor)
|
|
86
|
+
|
|
87
|
+
moduleColors.set(moduleName, color)
|
|
88
|
+
return color
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Convert HSL to Hex color
|
|
93
|
+
*/
|
|
94
|
+
function hslToHex(h: number, s: number, l: number): string {
|
|
95
|
+
s /= 100
|
|
96
|
+
l /= 100
|
|
97
|
+
|
|
98
|
+
const k = (n: number) => (n + h / 30) % 12
|
|
99
|
+
const a = s * Math.min(l, 1 - l)
|
|
100
|
+
const f = (n: number) => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)))
|
|
101
|
+
|
|
102
|
+
const r = Math.round(255 * f(0))
|
|
103
|
+
const g = Math.round(255 * f(8))
|
|
104
|
+
const b = Math.round(255 * f(4))
|
|
105
|
+
|
|
106
|
+
return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Clear color cache (useful for testing)
|
|
111
|
+
*/
|
|
112
|
+
export function clearColorCache(): void {
|
|
113
|
+
moduleColors.clear()
|
|
114
|
+
}
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
* Re-export from declarative config
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { loggerConfig } from '
|
|
6
|
+
import { loggerConfig } from '@config'
|
|
7
7
|
|
|
8
8
|
export interface LoggerConfig {
|
|
9
9
|
level: 'debug' | 'info' | 'warn' | 'error'
|
|
10
|
+
format: 'pretty' | 'json'
|
|
10
11
|
dateFormat: string
|
|
11
12
|
logToFile: boolean
|
|
12
13
|
maxSize: string
|
|
@@ -14,6 +15,7 @@ export interface LoggerConfig {
|
|
|
14
15
|
objectDepth: number
|
|
15
16
|
enableColors: boolean
|
|
16
17
|
enableStackTrace: boolean
|
|
18
|
+
transports: string[]
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
/**
|
|
@@ -21,14 +23,16 @@ export interface LoggerConfig {
|
|
|
21
23
|
*/
|
|
22
24
|
export function getLoggerConfig(): LoggerConfig {
|
|
23
25
|
return {
|
|
24
|
-
level: loggerConfig.level,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
level: loggerConfig.level ?? 'info',
|
|
27
|
+
format: (loggerConfig as any).format ?? 'pretty',
|
|
28
|
+
dateFormat: loggerConfig.dateFormat ?? 'YYYY-MM-DD HH:mm:ss',
|
|
29
|
+
logToFile: loggerConfig.logToFile ?? false,
|
|
30
|
+
maxSize: loggerConfig.maxSize ?? '20m',
|
|
31
|
+
maxFiles: loggerConfig.maxFiles ?? '14d',
|
|
32
|
+
objectDepth: loggerConfig.objectDepth ?? 4,
|
|
33
|
+
enableColors: loggerConfig.enableColors ?? true,
|
|
34
|
+
enableStackTrace: loggerConfig.enableStackTrace ?? true,
|
|
35
|
+
transports: (loggerConfig as any).transports ?? ['console']
|
|
32
36
|
}
|
|
33
37
|
}
|
|
34
38
|
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FluxStack Logger - Message Formatter
|
|
3
|
-
* Formats log messages with proper object inspection
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { inspect } from 'util'
|
|
7
|
-
import { LOGGER_CONFIG } from './config'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Format a log message with proper object inspection
|
|
11
|
-
*/
|
|
12
|
-
export function formatMessage(message: unknown, args: unknown[] = []): string {
|
|
13
|
-
const inspectOptions = {
|
|
14
|
-
depth: LOGGER_CONFIG.objectDepth,
|
|
15
|
-
colors: LOGGER_CONFIG.enableColors,
|
|
16
|
-
compact: false,
|
|
17
|
-
breakLength: 100
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Format the main message
|
|
21
|
-
let formattedMessage: string
|
|
22
|
-
|
|
23
|
-
if (typeof message === 'string') {
|
|
24
|
-
formattedMessage = message
|
|
25
|
-
} else if (message instanceof Error) {
|
|
26
|
-
// Special handling for Error objects
|
|
27
|
-
formattedMessage = `${message.name}: ${message.message}\n${message.stack || ''}`
|
|
28
|
-
} else if (typeof message === 'object' && message !== null) {
|
|
29
|
-
// Use util.inspect for better object formatting
|
|
30
|
-
formattedMessage = inspect(message, inspectOptions)
|
|
31
|
-
} else {
|
|
32
|
-
formattedMessage = String(message)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Format additional arguments (skip undefined values)
|
|
36
|
-
if (args.length > 0) {
|
|
37
|
-
const formattedArgs = args
|
|
38
|
-
.filter(arg => arg !== undefined) // Skip undefined values
|
|
39
|
-
.map(arg => {
|
|
40
|
-
if (typeof arg === 'object' && arg !== null) {
|
|
41
|
-
return inspect(arg, inspectOptions)
|
|
42
|
-
}
|
|
43
|
-
return String(arg)
|
|
44
|
-
})
|
|
45
|
-
.join(' ')
|
|
46
|
-
|
|
47
|
-
// Only add formatted args if there are any after filtering
|
|
48
|
-
if (formattedArgs.length > 0) {
|
|
49
|
-
return `${formattedMessage} ${formattedArgs}`
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return formattedMessage
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Format a section title
|
|
58
|
-
*/
|
|
59
|
-
export function formatSection(title: string): string {
|
|
60
|
-
return `=== ${title.toUpperCase()} ===`
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Format an important message
|
|
65
|
-
*/
|
|
66
|
-
export function formatImportant(title: string): string {
|
|
67
|
-
return `■ ${title.toUpperCase()} ■`
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Format operation start
|
|
72
|
-
*/
|
|
73
|
-
export function formatOperationStart(operation: string): string {
|
|
74
|
-
return `▶ INICIANDO: ${operation}`
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Format operation success
|
|
79
|
-
*/
|
|
80
|
-
export function formatOperationSuccess(operation: string): string {
|
|
81
|
-
return `✓ CONCLUÍDO: ${operation}`
|
|
82
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* FluxStack Logger - Message Formatter
|
|
3
|
+
* Formats log messages with proper object inspection
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { inspect } from 'util'
|
|
7
|
+
import { LOGGER_CONFIG } from './config'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Format a log message with proper object inspection
|
|
11
|
+
*/
|
|
12
|
+
export function formatMessage(message: unknown, args: unknown[] = []): string {
|
|
13
|
+
const inspectOptions = {
|
|
14
|
+
depth: LOGGER_CONFIG.objectDepth,
|
|
15
|
+
colors: LOGGER_CONFIG.enableColors,
|
|
16
|
+
compact: false,
|
|
17
|
+
breakLength: 100
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Format the main message
|
|
21
|
+
let formattedMessage: string
|
|
22
|
+
|
|
23
|
+
if (typeof message === 'string') {
|
|
24
|
+
formattedMessage = message
|
|
25
|
+
} else if (message instanceof Error) {
|
|
26
|
+
// Special handling for Error objects
|
|
27
|
+
formattedMessage = `${message.name}: ${message.message}\n${message.stack || ''}`
|
|
28
|
+
} else if (typeof message === 'object' && message !== null) {
|
|
29
|
+
// Use util.inspect for better object formatting
|
|
30
|
+
formattedMessage = inspect(message, inspectOptions)
|
|
31
|
+
} else {
|
|
32
|
+
formattedMessage = String(message)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Format additional arguments (skip undefined values)
|
|
36
|
+
if (args.length > 0) {
|
|
37
|
+
const formattedArgs = args
|
|
38
|
+
.filter(arg => arg !== undefined) // Skip undefined values
|
|
39
|
+
.map(arg => {
|
|
40
|
+
if (typeof arg === 'object' && arg !== null) {
|
|
41
|
+
return inspect(arg, inspectOptions)
|
|
42
|
+
}
|
|
43
|
+
return String(arg)
|
|
44
|
+
})
|
|
45
|
+
.join(' ')
|
|
46
|
+
|
|
47
|
+
// Only add formatted args if there are any after filtering
|
|
48
|
+
if (formattedArgs.length > 0) {
|
|
49
|
+
return `${formattedMessage} ${formattedArgs}`
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return formattedMessage
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Format a section title
|
|
58
|
+
*/
|
|
59
|
+
export function formatSection(title: string): string {
|
|
60
|
+
return `=== ${title.toUpperCase()} ===`
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Format an important message
|
|
65
|
+
*/
|
|
66
|
+
export function formatImportant(title: string): string {
|
|
67
|
+
return `■ ${title.toUpperCase()} ■`
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Format operation start
|
|
72
|
+
*/
|
|
73
|
+
export function formatOperationStart(operation: string): string {
|
|
74
|
+
return `▶ INICIANDO: ${operation}`
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Format operation success
|
|
79
|
+
*/
|
|
80
|
+
export function formatOperationSuccess(operation: string): string {
|
|
81
|
+
return `✓ CONCLUÍDO: ${operation}`
|
|
82
|
+
}
|
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FluxStack Logger - Grouped/Collapsible Logs
|
|
3
|
-
* Creates beautiful grouped console output
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import chalk from 'chalk'
|
|
7
|
-
|
|
8
|
-
export interface GroupOptions {
|
|
9
|
-
title: string
|
|
10
|
-
icon?: string
|
|
11
|
-
collapsed?: boolean
|
|
12
|
-
color?: 'cyan' | 'green' | 'yellow' | 'blue' | 'magenta' | 'gray'
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Start a log group (collapsible in browsers, indented in terminal)
|
|
17
|
-
*/
|
|
18
|
-
export function startGroup(options: GroupOptions): void {
|
|
19
|
-
const { title, icon = '📦', collapsed = false, color = 'cyan' } = options
|
|
20
|
-
|
|
21
|
-
// Check if we're in a browser-like environment (has console.group)
|
|
22
|
-
if (typeof console.groupCollapsed === 'function' && typeof console.group === 'function') {
|
|
23
|
-
const coloredTitle = chalk[color].bold(`${icon} ${title}`)
|
|
24
|
-
|
|
25
|
-
if (collapsed) {
|
|
26
|
-
console.groupCollapsed(coloredTitle)
|
|
27
|
-
} else {
|
|
28
|
-
console.group(coloredTitle)
|
|
29
|
-
}
|
|
30
|
-
} else {
|
|
31
|
-
// Terminal fallback - use box drawing
|
|
32
|
-
const coloredTitle = chalk[color].bold(`${icon} ${title}`)
|
|
33
|
-
console.log('\n' + coloredTitle)
|
|
34
|
-
console.log(chalk.gray('─'.repeat(Math.min(title.length + 4, 60))))
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* End a log group
|
|
40
|
-
*/
|
|
41
|
-
export function endGroup(): void {
|
|
42
|
-
if (typeof console.groupEnd === 'function') {
|
|
43
|
-
console.groupEnd()
|
|
44
|
-
} else {
|
|
45
|
-
// Terminal fallback - just add spacing
|
|
46
|
-
console.log('')
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Log within a group
|
|
52
|
-
*/
|
|
53
|
-
export function logInGroup(message: string, icon?: string): void {
|
|
54
|
-
const prefix = icon ? `${icon} ` : ' '
|
|
55
|
-
console.log(chalk.gray(prefix) + message)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Helper: Auto-group function that handles start/end automatically
|
|
60
|
-
*/
|
|
61
|
-
export async function withGroup<T>(
|
|
62
|
-
options: GroupOptions,
|
|
63
|
-
callback: () => T | Promise<T>
|
|
64
|
-
): Promise<T> {
|
|
65
|
-
startGroup(options)
|
|
66
|
-
try {
|
|
67
|
-
const result = await callback()
|
|
68
|
-
return result
|
|
69
|
-
} finally {
|
|
70
|
-
endGroup()
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Helper: Create a summary line for groups
|
|
76
|
-
*/
|
|
77
|
-
export function groupSummary(count: number, itemName: string, icon: string = '✓'): void {
|
|
78
|
-
// itemName should already include proper pluralization
|
|
79
|
-
const message = `${icon} ${count} ${itemName}`
|
|
80
|
-
console.log(chalk.green.bold(message))
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Create a boxed section for important info
|
|
85
|
-
*/
|
|
86
|
-
export function logBox(title: string, content: string[], options: { color?: 'cyan' | 'green' | 'yellow' } = {}): void {
|
|
87
|
-
const { color = 'cyan' } = options
|
|
88
|
-
const maxWidth = Math.max(title.length, ...content.map(c => c.length)) + 4
|
|
89
|
-
|
|
90
|
-
console.log('')
|
|
91
|
-
console.log(chalk[color]('┌' + '─'.repeat(maxWidth) + '┐'))
|
|
92
|
-
console.log(chalk[color]('│ ') + chalk.bold(title.padEnd(maxWidth - 2)) + chalk[color](' │'))
|
|
93
|
-
console.log(chalk[color]('├' + '─'.repeat(maxWidth) + '┤'))
|
|
94
|
-
|
|
95
|
-
for (const line of content) {
|
|
96
|
-
console.log(chalk[color]('│ ') + line.padEnd(maxWidth - 2) + chalk[color](' │'))
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
console.log(chalk[color]('└' + '─'.repeat(maxWidth) + '┘'))
|
|
100
|
-
console.log('')
|
|
101
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* FluxStack Logger - Grouped/Collapsible Logs
|
|
3
|
+
* Creates beautiful grouped console output
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import chalk from 'chalk'
|
|
7
|
+
|
|
8
|
+
export interface GroupOptions {
|
|
9
|
+
title: string
|
|
10
|
+
icon?: string
|
|
11
|
+
collapsed?: boolean
|
|
12
|
+
color?: 'cyan' | 'green' | 'yellow' | 'blue' | 'magenta' | 'gray'
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Start a log group (collapsible in browsers, indented in terminal)
|
|
17
|
+
*/
|
|
18
|
+
export function startGroup(options: GroupOptions): void {
|
|
19
|
+
const { title, icon = '📦', collapsed = false, color = 'cyan' } = options
|
|
20
|
+
|
|
21
|
+
// Check if we're in a browser-like environment (has console.group)
|
|
22
|
+
if (typeof console.groupCollapsed === 'function' && typeof console.group === 'function') {
|
|
23
|
+
const coloredTitle = chalk[color].bold(`${icon} ${title}`)
|
|
24
|
+
|
|
25
|
+
if (collapsed) {
|
|
26
|
+
console.groupCollapsed(coloredTitle)
|
|
27
|
+
} else {
|
|
28
|
+
console.group(coloredTitle)
|
|
29
|
+
}
|
|
30
|
+
} else {
|
|
31
|
+
// Terminal fallback - use box drawing
|
|
32
|
+
const coloredTitle = chalk[color].bold(`${icon} ${title}`)
|
|
33
|
+
console.log('\n' + coloredTitle)
|
|
34
|
+
console.log(chalk.gray('─'.repeat(Math.min(title.length + 4, 60))))
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* End a log group
|
|
40
|
+
*/
|
|
41
|
+
export function endGroup(): void {
|
|
42
|
+
if (typeof console.groupEnd === 'function') {
|
|
43
|
+
console.groupEnd()
|
|
44
|
+
} else {
|
|
45
|
+
// Terminal fallback - just add spacing
|
|
46
|
+
console.log('')
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Log within a group
|
|
52
|
+
*/
|
|
53
|
+
export function logInGroup(message: string, icon?: string): void {
|
|
54
|
+
const prefix = icon ? `${icon} ` : ' '
|
|
55
|
+
console.log(chalk.gray(prefix) + message)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Helper: Auto-group function that handles start/end automatically
|
|
60
|
+
*/
|
|
61
|
+
export async function withGroup<T>(
|
|
62
|
+
options: GroupOptions,
|
|
63
|
+
callback: () => T | Promise<T>
|
|
64
|
+
): Promise<T> {
|
|
65
|
+
startGroup(options)
|
|
66
|
+
try {
|
|
67
|
+
const result = await callback()
|
|
68
|
+
return result
|
|
69
|
+
} finally {
|
|
70
|
+
endGroup()
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Helper: Create a summary line for groups
|
|
76
|
+
*/
|
|
77
|
+
export function groupSummary(count: number, itemName: string, icon: string = '✓'): void {
|
|
78
|
+
// itemName should already include proper pluralization
|
|
79
|
+
const message = `${icon} ${count} ${itemName}`
|
|
80
|
+
console.log(chalk.green.bold(message))
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Create a boxed section for important info
|
|
85
|
+
*/
|
|
86
|
+
export function logBox(title: string, content: string[], options: { color?: 'cyan' | 'green' | 'yellow' } = {}): void {
|
|
87
|
+
const { color = 'cyan' } = options
|
|
88
|
+
const maxWidth = Math.max(title.length, ...content.map(c => c.length)) + 4
|
|
89
|
+
|
|
90
|
+
console.log('')
|
|
91
|
+
console.log(chalk[color]('┌' + '─'.repeat(maxWidth) + '┐'))
|
|
92
|
+
console.log(chalk[color]('│ ') + chalk.bold(title.padEnd(maxWidth - 2)) + chalk[color](' │'))
|
|
93
|
+
console.log(chalk[color]('├' + '─'.repeat(maxWidth) + '┤'))
|
|
94
|
+
|
|
95
|
+
for (const line of content) {
|
|
96
|
+
console.log(chalk[color]('│ ') + line.padEnd(maxWidth - 2) + chalk[color](' │'))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
console.log(chalk[color]('└' + '─'.repeat(maxWidth) + '┘'))
|
|
100
|
+
console.log('')
|
|
101
|
+
}
|