befly 2.3.3 → 3.0.1
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/checks/conflict.ts +329 -0
- package/checks/table.ts +252 -0
- package/config/env.ts +218 -0
- package/config/fields.ts +55 -0
- package/config/regexAliases.ts +51 -0
- package/config/reserved.ts +96 -0
- package/main.ts +47 -0
- package/package.json +26 -11
- package/plugins/db.ts +60 -0
- package/plugins/logger.ts +28 -0
- package/plugins/redis.ts +47 -0
- package/scripts/syncDb/apply.ts +171 -0
- package/scripts/syncDb/constants.ts +71 -0
- package/scripts/syncDb/ddl.ts +189 -0
- package/scripts/syncDb/helpers.ts +173 -0
- package/scripts/syncDb/index.ts +203 -0
- package/scripts/syncDb/schema.ts +199 -0
- package/scripts/syncDb/sqlite.ts +50 -0
- package/scripts/syncDb/state.ts +106 -0
- package/scripts/syncDb/table.ts +214 -0
- package/scripts/syncDb/tableCreate.ts +148 -0
- package/scripts/syncDb/tests/constants.test.ts +105 -0
- package/scripts/syncDb/tests/ddl.test.ts +134 -0
- package/scripts/syncDb/tests/helpers.test.ts +70 -0
- package/scripts/syncDb/types.ts +92 -0
- package/scripts/syncDb/version.ts +73 -0
- package/scripts/syncDb.ts +10 -0
- package/tsconfig.json +58 -0
- package/types/addon.d.ts +53 -0
- package/types/api.d.ts +249 -0
- package/types/befly.d.ts +230 -0
- package/types/common.d.ts +215 -0
- package/types/context.d.ts +7 -0
- package/types/crypto.d.ts +23 -0
- package/types/database.d.ts +273 -0
- package/types/index.d.ts +450 -0
- package/types/index.ts +438 -0
- package/types/jwt.d.ts +99 -0
- package/types/logger.d.ts +43 -0
- package/types/plugin.d.ts +109 -0
- package/types/redis.d.ts +46 -0
- package/types/tool.d.ts +67 -0
- package/types/validator.d.ts +43 -0
- package/types/validator.ts +43 -0
- package/utils/colors.ts +221 -0
- package/utils/crypto.ts +308 -0
- package/utils/database.ts +348 -0
- package/utils/dbHelper.ts +713 -0
- package/utils/helper.ts +812 -0
- package/utils/index.ts +33 -0
- package/utils/jwt.ts +493 -0
- package/utils/logger.ts +191 -0
- package/utils/redisHelper.ts +321 -0
- package/utils/requestContext.ts +167 -0
- package/utils/sqlBuilder.ts +611 -0
- package/utils/validate.ts +493 -0
- package/utils/{xml.js → xml.ts} +100 -74
- package/.npmrc +0 -3
- package/.prettierignore +0 -2
- package/.prettierrc +0 -11
- package/apis/health/info.js +0 -49
- package/apis/tool/tokenCheck.js +0 -29
- package/bin/befly.js +0 -109
- package/bunfig.toml +0 -3
- package/checks/table.js +0 -206
- package/config/env.js +0 -64
- package/main.js +0 -579
- package/plugins/db.js +0 -46
- package/plugins/logger.js +0 -14
- package/plugins/redis.js +0 -32
- package/plugins/tool.js +0 -8
- package/scripts/syncDb.js +0 -752
- package/scripts/syncDev.js +0 -96
- package/system.js +0 -118
- package/tables/common.json +0 -16
- package/tables/tool.json +0 -6
- package/utils/api.js +0 -27
- package/utils/colors.js +0 -83
- package/utils/crypto.js +0 -260
- package/utils/index.js +0 -334
- package/utils/jwt.js +0 -387
- package/utils/logger.js +0 -143
- package/utils/redisHelper.js +0 -74
- package/utils/sqlBuilder.js +0 -498
- package/utils/sqlManager.js +0 -471
- package/utils/tool.js +0 -31
- package/utils/validate.js +0 -226
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* syncDb 类型定义模块
|
|
3
|
+
*
|
|
4
|
+
* 集中管理核心类型定义
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// ==================== 数据库相关类型 ====================
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 列信息接口
|
|
11
|
+
*/
|
|
12
|
+
export interface ColumnInfo {
|
|
13
|
+
type: string;
|
|
14
|
+
columnType: string;
|
|
15
|
+
length: number | null;
|
|
16
|
+
nullable: boolean;
|
|
17
|
+
defaultValue: any;
|
|
18
|
+
comment: string | null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 索引信息接口(键为索引名,值为列名数组)
|
|
23
|
+
*/
|
|
24
|
+
export interface IndexInfo {
|
|
25
|
+
[indexName: string]: string[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ==================== 变更相关类型 ====================
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 字段变更接口
|
|
32
|
+
*/
|
|
33
|
+
export interface FieldChange {
|
|
34
|
+
type: 'length' | 'datatype' | 'comment' | 'default';
|
|
35
|
+
current: any;
|
|
36
|
+
expected: any;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 索引操作接口
|
|
41
|
+
*/
|
|
42
|
+
export interface IndexAction {
|
|
43
|
+
action: 'create' | 'drop';
|
|
44
|
+
indexName: string;
|
|
45
|
+
fieldName: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 表变更计划接口
|
|
50
|
+
*/
|
|
51
|
+
export interface TablePlan {
|
|
52
|
+
changed: boolean;
|
|
53
|
+
addClauses: string[];
|
|
54
|
+
modifyClauses: string[];
|
|
55
|
+
defaultClauses: string[];
|
|
56
|
+
indexActions: IndexAction[];
|
|
57
|
+
commentActions?: string[];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ==================== 统计相关类型 ====================
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 全局统计对象
|
|
64
|
+
*/
|
|
65
|
+
export interface GlobalStats {
|
|
66
|
+
processedTables: number;
|
|
67
|
+
createdTables: number;
|
|
68
|
+
modifiedTables: number;
|
|
69
|
+
addFields: number;
|
|
70
|
+
nameChanges: number;
|
|
71
|
+
typeChanges: number;
|
|
72
|
+
minChanges: number;
|
|
73
|
+
maxChanges: number;
|
|
74
|
+
defaultChanges: number;
|
|
75
|
+
indexCreate: number;
|
|
76
|
+
indexDrop: number;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ==================== 解析相关类型 ====================
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 解析后的字段规则
|
|
83
|
+
*/
|
|
84
|
+
export interface ParsedFieldRule {
|
|
85
|
+
name: string;
|
|
86
|
+
type: string;
|
|
87
|
+
min: any;
|
|
88
|
+
max: any;
|
|
89
|
+
default: any;
|
|
90
|
+
index: number;
|
|
91
|
+
regex: string;
|
|
92
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* syncDb 数据库版本检查模块
|
|
3
|
+
*
|
|
4
|
+
* 包含:
|
|
5
|
+
* - 数据库版本验证(MySQL/PostgreSQL/SQLite)
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Logger } from '../../utils/logger.js';
|
|
9
|
+
import { Env } from '../../config/env.js';
|
|
10
|
+
import { DB_VERSION_REQUIREMENTS, IS_MYSQL, IS_PG, IS_SQLITE } from './constants.js';
|
|
11
|
+
import type { SQL } from 'bun';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 数据库版本检查(按方言)
|
|
15
|
+
*
|
|
16
|
+
* 根据当前数据库类型检查版本是否符合最低要求:
|
|
17
|
+
* - MySQL: >= 8.0
|
|
18
|
+
* - PostgreSQL: >= 17
|
|
19
|
+
* - SQLite: >= 3.50.0
|
|
20
|
+
*
|
|
21
|
+
* @param sql - SQL 客户端实例
|
|
22
|
+
* @throws {Error} 如果数据库版本不符合要求或无法获取版本信息
|
|
23
|
+
*/
|
|
24
|
+
export async function ensureDbVersion(sql: SQL): Promise<void> {
|
|
25
|
+
if (!sql) throw new Error('SQL 客户端未初始化');
|
|
26
|
+
|
|
27
|
+
if (IS_MYSQL) {
|
|
28
|
+
const r = await sql`SELECT VERSION() AS version`;
|
|
29
|
+
if (!r || r.length === 0 || !r[0]?.version) {
|
|
30
|
+
throw new Error('无法获取 MySQL 版本信息');
|
|
31
|
+
}
|
|
32
|
+
const version = r[0].version;
|
|
33
|
+
const majorVersion = parseInt(String(version).split('.')[0], 10);
|
|
34
|
+
if (!Number.isFinite(majorVersion) || majorVersion < DB_VERSION_REQUIREMENTS.MYSQL_MIN_MAJOR) {
|
|
35
|
+
throw new Error(`此脚本仅支持 MySQL ${DB_VERSION_REQUIREMENTS.MYSQL_MIN_MAJOR}.0+,当前版本: ${version}`);
|
|
36
|
+
}
|
|
37
|
+
Logger.info(`MySQL 版本: ${version}`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (IS_PG) {
|
|
42
|
+
const r = await sql`SELECT version() AS version`;
|
|
43
|
+
if (!r || r.length === 0 || !r[0]?.version) {
|
|
44
|
+
throw new Error('无法获取 PostgreSQL 版本信息');
|
|
45
|
+
}
|
|
46
|
+
const versionText = r[0].version;
|
|
47
|
+
Logger.info(`PostgreSQL 版本: ${versionText}`);
|
|
48
|
+
const m = /PostgreSQL\s+(\d+)/i.exec(versionText);
|
|
49
|
+
const major = m ? parseInt(m[1], 10) : NaN;
|
|
50
|
+
if (!Number.isFinite(major) || major < DB_VERSION_REQUIREMENTS.POSTGRES_MIN_MAJOR) {
|
|
51
|
+
throw new Error(`此脚本要求 PostgreSQL >= ${DB_VERSION_REQUIREMENTS.POSTGRES_MIN_MAJOR},当前: ${versionText}`);
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (IS_SQLITE) {
|
|
57
|
+
const r = await sql`SELECT sqlite_version() AS version`;
|
|
58
|
+
if (!r || r.length === 0 || !r[0]?.version) {
|
|
59
|
+
throw new Error('无法获取 SQLite 版本信息');
|
|
60
|
+
}
|
|
61
|
+
const version = r[0].version;
|
|
62
|
+
Logger.info(`SQLite 版本: ${version}`);
|
|
63
|
+
// 强制最低版本:SQLite ≥ 3.50.0
|
|
64
|
+
const [maj, min, patch] = String(version)
|
|
65
|
+
.split('.')
|
|
66
|
+
.map((v) => parseInt(v, 10) || 0);
|
|
67
|
+
const vnum = maj * 10000 + min * 100 + patch; // 3.50.0 -> 35000
|
|
68
|
+
if (!Number.isFinite(vnum) || vnum < DB_VERSION_REQUIREMENTS.SQLITE_MIN_VERSION_NUM) {
|
|
69
|
+
throw new Error(`此脚本要求 SQLite >= ${DB_VERSION_REQUIREMENTS.SQLITE_MIN_VERSION},当前: ${version}`);
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
// 基础配置
|
|
4
|
+
"target": "ESNext",
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"lib": ["ESNext"],
|
|
7
|
+
"moduleResolution": "bundler",
|
|
8
|
+
|
|
9
|
+
// 类型检查
|
|
10
|
+
"strict": true,
|
|
11
|
+
"noImplicitAny": true,
|
|
12
|
+
"strictNullChecks": true,
|
|
13
|
+
"strictFunctionTypes": true,
|
|
14
|
+
"strictBindCallApply": true,
|
|
15
|
+
"strictPropertyInitialization": true,
|
|
16
|
+
"noImplicitThis": true,
|
|
17
|
+
"alwaysStrict": true,
|
|
18
|
+
|
|
19
|
+
// 额外检查
|
|
20
|
+
"noUnusedLocals": true,
|
|
21
|
+
"noUnusedParameters": true,
|
|
22
|
+
"noImplicitReturns": true,
|
|
23
|
+
"noFallthroughCasesInSwitch": true,
|
|
24
|
+
"noUncheckedIndexedAccess": false,
|
|
25
|
+
"noImplicitOverride": true,
|
|
26
|
+
"noPropertyAccessFromIndexSignature": false,
|
|
27
|
+
|
|
28
|
+
// 模块
|
|
29
|
+
"esModuleInterop": true,
|
|
30
|
+
"allowSyntheticDefaultImports": true,
|
|
31
|
+
"forceConsistentCasingInFileNames": true,
|
|
32
|
+
"resolveJsonModule": true,
|
|
33
|
+
"isolatedModules": true,
|
|
34
|
+
|
|
35
|
+
// 输出
|
|
36
|
+
"declaration": true,
|
|
37
|
+
"declarationMap": true,
|
|
38
|
+
"sourceMap": true,
|
|
39
|
+
"removeComments": false,
|
|
40
|
+
"importHelpers": false,
|
|
41
|
+
|
|
42
|
+
// 高级
|
|
43
|
+
"skipLibCheck": true,
|
|
44
|
+
"allowJs": true,
|
|
45
|
+
"checkJs": false,
|
|
46
|
+
|
|
47
|
+
// Bun 特定
|
|
48
|
+
"types": ["bun-types"],
|
|
49
|
+
|
|
50
|
+
// 路径
|
|
51
|
+
"baseUrl": ".",
|
|
52
|
+
"paths": {
|
|
53
|
+
"@/*": ["./*"]
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"include": ["**/*.ts", "**/*.js"],
|
|
57
|
+
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.test.js"]
|
|
58
|
+
}
|
package/types/addon.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Addon 配置类型定义
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Addon 作者信息
|
|
7
|
+
*/
|
|
8
|
+
export interface AddonAuthor {
|
|
9
|
+
/** 作者名称 */
|
|
10
|
+
name: string;
|
|
11
|
+
/** 作者邮箱 */
|
|
12
|
+
email?: string;
|
|
13
|
+
/** 作者网站 */
|
|
14
|
+
url?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Addon 配置
|
|
19
|
+
*/
|
|
20
|
+
export interface AddonConfig {
|
|
21
|
+
/** Addon 唯一标识(小写、短横线或下划线),例如 "admin"、"demo" */
|
|
22
|
+
name: string;
|
|
23
|
+
|
|
24
|
+
/** Addon 人类可读名称,例如 "管理后台" */
|
|
25
|
+
title: string;
|
|
26
|
+
|
|
27
|
+
/** 版本号(语义化版本),例如 "1.0.0" */
|
|
28
|
+
version?: string;
|
|
29
|
+
|
|
30
|
+
/** 简短描述 */
|
|
31
|
+
description?: string;
|
|
32
|
+
|
|
33
|
+
/** 作者信息 */
|
|
34
|
+
author?: AddonAuthor | string;
|
|
35
|
+
|
|
36
|
+
/** 源码仓库链接 */
|
|
37
|
+
repo?: string;
|
|
38
|
+
|
|
39
|
+
/** 关键词(用于搜索和分类) */
|
|
40
|
+
keywords?: string[];
|
|
41
|
+
|
|
42
|
+
/** 主入口文件路径(相对于 addon 目录),例如 "index.ts" */
|
|
43
|
+
entry?: string;
|
|
44
|
+
|
|
45
|
+
/** 是否默认启用 */
|
|
46
|
+
enabled?: boolean;
|
|
47
|
+
|
|
48
|
+
/** 依赖的其他 addon 或核心包 */
|
|
49
|
+
dependencies?: Record<string, string>;
|
|
50
|
+
|
|
51
|
+
/** 许可证 */
|
|
52
|
+
license?: string;
|
|
53
|
+
}
|
package/types/api.d.ts
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Befly API 类型定义
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { BeflyContext } from './befly.js';
|
|
6
|
+
import type { KeyValue, TableDefinition } from './common.js';
|
|
7
|
+
import type { RequestContext } from './context.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* HTTP 方法类型
|
|
11
|
+
*/
|
|
12
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 请求上下文类型(已废弃,使用 RequestContext 类)
|
|
16
|
+
* @deprecated 使用 RequestContext 类替代
|
|
17
|
+
*/
|
|
18
|
+
export interface RequestContext<T = any> {
|
|
19
|
+
/** 请求对象 */
|
|
20
|
+
request: Request;
|
|
21
|
+
|
|
22
|
+
/** 请求体参数 */
|
|
23
|
+
body: T;
|
|
24
|
+
|
|
25
|
+
/** URL 参数 */
|
|
26
|
+
query: KeyValue<string>;
|
|
27
|
+
|
|
28
|
+
/** 路径参数 */
|
|
29
|
+
pathParams: KeyValue<string>;
|
|
30
|
+
|
|
31
|
+
/** 请求头 */
|
|
32
|
+
headers: Headers;
|
|
33
|
+
|
|
34
|
+
/** 用户信息(认证后) */
|
|
35
|
+
user?: UserInfo;
|
|
36
|
+
|
|
37
|
+
/** 客户端 IP */
|
|
38
|
+
ip?: string;
|
|
39
|
+
|
|
40
|
+
/** User-Agent */
|
|
41
|
+
userAgent?: string;
|
|
42
|
+
|
|
43
|
+
/** 请求 ID */
|
|
44
|
+
requestId?: string;
|
|
45
|
+
|
|
46
|
+
/** 开始时间 */
|
|
47
|
+
startTime: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 用户信息类型
|
|
52
|
+
*/
|
|
53
|
+
export interface UserInfo {
|
|
54
|
+
id: number;
|
|
55
|
+
username?: string;
|
|
56
|
+
email?: string;
|
|
57
|
+
role?: string;
|
|
58
|
+
[key: string]: any;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 认证类型
|
|
63
|
+
* - false: 不需要认证
|
|
64
|
+
* - true: 需要认证(验证 token)
|
|
65
|
+
* - 'admin': 需要管理员权限
|
|
66
|
+
* - 'user': 需要普通用户权限
|
|
67
|
+
* - string[]: 需要特定角色
|
|
68
|
+
*/
|
|
69
|
+
export type AuthType = boolean | 'admin' | 'user' | string[];
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* API 处理器函数类型
|
|
73
|
+
*/
|
|
74
|
+
export type ApiHandler<T = any, R = any> = (befly: BeflyContext, ctx: RequestContext, req?: Request) => Promise<Response | R> | Response | R;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 字段规则定义
|
|
78
|
+
* 键为字段名,值为字段规则字符串
|
|
79
|
+
*/
|
|
80
|
+
export type FieldRules = Record<string, string>;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* API 配置选项
|
|
84
|
+
*/
|
|
85
|
+
export interface ApiOptions {
|
|
86
|
+
/** HTTP 方法 */
|
|
87
|
+
method: HttpMethod;
|
|
88
|
+
/** 是否需要认证(true/false/角色数组) */
|
|
89
|
+
auth?: boolean | string[];
|
|
90
|
+
/** 字段规则 */
|
|
91
|
+
fields?: FieldRules;
|
|
92
|
+
/** 必填字段 */
|
|
93
|
+
required?: string[];
|
|
94
|
+
/** 处理函数 */
|
|
95
|
+
handler: ApiHandler;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* API 路由配置
|
|
100
|
+
*/
|
|
101
|
+
export interface ApiRoute<T = any, R = any> {
|
|
102
|
+
/** 接口名称(必填) */
|
|
103
|
+
name: string;
|
|
104
|
+
|
|
105
|
+
/** 处理器函数(必填) */
|
|
106
|
+
handler: ApiHandler<T, R>;
|
|
107
|
+
|
|
108
|
+
/** HTTP 方法(可选,默认 POST) */
|
|
109
|
+
method?: HttpMethod;
|
|
110
|
+
|
|
111
|
+
/** 认证类型(可选,默认 true)
|
|
112
|
+
* - true: 需要登录
|
|
113
|
+
* - false: 公开访问(无需登录)
|
|
114
|
+
*/
|
|
115
|
+
auth?: boolean;
|
|
116
|
+
|
|
117
|
+
/** 字段定义(验证规则)(可选,默认 {}) */
|
|
118
|
+
fields?: TableDefinition;
|
|
119
|
+
|
|
120
|
+
/** 必填字段(可选,默认 []) */
|
|
121
|
+
required?: string[];
|
|
122
|
+
|
|
123
|
+
/** 路由路径(运行时生成) */
|
|
124
|
+
route?: string;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* API 构建器接口
|
|
129
|
+
*/
|
|
130
|
+
export interface ApiBuilder {
|
|
131
|
+
/** 设置 HTTP 方法 */
|
|
132
|
+
method(method: HttpMethod): this;
|
|
133
|
+
|
|
134
|
+
/** 设置路径 */
|
|
135
|
+
path(path: string): this;
|
|
136
|
+
|
|
137
|
+
/** 设置描述 */
|
|
138
|
+
description(desc: string): this;
|
|
139
|
+
|
|
140
|
+
/** 设置认证 */
|
|
141
|
+
auth(auth: AuthType): this;
|
|
142
|
+
|
|
143
|
+
/** 设置验证规则 */
|
|
144
|
+
rules(rules: KeyValue<string>): this;
|
|
145
|
+
|
|
146
|
+
/** 设置必填字段 */
|
|
147
|
+
required(fields: string[]): this;
|
|
148
|
+
|
|
149
|
+
/** 设置处理器 */
|
|
150
|
+
handler(handler: ApiHandler): this;
|
|
151
|
+
|
|
152
|
+
/** 构建路由 */
|
|
153
|
+
build(): ApiRoute;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* API 响应辅助函数
|
|
158
|
+
*/
|
|
159
|
+
export interface ApiResponse {
|
|
160
|
+
/** 成功响应 */
|
|
161
|
+
success<T = any>(message: string, data?: T): Response;
|
|
162
|
+
|
|
163
|
+
/** 失败响应 */
|
|
164
|
+
error(message: string, error?: any): Response;
|
|
165
|
+
|
|
166
|
+
/** JSON 响应 */
|
|
167
|
+
json<T = any>(data: T, status?: number): Response;
|
|
168
|
+
|
|
169
|
+
/** 文本响应 */
|
|
170
|
+
text(text: string, status?: number): Response;
|
|
171
|
+
|
|
172
|
+
/** HTML 响应 */
|
|
173
|
+
html(html: string, status?: number): Response;
|
|
174
|
+
|
|
175
|
+
/** 重定向 */
|
|
176
|
+
redirect(url: string, status?: number): Response;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* 路由匹配结果
|
|
181
|
+
*/
|
|
182
|
+
export interface RouteMatch {
|
|
183
|
+
/** 路由配置 */
|
|
184
|
+
route: ApiRoute;
|
|
185
|
+
|
|
186
|
+
/** 路径参数 */
|
|
187
|
+
params: KeyValue<string>;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* 路由器接口
|
|
192
|
+
*/
|
|
193
|
+
export interface Router {
|
|
194
|
+
/** 添加路由 */
|
|
195
|
+
add(route: ApiRoute): void;
|
|
196
|
+
|
|
197
|
+
/** 匹配路由 */
|
|
198
|
+
match(method: HttpMethod, path: string): RouteMatch | null;
|
|
199
|
+
|
|
200
|
+
/** 获取所有路由 */
|
|
201
|
+
getRoutes(): ApiRoute[];
|
|
202
|
+
|
|
203
|
+
/** 删除路由 */
|
|
204
|
+
remove(method: HttpMethod, path: string): boolean;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// ========== API 响应数据类型 ==========
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* 令牌检测响应数据
|
|
211
|
+
*/
|
|
212
|
+
export interface TokenCheckData {
|
|
213
|
+
/** 令牌是否有效 */
|
|
214
|
+
valid: boolean;
|
|
215
|
+
/** JWT 载荷(有效时返回) */
|
|
216
|
+
payload?: any;
|
|
217
|
+
/** 过期时间(秒) */
|
|
218
|
+
expiresIn?: number;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* 健康检查响应数据
|
|
223
|
+
*/
|
|
224
|
+
export interface HealthInfo {
|
|
225
|
+
/** 服务状态 */
|
|
226
|
+
status: string;
|
|
227
|
+
/** 时间戳 */
|
|
228
|
+
timestamp: string;
|
|
229
|
+
/** 运行时长(秒) */
|
|
230
|
+
uptime: number;
|
|
231
|
+
/** 内存使用情况 */
|
|
232
|
+
memory: NodeJS.MemoryUsage;
|
|
233
|
+
/** 运行时名称 */
|
|
234
|
+
runtime: string;
|
|
235
|
+
/** 版本号 */
|
|
236
|
+
version: string;
|
|
237
|
+
/** 平台 */
|
|
238
|
+
platform: string;
|
|
239
|
+
/** 架构 */
|
|
240
|
+
arch: string;
|
|
241
|
+
/** Redis 状态 */
|
|
242
|
+
redis?: string;
|
|
243
|
+
/** Redis 错误信息 */
|
|
244
|
+
redisError?: string;
|
|
245
|
+
/** 数据库状态 */
|
|
246
|
+
database?: string;
|
|
247
|
+
/** 数据库错误信息 */
|
|
248
|
+
databaseError?: string;
|
|
249
|
+
}
|