befly-tpl 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/.env.development +83 -0
- package/LICENSE +201 -0
- package/README.md +20 -0
- package/README.ts.md +175 -0
- package/addon-loader.example.ts +99 -0
- package/addons/_template/README.md +123 -0
- package/addons/_template/addon.config.json +17 -0
- package/addons/_template/apis/example.ts +33 -0
- package/addons/_template/checks/example.ts +23 -0
- package/addons/_template/config/default.ts +12 -0
- package/addons/_template/plugins/example.ts +39 -0
- package/addons/_template/tables/example.json +7 -0
- package/addons/_template/types/index.d.ts +21 -0
- package/addons/admin/README.md +179 -0
- package/addons/admin/addon.config.json +13 -0
- package/addons/admin/apis/adminDel.ts +37 -0
- package/addons/admin/apis/adminInfo.ts +50 -0
- package/addons/admin/apis/adminIns.ts +70 -0
- package/addons/admin/apis/adminList.ts +24 -0
- package/addons/admin/apis/adminRoleDetail.ts +38 -0
- package/addons/admin/apis/adminRoleSave.ts +40 -0
- package/addons/admin/apis/adminUpd.ts +54 -0
- package/addons/admin/apis/apiAll.ts +38 -0
- package/addons/admin/apis/cacheRefresh.ts +36 -0
- package/addons/admin/apis/dashboardAddonList.ts +16 -0
- package/addons/admin/apis/dashboardChangelog.ts +41 -0
- package/addons/admin/apis/dashboardConfigStatus.ts +56 -0
- package/addons/admin/apis/dashboardEnvironmentInfo.ts +48 -0
- package/addons/admin/apis/dashboardPerformanceMetrics.ts +25 -0
- package/addons/admin/apis/dashboardPermissionStats.ts +33 -0
- package/addons/admin/apis/dashboardServiceStatus.ts +84 -0
- package/addons/admin/apis/dashboardSystemInfo.ts +34 -0
- package/addons/admin/apis/dashboardSystemOverview.ts +34 -0
- package/addons/admin/apis/dashboardSystemResources.ts +119 -0
- package/addons/admin/apis/dictAll.ts +26 -0
- package/addons/admin/apis/dictDel.ts +27 -0
- package/addons/admin/apis/dictDetail.ts +28 -0
- package/addons/admin/apis/dictIns.ts +38 -0
- package/addons/admin/apis/dictList.ts +27 -0
- package/addons/admin/apis/dictUpd.ts +44 -0
- package/addons/admin/apis/login.ts +123 -0
- package/addons/admin/apis/logout.ts +23 -0
- package/addons/admin/apis/menuAll.ts +70 -0
- package/addons/admin/apis/menuDel.ts +40 -0
- package/addons/admin/apis/menuIns.ts +31 -0
- package/addons/admin/apis/menuList.ts +26 -0
- package/addons/admin/apis/menuUpd.ts +41 -0
- package/addons/admin/apis/register.ts +50 -0
- package/addons/admin/apis/roleApiDetail.ts +34 -0
- package/addons/admin/apis/roleApiSave.ts +44 -0
- package/addons/admin/apis/roleDel.ts +48 -0
- package/addons/admin/apis/roleDetail.ts +28 -0
- package/addons/admin/apis/roleIns.ts +40 -0
- package/addons/admin/apis/roleList.ts +18 -0
- package/addons/admin/apis/roleMenuDetail.ts +33 -0
- package/addons/admin/apis/roleMenuSave.ts +39 -0
- package/addons/admin/apis/roleSave.ts +45 -0
- package/addons/admin/apis/roleUpd.ts +53 -0
- package/addons/admin/apis/sendSmsCode.ts +36 -0
- package/addons/admin/checks/admin.ts +36 -0
- package/addons/admin/config/index.ts +45 -0
- package/addons/admin/config/menu.json +44 -0
- package/addons/admin/scripts/syncApi.ts +285 -0
- package/addons/admin/scripts/syncDev.ts +203 -0
- package/addons/admin/scripts/syncMenu.ts +210 -0
- package/addons/admin/tables/admin.json +14 -0
- package/addons/admin/tables/api.json +8 -0
- package/addons/admin/tables/dict.json +8 -0
- package/addons/admin/tables/menu.json +8 -0
- package/addons/admin/tables/role.json +8 -0
- package/addons/admin/types/index.ts +44 -0
- package/addons/admin/util.ts +266 -0
- package/addons/befly/addon.config.json +13 -0
- package/addons/befly/apis/health/info.ts +77 -0
- package/addons/befly/apis/tool/tokenCheck.ts +52 -0
- package/addons/demo/README.md +62 -0
- package/addons/demo/addon.config.json +13 -0
- package/addons/demo/apis/demoIns.ts +36 -0
- package/addons/demo/apis/demoList.ts +36 -0
- package/addons/demo/checks/demo.ts +30 -0
- package/addons/demo/config/default.ts +17 -0
- package/addons/demo/plugins/tool.ts +61 -0
- package/addons/demo/tables/todo.json +6 -0
- package/addons/demo/types/index.d.ts +56 -0
- package/apis/article/articleDel.ts +33 -0
- package/apis/article/articleDetail.ts +26 -0
- package/apis/article/articleIns.ts +47 -0
- package/apis/article/articleList.ts +47 -0
- package/apis/article/articleUpd.ts +55 -0
- package/apis/article/increment.ts +37 -0
- package/apis/test/hi.ts +9 -0
- package/apis/user/login.ts +56 -0
- package/apis/user/userList.ts +40 -0
- package/bun.lock +140 -0
- package/checks/demo.ts +25 -0
- package/logs/2025-08-22.0.log +197 -0
- package/logs/2025-08-23.0.log +151 -0
- package/logs/2025-08-24.0.log +296 -0
- package/logs/2025-08-25.0.log +162 -0
- package/logs/2025-08-26.0.log +19 -0
- package/logs/2025-08-27.0.log +63 -0
- package/logs/2025-08-28.0.log +286 -0
- package/logs/2025-08-30.0.log +1 -0
- package/logs/2025-09-01.0.log +296 -0
- package/logs/2025-09-02.0.log +298 -0
- package/logs/2025-10-11.0.log +2718 -0
- package/logs/2025-10-12.0.log +4374 -0
- package/logs/2025-10-13.0.log +759 -0
- package/logs/2025-10-14.0.log +2350 -0
- package/logs/2025-10-15.0.log +2386 -0
- package/logs/2025-10-16.0.log +2807 -0
- package/logs/2025-10-17.0.log +1143 -0
- package/logs/2025-10-18.0.log +1292 -0
- package/logs/2025-10-19.0.log +1752 -0
- package/logs/2025-10-20.0.log +722 -0
- package/logs/2025-10-21.0.log +1075 -0
- package/logs/2025-10-23.0.log +3291 -0
- package/logs/2025-10-24.0.log +2341 -0
- package/logs/2025-10-25.0.log +1367 -0
- package/logs/debug.0.log +25174 -0
- package/main.ts +9 -0
- package/package.json +29 -0
- package/pm2.config.cjs +85 -0
- package/tables/article.json +11 -0
- package/tables/user.json +8 -0
- package/temp/addon-route-prefix-migration.md +400 -0
- package/temp/api-route-conflict-analysis.md +441 -0
- package/temp/interactive-cli-guide.md +199 -0
- package/temp/missing-apis-fix.md +362 -0
- package/temp/remove-status-field.md +239 -0
- package/temp/roleid-to-rolecode-optimization.md +321 -0
- package/temp/status-to-state-migration-complete.md +176 -0
- package/temp/syncMenu-guide.md +235 -0
- package/temp/test-admin-menus-cache.ts +125 -0
- package/temp/test-admin-menus.ts +110 -0
- package/temp/test-interactive-cli.ps1 +14 -0
- package/tests/core.test.ts +13 -0
- package/tsconfig.json +23 -0
- package/types/api.ts +128 -0
- package/types/index.ts +6 -0
- package/types/models.example.ts +267 -0
- package/types/models.ts +67 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo Addon 默认配置
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
// 是否启用组件
|
|
7
|
+
enabled: process.env.DEMO_ENABLE !== 'false',
|
|
8
|
+
|
|
9
|
+
// 默认优先级
|
|
10
|
+
defaultPriority: process.env.DEMO_DEFAULT_PRIORITY || 'medium',
|
|
11
|
+
|
|
12
|
+
// 每页默认数量
|
|
13
|
+
defaultPageSize: Number(process.env.DEMO_PAGE_SIZE) || 10,
|
|
14
|
+
|
|
15
|
+
// 最大每页数量
|
|
16
|
+
maxPageSize: Number(process.env.DEMO_MAX_PAGE_SIZE) || 100
|
|
17
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo Addon 工具插件
|
|
3
|
+
* 提供待办事项相关的工具函数
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Logger } from 'befly';
|
|
7
|
+
|
|
8
|
+
export default {
|
|
9
|
+
name: 'tool',
|
|
10
|
+
version: '1.0.0',
|
|
11
|
+
priority: 100,
|
|
12
|
+
|
|
13
|
+
async onLoad(befly) {
|
|
14
|
+
Logger.info('[Demo] 工具插件加载中...');
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
async onInit(befly) {
|
|
18
|
+
Logger.info('[Demo] 工具插件初始化中...');
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
/**
|
|
22
|
+
* 验证优先级
|
|
23
|
+
*/
|
|
24
|
+
validatePriority(priority: string): boolean {
|
|
25
|
+
return ['low', 'medium', 'high'].includes(priority);
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 格式化待办数据
|
|
30
|
+
*/
|
|
31
|
+
formatTodo(todo: any) {
|
|
32
|
+
return {
|
|
33
|
+
id: todo.id,
|
|
34
|
+
title: todo.title,
|
|
35
|
+
content: todo.content,
|
|
36
|
+
priority: todo.priority,
|
|
37
|
+
completed: Boolean(todo.completed),
|
|
38
|
+
priorityLabel:
|
|
39
|
+
{
|
|
40
|
+
low: '低',
|
|
41
|
+
medium: '中',
|
|
42
|
+
high: '高'
|
|
43
|
+
}[todo.priority] || '未知',
|
|
44
|
+
statusLabel: todo.completed ? '已完成' : '未完成',
|
|
45
|
+
createdAt: todo.created_at,
|
|
46
|
+
createdAtFormatted: new Date(Number(todo.created_at)).toLocaleString('zh-CN')
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 获取配置
|
|
52
|
+
*/
|
|
53
|
+
getConfig() {
|
|
54
|
+
return {
|
|
55
|
+
enabled: process.env.DEMO_ENABLE !== 'false',
|
|
56
|
+
defaultPriority: process.env.DEMO_DEFAULT_PRIORITY || 'medium'
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
} as BeflyPlugin;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo Addon 类型定义
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
declare global {
|
|
6
|
+
namespace Befly {
|
|
7
|
+
interface Context {
|
|
8
|
+
/**
|
|
9
|
+
* Demo 工具插件
|
|
10
|
+
*/
|
|
11
|
+
'demo.tool'?: {
|
|
12
|
+
/**
|
|
13
|
+
* 验证优先级
|
|
14
|
+
*/
|
|
15
|
+
validatePriority(priority: string): boolean;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 格式化待办数据
|
|
19
|
+
*/
|
|
20
|
+
formatTodo(todo: any): {
|
|
21
|
+
id: number;
|
|
22
|
+
title: string;
|
|
23
|
+
content: string;
|
|
24
|
+
priority: string;
|
|
25
|
+
completed: boolean;
|
|
26
|
+
priorityLabel: string;
|
|
27
|
+
statusLabel: string;
|
|
28
|
+
createdAt: number;
|
|
29
|
+
createdAtFormatted: string;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 获取配置
|
|
34
|
+
*/
|
|
35
|
+
getConfig(): {
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
defaultPriority: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 待办事项数据结构
|
|
46
|
+
*/
|
|
47
|
+
export interface Todo {
|
|
48
|
+
id: number;
|
|
49
|
+
title: string;
|
|
50
|
+
content: string;
|
|
51
|
+
completed: number;
|
|
52
|
+
priority: 'low' | 'medium' | 'high';
|
|
53
|
+
createdAt: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 删除文章接口(软删除)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Yes, No, Fields } from 'befly';
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
name: '删除文章',
|
|
9
|
+
auth: false,
|
|
10
|
+
fields: {
|
|
11
|
+
id: Fields._id
|
|
12
|
+
},
|
|
13
|
+
required: ['id'],
|
|
14
|
+
handler: async (befly, ctx) => {
|
|
15
|
+
// 检查文章是否存在
|
|
16
|
+
const article = await befly.db.getOne({
|
|
17
|
+
table: 'article',
|
|
18
|
+
where: { id: ctx.body.id }
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
if (!article) {
|
|
22
|
+
return No('文章不存在');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// 软删除
|
|
26
|
+
const result = await befly.db.delData({
|
|
27
|
+
table: 'article',
|
|
28
|
+
where: { id: ctx.body.id }
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
return Yes('删除成功', { affected: result });
|
|
32
|
+
}
|
|
33
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取文章详情接口
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Yes, No, Fields } from 'befly';
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
name: '获取文章详情',
|
|
9
|
+
auth: false,
|
|
10
|
+
fields: {
|
|
11
|
+
id: Fields._id
|
|
12
|
+
},
|
|
13
|
+
required: ['id'],
|
|
14
|
+
handler: async (befly, ctx) => {
|
|
15
|
+
const article = await befly.db.getOne({
|
|
16
|
+
table: 'article',
|
|
17
|
+
where: { id: ctx.body.id }
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
if (!article) {
|
|
21
|
+
return No('文章不存在');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return Yes('获取成功', article);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 创建文章接口 - TypeScript 示例
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Yes } from 'befly';
|
|
6
|
+
|
|
7
|
+
import articleTable from '../../tables/article.json';
|
|
8
|
+
|
|
9
|
+
export default {
|
|
10
|
+
name: '创建文章',
|
|
11
|
+
auth: false,
|
|
12
|
+
fields: {
|
|
13
|
+
title: articleTable.title,
|
|
14
|
+
content: articleTable.content,
|
|
15
|
+
summary: articleTable.summary,
|
|
16
|
+
coverImage: articleTable.coverImage,
|
|
17
|
+
author: articleTable.author,
|
|
18
|
+
category: articleTable.category,
|
|
19
|
+
tags: articleTable.tags,
|
|
20
|
+
viewCount: articleTable.viewCount,
|
|
21
|
+
status: articleTable.status
|
|
22
|
+
},
|
|
23
|
+
required: ['title', 'content'],
|
|
24
|
+
handler: async (befly, ctx) => {
|
|
25
|
+
const userId = ctx.jwt?.userId || '1'; // 临时使用固定ID测试
|
|
26
|
+
|
|
27
|
+
// 插入文章
|
|
28
|
+
const articleId = await befly.db.insData({
|
|
29
|
+
table: 'article',
|
|
30
|
+
data: {
|
|
31
|
+
title: ctx.body.title,
|
|
32
|
+
content: ctx.body.content,
|
|
33
|
+
summary: ctx.body.summary,
|
|
34
|
+
coverImage: ctx.body.coverImage,
|
|
35
|
+
author: ctx.body.author,
|
|
36
|
+
category: ctx.body.category,
|
|
37
|
+
tags: ctx.body.tags,
|
|
38
|
+
viewCount: ctx.body.viewCount || 0,
|
|
39
|
+
status: ctx.body.status,
|
|
40
|
+
authorId: parseInt(userId),
|
|
41
|
+
published: 0
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return Yes('创建成功', { articleId });
|
|
46
|
+
}
|
|
47
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取文章列表接口 - TypeScript 示例
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Yes, Fields } from 'befly';
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
name: '获取文章列表',
|
|
9
|
+
auth: false,
|
|
10
|
+
fields: {
|
|
11
|
+
page: Fields.page,
|
|
12
|
+
limit: Fields.limit,
|
|
13
|
+
categoryId: '分类ID|number|0|999999|null|0|null',
|
|
14
|
+
authorId: '作者ID|number|0|999999|null|0|null',
|
|
15
|
+
keyword: Fields.keyword,
|
|
16
|
+
published: '是否发布|number|0|1|null|0|^(0|1)'
|
|
17
|
+
},
|
|
18
|
+
handler: async (befly, ctx) => {
|
|
19
|
+
// 构建查询条件
|
|
20
|
+
let where = params.where || {};
|
|
21
|
+
|
|
22
|
+
// 兼容旧的查询参数
|
|
23
|
+
if (params.categoryId) {
|
|
24
|
+
where.categoryId = params.categoryId;
|
|
25
|
+
}
|
|
26
|
+
if (params.authorId) {
|
|
27
|
+
where.authorId = params.authorId;
|
|
28
|
+
}
|
|
29
|
+
if (params.keyword) {
|
|
30
|
+
where.title = { $like: `%${params.keyword}%` };
|
|
31
|
+
}
|
|
32
|
+
if (typeof params.published !== 'undefined') {
|
|
33
|
+
where.published = params.published;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 查询文章列表
|
|
37
|
+
const result = await befly.db.getList({
|
|
38
|
+
table: 'article',
|
|
39
|
+
where,
|
|
40
|
+
page: params.page || 1,
|
|
41
|
+
limit: params.limit || 10,
|
|
42
|
+
orderBy: params.orderBy || ['createdAt#DESC']
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return Yes('查询成功', result);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 更新文章接口
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Yes, No, Fields } from 'befly';
|
|
6
|
+
|
|
7
|
+
import articleTable from '../../tables/article.json';
|
|
8
|
+
|
|
9
|
+
export default {
|
|
10
|
+
name: '更新文章',
|
|
11
|
+
auth: false,
|
|
12
|
+
fields: {
|
|
13
|
+
id: Fields._id,
|
|
14
|
+
title: articleTable.title,
|
|
15
|
+
content: articleTable.content,
|
|
16
|
+
summary: articleTable.summary,
|
|
17
|
+
coverImage: articleTable.coverImage,
|
|
18
|
+
author: articleTable.author,
|
|
19
|
+
category: articleTable.category,
|
|
20
|
+
tags: articleTable.tags,
|
|
21
|
+
viewCount: articleTable.viewCount,
|
|
22
|
+
status: articleTable.status
|
|
23
|
+
},
|
|
24
|
+
required: ['id'],
|
|
25
|
+
handler: async (befly, ctx) => {
|
|
26
|
+
// 检查文章是否存在
|
|
27
|
+
const article = await befly.db.getOne({
|
|
28
|
+
table: 'article',
|
|
29
|
+
where: { id: ctx.body.id }
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
if (!article) {
|
|
33
|
+
return No('文章不存在');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 更新文章
|
|
37
|
+
const result = await befly.db.updData({
|
|
38
|
+
table: 'article',
|
|
39
|
+
where: { id: ctx.body.id },
|
|
40
|
+
data: {
|
|
41
|
+
title: ctx.body.title,
|
|
42
|
+
content: ctx.body.content,
|
|
43
|
+
summary: ctx.body.summary,
|
|
44
|
+
coverImage: ctx.body.coverImage,
|
|
45
|
+
author: ctx.body.author,
|
|
46
|
+
category: ctx.body.category,
|
|
47
|
+
tags: ctx.body.tags,
|
|
48
|
+
viewCount: ctx.body.viewCount,
|
|
49
|
+
status: ctx.body.status
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
return Yes('更新成功', { affected: result });
|
|
54
|
+
}
|
|
55
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文章字段增量接口
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Yes, No, Fields } from 'befly';
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
name: '文章字段增量',
|
|
9
|
+
auth: false,
|
|
10
|
+
fields: {
|
|
11
|
+
id: Fields._id,
|
|
12
|
+
field: '字段名|string|1|50|null|1|^[a-zA-Z_][a-zA-Z0-9_]*$',
|
|
13
|
+
value: '自增值|number|-999999|999999|1|0|null'
|
|
14
|
+
},
|
|
15
|
+
required: ['id', 'field'],
|
|
16
|
+
handler: async (befly, ctx) => {
|
|
17
|
+
// 检查文章是否存在
|
|
18
|
+
const article = await befly.db.getOne({
|
|
19
|
+
table: 'article',
|
|
20
|
+
where: { id: ctx.body.id }
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
if (!article) {
|
|
24
|
+
return No('文章不存在');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// 执行自增
|
|
28
|
+
const result = await befly.db.increment({
|
|
29
|
+
table: 'article',
|
|
30
|
+
where: { id: ctx.body.id },
|
|
31
|
+
field: ctx.body.field,
|
|
32
|
+
value: ctx.body.value || 1
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
return Yes('自增成功', { affected: result });
|
|
36
|
+
}
|
|
37
|
+
};
|
package/apis/test/hi.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 用户登录接口 - TypeScript 示例
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Yes, No } from 'befly';
|
|
6
|
+
import { Crypto2 } from 'befly';
|
|
7
|
+
import { Jwt } from 'befly';
|
|
8
|
+
|
|
9
|
+
export default {
|
|
10
|
+
name: '用户登录',
|
|
11
|
+
auth: false, // 公开接口
|
|
12
|
+
fields: {
|
|
13
|
+
username: '用户名|string|3|50|null|0|^[a-zA-Z0-9_]+$',
|
|
14
|
+
password: '密码|string|6|100|null|0|null'
|
|
15
|
+
},
|
|
16
|
+
required: ['username', 'password'],
|
|
17
|
+
handler: async (befly, ctx) => {
|
|
18
|
+
// 查询用户
|
|
19
|
+
const user = await befly.db.getOne({
|
|
20
|
+
table: 'user',
|
|
21
|
+
where: { username: ctx.body.username }
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
if (!user) {
|
|
25
|
+
return No('用户名或密码错误');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 验证密码
|
|
29
|
+
const isValid = await Crypto2.verifyPassword(ctx.body.password, user.password);
|
|
30
|
+
if (!isValid) {
|
|
31
|
+
return No('用户名或密码错误');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// 生成 JWT Token
|
|
35
|
+
const token = await Jwt.sign(
|
|
36
|
+
{
|
|
37
|
+
userId: user.id.toString(),
|
|
38
|
+
username: user.username,
|
|
39
|
+
role: user.role
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
expiresIn: '7d'
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
// 返回用户信息(不包含密码)
|
|
47
|
+
const { password: _, ...userWithoutPassword } = user;
|
|
48
|
+
|
|
49
|
+
const response = {
|
|
50
|
+
token,
|
|
51
|
+
user: userWithoutPassword
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
return Yes('登录成功', response);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取用户列表接口 - TypeScript 示例
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Yes, Fields } from 'befly';
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
name: '获取用户列表',
|
|
9
|
+
auth: true, // 需要登录(权限由角色接口列表控制)
|
|
10
|
+
fields: {
|
|
11
|
+
page: Fields.page,
|
|
12
|
+
limit: Fields.limit,
|
|
13
|
+
role: '角色|string|0|20|null|0|^(admin|user|guest)$',
|
|
14
|
+
keyword: Fields.keyword
|
|
15
|
+
},
|
|
16
|
+
handler: async (befly, ctx) => {
|
|
17
|
+
const params = ctx.body as GetUsersRequest;
|
|
18
|
+
|
|
19
|
+
// 构建查询条件
|
|
20
|
+
const where = {};
|
|
21
|
+
if (params.role) {
|
|
22
|
+
where.role = params.role;
|
|
23
|
+
}
|
|
24
|
+
if (params.keyword) {
|
|
25
|
+
where.username = { $like: `%${params.keyword}%` };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 查询用户列表(不返回密码字段)
|
|
29
|
+
const result = await befly.db.getList({
|
|
30
|
+
table: 'user',
|
|
31
|
+
fields: ['id', 'username', 'email', 'role', 'avatar', 'nickname', 'createdAt', 'updatedAt'],
|
|
32
|
+
where,
|
|
33
|
+
page: params.page || 1,
|
|
34
|
+
limit: params.limit || 10,
|
|
35
|
+
orderBy: ['createdAt#DESC']
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
return Yes('查询成功', result);
|
|
39
|
+
}
|
|
40
|
+
};
|
package/bun.lock
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lockfileVersion": 1,
|
|
3
|
+
"workspaces": {
|
|
4
|
+
"": {
|
|
5
|
+
"name": "befly-template",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"befly": "../core",
|
|
8
|
+
"mysql2": "^3.15.2",
|
|
9
|
+
},
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"@types/bun": "latest",
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
"packages": {
|
|
16
|
+
"@types/bun": ["@types/bun@1.3.0", "", { "dependencies": { "bun-types": "1.3.0" } }, "sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA=="],
|
|
17
|
+
|
|
18
|
+
"@types/node": ["@types/node@24.7.2", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA=="],
|
|
19
|
+
|
|
20
|
+
"@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="],
|
|
21
|
+
|
|
22
|
+
"ansi-escapes": ["ansi-escapes@7.0.0", "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz", { "dependencies": { "environment": "^1.0.0" } }, "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw=="],
|
|
23
|
+
|
|
24
|
+
"ansi-regex": ["ansi-regex@6.2.0", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.0.tgz", {}, "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg=="],
|
|
25
|
+
|
|
26
|
+
"ansi-styles": ["ansi-styles@6.2.1", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
|
|
27
|
+
|
|
28
|
+
"aws-ssl-profiles": ["aws-ssl-profiles@1.1.2", "", {}, "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="],
|
|
29
|
+
|
|
30
|
+
"befly": ["befly@file:../core", { "devDependencies": { "lint-staged": "^16.1.5", "prettier": "^3.6.2", "simple-git-hooks": "^2.13.1" } }],
|
|
31
|
+
|
|
32
|
+
"braces": ["braces@3.0.3", "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
|
|
33
|
+
|
|
34
|
+
"bun-types": ["bun-types@1.3.0", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ=="],
|
|
35
|
+
|
|
36
|
+
"chalk": ["chalk@5.6.0", "https://registry.npmmirror.com/chalk/-/chalk-5.6.0.tgz", {}, "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ=="],
|
|
37
|
+
|
|
38
|
+
"cli-cursor": ["cli-cursor@5.0.0", "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-5.0.0.tgz", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
|
|
39
|
+
|
|
40
|
+
"cli-truncate": ["cli-truncate@4.0.0", "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-4.0.0.tgz", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="],
|
|
41
|
+
|
|
42
|
+
"colorette": ["colorette@2.0.20", "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="],
|
|
43
|
+
|
|
44
|
+
"commander": ["commander@14.0.0", "https://registry.npmmirror.com/commander/-/commander-14.0.0.tgz", {}, "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA=="],
|
|
45
|
+
|
|
46
|
+
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
|
|
47
|
+
|
|
48
|
+
"debug": ["debug@4.4.1", "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
|
|
49
|
+
|
|
50
|
+
"denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="],
|
|
51
|
+
|
|
52
|
+
"emoji-regex": ["emoji-regex@10.4.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.4.0.tgz", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
|
|
53
|
+
|
|
54
|
+
"environment": ["environment@1.1.0", "https://registry.npmmirror.com/environment/-/environment-1.1.0.tgz", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="],
|
|
55
|
+
|
|
56
|
+
"eventemitter3": ["eventemitter3@5.0.1", "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
|
|
57
|
+
|
|
58
|
+
"fill-range": ["fill-range@7.1.1", "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
|
|
59
|
+
|
|
60
|
+
"generate-function": ["generate-function@2.3.1", "", { "dependencies": { "is-property": "^1.0.2" } }, "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ=="],
|
|
61
|
+
|
|
62
|
+
"get-east-asian-width": ["get-east-asian-width@1.3.0", "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", {}, "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ=="],
|
|
63
|
+
|
|
64
|
+
"iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="],
|
|
65
|
+
|
|
66
|
+
"is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="],
|
|
67
|
+
|
|
68
|
+
"is-number": ["is-number@7.0.0", "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
|
|
69
|
+
|
|
70
|
+
"is-property": ["is-property@1.0.2", "", {}, "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="],
|
|
71
|
+
|
|
72
|
+
"lilconfig": ["lilconfig@3.1.3", "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
|
|
73
|
+
|
|
74
|
+
"lint-staged": ["lint-staged@16.1.5", "https://registry.npmmirror.com/lint-staged/-/lint-staged-16.1.5.tgz", { "dependencies": { "chalk": "^5.5.0", "commander": "^14.0.0", "debug": "^4.4.1", "lilconfig": "^3.1.3", "listr2": "^9.0.1", "micromatch": "^4.0.8", "nano-spawn": "^1.0.2", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-uAeQQwByI6dfV7wpt/gVqg+jAPaSp8WwOA8kKC/dv1qw14oGpnpAisY65ibGHUGDUv0rYaZ8CAJZ/1U8hUvC2A=="],
|
|
75
|
+
|
|
76
|
+
"listr2": ["listr2@9.0.2", "https://registry.npmmirror.com/listr2/-/listr2-9.0.2.tgz", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-VVd7cS6W+vLJu2wmq4QmfVj14Iep7cz4r/OWNk36Aq5ZOY7G8/BfCrQFexcwB1OIxB3yERiePfE/REBjEFulag=="],
|
|
77
|
+
|
|
78
|
+
"log-update": ["log-update@6.1.0", "https://registry.npmmirror.com/log-update/-/log-update-6.1.0.tgz", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="],
|
|
79
|
+
|
|
80
|
+
"long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="],
|
|
81
|
+
|
|
82
|
+
"lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="],
|
|
83
|
+
|
|
84
|
+
"lru.min": ["lru.min@1.1.2", "", {}, "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg=="],
|
|
85
|
+
|
|
86
|
+
"micromatch": ["micromatch@4.0.8", "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
|
|
87
|
+
|
|
88
|
+
"mimic-function": ["mimic-function@5.0.1", "https://registry.npmmirror.com/mimic-function/-/mimic-function-5.0.1.tgz", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
|
|
89
|
+
|
|
90
|
+
"ms": ["ms@2.1.3", "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
|
91
|
+
|
|
92
|
+
"mysql2": ["mysql2@3.15.2", "", { "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.7.0", "long": "^5.2.1", "lru.min": "^1.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" } }, "sha512-kFm5+jbwR5mC+lo+3Cy46eHiykWSpUtTLOH3GE+AR7GeLq8PgfJcvpMiyVWk9/O53DjQsqm6a3VOOfq7gYWFRg=="],
|
|
93
|
+
|
|
94
|
+
"named-placeholders": ["named-placeholders@1.1.3", "", { "dependencies": { "lru-cache": "^7.14.1" } }, "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w=="],
|
|
95
|
+
|
|
96
|
+
"nano-spawn": ["nano-spawn@1.0.2", "https://registry.npmmirror.com/nano-spawn/-/nano-spawn-1.0.2.tgz", {}, "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg=="],
|
|
97
|
+
|
|
98
|
+
"onetime": ["onetime@7.0.0", "https://registry.npmmirror.com/onetime/-/onetime-7.0.0.tgz", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
|
|
99
|
+
|
|
100
|
+
"picomatch": ["picomatch@2.3.1", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
|
101
|
+
|
|
102
|
+
"pidtree": ["pidtree@0.6.0", "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="],
|
|
103
|
+
|
|
104
|
+
"prettier": ["prettier@3.6.2", "https://registry.npmmirror.com/prettier/-/prettier-3.6.2.tgz", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="],
|
|
105
|
+
|
|
106
|
+
"restore-cursor": ["restore-cursor@5.1.0", "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-5.1.0.tgz", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
|
|
107
|
+
|
|
108
|
+
"rfdc": ["rfdc@1.4.1", "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
|
|
109
|
+
|
|
110
|
+
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
|
111
|
+
|
|
112
|
+
"seq-queue": ["seq-queue@0.0.5", "", {}, "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="],
|
|
113
|
+
|
|
114
|
+
"signal-exit": ["signal-exit@4.1.0", "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
|
115
|
+
|
|
116
|
+
"simple-git-hooks": ["simple-git-hooks@2.13.1", "https://registry.npmmirror.com/simple-git-hooks/-/simple-git-hooks-2.13.1.tgz", { "bin": { "simple-git-hooks": "cli.js" } }, "sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ=="],
|
|
117
|
+
|
|
118
|
+
"slice-ansi": ["slice-ansi@5.0.0", "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="],
|
|
119
|
+
|
|
120
|
+
"sqlstring": ["sqlstring@2.3.3", "", {}, "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="],
|
|
121
|
+
|
|
122
|
+
"string-argv": ["string-argv@0.3.2", "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="],
|
|
123
|
+
|
|
124
|
+
"string-width": ["string-width@7.2.0", "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
|
125
|
+
|
|
126
|
+
"strip-ansi": ["strip-ansi@7.1.0", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
|
|
127
|
+
|
|
128
|
+
"to-regex-range": ["to-regex-range@5.0.1", "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
|
|
129
|
+
|
|
130
|
+
"undici-types": ["undici-types@7.14.0", "", {}, "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA=="],
|
|
131
|
+
|
|
132
|
+
"wrap-ansi": ["wrap-ansi@9.0.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q=="],
|
|
133
|
+
|
|
134
|
+
"yaml": ["yaml@2.8.1", "https://registry.npmmirror.com/yaml/-/yaml-2.8.1.tgz", { "bin": { "yaml": "bin.mjs" } }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="],
|
|
135
|
+
|
|
136
|
+
"log-update/slice-ansi": ["slice-ansi@7.1.0", "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-7.1.0.tgz", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg=="],
|
|
137
|
+
|
|
138
|
+
"log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.0.0", "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", { "dependencies": { "get-east-asian-width": "^1.0.0" } }, "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA=="],
|
|
139
|
+
}
|
|
140
|
+
}
|