schema-dsl 1.1.1 → 1.1.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 CHANGED
@@ -11,12 +11,40 @@
11
11
  [![Build Status](https://github.com/vextjs/schema-dsl/workflows/CI/badge.svg)](https://github.com/vextjs/schema-dsl/actions)
12
12
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
13
13
 
14
- [快速开始](#-快速开始) · [在线体验](https://runkit.com/npm/schema-dsl) · [完整文档](./docs/INDEX.md) · [示例代码](./examples)
14
+ [快速开始](#-快速开始) · [在线体验](https://runkit.com/npm/schema-dsl) · [完整文档](./docs/INDEX.md) · [示例代码](./examples) · [性能测试](./docs/performance-benchmark-report.md)
15
15
 
16
16
  </div>
17
17
 
18
18
  ---
19
19
 
20
+ ## 🗺️ 文档导航
21
+
22
+ **新手入门**:
23
+ - [快速开始](#-快速开始) - 5 分钟上手
24
+ - [功能总览](#-功能总览) - 了解所有功能
25
+ - [DSL 语法速查](#-dsl-语法速查) - 语法参考
26
+
27
+ **核心功能**:
28
+ - [基础验证](#1-基础验证javascript) - 表单验证
29
+ - [批量验证](#批量验证) - 性能优化
30
+ - [嵌套对象](#嵌套对象验证) - 复杂结构
31
+ - [条件验证](#条件验证---一行代码搞定) - 动态规则
32
+ - [多语言](#4-多语言支持) - 国际化
33
+
34
+ **框架集成**:
35
+ - [Express](#2-express-集成---自动错误处理)
36
+ - [Koa](#koa-集成)
37
+ - [Fastify](#fastify-集成)
38
+
39
+ **高级功能**:
40
+ - [数据库导出](#3-数据库-schema-导出) - 独家功能
41
+ - [插件系统](#6-插件系统) - 扩展功能
42
+ - [TypeScript](#15-typescript-用法-) - 类型支持
43
+
44
+ **完整文档**: [docs/INDEX.md](./docs/INDEX.md) - 40+ 篇详细文档
45
+
46
+ ---
47
+
20
48
  ## ✨ 为什么选择 schema-dsl?
21
49
 
22
50
  ### 🎯 极简 DSL 语法
@@ -227,7 +255,53 @@ const registerSchema = dsl({
227
255
 
228
256
  ---
229
257
 
230
- ## 📦 安装
258
+ ## 功能总览
259
+
260
+ > 让 AI 和开发者快速了解所有功能
261
+
262
+ ### 核心功能速查表
263
+
264
+ | 分类 | 功能 | 代码示例 | 文档链接 |
265
+ |------|------|---------|----------|
266
+ | **基础验证** | DSL 语法 | `'string:3-32!'` | [DSL 语法](./docs/dsl-syntax.md) |
267
+ | | 链式调用 | `'string!'.label('用户名')` | [String 扩展](./docs/string-extensions.md) |
268
+ | | TypeScript | `dsl('string!')` | [TS 指南](./docs/typescript-guide.md) |
269
+ | **高级验证** | 条件验证 | `dsl.if()/dsl.match()` | [条件 API](./docs/conditional-api.md) |
270
+ | | 嵌套对象 | `{ user: { name: 'string!' } }` | [验证指南](./docs/validation-guide.md) |
271
+ | | 数组验证 | `'array:1-10<string>'` | [类型参考](./docs/type-reference.md) |
272
+ | | 联合类型 | `'types:string\|number'` | [联合类型](./docs/union-types.md) |
273
+ | | 正则验证 | `.pattern(/^[A-Z]+$/)` | [自定义扩展](./docs/custom-extensions-guide.md) |
274
+ | | 自定义验证 | `.custom((v) => ...)` | [自定义扩展](./docs/custom-extensions-guide.md) |
275
+ | **Schema 工具** | 复用字段 | `SchemaUtils.pick()` | [SchemaUtils](./docs/schema-utils.md) |
276
+ | | 批量验证 | `validateBatch(schema, array)` | [批量验证](#批量验证) |
277
+ | | 字段库 | `createLibrary()` | [SchemaUtils](./docs/schema-utils.md) |
278
+ | **框架集成** | Express | `validateAsync + try/catch` | [Express 示例](./examples/express-integration.js) |
279
+ | | Koa | `validateAsync + ctx.throw` | [中间件示例](./examples/middleware-usage.js) |
280
+ | | Fastify | `preValidation hook` | [中间件示例](./examples/middleware-usage.js) |
281
+ | **多语言** | 配置语言 | `dsl.config({ i18n })` | [i18n 指南](./docs/i18n-user-guide.md) |
282
+ | | 错误抛出 | `I18nError.throw()` | [I18nError 示例](./examples/i18n-error.examples.js) |
283
+ | **数据库** | MongoDB | `MongoDBExporter.export()` | [MongoDB 导出](./docs/mongodb-exporter.md) |
284
+ | | MySQL | `MySQLExporter.export()` | [MySQL 导出](./docs/mysql-exporter.md) |
285
+ | | PostgreSQL | `PostgreSQLExporter.export()` | [PostgreSQL 导出](./docs/postgresql-exporter.md) |
286
+ | **插件** | 自定义格式 | `pluginManager.register()` | [插件系统](./docs/plugin-system.md) |
287
+ | **性能** | 缓存配置 | `config({ cache })` | [缓存管理](./docs/cache-manager.md) |
288
+
289
+ ### 常见使用场景
290
+
291
+ | 场景 | 代码示例 | 完整示例 |
292
+ |------|---------|----------|
293
+ | **API 参数验证** | [Express 集成](#2-express-集成---自动错误处理) | [完整代码](./examples/express-integration.js) |
294
+ | **用户注册表单** | [基础验证](#1-基础验证javascript) | [完整代码](./examples/user-registration/) |
295
+ | **批量数据处理** | [批量验证](#批量验证) | [完整代码](./examples/simple-example.js) |
296
+ | **多语言应用** | [多语言支持](#4-多语言支持) | [完整代码](./examples/i18n-full-demo.js) |
297
+ | **数据库建表** | [数据库导出](#3-数据库-schema-导出) | [完整代码](./examples/export-demo.js) |
298
+ | **复杂嵌套结构** | [嵌套对象](#嵌套对象验证) | [验证指南](./docs/validation-guide.md) |
299
+ | **正则格式验证** | [正则验证](#正则验证) | [自定义扩展](./docs/custom-extensions-guide.md) |
300
+ | **业务逻辑验证** | [自定义验证器](#自定义验证器) | [自定义扩展](./docs/custom-extensions-guide.md) |
301
+
302
+ ---
303
+
304
+ ## �📦 安装
231
305
 
232
306
  ```bash
233
307
  npm install schema-dsl
@@ -557,7 +631,463 @@ const r3 = ageValidator.check({ age: 20 }); // 快速判断
557
631
 
558
632
  ---
559
633
 
560
- ## 📖 DSL 语法速查
634
+ ## 进阶功能
635
+
636
+ ### 批量验证
637
+
638
+ **场景**: 验证 1000 条用户数据,性能提升 50 倍
639
+
640
+ ```javascript
641
+ const { dsl, SchemaUtils, Validator } = require('schema-dsl');
642
+
643
+ const userSchema = dsl({
644
+ username: 'string:3-32!',
645
+ email: 'email!',
646
+ age: 'number:18-120'
647
+ });
648
+
649
+ // 批量数据
650
+ const users = [
651
+ { username: 'user1', email: 'user1@example.com', age: 25 },
652
+ { username: 'u2', email: 'invalid', age: 15 }, // 两个错误
653
+ { username: 'user3', email: 'user3@example.com', age: 30 }
654
+ ];
655
+
656
+ // 批量验证
657
+ const validator = new Validator();
658
+ const result = SchemaUtils.validateBatch(userSchema, users, validator);
659
+
660
+ console.log(result.summary);
661
+ /*
662
+ {
663
+ total: 3,
664
+ valid: 2,
665
+ invalid: 1,
666
+ duration: 5 // 毫秒
667
+ }
668
+ */
669
+
670
+ console.log(result.errors);
671
+ /*
672
+ [
673
+ { index: 1, errors: [
674
+ { path: 'username', message: '...' },
675
+ { path: 'age', message: '...' }
676
+ ]}
677
+ ]
678
+ */
679
+
680
+ // 只获取有效数据
681
+ const validUsers = result.results
682
+ .filter(r => r.valid)
683
+ .map(r => r.data);
684
+ ```
685
+
686
+ 📖 **详细文档**: [SchemaUtils.validateBatch](./docs/schema-utils.md#validatebatch---批量验证)
687
+
688
+ ---
689
+
690
+ ### 嵌套对象验证
691
+
692
+ **场景**: 验证复杂的用户资料
693
+
694
+ ```javascript
695
+ const { dsl, validate } = require('schema-dsl');
696
+
697
+ const profileSchema = dsl({
698
+ user: {
699
+ basic: {
700
+ name: 'string:2-50!',
701
+ email: 'email!',
702
+ phone: 'string:11!'
703
+ },
704
+ address: {
705
+ country: 'string!',
706
+ city: 'string!',
707
+ street: 'string',
708
+ zipCode: 'string:6'
709
+ },
710
+ preferences: {
711
+ language: 'zh-CN|en-US|ja-JP',
712
+ timezone: 'string',
713
+ notifications: {
714
+ email: 'boolean',
715
+ sms: 'boolean',
716
+ push: 'boolean'
717
+ }
718
+ }
719
+ },
720
+ metadata: {
721
+ source: 'web|mobile|api',
722
+ createdAt: 'datetime!',
723
+ tags: 'array:0-10<string>'
724
+ }
725
+ });
726
+
727
+ const result = validate(profileSchema, {
728
+ user: {
729
+ basic: {
730
+ name: 'John Doe',
731
+ email: 'john@example.com',
732
+ phone: '13800138000'
733
+ },
734
+ address: {
735
+ country: 'China',
736
+ city: 'Beijing',
737
+ zipCode: '100000'
738
+ },
739
+ preferences: {
740
+ language: 'zh-CN',
741
+ timezone: 'Asia/Shanghai',
742
+ notifications: {
743
+ email: true,
744
+ sms: false,
745
+ push: true
746
+ }
747
+ }
748
+ },
749
+ metadata: {
750
+ source: 'web',
751
+ createdAt: new Date().toISOString(),
752
+ tags: ['vip', 'active']
753
+ }
754
+ });
755
+
756
+ console.log(result.valid); // true
757
+ ```
758
+
759
+ 📖 **详细文档**: [嵌套对象验证](./docs/validation-guide.md#嵌套对象验证)
760
+
761
+ ---
762
+
763
+ ### 数组高级验证
764
+
765
+ **场景**: 验证订单商品列表
766
+
767
+ ```javascript
768
+ const { dsl, validate } = require('schema-dsl');
769
+
770
+ // 方式 1: 简单数组
771
+ const schema1 = dsl({
772
+ tags: 'array:1-10<string>', // 1-10 个字符串
773
+ scores: 'array<number:0-100>' // 数字数组,每个 0-100
774
+ });
775
+
776
+ // 方式 2: 对象数组
777
+ const orderSchema = dsl({
778
+ orderId: 'string!',
779
+ items: 'array:1-100!', // 必填,1-100 个商品
780
+ // 注意:数组元素的验证需要单独定义
781
+ _itemSchema: { // 约定:用 _ 前缀标记辅助 schema
782
+ productId: 'string!',
783
+ name: 'string:1-100!',
784
+ quantity: 'integer:1-999!',
785
+ price: 'number:>0!'
786
+ }
787
+ });
788
+
789
+ // 验证订单
790
+ const order = {
791
+ orderId: 'ORD-12345',
792
+ items: [
793
+ { productId: 'P001', name: 'iPhone', quantity: 2, price: 5999.00 },
794
+ { productId: 'P002', name: 'AirPods', quantity: 1, price: 1299.00 }
795
+ ]
796
+ };
797
+
798
+ // 先验证订单结构
799
+ const result1 = validate(orderSchema, order);
800
+ if (!result1.valid) {
801
+ console.log('订单结构错误:', result1.errors);
802
+ }
803
+
804
+ // 再验证每个商品
805
+ const itemSchema = dsl(orderSchema._itemSchema);
806
+ for (const [index, item] of order.items.entries()) {
807
+ const result = validate(itemSchema, item);
808
+ if (!result.valid) {
809
+ console.log(`商品 ${index} 错误:`, result.errors);
810
+ }
811
+ }
812
+ ```
813
+
814
+ 📖 **详细文档**: [数组验证](./docs/validation-guide.md#数组验证)
815
+
816
+ ---
817
+
818
+ ### 正则验证
819
+
820
+ **场景**: 自定义格式验证
821
+
822
+ ```javascript
823
+ const { dsl, validate } = require('schema-dsl');
824
+
825
+ const schema = dsl({
826
+ // 车牌号
827
+ licensePlate: 'string!'
828
+ .pattern(/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$/)
829
+ .label('车牌号')
830
+ .messages({
831
+ pattern: '请输入有效的中国车牌号'
832
+ }),
833
+
834
+ // 身份证号(简化版)
835
+ idCard: 'string:18!'
836
+ .pattern(/^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$/)
837
+ .label('身份证号')
838
+ .messages({
839
+ pattern: '请输入有效的 18 位身份证号'
840
+ }),
841
+
842
+ // 自定义代码格式
843
+ inviteCode: 'string:8!'
844
+ .pattern(/^[A-Z]{3}\\d{5}$/)
845
+ .label('邀请码')
846
+ .messages({
847
+ pattern: '邀请码格式:3个大写字母 + 5个数字(如 ABC12345)'
848
+ })
849
+ });
850
+
851
+ const result = validate(schema, {
852
+ licensePlate: '京A12345',
853
+ idCard: '110101199003071234',
854
+ inviteCode: 'ABC12345'
855
+ });
856
+
857
+ console.log(result.valid); // true
858
+ ```
859
+
860
+ 📖 **详细文档**: [正则验证](./docs/validation-guide.md#正则验证) | [String 扩展](./docs/string-extensions.md)
861
+
862
+ ---
863
+
864
+ ### 自定义验证器
865
+
866
+ **场景**: 业务逻辑验证
867
+
868
+ ```javascript
869
+ const { dsl, validate, validateAsync } = require('schema-dsl');
870
+
871
+ // 同步自定义验证
872
+ const schema1 = dsl({
873
+ username: 'string:3-32!'
874
+ .custom((value) => {
875
+ // 不能以数字开头
876
+ if (/^\\d/.test(value)) {
877
+ return '用户名不能以数字开头';
878
+ }
879
+ // 禁用敏感词
880
+ const blocked = ['admin', 'root', 'system'];
881
+ if (blocked.includes(value.toLowerCase())) {
882
+ return '该用户名不可用';
883
+ }
884
+ })
885
+ .label('用户名')
886
+ });
887
+
888
+ // 异步自定义验证(检查唯一性)
889
+ const schema2 = dsl({
890
+ email: 'email!'
891
+ .custom(async (value) => {
892
+ const exists = await checkEmailExists(value);
893
+ if (exists) {
894
+ return '该邮箱已被注册';
895
+ }
896
+ })
897
+ .label('邮箱')
898
+ });
899
+
900
+ // 多字段联合验证
901
+ const schema3 = dsl({
902
+ password: 'string:8-32!',
903
+ confirmPassword: 'string:8-32!'
904
+ })
905
+ .custom((data) => {
906
+ if (data.password !== data.confirmPassword) {
907
+ return { confirmPassword: '两次密码不一致' };
908
+ }
909
+ });
910
+
911
+ // 使用
912
+ const result = validate(schema1, { username: 'admin' });
913
+ console.log(result.errors); // [{ path: 'username', message: '该用户名不可用' }]
914
+
915
+ // 模拟数据库查询
916
+ async function checkEmailExists(email) {
917
+ // 实际项目中查询数据库
918
+ return email === 'exists@example.com';
919
+ }
920
+ ```
921
+
922
+ 📖 **详细文档**: [自定义验证器](./docs/custom-extensions-guide.md) | [验证指南](./docs/validation-guide.md)
923
+
924
+ ---
925
+
926
+ ### 框架集成
927
+
928
+ #### Koa 集成
929
+
930
+ ```javascript
931
+ const Koa = require('koa');
932
+ const { dsl, validateAsync, ValidationError } = require('schema-dsl');
933
+
934
+ const app = new Koa();
935
+
936
+ const createUserSchema = dsl({
937
+ username: 'string:3-32!',
938
+ email: 'email!',
939
+ password: 'string:8-32!'
940
+ });
941
+
942
+ // 路由
943
+ app.use(async (ctx) => {
944
+ if (ctx.path === '/api/users' && ctx.method === 'POST') {
945
+ try {
946
+ // 验证请求体
947
+ const validData = await validateAsync(createUserSchema, ctx.request.body);
948
+
949
+ // 业务逻辑
950
+ const user = await createUser(validData);
951
+
952
+ ctx.body = { success: true, data: user };
953
+ } catch (error) {
954
+ if (error instanceof ValidationError) {
955
+ ctx.status = 400;
956
+ ctx.body = {
957
+ success: false,
958
+ message: 'Validation failed',
959
+ errors: error.errors
960
+ };
961
+ } else {
962
+ throw error;
963
+ }
964
+ }
965
+ }
966
+ });
967
+
968
+ app.listen(3000);
969
+
970
+ // 模拟用户创建函数
971
+ async function createUser(data) {
972
+ return { id: '123', ...data };
973
+ }
974
+ ```
975
+
976
+ #### Fastify 集成
977
+
978
+ ```javascript
979
+ const fastify = require('fastify')();
980
+ const { dsl, validateAsync, ValidationError } = require('schema-dsl');
981
+
982
+ const createUserSchema = dsl({
983
+ username: 'string:3-32!',
984
+ email: 'email!',
985
+ password: 'string:8-32!'
986
+ });
987
+
988
+ // 使用 preValidation hook
989
+ fastify.post('/api/users', {
990
+ preValidation: async (request, reply) => {
991
+ try {
992
+ request.body = await validateAsync(createUserSchema, request.body);
993
+ } catch (error) {
994
+ if (error instanceof ValidationError) {
995
+ reply.code(400).send({
996
+ success: false,
997
+ message: 'Validation failed',
998
+ errors: error.errors
999
+ });
1000
+ } else {
1001
+ throw error;
1002
+ }
1003
+ }
1004
+ }
1005
+ }, async (request, reply) => {
1006
+ // 验证通过,继续处理
1007
+ const user = await createUser(request.body);
1008
+ return { success: true, data: user };
1009
+ });
1010
+
1011
+ fastify.listen({ port: 3000 });
1012
+
1013
+ // 模拟用户创建函数
1014
+ async function createUser(data) {
1015
+ return { id: '123', ...data };
1016
+ }
1017
+ ```
1018
+
1019
+ 📖 **详细文档**: [中间件使用示例](./examples/middleware-usage.js) | [Express 集成](./examples/express-integration.js)
1020
+
1021
+ ---
1022
+
1023
+ ### 字段库复用
1024
+
1025
+ **场景**: 大型项目的字段管理
1026
+
1027
+ ```javascript
1028
+ // fields/common.js - 定义字段库
1029
+ const { dsl } = require('schema-dsl');
1030
+
1031
+ module.exports = {
1032
+ // 基础字段
1033
+ email: () => 'email!'.label('邮箱地址'),
1034
+ phone: (country = 'cn') => 'string:11!'.phoneNumber(country).label('手机号'),
1035
+ username: () => 'string:3-32!'.username().label('用户名'),
1036
+ password: (strength = 'medium') => 'string:8-32!'.password(strength).label('密码'),
1037
+
1038
+ // 组合字段
1039
+ userAuth: () => ({
1040
+ username: 'string:3-32!'.username().label('用户名'),
1041
+ password: 'string:8-32!'.password('strong').label('密码')
1042
+ }),
1043
+
1044
+ userProfile: () => ({
1045
+ nickname: 'string:2-20!'.label('昵称'),
1046
+ bio: 'string:-500',
1047
+ avatar: 'url',
1048
+ birthday: 'date'
1049
+ }),
1050
+
1051
+ address: () => ({
1052
+ country: 'string!',
1053
+ province: 'string!',
1054
+ city: 'string!',
1055
+ district: 'string',
1056
+ street: 'string',
1057
+ zipCode: 'string:6'
1058
+ })
1059
+ };
1060
+
1061
+ // schemas/user.js - 使用字段库
1062
+ const { dsl } = require('schema-dsl');
1063
+ const fields = require('../fields/common');
1064
+
1065
+ // 注册 Schema
1066
+ exports.registerSchema = dsl({
1067
+ ...fields.userAuth(), // 展开用户认证字段
1068
+ email: fields.email(),
1069
+ phone: fields.phone(),
1070
+ agree: 'boolean!'
1071
+ });
1072
+
1073
+ // 个人资料 Schema
1074
+ exports.profileSchema = dsl({
1075
+ ...fields.userProfile(), // 展开用户资料字段
1076
+ ...fields.address() // 展开地址字段
1077
+ });
1078
+
1079
+ // 登录 Schema
1080
+ exports.loginSchema = dsl({
1081
+ account: 'types:email|phone!', // 邮箱或手机号
1082
+ password: fields.password('strong')
1083
+ });
1084
+ ```
1085
+
1086
+ 📖 **详细文档**: [SchemaUtils 完整指南](./docs/schema-utils.md) | [字段库复用](./docs/schema-utils.md#字段库复用大型项目) | [最佳实践](./docs/best-practices.md)
1087
+
1088
+ ---
1089
+
1090
+ ## �📖 DSL 语法速查
561
1091
 
562
1092
  ### 基础类型
563
1093
 
@@ -575,6 +1105,21 @@ dsl({
575
1105
  price: 'number:0-9999.99', // 范围 0-9999.99
576
1106
  score: 'integer:0-100', // 整数 0-100
577
1107
 
1108
+ // 🆕 v1.1.2: 数字比较运算符
1109
+ minAge: 'number:>=18', // 大于等于 18
1110
+ maxScore: 'number:<=100', // 小于等于 100
1111
+ positiveNum: 'number:>0', // 大于 0(不包括0)
1112
+ temperature: 'number:<100', // 小于 100(不包括100)
1113
+ exactValue: 'number:=50', // 等于 50
1114
+ negativeOk: 'number:>-10', // 支持负数:大于 -10
1115
+ priceLimit: 'number:<=99.99', // 支持小数:小于等于 99.99
1116
+
1117
+ // 💡 比较运算符 vs 范围语法
1118
+ // 'number:18-120' → 18 <= x <= 120 (包括边界)
1119
+ // 'number:>=18' → x >= 18 (语义更清晰)
1120
+ // 'number:>0' → x > 0 (不包括0,范围语法无法表达)
1121
+ // 'number:<100' → x < 100 (不包括100,范围语法无法表达)
1122
+
578
1123
  // 布尔值
579
1124
  active: 'boolean!',
580
1125
 
@@ -1441,11 +1986,84 @@ npm run coverage
1441
1986
 
1442
1987
  ## 🔗 相关链接
1443
1988
 
1444
- - [npm 包](https://www.npmjs.com/package/schema-dsl)
1445
- - [GitHub 仓库](https://github.com/vextjs/schema-dsl)
1446
- - [问题反馈](https://github.com/vextjs/schema-dsl/issues)
1447
- - [更新日志](./CHANGELOG.md)
1448
- - [贡献指南](./CONTRIBUTING.md)
1989
+ ### 📦 快速入口
1990
+ - [npm ](https://www.npmjs.com/package/schema-dsl) - 安装和版本历史
1991
+ - [GitHub 仓库](https://github.com/vextjs/schema-dsl) - 源代码和 Star ⭐
1992
+ - [在线体验](https://runkit.com/npm/schema-dsl) - RunKit 演练场
1993
+ - [问题反馈](https://github.com/vextjs/schema-dsl/issues) - Bug 报告和功能请求
1994
+ - [讨论区](https://github.com/vextjs/schema-dsl/discussions) - 社区交流
1995
+
1996
+ ### 📖 核心文档
1997
+ - [完整文档索引](./docs/INDEX.md) - 40+ 篇文档导航
1998
+ - [快速开始](./docs/quick-start.md) - 5 分钟入门
1999
+ - [DSL 语法](./docs/dsl-syntax.md) - 语法完整指南(2815 行)
2000
+ - [API 参考](./docs/api-reference.md) - API 完整文档
2001
+ - [TypeScript 指南](./docs/typescript-guide.md) - TS 用户必读
2002
+ - [最佳实践](./docs/best-practices.md) - 避免常见坑
2003
+ - [常见问题](./docs/faq.md) - FAQ 合集
2004
+ - [故障排查](./docs/troubleshooting.md) - 问题诊断
2005
+
2006
+ ### 🎯 功能文档
2007
+ - [字符串扩展](./docs/string-extensions.md) - String 扩展方法
2008
+ - [SchemaUtils 工具](./docs/schema-utils.md) - Schema 复用工具
2009
+ - [条件验证 API](./docs/conditional-api.md) - dsl.if/dsl.match
2010
+ - [验证指南](./docs/validation-guide.md) - 高级验证技巧
2011
+ - [类型参考](./docs/type-reference.md) - 所有内置类型
2012
+ - [枚举类型](./docs/enum.md) - 枚举验证详解
2013
+ - [联合类型](./docs/union-types.md) - v1.1.0 新特性
2014
+ - [数字运算符](./docs/number-operators.md) - v1.1.2 新特性
2015
+ - [错误处理](./docs/error-handling.md) - 错误处理策略
2016
+
2017
+ ### 🌍 多语言支持
2018
+ - [多语言用户指南](./docs/i18n-user-guide.md) - 完整使用教程
2019
+ - [多语言配置详解](./docs/i18n.md) - 配置说明
2020
+ - [前端集成指南](./docs/frontend-i18n-guide.md) - 前端使用
2021
+ - [添加自定义语言](./docs/add-custom-locale.md) - 扩展新语言
2022
+ - [动态语言配置](./docs/dynamic-locale.md) - 动态切换
2023
+ - [Label vs Description](./docs/label-vs-description.md) - 最佳实践
2024
+
2025
+ ### 🗄️ 数据库导出
2026
+ - [导出指南](./docs/export-guide.md) - 完整导出教程
2027
+ - [MongoDB 导出器](./docs/mongodb-exporter.md) - MongoDB Schema 导出
2028
+ - [MySQL 导出器](./docs/mysql-exporter.md) - MySQL DDL 生成
2029
+ - [PostgreSQL 导出器](./docs/postgresql-exporter.md) - PostgreSQL DDL 生成
2030
+ - [Markdown 导出器](./docs/markdown-exporter.md) - API 文档生成
2031
+ - [⚠️ 导出限制说明](./docs/export-limitations.md) - **必读!了解哪些特性无法导出**
2032
+
2033
+ ### 🔌 插件和扩展
2034
+ - [插件系统](./docs/plugin-system.md) - 插件开发和使用
2035
+ - [插件类型注册](./docs/plugin-type-registration.md) - 自定义类型
2036
+ - [自定义扩展指南](./docs/custom-extensions-guide.md) - 添加自定义验证
2037
+
2038
+ ### 📊 性能和设计
2039
+ - [性能基准测试报告](./docs/performance-benchmark-report.md) - 性能对比数据
2040
+ - [设计理念](./docs/design-philosophy.md) - 架构和权衡
2041
+ - [缓存管理器](./docs/cache-manager.md) - 缓存配置和优化
2042
+
2043
+ ### 💻 示例代码
2044
+ - [examples/](./examples/) - 所有示例代码目录
2045
+ - [Express 集成](./examples/express-integration.js) - Express 完整示例
2046
+ - [中间件使用](./examples/middleware-usage.js) - Koa/Fastify 示例
2047
+ - [用户注册](./examples/user-registration/) - 完整注册流程
2048
+ - [密码重置](./examples/password-reset/) - 密码重置流程
2049
+ - [条件验证](./examples/conditional-example.js) - 条件验证示例
2050
+ - [dsl.match 示例](./examples/dsl-match-example.js) - match 用法
2051
+ - [多语言完整示例](./examples/i18n-full-demo.js) - i18n 完整演示
2052
+ - [I18nError 示例](./examples/i18n-error.examples.js) - 多语言错误
2053
+ - [数据库导出](./examples/export-demo.js) - 导出示例
2054
+ - [Markdown 导出](./examples/markdown-export.js) - 文档生成
2055
+ - [插件系统](./examples/plugin-system.examples.js) - 插件示例
2056
+ - [联合类型](./examples/union-type-example.js) - 联合类型示例
2057
+ - [Slug 验证](./examples/slug.examples.js) - URL slug 示例
2058
+ - [字符串扩展](./examples/string-extensions.js) - String 扩展示例
2059
+ - [批量操作](./examples/batch-operations.examples.js) - 批量验证
2060
+ - [简单示例](./examples/simple-example.js) - 快速上手
2061
+
2062
+ ### 📝 版本和贡献
2063
+ - [更新日志](./CHANGELOG.md) - 详细版本历史
2064
+ - [贡献指南](./CONTRIBUTING.md) - 如何参与贡献
2065
+ - [状态文档](./STATUS.md) - 项目状态和路线图
2066
+ - [安全策略](./SECURITY.md) - 安全问题报告
1449
2067
 
1450
2068
  ---
1451
2069