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/STATUS.md CHANGED
@@ -1,19 +1,152 @@
1
1
  # schema-dsl 项目状态
2
2
 
3
- > **最后更新**: 2025-12-29
4
- > **当前版本**: v1.0.0
3
+ > **最后更新**: 2025-12-31
4
+ > **当前版本**: v1.0.4
5
5
  > **项目状态**: ✅ 全部完成,测试100%通过
6
6
 
7
7
  ---
8
8
 
9
9
  ## 📋 目录
10
10
 
11
+ - [v1.0.4](#v104) - 2025-12-31 ✅ 已完成
12
+ - [v1.0.3](#v103) - 2025-12-31 ⚠️ 破坏性变更
13
+ - [v1.0.2](#v102) - 2025-12-31 ✅ 已完成
14
+ - [v1.0.1](#v101) - 2025-12-31 ✅ 已完成
11
15
  - [v1.0.0](#v100) - 2025-12-29 ✅ 已完成
12
16
 
13
17
  ---
14
18
 
15
19
  ## 版本发布计划
16
20
 
21
+ ### v1.0.4
22
+
23
+ **发布日期**: 2025-12-31
24
+ **状态**: ✅ 已完成
25
+ **类型**: ✨ 功能增强(TypeScript 完整支持)
26
+ **进度**: 100%完成 | 新增: TypeScript 类型定义、使用指南 | 文档: 1500+ 行
27
+
28
+ | 需求标题 | 状态 | 优先级 | 详细 |
29
+ |---------|------|--------|------|
30
+ | 完善 index.d.ts | ✅ 完成 | P0 | validateAsync、ValidationError 类型 |
31
+ | String 扩展 TS 说明 | ✅ 完成 | P0 | 添加详细使用说明和对比 |
32
+ | TypeScript 使用指南 | ✅ 完成 | P0 | 1000+ 行完整文档 |
33
+ | README 更新 | ✅ 完成 | P0 | 添加 TypeScript 章节 |
34
+ | 类型错误修复 | ✅ 完成 | P0 | 修复 dsl.config i18n 类型 |
35
+ | 发版文档更新 | ✅ 完成 | P0 | CHANGELOG、STATUS、package.json |
36
+
37
+ **实现状态统计**:
38
+ - ✅ 完成: 6个
39
+ - 🔄 进行中: 0个
40
+ - ⏳ 待完成: 0个
41
+
42
+ **核心变更**:
43
+ - ✅ **新增**: validateAsync 函数完整类型定义
44
+ - ✅ **新增**: ValidationError 类完整类型(含所有方法)
45
+ - ✅ **优化**: String 扩展添加 TypeScript 使用说明
46
+ - ✅ **新增**: TypeScript 使用指南文档(1000+ 行)
47
+ - ✅ **修复**: dsl.config 的 i18n 参数类型错误
48
+ - ✅ **文档**: README 添加 TypeScript 快速开始章节
49
+
50
+ **用户价值**:
51
+ - 🎯 TypeScript 用户获得完整的类型安全和 IDE 提示
52
+ - 🎯 详细的文档指导如何在 TypeScript 中正确使用
53
+ - 🎯 JavaScript 用户体验不变,100% 向后兼容
54
+ - 🎯 降低学习成本,提高开发效率
55
+
56
+ ---
57
+
58
+ ### v1.0.3
59
+
60
+ **发布日期**: 2025-12-31
61
+ **状态**: ✅ 已完成
62
+ **类型**: ⚠️ 破坏性变更
63
+ **进度**: 100%完成 | 修复: String单值语法 | 测试: 3个新增测试
64
+
65
+ | 需求标题 | 状态 | 优先级 | 详细 |
66
+ |---------|------|--------|------|
67
+ | String单值语法修复 | ✅ 完成 | P0 | 'string:N' 改为精确长度 |
68
+ | 核心代码修改 | ✅ 完成 | P0 | DslBuilder.js |
69
+ | 测试用例更新 | ✅ 完成 | P0 | 2个修改 + 1个新增 |
70
+ | 文档更新 | ✅ 完成 | P0 | README + CHANGELOG |
71
+ | 迁移指南 | ✅ 完成 | P0 | CHANGELOG 破坏性变更说明 |
72
+ | 新增链式方法 | ✅ 完成 | P1 | dateGreater, dateLess |
73
+
74
+ **实现状态统计**:
75
+ - ✅ 完成: 6个
76
+ - 🔄 进行中: 0个
77
+ - ⏳ 待完成: 0个
78
+
79
+ **核心变更**:
80
+ - ⚠️ **破坏性**: `'string:N'` → exactLength: N(之前是 maxLength: N)
81
+ - ✅ **新增**: `'string:-N'` → maxLength: N(明确语法)
82
+ - ✅ **保持**: Number 单值仍为 maximum(无变更)
83
+ - ✅ **新增**: dateGreater() 和 dateLess() 链式方法
84
+
85
+ ---
86
+
87
+ ### v1.0.2
88
+
89
+ **发布日期**: 2025-12-31
90
+ **状态**: ✅ 已完成
91
+ **进度**: 100%完成 | 新增: 15个验证器 | 测试: 75个新增测试
92
+
93
+ | 需求标题 | 状态 | 优先级 | 详细 |
94
+ |---------|------|--------|------|
95
+ | String验证器扩展 | ✅ 完成 | P1 | 6个新增验证器 |
96
+ | Number验证器扩展 | ✅ 完成 | P1 | 2个新增验证器 |
97
+ | Object验证器扩展 | ✅ 完成 | P1 | 2个新增验证器 |
98
+ | Array验证器扩展 | ✅ 完成 | P1 | 2个新增验证器 |
99
+ | Date验证器扩展 | ✅ 完成 | P1 | 3个新增验证器 |
100
+ | 多语言支持 | ✅ 完成 | P0 | 中英文19个消息 |
101
+ | 文档补充 | ✅ 完成 | P0 | 15个验证器文档 |
102
+ | 示例代码 | ⏳ 待完成 | P1 | 演示新增功能 |
103
+ | 单元测试 | ✅ 完成 | P0 | 75个测试用例 |
104
+
105
+ **实现状态统计**:
106
+ - ✅ 完成: 8个
107
+ - 🔄 进行中: 0个
108
+ - ⏳ 待完成: 1个
109
+
110
+ **核心功能**:
111
+ - ✨ **String验证器**: exactLength, alphanum, trim, lowercase, uppercase, jsonString
112
+ - 🔢 **Number验证器**: precision, port
113
+ - 📦 **Object验证器**: requiredAll, strictSchema
114
+ - 📋 **Array验证器**: noSparse, includesRequired
115
+ - 📅 **Date验证器**: dateFormat, dateGreater, dateLess
116
+ - 🌍 **多语言支持**: 中英文各19个新增消息
117
+ - 📝 **完整文档**: validation-rules-v1.0.2.md(1200行)
118
+ - 🧪 **测试覆盖**: 75个测试用例,100%通过
119
+
120
+ ### v1.0.1
121
+
122
+ **发布日期**: 2025-12-31
123
+ **状态**: ✅ 已完成
124
+ **进度**: 100%完成 | 新增: 枚举功能 | 测试: 30个新增测试
125
+
126
+ | 需求标题 | 状态 | 优先级 | 详细 |
127
+ |---------|------|--------|------|
128
+ | 枚举语法支持 | ✅ 完成 | P0 | value1\|value2 简写语法 |
129
+ | 枚举类型自动识别 | ✅ 完成 | P0 | 字符串/布尔值/数字自动识别 |
130
+ | 枚举显式类型 | ✅ 完成 | P1 | enum:type:values 语法 |
131
+ | 布尔值枚举 | ✅ 完成 | P0 | true\|false 自动识别 |
132
+ | 数字枚举 | ✅ 完成 | P0 | 1\|2\|3 自动识别 |
133
+ | 整数枚举 | ✅ 完成 | P1 | enum:integer:values |
134
+ | 枚举必填标记 | ✅ 完成 | P0 | value1\|value2! |
135
+ | 枚举错误消息 | ✅ 完成 | P0 | 统一使用 'enum' 键 |
136
+ | 枚举文档 | ✅ 完成 | P0 | docs/enum.md 完整文档 |
137
+ | 枚举示例 | ✅ 完成 | P1 | examples/enum.examples.js |
138
+ | 枚举测试 | ✅ 完成 | P0 | 30个测试用例 |
139
+
140
+ **实现状态统计**:
141
+ - ✅ 完成: 11个
142
+ - 🔄 进行中: 0个
143
+ - ⏳ 待完成: 0个
144
+
145
+ **核心功能**:
146
+ - ✨ **枚举支持**: 'active|inactive', '1|2|3', 'true|false' 自动识别类型
147
+ - 🎯 **简洁语法**: 统一使用 'enum' 键定义错误消息
148
+ - 🔧 **灵活配置**: 支持显式指定类型 enum:type:values
149
+
17
150
  ### v1.0.0
18
151
 
19
152
  **发布日期**: 2025-12-29
package/docs/INDEX.md CHANGED
@@ -190,7 +190,7 @@
190
190
 
191
191
  | 文件 | 说明 |
192
192
  |------|------|
193
- | [joi-style.js](../examples/joi-style.js) | Joi 风格完整示例 |
193
+ | [simple-example.js](../examples/simple-example.js) | 简单示例 |
194
194
  | [dsl-style.js](../examples/dsl-style.js) | DSL 风格完整示例 |
195
195
  | [string-extensions.js](../examples/string-extensions.js) | String 扩展示例 |
196
196
  | [password-reset/](../examples/password-reset/) | 密码重置表单示例 |
@@ -217,7 +217,6 @@
217
217
  | 文档 | 说明 |
218
218
  |------|------|
219
219
  | [CONTRIBUTING.md](../CONTRIBUTING.md) | 贡献指南 |
220
- | [DOCUMENTATION-ISSUES.md](../DOCUMENTATION-ISSUES.md) | 文档审核报告 |
221
220
 
222
221
  ---
223
222
 
@@ -337,298 +337,7 @@ dsl.if('isVip', 'number:0-50', 'number:0-10')
337
337
 
338
338
  ---
339
339
 
340
- ## DslBuilder
341
-
342
- ### 描述
343
-
344
- Schema 构建器类,支持链式调用添加验证规则。
345
-
346
- ### 构造函数
347
-
348
- ```javascript
349
- new DslBuilder(dslString: string)
350
- ```
351
-
352
- **参数**:
353
- - `dslString` (**string**) - DSL字符串,如 `'string:3-32!'`
354
-
355
- ### 方法
356
-
357
- #### `.pattern(regex, message?)`
358
-
359
- 添加正则表达式验证。
360
-
361
- **参数**:
362
- - `regex` (**RegExp** | **string**) - 正则表达式
363
- - `message` (**string**, 可选) - 自定义错误消息
364
-
365
- **返回**: **DslBuilder**
366
-
367
- **示例**:
368
- ```javascript
369
- dsl('string:3-32!')
370
- .pattern(/^[a-zA-Z0-9_]+$/, '只能包含字母、数字和下划线')
371
- ```
372
-
373
- ---
374
-
375
- #### `.label(text)`
376
-
377
- 设置字段标签(用于错误消息)。
378
-
379
- **参数**:
380
- - `text` (**string**) - 标签文本
381
-
382
- **返回**: **DslBuilder**
383
-
384
- **示例**:
385
- ```javascript
386
- dsl('email!').label('邮箱地址')
387
- ```
388
-
389
- ---
390
-
391
- #### `.messages(messages)`
392
-
393
- 自定义错误消息。
394
-
395
- **参数**:
396
- - `messages` (**Object**) - 错误消息对象
397
- - 键:错误代码(如 `'string.min'`)
398
- - 值:错误消息模板
399
-
400
- **返回**: **DslBuilder**
401
-
402
- **示例**:
403
- ```javascript
404
- dsl('string:3-32!')
405
- .messages({
406
- 'string.min': '至少{{#limit}}个字符',
407
- 'string.max': '最多{{#limit}}个字符'
408
- })
409
- ```
410
-
411
- ---
412
-
413
- #### `.description(text)`
414
-
415
- 设置字段描述。
416
-
417
- **参数**:
418
- - `text` (**string**) - 描述文本
419
-
420
- **返回**: **DslBuilder**
421
-
422
- **示例**:
423
- ```javascript
424
- dsl('url').description('个人主页链接')
425
- ```
426
-
427
- ---
428
-
429
- #### `.custom(validator)`
430
-
431
- 添加自定义验证器。
432
-
433
- **参数**:
434
- - `validator` (**Function**) - 验证函数
435
- - 签名:`(value) => boolean | Promise<boolean> | { error, message }`
436
- - 返回 `true` 表示通过
437
- - 返回 `false` 或错误对象表示失败
438
-
439
- **返回**: **DslBuilder**
440
-
441
- **示例**:
442
- ```javascript
443
- dsl('string:3-32!')
444
- .custom(async (value) => {
445
- const exists = await checkUsernameExists(value);
446
- if (exists) {
447
- return { error: 'username.exists', message: '用户名已存在' };
448
- }
449
- return true;
450
- })
451
- ```
452
-
453
- ---
454
-
455
- #### `.default(value)`
456
-
457
- 设置默认值。
458
-
459
- **参数**:
460
- - `value` (**any**) - 默认值
461
-
462
- **返回**: **DslBuilder**
463
-
464
- **示例**:
465
- ```javascript
466
- dsl('string').default('guest')
467
- ```
468
-
469
- ---
470
-
471
- #### `.username(preset?)`
472
-
473
- 用户名验证(自动设置长度和正则)。
474
-
475
- **参数**:
476
- - `preset` (**string** | **Object**, 可选) - 预设配置
477
- - 字符串:`'short'` | `'medium'` | `'long'` | `'5-20'`
478
- - 对象:`{ minLength, maxLength, allowUnderscore, allowNumber }`
479
- - 默认值:`'medium'` (3-32位)
480
-
481
- **返回**: **DslBuilder**
482
-
483
- **示例**:
484
- ```javascript
485
- // 默认 medium (3-32位)
486
- dsl('string!').username()
487
-
488
- // 自定义范围
489
- dsl('string!').username('5-20')
490
-
491
- // 使用预设
492
- dsl('string!').username('short') // 3-16位
493
- ```
494
-
495
- ---
496
-
497
- #### `.password(strength?)`
498
-
499
- 密码强度验证(自动设置长度和正则)。
500
-
501
- **参数**:
502
- - `strength` (**string**, 可选) - 强度级别
503
- - `'weak'` - 最少6位
504
- - `'medium'` - 8位,字母+数字(默认)
505
- - `'strong'` - 8位,大小写+数字
506
- - `'veryStrong'` - 10位,大小写+数字+特殊字符
507
-
508
- **返回**: **DslBuilder**
509
-
510
- **示例**:
511
- ```javascript
512
- dsl('string!').password('strong')
513
- ```
514
-
515
- ---
516
-
517
- #### `.phone(country?)`
518
-
519
- 手机号验证(自动设置长度和正则)。
520
-
521
- **参数**:
522
- - `country` (**string**, 可选) - 国家代码
523
- - `'cn'` - 中国(默认)
524
- - `'us'` - 美国
525
- - `'uk'` - 英国
526
- - `'hk'` - 香港
527
- - `'tw'` - 台湾
528
- - `'international'` - 国际格式
529
-
530
- **返回**: **DslBuilder**
531
-
532
- **注意**: 自动将类型纠正为 `string`(即使写成 `number` 也会自动修正)
533
-
534
- **示例**:
535
- ```javascript
536
- // 推荐写法
537
- dsl('string!').phone('cn')
538
-
539
- // 自动纠正:number → string
540
- dsl('number!').phone('cn') // 自动纠正为 string
541
- ```
542
-
543
- ---
544
-
545
- #### `.toSchema()`
546
-
547
- 转换为 JSON Schema 对象。
548
-
549
- **返回**: **Object** - JSON Schema对象
550
-
551
- **示例**:
552
- ```javascript
553
- const schema = dsl('email!').label('邮箱').toSchema();
554
- // { type: 'string', format: 'email', _label: '邮箱', _required: true }
555
- ```
556
-
557
- ---
558
-
559
- #### `.validate(data, context?)`
560
-
561
- 验证数据(便捷方法)。
562
-
563
- **参数**:
564
- - `data` (**any**) - 待验证数据
565
- - `context` (**Object**, 可选) - 验证上下文
566
-
567
- **返回**: **Promise<Object>** - 验证结果
568
- - `valid` (**boolean**) - 是否通过
569
- - `errors` (**Array**, 可选) - 错误列表
570
- - `data` (**any**, 可选) - 验证通过的数据
571
-
572
- **示例**:
573
- ```javascript
574
- const result = await dsl('email!').validate('user@example.com');
575
- console.log(result.valid); // true
576
- ```
577
-
578
- ---
579
-
580
- ### 静态方法
581
-
582
- #### `dsl.match(field, map)```
583
-
584
- 创建条件验证规则(类似 switch-case)。
585
-
586
- **参数**:
587
- - `field` (**string**) - 依赖的字段名
588
- - `map` (**Object**) - 值与Schema的映射
589
- - `[value: string]`: 对应的Schema
590
- - `_default` (**optional**): 默认Schema
591
-
592
- **返回**: **Object** - 内部Match结构
593
-
594
- **示例**:
595
- ```javascript
596
- dsl.match('type', {
597
- email: 'email!',
598
- phone: 'string:11!',
599
- _default: 'string'
600
- })
601
- ```
602
-
603
- #### `dsl.if(condition, thenSchema, elseSchema)`
604
-
605
- 创建简单的条件验证规则。
606
-
607
- **参数**:
608
- - `condition` (**string**) - 条件字段名
609
- - `thenSchema` (**string|Object**) - 满足条件时的Schema
610
- - `elseSchema` (**string|Object**, 可选) - 不满足条件时的Schema
611
-
612
- **返回**: **Object** - 内部If结构
613
-
614
- **示例**:
615
- ```javascript
616
- dsl.if('isVip', 'number:0-50', 'number:0-10')
617
- ```
618
-
619
- ---
620
-
621
- ## DslBuilder 类
622
-
623
- ### 描述
624
-
625
- Schema 构建器类,支持链式调用添加验证规则。
626
-
627
- ### 构造函数
628
-
629
- ```javascript
630
- new DslBuilder(dslString: string)
631
- ```
340
+ ## Validator
632
341
 
633
342
  **参数**:
634
343
  - `dslString` (**string**) - DSL字符串,如 `'string:3-32!'`