schema-dsl 1.1.1 → 1.1.2

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/CHANGELOG.md CHANGED
@@ -11,6 +11,7 @@
11
11
 
12
12
  | 版本 | 日期 | 变更摘要 | 详细 |
13
13
  |------------------|------|---------|------|
14
+ | [v1.1.2](#v112) | 2026-01-06 | 🎉 新功能:数字比较运算符 + Bug修复 | [查看详情](#v112) |
14
15
  | [v1.1.1](#v111) | 2026-01-06 | 🎉 新功能:ConditionalBuilder 独立消息支持 | [查看详情](#v111) |
15
16
  | [v1.1.0](#v110) | 2026-01-05 | 🎉 重大功能:跨类型联合验证 + 插件系统增强 | [查看详情](#v110) |
16
17
  | [v1.0.9](#v109) | 2026-01-04 | 🎉 重大改进:多语言支持完善 + TypeScript 类型完整 | [查看详情](#v109) |
@@ -26,6 +27,178 @@
26
27
 
27
28
  ---
28
29
 
30
+ ## [v1.1.2] - 2026-01-06
31
+
32
+ ### 🎉 新功能
33
+
34
+ #### 数字比较运算符 - 更直观的数值验证
35
+
36
+ **新增 5 种比较运算符,让数值验证更语义化**
37
+
38
+ 现在 `number` 和 `integer` 类型支持 5 种比较运算符:`>`, `>=`, `<`, `<=`, `=`
39
+
40
+ **基础用法**:
41
+
42
+ ```javascript
43
+ const { dsl, validate } = require('schema-dsl');
44
+
45
+ // ✅ 大于(不包括边界)
46
+ const schema1 = dsl({ value: 'number:>0' });
47
+ validate(schema1, { value: 1 }); // ✅ true
48
+ validate(schema1, { value: 0 }); // ❌ false (0不满足>0)
49
+
50
+ // ✅ 大于等于
51
+ const schema2 = dsl({ age: 'number:>=18' });
52
+ validate(schema2, { age: 18 }); // ✅ true (包括18)
53
+ validate(schema2, { age: 17 }); // ❌ false
54
+
55
+ // ✅ 小于(不包括边界)
56
+ const schema3 = dsl({ temp: 'number:<100' });
57
+ validate(schema3, { temp: 99.9 }); // ✅ true
58
+ validate(schema3, { temp: 100 }); // ❌ false (100不满足<100)
59
+
60
+ // ✅ 小于等于
61
+ const schema4 = dsl({ score: 'number:<=100' });
62
+ validate(schema4, { score: 100 }); // ✅ true (包括100)
63
+
64
+ // ✅ 等于
65
+ const schema5 = dsl({ level: 'number:=5' });
66
+ validate(schema5, { level: 5 }); // ✅ true
67
+ validate(schema5, { level: 4 }); // ❌ false
68
+ ```
69
+
70
+ **支持小数和负数**:
71
+
72
+ ```javascript
73
+ // 小数
74
+ dsl({ value: 'number:>0.5' }) // 大于0.5
75
+ dsl({ price: 'number:<=99.99' }) // 小于等于99.99
76
+
77
+ // 负数
78
+ dsl({ value: 'number:>-10' }) // 大于-10
79
+ dsl({ temp: 'number:<-5' }) // 小于-5
80
+
81
+ // 配合必填标记
82
+ dsl({ age: 'number:>=18!' }) // 必填且大于等于18
83
+ dsl({ price: 'number:>0!' }) // 必填且大于0
84
+ ```
85
+
86
+ **对比:比较运算符 vs 范围语法**:
87
+
88
+ | 需求 | 范围语法 | 比较运算符 | 推荐 |
89
+ |------|---------|-----------|------|
90
+ | x ≥ 18 | `number:18-` | `number:>=18` | **比较运算符**(更清晰) |
91
+ | x > 0(不包括0) | ❌ 无法表达 | `number:>0` | **比较运算符**(唯一方法) |
92
+ | x < 100(不包括100) | ❌ 无法表达 | `number:<100` | **比较运算符**(唯一方法) |
93
+ | x = 100 | `number:100`(实际≤100) | `number:=100` | **比较运算符**(精确匹配) |
94
+
95
+ **实际应用场景**:
96
+
97
+ ```javascript
98
+ // 场景1:用户注册 - 年龄限制
99
+ const schema = dsl({
100
+ username: 'string:3-32!',
101
+ email: 'email!',
102
+ age: 'number:>=18!', // 必须年满18岁
103
+ password: 'string:8-!'
104
+ });
105
+
106
+ // 场景2:电商系统 - 价格验证
107
+ const schema = dsl({
108
+ productName: 'string:1-100!',
109
+ price: 'number:>0!', // 价格必须大于0
110
+ discount: 'number:0-100' // 折扣 0-100
111
+ });
112
+
113
+ // 场景3:温度监控
114
+ const schema = dsl({
115
+ deviceId: 'string!',
116
+ temperature: 'number:>0', // 温度 > 0
117
+ humidity: 'number:<=100' // 湿度 ≤ 100
118
+ });
119
+ ```
120
+
121
+ **JSON Schema 映射**:
122
+
123
+ ```javascript
124
+ 'number:>0' → { exclusiveMinimum: 0 }
125
+ 'number:>=18' → { minimum: 18 }
126
+ 'number:<100' → { exclusiveMaximum: 100 }
127
+ 'number:<=100' → { maximum: 100 }
128
+ 'number:=100' → { enum: [100] }
129
+ ```
130
+
131
+ **特性**:
132
+ - ✅ 支持 5 种比较运算符
133
+ - ✅ 支持小数(如 `number:>0.5`)
134
+ - ✅ 支持负数(如 `number:>-10`)
135
+ - ✅ 支持必填标记(如 `number:>=18!`)
136
+ - ✅ 适用于 `number` 和 `integer` 类型
137
+ - ✅ 完全向后兼容原有范围语法
138
+ - ✅ 完整的 TypeScript 类型支持
139
+
140
+ **文档链接**:
141
+ - [数字比较运算符完整文档](./docs/number-operators.md)
142
+ - [README 语法速查](./README.md#-dsl-语法速查)
143
+
144
+ ---
145
+
146
+ ### 🐛 Bug 修复
147
+
148
+ #### 修复比较运算符被误解析为枚举的问题
149
+
150
+ **问题描述**:
151
+ 在 v1.1.1 及之前版本,使用 `number:>0` 等语法时会被错误解析为字符串枚举 `enum: ['>0']`,导致验证结果完全相反。
152
+
153
+ **修复前**:
154
+ ```javascript
155
+ const schema = dsl({ value: 'number:>0' });
156
+ validate(schema, { value: -5 }); // ❌ 错误:返回 true(应该false)
157
+ validate(schema, { value: 5 }); // ❌ 错误:返回 false(应该true)
158
+ ```
159
+
160
+ **修复后**:
161
+ ```javascript
162
+ const schema = dsl({ value: 'number:>0' });
163
+ validate(schema, { value: -5 }); // ✅ 正确:返回 false
164
+ validate(schema, { value: 5 }); // ✅ 正确:返回 true
165
+ ```
166
+
167
+ **影响范围**:
168
+ - 仅影响使用 `>`, `<`, `>=`, `<=`, `=` 符号的 number 约束
169
+ - 原有范围语法(如 `number:0-100`)不受影响
170
+ - 完全向后兼容
171
+
172
+ ---
173
+
174
+ ### 📚 文档更新
175
+
176
+ - 新增 [数字比较运算符文档](./docs/number-operators.md)
177
+ - 更新 README.md 添加比较运算符示例
178
+ - 更新 index.d.ts 添加比较运算符类型注释
179
+ - 新增 28 个比较运算符单元测试
180
+
181
+ ---
182
+
183
+ ### 🧪 测试
184
+
185
+ - **新增测试**:28 个比较运算符测试用例
186
+ - **测试总数**:949 个(921 + 28)
187
+ - **测试覆盖**:100% 通过
188
+ - **测试文件**:`test/unit/number-operators.test.js`
189
+
190
+ ---
191
+
192
+ ### 📊 变更统计
193
+
194
+ - **新增功能**:1 个(数字比较运算符)
195
+ - **Bug 修复**:1 个(比较运算符误解析)
196
+ - **文档更新**:3 个(README, docs/number-operators.md, index.d.ts)
197
+ - **测试新增**:28 个
198
+ - **代码变更**:2 个文件(lib/core/DslBuilder.js, lib/adapters/DslAdapter.js)
199
+
200
+ ---
201
+
29
202
  ## [v1.1.1] - 2026-01-06
30
203
 
31
204
  ### 🎉 新功能