@fuzionx/framework 0.1.45 → 0.1.47

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 (92) hide show
  1. package/README.md +29 -2
  2. package/cli/index.js +37 -8
  3. package/cli/templates/make/app-spa/controllers/AuthController.js +114 -0
  4. package/cli/templates/make/app-spa/controllers/HomeController.js +66 -0
  5. package/cli/templates/make/app-spa/controllers/PostController.js +191 -0
  6. package/cli/templates/make/app-spa/controllers/UserController.js +43 -0
  7. package/cli/templates/make/app-spa/public/css/style.css +1011 -0
  8. package/cli/templates/make/app-spa/routes/api.js +31 -0
  9. package/cli/templates/make/app-spa/routes/web.js +19 -0
  10. package/cli/templates/make/app-spa/services/AuthService.js +48 -0
  11. package/cli/templates/make/app-spa/services/PostService.js +372 -0
  12. package/cli/templates/make/app-spa/services/UserService.js +48 -0
  13. package/cli/templates/make/app-spa/views/default/errors/404.html +11 -0
  14. package/cli/templates/make/app-spa/views/default/errors/500.html +11 -0
  15. package/cli/templates/make/app-spa/views/default/layouts/main.html +34 -0
  16. package/cli/templates/make/app-spa/views/default/pages/home.html +22 -0
  17. package/cli/templates/make/app-spa/views/default/spa/index.html +13 -0
  18. package/cli/templates/make/app-spa/views/default/spa/package.json +20 -0
  19. package/cli/templates/make/app-spa/views/default/spa/src/App.vue +41 -0
  20. package/cli/templates/make/app-spa/views/default/spa/src/assets/landing.css +220 -0
  21. package/cli/templates/make/app-spa/views/default/spa/src/assets/style.css +1156 -0
  22. package/cli/templates/make/app-spa/views/default/spa/src/components/AlertDialog.vue +179 -0
  23. package/cli/templates/make/app-spa/views/default/spa/src/components/CodeBlock.vue +33 -0
  24. package/cli/templates/make/app-spa/views/default/spa/src/components/EditorToolbar.vue +54 -0
  25. package/cli/templates/make/app-spa/views/default/spa/src/components/FileUpload.vue +161 -0
  26. package/cli/templates/make/app-spa/views/default/spa/src/components/FlashMessage.vue +39 -0
  27. package/cli/templates/make/app-spa/views/default/spa/src/components/LanguageSwitcher.vue +108 -0
  28. package/cli/templates/make/app-spa/views/default/spa/src/components/Lightbox.vue +62 -0
  29. package/cli/templates/make/app-spa/views/default/spa/src/components/Navbar.vue +68 -0
  30. package/cli/templates/make/app-spa/views/default/spa/src/components/Pagination.vue +166 -0
  31. package/cli/templates/make/app-spa/views/default/spa/src/components/ToastContainer.vue +135 -0
  32. package/cli/templates/make/app-spa/views/default/spa/src/composables/useApi.js +129 -0
  33. package/cli/templates/make/app-spa/views/default/spa/src/composables/useClipboard.js +44 -0
  34. package/cli/templates/make/app-spa/views/default/spa/src/composables/useDate.js +73 -0
  35. package/cli/templates/make/app-spa/views/default/spa/src/composables/useDebounce.js +59 -0
  36. package/cli/templates/make/app-spa/views/default/spa/src/composables/useFlash.js +46 -0
  37. package/cli/templates/make/app-spa/views/default/spa/src/composables/useHeartbeat.js +45 -0
  38. package/cli/templates/make/app-spa/views/default/spa/src/composables/useLocalStorage.js +43 -0
  39. package/cli/templates/make/app-spa/views/default/spa/src/composables/useLocale.js +79 -0
  40. package/cli/templates/make/app-spa/views/default/spa/src/composables/useWebSocket.js +93 -0
  41. package/cli/templates/make/app-spa/views/default/spa/src/main.js +106 -0
  42. package/cli/templates/make/app-spa/views/default/spa/src/plugins/alert.js +96 -0
  43. package/cli/templates/make/app-spa/views/default/spa/src/plugins/toast.js +79 -0
  44. package/cli/templates/make/app-spa/views/default/spa/src/router/index.js +29 -0
  45. package/cli/templates/make/app-spa/views/default/spa/src/stores/auth.js +58 -0
  46. package/cli/templates/make/app-spa/views/default/spa/src/views/BoardDetail.vue +169 -0
  47. package/cli/templates/make/app-spa/views/default/spa/src/views/BoardForm.vue +192 -0
  48. package/cli/templates/make/app-spa/views/default/spa/src/views/BoardList.vue +129 -0
  49. package/cli/templates/make/app-spa/views/default/spa/src/views/ChatView.vue +317 -0
  50. package/cli/templates/make/app-spa/views/default/spa/src/views/FeaturesView.vue +242 -0
  51. package/cli/templates/make/app-spa/views/default/spa/src/views/HomeView.vue +215 -0
  52. package/cli/templates/make/app-spa/views/default/spa/src/views/Login.vue +82 -0
  53. package/cli/templates/make/app-spa/views/default/spa/src/views/Profile.vue +85 -0
  54. package/cli/templates/make/app-spa/views/default/spa/src/views/Register.vue +84 -0
  55. package/cli/templates/make/app-spa/views/default/spa/vite.config.js +28 -0
  56. package/cli/templates/make/app-spa/views/default/spa/yarn.lock +633 -0
  57. package/cli/templates/make/app-spa/ws/ChatHandler.js +138 -0
  58. package/cli/templates/make/app-ssr/controllers/AuthController.js +119 -0
  59. package/cli/templates/make/app-ssr/controllers/ChatController.js +15 -0
  60. package/cli/templates/make/app-ssr/controllers/FeaturesController.js +15 -0
  61. package/cli/templates/make/app-ssr/controllers/HomeController.js +21 -0
  62. package/cli/templates/make/app-ssr/controllers/PostController.js +214 -0
  63. package/cli/templates/make/app-ssr/controllers/UserController.js +48 -0
  64. package/cli/templates/make/app-ssr/public/css/fx-ui.css +43 -0
  65. package/cli/templates/make/app-ssr/public/css/landing.css +220 -0
  66. package/cli/templates/make/app-ssr/public/css/style.css +1011 -0
  67. package/cli/templates/make/app-ssr/public/js/fx-client.js +107 -0
  68. package/cli/templates/make/app-ssr/public/js/fx-ui.js +124 -0
  69. package/cli/templates/make/app-ssr/routes/web.js +46 -0
  70. package/cli/templates/make/app-ssr/services/AuthService.js +48 -0
  71. package/cli/templates/make/app-ssr/services/PostService.js +372 -0
  72. package/cli/templates/make/app-ssr/services/UserService.js +48 -0
  73. package/cli/templates/make/app-ssr/views/default/errors/404.html +11 -0
  74. package/cli/templates/make/app-ssr/views/default/errors/500.html +48 -0
  75. package/cli/templates/make/app-ssr/views/default/layouts/main.html +96 -0
  76. package/cli/templates/make/app-ssr/views/default/pages/board/form.html +240 -0
  77. package/cli/templates/make/app-ssr/views/default/pages/board/index.html +73 -0
  78. package/cli/templates/make/app-ssr/views/default/pages/board/show.html +148 -0
  79. package/cli/templates/make/app-ssr/views/default/pages/chat.html +288 -0
  80. package/cli/templates/make/app-ssr/views/default/pages/features.html +373 -0
  81. package/cli/templates/make/app-ssr/views/default/pages/home.html +258 -0
  82. package/cli/templates/make/app-ssr/views/default/pages/login.html +27 -0
  83. package/cli/templates/make/app-ssr/views/default/pages/profile.html +36 -0
  84. package/cli/templates/make/app-ssr/views/default/pages/register.html +35 -0
  85. package/cli/templates/make/app-ssr/views/default/partials/pagination.html +75 -0
  86. package/cli/templates/make/app-ssr/ws/ChatHandler.js +138 -0
  87. package/lib/core/Application.js +425 -138
  88. package/lib/core/Context.js +540 -236
  89. package/lib/middleware/auth.js +1 -1
  90. package/lib/middleware/csrf.js +1 -1
  91. package/lib/middleware/session.js +5 -4
  92. package/package.json +2 -2
@@ -0,0 +1,373 @@
1
+ {% extends "layouts/main.html" %}
2
+ {% block title %}{{ t(key="feat.page_title", default="Features") }} — FuzionX Framework{% endblock %}
3
+ {% block description %}{{ t(key="feat.meta_desc", default="Explore FuzionX features: Rust N-API Bridge, Multi-DB ORM, WebSocket, Task Queue, and more.") }}{% endblock %}
4
+ {% block content %}
5
+
6
+ <!-- ── Page Header ── -->
7
+ <section class="section">
8
+ <div class="container">
9
+ <div class="section-header">
10
+ <div class="hero-badge" style="margin-bottom:1rem;">📖 {{ t(key="feat.badge", default="Framework Features") }}</div>
11
+ <h1 class="section-title">{{ t(key="feat.header_title_1", default="Built for") }} <span class="gradient-text">{{ t(key="feat.header_title_2", default="Production") }}</span></h1>
12
+ <p class="section-subtitle">{{ t(key="feat.header_sub", default="Every feature designed for performance, developer experience, and enterprise readiness.") }}</p>
13
+ </div>
14
+ </div>
15
+ </section>
16
+
17
+ <!-- ── Feature 1: Rust N-API Bridge ── -->
18
+ <section class="section section-dark" id="bridge">
19
+ <div class="container">
20
+ <div class="feat-detail">
21
+ <div class="feat-detail-header">
22
+ <span class="feat-detail-icon">⚡</span>
23
+ <div>
24
+ <h2 class="feat-detail-title">{{ t(key="feat.bridge_title", default="Rust N-API Bridge") }}</h2>
25
+ <p class="feat-detail-sub">{{ t(key="feat.bridge_sub", default="Native performance for core operations — no JavaScript overhead.") }}</p>
26
+ </div>
27
+ </div>
28
+ <div class="feat-detail-grid">
29
+ <div class="feat-detail-card">
30
+ <h4>500K+ RPS</h4>
31
+ <p>{{ t(key="feat.bridge_rps", default="The HTTP engine runs entirely in Rust through N-API, delivering throughput that JavaScript-based servers cannot match. Request parsing, routing, and response serialization happen at native speed.") }}</p>
32
+ </div>
33
+ <div class="feat-detail-card">
34
+ <h4>{{ t(key="feat.bridge_zerocopy", default="Zero-Copy File Uploads") }}</h4>
35
+ <p>{{ t(key="feat.bridge_zerocopy_desc", default="Multipart parsing happens in Rust. Files are written directly to disk — the file buffer never enters JavaScript memory, making large file uploads safe and efficient.") }}</p>
36
+ </div>
37
+ <div class="feat-detail-card">
38
+ <h4>{{ t(key="feat.bridge_crypto", default="Native Crypto") }}</h4>
39
+ <p>{{ t(key="feat.bridge_crypto_desc", default="bcrypt, argon2id, AES-256-GCM, SHA-256, MD5, UUID v4 — all executed in Rust. No crypto module overhead, no C++ addon compilation issues.") }}</p>
40
+ </div>
41
+ <div class="feat-detail-card">
42
+ <h4>{{ t(key="feat.bridge_media", default="Media Processing") }}</h4>
43
+ <p>{{ t(key="feat.bridge_media_desc", default="Image resizing (Lanczos3), WebP conversion, and video thumbnail extraction powered by Rust image crate and ffmpeg bindings.") }}</p>
44
+ </div>
45
+ </div>
46
+ <div class="feat-code-block">
47
+ <div class="code-header">
48
+ <span class="code-dot red"></span>
49
+ <span class="code-dot yellow"></span>
50
+ <span class="code-dot green"></span>
51
+ <span class="code-title">{{ t(key="feat.bridge_code_title", default="Native Performance — Zero JS Overhead") }}</span>
52
+ </div>
53
+ <pre class="code-body"><span class="code-cmt">// All these operations run in Rust — no JS overhead</span>
54
+ <span class="code-kw">const</span> hash = app.hash.<span class="code-fn">argon2</span>(password); <span class="code-cmt">// Rust argon2id</span>
55
+ <span class="code-kw">const</span> id = app.crypto.<span class="code-fn">uuid</span>(); <span class="code-cmt">// Rust UUID v4</span>
56
+ <span class="code-kw">const</span> enc = app.crypto.<span class="code-fn">encrypt</span>(key, plaintext); <span class="code-cmt">// Rust AES-256-GCM</span>
57
+ app.media.<span class="code-fn">resize</span>(input, output, <span class="code-num">800</span>, <span class="code-num">600</span>, <span class="code-str">'webp'</span>); <span class="code-cmt">// Rust image crate</span></pre>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </section>
62
+
63
+ <!-- ── Feature 2: Multi-DB ORM ── -->
64
+ <section class="section" id="orm">
65
+ <div class="container">
66
+ <div class="feat-detail">
67
+ <div class="feat-detail-header">
68
+ <span class="feat-detail-icon">🗄️</span>
69
+ <div>
70
+ <h2 class="feat-detail-title">{{ t(key="feat.orm_title", default="Multi-Database ORM") }}</h2>
71
+ <p class="feat-detail-sub">{{ t(key="feat.orm_sub", default="One API for MariaDB, PostgreSQL, and MongoDB. Model = Schema = Single source of truth.") }}</p>
72
+ </div>
73
+ </div>
74
+ <div class="feat-detail-grid">
75
+ <div class="feat-detail-card">
76
+ <h4>{{ t(key="feat.orm_unified", default="Unified Query API") }}</h4>
77
+ <p>{{ t(key="feat.orm_unified_desc", default="Write User.where('active', true).paginate(1, 20) and it works across all databases. No database-specific code needed for CRUD operations.") }}</p>
78
+ </div>
79
+ <div class="feat-detail-card">
80
+ <h4>{{ t(key="feat.orm_schema", default="Model-Based Schema Sync") }}</h4>
81
+ <p>{{ t(key="feat.orm_schema_desc", default="Define columns in the model with static columns, then run fx db:sync. No more writing migration files — the model IS the schema.") }}</p>
82
+ </div>
83
+ <div class="feat-detail-card">
84
+ <h4>{{ t(key="feat.orm_relations", default="Relationships") }}</h4>
85
+ <p>{{ t(key="feat.orm_relations_desc", default="hasMany, hasOne, belongsTo, belongsToMany — define relations as methods. Eager loading with .with('posts.comments').") }}</p>
86
+ </div>
87
+ <div class="feat-detail-card">
88
+ <h4>{{ t(key="feat.orm_access", default="3-Level Access") }}</h4>
89
+ <p>{{ t(key="feat.orm_access_desc", default="Unified API for 99% of cases → Raw Query for DB-specific features → Native driver access when you need full control.") }}</p>
90
+ </div>
91
+ </div>
92
+ <div class="feat-code-block">
93
+ <div class="code-header">
94
+ <span class="code-dot red"></span>
95
+ <span class="code-dot yellow"></span>
96
+ <span class="code-dot green"></span>
97
+ <span class="code-title">models/User.js</span>
98
+ </div>
99
+ <pre class="code-body"><span class="code-kw">import</span> { Model } <span class="code-kw">from</span> <span class="code-str">'@fuzionx/framework'</span>;
100
+
101
+ <span class="code-kw">export default class</span> <span class="code-fn">User</span> <span class="code-kw">extends</span> Model {
102
+ <span class="code-kw">static</span> table = <span class="code-str">'users'</span>;
103
+ <span class="code-kw">static</span> timestamps = <span class="code-num">true</span>;
104
+
105
+ <span class="code-kw">static</span> columns = {
106
+ id: { type: <span class="code-str">'increments'</span> },
107
+ name: { type: <span class="code-str">'string'</span>, length: <span class="code-num">100</span> },
108
+ email: { type: <span class="code-str">'string'</span>, length: <span class="code-num">150</span>, unique: <span class="code-num">true</span> },
109
+ };
110
+
111
+ <span class="code-fn">posts</span>() { <span class="code-kw">return</span> <span class="code-kw">this</span>.hasMany(<span class="code-str">'Post'</span>); }
112
+ <span class="code-fn">profile</span>() { <span class="code-kw">return</span> <span class="code-kw">this</span>.hasOne(<span class="code-str">'Profile'</span>); }
113
+ }</pre>
114
+ </div>
115
+ </div>
116
+ </div>
117
+ </section>
118
+
119
+ <!-- ── Feature 3: SSR + SPA ── -->
120
+ <section class="section section-dark" id="rendering">
121
+ <div class="container">
122
+ <div class="feat-detail">
123
+ <div class="feat-detail-header">
124
+ <span class="feat-detail-icon">🎨</span>
125
+ <div>
126
+ <h2 class="feat-detail-title">{{ t(key="feat.ssr_title", default="SSR + SPA Hybrid") }}</h2>
127
+ <p class="feat-detail-sub">{{ t(key="feat.ssr_sub", default="Server-rendered pages and single-page apps in one project with domain routing.") }}</p>
128
+ </div>
129
+ </div>
130
+ <div class="feat-detail-grid">
131
+ <div class="feat-detail-card">
132
+ <h4>{{ t(key="feat.ssr_tera", default="Tera Template Engine") }}</h4>
133
+ <p>{{ t(key="feat.ssr_tera_desc", default="Jinja2-compatible template engine compiled in Rust. Layouts, blocks, inheritance, filters, and macros for fast SSR rendering.") }}</p>
134
+ </div>
135
+ <div class="feat-detail-card">
136
+ <h4>{{ t(key="feat.ssr_theme", default="Theme System") }}</h4>
137
+ <p>{{ t(key="feat.ssr_theme_desc", default="Multiple view themes with views/{theme}/ structure. Switch themes via config without changing any controller code.") }}</p>
138
+ </div>
139
+ <div class="feat-detail-card">
140
+ <h4>{{ t(key="feat.ssr_multiapp", default="Multi-App Routing") }}</h4>
141
+ <p>{{ t(key="feat.ssr_multiapp_desc", default="Route different domains to different apps: api.example.com → spa, www.example.com → ssr. One codebase, multiple frontends.") }}</p>
142
+ </div>
143
+ <div class="feat-detail-card">
144
+ <h4>{{ t(key="feat.ssr_i18n", default="Built-in i18n") }}</h4>
145
+ <p>{{ t(key="feat.ssr_i18n_desc", default="JSON-based translations with auto-detection, fallback locales, and missing key auto-complete.") }} <code>ctx.t('key')</code> / <code>{{ "{{" }} t(key="...") }}</code></p>
146
+ </div>
147
+ </div>
148
+ </div>
149
+ </div>
150
+ </section>
151
+
152
+ <!-- ── Feature 4: WebSocket ── -->
153
+ <section class="section" id="websocket">
154
+ <div class="container">
155
+ <div class="feat-detail">
156
+ <div class="feat-detail-header">
157
+ <span class="feat-detail-icon">🔌</span>
158
+ <div>
159
+ <h2 class="feat-detail-title">{{ t(key="feat.ws_title", default="Real-time WebSocket") }}</h2>
160
+ <p class="feat-detail-sub">{{ t(key="feat.ws_sub", default="Namespace-based event routing with rooms, middleware sharing, and multi-server Hub.") }}</p>
161
+ </div>
162
+ </div>
163
+ <div class="feat-detail-grid">
164
+ <div class="feat-detail-card">
165
+ <h4>{{ t(key="feat.ws_dsl", default="Event Routing DSL") }}</h4>
166
+ <p>{{ t(key="feat.ws_dsl_desc", default="static events(e) declares event → handler mappings, just like controller routes. Clean, declarative, and auto-scanned from ws/ folder.") }}</p>
167
+ </div>
168
+ <div class="feat-detail-card">
169
+ <h4>{{ t(key="feat.ws_rooms", default="Rooms") }}</h4>
170
+ <p>{{ t(key="feat.ws_rooms_desc", default="socket.join('room:123'), socket.to('room:123').send({...}) — built-in room management without external libraries.") }}</p>
171
+ </div>
172
+ <div class="feat-detail-card">
173
+ <h4>{{ t(key="feat.ws_middleware", default="Middleware Sharing") }}</h4>
174
+ <p>{{ t(key="feat.ws_middleware_desc", default="Reuse the same HTTP middleware for WebSocket handshake. Auth middleware works for both HTTP and WS connections.") }}</p>
175
+ </div>
176
+ <div class="feat-detail-card">
177
+ <h4>{{ t(key="feat.ws_hub", default="Hub Broadcasting") }}</h4>
178
+ <p>{{ t(key="feat.ws_hub_desc", default="Multi-server? Just add { hub: true } to broadcast. Messages route through Hub server to all connected instances.") }}</p>
179
+ </div>
180
+ </div>
181
+ <div class="feat-code-block">
182
+ <div class="code-header">
183
+ <span class="code-dot red"></span>
184
+ <span class="code-dot yellow"></span>
185
+ <span class="code-dot green"></span>
186
+ <span class="code-title">ws/ChatHandler.js</span>
187
+ </div>
188
+ <pre class="code-body"><span class="code-kw">import</span> { WsHandler } <span class="code-kw">from</span> <span class="code-str">'@fuzionx/framework'</span>;
189
+
190
+ <span class="code-kw">export default class</span> <span class="code-fn">ChatHandler</span> <span class="code-kw">extends</span> WsHandler {
191
+ <span class="code-kw">static</span> namespace = <span class="code-str">'/chat'</span>;
192
+ <span class="code-kw">static</span> middleware = [<span class="code-str">'auth'</span>];
193
+
194
+ <span class="code-kw">static</span> <span class="code-fn">events</span>(e) {
195
+ e.on(<span class="code-str">'chat'</span>, <span class="code-kw">this</span>.handleChat);
196
+ e.on(<span class="code-str">'typing'</span>, <span class="code-kw">this</span>.handleTyping);
197
+ }
198
+
199
+ <span class="code-fn">handleChat</span>(socket, data) {
200
+ socket.to(<span class="code-str">`room:${data.roomId}`</span>).send({
201
+ type: <span class="code-str">'chat'</span>,
202
+ data: { user: socket.user, message: data.message }
203
+ });
204
+ }
205
+ }</pre>
206
+ </div>
207
+ <div style="text-align:center; margin-top:2rem;">
208
+ <a href="/chat" class="btn btn-hero-primary"><span>{{ t(key="feat.btn_try_chat", default="Try Live Chat Demo →") }}</span></a>
209
+ </div>
210
+ </div>
211
+ </div>
212
+ </section>
213
+
214
+ <!-- ── Feature 5: Task Queue ── -->
215
+ <section class="section section-dark" id="queue">
216
+ <div class="container">
217
+ <div class="feat-detail">
218
+ <div class="feat-detail-header">
219
+ <span class="feat-detail-icon">⏰</span>
220
+ <div>
221
+ <h2 class="feat-detail-title">{{ t(key="feat.queue_title", default="Task Queue + Workers") }}</h2>
222
+ <p class="feat-detail-sub">{{ t(key="feat.queue_sub", default="Three ways to handle background work — scheduled, queued, and CPU-isolated.") }}</p>
223
+ </div>
224
+ </div>
225
+ <div class="feat-detail-grid feat-detail-grid-3">
226
+ <div class="feat-detail-card">
227
+ <h4>📅 {{ t(key="feat.queue_scheduled", default="Scheduled Jobs") }}</h4>
228
+ <p>{{ t(key="feat.queue_scheduled_desc", default="Cron-based recurring tasks. static schedule = 'daily:02:00'. Runs on master process with Redis distributed lock for multi-server.") }}</p>
229
+ </div>
230
+ <div class="feat-detail-card">
231
+ <h4>📬 {{ t(key="feat.queue_queued", default="Queued Tasks") }}</h4>
232
+ <p>{{ t(key="feat.queue_queued_desc", default="Async dispatch with retries: app.dispatch('SendEmail', data). Memory or Redis backend. Failed tasks call failed() hook.") }}</p>
233
+ </div>
234
+ <div class="feat-detail-card">
235
+ <h4>🧵 WorkerPool</h4>
236
+ <p>{{ t(key="feat.queue_worker_desc", default="CPU-heavy work in worker_threads: app.worker.run('csv-parser', data). Prevents event loop blocking. Timeout + auto-cleanup.") }}</p>
237
+ </div>
238
+ </div>
239
+ <div class="feat-code-block">
240
+ <div class="code-header">
241
+ <span class="code-dot red"></span>
242
+ <span class="code-dot yellow"></span>
243
+ <span class="code-dot green"></span>
244
+ <span class="code-title">jobs/SendWelcomeEmail.js</span>
245
+ </div>
246
+ <pre class="code-body"><span class="code-kw">import</span> { Task } <span class="code-kw">from</span> <span class="code-str">'@fuzionx/framework'</span>;
247
+
248
+ <span class="code-kw">export default class</span> <span class="code-fn">SendWelcomeEmail</span> <span class="code-kw">extends</span> Task {
249
+ <span class="code-kw">static</span> queue = <span class="code-str">'emails'</span>;
250
+ <span class="code-kw">static</span> retries = <span class="code-num">3</span>;
251
+
252
+ <span class="code-kw">async</span> <span class="code-fn">handle</span>(data) {
253
+ <span class="code-kw">const</span> user = <span class="code-kw">await</span> <span class="code-kw">this</span>.db.User.find(data.userId);
254
+ <span class="code-kw">await</span> <span class="code-kw">this</span>.service(<span class="code-str">'MailService'</span>).sendWelcome(user.email);
255
+ }
256
+
257
+ <span class="code-kw">async</span> <span class="code-fn">failed</span>(data, error) {
258
+ <span class="code-kw">this</span>.logger.error(<span class="code-str">'Email failed'</span>, { userId: data.userId });
259
+ }
260
+ }</pre>
261
+ </div>
262
+ </div>
263
+ </div>
264
+ </section>
265
+
266
+ <!-- ── Feature 6: Security ── -->
267
+ <section class="section" id="security">
268
+ <div class="container">
269
+ <div class="feat-detail">
270
+ <div class="feat-detail-header">
271
+ <span class="feat-detail-icon">🔐</span>
272
+ <div>
273
+ <h2 class="feat-detail-title">{{ t(key="feat.sec_title", default="Enterprise Security") }}</h2>
274
+ <p class="feat-detail-sub">{{ t(key="feat.sec_sub", default="Production-grade security built into every layer — from wire encryption to password hashing.") }}</p>
275
+ </div>
276
+ </div>
277
+ <div class="feat-detail-grid">
278
+ <div class="feat-detail-card">
279
+ <h4>{{ t(key="feat.sec_asp", default="ASP Wire Encryption") }}</h4>
280
+ <p>{{ t(key="feat.sec_asp_desc", default="FuzionX Stealth Protocol encrypts all HTTP request/response bodies on the wire. Transparent to application code, impenetrable to MITM attacks.") }}</p>
281
+ </div>
282
+ <div class="feat-detail-card">
283
+ <h4>{{ t(key="feat.sec_hash", default="Native Password Hashing") }}</h4>
284
+ <p>{{ t(key="feat.sec_hash_desc", default="bcrypt (cost 12) and argon2id hashing in Rust — orders of magnitude faster than JavaScript implementations with the same security guarantees.") }}</p>
285
+ </div>
286
+ <div class="feat-detail-card">
287
+ <h4>{{ t(key="feat.sec_session", default="Session + JWT Auth") }}</h4>
288
+ <p>{{ t(key="feat.sec_session_desc", default="File-based or Redis session store. JWT access/refresh token rotation. Built-in auth() middleware with route guards.") }}</p>
289
+ </div>
290
+ <div class="feat-detail-card">
291
+ <h4>{{ t(key="feat.sec_rate", default="Rate Limiting + CSRF") }}</h4>
292
+ <p>{{ t(key="feat.sec_rate_desc", default="Per-IP rate limiting in the Rust bridge layer. CSRF token generation and validation. IP whitelist/blacklist. HSTS and CSP headers.") }}</p>
293
+ </div>
294
+ </div>
295
+ </div>
296
+ </div>
297
+ </section>
298
+
299
+ <!-- ── Feature 7: DX ── -->
300
+ <section class="section section-dark" id="dx">
301
+ <div class="container">
302
+ <div class="feat-detail">
303
+ <div class="feat-detail-header">
304
+ <span class="feat-detail-icon">🛠️</span>
305
+ <div>
306
+ <h2 class="feat-detail-title">{{ t(key="feat.dx_title", default="Developer Experience") }}</h2>
307
+ <p class="feat-detail-sub">{{ t(key="feat.dx_sub", default="CLI scaffolding, auto-scanning, hot reload, OpenAPI docs — everything to keep you productive.") }}</p>
308
+ </div>
309
+ </div>
310
+ <div class="feat-detail-grid">
311
+ <div class="feat-detail-card">
312
+ <h4>{{ t(key="feat.dx_cli", default="CLI Code Generator") }}</h4>
313
+ <p>{{ t(key="feat.dx_cli_desc", default="fx make:controller, fx make:model, fx make:service — scaffold any component instantly with proper boilerplate.") }}</p>
314
+ </div>
315
+ <div class="feat-detail-card">
316
+ <h4>{{ t(key="feat.dx_autoscan", default="Auto-Scanning") }}</h4>
317
+ <p>{{ t(key="feat.dx_autoscan_desc", default="Drop a file in controllers/, services/, ws/, or jobs/ — the framework discovers and registers it automatically. Zero manual wiring.") }}</p>
318
+ </div>
319
+ <div class="feat-detail-card">
320
+ <h4>{{ t(key="feat.dx_openapi", default="OpenAPI Auto-Generation") }}</h4>
321
+ <p>{{ t(key="feat.dx_openapi_desc", default="Swagger UI at /docs with zero configuration. Route definitions are automatically converted to OpenAPI 3.0 spec.") }}</p>
322
+ </div>
323
+ <div class="feat-detail-card">
324
+ <h4>{{ t(key="feat.dx_test", default="Testing Helpers") }}</h4>
325
+ <p>{{ t(key="feat.dx_test_desc", default="In-process HTTP test client, database transaction rollbacks, isolated test contexts. vitest integration out of the box.") }}</p>
326
+ </div>
327
+ </div>
328
+ <div class="feat-code-block">
329
+ <div class="code-header">
330
+ <span class="code-dot red"></span>
331
+ <span class="code-dot yellow"></span>
332
+ <span class="code-dot green"></span>
333
+ <span class="code-title">Terminal</span>
334
+ </div>
335
+ <pre class="code-body"><span class="code-cmt">$ npx create-fuzionx my-app</span>
336
+ <span class="code-cmt">$ cd my-app</span>
337
+ <span class="code-cmt">$ fx make:controller User</span> <span class="code-str"># → controllers/UserController.js</span>
338
+ <span class="code-cmt">$ fx make:model User</span> <span class="code-str"># → models/User.js</span>
339
+ <span class="code-cmt">$ fx make:service User</span> <span class="code-str"># → services/UserService.js</span>
340
+ <span class="code-cmt">$ fx db:sync --apply</span> <span class="code-str"># → Schema synced ✓</span>
341
+ <span class="code-cmt">$ fx dev</span> <span class="code-str"># → 🚀 Running on http://localhost:3000</span></pre>
342
+ </div>
343
+ </div>
344
+ </div>
345
+ </section>
346
+
347
+ <!-- ── CTA ── -->
348
+ <section class="cta-section">
349
+ <div class="container">
350
+ <div class="cta-card glass-card">
351
+ <h2 class="cta-title">{{ t(key="feat.cta_title_1", default="Start Building") }} <span class="gradient-text">{{ t(key="feat.cta_title_2", default="Today") }}</span></h2>
352
+ <p class="cta-subtitle">{{ t(key="feat.cta_sub", default="One command to scaffold. Zero configuration to start.") }}</p>
353
+ <div class="cta-install">
354
+ <code>npx create-fuzionx my-app</code>
355
+ </div>
356
+ <div class="hero-actions" style="margin-top: 1.5rem;">
357
+ <a href="/" class="btn btn-hero-outline"><span>← {{ t(key="feat.btn_back", default="Back to Home") }}</span></a>
358
+ <a href="/chat" class="btn btn-hero-primary"><span>{{ t(key="feat.btn_chat", default="Try Chat Demo") }}</span></a>
359
+ </div>
360
+ </div>
361
+ </div>
362
+ </section>
363
+
364
+ <footer class="site-footer">
365
+ <div class="container">
366
+ <div class="footer-content">
367
+ <span class="footer-brand">FuzionX</span>
368
+ <span class="footer-text">{{ t(key="home.footer", default="Rust-powered Node.js framework for the modern web.") }}</span>
369
+ </div>
370
+ </div>
371
+ </footer>
372
+
373
+ {% endblock %}
@@ -0,0 +1,258 @@
1
+ {% extends "layouts/main.html" %}
2
+ {% block title %}FuzionX — {{ t(key="home.title", default="Rust-Powered Full-Stack Node.js Framework") }}{% endblock %}
3
+ {% block description %}{{ t(key="home.meta_desc", default="Build blazing-fast web applications with FuzionX. Rust N-API bridge delivering 500K+ RPS, multi-DB ORM, real-time WebSocket, and enterprise-grade security.") }}{% endblock %}
4
+ {% block content %}
5
+
6
+ <!-- ── Hero Section ── -->
7
+ <section class="hero-section">
8
+ <div class="hero-particles">
9
+ <div class="particle p1"></div>
10
+ <div class="particle p2"></div>
11
+ <div class="particle p3"></div>
12
+ <div class="particle p4"></div>
13
+ <div class="particle p5"></div>
14
+ <div class="particle p6"></div>
15
+ </div>
16
+ <div class="container hero-container">
17
+ <div class="hero-badge">⚡ {{ t(key="home.hero_badge", default="Powered by Rust N-API") }}</div>
18
+ <h1 class="hero-title">
19
+ {{ t(key="home.hero_title_1", default="Build") }} <span class="gradient-text">{{ t(key="home.hero_title_2", default="Blazing Fast") }}</span><br>
20
+ {{ t(key="home.hero_title_3", default="Web Applications") }}
21
+ </h1>
22
+ <p class="hero-subtitle">
23
+ {{ t(key="home.hero_sub_1", default="Full-stack MVC framework for Node.js with a Rust-powered core engine.") }}<br>
24
+ {{ t(key="home.hero_sub_2", default="500K+ requests per second. Zero-copy file handling. Native-speed crypto.") }}
25
+ </p>
26
+ <div class="hero-actions">
27
+ <a href="/features" class="btn btn-hero-primary">
28
+ <span>{{ t(key="home.btn_features", default="Explore Features") }}</span>
29
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8h10M9 4l4 4-4 4" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
30
+ </a>
31
+ <a href="/chat" class="btn btn-hero-outline">
32
+ <span>{{ t(key="home.btn_demo", default="Live Demo") }}</span>
33
+ </a>
34
+ </div>
35
+ <div class="hero-code">
36
+ <div class="code-header">
37
+ <span class="code-dot red"></span>
38
+ <span class="code-dot yellow"></span>
39
+ <span class="code-dot green"></span>
40
+ <span class="code-title">app.js</span>
41
+ </div>
42
+ <pre class="code-body"><span class="code-kw">import</span> { Application } <span class="code-kw">from</span> <span class="code-str">'@fuzionx/framework'</span>;
43
+
44
+ <span class="code-kw">const</span> app = <span class="code-kw">new</span> <span class="code-fn">Application</span>({ configPath: <span class="code-str">'./fuzionx.yaml'</span> });
45
+
46
+ <span class="code-kw">await</span> app.<span class="code-fn">boot</span>();
47
+ <span class="code-kw">await</span> app.<span class="code-fn">listen</span>(); <span class="code-cmt">// 🚀 500K+ RPS ready</span></pre>
48
+ </div>
49
+ </div>
50
+ </section>
51
+
52
+ <!-- ── Stats Bar ── -->
53
+ <section class="stats-bar">
54
+ <div class="container">
55
+ <div class="stats-bar-grid">
56
+ <div class="stat-bar-item">
57
+ <span class="stat-bar-number">500K+</span>
58
+ <span class="stat-bar-label">{{ t(key="home.stat_rps", default="Requests/sec") }}</span>
59
+ </div>
60
+ <div class="stat-bar-divider"></div>
61
+ <div class="stat-bar-item">
62
+ <span class="stat-bar-number">3</span>
63
+ <span class="stat-bar-label">{{ t(key="home.stat_db", default="Database Drivers") }}</span>
64
+ </div>
65
+ <div class="stat-bar-divider"></div>
66
+ <div class="stat-bar-item">
67
+ <span class="stat-bar-number">0</span>
68
+ <span class="stat-bar-label">{{ t(key="home.stat_zero_copy", default="Memory Copy Uploads") }}</span>
69
+ </div>
70
+ <div class="stat-bar-divider"></div>
71
+ <div class="stat-bar-item">
72
+ <span class="stat-bar-number">21</span>
73
+ <span class="stat-bar-label">{{ t(key="home.stat_modules", default="Core Modules") }}</span>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </section>
78
+
79
+ <!-- ── Core Features Grid ── -->
80
+ <section class="section">
81
+ <div class="container">
82
+ <div class="section-header">
83
+ <h2 class="section-title">{{ t(key="home.feat_title_1", default="Everything You Need.") }}<br><span class="gradient-text">{{ t(key="home.feat_title_2", default="Nothing You Don't.") }}</span></h2>
84
+ <p class="section-subtitle">{{ t(key="home.feat_subtitle", default="A production-ready framework that ships with batteries included — powered by Rust under the hood.") }}</p>
85
+ </div>
86
+ <div class="features-showcase">
87
+ <div class="feature-showcase-card">
88
+ <div class="feature-icon-wrap"><span class="feature-icon">⚡</span></div>
89
+ <h3>{{ t(key="home.feat_bridge", default="Rust N-API Bridge") }}</h3>
90
+ <p>{{ t(key="home.feat_bridge_desc", default="HTTP server, session management, cryptography, and file processing at native speed. No JavaScript overhead for core operations.") }}</p>
91
+ <span class="feature-tag tag-rust">Rust</span>
92
+ </div>
93
+ <div class="feature-showcase-card">
94
+ <div class="feature-icon-wrap"><span class="feature-icon">🗄️</span></div>
95
+ <h3>{{ t(key="home.feat_orm", default="Multi-DB ORM") }}</h3>
96
+ <p>{{ t(key="home.feat_orm_desc", default="One unified API for MariaDB, PostgreSQL, and MongoDB. Model-based schema sync replaces migration files.") }}</p>
97
+ <span class="feature-tag tag-node">Node.js</span>
98
+ </div>
99
+ <div class="feature-showcase-card">
100
+ <div class="feature-icon-wrap"><span class="feature-icon">🔌</span></div>
101
+ <h3>{{ t(key="home.feat_ws", default="Real-time WebSocket") }}</h3>
102
+ <p>{{ t(key="home.feat_ws_desc", default="Namespace routing, rooms, event-based handlers, and multi-server Hub broadcasting built into the framework.") }}</p>
103
+ <span class="feature-tag tag-ws">WebSocket</span>
104
+ </div>
105
+ <div class="feature-showcase-card">
106
+ <div class="feature-icon-wrap"><span class="feature-icon">🎨</span></div>
107
+ <h3>{{ t(key="home.feat_ssr", default="SSR + SPA Hybrid") }}</h3>
108
+ <p>{{ t(key="home.feat_ssr_desc", default="Tera template engine for SSR pages alongside Vue.js SPA — run both in a single project with domain-based routing.") }}</p>
109
+ <span class="feature-tag tag-node">Hybrid</span>
110
+ </div>
111
+ <div class="feature-showcase-card">
112
+ <div class="feature-icon-wrap"><span class="feature-icon">🔐</span></div>
113
+ <h3>{{ t(key="home.feat_security", default="Enterprise Security") }}</h3>
114
+ <p>{{ t(key="home.feat_security_desc", default="Native bcrypt/argon2 hashing, AES-256-GCM encryption, ASP wire protocol, CSRF protection, and rate limiting.") }}</p>
115
+ <span class="feature-tag tag-rust">Rust</span>
116
+ </div>
117
+ <div class="feature-showcase-card">
118
+ <div class="feature-icon-wrap"><span class="feature-icon">⏰</span></div>
119
+ <h3>{{ t(key="home.feat_queue", default="Task Queue + Workers") }}</h3>
120
+ <p>{{ t(key="home.feat_queue_desc", default="Scheduled jobs (cron), async task queues with retry logic, and WorkerPool for CPU-heavy operations in isolated threads.") }}</p>
121
+ <span class="feature-tag tag-node">Node.js</span>
122
+ </div>
123
+ </div>
124
+ </div>
125
+ </section>
126
+
127
+ <!-- ── Architecture ── -->
128
+ <section class="section section-dark">
129
+ <div class="container">
130
+ <div class="section-header">
131
+ <h2 class="section-title">{{ t(key="home.arch_title_1", default="Layered") }} <span class="gradient-text">{{ t(key="home.arch_title_2", default="Architecture") }}</span></h2>
132
+ <p class="section-subtitle">{{ t(key="home.arch_subtitle", default="Three-tier design separating concerns for maximum performance and developer ergonomics.") }}</p>
133
+ </div>
134
+ <div class="arch-layers">
135
+ <div class="arch-layer arch-layer-top">
136
+ <div class="arch-layer-badge">{{ t(key="home.arch_you_write", default="You Write") }}</div>
137
+ <h4>@fuzionx/framework</h4>
138
+ <p>{{ t(key="home.arch_framework_desc", default="Controllers, Services, Models, Middleware, WebSocket Handlers, Jobs — Laravel-style MVC with full DI container") }}</p>
139
+ </div>
140
+ <div class="arch-connector">
141
+ <svg width="24" height="30" viewBox="0 0 24 30"><path d="M12 0v24M6 18l6 6 6-6" stroke="rgba(102,126,234,0.6)" stroke-width="2" fill="none" stroke-linecap="round"/></svg>
142
+ </div>
143
+ <div class="arch-layer arch-layer-mid">
144
+ <div class="arch-layer-badge">{{ t(key="home.arch_engine", default="Engine") }}</div>
145
+ <h4>@fuzionx/core</h4>
146
+ <p>{{ t(key="home.arch_core_desc", default="Express-level HTTP engine wrapping the Rust bridge. Routing, request/response lifecycle, WebSocket server.") }}</p>
147
+ </div>
148
+ <div class="arch-connector">
149
+ <svg width="24" height="30" viewBox="0 0 24 30"><path d="M12 0v24M6 18l6 6 6-6" stroke="rgba(118,75,162,0.6)" stroke-width="2" fill="none" stroke-linecap="round"/></svg>
150
+ </div>
151
+ <div class="arch-layer arch-layer-bottom">
152
+ <div class="arch-layer-badge">{{ t(key="home.arch_native", default="Native") }}</div>
153
+ <h4>@fuzionx/bridge</h4>
154
+ <p>{{ t(key="home.arch_bridge_desc", default="Rust N-API binary — libuv Fusion HTTP, native crypto, media processing, file I/O. Zero-copy where possible.") }}</p>
155
+ </div>
156
+ </div>
157
+ </div>
158
+ </section>
159
+
160
+ <!-- ── Comparison ── -->
161
+ <section class="section">
162
+ <div class="container">
163
+ <div class="section-header">
164
+ <h2 class="section-title">{{ t(key="home.why_title_1", default="Why") }} <span class="gradient-text">FuzionX</span>?</h2>
165
+ <p class="section-subtitle">{{ t(key="home.why_subtitle", default="See how FuzionX stacks up against popular Node.js frameworks.") }}</p>
166
+ </div>
167
+ <div class="comparison-table-wrap">
168
+ <table class="comparison-table">
169
+ <thead>
170
+ <tr>
171
+ <th>{{ t(key="home.cmp_feature", default="Feature") }}</th>
172
+ <th class="highlight-col">FuzionX</th>
173
+ <th>Express</th>
174
+ <th>NestJS</th>
175
+ </tr>
176
+ </thead>
177
+ <tbody>
178
+ <tr>
179
+ <td>{{ t(key="home.cmp_http", default="HTTP Engine") }}</td>
180
+ <td class="highlight-col"><span class="check">✓</span> Rust N-API</td>
181
+ <td>JavaScript</td>
182
+ <td>JavaScript</td>
183
+ </tr>
184
+ <tr>
185
+ <td>{{ t(key="home.cmp_orm", default="ORM Built-in") }}</td>
186
+ <td class="highlight-col"><span class="check">✓</span> Multi-DB</td>
187
+ <td><span class="cross">✗</span> {{ t(key="home.cmp_3rd_party", default="3rd party") }}</td>
188
+ <td><span class="cross">✗</span> TypeORM plugin</td>
189
+ </tr>
190
+ <tr>
191
+ <td>WebSocket</td>
192
+ <td class="highlight-col"><span class="check">✓</span> Native + Hub</td>
193
+ <td><span class="cross">✗</span> socket.io</td>
194
+ <td><span class="cross">✗</span> Gateway plugin</td>
195
+ </tr>
196
+ <tr>
197
+ <td>{{ t(key="home.cmp_upload", default="File Upload") }}</td>
198
+ <td class="highlight-col"><span class="check">✓</span> Zero-copy Rust</td>
199
+ <td>multer (JS memory)</td>
200
+ <td>multer (JS memory)</td>
201
+ </tr>
202
+ <tr>
203
+ <td>Crypto/Hash</td>
204
+ <td class="highlight-col"><span class="check">✓</span> Native Rust</td>
205
+ <td>Node.js crypto</td>
206
+ <td>Node.js crypto</td>
207
+ </tr>
208
+ <tr>
209
+ <td>{{ t(key="home.cmp_queue", default="Task Queue") }}</td>
210
+ <td class="highlight-col"><span class="check">✓</span> {{ t(key="home.cmp_builtin", default="Built-in") }}</td>
211
+ <td><span class="cross">✗</span> bull/agenda</td>
212
+ <td><span class="cross">✗</span> bull plugin</td>
213
+ </tr>
214
+ <tr>
215
+ <td>{{ t(key="home.cmp_schema", default="Schema Sync") }}</td>
216
+ <td class="highlight-col"><span class="check">✓</span> {{ t(key="home.cmp_model_based", default="Model-based") }}</td>
217
+ <td><span class="cross">✗</span> N/A</td>
218
+ <td><span class="cross">✗</span> Migrations</td>
219
+ </tr>
220
+ <tr>
221
+ <td>i18n</td>
222
+ <td class="highlight-col"><span class="check">✓</span> {{ t(key="home.cmp_builtin", default="Built-in") }}</td>
223
+ <td><span class="cross">✗</span> i18next</td>
224
+ <td><span class="cross">✗</span> nestjs-i18n</td>
225
+ </tr>
226
+ </tbody>
227
+ </table>
228
+ </div>
229
+ </div>
230
+ </section>
231
+
232
+ <!-- ── CTA ── -->
233
+ <section class="cta-section">
234
+ <div class="container">
235
+ <div class="cta-card glass-card">
236
+ <h2 class="cta-title">{{ t(key="home.cta_title_1", default="Ready to Build") }} <span class="gradient-text">{{ t(key="home.cta_title_2", default="Something Fast") }}</span>?</h2>
237
+ <p class="cta-subtitle">{{ t(key="home.cta_subtitle", default="Get started with FuzionX in seconds. One command, zero configuration.") }}</p>
238
+ <div class="cta-install">
239
+ <code>npx create-fuzionx my-app</code>
240
+ </div>
241
+ <div class="hero-actions" style="margin-top: 1.5rem;">
242
+ <a href="/features" class="btn btn-hero-primary"><span>{{ t(key="home.btn_all_features", default="View All Features") }}</span></a>
243
+ <a href="/chat" class="btn btn-hero-outline"><span>{{ t(key="home.btn_try_chat", default="Try Chat Demo") }}</span></a>
244
+ </div>
245
+ </div>
246
+ </div>
247
+ </section>
248
+
249
+ <footer class="site-footer">
250
+ <div class="container">
251
+ <div class="footer-content">
252
+ <span class="footer-brand">FuzionX</span>
253
+ <span class="footer-text">{{ t(key="home.footer", default="Rust-powered Node.js framework for the modern web.") }}</span>
254
+ </div>
255
+ </div>
256
+ </footer>
257
+
258
+ {% endblock %}