0.0.0-alpha.1 • Published 7 months ago

async-validator-chain v0.0.0-alpha.1

Weekly downloads
-
License
-
Repository
github
Last release
7 months ago

async-validator-chain (still under development)

使用链式调用简化表单验证代码

simplify form validation code using chained calls.

import { str, obj, arr, createSchema } from 'async-validator-chain'

const schema = createSchema({
  userId: str(0, 10).required('用户编号不能为空'),
  extends: obj()
    .required('扩展信息不能为空')
    .fields({
      nickname: str(0, 3).required('昵称不能为空'),
    }),
  date: dateRange('2020-01-01', '2020-12-31').required('注册日期不能为空'),
  arr: arr(0, 1).items(num(0, 100).required('数字不能为空')),
}).toJson()

可以和以下代码相当

Can be equal to this JSON Schema.

const rules = {
  userId: [
    { required: true, message: '用户编号不能为空' },
    { type: 'string', min: 0, max: 10, message: '用户编号长度必须在0-10之间' },
  ],
  extends: [
    { required: true, message: '扩展信息不能为空' },
    {
      type: 'object',
      fields: {
        nickname: [
          { required: true, message: '昵称不能为空' },
          { type: 'string', min: 0, max: 3, message: '昵称长度必须在0-3之间' },
        ],
      },
    },
  ],
  date: [
    { required: true, message: '日期不能为空' },
    {
      type: 'array',
      len: 2,
      message: '日期必须为2个元素',
      defaultFields: {
        type: 'date',
        required: true,
        message: '日期不能为空',
      },
    },
  ],
  arr: [
    { required: true, message: '数组不能为空' },
    {
      type: 'array',
      min: 0,
      max: 1,
      message: '数组长度必须为0-1',
      defaultItems: [
        {
          type: 'number',
          min: 0,
          max: 100,
          message: '数组元素必须为0-100',
        },
        {
          required: true,
          message: '数组元素不能为空',
        },
      ],
    },
  ],
}

api

str

str(minLen?: string, maxLen?: string)
  .rule(assert: (value: number, fields: any) => boolean)
  .required()

num

num(min?: number, max?: number)
  .rule(assert: (value: number, fields: any) => boolean)
  .required()

int

int(min?: number, max?: number)
  .rule(assert: (value: number, fields: any) => boolean)
  .required()

float

float(min?: number, max?: number)
  .fixed(2)
  .rule(assert: (value: number, fields: any) => boolean)
  .required()

email

email(minLen?: number, maxLen?: number)
  .rule(assert: (value: string, fields: any) => boolean)
  .pattern(/@qq\.com^/, '请输入QQ邮箱')
  .required()

url

url(minLen?: number, maxLen?: number)
  .rule(assert: (value: string, fields: any) => boolean)
  .required()

telephone

tel()
  .rule(assert: (value: string, fields: any) => boolean)
  .required()

mobile

mob()
  .rule(assert: (value: string, fields: any) => boolean)
  .required()

arr

arr(min?: number, max?: number)
  .item(index: number, chain: Chain)
  .items(chain: Chain)
  .rule(assert: (value: any[], fields: any) => boolean)
  .required()

obj

obj()
  .properties(Record<{[field: any]: Chain}>)
  .rule(assert: (value: any[], fields: any) => boolean)
  .required()
0.0.0-alpha.1

7 months ago