befly-tpl 3.2.1 → 3.2.3
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 +240 -14
- package/package.json +22 -4
- package/addon-loader.example.ts +0 -99
- package/bun.lock +0 -140
- package/logs/2025-08-22.0.log +0 -197
- package/logs/2025-08-23.0.log +0 -151
- package/logs/2025-08-24.0.log +0 -296
- package/logs/2025-08-25.0.log +0 -162
- package/logs/2025-08-26.0.log +0 -19
- package/logs/2025-08-27.0.log +0 -63
- package/logs/2025-08-28.0.log +0 -286
- package/logs/2025-08-30.0.log +0 -1
- package/logs/2025-09-01.0.log +0 -296
- package/logs/2025-09-02.0.log +0 -298
- package/logs/2025-10-11.0.log +0 -2718
- package/logs/2025-10-12.0.log +0 -4374
- package/logs/2025-10-13.0.log +0 -759
- package/logs/2025-10-14.0.log +0 -2350
- package/logs/2025-10-15.0.log +0 -2386
- package/logs/2025-10-16.0.log +0 -2807
- package/logs/2025-10-17.0.log +0 -1143
- package/logs/2025-10-18.0.log +0 -1292
- package/logs/2025-10-19.0.log +0 -1752
- package/logs/2025-10-20.0.log +0 -722
- package/logs/2025-10-21.0.log +0 -1075
- package/logs/2025-10-23.0.log +0 -3291
- package/logs/2025-10-24.0.log +0 -2341
- package/logs/2025-10-25.0.log +0 -1367
- package/logs/debug.0.log +0 -25174
- package/temp/addon-route-prefix-migration.md +0 -400
- package/temp/api-route-conflict-analysis.md +0 -441
- package/temp/interactive-cli-guide.md +0 -199
- package/temp/missing-apis-fix.md +0 -362
- package/temp/remove-status-field.md +0 -239
- package/temp/roleid-to-rolecode-optimization.md +0 -321
- package/temp/status-to-state-migration-complete.md +0 -176
- package/temp/syncMenu-guide.md +0 -235
- package/temp/test-admin-menus-cache.ts +0 -125
- package/temp/test-admin-menus.ts +0 -110
- package/temp/test-interactive-cli.ps1 +0 -14
package/README.md
CHANGED
|
@@ -1,20 +1,246 @@
|
|
|
1
|
-
# Befly -
|
|
1
|
+
# Befly - 野蜂飞舞
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+

|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> 道生一,一生二,二生三,三生万物
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**Befly 3.0 - TypeScript 重构版本已发布!**
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- DB_HOST:主机(sqlite 可忽略)
|
|
11
|
-
- DB_PORT:端口(sqlite 可忽略)
|
|
12
|
-
- DB_USER:用户名(sqlite 可忽略)
|
|
13
|
-
- DB_PASS:密码(sqlite 可忽略)
|
|
14
|
-
- DB_NAME:数据库名称(sqlite 为文件路径或 :memory:)
|
|
9
|
+
## 🎯 简介
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
Befly 是专为 Bun 运行时设计的现代化 API 框架,提供:
|
|
17
12
|
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
13
|
+
- ⚡ **原生 TypeScript 支持** - 完整的类型定义和智能提示
|
|
14
|
+
- 🚀 **高性能** - 基于 Bun 运行时,超快的启动和执行速度
|
|
15
|
+
- 🔌 **插件化架构** - 灵活的插件系统,轻松扩展功能
|
|
16
|
+
- 🗄️ **多数据库支持** - MySQL、PostgreSQL、SQLite 统一接口
|
|
17
|
+
- 📝 **自动化表管理** - 基于 JSON 的表定义,自动同步数据库结构
|
|
18
|
+
- 🔐 **内置身份验证** - JWT 认证,角色权限管理
|
|
19
|
+
- 📊 **完整日志系统** - 结构化日志,敏感字段过滤
|
|
20
|
+
|
|
21
|
+
## 📦 快速开始
|
|
22
|
+
|
|
23
|
+
### 安装
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# 创建新项目
|
|
27
|
+
mkdir my-api && cd my-api
|
|
28
|
+
|
|
29
|
+
# 安装 Befly
|
|
30
|
+
bun add befly
|
|
31
|
+
|
|
32
|
+
# 初始化项目(即将支持)
|
|
33
|
+
bunx befly init
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 最简示例
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// main.ts
|
|
40
|
+
import { Server } from 'befly';
|
|
41
|
+
|
|
42
|
+
await Server({
|
|
43
|
+
name: 'My API',
|
|
44
|
+
port: 3000
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
运行项目:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
bun run main.ts
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 创建第一个接口
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// apis/user/hello.ts
|
|
58
|
+
import { Yes } from 'befly';
|
|
59
|
+
import type { ApiRoute } from 'befly';
|
|
60
|
+
|
|
61
|
+
export default {
|
|
62
|
+
name: '问候接口',
|
|
63
|
+
auth: false, // 公开接口
|
|
64
|
+
fields: {},
|
|
65
|
+
handler: async (befly, ctx) => {
|
|
66
|
+
return Yes('Hello, Befly!', {
|
|
67
|
+
timestamp: Date.now()
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
} as ApiRoute;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
访问:`http://localhost:3000/api/user/hello`
|
|
74
|
+
|
|
75
|
+
## 🔥 新版本特性(3.0)
|
|
76
|
+
|
|
77
|
+
### TypeScript 全面支持
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
import { Yes } from 'befly';
|
|
81
|
+
import type { ApiRoute, BeflyContext } from 'befly';
|
|
82
|
+
import type { User } from './types/models';
|
|
83
|
+
|
|
84
|
+
export default {
|
|
85
|
+
name: '获取用户',
|
|
86
|
+
auth: true,
|
|
87
|
+
fields: {
|
|
88
|
+
id: '用户ID|number|1|999999|null|1|null'
|
|
89
|
+
},
|
|
90
|
+
required: ['id'],
|
|
91
|
+
handler: async (befly: BeflyContext, ctx) => {
|
|
92
|
+
const { id } = ctx.body;
|
|
93
|
+
|
|
94
|
+
// 类型安全的数据库查询
|
|
95
|
+
const user = await befly.db.getOne<User>({
|
|
96
|
+
table: 'user',
|
|
97
|
+
where: { id }
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
return Yes('查询成功', user);
|
|
101
|
+
}
|
|
102
|
+
} as ApiRoute;
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 增强的数据库操作
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// 查询单条
|
|
109
|
+
const user = await befly.db.getOne<User>({
|
|
110
|
+
table: 'user',
|
|
111
|
+
where: { id: 1 }
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// 分页列表
|
|
115
|
+
const result = await befly.db.getList<Product>({
|
|
116
|
+
table: 'product',
|
|
117
|
+
where: { category: 'electronics' },
|
|
118
|
+
page: 1,
|
|
119
|
+
limit: 10,
|
|
120
|
+
orderBy: ['createdAt#DESC']
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// 插入数据
|
|
124
|
+
await befly.db.insData({
|
|
125
|
+
table: 'user',
|
|
126
|
+
data: {
|
|
127
|
+
username: 'john',
|
|
128
|
+
email: 'john@example.com'
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// 更新数据
|
|
133
|
+
await befly.db.updData({
|
|
134
|
+
table: 'user',
|
|
135
|
+
where: { id: 1 },
|
|
136
|
+
data: {
|
|
137
|
+
nickname: 'John Doe'
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// 删除数据
|
|
142
|
+
await befly.db.delData({
|
|
143
|
+
table: 'user',
|
|
144
|
+
where: { id: 1 }
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 智能表定义
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"username": "用户名|string|3|50|null|1|^[a-zA-Z0-9_]+$",
|
|
153
|
+
"email": "邮箱|string|5|100|null|1|^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
|
|
154
|
+
"age": "年龄|number|0|150|18|0|null",
|
|
155
|
+
"tags": "标签|array_string|0|10|null|0|null",
|
|
156
|
+
"bio": "简介|text|0|5000|null|0|null"
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
字段定义格式:`"字段名|类型|最小值|最大值|默认值|是否索引|正则约束"`
|
|
161
|
+
|
|
162
|
+
同步到数据库:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
bun run scripts/syncDb.ts
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## 🗄️ 数据库配置
|
|
169
|
+
|
|
170
|
+
统一使用环境变量配置,支持三种数据库:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# MySQL
|
|
174
|
+
DB_TYPE=mysql
|
|
175
|
+
DB_HOST=127.0.0.1
|
|
176
|
+
DB_PORT=3306
|
|
177
|
+
DB_USER=root
|
|
178
|
+
DB_PASS=password
|
|
179
|
+
DB_NAME=my_database
|
|
180
|
+
|
|
181
|
+
# PostgreSQL
|
|
182
|
+
DB_TYPE=postgresql
|
|
183
|
+
DB_HOST=localhost
|
|
184
|
+
DB_PORT=5432
|
|
185
|
+
DB_USER=postgres
|
|
186
|
+
DB_PASS=password
|
|
187
|
+
DB_NAME=my_database
|
|
188
|
+
|
|
189
|
+
# SQLite
|
|
190
|
+
DB_TYPE=sqlite
|
|
191
|
+
DB_NAME=/path/to/database.sqlite
|
|
192
|
+
# 或使用内存数据库
|
|
193
|
+
DB_NAME=:memory:
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## 📖 文档
|
|
197
|
+
|
|
198
|
+
完整文档请访问 [`/docs` 目录](./docs/):
|
|
199
|
+
|
|
200
|
+
- [快速开始](./docs/02-快速上手/01-10分钟体验.md)
|
|
201
|
+
- [核心概念](./docs/03-核心概念/)
|
|
202
|
+
- [API 开发](./docs/04-API开发/)
|
|
203
|
+
- [数据库操作](./docs/05-数据库/)
|
|
204
|
+
- [TypeScript 支持](./docs/10-TypeScript/01-TypeScript支持.md)
|
|
205
|
+
|
|
206
|
+
### 目录说明
|
|
207
|
+
|
|
208
|
+
- **`packages/core`** - Befly 核心框架包(发布到 npm)
|
|
209
|
+
- **`packages/tpl`** - API 项目模板示例
|
|
210
|
+
- **`packages/admin`** - 后台管理系统(Vue3 + TinyVue + 自动导入)
|
|
211
|
+
|
|
212
|
+
## 🚀 快速启动
|
|
213
|
+
|
|
214
|
+
### 启动 API 服务
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
bun run dev
|
|
218
|
+
# 访问: http://localhost:3000
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### 启动后台管理
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
bun run dev:admin
|
|
225
|
+
# 访问: http://localhost:5173
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## 🎓 示例项目
|
|
229
|
+
|
|
230
|
+
查看 `/tpl` 目录获取完整的示例项目。
|
|
231
|
+
|
|
232
|
+
## 🤝 贡献
|
|
233
|
+
|
|
234
|
+
欢迎提交 Issue 和 Pull Request!
|
|
235
|
+
|
|
236
|
+
## 📄 许可
|
|
237
|
+
|
|
238
|
+
MIT License
|
|
239
|
+
|
|
240
|
+
## 🌟 致谢
|
|
241
|
+
|
|
242
|
+
感谢所有为 Befly 做出贡献的开发者!
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
**Befly 3.0 - 让 API 开发更简单、更高效!** 🚀
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "befly-tpl",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.3",
|
|
4
4
|
"main": "main.ts",
|
|
5
5
|
"types": "main.ts",
|
|
6
6
|
"description": "Befly 3.0 TypeScript Template",
|
|
@@ -17,13 +17,31 @@
|
|
|
17
17
|
"syncDb": "befly syncDb",
|
|
18
18
|
"syncDev": " befly syncDev"
|
|
19
19
|
},
|
|
20
|
+
"files": [
|
|
21
|
+
"addons/*",
|
|
22
|
+
"apis/*",
|
|
23
|
+
"checks/*",
|
|
24
|
+
"plugins/*",
|
|
25
|
+
"scripts/*",
|
|
26
|
+
"tables/*",
|
|
27
|
+
"types/*",
|
|
28
|
+
"tests/*",
|
|
29
|
+
".env.development",
|
|
30
|
+
".npmrc",
|
|
31
|
+
"LICENSE",
|
|
32
|
+
"main.ts",
|
|
33
|
+
"package.json",
|
|
34
|
+
"pm2.config.cjs",
|
|
35
|
+
"README.md",
|
|
36
|
+
"tsconfig.json"
|
|
37
|
+
],
|
|
20
38
|
"type": "module",
|
|
21
39
|
"dependencies": {
|
|
22
|
-
"befly": "3.1
|
|
23
|
-
"befly-cli": "3.
|
|
40
|
+
"befly": "3.2.1",
|
|
41
|
+
"befly-cli": "3.2.2"
|
|
24
42
|
},
|
|
25
43
|
"engines": {
|
|
26
44
|
"bun": ">=1.3.0"
|
|
27
45
|
},
|
|
28
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "b59fc2e87064716dcb8e34cf2435bbf1198d109a"
|
|
29
47
|
}
|
package/addon-loader.example.ts
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Addon 配置读取示例
|
|
3
|
-
* 演示如何读取和使用 addon.config.json
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { readFileSync, readdirSync } from 'fs';
|
|
7
|
-
import { join } from 'path';
|
|
8
|
-
import type { AddonConfig } from '../core/types/addon.js';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* 读取单个 Addon 配置
|
|
12
|
-
*/
|
|
13
|
-
export function loadAddonConfig(addonPath: string): AddonConfig | null {
|
|
14
|
-
try {
|
|
15
|
-
const configPath = join(addonPath, 'addon.config.json');
|
|
16
|
-
const content = readFileSync(configPath, 'utf-8');
|
|
17
|
-
const config: AddonConfig = JSON.parse(content);
|
|
18
|
-
|
|
19
|
-
// 设置默认值
|
|
20
|
-
return {
|
|
21
|
-
enabled: true,
|
|
22
|
-
version: '0.0.1',
|
|
23
|
-
...config
|
|
24
|
-
};
|
|
25
|
-
} catch (error) {
|
|
26
|
-
console.warn(`无法读取配置: ${addonPath}`, error);
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 加载所有 Addon 配置
|
|
33
|
-
*/
|
|
34
|
-
export function loadAllAddonConfigs(addonsDir: string): Map<string, AddonConfig> {
|
|
35
|
-
const configs = new Map<string, AddonConfig>();
|
|
36
|
-
|
|
37
|
-
try {
|
|
38
|
-
const dirs = readdirSync(addonsDir, { withFileTypes: true });
|
|
39
|
-
|
|
40
|
-
for (const dir of dirs) {
|
|
41
|
-
// 跳过非目录和特殊目录
|
|
42
|
-
if (!dir.isDirectory() || dir.name.startsWith('.') || dir.name.startsWith('_')) {
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const addonPath = join(addonsDir, dir.name);
|
|
47
|
-
const config = loadAddonConfig(addonPath);
|
|
48
|
-
|
|
49
|
-
if (config) {
|
|
50
|
-
configs.set(config.name, config);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
} catch (error) {
|
|
54
|
-
console.error('加载 Addon 配置失败:', error);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return configs;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* 查找启用的 Addons
|
|
62
|
-
*/
|
|
63
|
-
export function getEnabledAddons(configs: Map<string, AddonConfig>): AddonConfig[] {
|
|
64
|
-
return Array.from(configs.values()).filter((config) => config.enabled !== false);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* 按关键词搜索 Addons
|
|
69
|
-
*/
|
|
70
|
-
export function searchAddonsByKeyword(configs: Map<string, AddonConfig>, keyword: string): AddonConfig[] {
|
|
71
|
-
return Array.from(configs.values()).filter((config) => config.keywords?.some((k) => k.toLowerCase().includes(keyword.toLowerCase())));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* 示例用法
|
|
76
|
-
*/
|
|
77
|
-
if (import.meta.main) {
|
|
78
|
-
const addonsDir = join(import.meta.dir, 'addons');
|
|
79
|
-
const configs = loadAllAddonConfigs(addonsDir);
|
|
80
|
-
|
|
81
|
-
console.log(`\n📦 加载了 ${configs.size} 个 Addon:\n`);
|
|
82
|
-
|
|
83
|
-
for (const [name, config] of configs) {
|
|
84
|
-
console.log(` - ${config.title} (${name}@${config.version})`);
|
|
85
|
-
if (config.description) {
|
|
86
|
-
console.log(` ${config.description}`);
|
|
87
|
-
}
|
|
88
|
-
console.log();
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// 查找启用的 Addons
|
|
92
|
-
const enabled = getEnabledAddons(configs);
|
|
93
|
-
console.log(`✅ 启用的 Addons: ${enabled.length} 个\n`);
|
|
94
|
-
|
|
95
|
-
// 按关键词搜索
|
|
96
|
-
const adminAddons = searchAddonsByKeyword(configs, 'admin');
|
|
97
|
-
console.log(`🔍 包含 "admin" 关键词的 Addons: ${adminAddons.length} 个`);
|
|
98
|
-
adminAddons.forEach((config) => console.log(` - ${config.title}`));
|
|
99
|
-
}
|
package/bun.lock
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
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
|
-
}
|