create-fuzionx 0.1.35 → 0.1.38
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/index.js +2 -1
- package/package.json +1 -1
- package/templates/common/database/models/Attachment.js +41 -0
- package/templates/common/database/models/Post.js +39 -0
- package/templates/common/database/models/Thumbnail.js +53 -0
- package/templates/common/database/models/User.js +34 -8
- package/templates/common/locales/en.json +248 -50
- package/templates/common/locales/ko.json +248 -50
- package/templates/common/package.json.tpl +2 -2
- package/templates/common/shared/jobs/ProcessVideoThumbnailTask.js +110 -0
- package/templates/common/shared/jobs/SampleQueuedTask.js +84 -0
- package/templates/common/shared/jobs/SampleScheduledJob.js +75 -0
- package/templates/common/shared/workers/video-worker.js +69 -0
- package/templates/spa/meta.json +1 -1
- package/templates/spa/public/css/style.css +1011 -0
- package/templates/ssr/views/default/layouts/main.html +1 -1
- package/templates/ssr/views/default/pages/board/index.html +1 -1
- package/templates/ssr/views/default/pages/board/show.html +1 -1
package/index.js
CHANGED
|
@@ -193,7 +193,8 @@ try {
|
|
|
193
193
|
cd ${name}
|
|
194
194
|
npm install
|
|
195
195
|
${type === 'spa' ? `cd app/spa/views/default/spa && npm install && cd ../../../../..
|
|
196
|
-
` : ''}
|
|
196
|
+
` : ''}npx fx db:sync --apply
|
|
197
|
+
${nextCmd}
|
|
197
198
|
`);
|
|
198
199
|
} catch (err) {
|
|
199
200
|
console.error(`❌ Failed to create app: ${err.message}`);
|
package/package.json
CHANGED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { SQLiteModel } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Attachment — 게시글 첨부파일 모델
|
|
5
|
+
*
|
|
6
|
+
* 게시글에 첨부된 파일 메타데이터를 관리.
|
|
7
|
+
* 실제 파일은 storage/uploads/ 에 저장, DB에는 경로만 보관.
|
|
8
|
+
*
|
|
9
|
+
* @extends SQLiteModel
|
|
10
|
+
*/
|
|
11
|
+
export default class Attachment extends SQLiteModel {
|
|
12
|
+
/** @type {string} 테이블 명 */
|
|
13
|
+
static table = 'attachments';
|
|
14
|
+
|
|
15
|
+
/** @type {boolean} created_at 자동 관리 */
|
|
16
|
+
static timestamps = true;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 컬럼 정의
|
|
20
|
+
*
|
|
21
|
+
* @type {Object<string, import('@fuzionx/framework').ColumnDefinition>}
|
|
22
|
+
* @property {Object} id - 자동 증가 기본키 (PK)
|
|
23
|
+
* @property {Object} post_id - 게시글 ID (FK → posts.id)
|
|
24
|
+
* @property {Object} original_name - 원본 파일명
|
|
25
|
+
* @property {Object} file_path - Storage 상대 경로 (uploads/posts/xxx.jpg)
|
|
26
|
+
* @property {Object} mime_type - MIME 타입 (image/jpeg, application/pdf 등)
|
|
27
|
+
* @property {Object} size - 파일 크기 (bytes)
|
|
28
|
+
* @property {Object} created_at - 업로드 일시
|
|
29
|
+
* @property {Object} updated_at - 수정 일시
|
|
30
|
+
*/
|
|
31
|
+
static columns = {
|
|
32
|
+
id: { type: 'increments' },
|
|
33
|
+
post_id: { type: 'integer' },
|
|
34
|
+
original_name: { type: 'string', length: 255 },
|
|
35
|
+
file_path: { type: 'string', length: 500 },
|
|
36
|
+
mime_type: { type: 'string', length: 100 },
|
|
37
|
+
size: { type: 'integer' },
|
|
38
|
+
created_at: { type: 'datetime' },
|
|
39
|
+
updated_at: { type: 'datetime' },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { SQLiteModel } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Post — 게시글 모델
|
|
5
|
+
*
|
|
6
|
+
* 게시판의 게시글 데이터를 관리하는 모델.
|
|
7
|
+
* 사용자(User)와 N:1 관계로, `user_id` 외래키로 연결.
|
|
8
|
+
*
|
|
9
|
+
* @extends SQLiteModel
|
|
10
|
+
*/
|
|
11
|
+
export default class Post extends SQLiteModel {
|
|
12
|
+
/** @type {string} 테이블 명 */
|
|
13
|
+
static table = 'posts';
|
|
14
|
+
|
|
15
|
+
/** @type {boolean} created_at / updated_at 자동 관리 */
|
|
16
|
+
static timestamps = true;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 컬럼 정의
|
|
20
|
+
*
|
|
21
|
+
* @type {Object<string, import('@fuzionx/framework').ColumnDefinition>}
|
|
22
|
+
* @property {Object} id - 자동 증가 기본키 (PK)
|
|
23
|
+
* @property {Object} user_id - 작성자 ID (FK → users.id)
|
|
24
|
+
* @property {Object} title - 게시글 제목 (최대 200자)
|
|
25
|
+
* @property {Object} content - 게시글 본문 (TEXT)
|
|
26
|
+
* @property {Object} status - 상태: 'published' | 'processing'
|
|
27
|
+
* @property {Object} created_at - 생성 일시
|
|
28
|
+
* @property {Object} updated_at - 수정 일시
|
|
29
|
+
*/
|
|
30
|
+
static columns = {
|
|
31
|
+
id: { type: 'increments' },
|
|
32
|
+
user_id: { type: 'integer' },
|
|
33
|
+
title: { type: 'string', length: 200 },
|
|
34
|
+
content: { type: 'text' },
|
|
35
|
+
status: { type: 'string', length: 20, default: 'published' },
|
|
36
|
+
created_at: { type: 'datetime' },
|
|
37
|
+
updated_at: { type: 'datetime' },
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { SQLiteModel } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Thumbnail — 첨부파일 썸네일 모델
|
|
5
|
+
*
|
|
6
|
+
* 이미지/비디오 첨부파일의 썸네일 메타데이터.
|
|
7
|
+
* - 이미지: 원본을 리사이즈하여 webp로 저장
|
|
8
|
+
* - 비디오: 3초 지점 프레임 추출 후 리사이즈
|
|
9
|
+
*
|
|
10
|
+
* Attachment 1:1 관계 (attachment_id FK).
|
|
11
|
+
* 실제 파일은 storage/uploads/thumbs/ 에 저장.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // 썸네일 조회
|
|
15
|
+
* const thumb = await Thumbnail.where('attachment_id', att.id).first();
|
|
16
|
+
* const url = app.storage.url(thumb.file_path);
|
|
17
|
+
*
|
|
18
|
+
* @extends SQLiteModel
|
|
19
|
+
*/
|
|
20
|
+
export default class Thumbnail extends SQLiteModel {
|
|
21
|
+
/** @type {string} 테이블 명 */
|
|
22
|
+
static table = 'thumbnails';
|
|
23
|
+
|
|
24
|
+
/** @type {boolean} created_at 자동 관리 */
|
|
25
|
+
static timestamps = true;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 컬럼 정의
|
|
29
|
+
*
|
|
30
|
+
* @type {Object<string, import('@fuzionx/framework').ColumnDefinition>}
|
|
31
|
+
* @property {Object} id - 자동 증가 PK
|
|
32
|
+
* @property {Object} attachment_id - 첨부파일 ID (FK → attachments.id)
|
|
33
|
+
* @property {Object} file_path - Storage 상대 경로 (uploads/thumbs/xxx.webp)
|
|
34
|
+
* @property {Object} width - 썸네일 가로 크기 (px)
|
|
35
|
+
* @property {Object} height - 썸네일 세로 크기 (px)
|
|
36
|
+
* @property {Object} format - 포맷 (webp, jpeg)
|
|
37
|
+
* @property {Object} size - 파일 크기 (bytes)
|
|
38
|
+
* @property {Object} source_type - 원본 타입 (image|video)
|
|
39
|
+
* @property {Object} created_at - 생성 일시
|
|
40
|
+
*/
|
|
41
|
+
static columns = {
|
|
42
|
+
id: { type: 'increments' },
|
|
43
|
+
attachment_id: { type: 'integer' },
|
|
44
|
+
file_path: { type: 'string', length: 500 },
|
|
45
|
+
width: { type: 'integer' },
|
|
46
|
+
height: { type: 'integer' },
|
|
47
|
+
format: { type: 'string', length: 20 },
|
|
48
|
+
size: { type: 'integer' },
|
|
49
|
+
source_type: { type: 'string', length: 20 },
|
|
50
|
+
created_at: { type: 'datetime' },
|
|
51
|
+
updated_at: { type: 'datetime' },
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -1,9 +1,35 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { SQLiteModel } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* User — 사용자 모델
|
|
5
|
+
*
|
|
6
|
+
* 인증 및 사용자 프로필 데이터를 관리하는 모델.
|
|
7
|
+
* `password` 필드는 hidden 처리되어 JSON 직렬화 시 제외.
|
|
8
|
+
*
|
|
9
|
+
* @extends SQLiteModel
|
|
10
|
+
*/
|
|
11
|
+
export default class User extends SQLiteModel {
|
|
12
|
+
/** @type {string} 테이블 명 */
|
|
13
|
+
static table = 'users';
|
|
14
|
+
|
|
15
|
+
/** @type {boolean} created_at / updated_at 자동 관리 */
|
|
16
|
+
static timestamps = true;
|
|
17
|
+
|
|
18
|
+
/** @type {string[]} JSON 직렬화 시 제외할 필드 */
|
|
19
|
+
static hidden = ['password'];
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 컬럼 정의
|
|
23
|
+
*
|
|
24
|
+
* @type {Object<string, import('@fuzionx/framework').ColumnDefinition>}
|
|
25
|
+
*/
|
|
26
|
+
static columns = {
|
|
27
|
+
id: { type: 'increments' },
|
|
28
|
+
name: { type: 'string', length: 100 },
|
|
29
|
+
email: { type: 'string', length: 150, unique: true },
|
|
30
|
+
password: { type: 'string', length: 255 },
|
|
31
|
+
role: { type: 'string', length: 20, default: 'user' },
|
|
32
|
+
created_at: { type: 'datetime' },
|
|
33
|
+
updated_at: { type: 'datetime' },
|
|
34
|
+
};
|
|
9
35
|
}
|
|
@@ -1,52 +1,250 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
2
|
+
"auth": {
|
|
3
|
+
"email_exists": "Email already registered.",
|
|
4
|
+
"has_account": "Already have an account?",
|
|
5
|
+
"login_failed": "Invalid email or password.",
|
|
6
|
+
"no_account": "Don't have an account?",
|
|
7
|
+
"password_mismatch": "Passwords do not match.",
|
|
8
|
+
"register_success": "Registration complete. Please log in."
|
|
9
|
+
},
|
|
10
|
+
"board": {
|
|
11
|
+
"attached_files": "Existing files",
|
|
12
|
+
"author": "Author",
|
|
13
|
+
"confirm_delete": "Are you sure you want to delete?",
|
|
14
|
+
"date": "Date",
|
|
15
|
+
"delete_success": "Post deleted successfully.",
|
|
16
|
+
"drop_files": "Click or drag files here",
|
|
17
|
+
"edit_title": "Edit Post",
|
|
18
|
+
"empty": "No posts yet.",
|
|
19
|
+
"file_hint": "Max 10MB, images and documents",
|
|
20
|
+
"new_title": "New Post",
|
|
21
|
+
"processing": "Processing",
|
|
22
|
+
"store_success": "Post saved successfully.",
|
|
23
|
+
"title": "Board",
|
|
24
|
+
"update_success": "Post updated successfully."
|
|
25
|
+
},
|
|
26
|
+
"btn": {
|
|
27
|
+
"back": "← Back",
|
|
28
|
+
"cancel": "Cancel",
|
|
29
|
+
"create": "Create",
|
|
30
|
+
"delete": "Delete",
|
|
31
|
+
"edit": "Edit",
|
|
32
|
+
"go_home": "Go Home",
|
|
33
|
+
"login": "Login",
|
|
34
|
+
"new_post": "New Post",
|
|
35
|
+
"register": "Register",
|
|
36
|
+
"save": "Save"
|
|
37
|
+
},
|
|
38
|
+
"chat": {
|
|
39
|
+
"btn_join": "Join Chat",
|
|
40
|
+
"btn_leave": "Leave Chat",
|
|
41
|
+
"btn_send": "Send",
|
|
42
|
+
"connecting": "connecting...",
|
|
43
|
+
"demo_sub": "Experience FuzionX real-time WebSocket in action.",
|
|
44
|
+
"demo_tech": "Built with",
|
|
45
|
+
"demo_title": "Chat Demo",
|
|
46
|
+
"footer": "Powered by WsHandler",
|
|
47
|
+
"footer_link": "WebSocket Features",
|
|
48
|
+
"meta_desc": "Live WebSocket chat demo powered by FuzionX WsHandler. Try the real-time messaging with user presence.",
|
|
49
|
+
"msg_placeholder": "Type a message...",
|
|
50
|
+
"nickname_placeholder": "Enter your nickname...",
|
|
51
|
+
"online": "Online",
|
|
52
|
+
"page_title": "Chat Demo",
|
|
53
|
+
"room_title": "Chat Room",
|
|
54
|
+
"typing": "is typing..."
|
|
55
|
+
},
|
|
56
|
+
"common": {
|
|
57
|
+
"forbidden": "Forbidden."
|
|
58
|
+
},
|
|
59
|
+
"dashboard": {
|
|
60
|
+
"about_title": "FuzionX Framework",
|
|
61
|
+
"edit_profile": "Edit",
|
|
62
|
+
"feat_auth": "Built-in Authentication",
|
|
63
|
+
"feat_auth_desc": "Session-based auth, bcrypt/argon2 hashing, and CSRF protection included out of the box.",
|
|
64
|
+
"feat_i18n": "Internationalization (i18n)",
|
|
65
|
+
"feat_i18n_desc": "JSON-based locale files with auto-detection of missing keys for seamless multi-language support.",
|
|
66
|
+
"feat_perf": "High-Performance Rust Bridge",
|
|
67
|
+
"feat_perf_desc": "Rust N-API based HTTP server, session management, encryption, and hashing at native speed.",
|
|
68
|
+
"feat_ssr": "SSR + SPA Support",
|
|
69
|
+
"feat_ssr_desc": "Run Tera template-based SSR and Vue.js SPA simultaneously in a single project.",
|
|
70
|
+
"go_board": "Go",
|
|
71
|
+
"qs_controller": "Write Controllers",
|
|
72
|
+
"qs_controller_desc": "Delegate business logic to services, handle rendering and redirects.",
|
|
73
|
+
"qs_route": "Define Routes",
|
|
74
|
+
"qs_route_desc": "Map URLs to controllers in routes.js.",
|
|
75
|
+
"quickstart_title": "Quick Start"
|
|
76
|
+
},
|
|
77
|
+
"feat": {
|
|
78
|
+
"badge": "Framework Features",
|
|
79
|
+
"bridge_code_title": "Native Performance — Zero JS Overhead",
|
|
80
|
+
"bridge_crypto": "Native Crypto",
|
|
81
|
+
"bridge_crypto_desc": "bcrypt, argon2id, AES-256-GCM, SHA-256, MD5, UUID v4 — all executed in Rust. No crypto module overhead, no C++ addon compilation issues.",
|
|
82
|
+
"bridge_media": "Media Processing",
|
|
83
|
+
"bridge_media_desc": "Image resizing (Lanczos3), WebP conversion, and video thumbnail extraction powered by Rust image crate and ffmpeg bindings.",
|
|
84
|
+
"bridge_rps": "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.",
|
|
85
|
+
"bridge_sub": "Native performance for core operations — no JavaScript overhead.",
|
|
86
|
+
"bridge_title": "Rust N-API Bridge",
|
|
87
|
+
"bridge_zerocopy": "Zero-Copy File Uploads",
|
|
88
|
+
"bridge_zerocopy_desc": "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.",
|
|
89
|
+
"btn_back": "Back to Home",
|
|
90
|
+
"btn_chat": "Try Chat Demo",
|
|
91
|
+
"btn_try_chat": "Try Live Chat Demo →",
|
|
92
|
+
"cta_sub": "One command to scaffold. Zero configuration to start.",
|
|
93
|
+
"cta_title_1": "Start Building",
|
|
94
|
+
"cta_title_2": "Today",
|
|
95
|
+
"dx_autoscan": "Auto-Scanning",
|
|
96
|
+
"dx_autoscan_desc": "Drop a file in controllers/, services/, ws/, or jobs/ — the framework discovers and registers it automatically. Zero manual wiring.",
|
|
97
|
+
"dx_cli": "CLI Code Generator",
|
|
98
|
+
"dx_cli_desc": "fx make:controller, fx make:model, fx make:service — scaffold any component instantly with proper boilerplate.",
|
|
99
|
+
"dx_openapi": "OpenAPI Auto-Generation",
|
|
100
|
+
"dx_openapi_desc": "Swagger UI at /docs with zero configuration. Route definitions are automatically converted to OpenAPI 3.0 spec.",
|
|
101
|
+
"dx_sub": "CLI scaffolding, auto-scanning, hot reload, OpenAPI docs — everything to keep you productive.",
|
|
102
|
+
"dx_test": "Testing Helpers",
|
|
103
|
+
"dx_test_desc": "In-process HTTP test client, database transaction rollbacks, isolated test contexts. vitest integration out of the box.",
|
|
104
|
+
"dx_title": "Developer Experience",
|
|
105
|
+
"header_sub": "Every feature designed for performance, developer experience, and enterprise readiness.",
|
|
106
|
+
"header_title_1": "Built for",
|
|
107
|
+
"header_title_2": "Production",
|
|
108
|
+
"meta_desc": "Explore FuzionX features: Rust N-API Bridge, Multi-DB ORM, WebSocket, Task Queue, and more.",
|
|
109
|
+
"orm_access": "3-Level Access",
|
|
110
|
+
"orm_access_desc": "Unified API for 99% of cases → Raw Query for DB-specific features → Native driver access when you need full control.",
|
|
111
|
+
"orm_relations": "Relationships",
|
|
112
|
+
"orm_relations_desc": "hasMany, hasOne, belongsTo, belongsToMany — define relations as methods. Eager loading with .with('posts.comments').",
|
|
113
|
+
"orm_schema": "Model-Based Schema Sync",
|
|
114
|
+
"orm_schema_desc": "Define columns in the model with static columns, then run fx db:sync. No more writing migration files — the model IS the schema.",
|
|
115
|
+
"orm_sub": "One API for MariaDB, PostgreSQL, and MongoDB. Model = Schema = Single source of truth.",
|
|
116
|
+
"orm_title": "Multi-Database ORM",
|
|
117
|
+
"orm_unified": "Unified Query API",
|
|
118
|
+
"orm_unified_desc": "Write User.where('active', true).paginate(1, 20) and it works across all databases. No database-specific code needed for CRUD operations.",
|
|
119
|
+
"page_title": "Features",
|
|
120
|
+
"queue_queued": "Queued Tasks",
|
|
121
|
+
"queue_queued_desc": "Async dispatch with retries: app.dispatch('SendEmail', data). Memory or Redis backend. Failed tasks call failed() hook.",
|
|
122
|
+
"queue_scheduled": "Scheduled Jobs",
|
|
123
|
+
"queue_scheduled_desc": "Cron-based recurring tasks. static schedule = 'daily:02:00'. Runs on master process with Redis distributed lock for multi-server.",
|
|
124
|
+
"queue_sub": "Three ways to handle background work — scheduled, queued, and CPU-isolated.",
|
|
125
|
+
"queue_title": "Task Queue + Workers",
|
|
126
|
+
"queue_worker_desc": "CPU-heavy work in worker_threads: app.worker.run('csv-parser', data). Prevents event loop blocking. Timeout + auto-cleanup.",
|
|
127
|
+
"sec_asp": "ASP Wire Encryption",
|
|
128
|
+
"sec_asp_desc": "FuzionX Stealth Protocol encrypts all HTTP request/response bodies on the wire. Transparent to application code, impenetrable to MITM attacks.",
|
|
129
|
+
"sec_hash": "Native Password Hashing",
|
|
130
|
+
"sec_hash_desc": "bcrypt (cost 12) and argon2id hashing in Rust — orders of magnitude faster than JavaScript implementations with the same security guarantees.",
|
|
131
|
+
"sec_rate": "Rate Limiting + CSRF",
|
|
132
|
+
"sec_rate_desc": "Per-IP rate limiting in the Rust bridge layer. CSRF token generation and validation. IP whitelist/blacklist. HSTS and CSP headers.",
|
|
133
|
+
"sec_session": "Session + JWT Auth",
|
|
134
|
+
"sec_session_desc": "File-based or Redis session store. JWT access/refresh token rotation. Built-in auth() middleware with route guards.",
|
|
135
|
+
"sec_sub": "Production-grade security built into every layer — from wire encryption to password hashing.",
|
|
136
|
+
"sec_title": "Enterprise Security",
|
|
137
|
+
"ssr_i18n": "Built-in i18n",
|
|
138
|
+
"ssr_i18n_desc": "JSON-based translations with auto-detection, fallback locales, and missing key auto-complete.",
|
|
139
|
+
"ssr_multiapp": "Multi-App Routing",
|
|
140
|
+
"ssr_multiapp_desc": "Route different domains to different apps: api.example.com → spa, www.example.com → ssr. One codebase, multiple frontends.",
|
|
141
|
+
"ssr_sub": "Server-rendered pages and single-page apps in one project with domain routing.",
|
|
142
|
+
"ssr_tera": "Tera Template Engine",
|
|
143
|
+
"ssr_tera_desc": "Jinja2-compatible template engine compiled in Rust. Layouts, blocks, inheritance, filters, and macros for fast SSR rendering.",
|
|
144
|
+
"ssr_theme": "Theme System",
|
|
145
|
+
"ssr_theme_desc": "Multiple view themes with views/{theme}/ structure. Switch themes via config without changing any controller code.",
|
|
146
|
+
"ssr_title": "SSR + SPA Hybrid",
|
|
147
|
+
"ws_dsl": "Event Routing DSL",
|
|
148
|
+
"ws_dsl_desc": "static events(e) declares event → handler mappings, just like controller routes. Clean, declarative, and auto-scanned from ws/ folder.",
|
|
149
|
+
"ws_hub": "Hub Broadcasting",
|
|
150
|
+
"ws_hub_desc": "Multi-server? Just add { hub: true } to broadcast. Messages route through Hub server to all connected instances.",
|
|
151
|
+
"ws_middleware": "Middleware Sharing",
|
|
152
|
+
"ws_middleware_desc": "Reuse the same HTTP middleware for WebSocket handshake. Auth middleware works for both HTTP and WS connections.",
|
|
153
|
+
"ws_rooms": "Rooms",
|
|
154
|
+
"ws_rooms_desc": "socket.join('room:123'), socket.to('room:123').send({...}) — built-in room management without external libraries.",
|
|
155
|
+
"ws_sub": "Namespace-based event routing with rooms, middleware sharing, and multi-server Hub.",
|
|
156
|
+
"ws_title": "Real-time WebSocket"
|
|
157
|
+
},
|
|
158
|
+
"home": {
|
|
159
|
+
"arch_bridge_desc": "Rust N-API binary — libuv Fusion HTTP, native crypto, media processing, file I/O. Zero-copy where possible.",
|
|
160
|
+
"arch_core_desc": "Express-level HTTP engine wrapping the Rust bridge. Routing, request/response lifecycle, WebSocket server.",
|
|
161
|
+
"arch_engine": "Engine",
|
|
162
|
+
"arch_framework_desc": "Controllers, Services, Models, Middleware, WebSocket Handlers, Jobs — Laravel-style MVC with full DI container",
|
|
163
|
+
"arch_native": "Native",
|
|
164
|
+
"arch_subtitle": "Three-tier design separating concerns for maximum performance and developer ergonomics.",
|
|
165
|
+
"arch_title_1": "Layered",
|
|
166
|
+
"arch_title_2": "Architecture",
|
|
167
|
+
"arch_you_write": "You Write",
|
|
168
|
+
"btn_all_features": "View All Features",
|
|
169
|
+
"btn_demo": "Live Demo",
|
|
170
|
+
"btn_features": "Explore Features",
|
|
171
|
+
"btn_try_chat": "Try Chat Demo",
|
|
172
|
+
"cmp_3rd_party": "3rd party",
|
|
173
|
+
"cmp_builtin": "Built-in",
|
|
174
|
+
"cmp_feature": "Feature",
|
|
175
|
+
"cmp_http": "HTTP Engine",
|
|
176
|
+
"cmp_model_based": "Model-based",
|
|
177
|
+
"cmp_orm": "ORM Built-in",
|
|
178
|
+
"cmp_queue": "Task Queue",
|
|
179
|
+
"cmp_schema": "Schema Sync",
|
|
180
|
+
"cmp_upload": "File Upload",
|
|
181
|
+
"cta_subtitle": "Get started with FuzionX in seconds. One command, zero configuration.",
|
|
182
|
+
"cta_title_1": "Ready to Build",
|
|
183
|
+
"cta_title_2": "Something Fast",
|
|
184
|
+
"feat_bridge": "Rust N-API Bridge",
|
|
185
|
+
"feat_bridge_desc": "HTTP server, session management, cryptography, and file processing at native speed. No JavaScript overhead for core operations.",
|
|
186
|
+
"feat_orm": "Multi-DB ORM",
|
|
187
|
+
"feat_orm_desc": "One unified API for MariaDB, PostgreSQL, and MongoDB. Model-based schema sync replaces migration files.",
|
|
188
|
+
"feat_queue": "Task Queue + Workers",
|
|
189
|
+
"feat_queue_desc": "Scheduled jobs (cron), async task queues with retry logic, and WorkerPool for CPU-heavy operations in isolated threads.",
|
|
190
|
+
"feat_security": "Enterprise Security",
|
|
191
|
+
"feat_security_desc": "Native bcrypt/argon2 hashing, AES-256-GCM encryption, ASP wire protocol, CSRF protection, and rate limiting.",
|
|
192
|
+
"feat_ssr": "SSR + SPA Hybrid",
|
|
193
|
+
"feat_ssr_desc": "Tera template engine for SSR pages alongside Vue.js SPA — run both in a single project with domain-based routing.",
|
|
194
|
+
"feat_subtitle": "A production-ready framework that ships with batteries included — powered by Rust under the hood.",
|
|
195
|
+
"feat_title_1": "Everything You Need.",
|
|
196
|
+
"feat_title_2": "Nothing You Don't.",
|
|
197
|
+
"feat_ws": "Real-time WebSocket",
|
|
198
|
+
"feat_ws_desc": "Namespace routing, rooms, event-based handlers, and multi-server Hub broadcasting built into the framework.",
|
|
199
|
+
"footer": "Rust-powered Node.js framework for the modern web.",
|
|
200
|
+
"hero_badge": "Powered by Rust N-API",
|
|
201
|
+
"hero_sub_1": "Full-stack MVC framework for Node.js with a Rust-powered core engine.",
|
|
202
|
+
"hero_sub_2": "500K+ requests per second. Zero-copy file handling. Native-speed crypto.",
|
|
203
|
+
"hero_title_1": "Build",
|
|
204
|
+
"hero_title_2": "Blazing Fast",
|
|
205
|
+
"hero_title_3": "Web Applications",
|
|
206
|
+
"meta_desc": "Build blazing-fast web applications with FuzionX. Rust N-API bridge delivering 500K+ RPS, multi-DB ORM, real-time WebSocket, and enterprise-grade security.",
|
|
207
|
+
"stat_db": "Database Drivers",
|
|
208
|
+
"stat_modules": "Core Modules",
|
|
209
|
+
"stat_rps": "Requests/sec",
|
|
210
|
+
"stat_zero_copy": "Memory Copy Uploads",
|
|
211
|
+
"title": "Rust-Powered Full-Stack Node.js Framework",
|
|
212
|
+
"why_subtitle": "See how FuzionX stacks up against popular Node.js frameworks.",
|
|
213
|
+
"why_title_1": "Why"
|
|
214
|
+
},
|
|
215
|
+
"label": {
|
|
216
|
+
"attachments": "Attachments",
|
|
217
|
+
"content": "Content",
|
|
218
|
+
"email": "Email",
|
|
219
|
+
"name": "Name",
|
|
220
|
+
"password": "Password",
|
|
221
|
+
"password_confirm": "Confirm Password",
|
|
222
|
+
"title": "Title"
|
|
223
|
+
},
|
|
224
|
+
"nav": {
|
|
225
|
+
"board": "Board",
|
|
226
|
+
"chat": "Chat Demo",
|
|
227
|
+
"features": "Features",
|
|
228
|
+
"home": "Home",
|
|
229
|
+
"login": "Login",
|
|
230
|
+
"logout": "Logout",
|
|
231
|
+
"profile": "Profile",
|
|
232
|
+
"register": "Register"
|
|
233
|
+
},
|
|
234
|
+
"page": {
|
|
235
|
+
"404": "Page not found",
|
|
236
|
+
"500": "Server error",
|
|
237
|
+
"dashboard": "Dashboard",
|
|
238
|
+
"login": "Login",
|
|
239
|
+
"register": "Register"
|
|
240
|
+
},
|
|
241
|
+
"post": {
|
|
242
|
+
"not_found": "Post not found."
|
|
243
|
+
},
|
|
244
|
+
"profile": {
|
|
245
|
+
"new_password": "New Password (optional)",
|
|
246
|
+
"title": "Edit Profile",
|
|
247
|
+
"update_success": "Profile updated."
|
|
248
|
+
},
|
|
249
|
+
"welcome": "Welcome, {name}! 👋"
|
|
52
250
|
}
|