schema-dsl API 参考文档
本页是完整公开 API 参考,适合在理解任务型指南后查细节。若只需要更短的 API 入口,请看 API 概览。
dsl / s 命名空间
描述
DSL 主入口命名空间。s 和 dsl 是同一个函数对象:s === dsl。函数调用形式支持字符串和对象两种定义方式;命名空间 factory 提供可发现的链式入口,但底层仍复用同一套 DSL 解析与 builder 契约。公开示例默认使用 schema-dsl/pure + s,避免导入时修改全局原型。
语法
s(definition: string | object): IDslBuilder | JSONSchema
s.email(): IDslBuilder
s.string(): IDslBuilder
s.number(): IDslBuilder
因为 s === dsl,通过任一名字调用同一个对象都保持兼容。文档推荐写法是:s({ ... }) 编写 schema object,s('...') 编写 DSL seed builder,s.xxx() 提供可发现的 factory 入口。dsl 名称继续作为兼容和语义别名保留。
参数
definition (string | object) - DSL定义
- 字符串:返回 DslBuilder 实例(可链式调用)
- 对象:返回 JSON Schema 对象
返回值
- DslBuilder / IDslBuilder - 当参数为字符串或命名空间 factory 时
- Object - 当参数为对象时(JSON Schema)
示例
import { s } from 'schema-dsl/pure';
// 纯 DSL 字符串:最短 schema object
const schema = s({
username: 'string:3-32!',
email: 'email!'
});
// DSL seed:紧凑 DSL + builder 链式方法
s('email!').label('邮箱').pattern(/custom/);
// factory 写法:最完整的 TypeScript 方法发现
s.email().label('邮箱').pattern(/custom/).require();
命名空间 Factory
内建 factory 都挂在共享的 s / dsl 命名空间上:
示例:
s('email!').label('邮箱')
s.email().label('邮箱').require()
s.array(s.string().require()).min(1)
s.enum('admin', 'user', 'guest')
s.type('tenant-id').require()
DslBuilder 类
描述
Schema 构建器类,支持链式调用添加验证规则。
构造函数
new DslBuilder(dslString: string)
参数:
dslString (string) - DSL字符串,如 'string:3-32!'
方法
完整链式方法列表
s('...')、可调用命名空间别名以及 s.email() 等命名空间 factory 都会返回按公开 IDslBuilder 链式契约声明的 DslBuilder。希望紧凑 DSL 加 builder 提示时使用 s('email!');希望最完整 TypeScript 方法发现时使用 s.email()。直接 String 链式仍可通过 String Extensions 或 transform 使用,但不再作为默认文档入口。完整方法表和入口支持请看 链式字段方法列表。
示例:
s('string').default('active')
s.string().default('active')
s.string().username('5-20').label('用户名').require()
s.number().min(18).max(120).precision(2).multiple(0.5)
s.object().strict().requireAll()
s.array(s.string().require()).min(1).noSparse().includesRequired(['admin'])
s.array({ name: 'string!', quantity: 'number:1-999!' }).min(1)
// 直接字符串链式兼容路径:
// 运行时需要 schema-dsl/register-string、compat/root 或编译期 transform;
// TypeScript 声明需要 schema-dsl/string-types。
'string'.default('active')
.pattern(regex, message?)
添加正则表达式验证。
参数:
regex (RegExp | string) - 正则表达式
message (string, 可选) - 自定义错误消息
返回: DslBuilder
示例:
s('string:3-32!')
.pattern(/^[a-zA-Z0-9_]+$/, '只能包含字母、数字和下划线')
.label(text)
设置字段标签(用于错误消息)。
参数:
返回: DslBuilder
示例:
s('email!').label('邮箱地址')
.messages(messages)
自定义错误消息。
参数:
messages (Object) - 错误消息对象
- 键:错误代码(如
'string.min')
- 值:错误消息模板
返回: DslBuilder
示例:
s('string:3-32!')
.messages({
'min': '至少{{#limit}}个字符',
'max': '最多{{#limit}}个字符'
})
.description(text)
设置字段描述。
参数:
返回: DslBuilder
示例:
s('url').description('个人主页链接')
.custom(validator)
添加自定义验证器。
参数:
validator (Function) - 验证函数
- 签名:
(value) => boolean | string | { error, message } | void
- 返回
true 表示通过
- 返回
false、错误消息字符串或错误对象表示失败
- 同步验证器由
validate() 和 validateAsync() 均执行;异步验证器(返回 Promise)仅由 validateAsync() 执行,validate() 调用时会返回明确的同步错误提示
返回: DslBuilder
示例:
s('string:3-32!')
.custom((value) => {
if (value === 'admin') {
return { error: 'username.exists', message: '用户名已存在' };
}
})
.default(value)
设置默认值。
参数:
返回: DslBuilder
示例:
s('string').default('guest')
.username(preset?)
用户名验证(自动设置长度和正则)。
参数:
preset (string | Object, 可选) - 预设配置
- 字符串:
'short' | 'medium' | 'long' | '5-20'
- 对象:
{ minLength, maxLength, allowUnderscore, allowNumber }
- 默认值:
'medium' (3-32位)
返回: DslBuilder
示例:
// 默认 medium (3-32位)
s('string!').username()
// 自定义范围
s('string!').username('5-20')
// 使用预设
s('string!').username('short') // 3-16位
.password(strength?)
密码强度验证(自动设置长度和正则)。
参数:
strength (string, 可选) - 强度级别
'weak' - 最少6位
'medium' - 8位,字母+数字(默认)
'strong' - 8位,大小写+数字
'veryStrong' - 10位,大小写+数字+特殊字符
返回: DslBuilder
示例:
s('string!').password('strong')
.phone(country?)
手机号验证(自动设置长度和正则)。
参数:
country (string, 可选) - 国家代码
'cn' - 中国(默认)
'us' - 美国
'uk' - 英国
'hk' - 香港
'tw' - 台湾
'international' - 国际格式
返回: DslBuilder
注意: phone() 仅适用于 string schema。请使用 s('string!').phone('cn');在 number schema 上调用会抛错,避免混合残留数字约束和字符串约束。
示例:
// 推荐写法
s('string!').phone('cn')
.toSchema()
转换为 JSON Schema 对象(含内部标记)。
返回: Object - JSON Schema 对象(包含 _required、_customMessages、_label 等 schema-dsl 内部字段)
示例:
const schema = s('email!').label('邮箱').toSchema();
// { type: 'string', format: 'email', _label: '邮箱', _required: true }
.toJsonSchema() v1.2.5+
转换为纯净的 JSON Schema 对象(无内部标记)。
与 toSchema() 不同,toJsonSchema() 会自动清理所有 schema-dsl 内部标记:
- 下划线前缀字段:
_required、_customMessages、_label、_customValidators、_whenConditions
- 自定义验证关键字(直接清除):
alphanum、lowercase、uppercase、trim、jsonString、port、requiredAll、strictSchema、noSparse、includesRequired、dateFormat、dateGreater、dateLess、precision
exactLength 特殊翻译:不直接清除,而是转换为标准 JSON Schema { minLength: N, maxLength: N }(与 v1 DslBuilder string:N 行为兼容)
⚠️ multipleOf 是标准 JSON Schema 字段,不会被清除(v2 修复了 v1 的错误行为)。
返回的对象可直接嵌入 OpenAPI / JSON Schema 等标准文档中,无需下游再做清理。
返回: Object - 纯净的 JSON Schema 对象
适用场景:
- 生成 OpenAPI 文档
- 导出给外部系统消费
- 任何需要标准 JSON Schema 的场景
示例:
// 对比 toSchema() 与 toJsonSchema()
const builder = s('string:3-32!').label('用户名').messages({ min: '至少3个字符' });
builder.toSchema();
// { type: 'string', minLength: 3, maxLength: 32, _required: true, _label: '用户名', _customMessages: { min: '至少3个字符' } }
builder.toJsonSchema();
// { type: 'string', minLength: 3, maxLength: 32 }
// 注意:不含 _required、_label、_customMessages 等内部字段
// string:N 单值语法(exactLength → minLength + maxLength)
const exact = s('string:6!');
exact.toSchema();
// { type: 'string', exactLength: 6, _required: true }
exact.toJsonSchema();
// { type: 'string', minLength: 6, maxLength: 6 }
// 注:exactLength 自动翻译为标准 JSON Schema 的 minLength + maxLength(v1 兼容行为)
// enum 示例
const enumBuilder = s('enum:admin,user,guest!');
enumBuilder.toJsonSchema();
// { type: 'string', enum: ['admin', 'user', 'guest'] }
// 用于 OpenAPI 文档生成
const schema = s({
username: 'string:3-32!',
email: 'email!',
age: 'number:0-120'
});
// 遍历各字段调用 toJsonSchema() 即可获得标准 JSON Schema
.validate(data)
验证数据(便捷方法)。
参数:
返回: Promise