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.
- 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 +161 -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 +127 -0
- package/app/server/live/LiveUpload.ts +81 -0
- package/app/server/routes/index.ts +3 -1
- package/app/server/routes/room.routes.ts +117 -0
- package/app/server/routes/users.routes.ts +35 -27
- package/app/shared/types/index.ts +14 -2
- package/config/app.config.ts +2 -62
- package/config/client.config.ts +2 -95
- package/config/database.config.ts +2 -99
- package/config/fluxstack.config.ts +25 -45
- package/config/index.ts +57 -38
- package/config/monitoring.config.ts +2 -114
- package/config/plugins.config.ts +2 -80
- package/config/server.config.ts +2 -68
- package/config/services.config.ts +2 -130
- package/config/system/app.config.ts +29 -0
- package/config/system/build.config.ts +49 -0
- package/config/system/client.config.ts +68 -0
- package/config/system/database.config.ts +17 -0
- package/config/system/fluxstack.config.ts +114 -0
- package/config/{logger.config.ts → system/logger.config.ts} +3 -1
- package/config/system/monitoring.config.ts +114 -0
- package/config/system/plugins.config.ts +84 -0
- package/config/{runtime.config.ts → system/runtime.config.ts} +1 -1
- package/config/system/server.config.ts +68 -0
- package/config/system/services.config.ts +46 -0
- package/config/{system.config.ts → system/system.config.ts} +1 -1
- package/core/build/flux-plugins-generator.ts +325 -325
- package/core/build/index.ts +39 -27
- package/core/build/live-components-generator.ts +3 -3
- package/core/build/optimizer.ts +235 -235
- package/core/cli/command-registry.ts +6 -4
- package/core/cli/commands/build.ts +79 -0
- package/core/cli/commands/create.ts +54 -0
- package/core/cli/commands/dev.ts +101 -0
- package/core/cli/commands/help.ts +34 -0
- package/core/cli/commands/index.ts +34 -0
- package/core/cli/commands/make-plugin.ts +90 -0
- package/core/cli/commands/plugin-add.ts +197 -0
- package/core/cli/commands/plugin-deps.ts +2 -2
- package/core/cli/commands/plugin-list.ts +208 -0
- package/core/cli/commands/plugin-remove.ts +170 -0
- package/core/cli/generators/component.ts +769 -769
- package/core/cli/generators/controller.ts +1 -1
- package/core/cli/generators/index.ts +146 -146
- package/core/cli/generators/interactive.ts +227 -227
- package/core/cli/generators/plugin.ts +2 -2
- package/core/cli/generators/prompts.ts +82 -82
- package/core/cli/generators/route.ts +6 -6
- package/core/cli/generators/service.ts +2 -2
- package/core/cli/generators/template-engine.ts +4 -3
- package/core/cli/generators/types.ts +2 -2
- package/core/cli/generators/utils.ts +191 -191
- package/core/cli/index.ts +115 -686
- package/core/cli/plugin-discovery.ts +2 -2
- package/core/client/LiveComponentsProvider.tsx +60 -8
- package/core/client/api/eden.ts +183 -0
- package/core/client/api/index.ts +11 -0
- package/core/client/components/Live.tsx +104 -0
- package/core/client/fluxstack.ts +1 -9
- package/core/client/hooks/AdaptiveChunkSizer.ts +215 -215
- package/core/client/hooks/state-validator.ts +1 -1
- package/core/client/hooks/useAuth.ts +48 -48
- package/core/client/hooks/useChunkedUpload.ts +85 -35
- package/core/client/hooks/useLiveChunkedUpload.ts +87 -0
- package/core/client/hooks/useLiveComponent.ts +800 -0
- package/core/client/hooks/useLiveUpload.ts +71 -0
- package/core/client/hooks/useRoom.ts +409 -0
- package/core/client/hooks/useRoomProxy.ts +382 -0
- package/core/client/index.ts +17 -68
- package/core/client/standalone-entry.ts +8 -0
- package/core/client/standalone.ts +74 -53
- package/core/client/state/createStore.ts +192 -192
- package/core/client/state/index.ts +14 -14
- package/core/config/index.ts +70 -291
- package/core/config/schema.ts +42 -723
- package/core/framework/client.ts +131 -131
- package/core/framework/index.ts +7 -7
- package/core/framework/server.ts +47 -40
- package/core/framework/types.ts +2 -2
- package/core/index.ts +23 -4
- package/core/live/ComponentRegistry.ts +3 -3
- package/core/live/types.ts +77 -0
- package/core/plugins/built-in/index.ts +134 -134
- package/core/plugins/built-in/live-components/commands/create-live-component.ts +242 -1066
- package/core/plugins/built-in/live-components/index.ts +1 -1
- package/core/plugins/built-in/monitoring/index.ts +111 -47
- package/core/plugins/built-in/static/index.ts +1 -1
- package/core/plugins/built-in/swagger/index.ts +68 -265
- package/core/plugins/built-in/vite/index.ts +85 -185
- package/core/plugins/built-in/vite/vite-dev.ts +10 -16
- package/core/plugins/config.ts +9 -7
- package/core/plugins/dependency-manager.ts +31 -1
- package/core/plugins/discovery.ts +19 -7
- package/core/plugins/executor.ts +2 -2
- package/core/plugins/index.ts +203 -203
- package/core/plugins/manager.ts +27 -39
- package/core/plugins/module-resolver.ts +19 -8
- package/core/plugins/registry.ts +255 -19
- package/core/plugins/types.ts +20 -53
- package/core/server/framework.ts +66 -43
- package/core/server/index.ts +15 -15
- package/core/server/live/ComponentRegistry.ts +78 -71
- package/core/server/live/FileUploadManager.ts +23 -10
- package/core/server/live/LiveComponentPerformanceMonitor.ts +1 -1
- package/core/server/live/LiveRoomManager.ts +261 -0
- package/core/server/live/RoomEventBus.ts +234 -0
- package/core/server/live/RoomStateManager.ts +172 -0
- package/core/server/live/StateSignature.ts +643 -643
- package/core/server/live/WebSocketConnectionManager.ts +30 -19
- package/core/server/live/auto-generated-components.ts +21 -9
- package/core/server/live/index.ts +14 -0
- package/core/server/live/websocket-plugin.ts +214 -67
- package/core/server/middleware/elysia-helpers.ts +7 -2
- package/core/server/middleware/errorHandling.ts +1 -1
- package/core/server/middleware/index.ts +31 -31
- package/core/server/plugins/database.ts +180 -180
- package/core/server/plugins/static-files-plugin.ts +69 -69
- package/core/server/plugins/swagger.ts +1 -1
- package/core/server/rooms/RoomBroadcaster.ts +357 -0
- package/core/server/rooms/RoomSystem.ts +463 -0
- package/core/server/rooms/index.ts +13 -0
- package/core/server/services/BaseService.ts +1 -1
- package/core/server/services/ServiceContainer.ts +1 -1
- package/core/server/services/index.ts +8 -8
- package/core/templates/create-project.ts +12 -12
- package/core/testing/index.ts +9 -9
- package/core/testing/setup.ts +73 -73
- package/core/types/api.ts +168 -168
- package/core/types/build.ts +219 -219
- package/core/types/config.ts +56 -26
- package/core/types/index.ts +4 -4
- package/core/types/plugin.ts +107 -107
- package/core/types/types.ts +353 -14
- package/core/utils/build-logger.ts +324 -324
- package/core/utils/config-schema.ts +480 -480
- package/core/utils/env.ts +2 -8
- package/core/utils/errors/codes.ts +114 -114
- package/core/utils/errors/handlers.ts +36 -1
- package/core/utils/errors/index.ts +49 -5
- package/core/utils/errors/middleware.ts +113 -113
- package/core/utils/helpers.ts +6 -16
- package/core/utils/index.ts +17 -17
- package/core/utils/logger/colors.ts +114 -114
- package/core/utils/logger/config.ts +13 -9
- package/core/utils/logger/formatter.ts +82 -82
- package/core/utils/logger/group-logger.ts +101 -101
- package/core/utils/logger/index.ts +6 -1
- package/core/utils/logger/stack-trace.ts +3 -1
- package/core/utils/logger/startup-banner.ts +82 -82
- package/core/utils/logger/winston-logger.ts +152 -152
- package/core/utils/monitoring/index.ts +211 -211
- package/core/utils/sync-version.ts +66 -66
- package/core/utils/version.ts +1 -1
- package/create-fluxstack.ts +8 -7
- package/package.json +12 -13
- package/plugins/crypto-auth/cli/make-protected-route.command.ts +1 -1
- package/plugins/crypto-auth/client/CryptoAuthClient.ts +302 -302
- package/plugins/crypto-auth/client/components/index.ts +11 -11
- package/plugins/crypto-auth/client/index.ts +11 -11
- package/plugins/crypto-auth/config/index.ts +1 -1
- package/plugins/crypto-auth/index.ts +4 -4
- package/plugins/crypto-auth/package.json +65 -65
- package/plugins/crypto-auth/server/AuthMiddleware.ts +1 -1
- package/plugins/crypto-auth/server/CryptoAuthService.ts +185 -185
- package/plugins/crypto-auth/server/index.ts +21 -21
- package/plugins/crypto-auth/server/middlewares/cryptoAuthAdmin.ts +3 -3
- package/plugins/crypto-auth/server/middlewares/cryptoAuthOptional.ts +1 -1
- package/plugins/crypto-auth/server/middlewares/cryptoAuthPermissions.ts +2 -2
- package/plugins/crypto-auth/server/middlewares/cryptoAuthRequired.ts +2 -2
- package/plugins/crypto-auth/server/middlewares/helpers.ts +1 -1
- package/plugins/crypto-auth/server/middlewares/index.ts +22 -22
- package/tsconfig.api-strict.json +16 -0
- package/tsconfig.json +48 -52
- package/{app/client/tsconfig.node.json → tsconfig.node.json} +25 -25
- package/types/global.d.ts +29 -29
- package/types/vitest.d.ts +8 -8
- package/vite.config.ts +38 -62
- package/vitest.config.live.ts +10 -9
- package/vitest.config.ts +29 -17
- package/app/client/README.md +0 -69
- package/app/client/SIMPLIFICATION.md +0 -140
- package/app/client/frontend-only.ts +0 -12
- package/app/client/src/live/FileUploadExample.tsx +0 -359
- package/app/client/src/live/MinimalLiveClock.tsx +0 -47
- package/app/client/src/live/QuickUploadTest.tsx +0 -193
- package/app/client/tsconfig.app.json +0 -45
- package/app/client/tsconfig.json +0 -7
- package/app/client/zustand-setup.md +0 -65
- package/app/server/backend-only.ts +0 -18
- package/app/server/live/LiveClockComponent.ts +0 -215
- package/app/server/live/LiveFileUploadComponent.ts +0 -77
- package/app/server/routes/env-test.ts +0 -110
- package/core/client/hooks/index.ts +0 -7
- package/core/client/hooks/useHybridLiveComponent.ts +0 -685
- package/core/client/hooks/useTypedLiveComponent.ts +0 -133
- package/core/client/hooks/useWebSocket.ts +0 -361
- package/core/config/env.ts +0 -546
- package/core/config/loader.ts +0 -522
- package/core/config/runtime-config.ts +0 -327
- package/core/config/validator.ts +0 -540
- package/core/server/backend-entry.ts +0 -51
- package/core/server/standalone.ts +0 -106
- package/core/utils/regenerate-files.ts +0 -69
- package/fluxstack.config.ts +0 -354
package/core/plugins/index.ts
CHANGED
|
@@ -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'
|
package/core/plugins/manager.ts
CHANGED
|
@@ -18,11 +18,11 @@ import type {
|
|
|
18
18
|
} from "./types"
|
|
19
19
|
|
|
20
20
|
type Plugin = FluxStack.Plugin
|
|
21
|
-
import type { FluxStackConfig } from "
|
|
22
|
-
import type { Logger } from "
|
|
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 "
|
|
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
|
-
//
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
-
//
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
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 '
|
|
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.
|
|
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.
|
|
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 =
|
|
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 =
|
|
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.
|
|
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.
|
|
178
|
+
this.cacheSet(cacheKey, resolvedProject)
|
|
168
179
|
return resolvedProject
|
|
169
180
|
}
|
|
170
181
|
}
|