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
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core Server Middleware
|
|
3
|
-
* FluxStack middleware infrastructure exports
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export {
|
|
7
|
-
errorHandlingMiddleware,
|
|
8
|
-
notFoundMiddleware,
|
|
9
|
-
createError,
|
|
10
|
-
asyncHandler
|
|
11
|
-
} from './errorHandling'
|
|
12
|
-
|
|
13
|
-
export type {
|
|
14
|
-
ErrorHandlingOptions,
|
|
15
|
-
FluxStackError
|
|
16
|
-
} from './errorHandling'
|
|
17
|
-
|
|
18
|
-
// Elysia Middleware Helpers
|
|
19
|
-
export {
|
|
20
|
-
createMiddleware,
|
|
21
|
-
createDerive,
|
|
22
|
-
createGuard,
|
|
23
|
-
createRateLimit,
|
|
24
|
-
composeMiddleware,
|
|
25
|
-
isDevelopment,
|
|
26
|
-
isProduction,
|
|
27
|
-
isTest
|
|
28
|
-
} from './elysia-helpers'
|
|
29
|
-
|
|
30
|
-
export type {
|
|
31
|
-
MiddlewareOptions
|
|
1
|
+
/**
|
|
2
|
+
* Core Server Middleware
|
|
3
|
+
* FluxStack middleware infrastructure exports
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
errorHandlingMiddleware,
|
|
8
|
+
notFoundMiddleware,
|
|
9
|
+
createError,
|
|
10
|
+
asyncHandler
|
|
11
|
+
} from './errorHandling'
|
|
12
|
+
|
|
13
|
+
export type {
|
|
14
|
+
ErrorHandlingOptions,
|
|
15
|
+
FluxStackError
|
|
16
|
+
} from './errorHandling'
|
|
17
|
+
|
|
18
|
+
// Elysia Middleware Helpers
|
|
19
|
+
export {
|
|
20
|
+
createMiddleware,
|
|
21
|
+
createDerive,
|
|
22
|
+
createGuard,
|
|
23
|
+
createRateLimit,
|
|
24
|
+
composeMiddleware,
|
|
25
|
+
isDevelopment,
|
|
26
|
+
isProduction,
|
|
27
|
+
isTest
|
|
28
|
+
} from './elysia-helpers'
|
|
29
|
+
|
|
30
|
+
export type {
|
|
31
|
+
MiddlewareOptions
|
|
32
32
|
} from './elysia-helpers'
|
|
@@ -1,181 +1,181 @@
|
|
|
1
|
-
import type { FluxStack, PluginContext, CliCommand, Plugin } from "../../plugins/types"
|
|
2
|
-
|
|
3
|
-
// Database plugin with CLI commands
|
|
4
|
-
export const databasePlugin: Plugin = {
|
|
5
|
-
name: "database",
|
|
6
|
-
description: "Database management plugin with CLI commands",
|
|
7
|
-
author: "FluxStack Team",
|
|
8
|
-
category: "data",
|
|
9
|
-
|
|
10
|
-
setup: (context: PluginContext) => {
|
|
11
|
-
context.logger.info("Database plugin initialized")
|
|
12
|
-
},
|
|
13
|
-
|
|
14
|
-
commands: [
|
|
15
|
-
{
|
|
16
|
-
name: "migrate",
|
|
17
|
-
description: "Run database migrations",
|
|
18
|
-
category: "Database",
|
|
19
|
-
usage: "flux database:migrate [options]",
|
|
20
|
-
examples: [
|
|
21
|
-
"flux database:migrate # Run all pending migrations",
|
|
22
|
-
"flux database:migrate --rollback # Rollback last migration",
|
|
23
|
-
"flux database:migrate --to 001 # Migrate to specific version"
|
|
24
|
-
],
|
|
25
|
-
options: [
|
|
26
|
-
{
|
|
27
|
-
name: "rollback",
|
|
28
|
-
short: "r",
|
|
29
|
-
description: "Rollback the last migration",
|
|
30
|
-
type: "boolean"
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
name: "to",
|
|
34
|
-
description: "Migrate to specific version",
|
|
35
|
-
type: "string"
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
name: "dry-run",
|
|
39
|
-
description: "Show what would be migrated without executing",
|
|
40
|
-
type: "boolean"
|
|
41
|
-
}
|
|
42
|
-
],
|
|
43
|
-
handler: async (args, options, context) => {
|
|
44
|
-
if (options["dry-run"]) {
|
|
45
|
-
console.log("🔍 Dry run mode - showing planned migrations:")
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (options.rollback) {
|
|
49
|
-
console.log("⬇️ Rolling back last migration...")
|
|
50
|
-
// Simulate rollback
|
|
51
|
-
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
52
|
-
console.log("✅ Rollback completed")
|
|
53
|
-
} else if (options.to) {
|
|
54
|
-
console.log(`📈 Migrating to version: ${options.to}`)
|
|
55
|
-
// Simulate migration to version
|
|
56
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
57
|
-
console.log(`✅ Migrated to version ${options.to}`)
|
|
58
|
-
} else {
|
|
59
|
-
console.log("📈 Running all pending migrations...")
|
|
60
|
-
// Simulate migration
|
|
61
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
62
|
-
console.log("✅ All migrations completed")
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
name: "seed",
|
|
68
|
-
description: "Seed the database with initial data",
|
|
69
|
-
category: "Database",
|
|
70
|
-
usage: "flux database:seed [seeder]",
|
|
71
|
-
examples: [
|
|
72
|
-
"flux database:seed # Run all seeders",
|
|
73
|
-
"flux database:seed users # Run specific seeder"
|
|
74
|
-
],
|
|
75
|
-
arguments: [
|
|
76
|
-
{
|
|
77
|
-
name: "seeder",
|
|
78
|
-
description: "Specific seeder to run",
|
|
79
|
-
required: false,
|
|
80
|
-
type: "string"
|
|
81
|
-
}
|
|
82
|
-
],
|
|
83
|
-
options: [
|
|
84
|
-
{
|
|
85
|
-
name: "force",
|
|
86
|
-
short: "f",
|
|
87
|
-
description: "Force seeding even if data exists",
|
|
88
|
-
type: "boolean"
|
|
89
|
-
}
|
|
90
|
-
],
|
|
91
|
-
handler: async (args, options, context) => {
|
|
92
|
-
const [seeder] = args
|
|
93
|
-
|
|
94
|
-
if (seeder) {
|
|
95
|
-
console.log(`🌱 Running seeder: ${seeder}`)
|
|
96
|
-
console.log(` Force mode: ${options.force ? 'ON' : 'OFF'}`)
|
|
97
|
-
} else {
|
|
98
|
-
console.log("🌱 Running all seeders...")
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Simulate seeding
|
|
102
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
103
|
-
console.log("✅ Database seeded successfully")
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
name: "reset",
|
|
108
|
-
description: "Reset the database (drop all tables and recreate)",
|
|
109
|
-
category: "Database",
|
|
110
|
-
usage: "flux database:reset [options]",
|
|
111
|
-
examples: [
|
|
112
|
-
"flux database:reset # Reset and migrate",
|
|
113
|
-
"flux database:reset --seed # Reset, migrate and seed"
|
|
114
|
-
],
|
|
115
|
-
options: [
|
|
116
|
-
{
|
|
117
|
-
name: "seed",
|
|
118
|
-
short: "s",
|
|
119
|
-
description: "Run seeders after reset",
|
|
120
|
-
type: "boolean"
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
name: "confirm",
|
|
124
|
-
description: "Skip confirmation prompt",
|
|
125
|
-
type: "boolean"
|
|
126
|
-
}
|
|
127
|
-
],
|
|
128
|
-
handler: async (args, options, context) => {
|
|
129
|
-
if (!options.confirm) {
|
|
130
|
-
console.log("⚠️ WARNING: This will delete all data in the database!")
|
|
131
|
-
console.log("Use --confirm to skip this prompt.")
|
|
132
|
-
return
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
console.log("🗑️ Dropping all tables...")
|
|
136
|
-
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
137
|
-
|
|
138
|
-
console.log("📈 Running migrations...")
|
|
139
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
140
|
-
|
|
141
|
-
if (options.seed) {
|
|
142
|
-
console.log("🌱 Running seeders...")
|
|
143
|
-
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
console.log("✅ Database reset completed")
|
|
147
|
-
}
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
name: "status",
|
|
151
|
-
description: "Show database migration status",
|
|
152
|
-
category: "Database",
|
|
153
|
-
aliases: ["info"],
|
|
154
|
-
handler: async (args, options, context) => {
|
|
155
|
-
console.log("📊 Database Status:")
|
|
156
|
-
console.log("------------------")
|
|
157
|
-
console.log("Connected: ✅ Yes")
|
|
158
|
-
console.log("Tables: 15")
|
|
159
|
-
console.log("Last migration: 2024_01_15_create_users_table")
|
|
160
|
-
console.log("Pending migrations: 2")
|
|
161
|
-
console.log("Database size: 2.3 MB")
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
]
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Utility functions that could be used by the plugin
|
|
168
|
-
export async function runMigration(version?: string): Promise<void> {
|
|
169
|
-
// Actual migration logic would go here
|
|
170
|
-
console.log(`Running migration ${version || 'all'}`)
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
export async function rollbackMigration(): Promise<void> {
|
|
174
|
-
// Actual rollback logic would go here
|
|
175
|
-
console.log("Rolling back migration")
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
export async function seedDatabase(seeder?: string): Promise<void> {
|
|
179
|
-
// Actual seeding logic would go here
|
|
180
|
-
console.log(`Seeding database ${seeder || 'all'}`)
|
|
1
|
+
import type { FluxStack, PluginContext, CliCommand, Plugin } from "../../plugins/types"
|
|
2
|
+
|
|
3
|
+
// Database plugin with CLI commands
|
|
4
|
+
export const databasePlugin: Plugin = {
|
|
5
|
+
name: "database",
|
|
6
|
+
description: "Database management plugin with CLI commands",
|
|
7
|
+
author: "FluxStack Team",
|
|
8
|
+
category: "data",
|
|
9
|
+
|
|
10
|
+
setup: (context: PluginContext) => {
|
|
11
|
+
context.logger.info("Database plugin initialized")
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
commands: [
|
|
15
|
+
{
|
|
16
|
+
name: "migrate",
|
|
17
|
+
description: "Run database migrations",
|
|
18
|
+
category: "Database",
|
|
19
|
+
usage: "flux database:migrate [options]",
|
|
20
|
+
examples: [
|
|
21
|
+
"flux database:migrate # Run all pending migrations",
|
|
22
|
+
"flux database:migrate --rollback # Rollback last migration",
|
|
23
|
+
"flux database:migrate --to 001 # Migrate to specific version"
|
|
24
|
+
],
|
|
25
|
+
options: [
|
|
26
|
+
{
|
|
27
|
+
name: "rollback",
|
|
28
|
+
short: "r",
|
|
29
|
+
description: "Rollback the last migration",
|
|
30
|
+
type: "boolean"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "to",
|
|
34
|
+
description: "Migrate to specific version",
|
|
35
|
+
type: "string"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "dry-run",
|
|
39
|
+
description: "Show what would be migrated without executing",
|
|
40
|
+
type: "boolean"
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
handler: async (args, options, context) => {
|
|
44
|
+
if (options["dry-run"]) {
|
|
45
|
+
console.log("🔍 Dry run mode - showing planned migrations:")
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (options.rollback) {
|
|
49
|
+
console.log("⬇️ Rolling back last migration...")
|
|
50
|
+
// Simulate rollback
|
|
51
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
52
|
+
console.log("✅ Rollback completed")
|
|
53
|
+
} else if (options.to) {
|
|
54
|
+
console.log(`📈 Migrating to version: ${options.to}`)
|
|
55
|
+
// Simulate migration to version
|
|
56
|
+
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
57
|
+
console.log(`✅ Migrated to version ${options.to}`)
|
|
58
|
+
} else {
|
|
59
|
+
console.log("📈 Running all pending migrations...")
|
|
60
|
+
// Simulate migration
|
|
61
|
+
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
62
|
+
console.log("✅ All migrations completed")
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "seed",
|
|
68
|
+
description: "Seed the database with initial data",
|
|
69
|
+
category: "Database",
|
|
70
|
+
usage: "flux database:seed [seeder]",
|
|
71
|
+
examples: [
|
|
72
|
+
"flux database:seed # Run all seeders",
|
|
73
|
+
"flux database:seed users # Run specific seeder"
|
|
74
|
+
],
|
|
75
|
+
arguments: [
|
|
76
|
+
{
|
|
77
|
+
name: "seeder",
|
|
78
|
+
description: "Specific seeder to run",
|
|
79
|
+
required: false,
|
|
80
|
+
type: "string"
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
options: [
|
|
84
|
+
{
|
|
85
|
+
name: "force",
|
|
86
|
+
short: "f",
|
|
87
|
+
description: "Force seeding even if data exists",
|
|
88
|
+
type: "boolean"
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
handler: async (args, options, context) => {
|
|
92
|
+
const [seeder] = args
|
|
93
|
+
|
|
94
|
+
if (seeder) {
|
|
95
|
+
console.log(`🌱 Running seeder: ${seeder}`)
|
|
96
|
+
console.log(` Force mode: ${options.force ? 'ON' : 'OFF'}`)
|
|
97
|
+
} else {
|
|
98
|
+
console.log("🌱 Running all seeders...")
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Simulate seeding
|
|
102
|
+
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
103
|
+
console.log("✅ Database seeded successfully")
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: "reset",
|
|
108
|
+
description: "Reset the database (drop all tables and recreate)",
|
|
109
|
+
category: "Database",
|
|
110
|
+
usage: "flux database:reset [options]",
|
|
111
|
+
examples: [
|
|
112
|
+
"flux database:reset # Reset and migrate",
|
|
113
|
+
"flux database:reset --seed # Reset, migrate and seed"
|
|
114
|
+
],
|
|
115
|
+
options: [
|
|
116
|
+
{
|
|
117
|
+
name: "seed",
|
|
118
|
+
short: "s",
|
|
119
|
+
description: "Run seeders after reset",
|
|
120
|
+
type: "boolean"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: "confirm",
|
|
124
|
+
description: "Skip confirmation prompt",
|
|
125
|
+
type: "boolean"
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
handler: async (args, options, context) => {
|
|
129
|
+
if (!options.confirm) {
|
|
130
|
+
console.log("⚠️ WARNING: This will delete all data in the database!")
|
|
131
|
+
console.log("Use --confirm to skip this prompt.")
|
|
132
|
+
return
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
console.log("🗑️ Dropping all tables...")
|
|
136
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
137
|
+
|
|
138
|
+
console.log("📈 Running migrations...")
|
|
139
|
+
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
140
|
+
|
|
141
|
+
if (options.seed) {
|
|
142
|
+
console.log("🌱 Running seeders...")
|
|
143
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
console.log("✅ Database reset completed")
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: "status",
|
|
151
|
+
description: "Show database migration status",
|
|
152
|
+
category: "Database",
|
|
153
|
+
aliases: ["info"],
|
|
154
|
+
handler: async (args, options, context) => {
|
|
155
|
+
console.log("📊 Database Status:")
|
|
156
|
+
console.log("------------------")
|
|
157
|
+
console.log("Connected: ✅ Yes")
|
|
158
|
+
console.log("Tables: 15")
|
|
159
|
+
console.log("Last migration: 2024_01_15_create_users_table")
|
|
160
|
+
console.log("Pending migrations: 2")
|
|
161
|
+
console.log("Database size: 2.3 MB")
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Utility functions that could be used by the plugin
|
|
168
|
+
export async function runMigration(version?: string): Promise<void> {
|
|
169
|
+
// Actual migration logic would go here
|
|
170
|
+
console.log(`Running migration ${version || 'all'}`)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export async function rollbackMigration(): Promise<void> {
|
|
174
|
+
// Actual rollback logic would go here
|
|
175
|
+
console.log("Rolling back migration")
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export async function seedDatabase(seeder?: string): Promise<void> {
|
|
179
|
+
// Actual seeding logic would go here
|
|
180
|
+
console.log(`Seeding database ${seeder || 'all'}`)
|
|
181
181
|
}
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
// 🔥 FluxStack Static Files Plugin - Serve Public Files & Uploads
|
|
2
|
-
|
|
3
|
-
import { existsSync, statSync } from 'fs'
|
|
4
|
-
import { mkdir } from 'fs/promises'
|
|
5
|
-
import { resolve } from 'path'
|
|
6
|
-
import type { Plugin, PluginContext } from '../../plugins/types'
|
|
7
|
-
|
|
8
|
-
export const staticFilesPlugin: Plugin = {
|
|
9
|
-
name: 'static-files',
|
|
10
|
-
description: 'Serve static files and uploads',
|
|
11
|
-
author: 'FluxStack Team',
|
|
12
|
-
priority: 'normal',
|
|
13
|
-
category: 'core',
|
|
14
|
-
tags: ['static', 'files', 'uploads'],
|
|
15
|
-
|
|
16
|
-
setup: async (context: PluginContext) => {
|
|
17
|
-
const projectRoot = process.cwd()
|
|
18
|
-
const publicDir = resolve(projectRoot, 'public')
|
|
19
|
-
const uploadsDir = resolve(projectRoot, 'uploads')
|
|
20
|
-
|
|
21
|
-
// Create directories if they don't exist
|
|
22
|
-
await mkdir(publicDir, { recursive: true })
|
|
23
|
-
await mkdir(uploadsDir, { recursive: true })
|
|
24
|
-
await mkdir(resolve(uploadsDir, 'avatars'), { recursive: true })
|
|
25
|
-
|
|
26
|
-
// Helper to serve files from a directory
|
|
27
|
-
const serveFile = (baseDir: string) => ({ params, set }: any) => {
|
|
28
|
-
const requestedPath = params['*'] || ''
|
|
29
|
-
const filePath = resolve(baseDir, requestedPath)
|
|
30
|
-
|
|
31
|
-
// Path traversal protection
|
|
32
|
-
if (!filePath.startsWith(baseDir)) {
|
|
33
|
-
set.status = 400
|
|
34
|
-
return { error: 'Invalid path' }
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Check if file exists
|
|
38
|
-
if (!existsSync(filePath)) {
|
|
39
|
-
set.status = 404
|
|
40
|
-
return { error: 'File not found' }
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Check if it's a file (not directory)
|
|
44
|
-
try {
|
|
45
|
-
if (!statSync(filePath).isFile()) {
|
|
46
|
-
set.status = 404
|
|
47
|
-
return { error: 'Not a file' }
|
|
48
|
-
}
|
|
49
|
-
} catch {
|
|
50
|
-
set.status = 404
|
|
51
|
-
return { error: 'File not found' }
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Set cache header (1 year)
|
|
55
|
-
set.headers['cache-control'] = 'public, max-age=31536000'
|
|
56
|
-
|
|
57
|
-
// Bun.file() handles: content-type, content-length, streaming
|
|
58
|
-
return Bun.file(filePath)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Register routes
|
|
62
|
-
context.app.get('/api/static/*', serveFile(publicDir))
|
|
63
|
-
context.app.get('/api/uploads/*', serveFile(uploadsDir))
|
|
64
|
-
|
|
65
|
-
context.logger.debug('📁 Static files plugin ready', {
|
|
66
|
-
routes: ['/api/static/*', '/api/uploads/*']
|
|
67
|
-
})
|
|
68
|
-
}
|
|
69
|
-
}
|
|
1
|
+
// 🔥 FluxStack Static Files Plugin - Serve Public Files & Uploads
|
|
2
|
+
|
|
3
|
+
import { existsSync, statSync } from 'fs'
|
|
4
|
+
import { mkdir } from 'fs/promises'
|
|
5
|
+
import { resolve } from 'path'
|
|
6
|
+
import type { Plugin, PluginContext } from '../../plugins/types'
|
|
7
|
+
|
|
8
|
+
export const staticFilesPlugin: Plugin = {
|
|
9
|
+
name: 'static-files',
|
|
10
|
+
description: 'Serve static files and uploads',
|
|
11
|
+
author: 'FluxStack Team',
|
|
12
|
+
priority: 'normal',
|
|
13
|
+
category: 'core',
|
|
14
|
+
tags: ['static', 'files', 'uploads'],
|
|
15
|
+
|
|
16
|
+
setup: async (context: PluginContext) => {
|
|
17
|
+
const projectRoot = process.cwd()
|
|
18
|
+
const publicDir = resolve(projectRoot, 'public')
|
|
19
|
+
const uploadsDir = resolve(projectRoot, 'uploads')
|
|
20
|
+
|
|
21
|
+
// Create directories if they don't exist
|
|
22
|
+
await mkdir(publicDir, { recursive: true })
|
|
23
|
+
await mkdir(uploadsDir, { recursive: true })
|
|
24
|
+
await mkdir(resolve(uploadsDir, 'avatars'), { recursive: true })
|
|
25
|
+
|
|
26
|
+
// Helper to serve files from a directory
|
|
27
|
+
const serveFile = (baseDir: string) => ({ params, set }: any) => {
|
|
28
|
+
const requestedPath = params['*'] || ''
|
|
29
|
+
const filePath = resolve(baseDir, requestedPath)
|
|
30
|
+
|
|
31
|
+
// Path traversal protection
|
|
32
|
+
if (!filePath.startsWith(baseDir)) {
|
|
33
|
+
set.status = 400
|
|
34
|
+
return { error: 'Invalid path' }
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Check if file exists
|
|
38
|
+
if (!existsSync(filePath)) {
|
|
39
|
+
set.status = 404
|
|
40
|
+
return { error: 'File not found' }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Check if it's a file (not directory)
|
|
44
|
+
try {
|
|
45
|
+
if (!statSync(filePath).isFile()) {
|
|
46
|
+
set.status = 404
|
|
47
|
+
return { error: 'Not a file' }
|
|
48
|
+
}
|
|
49
|
+
} catch {
|
|
50
|
+
set.status = 404
|
|
51
|
+
return { error: 'File not found' }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Set cache header (1 year)
|
|
55
|
+
set.headers['cache-control'] = 'public, max-age=31536000'
|
|
56
|
+
|
|
57
|
+
// Bun.file() handles: content-type, content-length, streaming
|
|
58
|
+
return Bun.file(filePath)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Register routes
|
|
62
|
+
context.app.get('/api/static/*', serveFile(publicDir))
|
|
63
|
+
context.app.get('/api/uploads/*', serveFile(uploadsDir))
|
|
64
|
+
|
|
65
|
+
context.logger.debug('📁 Static files plugin ready', {
|
|
66
|
+
routes: ['/api/static/*', '/api/uploads/*']
|
|
67
|
+
})
|
|
68
|
+
}
|
|
69
|
+
}
|