Skip to content

Commit

Permalink
feat(validator): 新增 getZhCN
Browse files Browse the repository at this point in the history
  • Loading branch information
fjc0k committed Aug 4, 2023
1 parent 15d1eb3 commit 1e47c14
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 74 deletions.
3 changes: 3 additions & 0 deletions src/validator/__snapshots__/locale.test.ts.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`locale 中文-自定义label 1`] = `"id必须是一个数字"`;
20 changes: 19 additions & 1 deletion src/validator/locale.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { enUS } from './locale/enUS'
import { getZhCN, zhCN } from './locale/zhCN'
import { yup } from './yup'
import { zhCN } from './locale/zhCN'

describe('locale', () => {
for (const [name, locale] of Object.entries({ enUS, zhCN })) {
Expand All @@ -25,4 +25,22 @@ describe('locale', () => {
yup.number().label('年龄').integer().validate(9.2),
).rejects.toThrowError(/年龄必须是一个整数/)
})

test('中文-自定义label', async () => {
yup.setLocale(
getZhCN({
getLabel: params => params.label || params.path,
}),
)
await expect(
yup
.object({
id: yup.number(),
})
.validate({
// @ts-expect-error
id: 't',
}),
).rejects.toThrowErrorMatchingSnapshot()
})
})
153 changes: 80 additions & 73 deletions src/validator/locale/zhCN.ts
Original file line number Diff line number Diff line change
@@ -1,77 +1,84 @@
/* istanbul ignore file */
import { yup } from '../yup'

export const zhCN: yup.Locale = {
mixed: {
default: ({ label }) => `${label || '此项'}错误`,
required: ({ label }) => `${label || '此项'}必填`,
oneOf: ({ label, values }) =>
`${label || '此项'}必须是下列值之一: ${values}`,
notOneOf: ({ label, values }) =>
`${label || '此项'}必须不是下列值之一: ${values}`,
defined: ({ label }) => `${label || '此项'}必须已定义`,
notType: ({ label, type }) =>
`${label || '此项'}必须是一个${
type === 'number'
? '数字'
: type === 'string'
? '字符串'
: type === 'boolean'
? '布尔值'
: type === 'object'
? '对象'
: type === 'array'
? '数组'
: type === 'date'
? '日期'
: ` ${type} 类型的值`
}`,
},
string: {
length: ({ label, length }) =>
`${label || '此项'}必须仅包含${length}位字符`,
min: ({ label, min }) => `${label || '此项'}至少应包含${min}位字符`,
max: ({ label, max }) => `${label || '此项'}最多可包含${max}位字符`,
matches: ({ label, regex }) =>
`${label || '此项'}必须匹配该正则表达式: ${regex}`,
email: ({ label }) => `${label || '此项'}必须是一个合法的邮箱`,
url: ({ label }) =>
`${label || '此项'}必须是一个以 http:// 或 https:// 开头的网络链接`,
trim: ({ label }) => `${label || '此项'}必须是一个没有旁白的字符串`,
lowercase: ({ label }) => `${label || '此项'}必须是一个小写的字符串`,
uppercase: ({ label }) => `${label || '此项'}必须是一个大写的字符串`,
chineseMobilePhoneNumber: ({ label }) =>
`${label || '此项'}必须是一个合法的手机号码`,
chineseIDCardNumber: ({ label }) =>
`${label || '此项'}必须是一个合法的身份证号码`,
},
number: {
min: ({ label, min }) => `${label || '此项'}必须大于或等于${min}`,
max: ({ label, max }) => `${label || '此项'}必须小于或等于${max}`,
lessThan: ({ label, less }) => `${label || '此项'}必须小于${less}`,
moreThan: ({ label, more }) => `${label || '此项'}必须大于${more}`,
positive: ({ label }) => `${label || '此项'}必须是一个正数`,
negative: ({ label }) => `${label || '此项'}必须是一个负数`,
integer: ({ label }) => `${label || '此项'}必须是一个整数`,
id: ({ label }) => `${label || '此项'}必须是一个正整数`,
positiveInteger: ({ label }) => `${label || '此项'}必须是一个正整数`,
negativeInteger: ({ label }) => `${label || '此项'}必须是一个负整数`,
nonPositive: ({ label }) => `${label || '此项'}必须是一个非正数`,
nonNegative: ({ label }) => `${label || '此项'}必须是一个非负数`,
nonPositiveInteger: ({ label }) => `${label || '此项'}必须是一个非正整数`,
nonNegativeInteger: ({ label }) => `${label || '此项'}必须是一个非负整数`,
},
date: {
min: ({ label, min }) => `${label || '此项'}必须晚于${min}`,
max: ({ label, max }) => `${label || '此项'}必须早于${max}`,
},
boolean: {},
object: {
noUnknown: ({ label, unknown }) =>
`${label || '此项'}上有未定义的键: ${unknown}`,
},
array: {
min: ({ label, min }) => `${label || '此项'}至少应包含${min}个元素`,
max: ({ label, max }) => `${label || '此项'}最多可包含${max}个元素`,
},
export const getZhCN = (options: {
getLabel: (params: yup.LocaleValueFnParams) => string
}): yup.Locale => {
const { getLabel } = options
return {
mixed: {
default: params => `${getLabel(params)}错误`,
required: params => `${getLabel(params)}必填`,
oneOf: params => `${getLabel(params)}必须是下列值之一: ${params.values}`,
notOneOf: params =>
`${getLabel(params)}必须不是下列值之一: ${params.values}`,
defined: params => `${getLabel(params)}必须已定义`,
notType: params =>
`${getLabel(params)}必须是一个${
params.type === 'number'
? '数字'
: params.type === 'string'
? '字符串'
: params.type === 'boolean'
? '布尔值'
: params.type === 'object'
? '对象'
: params.type === 'array'
? '数组'
: params.type === 'date'
? '日期'
: ` ${params.type} 类型的值`
}`,
},
string: {
length: params => `${getLabel(params)}必须仅包含${params.length}位字符`,
min: params => `${getLabel(params)}至少应包含${params.min}位字符`,
max: params => `${getLabel(params)}最多可包含${params.max}位字符`,
matches: params =>
`${getLabel(params)}必须匹配该正则表达式: ${params.regex}`,
email: params => `${getLabel(params)}必须是一个合法的邮箱`,
url: params =>
`${getLabel(params)}必须是一个以 http:// 或 https:// 开头的网络链接`,
trim: params => `${getLabel(params)}必须是一个没有旁白的字符串`,
lowercase: params => `${getLabel(params)}必须是一个小写的字符串`,
uppercase: params => `${getLabel(params)}必须是一个大写的字符串`,
chineseMobilePhoneNumber: params =>
`${getLabel(params)}必须是一个合法的手机号码`,
chineseIDCardNumber: params =>
`${getLabel(params)}必须是一个合法的身份证号码`,
},
number: {
min: params => `${getLabel(params)}必须大于或等于${params.min}`,
max: params => `${getLabel(params)}必须小于或等于${params.max}`,
lessThan: params => `${getLabel(params)}必须小于${params.less}`,
moreThan: params => `${getLabel(params)}必须大于${params.more}`,
positive: params => `${getLabel(params)}必须是一个正数`,
negative: params => `${getLabel(params)}必须是一个负数`,
integer: params => `${getLabel(params)}必须是一个整数`,
id: params => `${getLabel(params)}必须是一个正整数`,
positiveInteger: params => `${getLabel(params)}必须是一个正整数`,
negativeInteger: params => `${getLabel(params)}必须是一个负整数`,
nonPositive: params => `${getLabel(params)}必须是一个非正数`,
nonNegative: params => `${getLabel(params)}必须是一个非负数`,
nonPositiveInteger: params => `${getLabel(params)}必须是一个非正整数`,
nonNegativeInteger: params => `${getLabel(params)}必须是一个非负整数`,
},
date: {
min: params => `${getLabel(params)}必须晚于${params.min}`,
max: params => `${getLabel(params)}必须早于${params.max}`,
},
boolean: {},
object: {
noUnknown: params =>
`${getLabel(params)}上有未定义的键: ${params.unknown}`,
},
array: {
min: params => `${getLabel(params)}至少应包含${params.min}个元素`,
max: params => `${getLabel(params)}最多可包含${params.max}个元素`,
},
}
}

export const zhCN = getZhCN({
getLabel: params => params.label || '此项',
})

0 comments on commit 1e47c14

Please sign in to comment.