create-fluxstack 1.10.1 → 1.12.1

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 +161 -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 +127 -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,204 +1,204 @@
1
- /**
2
- * Enhanced Plugin System
3
- * Comprehensive plugin system with lifecycle hooks, dependency management, and configuration
4
- */
5
-
6
- // Core plugin types and interfaces
7
- export type {
8
- FluxStack,
9
- PluginContext,
10
- PluginHook,
11
- PluginPriority,
12
- PluginManifest,
13
- PluginLoadResult,
14
- PluginRegistryState,
15
- PluginHookResult,
16
- PluginMetrics,
17
- PluginDiscoveryOptions,
18
- PluginInstallOptions,
19
- PluginExecutionContext,
20
- PluginValidationResult,
21
- HookExecutionOptions,
22
- PluginLifecycleEvent,
23
- PluginConfigSchema,
24
- RequestContext,
25
- ResponseContext,
26
- ErrorContext,
27
- BuildContext
28
- } from './types'
29
-
30
- export type Plugin = FluxStack.Plugin
31
-
32
- // Plugin registry
33
- export { PluginRegistry } from './registry'
34
- export type { PluginRegistryConfig } from './registry'
35
-
36
- // Plugin discovery
37
- export { PluginDiscovery, pluginDiscovery } from './discovery'
38
- export type { PluginDiscoveryConfig } from './discovery'
39
-
40
- // Plugin configuration management
41
- export {
42
- DefaultPluginConfigManager,
43
- createPluginUtils
44
- } from './config'
45
- export type { PluginConfigManager } from './config'
46
-
47
- // Plugin manager
48
- export {
49
- PluginManager,
50
- createRequestContext,
51
- createResponseContext,
52
- createErrorContext,
53
- createBuildContext
54
- } from './manager'
55
- export type { PluginManagerConfig } from './manager'
56
-
57
- // Module resolver for plugins
58
- export { PluginModuleResolver } from './module-resolver'
59
- export type { ModuleResolverConfig } from './module-resolver'
60
-
61
- // Plugin executor
62
- export {
63
- PluginExecutor,
64
- calculateExecutionStats
65
- } from './executor'
66
- export type {
67
- PluginExecutionPlan,
68
- PluginExecutionStep,
69
- PluginExecutionStats
70
- } from './executor'
71
-
72
- // Utility functions for plugin development
73
- export const PluginUtils = {
74
- /**
75
- * Create a simple plugin
76
- */
77
- createPlugin: (config: {
78
- name: string
79
- version?: string
80
- description?: string
81
- dependencies?: string[]
82
- priority?: number | PluginPriority
83
- setup?: (context: PluginContext) => void | Promise<void>
84
- onServerStart?: (context: PluginContext) => void | Promise<void>
85
- onServerStop?: (context: PluginContext) => void | Promise<void>
86
- onRequest?: (context: RequestContext) => void | Promise<void>
87
- onBeforeRoute?: (context: RequestContext) => void | Promise<void>
88
- onResponse?: (context: ResponseContext) => void | Promise<void>
89
- onError?: (context: ErrorContext) => void | Promise<void>
90
- configSchema?: any
91
- defaultConfig?: any
92
- }): Plugin => {
93
- const plugin = {
94
- name: config.name,
95
- ...(config.version && { version: config.version }),
96
- ...(config.description && { description: config.description }),
97
- ...(config.dependencies && { dependencies: config.dependencies }),
98
- ...(config.priority !== undefined && { priority: config.priority }),
99
- ...(config.setup && { setup: config.setup }),
100
- ...(config.onServerStart && { onServerStart: config.onServerStart }),
101
- ...(config.onServerStop && { onServerStop: config.onServerStop }),
102
- ...(config.onRequest && { onRequest: config.onRequest }),
103
- ...(config.onBeforeRoute && { onBeforeRoute: config.onBeforeRoute }),
104
- ...(config.onResponse && { onResponse: config.onResponse }),
105
- ...(config.onError && { onError: config.onError }),
106
- ...(config.configSchema && { configSchema: config.configSchema }),
107
- ...(config.defaultConfig && { defaultConfig: config.defaultConfig })
108
- } as Plugin
109
- return plugin
110
- },
111
-
112
- /**
113
- * Create a plugin manifest
114
- */
115
- createManifest: (config: {
116
- name: string
117
- version: string
118
- description: string
119
- author: string
120
- license: string
121
- homepage?: string
122
- repository?: string
123
- keywords?: string[]
124
- dependencies?: Record<string, string>
125
- peerDependencies?: Record<string, string>
126
- fluxstack: {
127
- version: string
128
- hooks: PluginHook[]
129
- config?: any
130
- category?: string
131
- tags?: string[]
132
- }
133
- }): any => {
134
- return {
135
- name: config.name,
136
- version: config.version || '1.0.0',
137
- description: config.description,
138
- author: config.author,
139
- license: config.license,
140
- homepage: config.homepage,
141
- repository: config.repository,
142
- keywords: config.keywords || [],
143
- dependencies: config.dependencies || {},
144
- peerDependencies: config.peerDependencies,
145
- fluxstack: config.fluxstack
146
- }
147
- },
148
-
149
- /**
150
- * Validate plugin structure
151
- */
152
- validatePlugin: (plugin: any): plugin is Plugin => {
153
- return (
154
- plugin &&
155
- typeof plugin === 'object' &&
156
- typeof plugin.name === 'string' &&
157
- plugin.name.length > 0
158
- )
159
- },
160
-
161
- /**
162
- * Check if plugin implements hook
163
- */
164
- implementsHook: (plugin: Plugin, hook: PluginHook): boolean => {
165
- const hookFunction = (plugin as any)[hook]
166
- return hookFunction && typeof hookFunction === 'function'
167
- },
168
-
169
- /**
170
- * Get plugin hooks
171
- */
172
- getPluginHooks: (plugin: Plugin): PluginHook[] => {
173
- const hooks: PluginHook[] = []
174
- const possibleHooks: PluginHook[] = [
175
- 'setup',
176
- 'onServerStart',
177
- 'onServerStop',
178
- 'onRequest',
179
- 'onResponse',
180
- 'onError',
181
- 'onBuild',
182
- 'onBuildComplete'
183
- ]
184
-
185
- for (const hook of possibleHooks) {
186
- if (PluginUtils.implementsHook(plugin, hook)) {
187
- hooks.push(hook)
188
- }
189
- }
190
-
191
- return hooks
192
- }
193
- }
194
-
195
- // Re-export types for convenience
196
- import type {
197
- PluginContext,
198
- PluginHook,
199
- PluginPriority,
200
- RequestContext,
201
- ResponseContext,
202
- ErrorContext,
203
- FluxStack
1
+ /**
2
+ * Enhanced Plugin System
3
+ * Comprehensive plugin system with lifecycle hooks, dependency management, and configuration
4
+ */
5
+
6
+ // Core plugin types and interfaces
7
+ export type {
8
+ FluxStack,
9
+ PluginContext,
10
+ PluginHook,
11
+ PluginPriority,
12
+ PluginManifest,
13
+ PluginLoadResult,
14
+ PluginRegistryState,
15
+ PluginHookResult,
16
+ PluginMetrics,
17
+ PluginDiscoveryOptions,
18
+ PluginInstallOptions,
19
+ PluginExecutionContext,
20
+ PluginValidationResult,
21
+ HookExecutionOptions,
22
+ PluginLifecycleEvent,
23
+ PluginConfigSchema,
24
+ RequestContext,
25
+ ResponseContext,
26
+ ErrorContext,
27
+ BuildContext
28
+ } from './types'
29
+
30
+ export type Plugin = FluxStack.Plugin
31
+
32
+ // Plugin registry
33
+ export { PluginRegistry } from './registry'
34
+ export type { PluginRegistryConfig } from './registry'
35
+
36
+ // Plugin discovery
37
+ export { PluginDiscovery, pluginDiscovery } from './discovery'
38
+ export type { PluginDiscoveryConfig } from './discovery'
39
+
40
+ // Plugin configuration management
41
+ export {
42
+ DefaultPluginConfigManager,
43
+ createPluginUtils
44
+ } from './config'
45
+ export type { PluginConfigManager } from './config'
46
+
47
+ // Plugin manager
48
+ export {
49
+ PluginManager,
50
+ createRequestContext,
51
+ createResponseContext,
52
+ createErrorContext,
53
+ createBuildContext
54
+ } from './manager'
55
+ export type { PluginManagerConfig } from './manager'
56
+
57
+ // Module resolver for plugins
58
+ export { PluginModuleResolver } from './module-resolver'
59
+ export type { ModuleResolverConfig } from './module-resolver'
60
+
61
+ // Plugin executor
62
+ export {
63
+ PluginExecutor,
64
+ calculateExecutionStats
65
+ } from './executor'
66
+ export type {
67
+ PluginExecutionPlan,
68
+ PluginExecutionStep,
69
+ PluginExecutionStats
70
+ } from './executor'
71
+
72
+ // Utility functions for plugin development
73
+ export const PluginUtils = {
74
+ /**
75
+ * Create a simple plugin
76
+ */
77
+ createPlugin: (config: {
78
+ name: string
79
+ version?: string
80
+ description?: string
81
+ dependencies?: string[]
82
+ priority?: number | PluginPriority
83
+ setup?: (context: PluginContext) => void | Promise<void>
84
+ onServerStart?: (context: PluginContext) => void | Promise<void>
85
+ onServerStop?: (context: PluginContext) => void | Promise<void>
86
+ onRequest?: (context: RequestContext) => void | Promise<void>
87
+ onBeforeRoute?: (context: RequestContext) => void | Promise<void>
88
+ onResponse?: (context: ResponseContext) => void | Promise<void>
89
+ onError?: (context: ErrorContext) => void | Promise<void>
90
+ configSchema?: any
91
+ defaultConfig?: any
92
+ }): Plugin => {
93
+ const plugin = {
94
+ name: config.name,
95
+ ...(config.version && { version: config.version }),
96
+ ...(config.description && { description: config.description }),
97
+ ...(config.dependencies && { dependencies: config.dependencies }),
98
+ ...(config.priority !== undefined && { priority: config.priority }),
99
+ ...(config.setup && { setup: config.setup }),
100
+ ...(config.onServerStart && { onServerStart: config.onServerStart }),
101
+ ...(config.onServerStop && { onServerStop: config.onServerStop }),
102
+ ...(config.onRequest && { onRequest: config.onRequest }),
103
+ ...(config.onBeforeRoute && { onBeforeRoute: config.onBeforeRoute }),
104
+ ...(config.onResponse && { onResponse: config.onResponse }),
105
+ ...(config.onError && { onError: config.onError }),
106
+ ...(config.configSchema && { configSchema: config.configSchema }),
107
+ ...(config.defaultConfig && { defaultConfig: config.defaultConfig })
108
+ } as Plugin
109
+ return plugin
110
+ },
111
+
112
+ /**
113
+ * Create a plugin manifest
114
+ */
115
+ createManifest: (config: {
116
+ name: string
117
+ version: string
118
+ description: string
119
+ author: string
120
+ license: string
121
+ homepage?: string
122
+ repository?: string
123
+ keywords?: string[]
124
+ dependencies?: Record<string, string>
125
+ peerDependencies?: Record<string, string>
126
+ fluxstack: {
127
+ version: string
128
+ hooks: PluginHook[]
129
+ config?: any
130
+ category?: string
131
+ tags?: string[]
132
+ }
133
+ }): any => {
134
+ return {
135
+ name: config.name,
136
+ version: config.version || '1.0.0',
137
+ description: config.description,
138
+ author: config.author,
139
+ license: config.license,
140
+ homepage: config.homepage,
141
+ repository: config.repository,
142
+ keywords: config.keywords || [],
143
+ dependencies: config.dependencies || {},
144
+ peerDependencies: config.peerDependencies,
145
+ fluxstack: config.fluxstack
146
+ }
147
+ },
148
+
149
+ /**
150
+ * Validate plugin structure
151
+ */
152
+ validatePlugin: (plugin: any): plugin is Plugin => {
153
+ return (
154
+ plugin &&
155
+ typeof plugin === 'object' &&
156
+ typeof plugin.name === 'string' &&
157
+ plugin.name.length > 0
158
+ )
159
+ },
160
+
161
+ /**
162
+ * Check if plugin implements hook
163
+ */
164
+ implementsHook: (plugin: Plugin, hook: PluginHook): boolean => {
165
+ const hookFunction = (plugin as any)[hook]
166
+ return hookFunction && typeof hookFunction === 'function'
167
+ },
168
+
169
+ /**
170
+ * Get plugin hooks
171
+ */
172
+ getPluginHooks: (plugin: Plugin): PluginHook[] => {
173
+ const hooks: PluginHook[] = []
174
+ const possibleHooks: PluginHook[] = [
175
+ 'setup',
176
+ 'onServerStart',
177
+ 'onServerStop',
178
+ 'onRequest',
179
+ 'onResponse',
180
+ 'onError',
181
+ 'onBuild',
182
+ 'onBuildComplete'
183
+ ]
184
+
185
+ for (const hook of possibleHooks) {
186
+ if (PluginUtils.implementsHook(plugin, hook)) {
187
+ hooks.push(hook)
188
+ }
189
+ }
190
+
191
+ return hooks
192
+ }
193
+ }
194
+
195
+ // Re-export types for convenience
196
+ import type {
197
+ PluginContext,
198
+ PluginHook,
199
+ PluginPriority,
200
+ RequestContext,
201
+ ResponseContext,
202
+ ErrorContext,
203
+ FluxStack
204
204
  } from './types'
@@ -18,11 +18,11 @@ import type {
18
18
  } from "./types"
19
19
 
20
20
  type Plugin = FluxStack.Plugin
21
- import type { FluxStackConfig } from "@/core/config/schema"
22
- import type { Logger } from "@/core/utils/logger"
21
+ import type { FluxStackConfig } from "@config"
22
+ import type { Logger } from "@core/utils/logger"
23
23
  import { PluginRegistry } from "./registry"
24
24
  import { createPluginUtils } from "./config"
25
- import { FluxStackError } from "@/core/utils/errors"
25
+ import { FluxStackError } from "@core/utils/errors"
26
26
  import { EventEmitter } from "events"
27
27
 
28
28
  /**
@@ -402,20 +402,20 @@ export class PluginManager extends EventEmitter {
402
402
  */
403
403
  private getEnabledPlugins(): Plugin[] {
404
404
  const allPlugins = this.registry.getAll()
405
- const enabledNames = this.config.plugins.enabled
406
- const disabledNames = this.config.plugins.disabled
405
+ const enabledNames = this.config.plugins.enabled ?? []
406
+ const disabledNames = this.config.plugins.disabled ?? []
407
407
 
408
408
  return allPlugins.filter(plugin => {
409
409
  // If explicitly disabled, exclude
410
410
  if (disabledNames.includes(plugin.name)) {
411
411
  return false
412
412
  }
413
-
413
+
414
414
  // If enabled list is empty, include all non-disabled
415
415
  if (enabledNames.length === 0) {
416
416
  return true
417
417
  }
418
-
418
+
419
419
  // Otherwise, only include if explicitly enabled
420
420
  return enabledNames.includes(plugin.name)
421
421
  })
@@ -426,42 +426,30 @@ export class PluginManager extends EventEmitter {
426
426
  */
427
427
  private async discoverPlugins(): Promise<void> {
428
428
  try {
429
- // Load built-in plugins first (handled by core system)
430
- this.logger.debug('Loading built-in plugins...')
431
- const builtInResults = await this.registry.discoverPlugins({
432
- directories: [],
433
- includeBuiltIn: true,
434
- includeExternal: false
429
+ // ⚠️ Built-in plugins are now registered manually via .use()
430
+ // No auto-discovery for core/plugins/built-in - developer chooses which to use
431
+
432
+ const results: any[] = []
433
+
434
+ // 1. Discover project plugins (plugins/ directory)
435
+ this.logger.debug('Discovering project plugins in directory: plugins')
436
+ const projectResults = await this.registry.discoverPlugins({
437
+ directories: ['plugins'],
438
+ includeBuiltIn: false,
439
+ includeExternal: true
435
440
  })
441
+ results.push(...projectResults)
436
442
 
437
- // Try to use auto-generated registry for external plugins (if available from build)
438
- let externalResults: any[] = []
439
- try {
440
- // @ts-expect-error - auto-registry is generated during build, may not exist in dev
441
- const autoRegistryModule = await import('./auto-registry')
442
- if (autoRegistryModule.discoveredPlugins && autoRegistryModule.registerDiscoveredPlugins) {
443
- this.logger.debug('🚀 Using auto-generated external plugins registry')
444
- await autoRegistryModule.registerDiscoveredPlugins(this.registry)
445
- externalResults = autoRegistryModule.discoveredPlugins.map((plugin: any) => ({
446
- success: true,
447
- plugin
448
- }))
449
- }
450
- } catch (error) {
451
- this.logger.debug('Auto-generated external plugins registry not found, falling back to discovery', { error: (error as Error).message })
452
-
453
- // Fallback to runtime discovery for external plugins
454
- this.logger.debug('Discovering external plugins in directory: plugins')
455
- externalResults = await this.registry.discoverPlugins({
456
- directories: ['plugins'],
457
- includeBuiltIn: false,
458
- includeExternal: true
459
- })
443
+ // 2. Discover npm plugins (node_modules/)
444
+ if (this.config.plugins.discoverNpmPlugins) {
445
+ this.logger.debug('Discovering npm plugins in node_modules...')
446
+ const npmResults = await this.registry.discoverNpmPlugins()
447
+ results.push(...npmResults)
448
+ } else {
449
+ this.logger.debug('🔒 NPM plugin discovery disabled for security (PLUGINS_DISCOVER_NPM=false)')
450
+ this.logger.debug(' To enable: Set PLUGINS_DISCOVER_NPM=true and add plugins to PLUGINS_ALLOWED')
460
451
  }
461
452
 
462
- // Combine results
463
- const results = [...builtInResults, ...externalResults]
464
-
465
453
  let loaded = 0
466
454
  let failed = 0
467
455
 
@@ -3,9 +3,9 @@
3
3
  * Implementa resolução em cascata: plugin local → projeto principal
4
4
  */
5
5
 
6
- import { existsSync } from 'fs'
6
+ import { existsSync, readFileSync } from 'fs'
7
7
  import { join, resolve } from 'path'
8
- import type { Logger } from '@/core/utils/logger'
8
+ import type { Logger } from '@core/utils/logger'
9
9
 
10
10
  export interface ModuleResolverConfig {
11
11
  projectRoot: string
@@ -15,6 +15,7 @@ export interface ModuleResolverConfig {
15
15
  export class PluginModuleResolver {
16
16
  private config: ModuleResolverConfig
17
17
  private logger?: Logger
18
+ private static readonly MAX_CACHE_SIZE = 1000
18
19
  private resolveCache: Map<string, string> = new Map()
19
20
 
20
21
  constructor(config: ModuleResolverConfig) {
@@ -22,6 +23,16 @@ export class PluginModuleResolver {
22
23
  this.logger = config.logger
23
24
  }
24
25
 
26
+ private cacheSet(key: string, value: string): void {
27
+ if (this.resolveCache.size >= PluginModuleResolver.MAX_CACHE_SIZE) {
28
+ const firstKey = this.resolveCache.keys().next().value
29
+ if (firstKey !== undefined) {
30
+ this.resolveCache.delete(firstKey)
31
+ }
32
+ }
33
+ this.cacheSet(key, value)
34
+ }
35
+
25
36
  /**
26
37
  * Resolve um módulo com estratégia em cascata:
27
38
  * 1. node_modules local do plugin
@@ -41,7 +52,7 @@ export class PluginModuleResolver {
41
52
  const localPath = this.tryResolveLocal(moduleName, pluginPath)
42
53
  if (localPath) {
43
54
  this.logger?.debug(`✅ Módulo '${moduleName}' encontrado localmente: ${localPath}`)
44
- this.resolveCache.set(cacheKey, localPath)
55
+ this.cacheSet(cacheKey, localPath)
45
56
  return localPath
46
57
  }
47
58
 
@@ -49,7 +60,7 @@ export class PluginModuleResolver {
49
60
  const projectPath = this.tryResolveProject(moduleName)
50
61
  if (projectPath) {
51
62
  this.logger?.debug(`✅ Módulo '${moduleName}' encontrado no projeto: ${projectPath}`)
52
- this.resolveCache.set(cacheKey, projectPath)
63
+ this.cacheSet(cacheKey, projectPath)
53
64
  return projectPath
54
65
  }
55
66
 
@@ -69,7 +80,7 @@ export class PluginModuleResolver {
69
80
  const packageJsonPath = join(localNodeModules, 'package.json')
70
81
  if (existsSync(packageJsonPath)) {
71
82
  try {
72
- const pkg = require(packageJsonPath)
83
+ const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))
73
84
  const entry = pkg.module || pkg.main || 'index.js'
74
85
  const entryPath = join(localNodeModules, entry)
75
86
 
@@ -105,7 +116,7 @@ export class PluginModuleResolver {
105
116
  const packageJsonPath = join(projectNodeModules, 'package.json')
106
117
  if (existsSync(packageJsonPath)) {
107
118
  try {
108
- const pkg = require(packageJsonPath)
119
+ const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))
109
120
  const entry = pkg.module || pkg.main || 'index.js'
110
121
  const entryPath = join(projectNodeModules, entry)
111
122
 
@@ -152,7 +163,7 @@ export class PluginModuleResolver {
152
163
  const resolvedLocal = this.findFileWithExtension(localPath)
153
164
  if (resolvedLocal) {
154
165
  this.logger?.debug(`✅ Subpath '${fullModule}' encontrado localmente: ${resolvedLocal}`)
155
- this.resolveCache.set(cacheKey, resolvedLocal)
166
+ this.cacheSet(cacheKey, resolvedLocal)
156
167
  return resolvedLocal
157
168
  }
158
169
  }
@@ -164,7 +175,7 @@ export class PluginModuleResolver {
164
175
  const resolvedProject = this.findFileWithExtension(projectPath)
165
176
  if (resolvedProject) {
166
177
  this.logger?.debug(`✅ Subpath '${fullModule}' encontrado no projeto: ${resolvedProject}`)
167
- this.resolveCache.set(cacheKey, resolvedProject)
178
+ this.cacheSet(cacheKey, resolvedProject)
168
179
  return resolvedProject
169
180
  }
170
181
  }