create-fluxstack 1.10.1 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +1 -2
- package/Dockerfile +8 -8
- package/LLMD/INDEX.md +64 -0
- package/LLMD/MAINTENANCE.md +197 -0
- package/LLMD/MIGRATION.md +156 -0
- package/LLMD/config/.gitkeep +1 -0
- package/LLMD/config/declarative-system.md +268 -0
- package/LLMD/config/environment-vars.md +327 -0
- package/LLMD/config/runtime-reload.md +401 -0
- package/LLMD/core/.gitkeep +1 -0
- package/LLMD/core/build-system.md +599 -0
- package/LLMD/core/framework-lifecycle.md +229 -0
- package/LLMD/core/plugin-system.md +451 -0
- package/LLMD/patterns/.gitkeep +1 -0
- package/LLMD/patterns/anti-patterns.md +297 -0
- package/LLMD/patterns/project-structure.md +264 -0
- package/LLMD/patterns/type-safety.md +440 -0
- package/LLMD/reference/.gitkeep +1 -0
- package/LLMD/reference/cli-commands.md +250 -0
- package/LLMD/reference/plugin-hooks.md +357 -0
- package/LLMD/reference/routing.md +39 -0
- package/LLMD/reference/troubleshooting.md +364 -0
- package/LLMD/resources/.gitkeep +1 -0
- package/LLMD/resources/controllers.md +465 -0
- package/LLMD/resources/live-components.md +703 -0
- package/LLMD/resources/live-rooms.md +482 -0
- package/LLMD/resources/live-upload.md +130 -0
- package/LLMD/resources/plugins-external.md +617 -0
- package/LLMD/resources/routes-eden.md +254 -0
- package/README.md +37 -17
- package/app/client/index.html +0 -1
- package/app/client/src/App.tsx +107 -150
- package/app/client/src/components/AppLayout.tsx +68 -0
- package/app/client/src/components/BackButton.tsx +13 -0
- package/app/client/src/components/DemoPage.tsx +20 -0
- package/app/client/src/components/LiveUploadWidget.tsx +204 -0
- package/app/client/src/lib/eden-api.ts +85 -60
- package/app/client/src/live/ChatDemo.tsx +107 -0
- package/app/client/src/live/CounterDemo.tsx +206 -0
- package/app/client/src/live/FormDemo.tsx +119 -0
- package/app/client/src/live/RoomChatDemo.tsx +242 -0
- package/app/client/src/live/UploadDemo.tsx +21 -0
- package/app/client/src/main.tsx +4 -1
- package/app/client/src/pages/ApiTestPage.tsx +108 -0
- package/app/client/src/pages/HomePage.tsx +76 -0
- package/app/server/app.ts +1 -4
- package/app/server/controllers/users.controller.ts +36 -44
- package/app/server/index.ts +25 -35
- package/app/server/live/LiveChat.ts +77 -0
- package/app/server/live/LiveCounter.ts +67 -0
- package/app/server/live/LiveForm.ts +63 -0
- package/app/server/live/LiveLocalCounter.ts +32 -0
- package/app/server/live/LiveRoomChat.ts +285 -0
- package/app/server/live/LiveUpload.ts +81 -0
- package/app/server/routes/index.ts +3 -1
- package/app/server/routes/room.routes.ts +117 -0
- package/app/server/routes/users.routes.ts +35 -27
- package/app/shared/types/index.ts +14 -2
- package/config/app.config.ts +2 -62
- package/config/client.config.ts +2 -95
- package/config/database.config.ts +2 -99
- package/config/fluxstack.config.ts +25 -45
- package/config/index.ts +57 -38
- package/config/monitoring.config.ts +2 -114
- package/config/plugins.config.ts +2 -80
- package/config/server.config.ts +2 -68
- package/config/services.config.ts +2 -130
- package/config/system/app.config.ts +29 -0
- package/config/system/build.config.ts +49 -0
- package/config/system/client.config.ts +68 -0
- package/config/system/database.config.ts +17 -0
- package/config/system/fluxstack.config.ts +114 -0
- package/config/{logger.config.ts → system/logger.config.ts} +3 -1
- package/config/system/monitoring.config.ts +114 -0
- package/config/system/plugins.config.ts +84 -0
- package/config/{runtime.config.ts → system/runtime.config.ts} +1 -1
- package/config/system/server.config.ts +68 -0
- package/config/system/services.config.ts +46 -0
- package/config/{system.config.ts → system/system.config.ts} +1 -1
- package/core/build/flux-plugins-generator.ts +325 -325
- package/core/build/index.ts +39 -27
- package/core/build/live-components-generator.ts +3 -3
- package/core/build/optimizer.ts +235 -235
- package/core/cli/command-registry.ts +6 -4
- package/core/cli/commands/build.ts +79 -0
- package/core/cli/commands/create.ts +54 -0
- package/core/cli/commands/dev.ts +101 -0
- package/core/cli/commands/help.ts +34 -0
- package/core/cli/commands/index.ts +34 -0
- package/core/cli/commands/make-plugin.ts +90 -0
- package/core/cli/commands/plugin-add.ts +197 -0
- package/core/cli/commands/plugin-deps.ts +2 -2
- package/core/cli/commands/plugin-list.ts +208 -0
- package/core/cli/commands/plugin-remove.ts +170 -0
- package/core/cli/generators/component.ts +769 -769
- package/core/cli/generators/controller.ts +1 -1
- package/core/cli/generators/index.ts +146 -146
- package/core/cli/generators/interactive.ts +227 -227
- package/core/cli/generators/plugin.ts +2 -2
- package/core/cli/generators/prompts.ts +82 -82
- package/core/cli/generators/route.ts +6 -6
- package/core/cli/generators/service.ts +2 -2
- package/core/cli/generators/template-engine.ts +4 -3
- package/core/cli/generators/types.ts +2 -2
- package/core/cli/generators/utils.ts +191 -191
- package/core/cli/index.ts +115 -686
- package/core/cli/plugin-discovery.ts +2 -2
- package/core/client/LiveComponentsProvider.tsx +60 -8
- package/core/client/api/eden.ts +183 -0
- package/core/client/api/index.ts +11 -0
- package/core/client/components/Live.tsx +104 -0
- package/core/client/fluxstack.ts +1 -9
- package/core/client/hooks/AdaptiveChunkSizer.ts +215 -215
- package/core/client/hooks/state-validator.ts +1 -1
- package/core/client/hooks/useAuth.ts +48 -48
- package/core/client/hooks/useChunkedUpload.ts +85 -35
- package/core/client/hooks/useLiveChunkedUpload.ts +87 -0
- package/core/client/hooks/useLiveComponent.ts +800 -0
- package/core/client/hooks/useLiveUpload.ts +71 -0
- package/core/client/hooks/useRoom.ts +409 -0
- package/core/client/hooks/useRoomProxy.ts +382 -0
- package/core/client/index.ts +17 -68
- package/core/client/standalone-entry.ts +8 -0
- package/core/client/standalone.ts +74 -53
- package/core/client/state/createStore.ts +192 -192
- package/core/client/state/index.ts +14 -14
- package/core/config/index.ts +70 -291
- package/core/config/schema.ts +42 -723
- package/core/framework/client.ts +131 -131
- package/core/framework/index.ts +7 -7
- package/core/framework/server.ts +47 -40
- package/core/framework/types.ts +2 -2
- package/core/index.ts +23 -4
- package/core/live/ComponentRegistry.ts +3 -3
- package/core/live/types.ts +77 -0
- package/core/plugins/built-in/index.ts +134 -134
- package/core/plugins/built-in/live-components/commands/create-live-component.ts +242 -1066
- package/core/plugins/built-in/live-components/index.ts +1 -1
- package/core/plugins/built-in/monitoring/index.ts +111 -47
- package/core/plugins/built-in/static/index.ts +1 -1
- package/core/plugins/built-in/swagger/index.ts +68 -265
- package/core/plugins/built-in/vite/index.ts +85 -185
- package/core/plugins/built-in/vite/vite-dev.ts +10 -16
- package/core/plugins/config.ts +9 -7
- package/core/plugins/dependency-manager.ts +31 -1
- package/core/plugins/discovery.ts +19 -7
- package/core/plugins/executor.ts +2 -2
- package/core/plugins/index.ts +203 -203
- package/core/plugins/manager.ts +27 -39
- package/core/plugins/module-resolver.ts +19 -8
- package/core/plugins/registry.ts +255 -19
- package/core/plugins/types.ts +20 -53
- package/core/server/framework.ts +66 -43
- package/core/server/index.ts +15 -15
- package/core/server/live/ComponentRegistry.ts +78 -71
- package/core/server/live/FileUploadManager.ts +23 -10
- package/core/server/live/LiveComponentPerformanceMonitor.ts +1 -1
- package/core/server/live/LiveRoomManager.ts +261 -0
- package/core/server/live/RoomEventBus.ts +234 -0
- package/core/server/live/RoomStateManager.ts +172 -0
- package/core/server/live/StateSignature.ts +643 -643
- package/core/server/live/WebSocketConnectionManager.ts +30 -19
- package/core/server/live/auto-generated-components.ts +21 -9
- package/core/server/live/index.ts +14 -0
- package/core/server/live/websocket-plugin.ts +214 -67
- package/core/server/middleware/elysia-helpers.ts +7 -2
- package/core/server/middleware/errorHandling.ts +1 -1
- package/core/server/middleware/index.ts +31 -31
- package/core/server/plugins/database.ts +180 -180
- package/core/server/plugins/static-files-plugin.ts +69 -69
- package/core/server/plugins/swagger.ts +1 -1
- package/core/server/rooms/RoomBroadcaster.ts +357 -0
- package/core/server/rooms/RoomSystem.ts +463 -0
- package/core/server/rooms/index.ts +13 -0
- package/core/server/services/BaseService.ts +1 -1
- package/core/server/services/ServiceContainer.ts +1 -1
- package/core/server/services/index.ts +8 -8
- package/core/templates/create-project.ts +12 -12
- package/core/testing/index.ts +9 -9
- package/core/testing/setup.ts +73 -73
- package/core/types/api.ts +168 -168
- package/core/types/build.ts +219 -219
- package/core/types/config.ts +56 -26
- package/core/types/index.ts +4 -4
- package/core/types/plugin.ts +107 -107
- package/core/types/types.ts +353 -14
- package/core/utils/build-logger.ts +324 -324
- package/core/utils/config-schema.ts +480 -480
- package/core/utils/env.ts +2 -8
- package/core/utils/errors/codes.ts +114 -114
- package/core/utils/errors/handlers.ts +36 -1
- package/core/utils/errors/index.ts +49 -5
- package/core/utils/errors/middleware.ts +113 -113
- package/core/utils/helpers.ts +6 -16
- package/core/utils/index.ts +17 -17
- package/core/utils/logger/colors.ts +114 -114
- package/core/utils/logger/config.ts +13 -9
- package/core/utils/logger/formatter.ts +82 -82
- package/core/utils/logger/group-logger.ts +101 -101
- package/core/utils/logger/index.ts +6 -1
- package/core/utils/logger/stack-trace.ts +3 -1
- package/core/utils/logger/startup-banner.ts +82 -82
- package/core/utils/logger/winston-logger.ts +152 -152
- package/core/utils/monitoring/index.ts +211 -211
- package/core/utils/sync-version.ts +66 -66
- package/core/utils/version.ts +1 -1
- package/create-fluxstack.ts +8 -7
- package/package.json +12 -13
- package/plugins/crypto-auth/cli/make-protected-route.command.ts +1 -1
- package/plugins/crypto-auth/client/CryptoAuthClient.ts +302 -302
- package/plugins/crypto-auth/client/components/index.ts +11 -11
- package/plugins/crypto-auth/client/index.ts +11 -11
- package/plugins/crypto-auth/config/index.ts +1 -1
- package/plugins/crypto-auth/index.ts +4 -4
- package/plugins/crypto-auth/package.json +65 -65
- package/plugins/crypto-auth/server/AuthMiddleware.ts +1 -1
- package/plugins/crypto-auth/server/CryptoAuthService.ts +185 -185
- package/plugins/crypto-auth/server/index.ts +21 -21
- package/plugins/crypto-auth/server/middlewares/cryptoAuthAdmin.ts +3 -3
- package/plugins/crypto-auth/server/middlewares/cryptoAuthOptional.ts +1 -1
- package/plugins/crypto-auth/server/middlewares/cryptoAuthPermissions.ts +2 -2
- package/plugins/crypto-auth/server/middlewares/cryptoAuthRequired.ts +2 -2
- package/plugins/crypto-auth/server/middlewares/helpers.ts +1 -1
- package/plugins/crypto-auth/server/middlewares/index.ts +22 -22
- package/tsconfig.api-strict.json +16 -0
- package/tsconfig.json +48 -52
- package/{app/client/tsconfig.node.json → tsconfig.node.json} +25 -25
- package/types/global.d.ts +29 -29
- package/types/vitest.d.ts +8 -8
- package/vite.config.ts +38 -62
- package/vitest.config.live.ts +10 -9
- package/vitest.config.ts +29 -17
- package/app/client/README.md +0 -69
- package/app/client/SIMPLIFICATION.md +0 -140
- package/app/client/frontend-only.ts +0 -12
- package/app/client/src/live/FileUploadExample.tsx +0 -359
- package/app/client/src/live/MinimalLiveClock.tsx +0 -47
- package/app/client/src/live/QuickUploadTest.tsx +0 -193
- package/app/client/tsconfig.app.json +0 -45
- package/app/client/tsconfig.json +0 -7
- package/app/client/zustand-setup.md +0 -65
- package/app/server/backend-only.ts +0 -18
- package/app/server/live/LiveClockComponent.ts +0 -215
- package/app/server/live/LiveFileUploadComponent.ts +0 -77
- package/app/server/routes/env-test.ts +0 -110
- package/core/client/hooks/index.ts +0 -7
- package/core/client/hooks/useHybridLiveComponent.ts +0 -685
- package/core/client/hooks/useTypedLiveComponent.ts +0 -133
- package/core/client/hooks/useWebSocket.ts +0 -361
- package/core/config/env.ts +0 -546
- package/core/config/loader.ts +0 -522
- package/core/config/runtime-config.ts +0 -327
- package/core/config/validator.ts +0 -540
- package/core/server/backend-entry.ts +0 -51
- package/core/server/standalone.ts +0 -106
- package/core/utils/regenerate-files.ts +0 -69
- package/fluxstack.config.ts +0 -354
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
# Plugin Hooks Reference
|
|
2
|
+
|
|
3
|
+
**Version:** 1.11.0 | **Updated:** 2025-02-08
|
|
4
|
+
|
|
5
|
+
## Quick Facts
|
|
6
|
+
|
|
7
|
+
- Hooks are defined in `core/plugins/types.ts`
|
|
8
|
+
- Execution order follows plugin priority (highest → lowest)
|
|
9
|
+
- All hooks receive typed contexts
|
|
10
|
+
- Hooks can be async (return Promise)
|
|
11
|
+
|
|
12
|
+
## Hook Categories
|
|
13
|
+
|
|
14
|
+
1. **Lifecycle Hooks** - Server startup/shutdown
|
|
15
|
+
2. **Request Pipeline Hooks** - HTTP request/response processing
|
|
16
|
+
3. **Build Pipeline Hooks** - Build process events
|
|
17
|
+
4. **Plugin System Hooks** - Plugin registration events
|
|
18
|
+
|
|
19
|
+
## Execution Order
|
|
20
|
+
|
|
21
|
+
### Server Startup Sequence
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
onConfigLoad → setup → onBeforeServerStart → onServerStart → onAfterServerStart
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Request Processing Sequence
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
onRequest → onRequestValidation → onBeforeRoute → [handler] → onAfterRoute → onBeforeResponse → onResponseTransform → onResponse
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Error Handling
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
[error occurs] → onError → onBeforeResponse → onResponse
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Server Shutdown Sequence
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
onBeforeServerStop → onServerStop
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Build Sequence
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
onBeforeBuild → onBuild → onBuildAsset (per asset) → onBuildComplete
|
|
49
|
+
[on error] → onBuildError
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Lifecycle Hooks
|
|
53
|
+
|
|
54
|
+
| Hook | Context | When Called | Use Case |
|
|
55
|
+
|------|---------|-------------|----------|
|
|
56
|
+
| `setup` | `PluginContext` | After plugin load, before server | Initialize plugin, register Elysia plugins |
|
|
57
|
+
| `onConfigLoad` | `ConfigLoadContext` | Config loaded | Validate/modify configuration |
|
|
58
|
+
| `onBeforeServerStart` | `PluginContext` | Before server.listen() | Pre-flight checks, connections |
|
|
59
|
+
| `onServerStart` | `PluginContext` | Server starting | Register routes, middleware |
|
|
60
|
+
| `onAfterServerStart` | `PluginContext` | Server fully started | Log ready status, health checks |
|
|
61
|
+
| `onBeforeServerStop` | `PluginContext` | Before shutdown | Start graceful shutdown |
|
|
62
|
+
| `onServerStop` | `PluginContext` | Server stopped | Cleanup connections, resources |
|
|
63
|
+
|
|
64
|
+
### Context Types
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
interface PluginContext {
|
|
68
|
+
config: FluxStackConfig
|
|
69
|
+
logger: Logger
|
|
70
|
+
app: Elysia // The Elysia app instance
|
|
71
|
+
utils: PluginUtils
|
|
72
|
+
registry?: PluginRegistry
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
interface ConfigLoadContext {
|
|
76
|
+
config: FluxStackConfig
|
|
77
|
+
envVars: Record<string, string | undefined>
|
|
78
|
+
configPath?: string
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Example: Lifecycle Hook
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
const myPlugin: FluxStack.Plugin = {
|
|
86
|
+
name: 'my-plugin',
|
|
87
|
+
version: '1.0.0',
|
|
88
|
+
|
|
89
|
+
setup: async ({ app, logger }) => {
|
|
90
|
+
logger.info('Plugin initializing')
|
|
91
|
+
|
|
92
|
+
// Register Elysia plugin
|
|
93
|
+
app.use(myElysiaPlugin())
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
onAfterServerStart: ({ config, logger }) => {
|
|
97
|
+
logger.info(`Server running on port ${config.server.port}`)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Request Pipeline Hooks
|
|
103
|
+
|
|
104
|
+
| Hook | Context | When Called | Use Case |
|
|
105
|
+
|------|---------|-------------|----------|
|
|
106
|
+
| `onRequest` | `RequestContext` | Request received | Logging, rate limiting, auth check |
|
|
107
|
+
| `onRequestValidation` | `ValidationContext` | After validation | Custom validation, error formatting |
|
|
108
|
+
| `onBeforeRoute` | `RequestContext` | Before handler | Modify request, inject data |
|
|
109
|
+
| `onAfterRoute` | `RouteContext` | After handler | Logging, metrics |
|
|
110
|
+
| `onBeforeResponse` | `ResponseContext` | Before sending | Modify response, add headers |
|
|
111
|
+
| `onResponseTransform` | `TransformContext` | Transform response | Compression, encryption |
|
|
112
|
+
| `onResponse` | `ResponseContext` | Response sent | Access logs, analytics |
|
|
113
|
+
| `onError` | `ErrorContext` | On any error | Error logging, custom responses |
|
|
114
|
+
|
|
115
|
+
### Context Types
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
interface RequestContext {
|
|
119
|
+
request: Request
|
|
120
|
+
path: string
|
|
121
|
+
method: string
|
|
122
|
+
headers: Record<string, string>
|
|
123
|
+
query: Record<string, string>
|
|
124
|
+
params: Record<string, string>
|
|
125
|
+
body?: any
|
|
126
|
+
user?: any
|
|
127
|
+
startTime: number
|
|
128
|
+
handled?: boolean
|
|
129
|
+
response?: Response
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
interface ResponseContext extends RequestContext {
|
|
133
|
+
response: Response
|
|
134
|
+
statusCode: number
|
|
135
|
+
duration: number
|
|
136
|
+
size?: number
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
interface ValidationContext extends RequestContext {
|
|
140
|
+
errors: Array<{ field: string; message: string; code: string }>
|
|
141
|
+
isValid: boolean
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
interface ErrorContext extends RequestContext {
|
|
145
|
+
error: Error
|
|
146
|
+
duration: number
|
|
147
|
+
handled: boolean
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
interface RouteContext extends RequestContext {
|
|
151
|
+
route?: string
|
|
152
|
+
handler?: Function
|
|
153
|
+
params: Record<string, string>
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
interface TransformContext extends ResponseContext {
|
|
157
|
+
transformed: boolean
|
|
158
|
+
originalResponse?: Response
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Example: Request Hook
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
const authPlugin: FluxStack.Plugin = {
|
|
166
|
+
name: 'auth-plugin',
|
|
167
|
+
|
|
168
|
+
onRequest: async ({ request, headers }) => {
|
|
169
|
+
const token = headers['authorization']
|
|
170
|
+
if (token) {
|
|
171
|
+
// Validate token and attach user
|
|
172
|
+
const user = await validateToken(token)
|
|
173
|
+
return { user } // Merged into context
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
onError: ({ error, path, method, logger }) => {
|
|
178
|
+
logger.error(`${method} ${path} failed: ${error.message}`)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Build Pipeline Hooks
|
|
184
|
+
|
|
185
|
+
| Hook | Context | When Called | Use Case |
|
|
186
|
+
|------|---------|-------------|----------|
|
|
187
|
+
| `onBeforeBuild` | `BuildContext` | Before build starts | Setup, validation |
|
|
188
|
+
| `onBuild` | `BuildContext` | Build in progress | Custom build steps |
|
|
189
|
+
| `onBuildAsset` | `BuildAssetContext` | Per asset processed | Transform, optimize assets |
|
|
190
|
+
| `onBuildComplete` | `BuildContext` | Build finished | Post-processing, notifications |
|
|
191
|
+
| `onBuildError` | `BuildErrorContext` | Build failed | Error reporting |
|
|
192
|
+
|
|
193
|
+
### Context Types
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
interface BuildContext {
|
|
197
|
+
target: string
|
|
198
|
+
outDir: string
|
|
199
|
+
mode: 'development' | 'production'
|
|
200
|
+
config: FluxStackConfig
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
interface BuildAssetContext {
|
|
204
|
+
assetPath: string
|
|
205
|
+
assetType: 'js' | 'css' | 'html' | 'image' | 'font' | 'other'
|
|
206
|
+
size: number
|
|
207
|
+
content?: string | Buffer
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
interface BuildErrorContext {
|
|
211
|
+
error: Error
|
|
212
|
+
file?: string
|
|
213
|
+
line?: number
|
|
214
|
+
column?: number
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Example: Build Hook
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
const optimizerPlugin: FluxStack.Plugin = {
|
|
222
|
+
name: 'optimizer',
|
|
223
|
+
|
|
224
|
+
onBuildAsset: ({ assetPath, assetType, size }) => {
|
|
225
|
+
console.log(`Processing ${assetType}: ${assetPath} (${size} bytes)`)
|
|
226
|
+
},
|
|
227
|
+
|
|
228
|
+
onBuildComplete: ({ outDir, mode }) => {
|
|
229
|
+
console.log(`Build complete: ${outDir} (${mode})`)
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Plugin System Hooks
|
|
235
|
+
|
|
236
|
+
| Hook | Context | When Called | Use Case |
|
|
237
|
+
|------|---------|-------------|----------|
|
|
238
|
+
| `onPluginRegister` | `PluginEventContext` | Plugin registered | Log, notify |
|
|
239
|
+
| `onPluginUnregister` | `PluginEventContext` | Plugin removed | Cleanup |
|
|
240
|
+
| `onPluginError` | `PluginEventContext & { error }` | Plugin error | Error handling |
|
|
241
|
+
|
|
242
|
+
### Context Types
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
interface PluginEventContext {
|
|
246
|
+
pluginName: string
|
|
247
|
+
pluginVersion?: string
|
|
248
|
+
timestamp: number
|
|
249
|
+
data?: any
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Plugin Utilities
|
|
254
|
+
|
|
255
|
+
Available via `context.utils`:
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
interface PluginUtils {
|
|
259
|
+
createTimer: (label: string) => { end: () => number }
|
|
260
|
+
formatBytes: (bytes: number) => string
|
|
261
|
+
isProduction: () => boolean
|
|
262
|
+
isDevelopment: () => boolean
|
|
263
|
+
getEnvironment: () => string
|
|
264
|
+
createHash: (data: string) => string
|
|
265
|
+
deepMerge: (target: any, source: any) => any
|
|
266
|
+
validateSchema: (data: any, schema: any) => { valid: boolean; errors: string[] }
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Example: Using Utilities
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
const metricsPlugin: FluxStack.Plugin = {
|
|
274
|
+
name: 'metrics',
|
|
275
|
+
|
|
276
|
+
onRequest: ({ utils }) => {
|
|
277
|
+
const timer = utils.createTimer('request')
|
|
278
|
+
return { timer } // Pass to response hook
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
onResponse: ({ timer, utils }) => {
|
|
282
|
+
const duration = timer?.end()
|
|
283
|
+
if (utils.isProduction()) {
|
|
284
|
+
sendMetric('request_duration', duration)
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## Hook Priority
|
|
291
|
+
|
|
292
|
+
Plugins execute in priority order:
|
|
293
|
+
|
|
294
|
+
```typescript
|
|
295
|
+
type PluginPriority = 'highest' | 'high' | 'normal' | 'low' | 'lowest' | number
|
|
296
|
+
|
|
297
|
+
const plugin: FluxStack.Plugin = {
|
|
298
|
+
name: 'high-priority-plugin',
|
|
299
|
+
priority: 'high', // or numeric: 100 (higher = earlier)
|
|
300
|
+
// ...
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
| Priority | Numeric | Order |
|
|
305
|
+
|----------|---------|-------|
|
|
306
|
+
| `highest` | 1000 | First |
|
|
307
|
+
| `high` | 100 | Second |
|
|
308
|
+
| `normal` | 0 | Default |
|
|
309
|
+
| `low` | -100 | Fourth |
|
|
310
|
+
| `lowest` | -1000 | Last |
|
|
311
|
+
|
|
312
|
+
## Hook Execution Options
|
|
313
|
+
|
|
314
|
+
```typescript
|
|
315
|
+
interface HookExecutionOptions {
|
|
316
|
+
timeout?: number // Max execution time (ms)
|
|
317
|
+
parallel?: boolean // Run hooks in parallel
|
|
318
|
+
stopOnError?: boolean // Stop chain on error
|
|
319
|
+
retries?: number // Retry on failure
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## Complete Plugin Example
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
import type { FluxStack } from '@core/plugins/types'
|
|
327
|
+
|
|
328
|
+
export const analyticsPlugin: FluxStack.Plugin = {
|
|
329
|
+
name: 'analytics',
|
|
330
|
+
version: '1.0.0',
|
|
331
|
+
description: 'Request analytics and metrics',
|
|
332
|
+
priority: 'high',
|
|
333
|
+
|
|
334
|
+
setup: async ({ logger }) => {
|
|
335
|
+
logger.info('Analytics plugin initialized')
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
onRequest: ({ path, method }) => {
|
|
339
|
+
return { requestStart: Date.now() }
|
|
340
|
+
},
|
|
341
|
+
|
|
342
|
+
onResponse: ({ path, method, statusCode, requestStart }) => {
|
|
343
|
+
const duration = Date.now() - (requestStart || 0)
|
|
344
|
+
trackRequest({ path, method, statusCode, duration })
|
|
345
|
+
},
|
|
346
|
+
|
|
347
|
+
onError: ({ error, path }) => {
|
|
348
|
+
trackError({ error: error.message, path })
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## Related
|
|
354
|
+
|
|
355
|
+
- [Plugin System](../core/plugin-system.md)
|
|
356
|
+
- [External Plugins](../resources/plugins-external.md)
|
|
357
|
+
- [Framework Lifecycle](../core/framework-lifecycle.md)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Routing (React Router v7)
|
|
2
|
+
|
|
3
|
+
FluxStack uses **React Router v7** via the `react-router` package for web routing.
|
|
4
|
+
|
|
5
|
+
## Where It Lives
|
|
6
|
+
|
|
7
|
+
- Router provider: `app/client/src/main.tsx`
|
|
8
|
+
- Routes and pages: `app/client/src/App.tsx`
|
|
9
|
+
- Pages: `app/client/src/pages/*`
|
|
10
|
+
- Shared layout: `app/client/src/components/AppLayout.tsx`
|
|
11
|
+
|
|
12
|
+
## Why `react-router` (not `react-router-dom`)
|
|
13
|
+
|
|
14
|
+
In v7, the React Router team recommends using the core `react-router` package
|
|
15
|
+
directly for web apps. The `react-router-dom` package remains as a compatibility
|
|
16
|
+
re-export for older apps, but new projects should import from `react-router`.
|
|
17
|
+
|
|
18
|
+
## Example: Adding a New Route
|
|
19
|
+
|
|
20
|
+
1. Create a page in `app/client/src/pages/MyPage.tsx`
|
|
21
|
+
2. Add a route in `app/client/src/App.tsx`:
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
import { MyPage } from './pages/MyPage'
|
|
25
|
+
|
|
26
|
+
<Route path="/my-page" element={<MyPage />} />
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
3. Add a nav link in `app/client/src/components/AppLayout.tsx`
|
|
30
|
+
|
|
31
|
+
## Current Demo Routes
|
|
32
|
+
|
|
33
|
+
- `/` Home
|
|
34
|
+
- `/counter` Live Counter
|
|
35
|
+
- `/form` Live Form
|
|
36
|
+
- `/upload` Live Upload
|
|
37
|
+
- `/chat` Live Chat
|
|
38
|
+
- `/api-test` Eden Treaty API Test
|
|
39
|
+
|