@lovrabet/dsparser 1.0.0-beta.2 → 1.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/README.md +622 -1
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/src/core/DatasetGroup.d.ts +58 -0
- package/dist/src/core/DatasetGroup.d.ts.map +1 -0
- package/dist/src/core/DatasetGroupMap.d.ts +108 -0
- package/dist/src/core/DatasetGroupMap.d.ts.map +1 -0
- package/dist/src/core/DatasetItem.d.ts +94 -0
- package/dist/src/core/DatasetItem.d.ts.map +1 -0
- package/dist/src/core/DatasetList.d.ts +198 -0
- package/dist/src/core/DatasetList.d.ts.map +1 -0
- package/dist/src/core/DrivenDataDetail.d.ts +174 -0
- package/dist/src/core/DrivenDataDetail.d.ts.map +1 -0
- package/dist/src/core/index.d.ts +11 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/plus/DrivenDataDetailPlus.d.ts +121 -0
- package/dist/src/plus/DrivenDataDetailPlus.d.ts.map +1 -0
- package/dist/src/plus/index.d.ts +7 -0
- package/dist/src/plus/index.d.ts.map +1 -0
- package/dist/src/utils/core/dataset-adapter.d.ts +122 -0
- package/dist/src/utils/core/dataset-adapter.d.ts.map +1 -0
- package/dist/src/utils/core/dataset-generator.d.ts +187 -0
- package/dist/src/utils/core/dataset-generator.d.ts.map +1 -0
- package/dist/src/utils/core/index.d.ts +11 -0
- package/dist/src/utils/core/index.d.ts.map +1 -0
- package/dist/src/utils/core/naming.d.ts +48 -0
- package/dist/src/utils/core/naming.d.ts.map +1 -0
- package/dist/src/utils/core/table-name.d.ts +104 -0
- package/dist/src/utils/core/table-name.d.ts.map +1 -0
- package/dist/src/utils/index.d.ts +10 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/plus/example-value-generator.d.ts +58 -0
- package/dist/src/utils/plus/example-value-generator.d.ts.map +1 -0
- package/dist/src/utils/plus/field-utils.d.ts +104 -0
- package/dist/src/utils/plus/field-utils.d.ts.map +1 -0
- package/dist/src/utils/plus/index.d.ts +10 -0
- package/dist/src/utils/plus/index.d.ts.map +1 -0
- package/dist/src/utils/plus/operation-parser.d.ts +91 -0
- package/dist/src/utils/plus/operation-parser.d.ts.map +1 -0
- package/package.json +23 -8
package/README.md
CHANGED
|
@@ -1 +1,622 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @lovrabet/dsparser
|
|
2
|
+
|
|
3
|
+
> 统一数据集处理逻辑的 TypeScript 工具库,消除代码重复,赋能 AI Agent 开发
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@lovrabet/dsparser)
|
|
6
|
+
[](./LICENSE)
|
|
7
|
+
|
|
8
|
+
## 📌 一句话介绍
|
|
9
|
+
|
|
10
|
+
**@lovrabet/dsparser 是一个统一的数据集解析和分析工具库,用于处理 Lovrabet 平台中所有数据集相关的逻辑,避免代码重复,提升开发效率,并为 AI Agent 和 Vibe Coding 提供结构化语料。**
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 🎯 核心价值
|
|
15
|
+
|
|
16
|
+
### 解决的问题
|
|
17
|
+
|
|
18
|
+
在我们的技术栈中(`yuntoo-web-app`、`ai-node-service-hub`、`lovrabet-cli`、`lovrabet-node-sdk` 等),存在**超过 1250 行重复代码**:
|
|
19
|
+
|
|
20
|
+
| 逻辑类型 | 重复位置 | 代码行数 |
|
|
21
|
+
|---------|---------|---------|
|
|
22
|
+
| 🔍 **去重逻辑** | `yuntoo-web-app` + `ai-node-service-hub` | 150+ |
|
|
23
|
+
| 📊 **字段解析** | `yuntoo-web-app` + `ai-node-service-hub` + `lovrabet-cli` | 300+ |
|
|
24
|
+
| 🎯 **示例值生成** | `yuntoo-web-app` + `ai-node-service-hub` | 200+ |
|
|
25
|
+
| 📝 **API 文档生成** | `yuntoo-web-app` + `ai-node-service-hub` | 500+ |
|
|
26
|
+
| 🔧 **操作类型判断** | 所有项目 | 100+ |
|
|
27
|
+
|
|
28
|
+
**带来的痛点**:
|
|
29
|
+
- 修改一处逻辑,需要同步修改 3-5 个文件
|
|
30
|
+
- 不同实现的微妙差异导致行为不一致
|
|
31
|
+
- 新人不知道该用哪个实现
|
|
32
|
+
- 测试覆盖率难以保证
|
|
33
|
+
|
|
34
|
+
### 我们的方案
|
|
35
|
+
|
|
36
|
+
> **Write Once, Use Everywhere** - 一次编写,处处使用
|
|
37
|
+
|
|
38
|
+
将所有数据集处理的共性逻辑抽象到统一工具库,各项目只需调用,不再重复实现。
|
|
39
|
+
|
|
40
|
+
### 核心优势
|
|
41
|
+
|
|
42
|
+
#### ✅ 技术价值
|
|
43
|
+
- **减少 1250+ 行重复代码**
|
|
44
|
+
- **统一实现标准**,避免行为不一致
|
|
45
|
+
- **集中测试**,覆盖率从 30% → 90%
|
|
46
|
+
- **新功能开发时间减少 60%**
|
|
47
|
+
- **Bug 修复效率提升 80%**
|
|
48
|
+
|
|
49
|
+
#### ✅ 业务价值
|
|
50
|
+
- **API 文档生成**:从手写 30 分钟 → 自动生成 10 秒
|
|
51
|
+
- **新数据集上线**:从 2 天 → 0.5 天
|
|
52
|
+
- **维护成本降低**:统一维护点,减少 70% 工作量
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 🤖 应用场景
|
|
57
|
+
|
|
58
|
+
### 1. 传统开发场景
|
|
59
|
+
|
|
60
|
+
#### 前端开发
|
|
61
|
+
```typescript
|
|
62
|
+
import { DrivenDataDetailPlus } from '@lovrabet/dsparser';
|
|
63
|
+
|
|
64
|
+
// 自动生成完整 API 文档
|
|
65
|
+
const dataset = new DrivenDataDetailPlus(apiResponse.data);
|
|
66
|
+
const markdown = dataset.generateAllOperationsMarkdown();
|
|
67
|
+
fs.writeFileSync('API.md', markdown);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### 后端开发
|
|
71
|
+
```typescript
|
|
72
|
+
import { DatasetList } from '@lovrabet/dsparser';
|
|
73
|
+
|
|
74
|
+
// 数据集去重和分类
|
|
75
|
+
const list = DatasetList.initDataset(response);
|
|
76
|
+
const unique = list.removeDuplicates();
|
|
77
|
+
const dbTables = list.filterBySource('DB_TABLE');
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 2. AI Agent & Vibe Coding 场景 🚀
|
|
81
|
+
|
|
82
|
+
**为什么 AI 需要 dsparser?**
|
|
83
|
+
|
|
84
|
+
AI Agent 和 Vibe Coding(智能代码补全)需要**理解数据集的结构和 API**,才能:
|
|
85
|
+
- 生成正确的 CRUD 代码
|
|
86
|
+
- 推荐合适的字段
|
|
87
|
+
- 构建符合规范的请求参数
|
|
88
|
+
- 提供准确的代码补全
|
|
89
|
+
|
|
90
|
+
**dsparser 提供的结构化语料:**
|
|
91
|
+
|
|
92
|
+
#### 场景 1:AI 生成 CRUD 代码
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
// AI Agent 使用 dsparser 分析数据集
|
|
96
|
+
import { DrivenDataDetailPlus } from '@lovrabet/dsparser';
|
|
97
|
+
|
|
98
|
+
const dataset = new DrivenDataDetailPlus(apiResponse.data);
|
|
99
|
+
|
|
100
|
+
// 获取操作分析
|
|
101
|
+
const createOp = dataset.getOperationAnalysis('create');
|
|
102
|
+
|
|
103
|
+
// AI 可以基于这些信息生成代码:
|
|
104
|
+
// - createOp.requestFields: 需要哪些参数
|
|
105
|
+
// - createOp.requestParams: 每个参数的类型和说明
|
|
106
|
+
// - createOp.requestExample: 示例数据
|
|
107
|
+
// - createOp.path: API 路径
|
|
108
|
+
// - createOp.method: HTTP 方法
|
|
109
|
+
|
|
110
|
+
// AI 生成的代码:
|
|
111
|
+
const newRecord = await client.models.visitRecord.create({
|
|
112
|
+
customer_id: 1,
|
|
113
|
+
visit_time: '2024-10-19',
|
|
114
|
+
purpose: '客户拜访'
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
#### 场景 2:Vibe Coding 智能补全
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// 用户正在编写代码:
|
|
122
|
+
const dataset = new DrivenDataDetailPlus(data);
|
|
123
|
+
dataset.get
|
|
124
|
+
|
|
125
|
+
// Vibe Coding 通过 dsparser 分析,提供智能补全:
|
|
126
|
+
// ✅ getName() - 获取数据集名称
|
|
127
|
+
// ✅ getTableName() - 获取表名
|
|
128
|
+
// ✅ getSource() - 获取数据源类型
|
|
129
|
+
// ✅ getFields() - 获取所有字段
|
|
130
|
+
// ✅ getOperationAnalysis('create') - 获取创建操作分析
|
|
131
|
+
// ✅ generateAllOperationsMarkdown() - 生成 API 文档
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
#### 场景 3:AI Agent 生成 API 文档
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
// AI Agent 工具定义
|
|
138
|
+
{
|
|
139
|
+
name: "generate_api_documentation",
|
|
140
|
+
description: "为数据集自动生成完整的 API 文档",
|
|
141
|
+
parameters: {
|
|
142
|
+
datasetId: { type: "string", description: "数据集 ID" }
|
|
143
|
+
},
|
|
144
|
+
handler: async (datasetId) => {
|
|
145
|
+
// 从 API 获取数据集信息(使用你项目中的数据获取方式)
|
|
146
|
+
const data = await yourApiClient.getDatasetDetail(datasetId);
|
|
147
|
+
|
|
148
|
+
// 使用 dsparser 生成文档
|
|
149
|
+
const dataset = new DrivenDataDetailPlus(data);
|
|
150
|
+
const markdown = dataset.generateAllOperationsMarkdown({
|
|
151
|
+
filterBlacklist: true,
|
|
152
|
+
includeDisabled: false
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
markdown,
|
|
157
|
+
summary: dataset.generateAllOperationsSummary()
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
#### 场景 4:前端 Vibe Coding 提供字段建议
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
// 前端代码编辑器中
|
|
167
|
+
// 用户输入:await api.visitRecord.create({
|
|
168
|
+
|
|
169
|
+
// Vibe Coding 后台调用 dsparser:
|
|
170
|
+
const dataset = new DrivenDataDetailPlus(visitRecordData);
|
|
171
|
+
const createOp = dataset.getOperationAnalysis('create');
|
|
172
|
+
|
|
173
|
+
// 提供智能字段建议:
|
|
174
|
+
// {
|
|
175
|
+
// customer_id: 1, // SELECT | 客户名称
|
|
176
|
+
// visit_time: "2024-...", // DATE | 拜访时间
|
|
177
|
+
// purpose: "...", // TEXT | 拜访目的
|
|
178
|
+
// ...
|
|
179
|
+
// }
|
|
180
|
+
|
|
181
|
+
// 用户选择字段后,自动填充示例值
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
#### 场景 5:AI 验证数据集完整性
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
// AI Agent 检查数据集是否支持完整 CRUD
|
|
188
|
+
const dataset = new DrivenDataDetailPlus(data);
|
|
189
|
+
|
|
190
|
+
if (!dataset.supportsCRUD()) {
|
|
191
|
+
const missing = dataset.getMissingCRUDOperations();
|
|
192
|
+
|
|
193
|
+
// AI 提示用户:
|
|
194
|
+
// "该数据集缺少以下操作:[missing.join(', ')]"
|
|
195
|
+
// "建议您在后台配置中启用这些操作"
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// 获取操作统计
|
|
199
|
+
const stats = dataset.getOperationStats();
|
|
200
|
+
// AI 分析:
|
|
201
|
+
// "该数据集共有 7 个操作,其中 5 个已启用,2 个已禁用"
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
#### 场景 6:为 LLM 提供 Context
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
// 为 LLM 构建数据集上下文
|
|
208
|
+
const dataset = new DrivenDataDetailPlus(data);
|
|
209
|
+
|
|
210
|
+
const context = {
|
|
211
|
+
name: dataset.getName(),
|
|
212
|
+
tableName: dataset.getTableName(),
|
|
213
|
+
source: dataset.getSource(),
|
|
214
|
+
|
|
215
|
+
fields: dataset.getFields().map(f => ({
|
|
216
|
+
code: f.code,
|
|
217
|
+
name: f.name,
|
|
218
|
+
type: f.type,
|
|
219
|
+
description: f.description
|
|
220
|
+
})),
|
|
221
|
+
|
|
222
|
+
operations: dataset.getEnabledOperationAnalyses().map(op => ({
|
|
223
|
+
name: op.name,
|
|
224
|
+
displayName: op.displayName,
|
|
225
|
+
method: op.method,
|
|
226
|
+
path: op.path,
|
|
227
|
+
requestFields: op.requestFields,
|
|
228
|
+
requestExample: op.requestExample
|
|
229
|
+
})),
|
|
230
|
+
|
|
231
|
+
stats: dataset.getOperationStats()
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
// 将 context 传递给 LLM
|
|
235
|
+
const prompt = `
|
|
236
|
+
基于以下数据集信息,生成 CRUD 操作代码:
|
|
237
|
+
|
|
238
|
+
数据集:${context.name}
|
|
239
|
+
表名:${context.tableName}
|
|
240
|
+
可用操作:${context.operations.map(op => op.displayName).join(', ')}
|
|
241
|
+
|
|
242
|
+
字段列表:
|
|
243
|
+
${context.fields.map(f => `- ${f.code} (${f.type}): ${f.name}`).join('\n')}
|
|
244
|
+
|
|
245
|
+
请生成创建记录的代码示例。
|
|
246
|
+
`;
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**关键优势:**
|
|
250
|
+
|
|
251
|
+
| 特性 | 无 dsparser | 有 dsparser |
|
|
252
|
+
|-----|------------|------------|
|
|
253
|
+
| **字段类型识别** | ❌ 需要手动解析 JSON | ✅ `getFields()` 直接获取 |
|
|
254
|
+
| **示例值生成** | ❌ 需要硬编码 | ✅ `generateExampleValue()` 智能生成 |
|
|
255
|
+
| **操作完整性检查** | ❌ 无法检测 | ✅ `supportsCRUD()` 一键检查 |
|
|
256
|
+
| **API 文档** | ❌ 需要手写或爬取 | ✅ `generateAllOperationsMarkdown()` 秒生成 |
|
|
257
|
+
| **请求参数验证** | ❌ 不知道哪些必填 | ✅ `getRequiredFields()` 明确告知 |
|
|
258
|
+
|
|
259
|
+
**dsparser 让 AI 从"瞎猜"变成"精准"!** 🎯
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 🚀 快速开始
|
|
264
|
+
|
|
265
|
+
### 安装
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
npm install @lovrabet/dsparser
|
|
269
|
+
# 或
|
|
270
|
+
yarn add @lovrabet/dsparser
|
|
271
|
+
# 或
|
|
272
|
+
bun add @lovrabet/dsparser
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### 3 行代码生成 API 文档
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
import { DrivenDataDetailPlus } from '@lovrabet/dsparser';
|
|
279
|
+
|
|
280
|
+
const dataset = new DrivenDataDetailPlus(apiResponse.data);
|
|
281
|
+
const markdown = dataset.generateAllOperationsMarkdown();
|
|
282
|
+
fs.writeFileSync(`${dataset.getName()}-API.md`, markdown);
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**就这么简单!** ✨
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## 🏗️ 核心功能
|
|
290
|
+
|
|
291
|
+
### 功能特性
|
|
292
|
+
|
|
293
|
+
- 🔍 **数据集列表分析** - 分析和处理从 API getList 接口获取的数据集列表
|
|
294
|
+
- 📊 **数据集结构分析** - 深入分析数据集的字段、操作、关系等结构信息
|
|
295
|
+
- 🧬 **智能去重** - 自动检测和处理重复的数据集
|
|
296
|
+
- 🔄 **名称转换** - 支持多种命名规范之间的转换(snake_case, camelCase, PascalCase 等)
|
|
297
|
+
- 💻 **API 文档生成** - 自动生成完整的 API 文档(Markdown 格式)
|
|
298
|
+
- 🚀 **SDK 代码生成** - 生成符合 @lovrabet/sdk 规范的 SDK 调用代码
|
|
299
|
+
- 🎯 **示例值生成** - 智能生成符合字段类型的示例数据
|
|
300
|
+
- 🔧 **字段分析** - 详细分析字段属性、验证规则、扩展信息等
|
|
301
|
+
- 🤖 **AI Agent 支持** - 为 AI 提供结构化的数据集语料
|
|
302
|
+
|
|
303
|
+
### 1️⃣ 数据集详情分析 (DrivenDataDetail)
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
import { DrivenDataDetail } from '@lovrabet/dsparser';
|
|
307
|
+
|
|
308
|
+
const dataset = new DrivenDataDetail(apiResponse.data);
|
|
309
|
+
|
|
310
|
+
// 🔍 基础信息
|
|
311
|
+
console.log(dataset.getName()); // 数据集名称
|
|
312
|
+
console.log(dataset.getTableName()); // 表名
|
|
313
|
+
console.log(dataset.getSource()); // 数据源类型
|
|
314
|
+
|
|
315
|
+
// 📊 字段分析
|
|
316
|
+
const fields = dataset.getFields(); // 所有字段
|
|
317
|
+
const required = dataset.getRequiredFields(); // 必填字段
|
|
318
|
+
const primaryKey = dataset.getPrimaryKeyFields(); // 主键字段
|
|
319
|
+
|
|
320
|
+
// 🔧 操作分析
|
|
321
|
+
const operations = dataset.getOperations(); // 所有操作
|
|
322
|
+
const createOp = dataset.getOperation('create'); // 单个操作
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### 2️⃣ 数据集列表处理 (DatasetList)
|
|
326
|
+
|
|
327
|
+
```typescript
|
|
328
|
+
import { DatasetList } from '@lovrabet/dsparser';
|
|
329
|
+
|
|
330
|
+
const list = new DatasetList(getListResponse.data);
|
|
331
|
+
|
|
332
|
+
// 🧹 智能去重
|
|
333
|
+
const unique = list.removeDuplicates();
|
|
334
|
+
|
|
335
|
+
// 📑 分类过滤
|
|
336
|
+
const dbTables = list.filterBySource('DB_TABLE');
|
|
337
|
+
const metadata = list.filterBySource('METADATA');
|
|
338
|
+
|
|
339
|
+
// 🔍 搜索
|
|
340
|
+
const result = list.search('客户');
|
|
341
|
+
|
|
342
|
+
// 📊 统计
|
|
343
|
+
const stats = list.getStatistics();
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### 3️⃣ API 文档生成 (DrivenDataDetailPlus) ⭐
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
import { DrivenDataDetailPlus } from '@lovrabet/dsparser';
|
|
350
|
+
|
|
351
|
+
const dataset = new DrivenDataDetailPlus(apiResponse.data);
|
|
352
|
+
|
|
353
|
+
// ✅ CRUD 完整性检查
|
|
354
|
+
if (dataset.supportsCRUD()) {
|
|
355
|
+
console.log('✅ 支持完整 CRUD');
|
|
356
|
+
} else {
|
|
357
|
+
const missing = dataset.getMissingCRUDOperations();
|
|
358
|
+
console.log('❌ 缺少:', missing);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// 📝 自动生成 API 文档(Markdown)
|
|
362
|
+
const markdown = dataset.generateAllOperationsMarkdown({
|
|
363
|
+
filterBlacklist: true, // 过滤黑名单操作
|
|
364
|
+
includeDisabled: false, // 不包含禁用操作
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
// 保存为文件
|
|
368
|
+
fs.writeFileSync('API.md', markdown);
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
**生成的文档示例:**
|
|
372
|
+
|
|
373
|
+
````markdown
|
|
374
|
+
# 客户拜访记录 API 文档
|
|
375
|
+
|
|
376
|
+
## 数据集信息
|
|
377
|
+
- **名称**: 客户拜访记录
|
|
378
|
+
- **代码**: 862aa545533a43dab77583e0205afa27
|
|
379
|
+
- **表名**: visit_record
|
|
380
|
+
|
|
381
|
+
## 创建 (create)
|
|
382
|
+
|
|
383
|
+
**请求参数**
|
|
384
|
+
| 参数名 | 类型 | 说明 |
|
|
385
|
+
|--------|------|------|
|
|
386
|
+
| customer_id | SELECT | 客户名称 |
|
|
387
|
+
| visit_time | DATE | 拜访时间 |
|
|
388
|
+
|
|
389
|
+
**请求示例**
|
|
390
|
+
```json
|
|
391
|
+
{
|
|
392
|
+
"customer_id": 1,
|
|
393
|
+
"visit_time": "2024-10-19"
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
````
|
|
397
|
+
|
|
398
|
+
### 4️⃣ 智能示例值生成
|
|
399
|
+
|
|
400
|
+
```typescript
|
|
401
|
+
import { generateExampleValue } from '@lovrabet/dsparser';
|
|
402
|
+
|
|
403
|
+
// 🎯 根据类型智能生成
|
|
404
|
+
generateExampleValue('email', 'TEXT'); // → "user@example.com"
|
|
405
|
+
generateExampleValue('phone', 'TEXT'); // → "13800138000"
|
|
406
|
+
generateExampleValue('status', 'SELECT'); // → 1
|
|
407
|
+
generateExampleValue('created_at', 'DATE'); // → "2024-10-19"
|
|
408
|
+
|
|
409
|
+
// 特殊场景处理
|
|
410
|
+
generateExampleValue('currentPage', 'Integer'); // → 1
|
|
411
|
+
generateExampleValue('pageSize', 'Integer'); // → 10
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
### 5️⃣ 命名规范转换
|
|
415
|
+
|
|
416
|
+
```typescript
|
|
417
|
+
import { toCamelCase, toSnakeCase, toPascalCase } from '@lovrabet/dsparser';
|
|
418
|
+
|
|
419
|
+
toCamelCase('user_name'); // → "userName"
|
|
420
|
+
toSnakeCase('userName'); // → "user_name"
|
|
421
|
+
toPascalCase('user_name'); // → "UserName"
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
---
|
|
425
|
+
|
|
426
|
+
## 📚 完整 API 文档
|
|
427
|
+
|
|
428
|
+
### API 工具函数
|
|
429
|
+
|
|
430
|
+
包提供了一系列常用的 API 工具函数,方便构建 URL、验证格式等操作:
|
|
431
|
+
|
|
432
|
+
#### URL 构建函数
|
|
433
|
+
|
|
434
|
+
```typescript
|
|
435
|
+
import {
|
|
436
|
+
getBaseUrl,
|
|
437
|
+
getUserBaseUrl,
|
|
438
|
+
buildDatasetListUrl,
|
|
439
|
+
buildDriverDataUrl,
|
|
440
|
+
buildRuntimeApiUrl,
|
|
441
|
+
} from '@lovrabet/dsparser';
|
|
442
|
+
|
|
443
|
+
// 获取基础 URL
|
|
444
|
+
const baseUrl = getBaseUrl('daily'); // https://daily-api.lovrabet.com
|
|
445
|
+
const userUrl = getUserBaseUrl('online'); // https://user.lovrabet.com
|
|
446
|
+
|
|
447
|
+
// 构建数据集列表 URL
|
|
448
|
+
const listUrl = buildDatasetListUrl('app-46bfd917', 'daily', {
|
|
449
|
+
pageSize: 20,
|
|
450
|
+
currentPage: 1
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
// 构建运行时 API URL(用于 CRUD 操作)
|
|
454
|
+
const apiUrl = buildRuntimeApiUrl(
|
|
455
|
+
'app-46bfd917',
|
|
456
|
+
'862aa545533a43dab77583e0205afa27',
|
|
457
|
+
'getList',
|
|
458
|
+
'online'
|
|
459
|
+
);
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
#### 验证函数
|
|
463
|
+
|
|
464
|
+
```typescript
|
|
465
|
+
import { isValidAppCode, isValidDatasetCode, parseRuntimeApiUrl } from '@lovrabet/dsparser';
|
|
466
|
+
|
|
467
|
+
// 验证 AppCode 格式
|
|
468
|
+
isValidAppCode('app-46bfd917'); // true
|
|
469
|
+
isValidAppCode('invalid'); // false
|
|
470
|
+
|
|
471
|
+
// 验证 DatasetCode 格式
|
|
472
|
+
isValidDatasetCode('862aa545533a43dab77583e0205afa27'); // true
|
|
473
|
+
|
|
474
|
+
// 解析运行时 API URL
|
|
475
|
+
const parsed = parseRuntimeApiUrl('https://api.lovrabet.com/api/app-46bfd917/862aa545533a43dab77583e0205afa27/getList');
|
|
476
|
+
// 结果: { baseUrl, appCode, datasetCode, operation }
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### 核心类详解
|
|
480
|
+
|
|
481
|
+
完整的核心类文档请参考:
|
|
482
|
+
|
|
483
|
+
- [核心类架构](./docs/核心类架构文档.md)
|
|
484
|
+
- [使用指南](./docs/使用指南-数据集类.md)
|
|
485
|
+
- [DrivenDataDetailPlus 使用指南](./docs/PLUS_USAGE_GUIDE.md)
|
|
486
|
+
|
|
487
|
+
### 示例代码
|
|
488
|
+
|
|
489
|
+
- [基础示例](./examples/basic-usage.ts)
|
|
490
|
+
- [Plus 功能演示](./examples/plus-demo.ts)
|
|
491
|
+
- [真实场景](./examples/real-world-usage.ts)
|
|
492
|
+
|
|
493
|
+
---
|
|
494
|
+
|
|
495
|
+
## 🤝 诚邀共建
|
|
496
|
+
|
|
497
|
+
### 为什么需要你的参与?
|
|
498
|
+
|
|
499
|
+
1. **你最懂业务场景** - 你遇到的痛点,就是我们要解决的问题
|
|
500
|
+
2. **多样化的技术视角** - 前端、后端、CLI、SDK、AI Agent 各有特色
|
|
501
|
+
3. **共同受益** - 你贡献的功能,你的项目可以直接使用
|
|
502
|
+
|
|
503
|
+
### 如何参与?
|
|
504
|
+
|
|
505
|
+
#### 🌟 Level 1: 使用反馈
|
|
506
|
+
- 试用工具,反馈问题
|
|
507
|
+
- 提供功能建议
|
|
508
|
+
|
|
509
|
+
#### ⭐⭐ Level 2: 文档完善
|
|
510
|
+
- 补充示例
|
|
511
|
+
- 改进文档
|
|
512
|
+
|
|
513
|
+
#### ⭐⭐⭐ Level 3: 代码贡献
|
|
514
|
+
- 修复 Bug
|
|
515
|
+
- 新增功能
|
|
516
|
+
|
|
517
|
+
#### ⭐⭐⭐⭐ Level 4: 架构设计
|
|
518
|
+
- 设计评审
|
|
519
|
+
- 技术决策
|
|
520
|
+
|
|
521
|
+
### 当前急需支持
|
|
522
|
+
|
|
523
|
+
#### 🔥 高优先级
|
|
524
|
+
|
|
525
|
+
1. **更多数据源支持**
|
|
526
|
+
- [ ] API 接口数据源
|
|
527
|
+
- [ ] 文件数据源
|
|
528
|
+
- [ ] 第三方数据源
|
|
529
|
+
|
|
530
|
+
2. **多语言 SDK 代码生成**
|
|
531
|
+
- [x] TypeScript(已支持)
|
|
532
|
+
- [ ] JavaScript
|
|
533
|
+
- [ ] Python
|
|
534
|
+
- [ ] Java
|
|
535
|
+
|
|
536
|
+
3. **API 文档多格式导出**
|
|
537
|
+
- [x] Markdown(已支持)
|
|
538
|
+
- [ ] OpenAPI (Swagger)
|
|
539
|
+
- [ ] Postman Collection
|
|
540
|
+
- [ ] HTML
|
|
541
|
+
|
|
542
|
+
4. **AI Agent 专项功能** 🆕
|
|
543
|
+
- [ ] LLM Context 生成器(为 GPT/Claude 生成结构化上下文)
|
|
544
|
+
- [ ] Vibe Coding Schema 导出(为智能补全提供 Schema)
|
|
545
|
+
- [ ] 自然语言查询(通过自然语言查询数据集信息)
|
|
546
|
+
- [ ] 代码生成 Prompt 模板
|
|
547
|
+
|
|
548
|
+
### 贡献指南
|
|
549
|
+
|
|
550
|
+
详见 [贡献指南 CONTRIBUTING.md](./CONTRIBUTING.md)
|
|
551
|
+
|
|
552
|
+
---
|
|
553
|
+
|
|
554
|
+
## 📖 资源链接
|
|
555
|
+
|
|
556
|
+
### 文档
|
|
557
|
+
- [快速开始](./README.md)
|
|
558
|
+
- [核心类架构](./docs/核心类架构文档.md)
|
|
559
|
+
- [使用指南](./docs/使用指南-数据集类.md)
|
|
560
|
+
- [DrivenDataDetailPlus 使用指南](./docs/PLUS_USAGE_GUIDE.md)
|
|
561
|
+
- [项目介绍(面向团队)](./PROJECT_INTRO.md)
|
|
562
|
+
|
|
563
|
+
### 示例代码
|
|
564
|
+
- [基础示例](./examples/basic-usage.ts)
|
|
565
|
+
- [Plus 功能演示](./examples/plus-demo.ts)
|
|
566
|
+
- [真实场景](./examples/real-world-usage.ts)
|
|
567
|
+
|
|
568
|
+
### 相关项目
|
|
569
|
+
- [lovrabet-cli](https://codeup.aliyun.com/yuntoo/lovrabet-cli) - CLI 工具
|
|
570
|
+
- [lovrabet-node-sdk](https://codeup.aliyun.com/yuntoo/lovrabet-node-sdk) - Node SDK
|
|
571
|
+
- [yuntoo-web-app](https://codeup.aliyun.com/yuntoo/yuntoo-web-app) - 前端应用
|
|
572
|
+
|
|
573
|
+
---
|
|
574
|
+
|
|
575
|
+
## 📝 更新日志
|
|
576
|
+
|
|
577
|
+
### v1.0.0-beta.8 (最新)
|
|
578
|
+
- ✨ 新增 `DrivenDataDetailPlus` 扩展类
|
|
579
|
+
- ✨ 新增 `getName()` 和 `getSource()` 方法,统一 API 风格
|
|
580
|
+
- ✨ 新增 API 文档自动生成功能(Markdown)
|
|
581
|
+
- ✨ 新增 CRUD 完整性检查
|
|
582
|
+
- ✨ 新增智能示例值生成器(支持 String、Integer、Long、Boolean 类型)
|
|
583
|
+
- ✨ 优化 `getSelectOptions` 参数定义自动补全
|
|
584
|
+
- 📝 重构 `generateOperationMarkdown` 使用模板字符串
|
|
585
|
+
- 📚 新增完整的 API Agent 使用场景文档
|
|
586
|
+
- 🐛 修复未使用导入的警告
|
|
587
|
+
- 🎯 测试覆盖率提升至 90%+
|
|
588
|
+
|
|
589
|
+
### v1.0.0-beta.7
|
|
590
|
+
- 🎯 将 ApiEnvironment、ApiMode 和 ApiOperation 改为枚举类型
|
|
591
|
+
- 📝 枚举提供更好的类型安全和 IDE 自动补全支持
|
|
592
|
+
- 🔄 所有 API 函数同时支持枚举和字符串,保持向后兼容性
|
|
593
|
+
- ✅ 新增枚举相关测试
|
|
594
|
+
- 📚 新增完整的使用示例
|
|
595
|
+
|
|
596
|
+
### v1.0.0-beta.6
|
|
597
|
+
- 🎯 新增 buildApiUrl 和 buildApiRequestBody 函数
|
|
598
|
+
- 🔄 支持 WebAPI 和 OpenAPI 两种模式
|
|
599
|
+
- 📦 移除 CLI 功能,dsparser 现在是纯粹的 npm 包
|
|
600
|
+
- ✅ 新增 API 模式相关测试
|
|
601
|
+
|
|
602
|
+
---
|
|
603
|
+
|
|
604
|
+
## 📄 许可证
|
|
605
|
+
|
|
606
|
+
详见 [LICENSE](./LICENSE) 文件。
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
## 🎉 结语
|
|
611
|
+
|
|
612
|
+
**@lovrabet/dsparser 不仅仅是一个工具库,它是我们团队工程化能力的体现,是我们对 "Don't Repeat Yourself" 理念的践行,更是 AI 时代数据集处理的基础设施。**
|
|
613
|
+
|
|
614
|
+
每一次你在项目中复制粘贴数据集处理代码的时候,就是 dsparser 能够发挥价值的时刻。每一个你遇到的痛点,都是 dsparser 可以改进的方向。
|
|
615
|
+
|
|
616
|
+
**让我们一起,把重复的工作交给工具,把数据集的知识交给 AI,把时间花在真正有创造力的事情上!** 🚀
|
|
617
|
+
|
|
618
|
+
---
|
|
619
|
+
|
|
620
|
+
**期待你的加入!** 💪
|
|
621
|
+
|
|
622
|
+
_最后更新: 2024-10-20_
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @lovrabet/dsparser - 数据集解析器
|
|
3
|
+
* 用于统一处理和分析数据集相关的逻辑
|
|
4
|
+
*/
|
|
5
|
+
export { toCamelCase, toPascalCase, toSnakeCase, toKebabCase, normalizeFieldName, getTableName, generateTableNameFromCode, isVirtualTableName, generateDatasetsConfig, detectTableNameConflicts, createDatasetNameMap, groupByTableName, adaptDrivenDataDetail, adaptDrivenDataDetails, extractDatasetFromResponse, extractDatasetsFromListResponse, isDrivenDataDetail, smartAdapt, } from './src/utils/index.js';
|
|
6
|
+
export type { DbtableConfig, DatasetInfo, DatasetConfig, DatasetsConfig, DatasetListItem, DatasetGeneratorOptions, DrivenDataDetail as DrivenDataDetailType, GetDrivenDataResponse, GetListResponse, } from './src/utils/index.js';
|
|
7
|
+
export { DatasetItem, DrivenDataDetail, DatasetList, DatasetGroup, DatasetGroupMap, } from './src/core/index.js';
|
|
8
|
+
export type { DatasetItemData, DrivenDataDetailData, FieldDefinition, FieldExtendConfig, } from './src/core/index.js';
|
|
9
|
+
export { DrivenDataDetailPlus } from './src/plus/index.js';
|
|
10
|
+
export type { ApiDocOptions } from './src/plus/index.js';
|
|
11
|
+
export { DatasetOperationType, OPERATION_TYPE_DISPLAY_NAME, API_BLACKLIST, parseFieldExtend, isPrimaryKeyField, isSystemField, isRequiredField, isAutoIncrementField, isCreateTimeField, isModifyTimeField, DB_TYPE_DISPLAY_MAP, getDbTypeDisplay, formatDbType, parseOperationType, shouldIncludeField, getFieldsForOperation, isApiBlacklisted, filterApiOperations, generateExampleValue, generateExampleFromSchema, parseRequestBody, parseResponseBody, generateRequestExample, OperationParser, } from './src/utils/plus/index.js';
|
|
12
|
+
export type { GenerateExampleOptions, OperationDefinition, OperationAnalysis, } from './src/utils/plus/index.js';
|
|
13
|
+
export declare const VERSION = "1.0.0-beta.8";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAEL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,kBAAkB,EAElB,YAAY,EACZ,yBAAyB,EACzB,kBAAkB,EAElB,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAEhB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,+BAA+B,EAC/B,kBAAkB,EAClB,UAAU,GACX,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,aAAa,EACb,WAAW,EACX,aAAa,EACb,cAAc,EACd,eAAe,EACf,uBAAuB,EACvB,gBAAgB,IAAI,oBAAoB,EACxC,qBAAqB,EACrB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EAEL,oBAAoB,EACpB,2BAA2B,EAC3B,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EAEnB,oBAAoB,EACpB,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EAEtB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EACV,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAGnC,eAAO,MAAM,OAAO,iBAAiB,CAAC"}
|