@astral/validations 2.26.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.
Files changed (316) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1243 -1
  3. package/any/any.d.ts +21 -0
  4. package/any/any.js +14 -0
  5. package/any/index.d.ts +1 -0
  6. package/any/index.js +1 -0
  7. package/array/array.d.ts +15 -0
  8. package/array/array.js +21 -0
  9. package/array/constants.d.ts +2 -0
  10. package/array/constants.js +5 -0
  11. package/array/index.d.ts +2 -0
  12. package/array/index.js +2 -0
  13. package/arrayItem/arrayItem.d.ts +35 -0
  14. package/arrayItem/arrayItem.js +33 -0
  15. package/arrayItem/index.d.ts +1 -0
  16. package/arrayItem/index.js +1 -0
  17. package/boolean/boolean.d.ts +13 -0
  18. package/boolean/boolean.js +19 -0
  19. package/boolean/constants.d.ts +2 -0
  20. package/boolean/constants.js +5 -0
  21. package/boolean/index.d.ts +2 -0
  22. package/boolean/index.js +2 -0
  23. package/core/compose/compose.d.ts +6 -0
  24. package/{compose → core/compose}/compose.js +2 -3
  25. package/core/context/createContext/createContext.d.ts +8 -0
  26. package/core/context/createContext/createContext.js +15 -0
  27. package/core/context/createContext/index.d.ts +1 -0
  28. package/core/context/createContext/index.js +1 -0
  29. package/core/context/index.d.ts +2 -0
  30. package/core/context/index.js +2 -0
  31. package/core/context/types.d.ts +28 -0
  32. package/core/errors/ArrayError/ArrayError.d.ts +18 -0
  33. package/core/errors/ArrayError/ArrayError.js +10 -0
  34. package/core/errors/ArrayError/createArrayError/createArrayError.d.ts +5 -0
  35. package/core/errors/ArrayError/createArrayError/createArrayError.js +11 -0
  36. package/core/errors/ArrayError/createArrayError/index.d.ts +1 -0
  37. package/core/errors/ArrayError/createArrayError/index.js +1 -0
  38. package/core/errors/ArrayError/index.d.ts +2 -0
  39. package/core/errors/ArrayError/index.js +2 -0
  40. package/core/errors/ErrorMap/ErrorMap.d.ts +21 -0
  41. package/core/errors/ErrorMap/ErrorMap.js +10 -0
  42. package/core/errors/ErrorMap/createErrorMap/createErrorMap.d.ts +5 -0
  43. package/core/errors/ErrorMap/createErrorMap/createErrorMap.js +10 -0
  44. package/core/errors/ErrorMap/createErrorMap/index.d.ts +1 -0
  45. package/core/errors/ErrorMap/createErrorMap/index.js +1 -0
  46. package/core/errors/ErrorMap/index.d.ts +2 -0
  47. package/core/errors/ErrorMap/index.js +2 -0
  48. package/core/errors/SimpleError/SimpleError.d.ts +16 -0
  49. package/core/errors/SimpleError/SimpleError.js +9 -0
  50. package/core/errors/SimpleError/createSimpleError/createSimpleError.d.ts +6 -0
  51. package/core/errors/SimpleError/createSimpleError/createSimpleError.js +5 -0
  52. package/core/errors/SimpleError/createSimpleError/index.d.ts +1 -0
  53. package/core/errors/SimpleError/createSimpleError/index.js +1 -0
  54. package/core/errors/SimpleError/index.d.ts +2 -0
  55. package/core/errors/SimpleError/index.js +2 -0
  56. package/core/errors/createErrorCode/createErrorCode.d.ts +5 -0
  57. package/core/errors/createErrorCode/createErrorCode.js +4 -0
  58. package/core/errors/createErrorCode/index.d.ts +1 -0
  59. package/core/errors/createErrorCode/index.js +1 -0
  60. package/core/errors/index.d.ts +5 -0
  61. package/core/errors/index.js +5 -0
  62. package/core/errors/types.d.ts +18 -0
  63. package/core/errors/types.js +1 -0
  64. package/core/guard/createGuard/createGuard.d.ts +54 -0
  65. package/core/guard/createGuard/createGuard.js +41 -0
  66. package/core/guard/createGuard/index.d.ts +1 -0
  67. package/core/guard/createGuard/index.js +1 -0
  68. package/core/guard/index.d.ts +1 -0
  69. package/core/guard/index.js +1 -0
  70. package/core/index.d.ts +8 -0
  71. package/core/index.js +8 -0
  72. package/core/rule/createRule/createRule.d.ts +42 -0
  73. package/core/rule/createRule/createRule.js +27 -0
  74. package/core/rule/index.d.ts +3 -0
  75. package/core/rule/index.js +3 -0
  76. package/core/rule/required/constants.d.ts +2 -0
  77. package/core/rule/required/constants.js +5 -0
  78. package/core/rule/required/index.d.ts +2 -0
  79. package/core/rule/required/index.js +2 -0
  80. package/core/rule/required/required.d.ts +19 -0
  81. package/core/rule/required/required.js +25 -0
  82. package/core/rule/types.d.ts +15 -0
  83. package/core/rule/types.js +1 -0
  84. package/core/types.d.ts +9 -0
  85. package/core/types.js +1 -0
  86. package/{utils → core/utils}/index.d.ts +1 -1
  87. package/{utils → core/utils}/index.js +1 -1
  88. package/core/utils/isStringOfZeros/index.d.ts +1 -0
  89. package/core/utils/isStringOfZeros/index.js +1 -0
  90. package/{utils → core/utils/isStringOfZeros}/isStringOfZeros.d.ts +1 -1
  91. package/{utils → core/utils/isStringOfZeros}/isStringOfZeros.js +1 -1
  92. package/core/utils/resetTime/index.d.ts +1 -0
  93. package/core/utils/resetTime/index.js +1 -0
  94. package/core/utils/resetTime/resetTime.d.ts +5 -0
  95. package/core/utils/resetTime/resetTime.js +12 -0
  96. package/date/constants.d.ts +3 -0
  97. package/date/constants.js +9 -0
  98. package/date/date.d.ts +19 -0
  99. package/date/date.js +24 -0
  100. package/date/index.d.ts +1 -0
  101. package/date/index.js +1 -0
  102. package/deepPartial/deepPartial.d.ts +29 -0
  103. package/deepPartial/deepPartial.js +21 -0
  104. package/deepPartial/index.d.ts +1 -0
  105. package/deepPartial/index.js +1 -0
  106. package/email/constants.d.ts +5 -0
  107. package/email/constants.js +11 -0
  108. package/email/email.d.ts +28 -0
  109. package/email/email.js +19 -0
  110. package/email/index.d.ts +2 -0
  111. package/email/index.js +2 -0
  112. package/index.d.ts +24 -20
  113. package/index.js +24 -20
  114. package/innIP/constants.d.ts +5 -0
  115. package/innIP/constants.js +8 -0
  116. package/innIP/index.d.ts +2 -0
  117. package/innIP/index.js +2 -0
  118. package/innIP/innIP.d.ts +25 -0
  119. package/innIP/innIP.js +40 -0
  120. package/innUL/constants.d.ts +4 -0
  121. package/innUL/constants.js +7 -0
  122. package/innUL/index.d.ts +2 -0
  123. package/innUL/index.js +2 -0
  124. package/innUL/innUL.d.ts +25 -0
  125. package/innUL/innUL.js +36 -0
  126. package/kpp/constants.d.ts +3 -0
  127. package/kpp/constants.js +6 -0
  128. package/kpp/index.d.ts +2 -0
  129. package/kpp/index.js +2 -0
  130. package/kpp/kpp.d.ts +25 -0
  131. package/kpp/kpp.js +16 -0
  132. package/max/constants.d.ts +5 -0
  133. package/max/constants.js +5 -0
  134. package/max/index.d.ts +2 -0
  135. package/max/index.js +2 -0
  136. package/max/max.d.ts +26 -0
  137. package/max/max.js +42 -0
  138. package/min/constants.d.ts +5 -0
  139. package/min/constants.js +5 -0
  140. package/min/index.d.ts +2 -0
  141. package/min/index.js +2 -0
  142. package/min/min.d.ts +26 -0
  143. package/min/min.js +42 -0
  144. package/mobilePhone/constants.d.ts +3 -0
  145. package/mobilePhone/constants.js +6 -0
  146. package/mobilePhone/index.d.ts +2 -0
  147. package/mobilePhone/index.js +2 -0
  148. package/mobilePhone/mobilePhone.d.ts +27 -0
  149. package/mobilePhone/mobilePhone.js +21 -0
  150. package/number/constants.d.ts +4 -0
  151. package/number/constants.js +13 -0
  152. package/number/index.d.ts +2 -0
  153. package/number/index.js +2 -0
  154. package/number/number.d.ts +19 -0
  155. package/number/number.js +26 -0
  156. package/object/constants.d.ts +2 -0
  157. package/object/constants.js +5 -0
  158. package/object/index.d.ts +2 -0
  159. package/object/index.js +2 -0
  160. package/object/isEmptyErrors/index.d.ts +1 -0
  161. package/object/isEmptyErrors/index.js +1 -0
  162. package/object/isEmptyErrors/isEmptyErrors.d.ts +5 -0
  163. package/object/isEmptyErrors/isEmptyErrors.js +4 -0
  164. package/object/object.d.ts +52 -0
  165. package/object/object.js +50 -0
  166. package/ogrnIP/constants.d.ts +3 -0
  167. package/ogrnIP/constants.js +6 -0
  168. package/ogrnIP/index.d.ts +2 -0
  169. package/ogrnIP/index.js +2 -0
  170. package/ogrnIP/ogrnIP.d.ts +25 -0
  171. package/ogrnIP/ogrnIP.js +27 -0
  172. package/ogrnUL/constants.d.ts +3 -0
  173. package/ogrnUL/constants.js +6 -0
  174. package/ogrnUL/index.d.ts +2 -0
  175. package/ogrnUL/index.js +2 -0
  176. package/ogrnUL/ogrnUL.d.ts +25 -0
  177. package/ogrnUL/ogrnUL.js +27 -0
  178. package/onlyNumber/constants.d.ts +2 -0
  179. package/onlyNumber/constants.js +2 -0
  180. package/onlyNumber/index.d.ts +2 -0
  181. package/onlyNumber/index.js +2 -0
  182. package/onlyNumber/onlyNumber.d.ts +24 -0
  183. package/onlyNumber/onlyNumber.js +20 -0
  184. package/optional/index.d.ts +1 -0
  185. package/optional/index.js +1 -0
  186. package/optional/optional.d.ts +7 -0
  187. package/optional/optional.js +15 -0
  188. package/or/index.d.ts +1 -0
  189. package/or/index.js +1 -0
  190. package/or/or.d.ts +22 -0
  191. package/or/or.js +21 -0
  192. package/package.json +2 -2
  193. package/partial/index.d.ts +1 -0
  194. package/partial/index.js +1 -0
  195. package/partial/partial.d.ts +10 -0
  196. package/partial/partial.js +6 -0
  197. package/pattern/constants.d.ts +2 -0
  198. package/pattern/constants.js +2 -0
  199. package/pattern/index.d.ts +2 -0
  200. package/pattern/index.js +2 -0
  201. package/pattern/pattern.d.ts +26 -0
  202. package/pattern/pattern.js +22 -0
  203. package/snils/constants.d.ts +4 -0
  204. package/snils/constants.js +7 -0
  205. package/snils/index.d.ts +2 -0
  206. package/snils/index.js +2 -0
  207. package/snils/snils.d.ts +25 -0
  208. package/{isSNILS/isSNILS.js → snils/snils.js} +20 -21
  209. package/string/constants.d.ts +2 -0
  210. package/string/constants.js +5 -0
  211. package/string/index.d.ts +2 -0
  212. package/string/index.js +2 -0
  213. package/string/string.d.ts +2 -0
  214. package/string/string.js +8 -0
  215. package/toPlainError/index.d.ts +1 -0
  216. package/toPlainError/index.js +1 -0
  217. package/toPlainError/toPlainError.d.ts +35 -0
  218. package/toPlainError/toPlainError.js +49 -0
  219. package/toPlainError/utils/generateArrayPath/generateArrayPath.d.ts +4 -0
  220. package/toPlainError/utils/generateArrayPath/generateArrayPath.js +9 -0
  221. package/toPlainError/utils/generateArrayPath/index.d.ts +1 -0
  222. package/toPlainError/utils/generateArrayPath/index.js +1 -0
  223. package/toPlainError/utils/generateObjectPath/generateObjectPath.d.ts +4 -0
  224. package/toPlainError/utils/generateObjectPath/generateObjectPath.js +9 -0
  225. package/toPlainError/utils/generateObjectPath/index.d.ts +1 -0
  226. package/toPlainError/utils/generateObjectPath/index.js +1 -0
  227. package/toPlainError/utils/index.d.ts +2 -0
  228. package/toPlainError/utils/index.js +2 -0
  229. package/transform/index.d.ts +1 -0
  230. package/transform/index.js +1 -0
  231. package/transform/transform.d.ts +26 -0
  232. package/transform/transform.js +16 -0
  233. package/when/index.d.ts +1 -0
  234. package/when/index.js +1 -0
  235. package/when/when.d.ts +47 -0
  236. package/when/when.js +29 -0
  237. package/compose/compose.d.ts +0 -7
  238. package/composeSome/composeSome.d.ts +0 -8
  239. package/composeSome/composeSome.js +0 -25
  240. package/composeSome/index.d.ts +0 -1
  241. package/composeSome/index.js +0 -1
  242. package/constants.d.ts +0 -2
  243. package/constants.js +0 -2
  244. package/createRule/createRule.d.ts +0 -14
  245. package/createRule/createRule.js +0 -12
  246. package/isDate/index.d.ts +0 -1
  247. package/isDate/index.js +0 -1
  248. package/isDate/isDate.d.ts +0 -10
  249. package/isDate/isDate.js +0 -23
  250. package/isEmail/index.d.ts +0 -1
  251. package/isEmail/index.js +0 -1
  252. package/isEmail/isEmail.d.ts +0 -13
  253. package/isEmail/isEmail.js +0 -25
  254. package/isINNIP/index.d.ts +0 -1
  255. package/isINNIP/index.js +0 -1
  256. package/isINNIP/isINNIP.d.ts +0 -10
  257. package/isINNIP/isINNIP.js +0 -42
  258. package/isINNUL/index.d.ts +0 -1
  259. package/isINNUL/index.js +0 -1
  260. package/isINNUL/isINNUL.d.ts +0 -10
  261. package/isINNUL/isINNUL.js +0 -37
  262. package/isKPP/index.d.ts +0 -1
  263. package/isKPP/index.js +0 -1
  264. package/isKPP/isKPP.d.ts +0 -7
  265. package/isKPP/isKPP.js +0 -19
  266. package/isMaxLength/index.d.ts +0 -1
  267. package/isMaxLength/index.js +0 -1
  268. package/isMaxLength/isMaxLength.d.ts +0 -18
  269. package/isMaxLength/isMaxLength.js +0 -34
  270. package/isMaxValue/index.d.ts +0 -1
  271. package/isMaxValue/index.js +0 -1
  272. package/isMaxValue/isMaxValue.d.ts +0 -17
  273. package/isMaxValue/isMaxValue.js +0 -35
  274. package/isMaybeNumber/index.d.ts +0 -1
  275. package/isMaybeNumber/index.js +0 -1
  276. package/isMaybeNumber/isMaybeNumber.d.ts +0 -10
  277. package/isMaybeNumber/isMaybeNumber.js +0 -23
  278. package/isMinLength/index.d.ts +0 -1
  279. package/isMinLength/index.js +0 -1
  280. package/isMinLength/isMinLength.d.ts +0 -18
  281. package/isMinLength/isMinLength.js +0 -34
  282. package/isMinValue/index.d.ts +0 -1
  283. package/isMinValue/index.js +0 -1
  284. package/isMinValue/isMinValue.d.ts +0 -17
  285. package/isMinValue/isMinValue.js +0 -35
  286. package/isMobilePhone/index.d.ts +0 -1
  287. package/isMobilePhone/index.js +0 -1
  288. package/isMobilePhone/isMobilePhone.d.ts +0 -10
  289. package/isMobilePhone/isMobilePhone.js +0 -20
  290. package/isOGRNIP/index.d.ts +0 -1
  291. package/isOGRNIP/index.js +0 -1
  292. package/isOGRNIP/isOGRNIP.d.ts +0 -10
  293. package/isOGRNIP/isOGRNIP.js +0 -29
  294. package/isOGRNUL/index.d.ts +0 -1
  295. package/isOGRNUL/index.js +0 -1
  296. package/isOGRNUL/isOGRNUL.d.ts +0 -10
  297. package/isOGRNUL/isOGRNUL.js +0 -29
  298. package/isRequired/index.d.ts +0 -1
  299. package/isRequired/index.js +0 -1
  300. package/isRequired/isRequired.d.ts +0 -11
  301. package/isRequired/isRequired.js +0 -23
  302. package/isSNILS/index.d.ts +0 -1
  303. package/isSNILS/index.js +0 -1
  304. package/isSNILS/isSNILS.d.ts +0 -10
  305. package/types.d.ts +0 -4
  306. package/utils/isEmptyString.d.ts +0 -4
  307. package/utils/isEmptyString.js +0 -6
  308. package/yupAdapter/index.d.ts +0 -1
  309. package/yupAdapter/index.js +0 -1
  310. package/yupAdapter/yupAdapter.d.ts +0 -8
  311. package/yupAdapter/yupAdapter.js +0 -11
  312. /package/{compose → core/compose}/index.d.ts +0 -0
  313. /package/{compose → core/compose}/index.js +0 -0
  314. /package/{types.js → core/context/types.js} +0 -0
  315. /package/{createRule → core/rule/createRule}/index.d.ts +0 -0
  316. /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
+ ```