@astral/validations 2.27.0 → 3.0.0-beta.0
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/LICENSE +1 -1
- package/README.md +1243 -1
- package/any/any.d.ts +21 -0
- package/any/any.js +14 -0
- package/any/index.d.ts +1 -0
- package/any/index.js +1 -0
- package/array/array.d.ts +15 -0
- package/array/array.js +21 -0
- package/array/constants.d.ts +2 -0
- package/array/constants.js +5 -0
- package/array/index.d.ts +2 -0
- package/array/index.js +2 -0
- package/arrayItem/arrayItem.d.ts +35 -0
- package/arrayItem/arrayItem.js +33 -0
- package/arrayItem/index.d.ts +1 -0
- package/arrayItem/index.js +1 -0
- package/boolean/boolean.d.ts +13 -0
- package/boolean/boolean.js +19 -0
- package/boolean/constants.d.ts +2 -0
- package/boolean/constants.js +5 -0
- package/boolean/index.d.ts +2 -0
- package/boolean/index.js +2 -0
- package/core/compose/compose.d.ts +6 -0
- package/{compose → core/compose}/compose.js +2 -3
- package/core/context/createContext/createContext.d.ts +8 -0
- package/core/context/createContext/createContext.js +15 -0
- package/core/context/createContext/index.d.ts +1 -0
- package/core/context/createContext/index.js +1 -0
- package/core/context/index.d.ts +2 -0
- package/core/context/index.js +2 -0
- package/core/context/types.d.ts +28 -0
- package/core/errors/ArrayError/ArrayError.d.ts +18 -0
- package/core/errors/ArrayError/ArrayError.js +10 -0
- package/core/errors/ArrayError/createArrayError/createArrayError.d.ts +5 -0
- package/core/errors/ArrayError/createArrayError/createArrayError.js +11 -0
- package/core/errors/ArrayError/createArrayError/index.d.ts +1 -0
- package/core/errors/ArrayError/createArrayError/index.js +1 -0
- package/core/errors/ArrayError/index.d.ts +2 -0
- package/core/errors/ArrayError/index.js +2 -0
- package/core/errors/ErrorMap/ErrorMap.d.ts +21 -0
- package/core/errors/ErrorMap/ErrorMap.js +10 -0
- package/core/errors/ErrorMap/createErrorMap/createErrorMap.d.ts +5 -0
- package/core/errors/ErrorMap/createErrorMap/createErrorMap.js +10 -0
- package/core/errors/ErrorMap/createErrorMap/index.d.ts +1 -0
- package/core/errors/ErrorMap/createErrorMap/index.js +1 -0
- package/core/errors/ErrorMap/index.d.ts +2 -0
- package/core/errors/ErrorMap/index.js +2 -0
- package/core/errors/SimpleError/SimpleError.d.ts +16 -0
- package/core/errors/SimpleError/SimpleError.js +9 -0
- package/core/errors/SimpleError/createSimpleError/createSimpleError.d.ts +6 -0
- package/core/errors/SimpleError/createSimpleError/createSimpleError.js +5 -0
- package/core/errors/SimpleError/createSimpleError/index.d.ts +1 -0
- package/core/errors/SimpleError/createSimpleError/index.js +1 -0
- package/core/errors/SimpleError/index.d.ts +2 -0
- package/core/errors/SimpleError/index.js +2 -0
- package/core/errors/createErrorCode/createErrorCode.d.ts +5 -0
- package/core/errors/createErrorCode/createErrorCode.js +4 -0
- package/core/errors/createErrorCode/index.d.ts +1 -0
- package/core/errors/createErrorCode/index.js +1 -0
- package/core/errors/index.d.ts +5 -0
- package/core/errors/index.js +5 -0
- package/core/errors/types.d.ts +18 -0
- package/core/errors/types.js +1 -0
- package/core/guard/createGuard/createGuard.d.ts +54 -0
- package/core/guard/createGuard/createGuard.js +41 -0
- package/core/guard/createGuard/index.d.ts +1 -0
- package/core/guard/createGuard/index.js +1 -0
- package/core/guard/index.d.ts +1 -0
- package/core/guard/index.js +1 -0
- package/core/index.d.ts +8 -0
- package/core/index.js +8 -0
- package/core/rule/createRule/createRule.d.ts +42 -0
- package/core/rule/createRule/createRule.js +27 -0
- package/core/rule/index.d.ts +3 -0
- package/core/rule/index.js +3 -0
- package/core/rule/required/constants.d.ts +2 -0
- package/core/rule/required/constants.js +5 -0
- package/core/rule/required/index.d.ts +2 -0
- package/core/rule/required/index.js +2 -0
- package/core/rule/required/required.d.ts +19 -0
- package/core/rule/required/required.js +25 -0
- package/core/rule/types.d.ts +15 -0
- package/core/rule/types.js +1 -0
- package/core/types.d.ts +9 -0
- package/core/types.js +1 -0
- package/{utils → core/utils}/index.d.ts +1 -1
- package/{utils → core/utils}/index.js +1 -1
- package/core/utils/isStringOfZeros/index.d.ts +1 -0
- package/core/utils/isStringOfZeros/index.js +1 -0
- package/{utils → core/utils/isStringOfZeros}/isStringOfZeros.d.ts +1 -1
- package/{utils → core/utils/isStringOfZeros}/isStringOfZeros.js +1 -1
- package/core/utils/resetTime/index.d.ts +1 -0
- package/core/utils/resetTime/index.js +1 -0
- package/core/utils/resetTime/resetTime.d.ts +5 -0
- package/core/utils/resetTime/resetTime.js +12 -0
- package/date/constants.d.ts +3 -0
- package/date/constants.js +9 -0
- package/date/date.d.ts +19 -0
- package/date/date.js +24 -0
- package/date/index.d.ts +1 -0
- package/date/index.js +1 -0
- package/deepPartial/deepPartial.d.ts +29 -0
- package/deepPartial/deepPartial.js +21 -0
- package/deepPartial/index.d.ts +1 -0
- package/deepPartial/index.js +1 -0
- package/email/constants.d.ts +5 -0
- package/email/constants.js +11 -0
- package/email/email.d.ts +28 -0
- package/email/email.js +19 -0
- package/email/index.d.ts +2 -0
- package/email/index.js +2 -0
- package/index.d.ts +24 -20
- package/index.js +24 -20
- package/innIP/constants.d.ts +5 -0
- package/innIP/constants.js +8 -0
- package/innIP/index.d.ts +2 -0
- package/innIP/index.js +2 -0
- package/innIP/innIP.d.ts +25 -0
- package/innIP/innIP.js +40 -0
- package/innUL/constants.d.ts +4 -0
- package/innUL/constants.js +7 -0
- package/innUL/index.d.ts +2 -0
- package/innUL/index.js +2 -0
- package/innUL/innUL.d.ts +25 -0
- package/innUL/innUL.js +36 -0
- package/kpp/constants.d.ts +3 -0
- package/kpp/constants.js +6 -0
- package/kpp/index.d.ts +2 -0
- package/kpp/index.js +2 -0
- package/kpp/kpp.d.ts +25 -0
- package/kpp/kpp.js +16 -0
- package/max/constants.d.ts +5 -0
- package/max/constants.js +5 -0
- package/max/index.d.ts +2 -0
- package/max/index.js +2 -0
- package/max/max.d.ts +26 -0
- package/max/max.js +42 -0
- package/min/constants.d.ts +5 -0
- package/min/constants.js +5 -0
- package/min/index.d.ts +2 -0
- package/min/index.js +2 -0
- package/min/min.d.ts +26 -0
- package/min/min.js +42 -0
- package/mobilePhone/constants.d.ts +3 -0
- package/mobilePhone/constants.js +6 -0
- package/mobilePhone/index.d.ts +2 -0
- package/mobilePhone/index.js +2 -0
- package/mobilePhone/mobilePhone.d.ts +27 -0
- package/mobilePhone/mobilePhone.js +21 -0
- package/number/constants.d.ts +4 -0
- package/number/constants.js +13 -0
- package/number/index.d.ts +2 -0
- package/number/index.js +2 -0
- package/number/number.d.ts +19 -0
- package/number/number.js +26 -0
- package/object/constants.d.ts +2 -0
- package/object/constants.js +5 -0
- package/object/index.d.ts +2 -0
- package/object/index.js +2 -0
- package/object/isEmptyErrors/index.d.ts +1 -0
- package/object/isEmptyErrors/index.js +1 -0
- package/object/isEmptyErrors/isEmptyErrors.d.ts +5 -0
- package/object/isEmptyErrors/isEmptyErrors.js +4 -0
- package/object/object.d.ts +52 -0
- package/object/object.js +50 -0
- package/ogrnIP/constants.d.ts +3 -0
- package/ogrnIP/constants.js +6 -0
- package/ogrnIP/index.d.ts +2 -0
- package/ogrnIP/index.js +2 -0
- package/ogrnIP/ogrnIP.d.ts +25 -0
- package/ogrnIP/ogrnIP.js +27 -0
- package/ogrnUL/constants.d.ts +3 -0
- package/ogrnUL/constants.js +6 -0
- package/ogrnUL/index.d.ts +2 -0
- package/ogrnUL/index.js +2 -0
- package/ogrnUL/ogrnUL.d.ts +25 -0
- package/ogrnUL/ogrnUL.js +27 -0
- package/onlyNumber/constants.d.ts +2 -0
- package/onlyNumber/constants.js +2 -0
- package/onlyNumber/index.d.ts +2 -0
- package/onlyNumber/index.js +2 -0
- package/onlyNumber/onlyNumber.d.ts +24 -0
- package/onlyNumber/onlyNumber.js +20 -0
- package/optional/index.d.ts +1 -0
- package/optional/index.js +1 -0
- package/optional/optional.d.ts +7 -0
- package/optional/optional.js +15 -0
- package/or/index.d.ts +1 -0
- package/or/index.js +1 -0
- package/or/or.d.ts +22 -0
- package/or/or.js +21 -0
- package/package.json +2 -2
- package/partial/index.d.ts +1 -0
- package/partial/index.js +1 -0
- package/partial/partial.d.ts +10 -0
- package/partial/partial.js +6 -0
- package/pattern/constants.d.ts +2 -0
- package/pattern/constants.js +2 -0
- package/pattern/index.d.ts +2 -0
- package/pattern/index.js +2 -0
- package/pattern/pattern.d.ts +26 -0
- package/pattern/pattern.js +22 -0
- package/snils/constants.d.ts +4 -0
- package/snils/constants.js +7 -0
- package/snils/index.d.ts +2 -0
- package/snils/index.js +2 -0
- package/snils/snils.d.ts +25 -0
- package/{isSNILS/isSNILS.js → snils/snils.js} +20 -21
- package/string/constants.d.ts +2 -0
- package/string/constants.js +5 -0
- package/string/index.d.ts +2 -0
- package/string/index.js +2 -0
- package/string/string.d.ts +2 -0
- package/string/string.js +8 -0
- package/toPlainError/index.d.ts +1 -0
- package/toPlainError/index.js +1 -0
- package/toPlainError/toPlainError.d.ts +35 -0
- package/toPlainError/toPlainError.js +49 -0
- package/toPlainError/utils/generateArrayPath/generateArrayPath.d.ts +4 -0
- package/toPlainError/utils/generateArrayPath/generateArrayPath.js +9 -0
- package/toPlainError/utils/generateArrayPath/index.d.ts +1 -0
- package/toPlainError/utils/generateArrayPath/index.js +1 -0
- package/toPlainError/utils/generateObjectPath/generateObjectPath.d.ts +4 -0
- package/toPlainError/utils/generateObjectPath/generateObjectPath.js +9 -0
- package/toPlainError/utils/generateObjectPath/index.d.ts +1 -0
- package/toPlainError/utils/generateObjectPath/index.js +1 -0
- package/toPlainError/utils/index.d.ts +2 -0
- package/toPlainError/utils/index.js +2 -0
- package/transform/index.d.ts +1 -0
- package/transform/index.js +1 -0
- package/transform/transform.d.ts +26 -0
- package/transform/transform.js +16 -0
- package/when/index.d.ts +1 -0
- package/when/index.js +1 -0
- package/when/when.d.ts +47 -0
- package/when/when.js +29 -0
- package/compose/compose.d.ts +0 -7
- package/composeSome/composeSome.d.ts +0 -8
- package/composeSome/composeSome.js +0 -25
- package/composeSome/index.d.ts +0 -1
- package/composeSome/index.js +0 -1
- package/constants.d.ts +0 -2
- package/constants.js +0 -2
- package/createRule/createRule.d.ts +0 -14
- package/createRule/createRule.js +0 -12
- package/isDate/index.d.ts +0 -1
- package/isDate/index.js +0 -1
- package/isDate/isDate.d.ts +0 -10
- package/isDate/isDate.js +0 -23
- package/isEmail/index.d.ts +0 -1
- package/isEmail/index.js +0 -1
- package/isEmail/isEmail.d.ts +0 -13
- package/isEmail/isEmail.js +0 -25
- package/isINNIP/index.d.ts +0 -1
- package/isINNIP/index.js +0 -1
- package/isINNIP/isINNIP.d.ts +0 -10
- package/isINNIP/isINNIP.js +0 -42
- package/isINNUL/index.d.ts +0 -1
- package/isINNUL/index.js +0 -1
- package/isINNUL/isINNUL.d.ts +0 -10
- package/isINNUL/isINNUL.js +0 -37
- package/isKPP/index.d.ts +0 -1
- package/isKPP/index.js +0 -1
- package/isKPP/isKPP.d.ts +0 -7
- package/isKPP/isKPP.js +0 -19
- package/isMaxLength/index.d.ts +0 -1
- package/isMaxLength/index.js +0 -1
- package/isMaxLength/isMaxLength.d.ts +0 -18
- package/isMaxLength/isMaxLength.js +0 -34
- package/isMaxValue/index.d.ts +0 -1
- package/isMaxValue/index.js +0 -1
- package/isMaxValue/isMaxValue.d.ts +0 -17
- package/isMaxValue/isMaxValue.js +0 -35
- package/isMaybeNumber/index.d.ts +0 -1
- package/isMaybeNumber/index.js +0 -1
- package/isMaybeNumber/isMaybeNumber.d.ts +0 -10
- package/isMaybeNumber/isMaybeNumber.js +0 -23
- package/isMinLength/index.d.ts +0 -1
- package/isMinLength/index.js +0 -1
- package/isMinLength/isMinLength.d.ts +0 -18
- package/isMinLength/isMinLength.js +0 -34
- package/isMinValue/index.d.ts +0 -1
- package/isMinValue/index.js +0 -1
- package/isMinValue/isMinValue.d.ts +0 -17
- package/isMinValue/isMinValue.js +0 -35
- package/isMobilePhone/index.d.ts +0 -1
- package/isMobilePhone/index.js +0 -1
- package/isMobilePhone/isMobilePhone.d.ts +0 -10
- package/isMobilePhone/isMobilePhone.js +0 -20
- package/isOGRNIP/index.d.ts +0 -1
- package/isOGRNIP/index.js +0 -1
- package/isOGRNIP/isOGRNIP.d.ts +0 -10
- package/isOGRNIP/isOGRNIP.js +0 -29
- package/isOGRNUL/index.d.ts +0 -1
- package/isOGRNUL/index.js +0 -1
- package/isOGRNUL/isOGRNUL.d.ts +0 -10
- package/isOGRNUL/isOGRNUL.js +0 -29
- package/isRequired/index.d.ts +0 -1
- package/isRequired/index.js +0 -1
- package/isRequired/isRequired.d.ts +0 -11
- package/isRequired/isRequired.js +0 -23
- package/isSNILS/index.d.ts +0 -1
- package/isSNILS/index.js +0 -1
- package/isSNILS/isSNILS.d.ts +0 -10
- package/types.d.ts +0 -4
- package/utils/isEmptyString.d.ts +0 -4
- package/utils/isEmptyString.js +0 -6
- package/yupAdapter/index.d.ts +0 -1
- package/yupAdapter/index.js +0 -1
- package/yupAdapter/yupAdapter.d.ts +0 -8
- package/yupAdapter/yupAdapter.js +0 -11
- /package/{compose → core/compose}/index.d.ts +0 -0
- /package/{compose → core/compose}/index.js +0 -0
- /package/{types.js → core/context/types.js} +0 -0
- /package/{createRule → core/rule/createRule}/index.d.ts +0 -0
- /package/{createRule → core/rule/createRule}/index.js +0 -0
package/README.md
CHANGED
@@ -1,3 +1,1245 @@
|
|
1
1
|
# @astral/validations
|
2
2
|
|
3
|
-
|
3
|
+
Библиотека для валидаций в функциональном стиле.
|
4
|
+
|
5
|
+
Особенности:
|
6
|
+
|
7
|
+
- ⚡️️️️ Ориентирована на специфику frontend-приложений
|
8
|
+
- ⚡️️️️ Функциональный стиль
|
9
|
+
- ⚡️️️️ [Валидация по схеме](#object), а также использование правил валидации вне контекста схемы
|
10
|
+
- ⚡️️️️ Оптимизирована для валидации форм (есть [поддержка react-hook-form](#react-hook-form))
|
11
|
+
- ⚡️️️️ Полноценная поддержка tree shaking
|
12
|
+
- ⚡️️️️ Простота создания [кастомных правил валидации](#custom-rules)
|
13
|
+
|
14
|
+
# Table of contents
|
15
|
+
|
16
|
+
- [Installation](#installation)
|
17
|
+
- [Basic usage](#basic-usage)
|
18
|
+
- [Guards](#guards)
|
19
|
+
- [number](#number)
|
20
|
+
- [min](#min-number)
|
21
|
+
- [max](#max-number)
|
22
|
+
- [string](#string)
|
23
|
+
- [min](#min-string)
|
24
|
+
- [max](#max-string)
|
25
|
+
- [email](#email)
|
26
|
+
- [pattern](#pattern)
|
27
|
+
- [onlyNumber](#onlyNumber)
|
28
|
+
- [snils](#snils)
|
29
|
+
- [mobilePhone](#mobilePhone)
|
30
|
+
- [innUL](#innUL)
|
31
|
+
- [innIP](#innIP)
|
32
|
+
- [kpp](#kpp)
|
33
|
+
- [ogrnIP](#ogrnIP)
|
34
|
+
- [ogrnUL](#ogrnUL)
|
35
|
+
- [date](#date)
|
36
|
+
- [min](#min-date)
|
37
|
+
- [max](#max-date)
|
38
|
+
- [boolean](#boolean)
|
39
|
+
- [object](#object)
|
40
|
+
- [partial](#partial)
|
41
|
+
- [deepPartial](#deepPartial)
|
42
|
+
- [array](#array)
|
43
|
+
- [arrayItem](#arrayItem)
|
44
|
+
- [min](#min-array)
|
45
|
+
- [max](#max-array)
|
46
|
+
- [any](#any)
|
47
|
+
- [Define. Переопределение дефолтных параметров guard](#define-переопределение-дефолтных-параметров-guard)
|
48
|
+
- [Custom rules](#custom-rules)
|
49
|
+
- [Базовый пример](#базовый-пример)
|
50
|
+
- [Связанные поля](#связанные-поля)
|
51
|
+
- [Переиспользуемое правило](#переиспользуемое-правило)
|
52
|
+
- [Common](#common)
|
53
|
+
- [optional](#optional)
|
54
|
+
- [when. Условная валидация](#when-условная-валидация)
|
55
|
+
- [transform](#transform)
|
56
|
+
- [or](#or)
|
57
|
+
- [Integrations](#integrations)
|
58
|
+
- [react-hook-form](#react-hook-form)
|
59
|
+
- [Error message customization](#error-message-customization)
|
60
|
+
- [Exclusion managing](#exclusion-managing)
|
61
|
+
|
62
|
+
---
|
63
|
+
|
64
|
+
# Installation
|
65
|
+
|
66
|
+
```shell
|
67
|
+
npm i --save @astral/validations
|
68
|
+
```
|
69
|
+
|
70
|
+
```shell
|
71
|
+
yarn add @astral/validations
|
72
|
+
```
|
73
|
+
|
74
|
+
---
|
75
|
+
|
76
|
+
# Basic usage
|
77
|
+
|
78
|
+
Валидация объекта с вложенным массивом
|
79
|
+
|
80
|
+
```ts
|
81
|
+
import {
|
82
|
+
object,
|
83
|
+
array,
|
84
|
+
arrayItem,
|
85
|
+
string,
|
86
|
+
optional,
|
87
|
+
min,
|
88
|
+
number
|
89
|
+
} from '@astral/validations';
|
90
|
+
|
91
|
+
type Permission = {
|
92
|
+
id: number;
|
93
|
+
description: string;
|
94
|
+
};
|
95
|
+
|
96
|
+
type User = {
|
97
|
+
name: string;
|
98
|
+
surname?: string;
|
99
|
+
info: {
|
100
|
+
permissions: Permission[];
|
101
|
+
};
|
102
|
+
};
|
103
|
+
|
104
|
+
const validate = object<User>({
|
105
|
+
name: string(),
|
106
|
+
surname: optional(string()),
|
107
|
+
info: object<User['info']>({
|
108
|
+
permissions: array(
|
109
|
+
arrayItem(
|
110
|
+
object<Permission>({
|
111
|
+
id: number(),
|
112
|
+
description: string(min(2)),
|
113
|
+
}),
|
114
|
+
),
|
115
|
+
),
|
116
|
+
}),
|
117
|
+
});
|
118
|
+
|
119
|
+
// undefined
|
120
|
+
validate({
|
121
|
+
name: 'Vasya',
|
122
|
+
info: {
|
123
|
+
permissions: [{ id: 1, description: 'my permission' }],
|
124
|
+
},
|
125
|
+
});
|
126
|
+
|
127
|
+
// Error in info.permissions.0.description: Обязательно
|
128
|
+
validate({
|
129
|
+
name: 'Vasya',
|
130
|
+
info: {
|
131
|
+
permissions: [{ id: 1 }],
|
132
|
+
},
|
133
|
+
});
|
134
|
+
```
|
135
|
+
|
136
|
+
Валидация отдельных value
|
137
|
+
|
138
|
+
```ts
|
139
|
+
import { number, string, max } from '@astral/validations';
|
140
|
+
|
141
|
+
// undefined
|
142
|
+
number()(22)
|
143
|
+
|
144
|
+
// { message: 'Обязательно' }
|
145
|
+
string()('')
|
146
|
+
|
147
|
+
// { message: 'Макс. символов: 5' }
|
148
|
+
string(max(5))('123456')
|
149
|
+
```
|
150
|
+
|
151
|
+
---
|
152
|
+
|
153
|
+
# Guards
|
154
|
+
|
155
|
+
Guard - правило, выполняющее проверку на тип данных. Guard должен быть предикатом для любой валидации.
|
156
|
+
|
157
|
+
Каждый guard:
|
158
|
+
- Проверяет значение на required (для каждого типа данных своя проверка)
|
159
|
+
- Имеет метод ```define```, позволяющий переопределять стандартные параметры guard
|
160
|
+
|
161
|
+
## number
|
162
|
+
|
163
|
+
- Возвращает ошибку если:
|
164
|
+
- Тип value не number
|
165
|
+
- Value является NaN
|
166
|
+
- Value является Infinity
|
167
|
+
- Проверяет value на required
|
168
|
+
- Выполняет композицию правил, переданных в параметры
|
169
|
+
|
170
|
+
```ts
|
171
|
+
import { number, min, max } from '@astral/validations';
|
172
|
+
|
173
|
+
const validate = number(min(1), max(22));
|
174
|
+
|
175
|
+
// undefined
|
176
|
+
validate(20)
|
177
|
+
|
178
|
+
// { message: 'Не число' }
|
179
|
+
validate('string')
|
180
|
+
|
181
|
+
// { message: 'Некорректное число' }
|
182
|
+
validate(NaN)
|
183
|
+
|
184
|
+
// { message: 'Бесконечное число' }
|
185
|
+
validate(Infinity)
|
186
|
+
|
187
|
+
// { message: 'Обязательно' }
|
188
|
+
validate(undefined)
|
189
|
+
|
190
|
+
// { message: 'Обязательно' }
|
191
|
+
validate(null)
|
192
|
+
```
|
193
|
+
|
194
|
+
### min number
|
195
|
+
|
196
|
+
Позволяет указать ограничение на минимальное число.
|
197
|
+
|
198
|
+
```ts
|
199
|
+
import { number, min } from '@astral/validations';
|
200
|
+
|
201
|
+
const validate = number(min(1));
|
202
|
+
|
203
|
+
// undefined
|
204
|
+
validate(20)
|
205
|
+
|
206
|
+
// undefined
|
207
|
+
validate(1)
|
208
|
+
|
209
|
+
// { message: 'Не меньше: 1' }
|
210
|
+
validate(0)
|
211
|
+
```
|
212
|
+
|
213
|
+
---
|
214
|
+
|
215
|
+
### max number
|
216
|
+
|
217
|
+
Позволяет указать ограничение на максимальное число.
|
218
|
+
|
219
|
+
```ts
|
220
|
+
import { number, max } from '@astral/validations';
|
221
|
+
|
222
|
+
const validate = number(max(4));
|
223
|
+
|
224
|
+
// undefined
|
225
|
+
validate(4)
|
226
|
+
|
227
|
+
// undefined
|
228
|
+
validate(1)
|
229
|
+
|
230
|
+
// { message: 'Не больше: 4' }
|
231
|
+
validate(10)
|
232
|
+
```
|
233
|
+
|
234
|
+
---
|
235
|
+
|
236
|
+
## string
|
237
|
+
|
238
|
+
- Возвращает ошибку если:
|
239
|
+
- Тип value не string
|
240
|
+
- Проверяет value на required
|
241
|
+
- Выполняет композицию правил, переданных в параметры
|
242
|
+
|
243
|
+
```ts
|
244
|
+
import { string, min, onlyNumber } from '@astral/validations';
|
245
|
+
|
246
|
+
const validate = string(min(1), onlyNumber());
|
247
|
+
|
248
|
+
// undefined
|
249
|
+
validate('name')
|
250
|
+
|
251
|
+
// { message: 'Не является строкой' }
|
252
|
+
validate(20)
|
253
|
+
|
254
|
+
// { message: 'Обязательно' }
|
255
|
+
validate('')
|
256
|
+
// { message: 'Обязательно' }
|
257
|
+
validate(undefined)
|
258
|
+
// { message: 'Обязательно' }
|
259
|
+
validate(null)
|
260
|
+
```
|
261
|
+
|
262
|
+
### min string
|
263
|
+
|
264
|
+
Позволяет указать ограничение на минимальное количество символов в строке.
|
265
|
+
|
266
|
+
```ts
|
267
|
+
import { string, min } from '@astral/validations';
|
268
|
+
|
269
|
+
const validate = string(min(2));
|
270
|
+
|
271
|
+
// undefined
|
272
|
+
validate('vasya')
|
273
|
+
|
274
|
+
// undefined
|
275
|
+
validate('va')
|
276
|
+
|
277
|
+
// { message: 'Мин. символов: 2' }
|
278
|
+
validate('v')
|
279
|
+
```
|
280
|
+
|
281
|
+
---
|
282
|
+
|
283
|
+
### max string
|
284
|
+
|
285
|
+
Позволяет указать ограничение на максимальное количество символов в строке.
|
286
|
+
|
287
|
+
```ts
|
288
|
+
import { string, max } from '@astral/validations';
|
289
|
+
|
290
|
+
const validate = string(max(6));
|
291
|
+
|
292
|
+
// undefined
|
293
|
+
validate('hello')
|
294
|
+
|
295
|
+
// undefined
|
296
|
+
validate('va')
|
297
|
+
|
298
|
+
// { message: 'Макс. символов: 6' }
|
299
|
+
validate('long string')
|
300
|
+
```
|
301
|
+
|
302
|
+
---
|
303
|
+
|
304
|
+
### email
|
305
|
+
|
306
|
+
Проверяет валиден ли email. Не работает с русскими доменами
|
307
|
+
|
308
|
+
```ts
|
309
|
+
import { string, email } from '@astral/validations';
|
310
|
+
|
311
|
+
const validate = string(email());
|
312
|
+
|
313
|
+
// undefined
|
314
|
+
validate('example@mail.ru');
|
315
|
+
|
316
|
+
|
317
|
+
// { message: 'Некорректный E-mail' }
|
318
|
+
validate('example.ru');
|
319
|
+
|
320
|
+
//Пользовательское сообщение для ошибки с максимальным количеством символов
|
321
|
+
const validateEmail = email({ invalidLengthMessage: 'слишком длинный email' });
|
322
|
+
|
323
|
+
// { message: 'слишком длинный email' }
|
324
|
+
validateEmail('longlonglong.......')
|
325
|
+
```
|
326
|
+
|
327
|
+
---
|
328
|
+
|
329
|
+
### pattern
|
330
|
+
|
331
|
+
Проверяет строку на соответствие регулярному выражению.
|
332
|
+
|
333
|
+
```ts
|
334
|
+
import { string, pattern } from '@astral/validations';
|
335
|
+
|
336
|
+
const validate = string(
|
337
|
+
pattern(/word/g, { message: 'Должен быть word' })
|
338
|
+
);
|
339
|
+
|
340
|
+
// undefined
|
341
|
+
validate('word')
|
342
|
+
|
343
|
+
// { message: 'Должен быть word' }
|
344
|
+
validate('vasya')
|
345
|
+
```
|
346
|
+
|
347
|
+
---
|
348
|
+
|
349
|
+
### onlyNumber
|
350
|
+
|
351
|
+
Проверяет на наличие только чисел в строке
|
352
|
+
|
353
|
+
```ts
|
354
|
+
import { string, onlyNumber } from '@astral/validations';
|
355
|
+
|
356
|
+
const validate = string(onlyNumber());
|
357
|
+
|
358
|
+
// undefined
|
359
|
+
validate('12345')
|
360
|
+
|
361
|
+
// { message: 'Строка должна содержать только числа' }
|
362
|
+
validate('a12345')
|
363
|
+
validate('1.2345')
|
364
|
+
validate('-1.2345')
|
365
|
+
```
|
366
|
+
|
367
|
+
---
|
368
|
+
|
369
|
+
### snils
|
370
|
+
|
371
|
+
Проверяет валиден ли СНИЛС
|
372
|
+
|
373
|
+
```ts
|
374
|
+
import { string, snils } from '@astral/validations';
|
375
|
+
|
376
|
+
const validate = string(snils());
|
377
|
+
|
378
|
+
// undefined
|
379
|
+
validate('15657325992')
|
380
|
+
|
381
|
+
// { message: 'Некорректный СНИЛС' }
|
382
|
+
validate('95145370511')
|
383
|
+
validate('156-573-259 92')
|
384
|
+
```
|
385
|
+
|
386
|
+
:information_source: Поддерживает [exclude](#exclusion-managing)
|
387
|
+
|
388
|
+
---
|
389
|
+
|
390
|
+
### mobilePhone
|
391
|
+
|
392
|
+
- Проверяет валиден ли мобильный телефон
|
393
|
+
- Валидный телефон начинается с "79" и не содержит символов, кроме цифр.
|
394
|
+
|
395
|
+
```ts
|
396
|
+
import { string, mobilePhone } from '@astral/validations';
|
397
|
+
|
398
|
+
const validate = string(mobilePhone());
|
399
|
+
|
400
|
+
// undefined
|
401
|
+
validate('79999999999')
|
402
|
+
|
403
|
+
// { message: 'Некорректный номер телефона' }
|
404
|
+
validate('7 (999) 99-99-999')
|
405
|
+
validate('89999999999')
|
406
|
+
validate('+79999999999')
|
407
|
+
```
|
408
|
+
|
409
|
+
:information_source: Поддерживает [exclude](#exclusion-managing)
|
410
|
+
|
411
|
+
---
|
412
|
+
|
413
|
+
### innUL
|
414
|
+
|
415
|
+
Проверяет валиден ли ИНН ЮЛ
|
416
|
+
|
417
|
+
```ts
|
418
|
+
import { string, innUL } from '@astral/validations';
|
419
|
+
|
420
|
+
const validate = string(innUL());
|
421
|
+
|
422
|
+
// undefined
|
423
|
+
validate('7728168971')
|
424
|
+
|
425
|
+
// { message: 'Некорректный ИНН ЮЛ' }
|
426
|
+
validate('0000000000')
|
427
|
+
validate('384212952720')
|
428
|
+
validate('7728168911')
|
429
|
+
```
|
430
|
+
|
431
|
+
:information_source: Поддерживает [exclude](#exclusion-managing)
|
432
|
+
|
433
|
+
---
|
434
|
+
|
435
|
+
### innIP
|
436
|
+
|
437
|
+
Проверяет валиден ли ИНН ИП
|
438
|
+
|
439
|
+
```ts
|
440
|
+
import { string, innIP } from '@astral/validations';
|
441
|
+
|
442
|
+
const validate = string(innIP());
|
443
|
+
|
444
|
+
// undefined
|
445
|
+
validate('384212952720')
|
446
|
+
|
447
|
+
// { message: 'Некорректный ИНН ИП' }
|
448
|
+
validate('3842129527')
|
449
|
+
validate('384212952a20')
|
450
|
+
validate('+384212952720')
|
451
|
+
```
|
452
|
+
|
453
|
+
:information_source: Поддерживает [exclude](#exclusion-managing)
|
454
|
+
|
455
|
+
---
|
456
|
+
|
457
|
+
### kpp
|
458
|
+
|
459
|
+
Проверяет валиден ли КПП
|
460
|
+
|
461
|
+
```ts
|
462
|
+
import { string, kpp } from '@astral/validations';
|
463
|
+
|
464
|
+
const validate = string(kpp());
|
465
|
+
|
466
|
+
// undefined
|
467
|
+
validate('770201001');
|
468
|
+
|
469
|
+
// { message: 'Некорректный КПП' }
|
470
|
+
validate('123123')
|
471
|
+
validate('00000000')
|
472
|
+
```
|
473
|
+
|
474
|
+
:information_source: Поддерживает [exclude](#exclusion-managing)
|
475
|
+
|
476
|
+
---
|
477
|
+
|
478
|
+
### ogrnIP
|
479
|
+
|
480
|
+
Проверяет валиден ли ОГРН ИП
|
481
|
+
|
482
|
+
```ts
|
483
|
+
import { string, ogrnIP } from '@astral/validations';
|
484
|
+
|
485
|
+
const validate = string(ogrnIP());
|
486
|
+
|
487
|
+
// undefined
|
488
|
+
validate('8104338364837')
|
489
|
+
|
490
|
+
// { message: 'Некорректный ОГРН ИП' }
|
491
|
+
validate('1175958036814')
|
492
|
+
validate('1175958000004')
|
493
|
+
validate('1-22-33-44-5555555-6')
|
494
|
+
```
|
495
|
+
|
496
|
+
:information_source: Поддерживает [exclude](#exclusion-managing)
|
497
|
+
|
498
|
+
---
|
499
|
+
|
500
|
+
### ogrnUL
|
501
|
+
|
502
|
+
Проверяет валиден ли ОГРН ЮЛ
|
503
|
+
|
504
|
+
```ts
|
505
|
+
import { string, ogrnUL } from '@astral/validations';
|
506
|
+
|
507
|
+
const validate = string(ogrnUL());
|
508
|
+
|
509
|
+
// undefined
|
510
|
+
validate('1214000000092')
|
511
|
+
|
512
|
+
// { message: 'Некорректный ОГРН ЮЛ' }
|
513
|
+
validate('1175958036814')
|
514
|
+
validate('1175958000004')
|
515
|
+
validate('1-22-33-5555555-6')
|
516
|
+
```
|
517
|
+
|
518
|
+
:information_source: Поддерживает [exclude](#exclusion-managing)
|
519
|
+
|
520
|
+
---
|
521
|
+
|
522
|
+
## date
|
523
|
+
|
524
|
+
- Возвращает ошибку если:
|
525
|
+
- Тип value не является объектом Date
|
526
|
+
- Date является invalid date
|
527
|
+
- Проверяет value на required
|
528
|
+
- Выполняет композицию правил, переданных в параметры
|
529
|
+
|
530
|
+
```ts
|
531
|
+
import { date } from '@astral/validations';
|
532
|
+
|
533
|
+
const validate = date();
|
534
|
+
|
535
|
+
// undefined
|
536
|
+
validate(new Date());
|
537
|
+
|
538
|
+
// { message: 'Некорректная дата' }
|
539
|
+
validate(new Date('22.22.2022'));
|
540
|
+
|
541
|
+
// { message: 'Не дата' }
|
542
|
+
validate('12.12.2022');
|
543
|
+
|
544
|
+
// { message: 'Обязательно' }
|
545
|
+
validate(undefined);
|
546
|
+
```
|
547
|
+
|
548
|
+
### min date
|
549
|
+
|
550
|
+
Позволяет указать минимальную дату.
|
551
|
+
При сверке дат игнорируется время, которое может быть отличное от 00:00:00 в объекте Date.
|
552
|
+
|
553
|
+
```ts
|
554
|
+
import { date, min } from '@astral/validations';
|
555
|
+
|
556
|
+
const validate = date(
|
557
|
+
min(new Date('12-12-2022'), { message: 'Начиная с 12 января 2022 года' }),
|
558
|
+
);
|
559
|
+
|
560
|
+
// { message: 'Начиная с 12 января 2022 года' }
|
561
|
+
validate(new Date('12-11-2022'));
|
562
|
+
|
563
|
+
// undefined
|
564
|
+
validate(new Date('12-14-2022'));
|
565
|
+
|
566
|
+
```
|
567
|
+
|
568
|
+
---
|
569
|
+
|
570
|
+
### max date
|
571
|
+
|
572
|
+
Позволяет указать максимальную дату.
|
573
|
+
При сверке дат игнорируется время, которое может быть отличное от 00:00:00 в объекте Date.
|
574
|
+
|
575
|
+
```ts
|
576
|
+
import { date, max } from '@astral/validations';
|
577
|
+
|
578
|
+
const validate = date(
|
579
|
+
max(new Date('12-12-2022'), { message: 'Не позднее 12 января 2022 года' }),
|
580
|
+
);
|
581
|
+
|
582
|
+
// { message: 'Не позднее 12 января 2022 года' }
|
583
|
+
validate(new Date('15-11-2022'));
|
584
|
+
|
585
|
+
// undefined
|
586
|
+
validate(new Date('02-01-2021'));
|
587
|
+
|
588
|
+
```
|
589
|
+
|
590
|
+
---
|
591
|
+
|
592
|
+
## boolean
|
593
|
+
|
594
|
+
- Возвращает ошибку если:
|
595
|
+
- Тип value не boolean
|
596
|
+
- Проверяет value на required
|
597
|
+
- Выполняет композицию правил, переданных в параметры
|
598
|
+
|
599
|
+
```ts
|
600
|
+
import { boolean } from '@astral/validations';
|
601
|
+
|
602
|
+
const validate = boolean();
|
603
|
+
|
604
|
+
// undefined
|
605
|
+
validate(true)
|
606
|
+
|
607
|
+
// { message: 'Не boolean' }
|
608
|
+
validate('string')
|
609
|
+
|
610
|
+
// { message: 'Обязательно' }
|
611
|
+
validate(false)
|
612
|
+
|
613
|
+
// { message: 'Обязательно' }
|
614
|
+
validate(undefined)
|
615
|
+
|
616
|
+
// { message: 'Обязательно' }
|
617
|
+
validate(null)
|
618
|
+
```
|
619
|
+
|
620
|
+
---
|
621
|
+
|
622
|
+
## object
|
623
|
+
|
624
|
+
- Позволяет валидировать объект по схеме
|
625
|
+
- Возвращает ошибку если:
|
626
|
+
- Value не является простым объектом
|
627
|
+
- Свойства не соответсвуют переданной схеме валидации
|
628
|
+
- Возвращаем объект ошибок, соответсвующих ошибкам для свойств объекта
|
629
|
+
- Требует схему для валидации, свойства которой должны соответсвовать валидируемому values
|
630
|
+
|
631
|
+
```ts
|
632
|
+
import {
|
633
|
+
object,
|
634
|
+
array,
|
635
|
+
arrayItem,
|
636
|
+
string,
|
637
|
+
optional,
|
638
|
+
min,
|
639
|
+
number
|
640
|
+
} from '@astral/validations';
|
641
|
+
|
642
|
+
type User = {
|
643
|
+
name: string;
|
644
|
+
surname?: string;
|
645
|
+
info: {
|
646
|
+
permissions: Permission[];
|
647
|
+
};
|
648
|
+
};
|
649
|
+
|
650
|
+
const validate = object<User>({
|
651
|
+
name: string(),
|
652
|
+
surname: optional(string()),
|
653
|
+
info: object<User['info']>({
|
654
|
+
permissions: array(
|
655
|
+
arrayItem(
|
656
|
+
object<Permission>({
|
657
|
+
id: number(),
|
658
|
+
description: string(min(2)),
|
659
|
+
}),
|
660
|
+
),
|
661
|
+
),
|
662
|
+
}),
|
663
|
+
});
|
664
|
+
|
665
|
+
// undefined
|
666
|
+
validate({
|
667
|
+
name: 'Vasya',
|
668
|
+
info: {
|
669
|
+
permissions: [{ id: 1, description: 'my permission' }],
|
670
|
+
},
|
671
|
+
});
|
672
|
+
|
673
|
+
// Error in info.permissions.0.description: Обязательно
|
674
|
+
validate({
|
675
|
+
name: 'Vasya',
|
676
|
+
info: {
|
677
|
+
permissions: [{ id: 1 }],
|
678
|
+
},
|
679
|
+
});
|
680
|
+
```
|
681
|
+
|
682
|
+
### partial
|
683
|
+
|
684
|
+
Позволяет сделать все поля объекта optional.
|
685
|
+
|
686
|
+
```ts
|
687
|
+
import { partial, object, string } from '@astral/validations';
|
688
|
+
|
689
|
+
type Values = {
|
690
|
+
name: string;
|
691
|
+
surname: string;
|
692
|
+
};
|
693
|
+
|
694
|
+
const validateRequired = object<Values>({
|
695
|
+
name: string(),
|
696
|
+
surname: string()
|
697
|
+
})
|
698
|
+
|
699
|
+
// { message: 'Ошибка в свойстве name: Обязательно' }
|
700
|
+
validateRequired({});
|
701
|
+
|
702
|
+
const validatePartial = partial(
|
703
|
+
object<Values>({
|
704
|
+
name: string(),
|
705
|
+
surname: string()
|
706
|
+
})
|
707
|
+
);
|
708
|
+
|
709
|
+
// undefined
|
710
|
+
validatePartial({});
|
711
|
+
```
|
712
|
+
|
713
|
+
---
|
714
|
+
|
715
|
+
### deepPartial
|
716
|
+
|
717
|
+
Позволяет сделать гулбокий partial для свойсв всех объектов в схеме, включая объекты в массиве.
|
718
|
+
|
719
|
+
```ts
|
720
|
+
import {
|
721
|
+
object,
|
722
|
+
array,
|
723
|
+
arrayItem,
|
724
|
+
string,
|
725
|
+
deepPartial,
|
726
|
+
min,
|
727
|
+
number
|
728
|
+
} from '@astral/validations';
|
729
|
+
|
730
|
+
type Permission = {
|
731
|
+
id: number;
|
732
|
+
description: string;
|
733
|
+
};
|
734
|
+
|
735
|
+
type User = {
|
736
|
+
name: string;
|
737
|
+
surname?: string;
|
738
|
+
info: {
|
739
|
+
permissions: Permission[];
|
740
|
+
};
|
741
|
+
};
|
742
|
+
|
743
|
+
const validate = deepPartial(
|
744
|
+
object<User>({
|
745
|
+
name: string(),
|
746
|
+
surname: optional(string()),
|
747
|
+
info: object<User['info']>({
|
748
|
+
permissions: array(
|
749
|
+
arrayItem(
|
750
|
+
object<Permission>({
|
751
|
+
id: number(),
|
752
|
+
description: string(min(2)),
|
753
|
+
}),
|
754
|
+
),
|
755
|
+
),
|
756
|
+
}),
|
757
|
+
})
|
758
|
+
);
|
759
|
+
|
760
|
+
// undefined
|
761
|
+
validate({
|
762
|
+
info: [{ }],
|
763
|
+
});
|
764
|
+
```
|
765
|
+
|
766
|
+
---
|
767
|
+
|
768
|
+
## array
|
769
|
+
|
770
|
+
- Позволяет валидировать array
|
771
|
+
- Возвращает ошибку если:
|
772
|
+
- Value не является array
|
773
|
+
- Выполняет композицию правил, переданных в параметры
|
774
|
+
|
775
|
+
```ts
|
776
|
+
import {
|
777
|
+
array,
|
778
|
+
arrayItem,
|
779
|
+
min
|
780
|
+
} from '@astral/validations';
|
781
|
+
|
782
|
+
type User = {
|
783
|
+
name: string;
|
784
|
+
surname?: string;
|
785
|
+
};
|
786
|
+
|
787
|
+
const validate = array(
|
788
|
+
min(1),
|
789
|
+
arrayItem(
|
790
|
+
object<User>({
|
791
|
+
name: string(),
|
792
|
+
surname: optional(string()),
|
793
|
+
}),
|
794
|
+
),
|
795
|
+
);
|
796
|
+
|
797
|
+
// undefined
|
798
|
+
validate([{ name: 'Vasya' }]);
|
799
|
+
|
800
|
+
// { message: 'Не меньше: 1' }
|
801
|
+
validate([]);
|
802
|
+
|
803
|
+
// { cause: { errorArray: [{ name: { message: 'Не является строкой' } }] } }
|
804
|
+
validate([{ name: 22 }]);
|
805
|
+
```
|
806
|
+
|
807
|
+
### arrayItem
|
808
|
+
|
809
|
+
Применяет переданные правила валидации к каждому элементу массива.
|
810
|
+
|
811
|
+
```ts
|
812
|
+
import { array, arrayItem, object, string, optional } from '@astral/validations';
|
813
|
+
|
814
|
+
type User = {
|
815
|
+
name: string;
|
816
|
+
surname?: string;
|
817
|
+
};
|
818
|
+
|
819
|
+
const validate = array(
|
820
|
+
arrayItem(
|
821
|
+
object<User>({
|
822
|
+
name: string(),
|
823
|
+
surname: optional(string()),
|
824
|
+
}),
|
825
|
+
),
|
826
|
+
);
|
827
|
+
|
828
|
+
// undefined
|
829
|
+
validate([{ name: 'Vasya' }]);
|
830
|
+
|
831
|
+
// { cause: { errorArray: [{ name: { message: 'Не является строкой' } }] } }
|
832
|
+
validate([{ name: 22 }]);
|
833
|
+
```
|
834
|
+
|
835
|
+
```ts
|
836
|
+
import { array, arrayItem, string, min } from '@astral/validations';
|
837
|
+
|
838
|
+
const validate = array(arrayItem(string(min(3))));
|
839
|
+
|
840
|
+
// { cause: { arrayError: [undefined, { message: 'Мин. символов: 3' }] } }
|
841
|
+
validate(['vasya', 'ma']);
|
842
|
+
```
|
843
|
+
|
844
|
+
---
|
845
|
+
|
846
|
+
### min array
|
847
|
+
|
848
|
+
Позволяет указать ограничение на минимальное количество элементов в массиве.
|
849
|
+
|
850
|
+
```ts
|
851
|
+
import { array, min } from '@astral/validations';
|
852
|
+
|
853
|
+
const validate = array(min(1));
|
854
|
+
|
855
|
+
// { message: 'Не меньше: 1' }
|
856
|
+
validate([]);
|
857
|
+
|
858
|
+
// undefined
|
859
|
+
validate([1, 2]);
|
860
|
+
```
|
861
|
+
|
862
|
+
---
|
863
|
+
|
864
|
+
### max array
|
865
|
+
|
866
|
+
Позволяет указать ограничение на максимальное количество элементов в массиве.
|
867
|
+
|
868
|
+
```ts
|
869
|
+
import { array, max } from '@astral/validations';
|
870
|
+
|
871
|
+
const validate = array(max(3));
|
872
|
+
|
873
|
+
// { message: 'Не больше: 3' }
|
874
|
+
validate([1,2,3,4]);
|
875
|
+
|
876
|
+
// undefined
|
877
|
+
validate([1, 2]);
|
878
|
+
```
|
879
|
+
|
880
|
+
---
|
881
|
+
|
882
|
+
## any
|
883
|
+
|
884
|
+
Позволяет выключить любые проверки.
|
885
|
+
|
886
|
+
```ts
|
887
|
+
type Values = { name: string; isAgree: boolean };
|
888
|
+
|
889
|
+
const validate = object<Values, Values>({
|
890
|
+
name: when({
|
891
|
+
is: (_, ctx) => ctx.global.values.isAgree,
|
892
|
+
then: string(),
|
893
|
+
otherwise: any(),
|
894
|
+
}),
|
895
|
+
isAgree: optional(boolean()),
|
896
|
+
});
|
897
|
+
|
898
|
+
// undefined
|
899
|
+
const result1 = validate({ isAgree: false, name: '' });
|
900
|
+
|
901
|
+
// Required error для name
|
902
|
+
const result2 = validate({ isAgree: true, name: '' });
|
903
|
+
```
|
904
|
+
|
905
|
+
---
|
906
|
+
|
907
|
+
## Define. Переопределение дефолтных параметров guard
|
908
|
+
|
909
|
+
Каждый guard позволяет переопределить дефолтные параметры:
|
910
|
+
- Сообщение об ошибке типа
|
911
|
+
- Сообщение о ошибке required
|
912
|
+
- Уникальные для каждого guard параметры
|
913
|
+
|
914
|
+
```ts
|
915
|
+
import { string } from '@astral/validations';
|
916
|
+
|
917
|
+
const validateCustomString = string().define({
|
918
|
+
typeErrorMessage: 'Только строка',
|
919
|
+
requiredErrorMessage: 'Не может быть пустым',
|
920
|
+
});
|
921
|
+
|
922
|
+
// { message: 'Не может быть пустым' }
|
923
|
+
validateCustomString(undefined);
|
924
|
+
|
925
|
+
// { message: 'Только строка' }
|
926
|
+
validateCustomString(20);
|
927
|
+
```
|
928
|
+
|
929
|
+
---
|
930
|
+
|
931
|
+
# Custom rules
|
932
|
+
|
933
|
+
Каждый guard поддерживает кастомные правила.
|
934
|
+
|
935
|
+
## Базовый пример
|
936
|
+
|
937
|
+
```ts
|
938
|
+
import { string, object } from '@astral/validations';
|
939
|
+
|
940
|
+
type Values = {
|
941
|
+
name: string;
|
942
|
+
nickname: string;
|
943
|
+
};
|
944
|
+
|
945
|
+
const validate = object<Values>({
|
946
|
+
name: string(),
|
947
|
+
nickname: string((value, ctx) => {
|
948
|
+
if (value.includes('_')) {
|
949
|
+
return ctx.createError({
|
950
|
+
message: 'Символ "_" запрещен',
|
951
|
+
code: 'nickname-symbol',
|
952
|
+
});
|
953
|
+
}
|
954
|
+
|
955
|
+
return undefined;
|
956
|
+
}),
|
957
|
+
});
|
958
|
+
|
959
|
+
// { cause: { errorMap: { nickname: { message: 'Символ "_" запрещен', code: 'nickname-symbol' } } } }
|
960
|
+
validate({ name: 'Vasya', nickname: 'va_sya' });
|
961
|
+
```
|
962
|
+
|
963
|
+
## Связанные поля
|
964
|
+
|
965
|
+
В ```ctx.global.values``` находится value, принятое самым верхнеуровневым guard'ом.
|
966
|
+
|
967
|
+
```ts
|
968
|
+
import { object, string } from '@astral/validations';
|
969
|
+
|
970
|
+
type Values = {
|
971
|
+
password: string;
|
972
|
+
repeatPassword: string;
|
973
|
+
};
|
974
|
+
|
975
|
+
const validate = object<Values, Values>({
|
976
|
+
password: string(min(9)),
|
977
|
+
repeatPassword: string<Values>(min(9), (value, ctx) => {
|
978
|
+
if (value !== ctx.global.values.password) {
|
979
|
+
return ctx.createError({
|
980
|
+
message: 'Пароли не совпадают',
|
981
|
+
code: 'repeat-password',
|
982
|
+
});
|
983
|
+
}
|
984
|
+
|
985
|
+
return undefined;
|
986
|
+
}),
|
987
|
+
});
|
988
|
+
|
989
|
+
// Error.message "Пароли не совпадают" для repeatPassword
|
990
|
+
validate({ password: 'qywerty123', repeatPassword: 'qywerty1234' });
|
991
|
+
```
|
992
|
+
|
993
|
+
## Переиспользуемое правило
|
994
|
+
|
995
|
+
```ts
|
996
|
+
import { createRule, string } from '@astral/validations';
|
997
|
+
|
998
|
+
type Params = {
|
999
|
+
message?: string;
|
1000
|
+
};
|
1001
|
+
|
1002
|
+
const includesWorld = <TValues>(params: Params) =>
|
1003
|
+
createRule<string, TValues>((value, ctx) => {
|
1004
|
+
if (value.includes('world')) {
|
1005
|
+
return undefined;
|
1006
|
+
}
|
1007
|
+
|
1008
|
+
return ctx.createError({
|
1009
|
+
message: params?.message || 'Должен содержать "world"',
|
1010
|
+
code: 'includes-word',
|
1011
|
+
});
|
1012
|
+
});
|
1013
|
+
|
1014
|
+
const validate = string(includesWorld());
|
1015
|
+
|
1016
|
+
// undefined
|
1017
|
+
validate('Hello world');
|
1018
|
+
|
1019
|
+
// { message: 'Должен содержать "world"' }
|
1020
|
+
validate('Hello');
|
1021
|
+
|
1022
|
+
// { message: 'Должен содержать "world"' }
|
1023
|
+
includesWorld()('Hello')
|
1024
|
+
```
|
1025
|
+
|
1026
|
+
---
|
1027
|
+
|
1028
|
+
# Common
|
1029
|
+
|
1030
|
+
## optional
|
1031
|
+
|
1032
|
+
Выключает дефолтную проверку на required в guard.
|
1033
|
+
|
1034
|
+
```ts
|
1035
|
+
import { optional, object, string, boolean, array } from '@astral/validations';
|
1036
|
+
|
1037
|
+
type Values = {
|
1038
|
+
name: string;
|
1039
|
+
surname?: string;
|
1040
|
+
permissions?: number[];
|
1041
|
+
isAuth?: boolean;
|
1042
|
+
};
|
1043
|
+
|
1044
|
+
const validate = object<Values>({
|
1045
|
+
name: string(),
|
1046
|
+
surname: optional(string()),
|
1047
|
+
permissions: optional(array(string())),
|
1048
|
+
isAuth: optional(boolean()),
|
1049
|
+
})
|
1050
|
+
|
1051
|
+
// undefined
|
1052
|
+
validate({
|
1053
|
+
name: 'Vasya',
|
1054
|
+
surname: '',
|
1055
|
+
isAuth: false,
|
1056
|
+
});
|
1057
|
+
```
|
1058
|
+
|
1059
|
+
---
|
1060
|
+
|
1061
|
+
## when. Условная валидация
|
1062
|
+
|
1063
|
+
Позволяет определять условные валидации.
|
1064
|
+
|
1065
|
+
```ts
|
1066
|
+
type Values = { name: string; isAgree: boolean };
|
1067
|
+
|
1068
|
+
const validate = object<Values, Values>({
|
1069
|
+
name: when({
|
1070
|
+
is: (_, ctx) => ctx.global.values.isAgree,
|
1071
|
+
then: string(),
|
1072
|
+
otherwise: any(),
|
1073
|
+
}),
|
1074
|
+
isAgree: optional(boolean()),
|
1075
|
+
});
|
1076
|
+
|
1077
|
+
// undefined
|
1078
|
+
const result1 = validate({ isAgree: false, name: '' });
|
1079
|
+
|
1080
|
+
// Required error для name
|
1081
|
+
const result2 = validate({ isAgree: true, name: '' });
|
1082
|
+
```
|
1083
|
+
|
1084
|
+
When для ветки объекта:
|
1085
|
+
```ts
|
1086
|
+
type ValuesInfo = { surname: string };
|
1087
|
+
|
1088
|
+
type Values = {
|
1089
|
+
name: string;
|
1090
|
+
info?: ValuesInfo;
|
1091
|
+
};
|
1092
|
+
|
1093
|
+
const validate = object<Values, Values>({
|
1094
|
+
name: string(),
|
1095
|
+
info: when<Values>({
|
1096
|
+
is: (_, ctx) => ctx.global.values.name === 'Vasya',
|
1097
|
+
then: object<ValuesInfo>({ surname: string() }),
|
1098
|
+
otherwise: any(),
|
1099
|
+
}),
|
1100
|
+
});
|
1101
|
+
|
1102
|
+
// Error.message "Обязательно" для info
|
1103
|
+
validate({ name: 'Vasya' });
|
1104
|
+
|
1105
|
+
// undefined
|
1106
|
+
validate({ name: 'Kolya' });
|
1107
|
+
|
1108
|
+
```
|
1109
|
+
|
1110
|
+
---
|
1111
|
+
|
1112
|
+
## transform
|
1113
|
+
|
1114
|
+
Позволяет изменять value в цепочке композиции.
|
1115
|
+
|
1116
|
+
```ts
|
1117
|
+
import { transform, date, min } from '@astral/validations';
|
1118
|
+
|
1119
|
+
const validate = string(
|
1120
|
+
transform((value) => new Date(value), date(min(new Date()))),
|
1121
|
+
);
|
1122
|
+
|
1123
|
+
// { message: 'Некорректная дата' }
|
1124
|
+
validate('22.22.2022');
|
1125
|
+
|
1126
|
+
// undefined
|
1127
|
+
validate('12.12.2022');
|
1128
|
+
```
|
1129
|
+
|
1130
|
+
---
|
1131
|
+
|
1132
|
+
## or
|
1133
|
+
|
1134
|
+
Выполняет переданные правила аналогично оператору ||. Если одно из правил не завершилось ошибкой, то or вернет undefined.
|
1135
|
+
Если все переданные правила завершились с ошибкой, то вернется ошибка из последнего правила
|
1136
|
+
|
1137
|
+
```ts
|
1138
|
+
import { or, array, string, number } from '@astral/validations';
|
1139
|
+
|
1140
|
+
const validate = or(string(), array(), number());
|
1141
|
+
|
1142
|
+
// undefined
|
1143
|
+
validate('string')
|
1144
|
+
|
1145
|
+
// undefined
|
1146
|
+
validate([])
|
1147
|
+
|
1148
|
+
// undefined
|
1149
|
+
validate(20)
|
1150
|
+
|
1151
|
+
// { message: 'Не число' }
|
1152
|
+
validate(new Date())
|
1153
|
+
```
|
1154
|
+
|
1155
|
+
---
|
1156
|
+
|
1157
|
+
# Integrations
|
1158
|
+
|
1159
|
+
## react-hook-form
|
1160
|
+
|
1161
|
+
Для интеграции с react-hook-form необходимо использовать пакет ```@astral/validations-react-hook-form-resolver```.
|
1162
|
+
|
1163
|
+
```tsx
|
1164
|
+
import { object, string, optional } from '@astral/validations';
|
1165
|
+
import { resolver } from '@astral/validations-react-hook-form-resolver';
|
1166
|
+
import { useForm } from 'react-hook-form';
|
1167
|
+
|
1168
|
+
type Values = {
|
1169
|
+
name: string;
|
1170
|
+
info: { description?: string }
|
1171
|
+
};
|
1172
|
+
|
1173
|
+
const validationSchema = object<Values>({
|
1174
|
+
name: string(),
|
1175
|
+
info: object<Values['info']>({
|
1176
|
+
description: optional(string()),
|
1177
|
+
}),
|
1178
|
+
});
|
1179
|
+
|
1180
|
+
const Form = () => {
|
1181
|
+
const { register, handleSubmit, formState } = useForm<Values>({
|
1182
|
+
resolver: resolver<Values>(validationSchema),
|
1183
|
+
});
|
1184
|
+
|
1185
|
+
return (
|
1186
|
+
<form onSubmit={handleSubmit(() => {})}>
|
1187
|
+
<input {...register('name')} />
|
1188
|
+
{formState.errors.name && (
|
1189
|
+
<p>{formState.errors.name.message}</p>
|
1190
|
+
)}
|
1191
|
+
<input {...register('info.description')} />
|
1192
|
+
{formState.errors.info?.description && (
|
1193
|
+
<p>{formState.errors.info.description.message}</p>
|
1194
|
+
)}
|
1195
|
+
<button type="submit">submit</button>
|
1196
|
+
</form>
|
1197
|
+
);
|
1198
|
+
};
|
1199
|
+
```
|
1200
|
+
|
1201
|
+
# Error message customization
|
1202
|
+
|
1203
|
+
Сообщения об ошибках по умолчанию могут быть заменены на пользовательские.
|
1204
|
+
Для этого необходимо использовать параметры `message` или `getMessage` у валидационных методов:
|
1205
|
+
|
1206
|
+
```ts
|
1207
|
+
//getMessage
|
1208
|
+
const validateMin = number(min(10, {
|
1209
|
+
getMessage: (threshold, value, ctx) => {
|
1210
|
+
return `Слишком мало, минимум ${threshold}`
|
1211
|
+
}
|
1212
|
+
}));
|
1213
|
+
// { message: 'Слишком мало, минимум 10' }
|
1214
|
+
validateMin(5);
|
1215
|
+
|
1216
|
+
//message
|
1217
|
+
const validateKPP = string(kpp({ message: 'Что-то не так с кодом КПП' }));
|
1218
|
+
// { message: 'Что-то не так с кодом КПП' }
|
1219
|
+
validateKPP('123123');
|
1220
|
+
```
|
1221
|
+
|
1222
|
+
---
|
1223
|
+
|
1224
|
+
# Exclusion managing
|
1225
|
+
|
1226
|
+
Метод `exclude` предоставляет возможность обхода валидации для конкретного значения.
|
1227
|
+
Если функция вернет `true`,
|
1228
|
+
текущее значение не будет провалидировано, метод валидации вернет `undefined`.
|
1229
|
+
|
1230
|
+
Пример реализации:
|
1231
|
+
|
1232
|
+
```ts
|
1233
|
+
//значение для обхода валидации (исключение)
|
1234
|
+
const excludeValue = '0101010101';
|
1235
|
+
//функция для обработки исключения
|
1236
|
+
const isExclude = (value: string) => {
|
1237
|
+
const excluded: string[] = [excludeValue];
|
1238
|
+
|
1239
|
+
return excluded.includes(value);
|
1240
|
+
};
|
1241
|
+
|
1242
|
+
const validate = string(kpp({ exclude: isExclude }));
|
1243
|
+
// undefined (значение не будет провалидировано)
|
1244
|
+
validate(excludeValue);
|
1245
|
+
```
|