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.
- package/CHANGELOG.md +132 -0
- package/LLMD/INDEX.md +1 -1
- package/LLMD/MAINTENANCE.md +197 -197
- package/LLMD/MIGRATION.md +44 -1
- package/LLMD/agent.md +20 -7
- package/LLMD/config/declarative-system.md +268 -268
- package/LLMD/config/environment-vars.md +3 -6
- package/LLMD/config/runtime-reload.md +401 -401
- package/LLMD/core/build-system.md +599 -599
- package/LLMD/core/framework-lifecycle.md +249 -229
- package/LLMD/core/plugin-system.md +154 -100
- package/LLMD/patterns/anti-patterns.md +397 -397
- package/LLMD/patterns/project-structure.md +264 -264
- package/LLMD/patterns/type-safety.md +61 -5
- package/LLMD/reference/cli-commands.md +31 -7
- package/LLMD/reference/plugin-hooks.md +4 -2
- package/LLMD/reference/troubleshooting.md +364 -364
- package/LLMD/resources/controllers.md +465 -465
- package/LLMD/resources/live-auth.md +178 -1
- package/LLMD/resources/live-binary-delta.md +3 -1
- package/LLMD/resources/live-components.md +1192 -1041
- package/LLMD/resources/live-logging.md +3 -1
- package/LLMD/resources/live-rooms.md +1 -1
- package/LLMD/resources/live-upload.md +228 -181
- package/LLMD/resources/plugins-external.md +8 -7
- package/LLMD/resources/rest-auth.md +290 -290
- package/LLMD/resources/routes-eden.md +254 -254
- package/app/client/src/App.tsx +7 -7
- package/app/client/src/components/AppLayout.tsx +60 -23
- package/app/client/src/components/ColorWheel.tsx +195 -0
- package/app/client/src/components/DemoPage.tsx +5 -3
- package/app/client/src/components/LiveUploadWidget.tsx +1 -1
- package/app/client/src/components/ThemePicker.tsx +307 -0
- package/app/client/src/config/theme.config.ts +127 -0
- package/app/client/src/hooks/useThemeClock.ts +66 -0
- package/app/client/src/index.css +193 -0
- package/app/client/src/lib/theme-clock.ts +201 -0
- package/app/client/src/live/AuthDemo.tsx +9 -9
- package/app/client/src/live/CounterDemo.tsx +10 -10
- package/app/client/src/live/FormDemo.tsx +8 -8
- package/app/client/src/live/PingPongDemo.tsx +10 -10
- package/app/client/src/live/RoomChatDemo.tsx +10 -10
- package/app/client/src/live/SharedCounterDemo.tsx +5 -5
- package/app/client/src/pages/ApiTestPage.tsx +5 -5
- package/app/client/src/pages/HomePage.tsx +12 -12
- package/app/server/index.ts +8 -0
- package/app/server/live/auto-generated-components.ts +1 -1
- package/core/build/index.ts +1 -1
- package/core/cli/command-registry.ts +1 -1
- package/core/cli/commands/build.ts +25 -6
- package/core/cli/commands/plugin-deps.ts +1 -2
- package/core/cli/generators/plugin.ts +433 -581
- package/core/framework/server.ts +22 -8
- package/core/index.ts +6 -5
- package/core/plugins/index.ts +71 -199
- package/core/plugins/types.ts +76 -461
- package/core/server/index.ts +1 -1
- package/core/utils/logger/startup-banner.ts +26 -4
- package/create-fluxstack.ts +216 -107
- package/package.json +108 -107
- package/tsconfig.json +2 -1
- package/core/plugins/config.ts +0 -356
- package/core/plugins/dependency-manager.ts +0 -481
- package/core/plugins/discovery.ts +0 -379
- package/core/plugins/executor.ts +0 -353
- package/core/plugins/manager.ts +0 -645
- package/core/plugins/module-resolver.ts +0 -227
- package/core/plugins/registry.ts +0 -913
- package/vitest.config.live.ts +0 -69
package/create-fluxstack.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
166
|
+
const framework = new FluxStackFramework()
|
|
167
|
+
.use(swaggerPlugin)
|
|
168
|
+
.use(myPlugin)
|
|
169
|
+
\`\`\`
|
|
128
170
|
|
|
129
|
-
|
|
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
|
-
|
|
133
|
-
bun run cli make:plugin my-plugin
|
|
134
|
-
bun run cli make:plugin my-plugin --template
|
|
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
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
│
|
|
152
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
169
|
-
|
|
170
|
-
export
|
|
171
|
-
name
|
|
172
|
-
version
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
//
|
|
195
|
-
async
|
|
196
|
-
console.
|
|
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
|
-
##
|
|
264
|
+
## ❌ Plugin as class — DON'T
|
|
208
265
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
-
|
|
212
|
-
|
|
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
|
|
271
|
+
## 💡 Common hook choices
|
|
216
272
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
|
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
|
-
|
|
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 {
|
|
504
|
+
import { csrfProtectionPlugin } from "@fluxstack/plugin-csrf-protection"
|
|
422
505
|
|
|
423
|
-
|
|
424
|
-
app.use(loggerPlugin)
|
|
425
|
-
app.use(swaggerPlugin)
|
|
506
|
+
framework.use(csrfProtectionPlugin)
|
|
426
507
|
\`\`\`
|
|
427
508
|
|
|
428
|
-
###
|
|
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
|
-
//
|
|
432
|
-
import {
|
|
433
|
-
|
|
434
|
-
export const
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
.
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
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
|
-
|
|
448
|
-
|
|
449
|
-
|
|
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
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
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.
|
|
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.
|
|
82
|
-
"@fluxstack/live-client": "^0.
|
|
83
|
-
"@fluxstack/live-elysia": "^0.
|
|
84
|
-
"@fluxstack/live-react": "^0.
|
|
85
|
-
"@fluxstack/plugin-
|
|
86
|
-
"@fluxstack/plugin-
|
|
87
|
-
"@
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"react
|
|
95
|
-
"react-
|
|
96
|
-
"react-
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"winston
|
|
101
|
-
"
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|