@fuzionx/framework 0.1.39 → 0.1.42
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/README.md +501 -501
- package/bin/fx.js +12 -12
- package/cli/db-sync.js +100 -99
- package/cli/index.js +494 -493
- package/cli/templates/make/app/controllers/HomeController.js +14 -14
- package/cli/templates/make/app/routes/api.js +7 -7
- package/cli/templates/make/app/routes/web.js +5 -5
- package/cli/templates/make/app/views/default/errors/404.html +11 -11
- package/cli/templates/make/app/views/default/errors/500.html +14 -14
- package/cli/templates/make/app/views/default/layouts/main.html +22 -22
- package/cli/templates/make/app/views/default/pages/home.html +11 -11
- package/cli/templates/make/controller.js.tpl +40 -40
- package/cli/templates/make/event.js.tpl +8 -8
- package/cli/templates/make/job.js.tpl +10 -10
- package/cli/templates/make/middleware.js.tpl +10 -10
- package/cli/templates/make/model.js.tpl +15 -15
- package/cli/templates/make/service.js.tpl +15 -15
- package/cli/templates/make/task.js.tpl +15 -15
- package/cli/templates/make/test.js.tpl +7 -7
- package/cli/templates/make/worker.js.tpl +14 -14
- package/cli/templates/make/ws.js.tpl +18 -18
- package/index.js +67 -67
- package/lib/core/AppError.js +46 -46
- package/lib/core/Application.js +1006 -1006
- package/lib/core/AutoLoader.js +227 -226
- package/lib/core/Base.js +64 -64
- package/lib/core/Config.js +228 -228
- package/lib/core/Context.js +484 -484
- package/lib/database/ConnectionManager.js +208 -208
- package/lib/database/MariaModel.js +29 -29
- package/lib/database/Model.js +247 -247
- package/lib/database/ModelRegistry.js +72 -72
- package/lib/database/MongoModel.js +232 -232
- package/lib/database/Pagination.js +37 -37
- package/lib/database/PostgreModel.js +29 -29
- package/lib/database/QueryBuilder.js +172 -172
- package/lib/database/SQLiteModel.js +27 -27
- package/lib/database/SqlModel.js +257 -257
- package/lib/database/SqlQueryBuilder.js +332 -332
- package/lib/helpers/CryptoHelper.js +48 -48
- package/lib/helpers/FileHelper.js +61 -61
- package/lib/helpers/HashHelper.js +39 -39
- package/lib/helpers/I18nHelper.js +174 -174
- package/lib/helpers/Logger.js +108 -108
- package/lib/helpers/MediaHelper.js +84 -84
- package/lib/http/Controller.js +34 -34
- package/lib/http/ErrorHandler.js +136 -136
- package/lib/http/Middleware.js +43 -43
- package/lib/http/Router.js +109 -109
- package/lib/http/Validation.js +125 -125
- package/lib/middleware/apiAuth.js +79 -79
- package/lib/middleware/auth.js +42 -42
- package/lib/middleware/bodyParser.js +19 -19
- package/lib/middleware/cors.js +47 -47
- package/lib/middleware/csrf.js +32 -32
- package/lib/middleware/index.js +13 -13
- package/lib/middleware/session.js +27 -27
- package/lib/middleware/theme.js +20 -20
- package/lib/realtime/RoomManager.js +85 -85
- package/lib/realtime/WsHandler.js +107 -107
- package/lib/schedule/Job.js +38 -38
- package/lib/schedule/Queue.js +103 -103
- package/lib/schedule/Scheduler.js +171 -171
- package/lib/schedule/Task.js +39 -39
- package/lib/schedule/WorkerPool.js +225 -225
- package/lib/services/EventBus.js +94 -94
- package/lib/services/Service.js +261 -261
- package/lib/services/Storage.js +112 -112
- package/lib/utilities/ArrUtil.js +112 -112
- package/lib/utilities/DateUtil.js +98 -98
- package/lib/utilities/FunctionUtil.js +119 -119
- package/lib/utilities/NumUtil.js +75 -75
- package/lib/utilities/ObjectUtil.js +170 -170
- package/lib/utilities/PaginationUtil.js +81 -81
- package/lib/utilities/StrUtil.js +105 -105
- package/lib/utilities/index.js +18 -18
- package/lib/view/OpenAPI.js +231 -231
- package/lib/view/View.js +83 -83
- package/package.json +2 -2
- package/testing/index.js +232 -232
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { Controller } from '@fuzionx/framework';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Home 컨트롤러.
|
|
5
|
-
* routes/web.js에서 라우트를 등록하세요.
|
|
6
|
-
*/
|
|
7
|
-
export default class HomeController extends Controller {
|
|
8
|
-
|
|
9
|
-
/** 홈 페이지 */
|
|
10
|
-
static index;
|
|
11
|
-
async index(ctx) {
|
|
12
|
-
ctx.render('home');
|
|
13
|
-
}
|
|
14
|
-
}
|
|
1
|
+
import { Controller } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Home 컨트롤러.
|
|
5
|
+
* routes/web.js에서 라우트를 등록하세요.
|
|
6
|
+
*/
|
|
7
|
+
export default class HomeController extends Controller {
|
|
8
|
+
|
|
9
|
+
/** 홈 페이지 */
|
|
10
|
+
static index;
|
|
11
|
+
async index(ctx) {
|
|
12
|
+
ctx.render('home');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export default (r) => {
|
|
2
|
-
r.group('/api', (r) => {
|
|
3
|
-
r.get('/health', (ctx) => {
|
|
4
|
-
ctx.json({ status: 'ok', timestamp: Date.now() });
|
|
5
|
-
});
|
|
6
|
-
});
|
|
7
|
-
};
|
|
1
|
+
export default (r) => {
|
|
2
|
+
r.group('/api', (r) => {
|
|
3
|
+
r.get('/health', (ctx) => {
|
|
4
|
+
ctx.json({ status: 'ok', timestamp: Date.now() });
|
|
5
|
+
});
|
|
6
|
+
});
|
|
7
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import HomeController from '../controllers/HomeController.js';
|
|
2
|
-
|
|
3
|
-
export default (r) => {
|
|
4
|
-
r.get('/', HomeController.index);
|
|
5
|
-
};
|
|
1
|
+
import HomeController from '../controllers/HomeController.js';
|
|
2
|
+
|
|
3
|
+
export default (r) => {
|
|
4
|
+
r.get('/', HomeController.index);
|
|
5
|
+
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
{% extends "layouts/main.html" %}
|
|
2
|
-
|
|
3
|
-
{% block title %}404 — 찾을 수 없습니다{% endblock %}
|
|
4
|
-
|
|
5
|
-
{% block content %}
|
|
6
|
-
<div style="text-align:center;padding:80px 20px;">
|
|
7
|
-
<h1 style="font-size:72px;color:#e74c3c;">{{ error.code }}</h1>
|
|
8
|
-
<p style="font-size:20px;margin:16px 0;">{{ error.message }}</p>
|
|
9
|
-
<a href="/" style="display:inline-block;margin-top:24px;padding:12px 24px;background:#e74c3c;color:#fff;text-decoration:none;border-radius:6px;">홈으로 돌아가기</a>
|
|
10
|
-
</div>
|
|
11
|
-
{% endblock %}
|
|
1
|
+
{% extends "layouts/main.html" %}
|
|
2
|
+
|
|
3
|
+
{% block title %}404 — 찾을 수 없습니다{% endblock %}
|
|
4
|
+
|
|
5
|
+
{% block content %}
|
|
6
|
+
<div style="text-align:center;padding:80px 20px;">
|
|
7
|
+
<h1 style="font-size:72px;color:#e74c3c;">{{ error.code }}</h1>
|
|
8
|
+
<p style="font-size:20px;margin:16px 0;">{{ error.message }}</p>
|
|
9
|
+
<a href="/" style="display:inline-block;margin-top:24px;padding:12px 24px;background:#e74c3c;color:#fff;text-decoration:none;border-radius:6px;">홈으로 돌아가기</a>
|
|
10
|
+
</div>
|
|
11
|
+
{% endblock %}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
{% extends "layouts/main.html" %}
|
|
2
|
-
|
|
3
|
-
{% block title %}500 — 서버 오류{% endblock %}
|
|
4
|
-
|
|
5
|
-
{% block content %}
|
|
6
|
-
<div style="text-align:center;padding:80px 20px;">
|
|
7
|
-
<h1 style="font-size:72px;color:#e74c3c;">{{ error.code }}</h1>
|
|
8
|
-
<p style="font-size:20px;margin:16px 0;">{{ error.message }}</p>
|
|
9
|
-
{% if config.debug %}
|
|
10
|
-
<pre style="text-align:left;max-width:600px;margin:24px auto;background:#f5f5f5;padding:16px;border-radius:8px;overflow:auto;">{{ error.stack }}</pre>
|
|
11
|
-
{% endif %}
|
|
12
|
-
<a href="/" style="display:inline-block;margin-top:24px;padding:12px 24px;background:#e74c3c;color:#fff;text-decoration:none;border-radius:6px;">홈으로 돌아가기</a>
|
|
13
|
-
</div>
|
|
14
|
-
{% endblock %}
|
|
1
|
+
{% extends "layouts/main.html" %}
|
|
2
|
+
|
|
3
|
+
{% block title %}500 — 서버 오류{% endblock %}
|
|
4
|
+
|
|
5
|
+
{% block content %}
|
|
6
|
+
<div style="text-align:center;padding:80px 20px;">
|
|
7
|
+
<h1 style="font-size:72px;color:#e74c3c;">{{ error.code }}</h1>
|
|
8
|
+
<p style="font-size:20px;margin:16px 0;">{{ error.message }}</p>
|
|
9
|
+
{% if config.debug %}
|
|
10
|
+
<pre style="text-align:left;max-width:600px;margin:24px auto;background:#f5f5f5;padding:16px;border-radius:8px;overflow:auto;">{{ error.stack }}</pre>
|
|
11
|
+
{% endif %}
|
|
12
|
+
<a href="/" style="display:inline-block;margin-top:24px;padding:12px 24px;background:#e74c3c;color:#fff;text-decoration:none;border-radius:6px;">홈으로 돌아가기</a>
|
|
13
|
+
</div>
|
|
14
|
+
{% endblock %}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="{{ locale | default(value='ko') }}">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>{% block title %}{{ config.app.name | default(value='FuzionX') }}{% endblock %}</title>
|
|
7
|
-
<style>
|
|
8
|
-
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
|
-
body { font-family: system-ui, -apple-system, sans-serif; line-height: 1.6; color: #333; }
|
|
10
|
-
</style>
|
|
11
|
-
{% block head %}{% endblock %}
|
|
12
|
-
</head>
|
|
13
|
-
<body>
|
|
14
|
-
{% include "partials/header.html" ignore missing %}
|
|
15
|
-
|
|
16
|
-
<main>
|
|
17
|
-
{% block content %}{% endblock %}
|
|
18
|
-
</main>
|
|
19
|
-
|
|
20
|
-
{% include "partials/footer.html" ignore missing %}
|
|
21
|
-
</body>
|
|
22
|
-
</html>
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="{{ locale | default(value='ko') }}">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>{% block title %}{{ config.app.name | default(value='FuzionX') }}{% endblock %}</title>
|
|
7
|
+
<style>
|
|
8
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
|
+
body { font-family: system-ui, -apple-system, sans-serif; line-height: 1.6; color: #333; }
|
|
10
|
+
</style>
|
|
11
|
+
{% block head %}{% endblock %}
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
{% include "partials/header.html" ignore missing %}
|
|
15
|
+
|
|
16
|
+
<main>
|
|
17
|
+
{% block content %}{% endblock %}
|
|
18
|
+
</main>
|
|
19
|
+
|
|
20
|
+
{% include "partials/footer.html" ignore missing %}
|
|
21
|
+
</body>
|
|
22
|
+
</html>
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
{% extends "layouts/main.html" %}
|
|
2
|
-
|
|
3
|
-
{% block title %}Welcome{% endblock %}
|
|
4
|
-
|
|
5
|
-
{% block content %}
|
|
6
|
-
<div style="text-align:center;padding:80px 20px;">
|
|
7
|
-
<h1 style="font-size:48px;color:#333;">🚀 Welcome</h1>
|
|
8
|
-
<p style="font-size:18px;color:#666;margin:16px 0;">Your new app is ready.</p>
|
|
9
|
-
<p style="color:#999;font-size:14px;">Edit <code style="background:#f0f0f0;padding:2px 8px;border-radius:4px;">routes/web.js</code> to get started</p>
|
|
10
|
-
</div>
|
|
11
|
-
{% endblock %}
|
|
1
|
+
{% extends "layouts/main.html" %}
|
|
2
|
+
|
|
3
|
+
{% block title %}Welcome{% endblock %}
|
|
4
|
+
|
|
5
|
+
{% block content %}
|
|
6
|
+
<div style="text-align:center;padding:80px 20px;">
|
|
7
|
+
<h1 style="font-size:48px;color:#333;">🚀 Welcome</h1>
|
|
8
|
+
<p style="font-size:18px;color:#666;margin:16px 0;">Your new app is ready.</p>
|
|
9
|
+
<p style="color:#999;font-size:14px;">Edit <code style="background:#f0f0f0;padding:2px 8px;border-radius:4px;">routes/web.js</code> to get started</p>
|
|
10
|
+
</div>
|
|
11
|
+
{% endblock %}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import { Controller } from '@fuzionx/framework';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* {{Name}} 컨트롤러.
|
|
5
|
-
* routes/ 파일에서 라우트를 등록하세요.
|
|
6
|
-
*/
|
|
7
|
-
export default class {{Name}}Controller extends Controller {
|
|
8
|
-
|
|
9
|
-
/** 목록 조회 */
|
|
10
|
-
async index(ctx) {
|
|
11
|
-
const items = await this.db.{{Name}}.paginate(ctx.query.page || 1, 20);
|
|
12
|
-
ctx.json(items);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** 상세 조회 */
|
|
16
|
-
async show(ctx) {
|
|
17
|
-
const item = await this.db.{{Name}}.findOrFail(ctx.params.id);
|
|
18
|
-
ctx.json(item);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/** 생성 */
|
|
22
|
-
async store(ctx) {
|
|
23
|
-
const item = await this.db.{{Name}}.create(ctx.body);
|
|
24
|
-
ctx.status(201).json(item);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** 수정 */
|
|
28
|
-
async update(ctx) {
|
|
29
|
-
const item = await this.db.{{Name}}.findOrFail(ctx.params.id);
|
|
30
|
-
await item.update(ctx.body);
|
|
31
|
-
ctx.json(item);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** 삭제 */
|
|
35
|
-
async destroy(ctx) {
|
|
36
|
-
const item = await this.db.{{Name}}.findOrFail(ctx.params.id);
|
|
37
|
-
await item.delete();
|
|
38
|
-
ctx.status(204).end();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
1
|
+
import { Controller } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* {{Name}} 컨트롤러.
|
|
5
|
+
* routes/ 파일에서 라우트를 등록하세요.
|
|
6
|
+
*/
|
|
7
|
+
export default class {{Name}}Controller extends Controller {
|
|
8
|
+
|
|
9
|
+
/** 목록 조회 */
|
|
10
|
+
async index(ctx) {
|
|
11
|
+
const items = await this.db.{{Name}}.paginate(ctx.query.page || 1, 20);
|
|
12
|
+
ctx.json(items);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** 상세 조회 */
|
|
16
|
+
async show(ctx) {
|
|
17
|
+
const item = await this.db.{{Name}}.findOrFail(ctx.params.id);
|
|
18
|
+
ctx.json(item);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** 생성 */
|
|
22
|
+
async store(ctx) {
|
|
23
|
+
const item = await this.db.{{Name}}.create(ctx.body);
|
|
24
|
+
ctx.status(201).json(item);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** 수정 */
|
|
28
|
+
async update(ctx) {
|
|
29
|
+
const item = await this.db.{{Name}}.findOrFail(ctx.params.id);
|
|
30
|
+
await item.update(ctx.body);
|
|
31
|
+
ctx.json(item);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** 삭제 */
|
|
35
|
+
async destroy(ctx) {
|
|
36
|
+
const item = await this.db.{{Name}}.findOrFail(ctx.params.id);
|
|
37
|
+
await item.delete();
|
|
38
|
+
ctx.status(204).end();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* {{Name}} 이벤트 핸들러
|
|
3
|
-
*/
|
|
4
|
-
export default function register(app) {
|
|
5
|
-
app.on('{{nameLower}}:created', (data, meta) => {
|
|
6
|
-
// 이벤트 처리 로직
|
|
7
|
-
});
|
|
8
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* {{Name}} 이벤트 핸들러
|
|
3
|
+
*/
|
|
4
|
+
export default function register(app) {
|
|
5
|
+
app.on('{{nameLower}}:created', (data, meta) => {
|
|
6
|
+
// 이벤트 처리 로직
|
|
7
|
+
});
|
|
8
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Job } from '@fuzionx/framework';
|
|
2
|
-
|
|
3
|
-
export default class {{Name}}Job extends Job {
|
|
4
|
-
static schedule = 'daily:02:00';
|
|
5
|
-
static timeout = 30000;
|
|
6
|
-
|
|
7
|
-
async handle() {
|
|
8
|
-
// 정기 실행 로직
|
|
9
|
-
}
|
|
10
|
-
}
|
|
1
|
+
import { Job } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
export default class {{Name}}Job extends Job {
|
|
4
|
+
static schedule = 'daily:02:00';
|
|
5
|
+
static timeout = 30000;
|
|
6
|
+
|
|
7
|
+
async handle() {
|
|
8
|
+
// 정기 실행 로직
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Middleware } from '@fuzionx/framework';
|
|
2
|
-
|
|
3
|
-
export default class {{Name}}Middleware extends Middleware {
|
|
4
|
-
static alias = '{{nameLower}}';
|
|
5
|
-
|
|
6
|
-
async handle(ctx, next) {
|
|
7
|
-
// TODO: implement
|
|
8
|
-
await next();
|
|
9
|
-
}
|
|
10
|
-
}
|
|
1
|
+
import { Middleware } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
export default class {{Name}}Middleware extends Middleware {
|
|
4
|
+
static alias = '{{nameLower}}';
|
|
5
|
+
|
|
6
|
+
async handle(ctx, next) {
|
|
7
|
+
// TODO: implement
|
|
8
|
+
await next();
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { SQLiteModel } from '@fuzionx/framework';
|
|
2
|
-
|
|
3
|
-
export default class {{Name}} extends SQLiteModel {
|
|
4
|
-
static table = '{{tableName}}';
|
|
5
|
-
static timestamps = true;
|
|
6
|
-
static hidden = [];
|
|
7
|
-
|
|
8
|
-
static columns = {
|
|
9
|
-
id: { type: 'increments' },
|
|
10
|
-
name: { type: 'string', length: 100 },
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
// 관계 정의
|
|
14
|
-
// posts() { return this.hasMany('Post'); }
|
|
15
|
-
}
|
|
1
|
+
import { SQLiteModel } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
export default class {{Name}} extends SQLiteModel {
|
|
4
|
+
static table = '{{tableName}}';
|
|
5
|
+
static timestamps = true;
|
|
6
|
+
static hidden = [];
|
|
7
|
+
|
|
8
|
+
static columns = {
|
|
9
|
+
id: { type: 'increments' },
|
|
10
|
+
name: { type: 'string', length: 100 },
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// 관계 정의
|
|
14
|
+
// posts() { return this.hasMany('Post'); }
|
|
15
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { Service } from '@fuzionx/framework';
|
|
2
|
-
|
|
3
|
-
export default class {{Name}}Service extends Service {
|
|
4
|
-
async findAll() {
|
|
5
|
-
return this.db.{{Name}}.query().paginate();
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
async findById(id) {
|
|
9
|
-
return this.db.{{Name}}.findOrFail(id);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async create(data) {
|
|
13
|
-
return this.db.{{Name}}.create(data);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
1
|
+
import { Service } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
export default class {{Name}}Service extends Service {
|
|
4
|
+
async findAll() {
|
|
5
|
+
return this.db.{{Name}}.query().paginate();
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
async findById(id) {
|
|
9
|
+
return this.db.{{Name}}.findOrFail(id);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async create(data) {
|
|
13
|
+
return this.db.{{Name}}.create(data);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { Task } from '@fuzionx/framework';
|
|
2
|
-
|
|
3
|
-
export default class {{Name}} extends Task {
|
|
4
|
-
static queue = 'default';
|
|
5
|
-
static retries = 3;
|
|
6
|
-
static retryDelay = 5000;
|
|
7
|
-
|
|
8
|
-
async handle(data) {
|
|
9
|
-
// 비동기 작업 로직
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async failed(data, error) {
|
|
13
|
-
this.logger.error('작업 최종 실패', { error: error.message });
|
|
14
|
-
}
|
|
15
|
-
}
|
|
1
|
+
import { Task } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
export default class {{Name}} extends Task {
|
|
4
|
+
static queue = 'default';
|
|
5
|
+
static retries = 3;
|
|
6
|
+
static retryDelay = 5000;
|
|
7
|
+
|
|
8
|
+
async handle(data) {
|
|
9
|
+
// 비동기 작업 로직
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async failed(data, error) {
|
|
13
|
+
this.logger.error('작업 최종 실패', { error: error.message });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
|
|
3
|
-
describe('{{Name}}', () => {
|
|
4
|
-
it('should work', () => {
|
|
5
|
-
expect(true).toBe(true);
|
|
6
|
-
});
|
|
7
|
-
});
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
|
|
3
|
+
describe('{{Name}}', () => {
|
|
4
|
+
it('should work', () => {
|
|
5
|
+
expect(true).toBe(true);
|
|
6
|
+
});
|
|
7
|
+
});
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* {{Name}} Worker — CPU-heavy 작업 처리
|
|
3
|
-
*
|
|
4
|
-
* 사용: this.worker.run('{{nameLower}}', data)
|
|
5
|
-
*/
|
|
6
|
-
import { parentPort, workerData } from 'node:worker_threads';
|
|
7
|
-
|
|
8
|
-
async function handle(data) {
|
|
9
|
-
// TODO: CPU-heavy 로직 구현
|
|
10
|
-
return data;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const result = await handle(workerData);
|
|
14
|
-
parentPort.postMessage(result);
|
|
1
|
+
/**
|
|
2
|
+
* {{Name}} Worker — CPU-heavy 작업 처리
|
|
3
|
+
*
|
|
4
|
+
* 사용: this.worker.run('{{nameLower}}', data)
|
|
5
|
+
*/
|
|
6
|
+
import { parentPort, workerData } from 'node:worker_threads';
|
|
7
|
+
|
|
8
|
+
async function handle(data) {
|
|
9
|
+
// TODO: CPU-heavy 로직 구현
|
|
10
|
+
return data;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const result = await handle(workerData);
|
|
14
|
+
parentPort.postMessage(result);
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { WsHandler } from '@fuzionx/framework';
|
|
2
|
-
|
|
3
|
-
export default class {{Name}}Handler extends WsHandler {
|
|
4
|
-
static namespace = '/{{nameLower}}';
|
|
5
|
-
static middleware = [];
|
|
6
|
-
|
|
7
|
-
static events(e) {
|
|
8
|
-
// e.on('message', this.handleMessage);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
async onConnect(socket) {
|
|
12
|
-
this.logger.info('{{Name}} connected:', socket.sessionId);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
async onDisconnect(socket, code, reason) {
|
|
16
|
-
this.logger.info('{{Name}} disconnected:', socket.sessionId);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
1
|
+
import { WsHandler } from '@fuzionx/framework';
|
|
2
|
+
|
|
3
|
+
export default class {{Name}}Handler extends WsHandler {
|
|
4
|
+
static namespace = '/{{nameLower}}';
|
|
5
|
+
static middleware = [];
|
|
6
|
+
|
|
7
|
+
static events(e) {
|
|
8
|
+
// e.on('message', this.handleMessage);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
async onConnect(socket) {
|
|
12
|
+
this.logger.info('{{Name}} connected:', socket.sessionId);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async onDisconnect(socket, code, reason) {
|
|
16
|
+
this.logger.info('{{Name}} disconnected:', socket.sessionId);
|
|
17
|
+
}
|
|
18
|
+
}
|
package/index.js
CHANGED
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fuzionx/framework
|
|
3
|
-
*
|
|
4
|
-
* Full-stack MVC framework built on @fuzionx/core.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// ── Core ──
|
|
8
|
-
export { default as AppError, ServiceError, ValidationError } from './lib/core/AppError.js';
|
|
9
|
-
export { default as Config } from './lib/core/Config.js';
|
|
10
|
-
export { default as Base } from './lib/core/Base.js';
|
|
11
|
-
export { default as Application } from './lib/core/Application.js';
|
|
12
|
-
export { default as Context } from './lib/core/Context.js';
|
|
13
|
-
export { default as AutoLoader } from './lib/core/AutoLoader.js';
|
|
14
|
-
|
|
15
|
-
// ── HTTP ──
|
|
16
|
-
export { default as Router, RouteGroup } from './lib/http/Router.js';
|
|
17
|
-
export { default as Controller } from './lib/http/Controller.js';
|
|
18
|
-
export { default as Middleware, runMiddlewareChain } from './lib/http/Middleware.js';
|
|
19
|
-
export { default as ErrorHandler } from './lib/http/ErrorHandler.js';
|
|
20
|
-
export { default as Validation, parseRules } from './lib/http/Validation.js';
|
|
21
|
-
|
|
22
|
-
// ── Database ──
|
|
23
|
-
export { default as Model } from './lib/database/Model.js';
|
|
24
|
-
export { default as SqlModel } from './lib/database/SqlModel.js';
|
|
25
|
-
export { default as SQLiteModel } from './lib/database/SQLiteModel.js';
|
|
26
|
-
export { default as MariaModel } from './lib/database/MariaModel.js';
|
|
27
|
-
export { default as PostgreModel } from './lib/database/PostgreModel.js';
|
|
28
|
-
export { default as MongoModel } from './lib/database/MongoModel.js';
|
|
29
|
-
export { default as ModelRegistry } from './lib/database/ModelRegistry.js';
|
|
30
|
-
export { default as QueryBuilder } from './lib/database/QueryBuilder.js';
|
|
31
|
-
export { default as SqlQueryBuilder } from './lib/database/SqlQueryBuilder.js';
|
|
32
|
-
export { default as ConnectionManager } from './lib/database/ConnectionManager.js';
|
|
33
|
-
export { default as Pagination } from './lib/database/Pagination.js';
|
|
34
|
-
|
|
35
|
-
// ── Services ──
|
|
36
|
-
export { default as Service } from './lib/services/Service.js';
|
|
37
|
-
export { default as EventBus } from './lib/services/EventBus.js';
|
|
38
|
-
export { default as Storage } from './lib/services/Storage.js';
|
|
39
|
-
|
|
40
|
-
// ── Realtime ──
|
|
41
|
-
export { default as WsHandler, EventBuilder } from './lib/realtime/WsHandler.js';
|
|
42
|
-
export { default as RoomManager } from './lib/realtime/RoomManager.js';
|
|
43
|
-
|
|
44
|
-
// ── Schedule ──
|
|
45
|
-
export { default as Scheduler } from './lib/schedule/Scheduler.js';
|
|
46
|
-
export { default as Queue } from './lib/schedule/Queue.js';
|
|
47
|
-
export { default as Job } from './lib/schedule/Job.js';
|
|
48
|
-
export { default as Task } from './lib/schedule/Task.js';
|
|
49
|
-
export { default as WorkerPool } from './lib/schedule/WorkerPool.js';
|
|
50
|
-
|
|
51
|
-
// ── Helpers (Bridge N-API) ──
|
|
52
|
-
export { default as Logger } from './lib/helpers/Logger.js';
|
|
53
|
-
export { default as I18nHelper } from './lib/helpers/I18nHelper.js';
|
|
54
|
-
export { default as CryptoHelper } from './lib/helpers/CryptoHelper.js';
|
|
55
|
-
export { default as HashHelper } from './lib/helpers/HashHelper.js';
|
|
56
|
-
export { default as MediaHelper } from './lib/helpers/MediaHelper.js';
|
|
57
|
-
export { default as FileHelper } from './lib/helpers/FileHelper.js';
|
|
58
|
-
|
|
59
|
-
// ── View ──
|
|
60
|
-
export { default as View } from './lib/view/View.js';
|
|
61
|
-
export { default as OpenAPI } from './lib/view/OpenAPI.js';
|
|
62
|
-
|
|
63
|
-
// ── Utilities (Stateless) ──
|
|
64
|
-
export { PaginationUtil, StrUtil, NumUtil, DateUtil, ArrUtil, FunctionUtil, ObjectUtil } from './lib/utilities/index.js';
|
|
65
|
-
|
|
66
|
-
// ── Built-in Middleware ──
|
|
67
|
-
export { bodyParser, cors, auth, apiAuth, csrf, session, theme } from './lib/middleware/index.js';
|
|
1
|
+
/**
|
|
2
|
+
* @fuzionx/framework
|
|
3
|
+
*
|
|
4
|
+
* Full-stack MVC framework built on @fuzionx/core.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// ── Core ──
|
|
8
|
+
export { default as AppError, ServiceError, ValidationError } from './lib/core/AppError.js';
|
|
9
|
+
export { default as Config } from './lib/core/Config.js';
|
|
10
|
+
export { default as Base } from './lib/core/Base.js';
|
|
11
|
+
export { default as Application } from './lib/core/Application.js';
|
|
12
|
+
export { default as Context } from './lib/core/Context.js';
|
|
13
|
+
export { default as AutoLoader } from './lib/core/AutoLoader.js';
|
|
14
|
+
|
|
15
|
+
// ── HTTP ──
|
|
16
|
+
export { default as Router, RouteGroup } from './lib/http/Router.js';
|
|
17
|
+
export { default as Controller } from './lib/http/Controller.js';
|
|
18
|
+
export { default as Middleware, runMiddlewareChain } from './lib/http/Middleware.js';
|
|
19
|
+
export { default as ErrorHandler } from './lib/http/ErrorHandler.js';
|
|
20
|
+
export { default as Validation, parseRules } from './lib/http/Validation.js';
|
|
21
|
+
|
|
22
|
+
// ── Database ──
|
|
23
|
+
export { default as Model } from './lib/database/Model.js';
|
|
24
|
+
export { default as SqlModel } from './lib/database/SqlModel.js';
|
|
25
|
+
export { default as SQLiteModel } from './lib/database/SQLiteModel.js';
|
|
26
|
+
export { default as MariaModel } from './lib/database/MariaModel.js';
|
|
27
|
+
export { default as PostgreModel } from './lib/database/PostgreModel.js';
|
|
28
|
+
export { default as MongoModel } from './lib/database/MongoModel.js';
|
|
29
|
+
export { default as ModelRegistry } from './lib/database/ModelRegistry.js';
|
|
30
|
+
export { default as QueryBuilder } from './lib/database/QueryBuilder.js';
|
|
31
|
+
export { default as SqlQueryBuilder } from './lib/database/SqlQueryBuilder.js';
|
|
32
|
+
export { default as ConnectionManager } from './lib/database/ConnectionManager.js';
|
|
33
|
+
export { default as Pagination } from './lib/database/Pagination.js';
|
|
34
|
+
|
|
35
|
+
// ── Services ──
|
|
36
|
+
export { default as Service } from './lib/services/Service.js';
|
|
37
|
+
export { default as EventBus } from './lib/services/EventBus.js';
|
|
38
|
+
export { default as Storage } from './lib/services/Storage.js';
|
|
39
|
+
|
|
40
|
+
// ── Realtime ──
|
|
41
|
+
export { default as WsHandler, EventBuilder } from './lib/realtime/WsHandler.js';
|
|
42
|
+
export { default as RoomManager } from './lib/realtime/RoomManager.js';
|
|
43
|
+
|
|
44
|
+
// ── Schedule ──
|
|
45
|
+
export { default as Scheduler } from './lib/schedule/Scheduler.js';
|
|
46
|
+
export { default as Queue } from './lib/schedule/Queue.js';
|
|
47
|
+
export { default as Job } from './lib/schedule/Job.js';
|
|
48
|
+
export { default as Task } from './lib/schedule/Task.js';
|
|
49
|
+
export { default as WorkerPool } from './lib/schedule/WorkerPool.js';
|
|
50
|
+
|
|
51
|
+
// ── Helpers (Bridge N-API) ──
|
|
52
|
+
export { default as Logger } from './lib/helpers/Logger.js';
|
|
53
|
+
export { default as I18nHelper } from './lib/helpers/I18nHelper.js';
|
|
54
|
+
export { default as CryptoHelper } from './lib/helpers/CryptoHelper.js';
|
|
55
|
+
export { default as HashHelper } from './lib/helpers/HashHelper.js';
|
|
56
|
+
export { default as MediaHelper } from './lib/helpers/MediaHelper.js';
|
|
57
|
+
export { default as FileHelper } from './lib/helpers/FileHelper.js';
|
|
58
|
+
|
|
59
|
+
// ── View ──
|
|
60
|
+
export { default as View } from './lib/view/View.js';
|
|
61
|
+
export { default as OpenAPI } from './lib/view/OpenAPI.js';
|
|
62
|
+
|
|
63
|
+
// ── Utilities (Stateless) ──
|
|
64
|
+
export { PaginationUtil, StrUtil, NumUtil, DateUtil, ArrUtil, FunctionUtil, ObjectUtil } from './lib/utilities/index.js';
|
|
65
|
+
|
|
66
|
+
// ── Built-in Middleware ──
|
|
67
|
+
export { bodyParser, cors, auth, apiAuth, csrf, session, theme } from './lib/middleware/index.js';
|