create-fluxstack 1.0.13 → 1.0.14
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/.env.example +29 -29
- package/app/client/README.md +69 -69
- package/app/client/index.html +14 -13
- package/app/client/src/App.tsx +157 -524
- package/app/client/src/components/ErrorBoundary.tsx +107 -0
- package/app/client/src/components/ErrorDisplay.css +365 -0
- package/app/client/src/components/ErrorDisplay.tsx +258 -0
- package/app/client/src/components/FluxStackConfig.tsx +1321 -0
- package/app/client/src/components/HybridLiveCounter.tsx +140 -0
- package/app/client/src/components/LiveClock.tsx +286 -0
- package/app/client/src/components/MainLayout.tsx +390 -0
- package/app/client/src/components/SidebarNavigation.tsx +391 -0
- package/app/client/src/components/StateDemo.tsx +178 -0
- package/app/client/src/components/SystemMonitor.tsx +1038 -0
- package/app/client/src/components/Teste.tsx +104 -0
- package/app/client/src/components/UserProfile.tsx +809 -0
- package/app/client/src/hooks/useAuth.ts +39 -0
- package/app/client/src/hooks/useNotifications.ts +56 -0
- package/app/client/src/lib/eden-api.ts +189 -53
- package/app/client/src/lib/errors.ts +340 -0
- package/app/client/src/lib/hooks/useErrorHandler.ts +258 -0
- package/app/client/src/lib/index.ts +45 -0
- package/app/client/src/main.tsx +3 -2
- package/app/client/src/pages/ApiDocs.tsx +182 -0
- package/app/client/src/pages/Demo.tsx +174 -0
- package/app/client/src/pages/HybridLive.tsx +263 -0
- package/app/client/src/pages/Overview.tsx +155 -0
- package/app/client/src/store/README.md +43 -0
- package/app/client/src/store/index.ts +16 -0
- package/app/client/src/store/slices/uiSlice.ts +151 -0
- package/app/client/src/store/slices/userSlice.ts +161 -0
- package/app/client/src/test/README.md +257 -0
- package/app/client/src/test/setup.ts +70 -0
- package/app/client/src/test/types.ts +12 -0
- package/app/client/src/vite-env.d.ts +1 -1
- package/app/client/tsconfig.app.json +44 -43
- package/app/client/tsconfig.json +7 -7
- package/app/client/tsconfig.node.json +25 -25
- package/app/client/zustand-setup.md +65 -0
- package/app/server/controllers/users.controller.ts +68 -68
- package/app/server/index.ts +9 -1
- package/app/server/live/CounterComponent.ts +191 -0
- package/app/server/live/FluxStackConfig.ts +529 -0
- package/app/server/live/LiveClockComponent.ts +214 -0
- package/app/server/live/SidebarNavigation.ts +156 -0
- package/app/server/live/SystemMonitor.ts +594 -0
- package/app/server/live/SystemMonitorIntegration.ts +151 -0
- package/app/server/live/TesteComponent.ts +87 -0
- package/app/server/live/UserProfileComponent.ts +135 -0
- package/app/server/live/register-components.ts +28 -0
- package/app/server/middleware/auth.ts +136 -0
- package/app/server/middleware/errorHandling.ts +250 -0
- package/app/server/middleware/index.ts +10 -0
- package/app/server/middleware/rateLimit.ts +193 -0
- package/app/server/middleware/requestLogging.ts +215 -0
- package/app/server/middleware/validation.ts +270 -0
- package/app/server/routes/index.ts +14 -2
- package/app/server/routes/upload.ts +92 -0
- package/app/server/routes/users.routes.ts +2 -9
- package/app/server/services/NotificationService.ts +302 -0
- package/app/server/services/UserService.ts +222 -0
- package/app/server/services/index.ts +46 -0
- package/core/cli/commands/plugin-deps.ts +263 -0
- package/core/cli/generators/README.md +339 -0
- package/core/cli/generators/component.ts +770 -0
- package/core/cli/generators/controller.ts +299 -0
- package/core/cli/generators/index.ts +144 -0
- package/core/cli/generators/interactive.ts +228 -0
- package/core/cli/generators/prompts.ts +83 -0
- package/core/cli/generators/route.ts +513 -0
- package/core/cli/generators/service.ts +465 -0
- package/core/cli/generators/template-engine.ts +154 -0
- package/core/cli/generators/types.ts +71 -0
- package/core/cli/generators/utils.ts +192 -0
- package/core/cli/index.ts +69 -0
- package/core/cli/plugin-discovery.ts +16 -85
- package/core/client/fluxstack.ts +17 -0
- package/core/client/hooks/index.ts +7 -0
- package/core/client/hooks/state-validator.ts +130 -0
- package/core/client/hooks/useAuth.ts +49 -0
- package/core/client/hooks/useChunkedUpload.ts +258 -0
- package/core/client/hooks/useHybridLiveComponent.ts +967 -0
- package/core/client/hooks/useWebSocket.ts +373 -0
- package/core/client/index.ts +47 -0
- package/core/client/state/createStore.ts +193 -0
- package/core/client/state/index.ts +15 -0
- package/core/config/env-dynamic.ts +1 -1
- package/core/config/env.ts +2 -1
- package/core/config/runtime-config.ts +3 -3
- package/core/config/schema.ts +84 -49
- package/core/framework/server.ts +30 -0
- package/core/index.ts +25 -0
- package/core/live/ComponentRegistry.ts +399 -0
- package/core/live/types.ts +164 -0
- package/core/plugins/built-in/live-components/commands/create-live-component.ts +1201 -0
- package/core/plugins/built-in/live-components/index.ts +27 -0
- package/core/plugins/built-in/logger/index.ts +1 -1
- package/core/plugins/built-in/monitoring/index.ts +1 -1
- package/core/plugins/built-in/static/index.ts +1 -1
- package/core/plugins/built-in/swagger/index.ts +1 -1
- package/core/plugins/built-in/vite/index.ts +1 -1
- package/core/plugins/dependency-manager.ts +384 -0
- package/core/plugins/index.ts +5 -1
- package/core/plugins/manager.ts +7 -3
- package/core/plugins/registry.ts +88 -10
- package/core/plugins/types.ts +11 -11
- package/core/server/framework.ts +43 -0
- package/core/server/index.ts +11 -1
- package/core/server/live/ComponentRegistry.ts +1017 -0
- package/core/server/live/FileUploadManager.ts +272 -0
- package/core/server/live/LiveComponentPerformanceMonitor.ts +930 -0
- package/core/server/live/SingleConnectionManager.ts +0 -0
- package/core/server/live/StateSignature.ts +644 -0
- package/core/server/live/WebSocketConnectionManager.ts +688 -0
- package/core/server/live/websocket-plugin.ts +435 -0
- package/core/server/middleware/errorHandling.ts +141 -0
- package/core/server/middleware/index.ts +16 -0
- package/core/server/plugins/static-files-plugin.ts +232 -0
- package/core/server/services/BaseService.ts +95 -0
- package/core/server/services/ServiceContainer.ts +144 -0
- package/core/server/services/index.ts +9 -0
- package/core/templates/create-project.ts +46 -2
- package/core/testing/index.ts +10 -0
- package/core/testing/setup.ts +74 -0
- package/core/types/build.ts +38 -14
- package/core/types/types.ts +319 -0
- package/core/utils/env-runtime.ts +7 -0
- package/core/utils/errors/handlers.ts +264 -39
- package/core/utils/errors/index.ts +528 -18
- package/core/utils/errors/middleware.ts +114 -0
- package/core/utils/logger/formatters.ts +222 -0
- package/core/utils/logger/index.ts +167 -48
- package/core/utils/logger/middleware.ts +253 -0
- package/core/utils/logger/performance.ts +384 -0
- package/core/utils/logger/transports.ts +365 -0
- package/create-fluxstack.ts +296 -296
- package/fluxstack.config.ts +17 -1
- package/package-template.json +66 -66
- package/package.json +31 -6
- package/public/README.md +16 -0
- package/vite.config.ts +29 -14
- package/.claude/settings.local.json +0 -74
- package/.github/workflows/ci-build-tests.yml +0 -480
- package/.github/workflows/dependency-management.yml +0 -324
- package/.github/workflows/release-validation.yml +0 -355
- package/.kiro/specs/fluxstack-architecture-optimization/design.md +0 -700
- package/.kiro/specs/fluxstack-architecture-optimization/requirements.md +0 -127
- package/.kiro/specs/fluxstack-architecture-optimization/tasks.md +0 -330
- package/CLAUDE.md +0 -200
- package/Dockerfile +0 -58
- package/Dockerfile.backend +0 -52
- package/Dockerfile.frontend +0 -54
- package/README-Docker.md +0 -85
- package/ai-context/00-QUICK-START.md +0 -86
- package/ai-context/README.md +0 -88
- package/ai-context/development/eden-treaty-guide.md +0 -362
- package/ai-context/development/patterns.md +0 -382
- package/ai-context/development/plugins-guide.md +0 -572
- package/ai-context/examples/crud-complete.md +0 -626
- package/ai-context/project/architecture.md +0 -399
- package/ai-context/project/overview.md +0 -213
- package/ai-context/recent-changes/eden-treaty-refactor.md +0 -281
- package/ai-context/recent-changes/type-inference-fix.md +0 -223
- package/ai-context/reference/environment-vars.md +0 -384
- package/ai-context/reference/troubleshooting.md +0 -407
- package/app/client/src/components/TestPage.tsx +0 -453
- package/bun.lock +0 -1063
- package/bunfig.toml +0 -16
- package/core/__tests__/integration.test.ts +0 -227
- package/core/build/index.ts +0 -186
- package/core/config/__tests__/config-loader.test.ts +0 -554
- package/core/config/__tests__/config-merger.test.ts +0 -657
- package/core/config/__tests__/env-converter.test.ts +0 -372
- package/core/config/__tests__/env-processor.test.ts +0 -431
- package/core/config/__tests__/env.test.ts +0 -452
- package/core/config/__tests__/integration.test.ts +0 -418
- package/core/config/__tests__/loader.test.ts +0 -331
- package/core/config/__tests__/schema.test.ts +0 -129
- package/core/config/__tests__/validator.test.ts +0 -318
- package/core/framework/__tests__/server.test.ts +0 -233
- package/core/plugins/__tests__/built-in.test.ts.disabled +0 -366
- package/core/plugins/__tests__/manager.test.ts +0 -398
- package/core/plugins/__tests__/monitoring.test.ts +0 -401
- package/core/plugins/__tests__/registry.test.ts +0 -335
- package/core/utils/__tests__/errors.test.ts +0 -139
- package/core/utils/__tests__/helpers.test.ts +0 -297
- package/core/utils/__tests__/logger.test.ts +0 -141
- package/create-test-app.ts +0 -156
- package/docker-compose.microservices.yml +0 -75
- package/docker-compose.simple.yml +0 -57
- package/docker-compose.yml +0 -71
- package/eslint.config.js +0 -23
- package/flux-cli.ts +0 -214
- package/nginx-lb.conf +0 -37
- package/publish.sh +0 -63
- package/run-clean.ts +0 -26
- package/run-env-tests.ts +0 -313
- package/tailwind.config.js +0 -34
- package/tests/__mocks__/api.ts +0 -56
- package/tests/fixtures/users.ts +0 -69
- package/tests/integration/api/users.routes.test.ts +0 -221
- package/tests/setup.ts +0 -29
- package/tests/unit/app/client/App-simple.test.tsx +0 -56
- package/tests/unit/app/client/App.test.tsx.skip +0 -237
- package/tests/unit/app/client/eden-api.test.ts +0 -186
- package/tests/unit/app/client/simple.test.tsx +0 -23
- package/tests/unit/app/controllers/users.controller.test.ts +0 -150
- package/tests/unit/core/create-project.test.ts.skip +0 -95
- package/tests/unit/core/framework.test.ts +0 -144
- package/tests/unit/core/plugins/logger.test.ts.skip +0 -268
- package/tests/unit/core/plugins/vite.test.ts.disabled +0 -188
- package/tests/utils/test-helpers.ts +0 -61
- package/vitest.config.ts +0 -50
- package/workspace.json +0 -6
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comando CLI para gerenciar dependências de plugins
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Command } from 'commander'
|
|
6
|
+
import chalk from 'chalk'
|
|
7
|
+
import { PluginDependencyManager } from '../../plugins/dependency-manager'
|
|
8
|
+
import { PluginRegistry } from '../../plugins/registry'
|
|
9
|
+
import { existsSync, readFileSync } from 'fs'
|
|
10
|
+
import { join } from 'path'
|
|
11
|
+
|
|
12
|
+
export function createPluginDepsCommand(): Command {
|
|
13
|
+
const command = new Command('plugin:deps')
|
|
14
|
+
.description('Gerenciar dependências de plugins')
|
|
15
|
+
.addCommand(createInstallCommand())
|
|
16
|
+
.addCommand(createListCommand())
|
|
17
|
+
.addCommand(createCheckCommand())
|
|
18
|
+
.addCommand(createCleanCommand())
|
|
19
|
+
|
|
20
|
+
return command
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function createInstallCommand(): Command {
|
|
24
|
+
return new Command('install')
|
|
25
|
+
.description('Instalar dependências de todos os plugins')
|
|
26
|
+
.option('--dry-run', 'Mostrar o que seria instalado sem executar')
|
|
27
|
+
.option('--package-manager <pm>', 'Package manager a usar (npm, yarn, pnpm, bun)', 'bun')
|
|
28
|
+
.action(async (options) => {
|
|
29
|
+
console.log(chalk.blue('🔧 Instalando dependências de plugins...\n'))
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
const dependencyManager = new PluginDependencyManager({
|
|
33
|
+
autoInstall: !options.dryRun,
|
|
34
|
+
packageManager: options.packageManager,
|
|
35
|
+
logger: createConsoleLogger()
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
const registry = new PluginRegistry({
|
|
39
|
+
logger: createConsoleLogger()
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
// Descobrir plugins
|
|
43
|
+
const results = await registry.discoverPlugins({
|
|
44
|
+
directories: ['plugins', 'core/plugins/built-in']
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
const successfulPlugins = results.filter(r => r.success)
|
|
48
|
+
console.log(chalk.green(`✅ Encontrados ${successfulPlugins.length} plugins\n`))
|
|
49
|
+
|
|
50
|
+
// Resolver dependências
|
|
51
|
+
const resolutions = []
|
|
52
|
+
for (const result of successfulPlugins) {
|
|
53
|
+
if (result.plugin) {
|
|
54
|
+
const pluginDir = findPluginDirectory(result.plugin.name)
|
|
55
|
+
if (pluginDir) {
|
|
56
|
+
const resolution = await dependencyManager.resolvePluginDependencies(pluginDir)
|
|
57
|
+
resolutions.push(resolution)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Mostrar resumo
|
|
63
|
+
let totalDeps = 0
|
|
64
|
+
let totalConflicts = 0
|
|
65
|
+
|
|
66
|
+
for (const resolution of resolutions) {
|
|
67
|
+
totalDeps += resolution.dependencies.length
|
|
68
|
+
totalConflicts += resolution.conflicts.length
|
|
69
|
+
|
|
70
|
+
if (resolution.dependencies.length > 0) {
|
|
71
|
+
console.log(chalk.cyan(`📦 ${resolution.plugin}:`))
|
|
72
|
+
for (const dep of resolution.dependencies) {
|
|
73
|
+
const typeColor = dep.type === 'peerDependency' ? chalk.yellow : chalk.white
|
|
74
|
+
console.log(` ${typeColor(dep.name)}@${dep.version} (${dep.type})`)
|
|
75
|
+
}
|
|
76
|
+
console.log()
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (totalConflicts > 0) {
|
|
81
|
+
console.log(chalk.yellow(`⚠️ ${totalConflicts} conflitos de dependências detectados\n`))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (options.dryRun) {
|
|
85
|
+
console.log(chalk.blue(`📋 Dry run: ${totalDeps} dependências seriam instaladas`))
|
|
86
|
+
} else {
|
|
87
|
+
await dependencyManager.installPluginDependencies(resolutions)
|
|
88
|
+
console.log(chalk.green(`✅ ${totalDeps} dependências instaladas com sucesso!`))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.error(chalk.red('❌ Erro ao instalar dependências:'), error)
|
|
93
|
+
process.exit(1)
|
|
94
|
+
}
|
|
95
|
+
})
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function createListCommand(): Command {
|
|
99
|
+
return new Command('list')
|
|
100
|
+
.description('Listar dependências de plugins')
|
|
101
|
+
.option('--plugin <name>', 'Mostrar apenas dependências de um plugin específico')
|
|
102
|
+
.action(async (options) => {
|
|
103
|
+
console.log(chalk.blue('📋 Dependências de plugins:\n'))
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
const registry = new PluginRegistry({
|
|
107
|
+
logger: createConsoleLogger()
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
const results = await registry.discoverPlugins({
|
|
111
|
+
directories: ['plugins', 'core/plugins/built-in']
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
const dependencyManager = new PluginDependencyManager({
|
|
115
|
+
autoInstall: false,
|
|
116
|
+
logger: createConsoleLogger()
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
for (const result of results) {
|
|
120
|
+
if (result.success && result.plugin) {
|
|
121
|
+
if (options.plugin && result.plugin.name !== options.plugin) {
|
|
122
|
+
continue
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const pluginDir = findPluginDirectory(result.plugin.name)
|
|
126
|
+
if (pluginDir) {
|
|
127
|
+
const resolution = await dependencyManager.resolvePluginDependencies(pluginDir)
|
|
128
|
+
|
|
129
|
+
console.log(chalk.cyan(`📦 ${resolution.plugin}`))
|
|
130
|
+
|
|
131
|
+
if (resolution.dependencies.length === 0) {
|
|
132
|
+
console.log(chalk.gray(' Nenhuma dependência'))
|
|
133
|
+
} else {
|
|
134
|
+
for (const dep of resolution.dependencies) {
|
|
135
|
+
const typeColor = dep.type === 'peerDependency' ? chalk.yellow : chalk.white
|
|
136
|
+
const optional = dep.optional ? chalk.gray(' (opcional)') : ''
|
|
137
|
+
console.log(` ${typeColor(dep.name)}@${dep.version} (${dep.type})${optional}`)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (resolution.conflicts.length > 0) {
|
|
142
|
+
console.log(chalk.red(` ⚠️ ${resolution.conflicts.length} conflitos`))
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
console.log()
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
} catch (error) {
|
|
151
|
+
console.error(chalk.red('❌ Erro ao listar dependências:'), error)
|
|
152
|
+
process.exit(1)
|
|
153
|
+
}
|
|
154
|
+
})
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function createCheckCommand(): Command {
|
|
158
|
+
return new Command('check')
|
|
159
|
+
.description('Verificar conflitos de dependências')
|
|
160
|
+
.action(async () => {
|
|
161
|
+
console.log(chalk.blue('🔍 Verificando conflitos de dependências...\n'))
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
const registry = new PluginRegistry({
|
|
165
|
+
logger: createConsoleLogger()
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
const results = await registry.discoverPlugins({
|
|
169
|
+
directories: ['plugins', 'core/plugins/built-in']
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
const dependencyManager = new PluginDependencyManager({
|
|
173
|
+
autoInstall: false,
|
|
174
|
+
logger: createConsoleLogger()
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
const resolutions = []
|
|
178
|
+
for (const result of results) {
|
|
179
|
+
if (result.success && result.plugin) {
|
|
180
|
+
const pluginDir = findPluginDirectory(result.plugin.name)
|
|
181
|
+
if (pluginDir) {
|
|
182
|
+
const resolution = await dependencyManager.resolvePluginDependencies(pluginDir)
|
|
183
|
+
resolutions.push(resolution)
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const allConflicts = resolutions.flatMap(r => r.conflicts)
|
|
189
|
+
|
|
190
|
+
if (allConflicts.length === 0) {
|
|
191
|
+
console.log(chalk.green('✅ Nenhum conflito de dependências encontrado!'))
|
|
192
|
+
} else {
|
|
193
|
+
console.log(chalk.red(`❌ ${allConflicts.length} conflitos encontrados:\n`))
|
|
194
|
+
|
|
195
|
+
for (const conflict of allConflicts) {
|
|
196
|
+
console.log(chalk.yellow(`⚠️ ${conflict.package}:`))
|
|
197
|
+
for (const version of conflict.versions) {
|
|
198
|
+
console.log(` ${version.plugin}: ${version.version}`)
|
|
199
|
+
}
|
|
200
|
+
if (conflict.resolution) {
|
|
201
|
+
console.log(chalk.green(` Resolução: ${conflict.resolution}`))
|
|
202
|
+
}
|
|
203
|
+
console.log()
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
} catch (error) {
|
|
208
|
+
console.error(chalk.red('❌ Erro ao verificar conflitos:'), error)
|
|
209
|
+
process.exit(1)
|
|
210
|
+
}
|
|
211
|
+
})
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function createCleanCommand(): Command {
|
|
215
|
+
return new Command('clean')
|
|
216
|
+
.description('Limpar dependências não utilizadas')
|
|
217
|
+
.option('--dry-run', 'Mostrar o que seria removido sem executar')
|
|
218
|
+
.action(async (options) => {
|
|
219
|
+
console.log(chalk.blue('🧹 Limpando dependências não utilizadas...\n'))
|
|
220
|
+
|
|
221
|
+
if (options.dryRun) {
|
|
222
|
+
console.log(chalk.blue('📋 Dry run: mostrando dependências que seriam removidas'))
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// TODO: Implementar lógica de limpeza
|
|
226
|
+
console.log(chalk.yellow('⚠️ Funcionalidade ainda não implementada'))
|
|
227
|
+
})
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function findPluginDirectory(pluginName: string): string | null {
|
|
231
|
+
const possiblePaths = [
|
|
232
|
+
`plugins/${pluginName}`,
|
|
233
|
+
`core/plugins/built-in/${pluginName}`
|
|
234
|
+
]
|
|
235
|
+
|
|
236
|
+
for (const path of possiblePaths) {
|
|
237
|
+
if (existsSync(path)) {
|
|
238
|
+
return path
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return null
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function createConsoleLogger() {
|
|
246
|
+
return {
|
|
247
|
+
debug: (msg: string, meta?: any) => {
|
|
248
|
+
if (process.env.DEBUG) {
|
|
249
|
+
console.log(chalk.gray(`[DEBUG] ${msg}`), meta || '')
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
info: (msg: string, meta?: any) => {
|
|
253
|
+
console.log(chalk.blue(`[INFO] ${msg}`), meta || '')
|
|
254
|
+
},
|
|
255
|
+
warn: (msg: string, meta?: any) => {
|
|
256
|
+
console.log(chalk.yellow(`[WARN] ${msg}`), meta || '')
|
|
257
|
+
},
|
|
258
|
+
error: (msg: string, meta?: any) => {
|
|
259
|
+
console.log(chalk.red(`[ERROR] ${msg}`), meta || '')
|
|
260
|
+
},
|
|
261
|
+
child: () => createConsoleLogger()
|
|
262
|
+
}
|
|
263
|
+
}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# FluxStack Code Generation System
|
|
2
|
+
|
|
3
|
+
The FluxStack code generation system provides powerful tools to quickly scaffold common code patterns, reducing boilerplate and ensuring consistency across your project.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### Basic Usage
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Generate a CRUD controller
|
|
11
|
+
flux generate controller user
|
|
12
|
+
|
|
13
|
+
# Generate a React component
|
|
14
|
+
flux generate component UserCard
|
|
15
|
+
|
|
16
|
+
# Generate a service with repository pattern
|
|
17
|
+
flux generate service auth
|
|
18
|
+
|
|
19
|
+
# Generate API routes
|
|
20
|
+
flux generate route user
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Interactive Mode
|
|
24
|
+
|
|
25
|
+
For a guided experience with prompts:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
flux generate:interactive
|
|
29
|
+
# or
|
|
30
|
+
flux gi
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Available Generators
|
|
34
|
+
|
|
35
|
+
### 1. Controller Generator
|
|
36
|
+
|
|
37
|
+
Generates backend controllers with CRUD operations.
|
|
38
|
+
|
|
39
|
+
**Templates:**
|
|
40
|
+
- `crud` (default) - Full CRUD controller with validation and error handling
|
|
41
|
+
- `minimal` - Basic controller structure with TODO placeholders
|
|
42
|
+
|
|
43
|
+
**Usage:**
|
|
44
|
+
```bash
|
|
45
|
+
flux generate controller user
|
|
46
|
+
flux generate controller product --template minimal
|
|
47
|
+
flux generate controller order --path custom/path
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Generated Files:**
|
|
51
|
+
- `app/server/controllers/{name}.controller.ts` - Main controller class
|
|
52
|
+
- `app/server/schemas/{name}.schema.ts` - Validation schemas (CRUD template only)
|
|
53
|
+
|
|
54
|
+
### 2. Service Generator
|
|
55
|
+
|
|
56
|
+
Generates business logic services with repository pattern.
|
|
57
|
+
|
|
58
|
+
**Templates:**
|
|
59
|
+
- `crud` (default) - Full service with validation, logging, and repository
|
|
60
|
+
- `repository` - Service with repository pattern
|
|
61
|
+
- `minimal` - Basic service structure
|
|
62
|
+
|
|
63
|
+
**Usage:**
|
|
64
|
+
```bash
|
|
65
|
+
flux generate service user
|
|
66
|
+
flux generate service auth --template repository
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Generated Files:**
|
|
70
|
+
- `app/server/services/{name}.service.ts` - Main service class
|
|
71
|
+
- `app/server/repositories/{name}.repository.ts` - Repository class (CRUD/repository templates)
|
|
72
|
+
|
|
73
|
+
### 3. Component Generator
|
|
74
|
+
|
|
75
|
+
Generates React components with TypeScript.
|
|
76
|
+
|
|
77
|
+
**Templates:**
|
|
78
|
+
- `basic` (default) - Simple React component with props interface
|
|
79
|
+
- `functional` - Component with hooks and state management
|
|
80
|
+
- `page` - Page component with layout and SEO
|
|
81
|
+
- `form` - Form component with validation
|
|
82
|
+
- `full` - Complete component with tests and Storybook stories
|
|
83
|
+
|
|
84
|
+
**Usage:**
|
|
85
|
+
```bash
|
|
86
|
+
flux generate component UserCard
|
|
87
|
+
flux generate component ContactForm --template form
|
|
88
|
+
flux generate component HomePage --template page
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Generated Files:**
|
|
92
|
+
- `app/client/src/components/{Name}/{Name}.tsx` - Main component
|
|
93
|
+
- `app/client/src/components/{Name}/{Name}.css` - Component styles
|
|
94
|
+
- `app/client/src/components/{Name}/index.ts` - Export file
|
|
95
|
+
- `app/client/src/components/{Name}/{Name}.test.tsx` - Tests (full template)
|
|
96
|
+
- `app/client/src/components/{Name}/{Name}.stories.tsx` - Storybook stories (full template)
|
|
97
|
+
|
|
98
|
+
### 4. Route Generator
|
|
99
|
+
|
|
100
|
+
Generates API routes with Elysia.js.
|
|
101
|
+
|
|
102
|
+
**Templates:**
|
|
103
|
+
- `crud` (default) - Full REST API with validation and documentation
|
|
104
|
+
- `auth` - Authentication routes (login, register, etc.)
|
|
105
|
+
- `minimal` - Basic route structure
|
|
106
|
+
|
|
107
|
+
**Usage:**
|
|
108
|
+
```bash
|
|
109
|
+
flux generate route user
|
|
110
|
+
flux generate route auth --template auth
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Generated Files:**
|
|
114
|
+
- `app/server/routes/{name}.routes.ts` - Route definitions
|
|
115
|
+
- `app/server/routes/index.ts` - Route registry (if doesn't exist)
|
|
116
|
+
- `app/server/middleware/{name}.middleware.ts` - Middleware (auth template)
|
|
117
|
+
|
|
118
|
+
## Command Options
|
|
119
|
+
|
|
120
|
+
### Global Options
|
|
121
|
+
|
|
122
|
+
- `--path, -p` - Custom path for generated files
|
|
123
|
+
- `--template, -t` - Template variant to use
|
|
124
|
+
- `--force, -f` - Overwrite existing files
|
|
125
|
+
- `--dry-run` - Preview what would be generated without creating files
|
|
126
|
+
|
|
127
|
+
### Examples
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# Preview generation without creating files
|
|
131
|
+
flux generate controller user --dry-run
|
|
132
|
+
|
|
133
|
+
# Force overwrite existing files
|
|
134
|
+
flux generate component Button --force
|
|
135
|
+
|
|
136
|
+
# Use custom path
|
|
137
|
+
flux generate service auth --path app/custom/services
|
|
138
|
+
|
|
139
|
+
# Use specific template
|
|
140
|
+
flux generate component Modal --template functional
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Template Variables
|
|
144
|
+
|
|
145
|
+
All templates have access to these variables:
|
|
146
|
+
|
|
147
|
+
- `{{name}}` - Original name as provided
|
|
148
|
+
- `{{Name}}` - Capitalized name
|
|
149
|
+
- `{{NAME}}` - Uppercase name
|
|
150
|
+
- `{{kebabName}}` - kebab-case name (user-profile)
|
|
151
|
+
- `{{camelName}}` - camelCase name (userProfile)
|
|
152
|
+
- `{{pascalName}}` - PascalCase name (UserProfile)
|
|
153
|
+
- `{{snakeName}}` - snake_case name (user_profile)
|
|
154
|
+
- `{{timestamp}}` - ISO timestamp
|
|
155
|
+
- `{{date}}` - Current date
|
|
156
|
+
- `{{year}}` - Current year
|
|
157
|
+
- `{{author}}` - Author from config
|
|
158
|
+
- `{{projectName}}` - Project name from config
|
|
159
|
+
|
|
160
|
+
## Creating Custom Templates
|
|
161
|
+
|
|
162
|
+
### Template Structure
|
|
163
|
+
|
|
164
|
+
Templates are defined as objects with the following structure:
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
interface Template {
|
|
168
|
+
name: string
|
|
169
|
+
description: string
|
|
170
|
+
files: TemplateFile[]
|
|
171
|
+
variables?: TemplateVariable[]
|
|
172
|
+
hooks?: {
|
|
173
|
+
beforeGenerate?: (context: GeneratorContext, options: GeneratorOptions) => Promise<void>
|
|
174
|
+
afterGenerate?: (context: GeneratorContext, options: GeneratorOptions, files: string[]) => Promise<void>
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Example Custom Generator
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
import { Generator } from "./index"
|
|
183
|
+
import { GeneratorContext, GeneratorOptions, Template } from "./types"
|
|
184
|
+
import { templateEngine } from "./template-engine"
|
|
185
|
+
|
|
186
|
+
export class CustomGenerator implements Generator {
|
|
187
|
+
name = 'custom'
|
|
188
|
+
description = 'Generate custom code'
|
|
189
|
+
|
|
190
|
+
async generate(context: GeneratorContext, options: GeneratorOptions): Promise<void> {
|
|
191
|
+
const template = this.getTemplate()
|
|
192
|
+
const files = await templateEngine.processTemplate(template, context, options)
|
|
193
|
+
|
|
194
|
+
if (!options.dryRun) {
|
|
195
|
+
await templateEngine.generateFiles(files)
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private getTemplate(): Template {
|
|
200
|
+
return {
|
|
201
|
+
name: 'custom-template',
|
|
202
|
+
description: 'Custom template',
|
|
203
|
+
files: [
|
|
204
|
+
{
|
|
205
|
+
path: 'custom/{{kebabName}}.ts',
|
|
206
|
+
content: `// Generated {{pascalName}} at {{timestamp}}
|
|
207
|
+
export class {{pascalName}} {
|
|
208
|
+
constructor() {
|
|
209
|
+
console.log('{{pascalName}} created')
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
`
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Best Practices
|
|
221
|
+
|
|
222
|
+
### 1. Naming Conventions
|
|
223
|
+
|
|
224
|
+
- Use PascalCase for components: `UserCard`, `ContactForm`
|
|
225
|
+
- Use camelCase for services and controllers: `userService`, `authController`
|
|
226
|
+
- Use kebab-case for routes: `user-profile`, `auth-routes`
|
|
227
|
+
|
|
228
|
+
### 2. Template Selection
|
|
229
|
+
|
|
230
|
+
- Use `crud` templates for full-featured implementations
|
|
231
|
+
- Use `minimal` templates when you need basic structure
|
|
232
|
+
- Use `full` templates when you need tests and documentation
|
|
233
|
+
|
|
234
|
+
### 3. File Organization
|
|
235
|
+
|
|
236
|
+
- Keep related files together (controller + service + routes)
|
|
237
|
+
- Use consistent directory structure
|
|
238
|
+
- Follow the generated file patterns
|
|
239
|
+
|
|
240
|
+
### 4. Customization
|
|
241
|
+
|
|
242
|
+
- Always review generated code before committing
|
|
243
|
+
- Customize templates for your specific needs
|
|
244
|
+
- Add validation and error handling as needed
|
|
245
|
+
|
|
246
|
+
## Integration with Development Workflow
|
|
247
|
+
|
|
248
|
+
### 1. Generate Related Files
|
|
249
|
+
|
|
250
|
+
When generating a controller, also generate:
|
|
251
|
+
```bash
|
|
252
|
+
flux generate controller user
|
|
253
|
+
flux generate service user
|
|
254
|
+
flux generate route user
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### 2. Update Imports
|
|
258
|
+
|
|
259
|
+
After generating routes, update your main server file:
|
|
260
|
+
```typescript
|
|
261
|
+
import { userRoutes } from './routes/user.routes'
|
|
262
|
+
|
|
263
|
+
app.use(userRoutes)
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### 3. Add to Navigation
|
|
267
|
+
|
|
268
|
+
After generating components, add them to your routing:
|
|
269
|
+
```typescript
|
|
270
|
+
import { UserPage } from './components/UserPage'
|
|
271
|
+
|
|
272
|
+
// Add to your router
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Troubleshooting
|
|
276
|
+
|
|
277
|
+
### Common Issues
|
|
278
|
+
|
|
279
|
+
1. **Files already exist**
|
|
280
|
+
- Use `--force` to overwrite
|
|
281
|
+
- Use `--dry-run` to preview first
|
|
282
|
+
|
|
283
|
+
2. **Permission errors**
|
|
284
|
+
- Check file permissions
|
|
285
|
+
- Ensure directory is writable
|
|
286
|
+
|
|
287
|
+
3. **Template not found**
|
|
288
|
+
- Check available templates with `flux generate --help`
|
|
289
|
+
- Verify template name spelling
|
|
290
|
+
|
|
291
|
+
4. **Invalid names**
|
|
292
|
+
- Names must start with a letter
|
|
293
|
+
- Only letters, numbers, hyphens, and underscores allowed
|
|
294
|
+
|
|
295
|
+
### Getting Help
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
# General help
|
|
299
|
+
flux help
|
|
300
|
+
|
|
301
|
+
# Generator help
|
|
302
|
+
flux help generate
|
|
303
|
+
|
|
304
|
+
# Interactive mode
|
|
305
|
+
flux generate:interactive
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## Advanced Usage
|
|
309
|
+
|
|
310
|
+
### Batch Generation
|
|
311
|
+
|
|
312
|
+
Generate multiple related files:
|
|
313
|
+
```bash
|
|
314
|
+
# Generate full stack for a feature
|
|
315
|
+
flux generate controller user
|
|
316
|
+
flux generate service user
|
|
317
|
+
flux generate route user
|
|
318
|
+
flux generate component UserList
|
|
319
|
+
flux generate component UserForm
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Custom Paths
|
|
323
|
+
|
|
324
|
+
Organize files in custom directories:
|
|
325
|
+
```bash
|
|
326
|
+
flux generate controller admin/user --path app/admin/controllers
|
|
327
|
+
flux generate component admin/UserPanel --path app/admin/components
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Environment-Specific Templates
|
|
331
|
+
|
|
332
|
+
Use different templates for different environments:
|
|
333
|
+
```bash
|
|
334
|
+
# Development with full features
|
|
335
|
+
flux generate controller user --template crud
|
|
336
|
+
|
|
337
|
+
# Production with minimal features
|
|
338
|
+
flux generate controller user --template minimal
|
|
339
|
+
```
|