create-fluxstack 1.18.1 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/LLMD/INDEX.md +1 -1
  3. package/LLMD/MAINTENANCE.md +197 -197
  4. package/LLMD/MIGRATION.md +44 -1
  5. package/LLMD/agent.md +20 -7
  6. package/LLMD/config/declarative-system.md +268 -268
  7. package/LLMD/config/environment-vars.md +3 -6
  8. package/LLMD/config/runtime-reload.md +401 -401
  9. package/LLMD/core/build-system.md +599 -599
  10. package/LLMD/core/framework-lifecycle.md +249 -229
  11. package/LLMD/core/plugin-system.md +154 -100
  12. package/LLMD/patterns/anti-patterns.md +397 -397
  13. package/LLMD/patterns/project-structure.md +264 -264
  14. package/LLMD/patterns/type-safety.md +61 -5
  15. package/LLMD/reference/cli-commands.md +31 -7
  16. package/LLMD/reference/plugin-hooks.md +4 -2
  17. package/LLMD/reference/troubleshooting.md +364 -364
  18. package/LLMD/resources/controllers.md +465 -465
  19. package/LLMD/resources/live-auth.md +178 -1
  20. package/LLMD/resources/live-binary-delta.md +3 -1
  21. package/LLMD/resources/live-components.md +1192 -1041
  22. package/LLMD/resources/live-logging.md +3 -1
  23. package/LLMD/resources/live-rooms.md +1 -1
  24. package/LLMD/resources/live-upload.md +228 -181
  25. package/LLMD/resources/plugins-external.md +8 -7
  26. package/LLMD/resources/rest-auth.md +290 -290
  27. package/LLMD/resources/routes-eden.md +254 -254
  28. package/app/client/src/App.tsx +7 -7
  29. package/app/client/src/components/AppLayout.tsx +60 -23
  30. package/app/client/src/components/ColorWheel.tsx +195 -0
  31. package/app/client/src/components/DemoPage.tsx +5 -3
  32. package/app/client/src/components/LiveUploadWidget.tsx +1 -1
  33. package/app/client/src/components/ThemePicker.tsx +307 -0
  34. package/app/client/src/config/theme.config.ts +127 -0
  35. package/app/client/src/hooks/useThemeClock.ts +66 -0
  36. package/app/client/src/index.css +193 -0
  37. package/app/client/src/lib/theme-clock.ts +201 -0
  38. package/app/client/src/live/AuthDemo.tsx +9 -9
  39. package/app/client/src/live/CounterDemo.tsx +10 -10
  40. package/app/client/src/live/FormDemo.tsx +8 -8
  41. package/app/client/src/live/PingPongDemo.tsx +10 -10
  42. package/app/client/src/live/RoomChatDemo.tsx +10 -10
  43. package/app/client/src/live/SharedCounterDemo.tsx +5 -5
  44. package/app/client/src/pages/ApiTestPage.tsx +5 -5
  45. package/app/client/src/pages/HomePage.tsx +12 -12
  46. package/app/server/index.ts +8 -0
  47. package/app/server/live/auto-generated-components.ts +1 -1
  48. package/core/build/index.ts +1 -1
  49. package/core/cli/command-registry.ts +1 -1
  50. package/core/cli/commands/build.ts +25 -6
  51. package/core/cli/commands/plugin-deps.ts +1 -2
  52. package/core/cli/generators/plugin.ts +433 -581
  53. package/core/framework/server.ts +22 -8
  54. package/core/index.ts +6 -5
  55. package/core/plugins/index.ts +71 -199
  56. package/core/plugins/types.ts +76 -461
  57. package/core/server/index.ts +1 -1
  58. package/core/utils/logger/startup-banner.ts +26 -4
  59. package/create-fluxstack.ts +216 -107
  60. package/package.json +108 -107
  61. package/tsconfig.json +2 -1
  62. package/core/plugins/config.ts +0 -356
  63. package/core/plugins/dependency-manager.ts +0 -481
  64. package/core/plugins/discovery.ts +0 -379
  65. package/core/plugins/executor.ts +0 -353
  66. package/core/plugins/manager.ts +0 -645
  67. package/core/plugins/module-resolver.ts +0 -227
  68. package/core/plugins/registry.ts +0 -913
  69. package/vitest.config.live.ts +0 -69
@@ -1,5 +1,35 @@
1
1
  #!/usr/bin/env bun
2
2
 
3
+ /**
4
+ * create-fluxstack — project generator (current model: framework-in-template)
5
+ *
6
+ * This generator clones the FluxStack framework source into the new project
7
+ * (the entire `core/` tree and friends) rather than installing the framework
8
+ * as an npm dependency. That's a transitional design: the long-term direction
9
+ * is "framework-as-dep" once @fluxstack/framework is extracted as a published
10
+ * package — same pattern we already have for @fluxstack/live and
11
+ * @fluxstack/plugin-kit. When that happens, this script becomes a thin
12
+ * template generator that writes a package.json with the framework as a dep
13
+ * and never touches the framework source.
14
+ *
15
+ * Until that migration happens, this script exists to keep onboarding
16
+ * working in the current model. The content it generates (README,
17
+ * plugins/README, example code) MUST reflect the CURRENT framework
18
+ * architecture — not the retired auto-discovery + class-based plugin
19
+ * model that was removed in @fluxstack/plugin-kit@0.4.0.
20
+ *
21
+ * Reference points for "current architecture":
22
+ * - Plugins are registered statically via `framework.use(pluginObject)`
23
+ * in `app/server/index.ts`. No file-based discovery. No `plugin.json`.
24
+ * - Plugin shape is a plain object literal `export const xxxPlugin: Plugin = { ... }`,
25
+ * NOT `class XxxPlugin implements Plugin`. See the real plugins in
26
+ * `core/plugins/built-in/` and `@fluxstack/plugin-csrf-protection` for
27
+ * living examples.
28
+ * - Plugin types come from `@fluxstack/plugin-kit`, the canonical source.
29
+ * `@core/plugins/types` still works as a shim but is not the path to
30
+ * teach new users.
31
+ */
32
+
3
33
  import { program } from 'commander'
4
34
  import { resolve, join, basename } from 'path'
5
35
  import { existsSync, mkdirSync, cpSync, writeFileSync, readFileSync, readdirSync } from 'fs'
@@ -118,110 +148,140 @@ program
118
148
  // Create a README in plugins folder
119
149
  const pluginsReadme = `# Plugins
120
150
 
121
- This folder is for your custom FluxStack plugins.
151
+ This folder is where your **custom project-local plugins** live.
152
+ External npm plugins (e.g. \`@fluxstack/plugin-csrf-protection\`) are
153
+ installed via \`bun add\` and imported from \`node_modules\` instead.
154
+
155
+ ## ⚡ How plugins are loaded
156
+
157
+ FluxStack uses **explicit static registration**. Every plugin must be
158
+ imported and passed to \`framework.use()\` in \`app/server/index.ts\`:
122
159
 
123
- ## 📖 Documentation
160
+ \`\`\`typescript
161
+ // app/server/index.ts
162
+ import { FluxStackFramework } from "@core/server"
163
+ import { swaggerPlugin } from "@core/plugins/built-in/swagger"
164
+ import { myPlugin } from "../../plugins/my-plugin"
124
165
 
125
- For complete plugin development guide, see:
126
- - \`LLMD/resources/plugins-external.md\` - Full plugin documentation
127
- - \`LLMD/reference/plugin-hooks.md\` - All available hooks
166
+ const framework = new FluxStackFramework()
167
+ .use(swaggerPlugin)
168
+ .use(myPlugin)
169
+ \`\`\`
128
170
 
129
- ## 📦 Available CLI Commands
171
+ There is **no auto-discovery**. A plugin file sitting in this folder
172
+ is not loaded unless something explicitly imports and registers it.
173
+ This is intentional — it makes the dev and production builds behave
174
+ identically (bundlers can tree-shake and include plugin code only
175
+ when it's statically referenced) and makes the list of enabled
176
+ plugins auditable in one file.
177
+
178
+ ## 📖 Full documentation
179
+
180
+ - \`LLMD/resources/plugins-external.md\` — plugin authoring guide
181
+ - \`LLMD/reference/plugin-hooks.md\` — every hook and its signature
182
+
183
+ ## 🛠️ CLI scaffolding
184
+
185
+ Generate a new plugin skeleton:
130
186
 
131
187
  \`\`\`bash
132
- # Create a new plugin
133
- bun run cli make:plugin my-plugin # Basic plugin
134
- bun run cli make:plugin my-plugin --template full # Full plugin (server + client)
135
- bun run cli make:plugin my-plugin --template server # Server-only plugin
136
-
137
- # Manage plugin dependencies
138
- bun run cli plugin:deps install # Install plugin dependencies
139
- bun run cli plugin:deps list # List plugin dependencies
140
- bun run cli plugin:deps check # Check for conflicts
141
- bun run cli plugin:deps clean # Clean unused dependencies
188
+ bun run cli make:plugin my-plugin # basic
189
+ bun run cli make:plugin my-plugin --template full # server + client
190
+ bun run cli make:plugin my-plugin --template server # server only
142
191
  \`\`\`
143
192
 
144
- ## 🔌 Plugin Structure
193
+ After running \`make:plugin\`, the CLI will print instructions
194
+ telling you to import and \`.use()\` the new plugin in
195
+ \`app/server/index.ts\`. Do that step — the generator does not
196
+ auto-edit your server file.
197
+
198
+ ## 📁 Plugin layout
145
199
 
146
200
  \`\`\`
147
201
  plugins/
148
- ├── my-plugin/
149
- ├── plugin.json # Plugin metadata (name, version, dependencies)
150
- ├── index.ts # Plugin entry point (server-side hooks)
151
- ├── server/ # Server-side code (optional)
152
- │ └── client/ # Client-side code (optional)
202
+ └── my-plugin/
203
+ ├── index.ts # Plugin object (with setup + optional hooks)
204
+ ├── config/ # Optional: per-plugin declarative config
205
+ └── index.ts
206
+ ├── server/ # Optional: server-side services
207
+ └── client/ # Optional: client-side code
153
208
  \`\`\`
154
209
 
155
- ## Quick Start
210
+ A plugin's identity lives in its exported object, not in a separate
211
+ metadata file. No \`plugin.json\` is needed (or read).
156
212
 
157
- 1. Create your plugin folder: \`plugins/my-plugin/\`
158
- 2. Create \`plugin.json\` with metadata
159
- 3. Create \`index.ts\` with your plugin logic
160
- 4. Use \`bun run cli plugin:deps install\` if you need extra dependencies
213
+ ## 🔌 Writing a plugin
161
214
 
162
- ## 🔌 Intercepting Requests
163
-
164
- Plugins can intercept and modify requests using hooks:
215
+ A plugin is a **plain object** implementing the \`Plugin\` interface
216
+ from \`@fluxstack/plugin-kit\`:
165
217
 
166
218
  \`\`\`typescript
167
219
  // plugins/my-plugin/index.ts
168
- import type { FluxStack, PluginContext, RequestContext, ResponseContext } from "@core/plugins/types"
169
-
170
- export class MyPlugin implements FluxStack.Plugin {
171
- name = 'my-plugin'
172
- version = FLUXSTACK_VERSION
173
-
174
- // Intercept every request
175
- async onRequest(context: PluginContext): Promise<void> {
176
- // Example: Add custom headers
177
- const url = (() => {
178
- try {
179
- return new URL(PluginContext.request.url)
180
- } catch {
181
- const host = PluginContext.request.headers.get('host') || 'localhost'
182
- return new URL(request.url, \`http://\${host}\`)
220
+ import type { Plugin, PluginContext, RequestContext, ErrorContext } from "@fluxstack/plugin-kit"
221
+
222
+ export const myPlugin: Plugin = {
223
+ name: 'my-plugin',
224
+ version: '1.0.0',
225
+ description: 'Example plugin that logs requests',
226
+
227
+ // Called once during framework.start(). Use this to initialize
228
+ // resources, mount Elysia routes via ctx.app, register
229
+ // client-side JS hooks via ctx.clientHooks, etc.
230
+ setup: async (ctx: PluginContext) => {
231
+ ctx.logger.info('[my-plugin] initialized')
232
+ },
233
+
234
+ // Fires before every request is routed. Read ctx.path / ctx.method
235
+ // / ctx.headers. Set ctx.handled = true and ctx.response to
236
+ // short-circuit the pipeline.
237
+ onBeforeRoute: async (ctx: RequestContext) => {
238
+ if (ctx.path.startsWith('/api/protected')) {
239
+ const token = ctx.headers['authorization']
240
+ if (!token) {
241
+ ctx.handled = true
242
+ ctx.response = new Response('Unauthorized', { status: 401 })
183
243
  }
184
- })()
185
- console.log(\`[\${this.name}] Request to: \${url.pathname}\`)
186
-
187
- // Example: Validate authentication
188
- const token = request.headers.get('Authorization')
189
- if (!token && url.pathname.startsWith('/api/protected')) {
190
- throw new Error('Unauthorized')
191
244
  }
192
- }
193
-
194
- // Intercept every response
195
- async onResponse(context: PluginContext): Promise<void> {
196
- console.log(\`[\${this.name}] Response status: \${PluginContext.response.status}\`)
197
- }
198
-
199
- // Handle errors
200
- async onError(context: PluginContext, error: Error): Promise<void> {
201
- console.error(\`[\${this.name}] Error:\`, error.message)
202
- // Example: Send to error tracking service
203
- }
245
+ },
246
+
247
+ // Fires if a route handler throws.
248
+ onError: async (ctx: ErrorContext) => {
249
+ console.error('[my-plugin] handler failed:', ctx.error.message)
250
+ },
204
251
  }
252
+
253
+ export default myPlugin
254
+ \`\`\`
255
+
256
+ Then register it in \`app/server/index.ts\`:
257
+
258
+ \`\`\`typescript
259
+ import { myPlugin } from '../../plugins/my-plugin'
260
+
261
+ framework.use(myPlugin)
205
262
  \`\`\`
206
263
 
207
- ## 📋 Available Hooks
264
+ ## Plugin as class — DON'T
208
265
 
209
- - **\`setup\`**: Initialize plugin resources (called once at startup)
210
- - **\`onServerStart\`**: Run when server starts
211
- - **\`onRequest\`**: Intercept incoming requests (before route handlers)
212
- - **\`onResponse\`**: Intercept outgoing responses (after route handlers)
213
- - **\`onError\`**: Handle errors globally
266
+ The old class-based pattern (\`export class MyPlugin implements Plugin\`)
267
+ is deprecated. All new plugins should be plain object literals. The
268
+ built-in plugins and \`@fluxstack/plugin-csrf-protection\` are all
269
+ objects, and they're the canonical reference.
214
270
 
215
- ## 💡 Common Use Cases
271
+ ## 💡 Common hook choices
216
272
 
217
- - **Authentication**: Validate tokens in \`onRequest\`
218
- - **Logging**: Log requests/responses for analytics
219
- - **Rate Limiting**: Track request counts per IP
220
- - **CORS**: Add headers in \`onResponse\`
221
- - **Request Transformation**: Modify request body/headers
222
- - **Response Transformation**: Add custom headers, compress responses
273
+ | You want to... | Use this hook |
274
+ |---|---|
275
+ | Initialize shared state / mount routes | \`setup\` |
276
+ | Intercept incoming requests | \`onRequest\` or \`onBeforeRoute\` |
277
+ | Inspect or transform responses | \`onBeforeResponse\` or \`onResponse\` |
278
+ | Validate requests (auth, CSRF, etc.) | \`onRequestValidation\` |
279
+ | Handle uncaught handler errors | \`onError\` |
280
+ | Run code at server startup | \`onServerStart\` |
223
281
 
224
- See the documentation for detailed examples and best practices.
282
+ See \`@fluxstack/plugin-csrf-protection\` for a real-world example
283
+ that uses \`setup\` (to mount \`GET /api/__csrf\`) and
284
+ \`onRequestValidation\` (to reject mutating requests without a token).
225
285
  `
226
286
  writeFileSync(join(pluginsDir, 'README.md'), pluginsReadme)
227
287
 
@@ -413,48 +473,97 @@ ${actualProjectName}/
413
473
 
414
474
  ## 🔌 Adding Plugins
415
475
 
476
+ Plugins are registered **explicitly** via \`framework.use()\` in
477
+ \`app/server/index.ts\`. There is no auto-discovery — every plugin you
478
+ want enabled must be imported and passed to \`.use()\`. This is the
479
+ only registration path: dev mode and production bundles behave identically.
480
+
416
481
  ### Built-in Plugins
417
- FluxStack includes several built-in plugins that are ready to use:
482
+
483
+ FluxStack ships with several built-in plugins:
484
+
485
+ \`\`\`typescript
486
+ // app/server/index.ts
487
+ import { FluxStackFramework } from "@core/server"
488
+ import { vitePlugin } from "@core/plugins/built-in/vite"
489
+ import { swaggerPlugin } from "@core/plugins/built-in/swagger"
490
+ import { liveComponentsPlugin } from "@core/server/live"
491
+
492
+ const framework = new FluxStackFramework()
493
+ .use(swaggerPlugin)
494
+ .use(liveComponentsPlugin)
495
+ .use(vitePlugin)
496
+ \`\`\`
497
+
498
+ ### Using an npm Plugin
499
+
500
+ Install the package, import it, and register via \`.use()\`:
418
501
 
419
502
  \`\`\`typescript
420
503
  // app/server/index.ts
421
- import { swaggerPlugin } from "@core/server"
504
+ import { csrfProtectionPlugin } from "@fluxstack/plugin-csrf-protection"
422
505
 
423
- // Add built-in plugins
424
- app.use(loggerPlugin)
425
- app.use(swaggerPlugin)
506
+ framework.use(csrfProtectionPlugin)
426
507
  \`\`\`
427
508
 
428
- ### Custom Plugin Example
509
+ ### Writing Your Own Plugin
510
+
511
+ A plugin is a **plain object** implementing the \`Plugin\` interface
512
+ from \`@fluxstack/plugin-kit\`. NOT a class — just an object with hook
513
+ functions as fields.
429
514
 
430
515
  \`\`\`typescript
431
- // app/server/plugins/auth.ts
432
- import { Elysia } from 'elysia'
433
-
434
- export const authPlugin = new Elysia({ name: 'auth' })
435
- .derive(({ headers }) => ({
436
- user: getUserFromToken(headers.authorization)
437
- }))
438
- .guard({
439
- beforeHandle({ user, set }) {
440
- if (!user) {
441
- set.status = 401
442
- return { error: 'Unauthorized' }
443
- }
444
- }
445
- })
516
+ // plugins/my-plugin/index.ts
517
+ import type { Plugin, PluginContext, RequestContext } from "@fluxstack/plugin-kit"
518
+
519
+ export const myPlugin: Plugin = {
520
+ name: 'my-plugin',
521
+ version: '1.0.0',
522
+
523
+ // Runs once during framework.start() — use this to initialize
524
+ // resources, mount Elysia routes via context.app, register client
525
+ // hooks, etc.
526
+ setup: async (ctx: PluginContext) => {
527
+ ctx.logger.info('[my-plugin] initialized')
528
+ },
529
+
530
+ // Runs before every request is routed
531
+ onBeforeRoute: async (ctx: RequestContext) => {
532
+ // e.g. inspect ctx.path, reject with ctx.handled = true, etc.
533
+ },
534
+
535
+ // Runs if a handler throws
536
+ onError: async (ctx) => {
537
+ ctx.logger?.error('[my-plugin] handler failed', ctx.error)
538
+ },
539
+ }
540
+
541
+ export default myPlugin
542
+ \`\`\`
446
543
 
447
- // Use in app/server/index.ts
448
- import { authPlugin } from './plugins/auth'
449
- app.use(authPlugin)
544
+ Then register it:
545
+
546
+ \`\`\`typescript
547
+ // app/server/index.ts
548
+ import { myPlugin } from '../../plugins/my-plugin'
549
+
550
+ framework.use(myPlugin)
450
551
  \`\`\`
451
552
 
452
553
  ### Available Plugin Hooks
453
- - \`setup\` - Initialize plugin resources
454
- - \`onServerStart\` - Run when server starts
455
- - \`onRequest\` - Process incoming requests
456
- - \`onResponse\` - Process outgoing responses
457
- - \`onError\` - Handle errors
554
+
555
+ | Hook | When it fires |
556
+ |---|---|
557
+ | \`setup\` | Once during \`framework.start()\`, before routes handle requests |
558
+ | \`onBeforeServerStart\` / \`onServerStart\` / \`onAfterServerStart\` | Server lifecycle |
559
+ | \`onRequest\` | Every incoming request, before routing |
560
+ | \`onBeforeRoute\` / \`onAfterRoute\` | Around route matching |
561
+ | \`onBeforeResponse\` / \`onResponse\` | Around response delivery |
562
+ | \`onRequestValidation\` | Request validation step (used by CSRF protection, auth guards, etc.) |
563
+ | \`onError\` | Uncaught errors in handlers |
564
+ | \`onBuild\` / \`onBuildComplete\` | Build pipeline |
565
+
566
+ See \`LLMD/reference/plugin-hooks.md\` for full hook signatures.
458
567
 
459
568
  ## 📖 Learn More
460
569
 
package/package.json CHANGED
@@ -1,107 +1,108 @@
1
- {
2
- "name": "create-fluxstack",
3
- "version": "1.18.1",
4
- "description": "⚡ Revolutionary full-stack TypeScript framework with Declarative Config System, Elysia + React + Bun",
5
- "keywords": [
6
- "framework",
7
- "full-stack",
8
- "typescript",
9
- "elysia",
10
- "react",
11
- "bun",
12
- "vite"
13
- ],
14
- "author": "FluxStack Team",
15
- "license": "MIT",
16
- "homepage": "https://github.com/MarcosBrendonDePaula/FluxStack",
17
- "repository": {
18
- "type": "git",
19
- "url": "git+https://github.com/MarcosBrendonDePaula/FluxStack.git"
20
- },
21
- "module": "app/server/index.ts",
22
- "type": "module",
23
- "bin": {
24
- "create-fluxstack": "create-fluxstack.ts"
25
- },
26
- "scripts": {
27
- "dev": "bun run core/cli/index.ts dev",
28
- "dev:frontend": "bun run core/cli/index.ts dev --frontend-only",
29
- "dev:backend": "bun run core/cli/index.ts dev --backend-only",
30
- "build": "cross-env NODE_ENV=production bun run core/cli/index.ts build",
31
- "build:frontend": "cross-env NODE_ENV=production bun run core/cli/index.ts build --frontend-only",
32
- "build:backend": "cross-env NODE_ENV=production bun run core/cli/index.ts build --backend-only",
33
- "build:exe": "cross-env NODE_ENV=production && bun run core/cli/index.ts build && bun run core/cli/index.ts build:exe",
34
- "start": "NODE_ENV=production bun dist/index.js",
35
- "create": "bun run core/cli/index.ts create",
36
- "cli": "bun run core/cli/index.ts",
37
- "make:component": "bun run core/cli/index.ts make:component",
38
- "sync-version": "bun run core/utils/sync-version.ts",
39
- "test": "vitest",
40
- "test:ui": "vitest --ui",
41
- "test:coverage": "vitest run --coverage",
42
- "typecheck:api": "tsc --noEmit -p tsconfig.api-strict.json",
43
- "test:e2e": "playwright test",
44
- "test:e2e:ui": "playwright test --ui",
45
- "test:e2e:headed": "playwright test --headed"
46
- },
47
- "devDependencies": {
48
- "@eslint/js": "^9.30.1",
49
- "@noble/curves": "1.2.0",
50
- "@noble/hashes": "1.3.2",
51
- "@playwright/test": "^1.58.2",
52
- "@tailwindcss/vite": "^4.1.13",
53
- "@testing-library/jest-dom": "^6.6.4",
54
- "@testing-library/react": "^16.3.0",
55
- "@testing-library/user-event": "^14.6.1",
56
- "@types/bun": "latest",
57
- "@types/node": "^24.5.2",
58
- "@types/react": "^19.1.8",
59
- "@types/react-dom": "^19.1.6",
60
- "@vitest/coverage-v8": "^3.2.4",
61
- "@vitest/ui": "^3.2.4",
62
- "baseline-browser-mapping": "^2.10.7",
63
- "cross-env": "^10.1.0",
64
- "eslint": "^9.30.1",
65
- "eslint-plugin-react-hooks": "^5.2.0",
66
- "eslint-plugin-react-refresh": "^0.4.20",
67
- "globals": "^16.3.0",
68
- "jsdom": "^26.1.0",
69
- "rollup": "4.20.0",
70
- "tailwindcss": "^4.1.13",
71
- "typescript": "^5.8.3",
72
- "typescript-eslint": "^8.35.1",
73
- "vite-plugin-checker": "^0.12.0",
74
- "vite-tsconfig-paths": "^6.0.5",
75
- "vitest": "^3.2.4"
76
- },
77
- "dependencies": {
78
- "@elysiajs/eden": "^1.3.2",
79
- "@elysiajs/swagger": "^1.3.1",
80
- "@fluxstack/config": "^1.0.0",
81
- "@fluxstack/live": "^0.6.0",
82
- "@fluxstack/live-client": "^0.6.0",
83
- "@fluxstack/live-elysia": "^0.6.0",
84
- "@fluxstack/live-react": "^0.6.0",
85
- "@fluxstack/plugin-crypto-auth": "^1.0.0",
86
- "@fluxstack/plugin-csrf-protection": "^1.1.0",
87
- "@vitejs/plugin-react": "^4.6.0",
88
- "chalk": "^5.3.0",
89
- "commander": "^12.1.0",
90
- "elysia": "^1.4.6",
91
- "lightningcss": "^1.30.1",
92
- "ora": "^8.1.0",
93
- "react": "^19.1.0",
94
- "react-dom": "^19.1.0",
95
- "react-icons": "^5.5.0",
96
- "react-router": "^7.9.3",
97
- "uuid": "^13.0.0",
98
- "vite": "^7.1.7",
99
- "winston": "^3.18.3",
100
- "winston-daily-rotate-file": "^5.0.0",
101
- "zustand": "^5.0.8"
102
- },
103
- "engines": {
104
- "bun": ">=1.2.0"
105
- },
106
- "preferredPackageManager": "bun"
107
- }
1
+ {
2
+ "name": "create-fluxstack",
3
+ "version": "1.20.0",
4
+ "description": "⚡ Revolutionary full-stack TypeScript framework with Declarative Config System, Elysia + React + Bun",
5
+ "keywords": [
6
+ "framework",
7
+ "full-stack",
8
+ "typescript",
9
+ "elysia",
10
+ "react",
11
+ "bun",
12
+ "vite"
13
+ ],
14
+ "author": "FluxStack Team",
15
+ "license": "MIT",
16
+ "homepage": "https://github.com/MarcosBrendonDePaula/FluxStack",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/MarcosBrendonDePaula/FluxStack.git"
20
+ },
21
+ "module": "app/server/index.ts",
22
+ "type": "module",
23
+ "bin": {
24
+ "create-fluxstack": "create-fluxstack.ts"
25
+ },
26
+ "scripts": {
27
+ "dev": "bun run core/cli/index.ts dev",
28
+ "dev:frontend": "bun run core/cli/index.ts dev --frontend-only",
29
+ "dev:backend": "bun run core/cli/index.ts dev --backend-only",
30
+ "build": "cross-env NODE_ENV=production bun run core/cli/index.ts build",
31
+ "build:frontend": "cross-env NODE_ENV=production bun run core/cli/index.ts build --frontend-only",
32
+ "build:backend": "cross-env NODE_ENV=production bun run core/cli/index.ts build --backend-only",
33
+ "build:exe": "cross-env NODE_ENV=production && bun run core/cli/index.ts build && bun run core/cli/index.ts build:exe",
34
+ "start": "NODE_ENV=production bun dist/index.js",
35
+ "create": "bun run core/cli/index.ts create",
36
+ "cli": "bun run core/cli/index.ts",
37
+ "make:component": "bun run core/cli/index.ts make:component",
38
+ "sync-version": "bun run core/utils/sync-version.ts",
39
+ "test": "vitest",
40
+ "test:ui": "vitest --ui",
41
+ "test:coverage": "vitest run --coverage",
42
+ "typecheck:api": "tsc --noEmit -p tsconfig.api-strict.json",
43
+ "test:e2e": "playwright test",
44
+ "test:e2e:ui": "playwright test --ui",
45
+ "test:e2e:headed": "playwright test --headed"
46
+ },
47
+ "devDependencies": {
48
+ "@eslint/js": "^9.30.1",
49
+ "@noble/curves": "1.2.0",
50
+ "@noble/hashes": "1.3.2",
51
+ "@playwright/test": "^1.58.2",
52
+ "@tailwindcss/vite": "^4.1.13",
53
+ "@testing-library/jest-dom": "^6.6.4",
54
+ "@testing-library/react": "^16.3.0",
55
+ "@testing-library/user-event": "^14.6.1",
56
+ "@types/bun": "latest",
57
+ "@types/node": "^24.5.2",
58
+ "@types/react": "^19.1.8",
59
+ "@types/react-dom": "^19.1.6",
60
+ "@vitest/coverage-v8": "^3.2.4",
61
+ "@vitest/ui": "^3.2.4",
62
+ "baseline-browser-mapping": "^2.10.7",
63
+ "cross-env": "^10.1.0",
64
+ "eslint": "^9.30.1",
65
+ "eslint-plugin-react-hooks": "^5.2.0",
66
+ "eslint-plugin-react-refresh": "^0.4.20",
67
+ "globals": "^16.3.0",
68
+ "jsdom": "^26.1.0",
69
+ "rollup": "4.20.0",
70
+ "tailwindcss": "^4.1.13",
71
+ "typescript": "^5.8.3",
72
+ "typescript-eslint": "^8.35.1",
73
+ "vite-plugin-checker": "^0.12.0",
74
+ "vite-tsconfig-paths": "^6.0.5",
75
+ "vitest": "^3.2.4"
76
+ },
77
+ "dependencies": {
78
+ "@elysiajs/eden": "^1.3.2",
79
+ "@elysiajs/swagger": "^1.3.1",
80
+ "@fluxstack/config": "^1.0.0",
81
+ "@fluxstack/live": "^0.8.0",
82
+ "@fluxstack/live-client": "^0.8.0",
83
+ "@fluxstack/live-elysia": "^0.7.1",
84
+ "@fluxstack/live-react": "^0.8.0",
85
+ "@fluxstack/plugin-kit": "^0.4.0",
86
+ "@fluxstack/plugin-crypto-auth": "^1.0.0",
87
+ "@fluxstack/plugin-csrf-protection": "^1.1.0",
88
+ "@vitejs/plugin-react": "^4.6.0",
89
+ "chalk": "^5.3.0",
90
+ "commander": "^12.1.0",
91
+ "elysia": "^1.4.6",
92
+ "lightningcss": "^1.30.1",
93
+ "ora": "^8.1.0",
94
+ "react": "^19.1.0",
95
+ "react-dom": "^19.1.0",
96
+ "react-icons": "^5.5.0",
97
+ "react-router": "^7.9.3",
98
+ "uuid": "^13.0.0",
99
+ "vite": "^7.1.7",
100
+ "winston": "^3.18.3",
101
+ "winston-daily-rotate-file": "^5.0.0",
102
+ "zustand": "^5.0.8"
103
+ },
104
+ "engines": {
105
+ "bun": ">=1.2.0"
106
+ },
107
+ "preferredPackageManager": "bun"
108
+ }
package/tsconfig.json CHANGED
@@ -31,7 +31,8 @@
31
31
  "@plugins/*": ["./plugins/*"],
32
32
  "@fluxstack/live": ["../fluxstack-live/packages/core/src/index.ts"],
33
33
  "@fluxstack/live-client": ["../fluxstack-live/packages/client/src/index.ts"],
34
- "@fluxstack/live-react": ["../fluxstack-live/packages/react/src/index.ts"]
34
+ "@fluxstack/live-react": ["../fluxstack-live/packages/react/src/index.ts"],
35
+ "@fluxstack/plugin-kit": ["../fluxstack-live/packages/plugin-kit/src/index.ts"]
35
36
  },
36
37
 
37
38
  // Best practices