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.
Files changed (257) hide show
  1. package/.dockerignore +1 -2
  2. package/Dockerfile +8 -8
  3. package/LLMD/INDEX.md +64 -0
  4. package/LLMD/MAINTENANCE.md +197 -0
  5. package/LLMD/MIGRATION.md +156 -0
  6. package/LLMD/config/.gitkeep +1 -0
  7. package/LLMD/config/declarative-system.md +268 -0
  8. package/LLMD/config/environment-vars.md +327 -0
  9. package/LLMD/config/runtime-reload.md +401 -0
  10. package/LLMD/core/.gitkeep +1 -0
  11. package/LLMD/core/build-system.md +599 -0
  12. package/LLMD/core/framework-lifecycle.md +229 -0
  13. package/LLMD/core/plugin-system.md +451 -0
  14. package/LLMD/patterns/.gitkeep +1 -0
  15. package/LLMD/patterns/anti-patterns.md +297 -0
  16. package/LLMD/patterns/project-structure.md +264 -0
  17. package/LLMD/patterns/type-safety.md +440 -0
  18. package/LLMD/reference/.gitkeep +1 -0
  19. package/LLMD/reference/cli-commands.md +250 -0
  20. package/LLMD/reference/plugin-hooks.md +357 -0
  21. package/LLMD/reference/routing.md +39 -0
  22. package/LLMD/reference/troubleshooting.md +364 -0
  23. package/LLMD/resources/.gitkeep +1 -0
  24. package/LLMD/resources/controllers.md +465 -0
  25. package/LLMD/resources/live-components.md +703 -0
  26. package/LLMD/resources/live-rooms.md +482 -0
  27. package/LLMD/resources/live-upload.md +130 -0
  28. package/LLMD/resources/plugins-external.md +617 -0
  29. package/LLMD/resources/routes-eden.md +254 -0
  30. package/README.md +37 -17
  31. package/app/client/index.html +0 -1
  32. package/app/client/src/App.tsx +107 -150
  33. package/app/client/src/components/AppLayout.tsx +68 -0
  34. package/app/client/src/components/BackButton.tsx +13 -0
  35. package/app/client/src/components/DemoPage.tsx +20 -0
  36. package/app/client/src/components/LiveUploadWidget.tsx +204 -0
  37. package/app/client/src/lib/eden-api.ts +85 -60
  38. package/app/client/src/live/ChatDemo.tsx +107 -0
  39. package/app/client/src/live/CounterDemo.tsx +206 -0
  40. package/app/client/src/live/FormDemo.tsx +119 -0
  41. package/app/client/src/live/RoomChatDemo.tsx +242 -0
  42. package/app/client/src/live/UploadDemo.tsx +21 -0
  43. package/app/client/src/main.tsx +4 -1
  44. package/app/client/src/pages/ApiTestPage.tsx +108 -0
  45. package/app/client/src/pages/HomePage.tsx +76 -0
  46. package/app/server/app.ts +1 -4
  47. package/app/server/controllers/users.controller.ts +36 -44
  48. package/app/server/index.ts +25 -35
  49. package/app/server/live/LiveChat.ts +77 -0
  50. package/app/server/live/LiveCounter.ts +67 -0
  51. package/app/server/live/LiveForm.ts +63 -0
  52. package/app/server/live/LiveLocalCounter.ts +32 -0
  53. package/app/server/live/LiveRoomChat.ts +285 -0
  54. package/app/server/live/LiveUpload.ts +81 -0
  55. package/app/server/routes/index.ts +3 -1
  56. package/app/server/routes/room.routes.ts +117 -0
  57. package/app/server/routes/users.routes.ts +35 -27
  58. package/app/shared/types/index.ts +14 -2
  59. package/config/app.config.ts +2 -62
  60. package/config/client.config.ts +2 -95
  61. package/config/database.config.ts +2 -99
  62. package/config/fluxstack.config.ts +25 -45
  63. package/config/index.ts +57 -38
  64. package/config/monitoring.config.ts +2 -114
  65. package/config/plugins.config.ts +2 -80
  66. package/config/server.config.ts +2 -68
  67. package/config/services.config.ts +2 -130
  68. package/config/system/app.config.ts +29 -0
  69. package/config/system/build.config.ts +49 -0
  70. package/config/system/client.config.ts +68 -0
  71. package/config/system/database.config.ts +17 -0
  72. package/config/system/fluxstack.config.ts +114 -0
  73. package/config/{logger.config.ts → system/logger.config.ts} +3 -1
  74. package/config/system/monitoring.config.ts +114 -0
  75. package/config/system/plugins.config.ts +84 -0
  76. package/config/{runtime.config.ts → system/runtime.config.ts} +1 -1
  77. package/config/system/server.config.ts +68 -0
  78. package/config/system/services.config.ts +46 -0
  79. package/config/{system.config.ts → system/system.config.ts} +1 -1
  80. package/core/build/flux-plugins-generator.ts +325 -325
  81. package/core/build/index.ts +39 -27
  82. package/core/build/live-components-generator.ts +3 -3
  83. package/core/build/optimizer.ts +235 -235
  84. package/core/cli/command-registry.ts +6 -4
  85. package/core/cli/commands/build.ts +79 -0
  86. package/core/cli/commands/create.ts +54 -0
  87. package/core/cli/commands/dev.ts +101 -0
  88. package/core/cli/commands/help.ts +34 -0
  89. package/core/cli/commands/index.ts +34 -0
  90. package/core/cli/commands/make-plugin.ts +90 -0
  91. package/core/cli/commands/plugin-add.ts +197 -0
  92. package/core/cli/commands/plugin-deps.ts +2 -2
  93. package/core/cli/commands/plugin-list.ts +208 -0
  94. package/core/cli/commands/plugin-remove.ts +170 -0
  95. package/core/cli/generators/component.ts +769 -769
  96. package/core/cli/generators/controller.ts +1 -1
  97. package/core/cli/generators/index.ts +146 -146
  98. package/core/cli/generators/interactive.ts +227 -227
  99. package/core/cli/generators/plugin.ts +2 -2
  100. package/core/cli/generators/prompts.ts +82 -82
  101. package/core/cli/generators/route.ts +6 -6
  102. package/core/cli/generators/service.ts +2 -2
  103. package/core/cli/generators/template-engine.ts +4 -3
  104. package/core/cli/generators/types.ts +2 -2
  105. package/core/cli/generators/utils.ts +191 -191
  106. package/core/cli/index.ts +115 -686
  107. package/core/cli/plugin-discovery.ts +2 -2
  108. package/core/client/LiveComponentsProvider.tsx +60 -8
  109. package/core/client/api/eden.ts +183 -0
  110. package/core/client/api/index.ts +11 -0
  111. package/core/client/components/Live.tsx +104 -0
  112. package/core/client/fluxstack.ts +1 -9
  113. package/core/client/hooks/AdaptiveChunkSizer.ts +215 -215
  114. package/core/client/hooks/state-validator.ts +1 -1
  115. package/core/client/hooks/useAuth.ts +48 -48
  116. package/core/client/hooks/useChunkedUpload.ts +85 -35
  117. package/core/client/hooks/useLiveChunkedUpload.ts +87 -0
  118. package/core/client/hooks/useLiveComponent.ts +800 -0
  119. package/core/client/hooks/useLiveUpload.ts +71 -0
  120. package/core/client/hooks/useRoom.ts +409 -0
  121. package/core/client/hooks/useRoomProxy.ts +382 -0
  122. package/core/client/index.ts +17 -68
  123. package/core/client/standalone-entry.ts +8 -0
  124. package/core/client/standalone.ts +74 -53
  125. package/core/client/state/createStore.ts +192 -192
  126. package/core/client/state/index.ts +14 -14
  127. package/core/config/index.ts +70 -291
  128. package/core/config/schema.ts +42 -723
  129. package/core/framework/client.ts +131 -131
  130. package/core/framework/index.ts +7 -7
  131. package/core/framework/server.ts +47 -40
  132. package/core/framework/types.ts +2 -2
  133. package/core/index.ts +23 -4
  134. package/core/live/ComponentRegistry.ts +3 -3
  135. package/core/live/types.ts +77 -0
  136. package/core/plugins/built-in/index.ts +134 -134
  137. package/core/plugins/built-in/live-components/commands/create-live-component.ts +242 -1066
  138. package/core/plugins/built-in/live-components/index.ts +1 -1
  139. package/core/plugins/built-in/monitoring/index.ts +111 -47
  140. package/core/plugins/built-in/static/index.ts +1 -1
  141. package/core/plugins/built-in/swagger/index.ts +68 -265
  142. package/core/plugins/built-in/vite/index.ts +85 -185
  143. package/core/plugins/built-in/vite/vite-dev.ts +10 -16
  144. package/core/plugins/config.ts +9 -7
  145. package/core/plugins/dependency-manager.ts +31 -1
  146. package/core/plugins/discovery.ts +19 -7
  147. package/core/plugins/executor.ts +2 -2
  148. package/core/plugins/index.ts +203 -203
  149. package/core/plugins/manager.ts +27 -39
  150. package/core/plugins/module-resolver.ts +19 -8
  151. package/core/plugins/registry.ts +255 -19
  152. package/core/plugins/types.ts +20 -53
  153. package/core/server/framework.ts +66 -43
  154. package/core/server/index.ts +15 -15
  155. package/core/server/live/ComponentRegistry.ts +78 -71
  156. package/core/server/live/FileUploadManager.ts +23 -10
  157. package/core/server/live/LiveComponentPerformanceMonitor.ts +1 -1
  158. package/core/server/live/LiveRoomManager.ts +261 -0
  159. package/core/server/live/RoomEventBus.ts +234 -0
  160. package/core/server/live/RoomStateManager.ts +172 -0
  161. package/core/server/live/StateSignature.ts +643 -643
  162. package/core/server/live/WebSocketConnectionManager.ts +30 -19
  163. package/core/server/live/auto-generated-components.ts +21 -9
  164. package/core/server/live/index.ts +14 -0
  165. package/core/server/live/websocket-plugin.ts +214 -67
  166. package/core/server/middleware/elysia-helpers.ts +7 -2
  167. package/core/server/middleware/errorHandling.ts +1 -1
  168. package/core/server/middleware/index.ts +31 -31
  169. package/core/server/plugins/database.ts +180 -180
  170. package/core/server/plugins/static-files-plugin.ts +69 -69
  171. package/core/server/plugins/swagger.ts +1 -1
  172. package/core/server/rooms/RoomBroadcaster.ts +357 -0
  173. package/core/server/rooms/RoomSystem.ts +463 -0
  174. package/core/server/rooms/index.ts +13 -0
  175. package/core/server/services/BaseService.ts +1 -1
  176. package/core/server/services/ServiceContainer.ts +1 -1
  177. package/core/server/services/index.ts +8 -8
  178. package/core/templates/create-project.ts +12 -12
  179. package/core/testing/index.ts +9 -9
  180. package/core/testing/setup.ts +73 -73
  181. package/core/types/api.ts +168 -168
  182. package/core/types/build.ts +219 -219
  183. package/core/types/config.ts +56 -26
  184. package/core/types/index.ts +4 -4
  185. package/core/types/plugin.ts +107 -107
  186. package/core/types/types.ts +353 -14
  187. package/core/utils/build-logger.ts +324 -324
  188. package/core/utils/config-schema.ts +480 -480
  189. package/core/utils/env.ts +2 -8
  190. package/core/utils/errors/codes.ts +114 -114
  191. package/core/utils/errors/handlers.ts +36 -1
  192. package/core/utils/errors/index.ts +49 -5
  193. package/core/utils/errors/middleware.ts +113 -113
  194. package/core/utils/helpers.ts +6 -16
  195. package/core/utils/index.ts +17 -17
  196. package/core/utils/logger/colors.ts +114 -114
  197. package/core/utils/logger/config.ts +13 -9
  198. package/core/utils/logger/formatter.ts +82 -82
  199. package/core/utils/logger/group-logger.ts +101 -101
  200. package/core/utils/logger/index.ts +6 -1
  201. package/core/utils/logger/stack-trace.ts +3 -1
  202. package/core/utils/logger/startup-banner.ts +82 -82
  203. package/core/utils/logger/winston-logger.ts +152 -152
  204. package/core/utils/monitoring/index.ts +211 -211
  205. package/core/utils/sync-version.ts +66 -66
  206. package/core/utils/version.ts +1 -1
  207. package/create-fluxstack.ts +8 -7
  208. package/package.json +12 -13
  209. package/plugins/crypto-auth/cli/make-protected-route.command.ts +1 -1
  210. package/plugins/crypto-auth/client/CryptoAuthClient.ts +302 -302
  211. package/plugins/crypto-auth/client/components/index.ts +11 -11
  212. package/plugins/crypto-auth/client/index.ts +11 -11
  213. package/plugins/crypto-auth/config/index.ts +1 -1
  214. package/plugins/crypto-auth/index.ts +4 -4
  215. package/plugins/crypto-auth/package.json +65 -65
  216. package/plugins/crypto-auth/server/AuthMiddleware.ts +1 -1
  217. package/plugins/crypto-auth/server/CryptoAuthService.ts +185 -185
  218. package/plugins/crypto-auth/server/index.ts +21 -21
  219. package/plugins/crypto-auth/server/middlewares/cryptoAuthAdmin.ts +3 -3
  220. package/plugins/crypto-auth/server/middlewares/cryptoAuthOptional.ts +1 -1
  221. package/plugins/crypto-auth/server/middlewares/cryptoAuthPermissions.ts +2 -2
  222. package/plugins/crypto-auth/server/middlewares/cryptoAuthRequired.ts +2 -2
  223. package/plugins/crypto-auth/server/middlewares/helpers.ts +1 -1
  224. package/plugins/crypto-auth/server/middlewares/index.ts +22 -22
  225. package/tsconfig.api-strict.json +16 -0
  226. package/tsconfig.json +48 -52
  227. package/{app/client/tsconfig.node.json → tsconfig.node.json} +25 -25
  228. package/types/global.d.ts +29 -29
  229. package/types/vitest.d.ts +8 -8
  230. package/vite.config.ts +38 -62
  231. package/vitest.config.live.ts +10 -9
  232. package/vitest.config.ts +29 -17
  233. package/app/client/README.md +0 -69
  234. package/app/client/SIMPLIFICATION.md +0 -140
  235. package/app/client/frontend-only.ts +0 -12
  236. package/app/client/src/live/FileUploadExample.tsx +0 -359
  237. package/app/client/src/live/MinimalLiveClock.tsx +0 -47
  238. package/app/client/src/live/QuickUploadTest.tsx +0 -193
  239. package/app/client/tsconfig.app.json +0 -45
  240. package/app/client/tsconfig.json +0 -7
  241. package/app/client/zustand-setup.md +0 -65
  242. package/app/server/backend-only.ts +0 -18
  243. package/app/server/live/LiveClockComponent.ts +0 -215
  244. package/app/server/live/LiveFileUploadComponent.ts +0 -77
  245. package/app/server/routes/env-test.ts +0 -110
  246. package/core/client/hooks/index.ts +0 -7
  247. package/core/client/hooks/useHybridLiveComponent.ts +0 -685
  248. package/core/client/hooks/useTypedLiveComponent.ts +0 -133
  249. package/core/client/hooks/useWebSocket.ts +0 -361
  250. package/core/config/env.ts +0 -546
  251. package/core/config/loader.ts +0 -522
  252. package/core/config/runtime-config.ts +0 -327
  253. package/core/config/validator.ts +0 -540
  254. package/core/server/backend-entry.ts +0 -51
  255. package/core/server/standalone.ts +0 -106
  256. package/core/utils/regenerate-files.ts +0 -69
  257. 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
+ }
@@ -1,5 +1,5 @@
1
1
  import { swagger } from '@elysiajs/swagger'
2
- import type { Plugin, PluginContext } from '@/core/plugins/types'
2
+ import type { Plugin, PluginContext } from '@core/plugins/types'
3
3
 
4
4
  export const swaggerPlugin: Plugin = {
5
5
  name: 'swagger',