befly-shared 1.2.7 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +13 -30
- package/utils/arrayToTree.ts +135 -0
- package/utils/buildTreeByParentPath.ts +127 -0
- package/utils/scanViewsDir.ts +148 -0
- package/README.md +0 -439
- package/dist/addonHelper.js +0 -83
- package/dist/arrayKeysToCamel.js +0 -18
- package/dist/arrayToTree.js +0 -23
- package/dist/calcPerfTime.js +0 -13
- package/dist/configTypes.js +0 -1
- package/dist/constants.js +0 -46
- package/dist/fieldClear.js +0 -57
- package/dist/genShortId.js +0 -12
- package/dist/hashPassword.js +0 -22
- package/dist/index.js +0 -25
- package/dist/keysToCamel.js +0 -21
- package/dist/keysToSnake.js +0 -21
- package/dist/layouts.js +0 -59
- package/dist/pickFields.js +0 -16
- package/dist/redisKeys.js +0 -34
- package/dist/regex.js +0 -202
- package/dist/scanConfig.js +0 -83
- package/dist/scanFiles.js +0 -39
- package/dist/scanViews.js +0 -48
- package/dist/withDefaultColumns.js +0 -32
- package/src/addonHelper.ts +0 -88
- package/src/arrayKeysToCamel.ts +0 -18
- package/src/arrayToTree.ts +0 -31
- package/src/calcPerfTime.ts +0 -13
- package/src/configTypes.ts +0 -29
- package/src/constants.ts +0 -60
- package/src/fieldClear.ts +0 -75
- package/src/genShortId.ts +0 -12
- package/src/hashPassword.ts +0 -27
- package/src/index.ts +0 -28
- package/src/keysToCamel.ts +0 -22
- package/src/keysToSnake.ts +0 -22
- package/src/layouts.ts +0 -90
- package/src/pickFields.ts +0 -19
- package/src/redisKeys.ts +0 -44
- package/src/regex.ts +0 -225
- package/src/scanConfig.ts +0 -106
- package/src/scanFiles.ts +0 -49
- package/src/scanViews.ts +0 -55
- package/src/withDefaultColumns.ts +0 -36
- package/tests/addonHelper.test.ts +0 -55
- package/tests/arrayKeysToCamel.test.ts +0 -21
- package/tests/arrayToTree.test.ts +0 -98
- package/tests/calcPerfTime.test.ts +0 -19
- package/tests/fieldClear.test.ts +0 -39
- package/tests/keysToCamel.test.ts +0 -22
- package/tests/keysToSnake.test.ts +0 -22
- package/tests/layouts.test.ts +0 -93
- package/tests/pickFields.test.ts +0 -22
- package/tests/regex.test.ts +0 -308
- package/tests/scanFiles.test.ts +0 -58
- package/tests/types.test.ts +0 -289
- package/types/addon.d.ts +0 -50
- package/types/addonConfigMerge.d.ts +0 -17
- package/types/addonHelper.d.ts +0 -24
- package/types/api.d.ts +0 -63
- package/types/arrayKeysToCamel.d.ts +0 -13
- package/types/arrayToTree.d.ts +0 -8
- package/types/calcPerfTime.d.ts +0 -4
- package/types/common.d.ts +0 -8
- package/types/configMerge.d.ts +0 -49
- package/types/configTypes.d.ts +0 -28
- package/types/constants.d.ts +0 -48
- package/types/context.d.ts +0 -38
- package/types/crypto.d.ts +0 -23
- package/types/database.d.ts +0 -55
- package/types/fieldClear.d.ts +0 -16
- package/types/genShortId.d.ts +0 -10
- package/types/hashPassword.d.ts +0 -11
- package/types/index.d.ts +0 -22
- package/types/jwt.d.ts +0 -99
- package/types/keysToCamel.d.ts +0 -10
- package/types/keysToSnake.d.ts +0 -10
- package/types/layouts.d.ts +0 -29
- package/types/loadAndMergeConfig.d.ts +0 -7
- package/types/logger.d.ts +0 -22
- package/types/menu.d.ts +0 -49
- package/types/mergeConfig.d.ts +0 -7
- package/types/pickFields.d.ts +0 -4
- package/types/redisKeys.d.ts +0 -34
- package/types/regex.d.ts +0 -145
- package/types/scanConfig.d.ts +0 -7
- package/types/scanFiles.d.ts +0 -12
- package/types/scanViews.d.ts +0 -11
- package/types/table.d.ts +0 -49
- package/types/tool.d.ts +0 -67
- package/types/types.d.ts +0 -44
- package/types/validate.d.ts +0 -69
- package/types/withDefaultColumns.d.ts +0 -7
package/tests/types.test.ts
DELETED
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* befly-shared 类型定义测试
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it } from 'bun:test';
|
|
5
|
-
|
|
6
|
-
import { ApiCode, ErrorMessages } from '../src/constants.js';
|
|
7
|
-
import type { DatabaseConfig, FieldDefinition, HttpMethod, MenuItem, PaginatedResult, RedisConfig, ResponseResult, RoleInfo, UserInfo } from '../types/types.js';
|
|
8
|
-
|
|
9
|
-
// ValidationResult 在新结构中可能不存在,使用本地定义
|
|
10
|
-
interface ValidationResult {
|
|
11
|
-
code: 0 | 1;
|
|
12
|
-
fields: Record<string, string>;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
describe('befly-shared 类型定义', () => {
|
|
16
|
-
describe('ResponseResult 类型', () => {
|
|
17
|
-
it('成功响应结构正确', () => {
|
|
18
|
-
const result: ResponseResult<{ id: number }> = {
|
|
19
|
-
code: 0,
|
|
20
|
-
msg: '操作成功',
|
|
21
|
-
data: { id: 1 }
|
|
22
|
-
};
|
|
23
|
-
expect(result.code).toBe(0);
|
|
24
|
-
expect(result.msg).toBe('操作成功');
|
|
25
|
-
expect(result.data).toEqual({ id: 1 });
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('失败响应结构正确', () => {
|
|
29
|
-
const result: ResponseResult = {
|
|
30
|
-
code: 1,
|
|
31
|
-
msg: '操作失败',
|
|
32
|
-
error: 'Invalid input'
|
|
33
|
-
};
|
|
34
|
-
expect(result.code).toBe(1);
|
|
35
|
-
expect(result.error).toBe('Invalid input');
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
describe('PaginatedResult 类型', () => {
|
|
40
|
-
it('分页结果结构正确', () => {
|
|
41
|
-
const result: PaginatedResult<{ name: string }> = {
|
|
42
|
-
code: 0,
|
|
43
|
-
msg: '查询成功',
|
|
44
|
-
data: [{ name: 'test' }],
|
|
45
|
-
total: 100,
|
|
46
|
-
page: 1,
|
|
47
|
-
limit: 10,
|
|
48
|
-
pages: 10
|
|
49
|
-
};
|
|
50
|
-
expect(result.total).toBe(100);
|
|
51
|
-
expect(result.pages).toBe(10);
|
|
52
|
-
expect(result.data).toHaveLength(1);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
describe('ValidationResult 类型', () => {
|
|
57
|
-
it('验证成功结构正确', () => {
|
|
58
|
-
const result: ValidationResult = {
|
|
59
|
-
code: 0,
|
|
60
|
-
fields: {}
|
|
61
|
-
};
|
|
62
|
-
expect(result.code).toBe(0);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('验证失败结构正确', () => {
|
|
66
|
-
const result: ValidationResult = {
|
|
67
|
-
code: 1,
|
|
68
|
-
fields: {
|
|
69
|
-
email: '邮箱格式不正确',
|
|
70
|
-
password: '密码长度不足'
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
expect(result.code).toBe(1);
|
|
74
|
-
expect(Object.keys(result.fields)).toHaveLength(2);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
describe('HttpMethod 类型', () => {
|
|
79
|
-
it('支持所有 HTTP 方法', () => {
|
|
80
|
-
const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'];
|
|
81
|
-
expect(methods).toHaveLength(7);
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
describe('FieldDefinition 类型', () => {
|
|
86
|
-
it('字段定义结构正确', () => {
|
|
87
|
-
const field: FieldDefinition = {
|
|
88
|
-
name: '用户名',
|
|
89
|
-
detail: '用户登录名',
|
|
90
|
-
type: 'string',
|
|
91
|
-
min: 2,
|
|
92
|
-
max: 50,
|
|
93
|
-
default: null,
|
|
94
|
-
index: true,
|
|
95
|
-
unique: true,
|
|
96
|
-
comment: '用户名字段',
|
|
97
|
-
nullable: false,
|
|
98
|
-
unsigned: false,
|
|
99
|
-
regexp: '^[a-zA-Z0-9_]+$'
|
|
100
|
-
};
|
|
101
|
-
expect(field.type).toBe('string');
|
|
102
|
-
expect(field.unique).toBe(true);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
describe('UserInfo 类型', () => {
|
|
107
|
-
it('用户信息结构正确', () => {
|
|
108
|
-
const user: UserInfo = {
|
|
109
|
-
id: 1,
|
|
110
|
-
username: 'admin',
|
|
111
|
-
email: 'admin@example.com',
|
|
112
|
-
roleCode: 'ADMIN',
|
|
113
|
-
customField: 'custom value'
|
|
114
|
-
};
|
|
115
|
-
expect(user.id).toBe(1);
|
|
116
|
-
expect(user.customField).toBe('custom value');
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
describe('DatabaseConfig 类型', () => {
|
|
121
|
-
it('数据库配置结构正确', () => {
|
|
122
|
-
const config: DatabaseConfig = {
|
|
123
|
-
type: 'mysql',
|
|
124
|
-
host: 'localhost',
|
|
125
|
-
port: 3306,
|
|
126
|
-
user: 'root',
|
|
127
|
-
password: 'password',
|
|
128
|
-
database: 'befly'
|
|
129
|
-
};
|
|
130
|
-
expect(config.type).toBe('mysql');
|
|
131
|
-
expect(config.port).toBe(3306);
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
describe('RedisConfig 类型', () => {
|
|
136
|
-
it('Redis 配置结构正确', () => {
|
|
137
|
-
const config: RedisConfig = {
|
|
138
|
-
host: 'localhost',
|
|
139
|
-
port: 6379,
|
|
140
|
-
password: 'password',
|
|
141
|
-
db: 0
|
|
142
|
-
};
|
|
143
|
-
expect(config.port).toBe(6379);
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it('Redis 配置可选字段', () => {
|
|
147
|
-
const config: RedisConfig = {
|
|
148
|
-
host: 'localhost',
|
|
149
|
-
port: 6379
|
|
150
|
-
};
|
|
151
|
-
expect(config.password).toBeUndefined();
|
|
152
|
-
expect(config.db).toBeUndefined();
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
describe('MenuItem 类型', () => {
|
|
157
|
-
it('菜单项结构正确', () => {
|
|
158
|
-
const menu: MenuItem = {
|
|
159
|
-
id: 1,
|
|
160
|
-
pid: 0,
|
|
161
|
-
name: '系统管理',
|
|
162
|
-
path: '/system',
|
|
163
|
-
icon: 'Settings',
|
|
164
|
-
sort: 1,
|
|
165
|
-
hidden: false,
|
|
166
|
-
children: [
|
|
167
|
-
{
|
|
168
|
-
id: 2,
|
|
169
|
-
pid: 1,
|
|
170
|
-
name: '用户管理',
|
|
171
|
-
path: '/system/user',
|
|
172
|
-
sort: 1
|
|
173
|
-
}
|
|
174
|
-
]
|
|
175
|
-
};
|
|
176
|
-
expect(menu.children).toHaveLength(1);
|
|
177
|
-
expect(menu.children![0].pid).toBe(1);
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
describe('RoleInfo 类型', () => {
|
|
182
|
-
it('角色信息结构正确', () => {
|
|
183
|
-
const role: RoleInfo = {
|
|
184
|
-
id: 1,
|
|
185
|
-
code: 'ADMIN',
|
|
186
|
-
name: '管理员',
|
|
187
|
-
desc: '系统管理员角色'
|
|
188
|
-
};
|
|
189
|
-
expect(role.code).toBe('ADMIN');
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
describe('ApiCode 常量', () => {
|
|
194
|
-
it('SUCCESS 值为 0', () => {
|
|
195
|
-
expect(ApiCode.SUCCESS).toBe(0);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it('FAIL 值为 1', () => {
|
|
199
|
-
expect(ApiCode.FAIL).toBe(1);
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
it('UNAUTHORIZED 值为 401', () => {
|
|
203
|
-
expect(ApiCode.UNAUTHORIZED).toBe(401);
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
it('FORBIDDEN 值为 403', () => {
|
|
207
|
-
expect(ApiCode.FORBIDDEN).toBe(403);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
it('NOT_FOUND 值为 404', () => {
|
|
211
|
-
expect(ApiCode.NOT_FOUND).toBe(404);
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
it('SERVER_ERROR 值为 500', () => {
|
|
215
|
-
expect(ApiCode.SERVER_ERROR).toBe(500);
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
describe('ErrorMessages 常量', () => {
|
|
220
|
-
it('UNAUTHORIZED 消息正确', () => {
|
|
221
|
-
expect(ErrorMessages.UNAUTHORIZED).toBe('请先登录');
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
it('FORBIDDEN 消息正确', () => {
|
|
225
|
-
expect(ErrorMessages.FORBIDDEN).toBe('无访问权限');
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
it('NOT_FOUND 消息正确', () => {
|
|
229
|
-
expect(ErrorMessages.NOT_FOUND).toBe('资源不存在');
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it('SERVER_ERROR 消息正确', () => {
|
|
233
|
-
expect(ErrorMessages.SERVER_ERROR).toBe('服务器错误');
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it('INVALID_PARAMS 消息正确', () => {
|
|
237
|
-
expect(ErrorMessages.INVALID_PARAMS).toBe('参数错误');
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
it('TOKEN_EXPIRED 消息正确', () => {
|
|
241
|
-
expect(ErrorMessages.TOKEN_EXPIRED).toBe('Token 已过期');
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it('TOKEN_INVALID 消息正确', () => {
|
|
245
|
-
expect(ErrorMessages.TOKEN_INVALID).toBe('Token 无效');
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
describe('BaseRequestContext 类型', () => {
|
|
250
|
-
it('请求上下文基础结构正确', () => {
|
|
251
|
-
// BaseRequestContext 是接口,只验证可以创建符合结构的对象
|
|
252
|
-
const ctx = {
|
|
253
|
-
body: { username: 'test' },
|
|
254
|
-
user: { id: 1 },
|
|
255
|
-
now: Date.now(),
|
|
256
|
-
ip: '127.0.0.1',
|
|
257
|
-
route: 'POST/api/user/login',
|
|
258
|
-
requestId: 'abc123'
|
|
259
|
-
};
|
|
260
|
-
expect(ctx.body.username).toBe('test');
|
|
261
|
-
expect(ctx.user.id).toBe(1);
|
|
262
|
-
expect(typeof ctx.now).toBe('number');
|
|
263
|
-
expect(ctx.ip).toBe('127.0.0.1');
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
describe('BaseApiRoute 类型', () => {
|
|
268
|
-
it('API 路由基础结构正确', () => {
|
|
269
|
-
// BaseApiRoute 是接口,只验证可以创建符合结构的对象
|
|
270
|
-
const route = {
|
|
271
|
-
name: '用户登录',
|
|
272
|
-
method: 'POST' as const,
|
|
273
|
-
auth: false,
|
|
274
|
-
fields: {},
|
|
275
|
-
required: ['username', 'password']
|
|
276
|
-
};
|
|
277
|
-
expect(route.name).toBe('用户登录');
|
|
278
|
-
expect(route.method).toBe('POST');
|
|
279
|
-
expect(route.auth).toBe(false);
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
it('API 路由最小配置', () => {
|
|
283
|
-
const route = {
|
|
284
|
-
name: '测试接口'
|
|
285
|
-
};
|
|
286
|
-
expect(route.name).toBe('测试接口');
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
});
|
package/types/addon.d.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
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
|
-
/** 依赖的其他 addon 或核心包 */
|
|
46
|
-
dependencies?: Record<string, string>;
|
|
47
|
-
|
|
48
|
-
/** 许可证 */
|
|
49
|
-
license?: string;
|
|
50
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { MergeConfigOptions } from './configTypes.js';
|
|
2
|
-
/**
|
|
3
|
-
* Addon 配置合并函数
|
|
4
|
-
* 自动根据调用位置的 package.json 获取 addon 名称,然后加载项目 config 目录下的同名配置文件进行合并
|
|
5
|
-
* @param options - 合并选项
|
|
6
|
-
* @returns 合并后的配置对象
|
|
7
|
-
* @example
|
|
8
|
-
* ```ts
|
|
9
|
-
* // 在 @befly-addon/admin 包中调用
|
|
10
|
-
* const config = await addonConfigMerge();
|
|
11
|
-
* // 自动读取:
|
|
12
|
-
* // 1. @befly-addon/admin/package.json 的 befly 字段
|
|
13
|
-
* // 2. 项目根目录/config/admin.{js,ts,json} 配置文件
|
|
14
|
-
* // 3. 合并后返回
|
|
15
|
-
* ```
|
|
16
|
-
*/
|
|
17
|
-
export declare function addonConfigMerge(options?: MergeConfigOptions): Promise<Record<string, any>>;
|
package/types/addonHelper.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 扫描所有可用的 addon
|
|
3
|
-
* 优先从本地 addons/ 目录加载,其次从 node_modules/@befly-addon/ 加载
|
|
4
|
-
* @param cwd - 项目根目录,默认为 process.cwd()
|
|
5
|
-
* @returns addon 名称数组
|
|
6
|
-
*/
|
|
7
|
-
export declare const scanAddons: (cwd?: string) => string[];
|
|
8
|
-
/**
|
|
9
|
-
* 获取 addon 的指定子目录路径
|
|
10
|
-
* 优先返回本地 addons 目录,其次返回 node_modules 目录
|
|
11
|
-
* @param name - addon 名称
|
|
12
|
-
* @param subDir - 子目录名称
|
|
13
|
-
* @param cwd - 项目根目录,默认为 process.cwd()
|
|
14
|
-
* @returns 完整路径
|
|
15
|
-
*/
|
|
16
|
-
export declare const getAddonDir: (name: string, subDir: string, cwd?: string) => string;
|
|
17
|
-
/**
|
|
18
|
-
* 检查 addon 子目录是否存在
|
|
19
|
-
* @param name - addon 名称
|
|
20
|
-
* @param subDir - 子目录名称
|
|
21
|
-
* @param cwd - 项目根目录,默认为 process.cwd()
|
|
22
|
-
* @returns 是否存在
|
|
23
|
-
*/
|
|
24
|
-
export declare const addonDirExists: (name: string, subDir: string, cwd?: string) => boolean;
|
package/types/api.d.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* API 相关类型定义
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { TableDefinition } from './validate';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* HTTP 方法类型
|
|
9
|
-
*/
|
|
10
|
-
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* API 响应结果类型
|
|
14
|
-
*/
|
|
15
|
-
export interface ResponseResult<T = any> {
|
|
16
|
-
/** 状态码:0 表示成功,非 0 表示失败 */
|
|
17
|
-
code: number;
|
|
18
|
-
/** 响应消息 */
|
|
19
|
-
msg: string;
|
|
20
|
-
/** 响应数据 */
|
|
21
|
-
data?: T;
|
|
22
|
-
/** 错误信息(仅在失败时) */
|
|
23
|
-
error?: any;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* 分页响应结果类型
|
|
28
|
-
*/
|
|
29
|
-
export interface PaginatedResult<T = any> {
|
|
30
|
-
/** 状态码 */
|
|
31
|
-
code: number;
|
|
32
|
-
/** 响应消息 */
|
|
33
|
-
msg: string;
|
|
34
|
-
/** 数据列表 */
|
|
35
|
-
data: T[];
|
|
36
|
-
/** 总记录数 */
|
|
37
|
-
total: number;
|
|
38
|
-
/** 当前页码 */
|
|
39
|
-
page: number;
|
|
40
|
-
/** 每页数量 */
|
|
41
|
-
limit: number;
|
|
42
|
-
/** 总页数 */
|
|
43
|
-
pages: number;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* API 路由基础配置
|
|
48
|
-
* 用于跨包共享的最小路由定义
|
|
49
|
-
*/
|
|
50
|
-
export interface BaseApiRoute {
|
|
51
|
-
/** 接口名称(必填) */
|
|
52
|
-
name: string;
|
|
53
|
-
/** HTTP 方法(可选,默认 POST) */
|
|
54
|
-
method?: HttpMethod;
|
|
55
|
-
/** 认证类型(可选,默认 true) */
|
|
56
|
-
auth?: boolean;
|
|
57
|
-
/** 字段定义(验证规则) */
|
|
58
|
-
fields?: TableDefinition;
|
|
59
|
-
/** 必填字段 */
|
|
60
|
-
required?: string[];
|
|
61
|
-
/** 路由路径(运行时生成) */
|
|
62
|
-
route?: string;
|
|
63
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 数组对象字段名批量转小驼峰
|
|
3
|
-
* @param arr - 源数组
|
|
4
|
-
* @returns 字段名转为小驼峰格式的新数组
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* arrayKeysToCamel([
|
|
8
|
-
* { user_id: 1, user_name: 'John' },
|
|
9
|
-
* { user_id: 2, user_name: 'Jane' }
|
|
10
|
-
* ])
|
|
11
|
-
* // [{ userId: 1, userName: 'John' }, { userId: 2, userName: 'Jane' }]
|
|
12
|
-
*/
|
|
13
|
-
export declare const arrayKeysToCamel: <T = any>(arr: Record<string, any>[]) => T[];
|
package/types/arrayToTree.d.ts
DELETED
package/types/calcPerfTime.d.ts
DELETED
package/types/common.d.ts
DELETED
package/types/configMerge.d.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 配置来源信息
|
|
3
|
-
*/
|
|
4
|
-
export interface ConfigSource {
|
|
5
|
-
/** 配置文件路径 */
|
|
6
|
-
filePath: string;
|
|
7
|
-
/** 配置数据 */
|
|
8
|
-
data: Record<string, any>;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* 合并配置选项
|
|
12
|
-
*/
|
|
13
|
-
export interface MergeConfigOptions {
|
|
14
|
-
/** 合并策略:deep 深度合并(默认),shallow 浅合并,override 覆盖 */
|
|
15
|
-
strategy?: 'deep' | 'shallow' | 'override';
|
|
16
|
-
/** 是否克隆数据(避免引用污染),默认 true */
|
|
17
|
-
clone?: boolean;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* 加载配置选项
|
|
21
|
-
*/
|
|
22
|
-
export interface LoadConfigOptions {
|
|
23
|
-
/** 目录数组:要搜索的目录路径 */
|
|
24
|
-
dirs: string[];
|
|
25
|
-
/** 文件数组:要匹配的文件名 */
|
|
26
|
-
files: string[];
|
|
27
|
-
/** 合并选项 */
|
|
28
|
-
merge?: MergeConfigOptions;
|
|
29
|
-
/** 是否必须找到至少一个配置文件,默认 false */
|
|
30
|
-
required?: boolean;
|
|
31
|
-
/** 文件扩展名,默认 ['.js', '.ts', '.json'] */
|
|
32
|
-
extensions?: string[];
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* 合并多个配置对象
|
|
36
|
-
* @param configs - 配置对象数组
|
|
37
|
-
* @param options - 合并选项
|
|
38
|
-
* @returns 合并后的配置对象
|
|
39
|
-
*/
|
|
40
|
-
export declare function mergeConfig(configs: Record<string, any>[], options?: MergeConfigOptions): Record<string, any>;
|
|
41
|
-
/**
|
|
42
|
-
* 加载并合并配置文件(矩阵搜索:dirs × files)
|
|
43
|
-
* @param options - 加载选项
|
|
44
|
-
* @returns 合并后的配置对象和来源信息
|
|
45
|
-
*/
|
|
46
|
-
export declare function loadAndMergeConfig(options: LoadConfigOptions): Promise<{
|
|
47
|
-
config: Record<string, any>;
|
|
48
|
-
sources: ConfigSource[];
|
|
49
|
-
}>;
|
package/types/configTypes.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 加载配置选项
|
|
3
|
-
*/
|
|
4
|
-
export interface LoadConfigOptions {
|
|
5
|
-
/** 当前工作目录,默认 process.cwd() */
|
|
6
|
-
cwd?: string;
|
|
7
|
-
/** 目录数组:要搜索的目录路径(相对于 cwd) */
|
|
8
|
-
dirs: string[];
|
|
9
|
-
/** 文件数组:要匹配的文件名 */
|
|
10
|
-
files: string[];
|
|
11
|
-
/** 文件扩展名,默认 ['.js', '.ts', '.json'] */
|
|
12
|
-
extensions?: string[];
|
|
13
|
-
/** 加载模式:'first' = 返回第一个找到的配置(默认),'merge' = 合并所有配置 */
|
|
14
|
-
mode?: 'merge' | 'first';
|
|
15
|
-
/** 指定要提取的字段路径数组,如 ['menus', 'database.host'],为空则返回完整对象 */
|
|
16
|
-
paths?: string[];
|
|
17
|
-
/** 默认配置,会与找到的配置合并(优先级最低) */
|
|
18
|
-
defaults?: Record<string, any>;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Addon 配置合并选项(已废弃,仅用于向后兼容)
|
|
22
|
-
*/
|
|
23
|
-
export interface MergeConfigOptions {
|
|
24
|
-
/** 合并策略(已废弃,始终使用 deep) */
|
|
25
|
-
strategy?: 'deep' | 'shallow' | 'override';
|
|
26
|
-
/** 是否克隆数据(已废弃) */
|
|
27
|
-
clone?: boolean;
|
|
28
|
-
}
|
package/types/constants.d.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Befly 共享常量定义
|
|
3
|
-
* 运行时使用的常量(非纯类型)
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* API 响应码
|
|
7
|
-
*/
|
|
8
|
-
export declare const ApiCode: {
|
|
9
|
-
/** 成功 */
|
|
10
|
-
readonly SUCCESS: 0;
|
|
11
|
-
/** 通用失败 */
|
|
12
|
-
readonly FAIL: 1;
|
|
13
|
-
/** 未授权 */
|
|
14
|
-
readonly UNAUTHORIZED: 401;
|
|
15
|
-
/** 禁止访问 */
|
|
16
|
-
readonly FORBIDDEN: 403;
|
|
17
|
-
/** 未找到 */
|
|
18
|
-
readonly NOT_FOUND: 404;
|
|
19
|
-
/** 服务器错误 */
|
|
20
|
-
readonly SERVER_ERROR: 500;
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* API 响应码类型
|
|
24
|
-
*/
|
|
25
|
-
export type ApiCodeType = (typeof ApiCode)[keyof typeof ApiCode];
|
|
26
|
-
/**
|
|
27
|
-
* 通用错误消息
|
|
28
|
-
*/
|
|
29
|
-
export declare const ErrorMessages: {
|
|
30
|
-
/** 未授权 */
|
|
31
|
-
readonly UNAUTHORIZED: "请先登录";
|
|
32
|
-
/** 禁止访问 */
|
|
33
|
-
readonly FORBIDDEN: "无访问权限";
|
|
34
|
-
/** 未找到 */
|
|
35
|
-
readonly NOT_FOUND: "资源不存在";
|
|
36
|
-
/** 服务器错误 */
|
|
37
|
-
readonly SERVER_ERROR: "服务器错误";
|
|
38
|
-
/** 参数错误 */
|
|
39
|
-
readonly INVALID_PARAMS: "参数错误";
|
|
40
|
-
/** Token 过期 */
|
|
41
|
-
readonly TOKEN_EXPIRED: "Token 已过期";
|
|
42
|
-
/** Token 无效 */
|
|
43
|
-
readonly TOKEN_INVALID: "Token 无效";
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* 错误消息类型
|
|
47
|
-
*/
|
|
48
|
-
export type ErrorMessageType = (typeof ErrorMessages)[keyof typeof ErrorMessages];
|
package/types/context.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 请求上下文相关类型定义
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* 用户信息类型
|
|
7
|
-
*/
|
|
8
|
-
export interface UserInfo {
|
|
9
|
-
/** 用户 ID */
|
|
10
|
-
id: number;
|
|
11
|
-
/** 用户名 */
|
|
12
|
-
username?: string;
|
|
13
|
-
/** 邮箱 */
|
|
14
|
-
email?: string;
|
|
15
|
-
/** 角色代码 */
|
|
16
|
-
roleCode?: string;
|
|
17
|
-
/** 其他自定义字段 */
|
|
18
|
-
[key: string]: any;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* 请求上下文基础接口
|
|
23
|
-
* 用于跨包共享的最小上下文定义
|
|
24
|
-
*/
|
|
25
|
-
export interface BaseRequestContext {
|
|
26
|
-
/** 请求体参数 */
|
|
27
|
-
body: Record<string, any>;
|
|
28
|
-
/** 用户信息 */
|
|
29
|
-
user: Record<string, any>;
|
|
30
|
-
/** 请求开始时间(毫秒) */
|
|
31
|
-
now: number;
|
|
32
|
-
/** 客户端 IP 地址 */
|
|
33
|
-
ip: string;
|
|
34
|
-
/** API 路由路径(如 POST/api/user/login) */
|
|
35
|
-
route: string;
|
|
36
|
-
/** 请求唯一 ID */
|
|
37
|
-
requestId: string;
|
|
38
|
-
}
|
package/types/crypto.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 加密相关类型定义
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* 编码类型
|
|
7
|
-
*/
|
|
8
|
-
export type EncodingType = 'hex' | 'base64' | 'base64url';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* 哈希算法类型
|
|
12
|
-
*/
|
|
13
|
-
export type HashAlgorithm = 'md5' | 'sha1' | 'sha256' | 'sha512' | 'sha384' | 'sha224';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* 密码哈希选项
|
|
17
|
-
*/
|
|
18
|
-
export interface PasswordHashOptions {
|
|
19
|
-
algorithm?: 'argon2' | 'bcrypt';
|
|
20
|
-
memoryCost?: number;
|
|
21
|
-
timeCost?: number;
|
|
22
|
-
[key: string]: any;
|
|
23
|
-
}
|