schema-dsl 1.0.0 → 1.0.4

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.
Files changed (45) hide show
  1. package/CHANGELOG.md +263 -529
  2. package/README.md +814 -896
  3. package/STATUS.md +135 -2
  4. package/docs/INDEX.md +1 -2
  5. package/docs/api-reference.md +1 -292
  6. package/docs/custom-extensions-guide.md +411 -0
  7. package/docs/enum.md +475 -0
  8. package/docs/i18n.md +394 -0
  9. package/docs/performance-benchmark-report.md +179 -0
  10. package/docs/plugin-system.md +8 -8
  11. package/docs/typescript-guide.md +554 -0
  12. package/docs/validate-async.md +1 -1
  13. package/docs/validation-rules-v1.0.2.md +1601 -0
  14. package/examples/README.md +81 -0
  15. package/examples/enum.examples.js +324 -0
  16. package/examples/express-integration.js +54 -54
  17. package/examples/i18n-full-demo.js +15 -24
  18. package/examples/schema-utils-chaining.examples.js +2 -2
  19. package/examples/slug.examples.js +179 -0
  20. package/index.d.ts +246 -17
  21. package/index.js +30 -34
  22. package/lib/config/constants.js +1 -1
  23. package/lib/config/patterns/common.js +47 -0
  24. package/lib/config/patterns/index.js +2 -1
  25. package/lib/core/DslBuilder.js +500 -8
  26. package/lib/core/StringExtensions.js +31 -0
  27. package/lib/core/Validator.js +42 -15
  28. package/lib/errors/ValidationError.js +3 -3
  29. package/lib/locales/en-US.js +79 -19
  30. package/lib/locales/es-ES.js +60 -19
  31. package/lib/locales/fr-FR.js +84 -43
  32. package/lib/locales/ja-JP.js +83 -42
  33. package/lib/locales/zh-CN.js +32 -0
  34. package/lib/validators/CustomKeywords.js +405 -0
  35. package/package.json +1 -1
  36. package/.github/CODE_OF_CONDUCT.md +0 -45
  37. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -57
  38. package/.github/ISSUE_TEMPLATE/config.yml +0 -11
  39. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -45
  40. package/.github/ISSUE_TEMPLATE/question.md +0 -31
  41. package/.github/PULL_REQUEST_TEMPLATE.md +0 -70
  42. package/.github/SECURITY.md +0 -184
  43. package/.github/workflows/ci.yml +0 -33
  44. package/plugins/custom-format.js +0 -101
  45. package/plugins/custom-validator.js +0 -200
package/docs/i18n.md ADDED
@@ -0,0 +1,394 @@
1
+ # 多语言配置指南
2
+
3
+ **版本**: v1.0.1
4
+ **最后更新**: 2025-12-31
5
+
6
+ ---
7
+
8
+ ## 📖 概述
9
+
10
+ schema-dsl 支持完整的多语言功能,允许你自定义字段标签和错误消息的翻译。
11
+
12
+ ---
13
+
14
+ ## 🚀 快速开始
15
+
16
+ ### 基础配置
17
+
18
+ ```javascript
19
+ const { dsl, validate } = require('schema-dsl');
20
+ const path = require('path');
21
+
22
+ // 方式 1: 从目录加载(推荐)
23
+ dsl.config({
24
+ i18n: path.join(__dirname, 'i18n/dsl')
25
+ });
26
+
27
+ // 方式 2: 直接传入对象
28
+ dsl.config({
29
+ i18n: {
30
+ 'zh-CN': require('./i18n/dsl/zh-CN'),
31
+ 'en-US': require('./i18n/dsl/en-US')
32
+ }
33
+ });
34
+ ```
35
+
36
+ ### 目录结构
37
+
38
+ ```
39
+ project/
40
+ ├── i18n/
41
+ │ └── dsl/ # schema-dsl 语言包目录
42
+ │ ├── zh-CN.js # 中文语言包
43
+ │ ├── en-US.js # 英文语言包
44
+ │ └── ja-JP.js # 日语语言包(可选)
45
+ ```
46
+
47
+ ---
48
+
49
+ ## 📝 语言包格式
50
+
51
+ ### 完整示例 (`i18n/dsl/zh-CN.js`)
52
+
53
+ ```javascript
54
+ module.exports = {
55
+ // ========== 字段标签 ==========
56
+ 'field.username': '用户名',
57
+ 'field.email': '邮箱地址',
58
+ 'field.password': '密码',
59
+ 'field.age': '年龄',
60
+
61
+ // ========== 覆盖默认错误消息 ==========
62
+ 'required': '{{#label}}是必填项',
63
+ 'string.minLength': '{{#label}}长度不能少于{{#limit}}个字符',
64
+ 'string.maxLength': '{{#label}}长度不能超过{{#limit}}个字符',
65
+ 'string.enum': '{{#label}}必须是以下值之一: {{#valids}}',
66
+ 'number.base': '{{#label}}必须是数字类型',
67
+ 'number.min': '{{#label}}不能小于{{#limit}}',
68
+ 'number.max': '{{#label}}不能大于{{#limit}}',
69
+ 'boolean.base': '{{#label}}必须是布尔类型',
70
+ 'enum': '{{#label}}必须是以下值之一: {{#allowed}}',
71
+
72
+ // ========== 自定义错误消息 ==========
73
+ 'custom.invalidEmail': '邮箱格式不正确,请重新输入',
74
+ 'custom.emailTaken': '该邮箱已被注册',
75
+ 'custom.passwordWeak': '密码强度不够'
76
+ };
77
+ ```
78
+
79
+ ---
80
+
81
+ ## 🎯 使用方法
82
+
83
+ ### 1. 字段标签翻译
84
+
85
+ ```javascript
86
+ const schema = dsl({
87
+ username: dsl('string:3-32!').label('field.username'),
88
+ email: dsl('email!').label('field.email')
89
+ });
90
+
91
+ const result = validate(schema, { username: 'ab' });
92
+ // 错误消息: "用户名长度不能少于3个字符"
93
+ ```
94
+
95
+ ### 2. 覆盖默认错误消息
96
+
97
+ ```javascript
98
+ // 语言包
99
+ module.exports = {
100
+ 'required': '{{#label}}必须填写'
101
+ };
102
+
103
+ // Schema
104
+ const schema = dsl({ username: 'string!' });
105
+
106
+ validate(schema, {});
107
+ // 错误消息: "username必须填写"
108
+ ```
109
+
110
+ ### 3. 自定义错误消息
111
+
112
+ ```javascript
113
+ const schema = dsl({
114
+ status: dsl('active|inactive').messages({
115
+ 'enum': '状态必须是 active 或 inactive'
116
+ })
117
+ });
118
+ ```
119
+
120
+ ### 4. 动态语言切换
121
+
122
+ ```javascript
123
+ dsl.config({
124
+ i18n: {
125
+ 'zh-CN': { 'required': '{{#label}}是必填项' },
126
+ 'en-US': { 'required': '{{#label}} is required' }
127
+ }
128
+ });
129
+
130
+ // 默认语言(zh-CN)
131
+ validate(schema, data);
132
+
133
+ // 切换到英文
134
+ validate(schema, data, { locale: 'en-US' });
135
+ ```
136
+
137
+ ---
138
+
139
+ ## 📋 内置错误消息键
140
+
141
+ ### 通用错误
142
+
143
+ | 错误键 | 说明 | 默认消息(zh-CN) |
144
+ |--------|------|-------------------|
145
+ | `required` | 必填字段缺失 | {{#label}}是必填项 |
146
+ | `enum` | 枚举值不在范围 | {{#label}}必须是以下值之一: {{#allowed}} |
147
+ | `pattern` | 格式不正确 | {{#label}}格式不正确 |
148
+
149
+ ### String 错误
150
+
151
+ | 错误键 | 说明 |
152
+ |--------|------|
153
+ | `string.minLength` | 最小长度 |
154
+ | `string.maxLength` | 最大长度 |
155
+ | `string.pattern` | 正则不匹配 |
156
+ | `string.enum` | 字符串枚举 |
157
+
158
+ ### Number 错误
159
+
160
+ | 错误键 | 说明 |
161
+ |--------|------|
162
+ | `number.base` | 类型不是数字 |
163
+ | `number.min` | 小于最小值 |
164
+ | `number.max` | 大于最大值 |
165
+ | `number.integer` | 不是整数 |
166
+
167
+ ### Boolean 错误
168
+
169
+ | 错误键 | 说明 |
170
+ |--------|------|
171
+ | `boolean.base` | 类型不是布尔值 |
172
+
173
+ ### Array 错误
174
+
175
+ | 错误键 | 说明 |
176
+ |--------|------|
177
+ | `array.base` | 类型不是数组 |
178
+ | `array.min` | 元素数量不足 |
179
+ | `array.max` | 元素数量过多 |
180
+ | `array.unique` | 包含重复元素 |
181
+
182
+ ### Format 错误
183
+
184
+ | 错误键 | 说明 |
185
+ |--------|------|
186
+ | `format.email` | 邮箱格式错误 |
187
+ | `format.url` | URL格式错误 |
188
+ | `format.uuid` | UUID格式错误 |
189
+ | `format.date` | 日期格式错误 |
190
+ | `format.binary` | Base64编码错误 |
191
+
192
+ ### Pattern 错误
193
+
194
+ | 错误键 | 说明 |
195
+ |--------|------|
196
+ | `pattern.phone` | 手机号格式错误 |
197
+ | `pattern.idCard` | 身份证格式错误 |
198
+ | `pattern.objectId` | ObjectId格式错误 |
199
+
200
+ 完整列表请参考: `lib/locales/zh-CN.js`
201
+
202
+ ---
203
+
204
+ ## 🔧 高级用法
205
+
206
+ ### 嵌套字段标签
207
+
208
+ ```javascript
209
+ // 语言包
210
+ module.exports = {
211
+ 'field.address.city': '城市',
212
+ 'field.address.street': '街道'
213
+ };
214
+
215
+ // Schema
216
+ const schema = dsl({
217
+ address: {
218
+ city: dsl('string!').label('field.address.city'),
219
+ street: dsl('string!').label('field.address.street')
220
+ }
221
+ });
222
+ ```
223
+
224
+ ### 错误消息优先级
225
+
226
+ 1. **字段级自定义消息** - `.messages()` 方法
227
+ 2. **Schema级标签** - `.label()` 方法
228
+ 3. **语言包自定义消息** - `i18n` 配置
229
+ 4. **默认错误消息** - 内置语言包
230
+
231
+ ```javascript
232
+ // 优先级示例
233
+ dsl.config({
234
+ i18n: {
235
+ 'zh-CN': {
236
+ 'required': '全局必填消息' // 优先级 3
237
+ }
238
+ }
239
+ });
240
+
241
+ const schema = dsl({
242
+ username: dsl('string!')
243
+ .label('用户名') // 优先级 2
244
+ .messages({ 'required': '必须填' }) // 优先级 1(最高)
245
+ });
246
+ ```
247
+
248
+ ### 多语言最佳实践
249
+
250
+ #### 1. 目录结构
251
+
252
+ ```
253
+ project/
254
+ ├── i18n/
255
+ │ └── dsl/
256
+ │ ├── zh-CN.js # 中文
257
+ │ ├── en-US.js # 英文
258
+ │ ├── ja-JP.js # 日语
259
+ │ └── index.js # 导出工具
260
+ ```
261
+
262
+ #### 2. 导出工具 (`i18n/dsl/index.js`)
263
+
264
+ ```javascript
265
+ const path = require('path');
266
+
267
+ module.exports = {
268
+ 'zh-CN': require('./zh-CN'),
269
+ 'en-US': require('./en-US'),
270
+ 'ja-JP': require('./ja-JP')
271
+ };
272
+
273
+ // 使用
274
+ dsl.config({
275
+ i18n: require('./i18n/dsl')
276
+ });
277
+ ```
278
+
279
+ #### 3. 消息复用
280
+
281
+ ```javascript
282
+ // i18n/dsl/common.js
283
+ module.exports = {
284
+ required: '{{#label}}是必填项',
285
+ minLength: '{{#label}}长度不能少于{{#limit}}个字符'
286
+ };
287
+
288
+ // i18n/dsl/zh-CN.js
289
+ const common = require('./common');
290
+
291
+ module.exports = {
292
+ ...common,
293
+ 'field.username': '用户名',
294
+ 'field.email': '邮箱'
295
+ };
296
+ ```
297
+
298
+ ---
299
+
300
+ ## 📊 完整示例
301
+
302
+ ### 用户管理系统
303
+
304
+ ```javascript
305
+ const { dsl, validate } = require('schema-dsl');
306
+ const path = require('path');
307
+
308
+ // 配置多语言
309
+ dsl.config({
310
+ i18n: path.join(__dirname, 'i18n/dsl')
311
+ });
312
+
313
+ // 定义 Schema
314
+ const userSchema = dsl({
315
+ username: dsl('string:3-32!').label('field.username'),
316
+ email: dsl('email!').label('field.email'),
317
+ password: dsl('string:8-32!').label('field.password'),
318
+ age: dsl('number:18-120').label('field.age'),
319
+ role: dsl('admin|user|guest!').label('field.role')
320
+ });
321
+
322
+ // 验证(中文)
323
+ let result = validate(userSchema, {
324
+ username: 'ab',
325
+ email: 'invalid',
326
+ role: 'admin'
327
+ });
328
+
329
+ console.log(result.errors);
330
+ // [
331
+ // { path: 'username', message: '用户名长度不能少于3个字符' },
332
+ // { path: 'email', message: '邮箱地址必须是有效的邮箱地址' },
333
+ // { path: 'password', message: '密码是必填项' }
334
+ // ]
335
+
336
+ // 验证(英文)
337
+ result = validate(userSchema, {
338
+ username: 'ab'
339
+ }, { locale: 'en-US' });
340
+
341
+ console.log(result.errors[0].message);
342
+ // "username must be at least 3 characters"
343
+ ```
344
+
345
+ ---
346
+
347
+ ## 🐛 常见问题
348
+
349
+ ### 1. 语言包不生效?
350
+
351
+ **检查清单**:
352
+ - ✅ 配置键是否正确(`i18n` 而非 `locales`)
353
+ - ✅ 目录路径是否正确
354
+ - ✅ 文件名是否为语言代码(如 `zh-CN.js`)
355
+ - ✅ 是否使用了 `module.exports`
356
+
357
+ ### 2. 错误消息仍然是英文?
358
+
359
+ **原因**: 默认语言是英文,需要设置语言
360
+
361
+ ```javascript
362
+ // 方法 1: 全局设置
363
+ const Locale = require('schema-dsl/lib/core/Locale');
364
+ Locale.setLocale('zh-CN');
365
+
366
+ // 方法 2: 验证时指定
367
+ validate(schema, data, { locale: 'zh-CN' });
368
+ ```
369
+
370
+ ### 3. 自定义消息不显示?
371
+
372
+ **检查优先级**:
373
+ - `.messages()` > `.label()` > 语言包 > 默认
374
+
375
+ ```javascript
376
+ // 错误:label 会被 messages 覆盖
377
+ dsl('string!')
378
+ .label('用户名')
379
+ .messages({ 'required': '必填' }) // 这个生效
380
+ ```
381
+
382
+ ---
383
+
384
+ ## 📚 相关文档
385
+
386
+ - [快速开始](../README.md)
387
+ - [API 参考](./api.md)
388
+ - [完整示例](../examples/i18n-full-demo.js)
389
+
390
+ ---
391
+
392
+ **文档生成时间**: 2025-12-31
393
+ **版本**: v1.0.1
394
+
@@ -0,0 +1,179 @@
1
+ # schema-dsl 性能测试报告
2
+
3
+ ## 📋 测试概述
4
+
5
+ **测试日期**: 2024-01-XX
6
+ **测试版本**: v1.0.3
7
+ **测试环境**: Node.js (运行环境)
8
+ **对比库**: Joi, Yup, Zod, Ajv
9
+
10
+ ## 🎯 测试目标
11
+
12
+ 验证 schema-dsl 在真实场景下的性能表现,并与主流验证库进行公平对比。
13
+
14
+ ## 🔬 测试方法
15
+
16
+ ### 公平性保证
17
+
18
+ 1. **预编译Schema**: 所有库的 schema 均在测试前预编译,避免编译时间影响测试结果
19
+ 2. **JIT预热**: 每个测试前执行 10% 的预热迭代,确保 V8 引擎充分优化
20
+ 3. **多轮测试**: 每个测试执行 10 轮,移除最高/最低值,取平均值
21
+ 4. **高精度计时**: 使用 `process.hrtime.bigint()` 实现纳秒级精度
22
+ 5. **无异常处理干扰**: 移除性能关键路径中的 try-catch,避免 JIT 反优化
23
+ 6. **统一测试数据**: 所有库使用完全相同的测试数据结构
24
+
25
+ ### 测试配置
26
+
27
+ ```javascript
28
+ // 简单验证场景
29
+ iterations: 10000
30
+ rounds: 10
31
+ warmup: 1000 (10%)
32
+
33
+ // 复杂验证场景
34
+ iterations: 5000
35
+ rounds: 10
36
+ warmup: 500 (10%)
37
+ ```
38
+
39
+ ### 测试场景
40
+
41
+ #### 场景1: 简单对象验证
42
+ ```javascript
43
+ {
44
+ username: 'john_doe',
45
+ email: 'john@example.com',
46
+ age: 25
47
+ }
48
+ ```
49
+
50
+ #### 场景2: 复杂嵌套验证
51
+ ```javascript
52
+ {
53
+ name: 'John Doe',
54
+ email: 'john@example.com',
55
+ profile: {
56
+ age: 30,
57
+ bio: 'Software developer',
58
+ tags: ['javascript', 'nodejs']
59
+ }
60
+ }
61
+ ```
62
+
63
+ ## 📊 测试结果
64
+
65
+ ### 10轮完整测试汇总
66
+
67
+ #### 简单验证性能
68
+ | 验证库 | 平均吞吐量 | 最低吞吐量 | 最高吞吐量 | 标准差 | 稳定性 |
69
+ |--------|-----------|-----------|-----------|--------|-------|
70
+ | **schema-dsl** | **4,130,506/s** | 3,694,035/s | 4,563,536/s | 266,785 | ⭐⭐⭐⭐ |
71
+ | Joi | 466,616/s | 448,739/s | 477,551/s | 7,941 | ⭐⭐⭐⭐⭐ |
72
+ | Yup | 318,888/s | 309,023/s | 324,891/s | 4,268 | ⭐⭐⭐⭐⭐ |
73
+ | Zod | 9,743,926/s | 8,247,990/s | 10,450,049/s | 646,068 | ⭐⭐⭐⭐ |
74
+ | Ajv | 21,456,535/s | 17,460,641/s | 25,036,512/s | 2,602,772 | ⭐⭐⭐ |
75
+
76
+ #### 复杂验证性能
77
+ | 验证库 | 平均吞吐量 | 最低吞吐量 | 最高吞吐量 | 标准差 | 稳定性 |
78
+ |--------|-----------|-----------|-----------|--------|-------|
79
+ | **schema-dsl** | **3,159,137/s** | 2,910,530/s | 3,345,526/s | 145,171 | ⭐⭐⭐⭐⭐ |
80
+ | Joi | 242,500/s | 233,608/s | 251,069/s | 4,410 | ⭐⭐⭐⭐⭐ |
81
+ | Yup | 70,313/s | 65,425/s | 72,158/s | 2,016 | ⭐⭐⭐⭐⭐ |
82
+ | Zod | 2,487,493/s | 2,313,726/s | 2,762,660/s | 130,431 | ⭐⭐⭐⭐⭐ |
83
+ | Ajv | 9,021,336/s | 8,012,179/s | 10,069,141/s | 632,381 | ⭐⭐⭐⭐ |
84
+
85
+ ### 性能对比分析
86
+
87
+ #### schema-dsl vs 其他库
88
+
89
+ **简单验证场景**:
90
+ - **vs Joi**: 快 **8.85倍** (413万/s vs 47万/s)
91
+ - **vs Yup**: 快 **12.95倍** (413万/s vs 32万/s)
92
+ - **vs Zod**: 慢 0.42倍 (413万/s vs 974万/s)
93
+ - **vs Ajv**: 慢 0.19倍 (413万/s vs 2146万/s)
94
+
95
+ **复杂验证场景**:
96
+ - **vs Joi**: 快 **13.03倍** (316万/s vs 24万/s)
97
+ - **vs Yup**: 快 **44.93倍** (316万/s vs 7万/s)
98
+ - **vs Zod**: 快 **1.27倍** (316万/s vs 249万/s) ⭐
99
+ - **vs Ajv**: 慢 0.35倍 (316万/s vs 902万/s)
100
+
101
+ ## 🎯 核心发现
102
+
103
+ ### 1. 简洁性与性能的平衡
104
+
105
+ schema-dsl 在保持最简洁 DSL 语法的同时:
106
+ - 比 Joi 快 **9-13倍**
107
+ - 比 Yup 快 **13-45倍**
108
+ - **复杂场景超越 Zod 1.3倍**
109
+
110
+ ### 2. 复杂场景优势明显
111
+
112
+ 随着验证规则复杂度增加,schema-dsl 的优势更加明显:
113
+ - 简单场景: 优于 Joi/Yup,但不及 Zod/Ajv
114
+ - **复杂场景: 超越 Zod,仅次于 Ajv**
115
+
116
+ ### 3. 性能稳定性
117
+
118
+ 标准差分析显示:
119
+ - **schema-dsl**: 中等稳定性(简单: 266k, 复杂: 145k)
120
+ - **Joi/Yup/Zod**: 非常稳定(标准差 < 20k)
121
+ - **Ajv**: 波动较大(标准差 > 600k)
122
+
123
+ ## 💡 选型建议
124
+
125
+ ### 选择 schema-dsl 的理由
126
+
127
+ ✅ **追求简洁性**: `'string:3-32!'` vs `Joi.string().min(3).max(32).required()`
128
+ ✅ **复杂验证场景**: 嵌套对象、数组验证性能超越 Zod
129
+ ✅ **平衡性能与可读性**: 比 Joi/Yup 快得多,语法比 Ajv 简单得多
130
+ ✅ **多语言支持**: 内置 5 种语言错误消息自动翻译
131
+
132
+ ### 其他库的优势
133
+
134
+ - **Ajv**: 极致性能要求(但需要学习 JSON Schema)
135
+ - **Zod**: TypeScript 类型推导(但复杂场景性能不如 schema-dsl)
136
+ - **Joi**: 生态成熟、稳定可靠(但性能和简洁性较差)
137
+ - **Yup**: 与 Formik 集成好(但性能最慢)
138
+
139
+ ## 🔧 测试改进历史
140
+
141
+ ### 之前的测试问题
142
+
143
+ 1. ❌ Yup 测试中使用 try-catch 导致 JIT 反优化
144
+ 2. ❌ 缺少 JIT 预热阶段,冷启动影响结果
145
+ 3. ❌ 单次运行,受垃圾回收等因素影响
146
+ 4. ❌ 使用 Date.now() 计时,精度不足(±1ms)
147
+
148
+ ### 改进后的测试
149
+
150
+ 1. ✅ 移除所有性能关键路径的 try-catch
151
+ 2. ✅ 添加 10% 预热迭代确保 JIT 优化
152
+ 3. ✅ 10 轮测试取平均值,移除异常值
153
+ 4. ✅ 使用 process.hrtime.bigint() 纳秒级计时
154
+
155
+ ### 性能数据修正
156
+
157
+ | 版本 | 简单验证 | 复杂验证 | 变化 |
158
+ |------|---------|---------|------|
159
+ | 旧测试 | 50万/s | 63万/s | 基准 |
160
+ | 新测试 | **413万/s** | **316万/s** | ⬆️ 8.3倍 / 5.0倍 |
161
+
162
+ **注**: 旧测试方法的不公平性导致低估了 schema-dsl 的真实性能。
163
+
164
+ ## 📝 结论
165
+
166
+ schema-dsl 成功实现了 **"简洁性"** 与 **"性能"** 的平衡:
167
+
168
+ 1. **DSL 语法最简洁**: `'string:3-32!'` 一行搞定
169
+ 2. **复杂场景性能优异**: 超越 Zod,仅次于 Ajv
170
+ 3. **生产级性能**: 100万+ QPS 足以应对绝大多数应用
171
+ 4. **多语言支持**: 自动错误消息翻译
172
+
173
+ 对于追求 **代码可读性** 和 **合理性能** 的开发者来说,schema-dsl 是理想选择!
174
+
175
+ ---
176
+
177
+ **测试代码**: [test/performance/library-comparison.test.js](../test/performance/library-comparison.test.js)
178
+ **运行脚本**: [test/performance/run-benchmark.js](../test/performance/run-benchmark.js)
179
+ **复现方法**: `node test/performance/run-benchmark.js`
@@ -60,7 +60,7 @@ const myPlugin = {
60
60
  version: '1.0.0',
61
61
  description: '我的自定义插件',
62
62
 
63
- install(schema-dsl, options, context) {
63
+ install(schemaDsl, options, context) {
64
64
  console.log('插件安装成功!');
65
65
  }
66
66
  };
@@ -71,9 +71,9 @@ pluginManager.register(myPlugin);
71
71
  ### 3. 安装插件
72
72
 
73
73
  ```javascript
74
- const schema-dsl = require('schema-dsl');
74
+ const schemaDsl = require('schema-dsl');
75
75
 
76
- pluginManager.install(schema-dsl, 'my-plugin');
76
+ pluginManager.install(schemaDsl, 'my-plugin');
77
77
  ```
78
78
 
79
79
  ### 4. 使用插件
@@ -92,14 +92,14 @@ pluginManager.install(schema-dsl, 'my-plugin');
92
92
  module.exports = {
93
93
  // ========== 必填 ==========
94
94
  name: 'plugin-name', // 插件名称(唯一)
95
- install: function(schema-dsl, options, context) {
95
+ install: function(schemaDsl, options, context) {
96
96
  // 安装逻辑
97
97
  },
98
98
 
99
99
  // ========== 可选 ==========
100
100
  version: '1.0.0', // 插件版本
101
101
  description: '插件描述', // 插件描述
102
- uninstall: function(schema-dsl, context) {
102
+ uninstall: function(schemaDsl, context) {
103
103
  // 卸载逻辑
104
104
  },
105
105
  hooks: { // 生命周期钩子
@@ -119,8 +119,8 @@ module.exports = {
119
119
  name: 'custom-validator',
120
120
  version: '1.0.0',
121
121
 
122
- install(schema-dsl, options, context) {
123
- const { Validator } = schema-dsl;
122
+ install(schemaDsl, options, context) {
123
+ const { Validator } = schemaDsl;
124
124
 
125
125
  // 添加自定义关键字
126
126
  Validator.prototype.addKeyword('unique', {
@@ -142,7 +142,7 @@ module.exports = {
142
142
  name: 'custom-format',
143
143
  version: '1.0.0',
144
144
 
145
- install(schema-dsl, options, context) {
145
+ install(schemaDsl, options, context) {
146
146
  const validator = schemaDsl.getDefaultValidator();
147
147
  const ajv = validator.getAjv();
148
148