@astral/validations 3.3.0 → 4.1.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 (79) hide show
  1. package/README.md +129 -18
  2. package/any/any.d.ts +1 -1
  3. package/array/array.d.ts +2 -2
  4. package/arrayItem/arrayItem.d.ts +1 -1
  5. package/boolean/boolean.d.ts +2 -2
  6. package/core/compose/compose.d.ts +1 -1
  7. package/core/context/createContext/createContext.d.ts +2 -2
  8. package/core/context/createContext/createContext.js +7 -2
  9. package/core/context/types.d.ts +6 -2
  10. package/core/guard/createGuard/createGuard.d.ts +7 -7
  11. package/core/guard/createGuard/createGuard.js +1 -1
  12. package/core/rule/createRule/createRule.d.ts +3 -3
  13. package/core/rule/required/required.d.ts +1 -1
  14. package/core/rule/types.d.ts +3 -3
  15. package/core/utils/index.d.ts +4 -0
  16. package/core/utils/index.js +4 -0
  17. package/core/utils/isFullNameValidCharacters/index.d.ts +1 -0
  18. package/core/utils/isFullNameValidCharacters/index.js +1 -0
  19. package/core/utils/isFullNameValidCharacters/isFullNameValidCharacters.d.ts +5 -0
  20. package/core/utils/isFullNameValidCharacters/isFullNameValidCharacters.js +5 -0
  21. package/core/utils/isHasConsecutiveChars/index.d.ts +1 -0
  22. package/core/utils/isHasConsecutiveChars/index.js +1 -0
  23. package/core/utils/isHasConsecutiveChars/isHasConsecutiveChars.d.ts +4 -0
  24. package/core/utils/isHasConsecutiveChars/isHasConsecutiveChars.js +4 -0
  25. package/core/utils/isStartsWithAndEndsWithLetter/index.d.ts +1 -0
  26. package/core/utils/isStartsWithAndEndsWithLetter/index.js +1 -0
  27. package/core/utils/isStartsWithAndEndsWithLetter/isStartsWithAndEndsWithLetter.d.ts +4 -0
  28. package/core/utils/isStartsWithAndEndsWithLetter/isStartsWithAndEndsWithLetter.js +4 -0
  29. package/core/utils/isValidFullNameLength/index.d.ts +1 -0
  30. package/core/utils/isValidFullNameLength/index.js +1 -0
  31. package/core/utils/isValidFullNameLength/isValidFullNameLength.d.ts +4 -0
  32. package/core/utils/isValidFullNameLength/isValidFullNameLength.js +4 -0
  33. package/date/date.d.ts +2 -2
  34. package/deepPartial/deepPartial.d.ts +1 -1
  35. package/email/email.d.ts +1 -1
  36. package/index.d.ts +3 -0
  37. package/index.js +3 -0
  38. package/innIP/innIP.d.ts +1 -1
  39. package/innUL/innUL.d.ts +1 -1
  40. package/integer/integer.d.ts +1 -1
  41. package/kpp/kpp.d.ts +1 -1
  42. package/max/max.d.ts +3 -3
  43. package/min/min.d.ts +3 -3
  44. package/mobilePhone/mobilePhone.d.ts +1 -1
  45. package/number/number.d.ts +2 -2
  46. package/object/object.d.ts +8 -8
  47. package/object/object.js +5 -4
  48. package/ogrnIP/ogrnIP.d.ts +1 -1
  49. package/ogrnUL/ogrnUL.d.ts +1 -1
  50. package/onlyNumber/onlyNumber.d.ts +1 -1
  51. package/optional/optional.d.ts +1 -1
  52. package/or/or.d.ts +1 -1
  53. package/package.json +1 -1
  54. package/partial/partial.d.ts +1 -1
  55. package/pattern/pattern.d.ts +1 -1
  56. package/personName/constants.d.ts +2 -0
  57. package/personName/constants.js +5 -0
  58. package/personName/index.d.ts +2 -0
  59. package/personName/index.js +2 -0
  60. package/personName/personName.d.ts +17 -0
  61. package/personName/personName.js +29 -0
  62. package/personPatronymic/constants.d.ts +2 -0
  63. package/personPatronymic/constants.js +5 -0
  64. package/personPatronymic/index.d.ts +2 -0
  65. package/personPatronymic/index.js +2 -0
  66. package/personPatronymic/personPatronymic.d.ts +17 -0
  67. package/personPatronymic/personPatronymic.js +29 -0
  68. package/personSurname/constants.d.ts +2 -0
  69. package/personSurname/constants.js +5 -0
  70. package/personSurname/index.d.ts +2 -0
  71. package/personSurname/index.js +2 -0
  72. package/personSurname/personSurname.d.ts +17 -0
  73. package/personSurname/personSurname.js +29 -0
  74. package/positiveNumber/positiveNumber.d.ts +1 -1
  75. package/snils/snils.d.ts +1 -1
  76. package/string/string.d.ts +2 -2
  77. package/transform/transform.d.ts +1 -1
  78. package/when/when.d.ts +6 -6
  79. package/when/when.js +2 -2
package/README.md CHANGED
@@ -34,6 +34,9 @@
34
34
  - [kpp](#kpp)
35
35
  - [ogrnIP](#ogrnIP)
36
36
  - [ogrnUL](#ogrnUL)
37
+ - [personName](#personName)
38
+ - [personSurname](#personSurname)
39
+ - [personPatronymic](#personPatronymic)
37
40
  - [date](#date)
38
41
  - [min](#min-date)
39
42
  - [max](#max-date)
@@ -50,6 +53,7 @@
50
53
  - [Custom rules](#custom-rules)
51
54
  - [Базовый пример](#базовый-пример)
52
55
  - [Связанные поля](#связанные-поля)
56
+ - [Доступ к ctx.global.values](#доступ-к-высокоуровневым-values-ctxglobalvalues)
53
57
  - [Переиспользуемое правило](#переиспользуемое-правило)
54
58
  - [Common](#common)
55
59
  - [optional](#optional)
@@ -63,6 +67,7 @@
63
67
  - [Переиспользование объектов схемы, с условной валидацией и зависимыми полями](#переиспользование-объектов-схемы-с-условной-валидацией-и-зависимыми-полями)
64
68
  - [Error message customization](#error-message-customization)
65
69
  - [Exclusion managing](#exclusion-managing)
70
+ - [Migration Guide](#migration-guide)
66
71
 
67
72
  ---
68
73
 
@@ -571,6 +576,72 @@ validate('1-22-33-5555555-6')
571
576
 
572
577
  ---
573
578
 
579
+ ### personName
580
+
581
+ Проверяет валидно ли имя
582
+
583
+ #### [Требования на реализацию](https://track.astral.ru/soft/wiki/pages/viewpage.action?pageId=3813152849#id-Требованиянареализацию-Требование5.Поле"Имя")
584
+
585
+ ```ts
586
+ import { string, personName } from '@astral/validations';
587
+
588
+ const validate = string(personName());
589
+
590
+ // undefined
591
+ validate('Иван');
592
+ validate('иван');
593
+
594
+ // { message: 'Проверьте имя' }
595
+ validate('');
596
+ validate('Иван--Иван');
597
+ ```
598
+
599
+ ---
600
+
601
+ ### personSurname
602
+
603
+ Проверяет валидно ли фамилия
604
+
605
+ #### [Требования на реализацию](https://track.astral.ru/soft/wiki/pages/viewpage.action?pageId=3813152849#id-Требованиянареализацию-Требование4.Поле"Фамилия")
606
+
607
+ ```ts
608
+ import { string, personSurname } from '@astral/validations';
609
+
610
+ const validate = string(personSurname());
611
+
612
+ // undefined
613
+ validate('Иванов');
614
+ validate('иванов');
615
+
616
+ // { message: 'Проверьте фамилию' }
617
+ validate('');
618
+ validate('Иванов--иванов');
619
+ ```
620
+
621
+ ---
622
+
623
+ ### personPatronymic
624
+
625
+ Проверяет валидно ли отчество
626
+
627
+ #### [Требования на реализацию](https://track.astral.ru/soft/wiki/pages/viewpage.action?pageId=3813152849#id-Требованиянареализацию-Требование6.Поле"Отчество")
628
+
629
+ ```ts
630
+ import { string, personPatronymic } from '@astral/validations';
631
+
632
+ const validate = string(personPatronymic());
633
+
634
+ // undefined
635
+ validate('Иванович');
636
+ validate('иванович');
637
+
638
+
639
+ // { message: 'Проверьте отчество' }
640
+ validate('');
641
+ validate('Иванович--Иванович');
642
+ ```
643
+
644
+
574
645
  ## date
575
646
 
576
647
  - Возвращает ошибку если:
@@ -952,9 +1023,9 @@ validate([1, 2]);
952
1023
  ```ts
953
1024
  type Values = { name: string; isAgree: boolean };
954
1025
 
955
- const validate = object<Values, Values>({
1026
+ const validate = object<Values>({
956
1027
  name: when({
957
- is: (_, ctx) => Boolean(ctx.global.values.isAgree),
1028
+ is: (_, ctx) => Boolean(ctx.values?.isAgree),
958
1029
  then: string(),
959
1030
  otherwise: any(),
960
1031
  }),
@@ -976,7 +1047,7 @@ toPrettyError(
976
1047
 
977
1048
  Каждый guard позволяет переопределить дефолтные параметры:
978
1049
  - Сообщение об ошибке типа
979
- - Сообщение о ошибке required
1050
+ - Сообщение об ошибке required
980
1051
  - Уникальные для каждого guard параметры
981
1052
 
982
1053
  ```ts
@@ -1010,7 +1081,7 @@ type Values = {
1010
1081
  nickname: string;
1011
1082
  };
1012
1083
 
1013
- const validate = object<Values, Values>({
1084
+ const validate = object<Values>({
1014
1085
  name: string(),
1015
1086
  nickname: string((value, ctx) => {
1016
1087
  if (value.includes('_')) {
@@ -1032,7 +1103,7 @@ toPrettyError(
1032
1103
 
1033
1104
  ## Связанные поля
1034
1105
 
1035
- В ```ctx.global.values``` находится value, принятое самым верхнеуровневым guard'ом.
1106
+ В ```ctx.values``` находится value, принятое последним object.
1036
1107
 
1037
1108
  ```ts
1038
1109
  import { object, string, toPrettyError } from '@astral/validations';
@@ -1042,10 +1113,10 @@ type Values = {
1042
1113
  repeatPassword: string;
1043
1114
  };
1044
1115
 
1045
- const validate = object<Values, Values>({
1116
+ const validate = object<Values>({
1046
1117
  password: string(min(9)),
1047
1118
  repeatPassword: string(min(9), (value, ctx) => {
1048
- if (value !== ctx.global.values.password) {
1119
+ if (value !== ctx.values?.password) {
1049
1120
  return ctx.createError({
1050
1121
  message: 'Пароли не совпадают',
1051
1122
  code: 'repeat-password',
@@ -1062,6 +1133,33 @@ toPrettyError(
1062
1133
  );
1063
1134
  ```
1064
1135
 
1136
+
1137
+ ## Доступ к высокоуровневым values (```ctx.global.values```)
1138
+
1139
+ В ```ctx.global.values``` находится values, полученное самым первым guard.
1140
+
1141
+ ```ts
1142
+ import { object, string, boolean, optional } from '@astral/validations';
1143
+
1144
+ type Values = {
1145
+ isAgree: boolean;
1146
+ info: {
1147
+ name: string
1148
+ }
1149
+ };
1150
+
1151
+ const validate = object<Values>({
1152
+ isAgree: optional(boolean()),
1153
+ info: object<Values['info']>({
1154
+ name: when({
1155
+ is: (_, ctx) => Boolean(ctx.global.values?.isAgree),
1156
+ then: string(),
1157
+ otherwise: any(),
1158
+ }),
1159
+ })
1160
+ });
1161
+ ```
1162
+
1065
1163
  ## Переиспользуемое правило
1066
1164
 
1067
1165
  ```ts
@@ -1137,9 +1235,9 @@ validate({
1137
1235
  ```ts
1138
1236
  type Values = { name: string; isAgree: boolean };
1139
1237
 
1140
- const validate = object<Values, Values>({
1238
+ const validate = object<Values>({
1141
1239
  name: when({
1142
- is: (_, ctx) => Boolean(ctx.global.values.isAgree),
1240
+ is: (_, ctx) => Boolean(ctx.values?.isAgree),
1143
1241
  then: string(),
1144
1242
  otherwise: any(),
1145
1243
  }),
@@ -1164,10 +1262,10 @@ type Values = {
1164
1262
  info?: ValuesInfo;
1165
1263
  };
1166
1264
 
1167
- const validate = object<Values, Values>({
1265
+ const validate = object<Values>({
1168
1266
  name: string(),
1169
1267
  info: when({
1170
- is: (_, ctx) => ctx.global.values.name === 'Vasya',
1268
+ is: (_, ctx) => ctx.values?.name === 'Vasya',
1171
1269
  then: object<ValuesInfo>({ surname: string() }),
1172
1270
  otherwise: any(),
1173
1271
  }),
@@ -1386,12 +1484,10 @@ type Values = {
1386
1484
  org: { data: RusOrganization | EngOrganization };
1387
1485
  };
1388
1486
 
1389
- // второй параметр generic - это глобально валидируемое значение. Для формы это весь values
1390
- const rusOrganization = object<RusOrganization, Values>({
1487
+ const rusOrganization = object<RusOrganization>({
1391
1488
  inn: string(
1392
- // автоматический вывод типа для ctx.global.values
1393
1489
  when({
1394
- is: (_, ctx) => Boolean(ctx.global.values.isRus),
1490
+ is: (_, ctx) => Boolean((ctx.global.values as Values)?.isRus),
1395
1491
  then: rusOrganization,
1396
1492
  otherwise: engOrganization,
1397
1493
  }),
@@ -1401,14 +1497,13 @@ const rusOrganization = object<RusOrganization, Values>({
1401
1497
 
1402
1498
  const engOrganization = object<EngOrganization, Values>({ name: string() });
1403
1499
 
1404
- // необходимо явно указать Values для типизации ctx.global.values
1405
1500
  const organization = when<Values>({
1406
- is: (_, ctx) => Boolean(ctx.global.values.isRus),
1501
+ is: (_, ctx) => Boolean((ctx.global.values as Values)?.isRus),
1407
1502
  then: rusOrganization,
1408
1503
  otherwise: engOrganization,
1409
1504
  });
1410
1505
 
1411
- const validate = object<Values, Values>({
1506
+ const validate = object<Values>({
1412
1507
  isRus: optional(boolean()),
1413
1508
  org: organization,
1414
1509
  });
@@ -1461,3 +1556,19 @@ const validate = string(kpp({ exclude: isExclude }));
1461
1556
  // undefined (значение не будет провалидировано)
1462
1557
  validate(excludeValue);
1463
1558
  ```
1559
+
1560
+ # Migration guide
1561
+
1562
+ ## v3 -> v4
1563
+
1564
+ ### object
1565
+
1566
+ Generic object guard стал принимать один параметр - валидируемое значение.
1567
+
1568
+ ### Типизация guard и rules
1569
+
1570
+ Generics правил и guards стали принимать тип для ```ctx.values``` вместо ```ctx.global.values```.
1571
+
1572
+ ### ctx.global.values
1573
+
1574
+ ```ctx.global.values``` стал ```unknown```. Для использования необходимо вручную уточнять тип. [Пример](#доступ-к-высокоуровневым-values-ctxglobalvalues).
package/any/any.d.ts CHANGED
@@ -10,4 +10,4 @@
10
10
  * validate({});
11
11
  * ```
12
12
  */
13
- export declare const any: <TValues>() => (value: unknown, prevCtx?: import("../core").ValidationContext<TValues> | undefined) => import("../core").ValidationResult;
13
+ export declare const any: <TLastSchemaValues extends Record<string, unknown>>() => (value: unknown, prevCtx?: import("../core").ValidationContext<TLastSchemaValues> | undefined) => import("../core").ValidationResult;
package/array/array.d.ts CHANGED
@@ -12,8 +12,8 @@ import { ValidationRule } from '../core';
12
12
  * validateArray(value);
13
13
  * ```
14
14
  */
15
- export declare const array: <TItem extends unknown, TValues = unknown>(...rules: ValidationRule<TItem[], TValues>[]) => {
16
- (value: unknown, prevCtx?: import("../core").ValidationContext<TValues> | undefined): import("../core").ValidationResult;
15
+ export declare const array: <TItem extends unknown, TLastSchemaValues extends Record<string, unknown> = {}>(...rules: ValidationRule<TItem[], TLastSchemaValues>[]) => {
16
+ (value: unknown, prevCtx?: import("../core").ValidationContext<TLastSchemaValues> | undefined): import("../core").ValidationResult;
17
17
  define(overridesDefOptions: Partial<{}> & {
18
18
  requiredErrorMessage?: string | undefined;
19
19
  typeErrorMessage?: string | undefined;
@@ -24,4 +24,4 @@ import { ValidationRule } from '../core';
24
24
  * validateArray(values);
25
25
  * ```
26
26
  */
27
- export declare const arrayItem: <TItem extends unknown, TValues = unknown>(...rules: ValidationRule<TItem, TValues>[]) => (value: TItem[], prevCtx?: import("../core").ValidationContext<TValues> | undefined) => import("../core").ValidationResult;
27
+ export declare const arrayItem: <TItem extends unknown, TLastSchemaValues extends Record<string, unknown> = {}>(...rules: ValidationRule<TItem, TLastSchemaValues>[]) => (value: TItem[], prevCtx?: import("../core").ValidationContext<TLastSchemaValues> | undefined) => import("../core").ValidationResult;
@@ -10,8 +10,8 @@ import { ValidationRule } from '../core';
10
10
  * validate(true);
11
11
  * ```
12
12
  */
13
- export declare const boolean: <TValues>(...rules: ValidationRule<boolean, TValues>[]) => {
14
- (value: unknown, prevCtx?: import("../core").ValidationContext<TValues> | undefined): import("../core").ValidationResult;
13
+ export declare const boolean: <TLastSchemaValues extends Record<string, unknown>>(...rules: ValidationRule<boolean, TLastSchemaValues>[]) => {
14
+ (value: unknown, prevCtx?: import("../core").ValidationContext<TLastSchemaValues> | undefined): import("../core").ValidationResult;
15
15
  define(overridesDefOptions: Partial<{}> & {
16
16
  requiredErrorMessage?: string | undefined;
17
17
  typeErrorMessage?: string | undefined;
@@ -3,4 +3,4 @@ import { IndependentValidationRule, ValidationRule } from '../rule';
3
3
  * @description Объединяет переданные правила в цепочку правил, останавливает выполнение цепочки, если появилась ошибка. Выполняет правила слева направо
4
4
  * @example compose(min(), max());
5
5
  */
6
- export declare const compose: <ValidationType, TValues>(...rules: (IndependentValidationRule<ValidationType, TValues> | ValidationRule<ValidationType, TValues>)[]) => IndependentValidationRule<ValidationType, TValues>;
6
+ export declare const compose: <ValidationType, TLastSchemaValues extends Record<string, unknown>>(...rules: (IndependentValidationRule<ValidationType, TLastSchemaValues> | ValidationRule<ValidationType, TLastSchemaValues>)[]) => IndependentValidationRule<ValidationType, Record<string, unknown>>;
@@ -4,5 +4,5 @@ import { ValidationTypes } from '../../types';
4
4
  * @description Создает context валидации. Используется внутри фабрик guard и rule
5
5
  * @default по-дефолту сбрасывает все флаги в false
6
6
  */
7
- export declare function createContext<Value extends ValidationTypes>(prevCtx: ValidationContext<Value> | undefined, value: Value): ValidationContext<Value>;
8
- export declare function createContext<Value extends ValidationTypes, Values>(prevCtx: ValidationContext<Values> | undefined, value: Value): ValidationContext<Values>;
7
+ export declare function createContext<TValue extends ValidationTypes>(prevCtx: ValidationContext<{}, TValue> | undefined, value: TValue): ValidationContext<{}, TValue>;
8
+ export declare function createContext<TValue extends ValidationTypes, TLastSchemaValues extends Record<string, unknown>>(prevCtx: ValidationContext<{}> | undefined, value: TValue, lastSchemaValue: TLastSchemaValues): ValidationContext<TLastSchemaValues, TValue>;
@@ -1,9 +1,14 @@
1
1
  import { createSimpleError } from '../../errors';
2
- export function createContext(prevCtx, value) {
3
- if (prevCtx) {
2
+ export function createContext(prevCtx, value, lastSchemaValue) {
3
+ if (prevCtx && !lastSchemaValue) {
4
4
  return prevCtx;
5
5
  }
6
+ const currentLastSchemaValue = lastSchemaValue ? lastSchemaValue : undefined;
7
+ if (prevCtx) {
8
+ return Object.assign(Object.assign({}, prevCtx), { values: currentLastSchemaValue });
9
+ }
6
10
  return {
11
+ values: currentLastSchemaValue,
7
12
  global: {
8
13
  values: value,
9
14
  overrides: {
@@ -3,7 +3,11 @@ import { createSimpleError } from '../errors';
3
3
  /**
4
4
  * @description Контекст, который доступен в каждом правиле
5
5
  */
6
- export type ValidationContext<TValues> = DeepReadonly<{
6
+ export type ValidationContext<TLastSchemaValues extends Record<string, unknown> = {}, TGlobalSchemaValues = unknown> = DeepReadonly<{
7
+ /**
8
+ * @description Values последнего валидируемого object
9
+ */
10
+ values?: DeepPartial<TLastSchemaValues>;
7
11
  /**
8
12
  * @description Глобальные значения, идущие от самого верхнего правила к самому нижнему
9
13
  */
@@ -11,7 +15,7 @@ export type ValidationContext<TValues> = DeepReadonly<{
11
15
  /**
12
16
  * @description Значения, которые валидируется guard самого высоко порядка
13
17
  */
14
- values: DeepPartial<TValues>;
18
+ values: TGlobalSchemaValues;
15
19
  /**
16
20
  * @description Глобальные переопределения (сквозные для всех правил)
17
21
  */
@@ -21,26 +21,26 @@ type GuardValue = unknown;
21
21
  /**
22
22
  * @description Интерфейс функции guard, которая в прототипе содержит метод define
23
23
  */
24
- export interface Guard<TValues = unknown, AddDefOptions extends Record<string, unknown> = {}> {
25
- (value: GuardValue, ctx?: ValidationContext<TValues>): ValidationResult;
24
+ export interface Guard<TLastSchemaValues extends Record<string, unknown> = {}, AddDefOptions extends Record<string, unknown> = {}> {
25
+ (value: GuardValue, ctx?: ValidationContext<TLastSchemaValues>): ValidationResult;
26
26
  /**
27
27
  * @description Функция для создания нового guard с переопределенными дефолтными параметрами. Возвращает новый guard
28
28
  * @param options - параметры, позволяющие переопределить дефолтные настройки guard
29
29
  * @example string.define({ requiredMessage: 'ИНН не может быть пустым' })(inn())
30
30
  */
31
- define(options: DefOptions<AddDefOptions>): Guard<TValues, AddDefOptions>;
31
+ define(options: DefOptions<AddDefOptions>): Guard<TLastSchemaValues, AddDefOptions>;
32
32
  }
33
33
  /**
34
34
  * @description Функция, которая позволяет определять частную логику для guard
35
35
  */
36
- type GuardExecutor<TValues, AddDefOptions extends Record<string, unknown>> = (value: unknown, ctx: ValidationContext<TValues>, defOptions: DefOptions<AddDefOptions>) => ValidationResult;
36
+ type GuardExecutor<AddDefOptions extends Record<string, unknown>> = (value: unknown, ctx: ValidationContext<Record<string, unknown>>, defOptions: DefOptions<AddDefOptions>) => ValidationResult;
37
37
  /**
38
38
  * @description Создает guard. Guard - функция, проверяющая тип значения
39
39
  * По-дефолту проверяет value на required. Для выключения required необходимо использовать optional().
40
40
  * После первого вызова guard в прототипу функции становится доступен метод define, который позволяет переопределить дефолтное поведение guard (например, изменить текст для required правила)
41
41
  * @example
42
42
  * ```ts
43
- * const string = <TValues>(...rules: ValidationRule<string, TValues>[]) =>
43
+ * const string = <TLastSchemaValues extends Record<string, unknown>>(...rules: ValidationRule<string, TValues>[]) =>
44
44
  * createGuard<string, TValues>((value, ctx) => {
45
45
  * if (typeof value !== 'string') {
46
46
  * return ctx.createError({ code: 'custom error', message: 'Не строка' });
@@ -50,8 +50,8 @@ type GuardExecutor<TValues, AddDefOptions extends Record<string, unknown>> = (va
50
50
  * });
51
51
  * ```
52
52
  */
53
- export declare const createGuard: <TValues, AddDefOptions extends Record<string, unknown> = {}>(executeGuard: GuardExecutor<TValues, AddDefOptions>) => {
54
- (value: unknown, prevCtx?: ValidationContext<TValues> | undefined): ValidationResult;
53
+ export declare const createGuard: <TLastSchemaValues extends Record<string, unknown>, AddDefOptions extends Record<string, unknown> = {}>(executeGuard: GuardExecutor<AddDefOptions>) => {
54
+ (value: unknown, prevCtx?: ValidationContext<TLastSchemaValues> | undefined): ValidationResult;
55
55
  define(overridesDefOptions: DefOptions<AddDefOptions>): any;
56
56
  };
57
57
  export {};
@@ -7,7 +7,7 @@ import { compose } from '../../compose';
7
7
  * После первого вызова guard в прототипу функции становится доступен метод define, который позволяет переопределить дефолтное поведение guard (например, изменить текст для required правила)
8
8
  * @example
9
9
  * ```ts
10
- * const string = <TValues>(...rules: ValidationRule<string, TValues>[]) =>
10
+ * const string = <TLastSchemaValues extends Record<string, unknown>>(...rules: ValidationRule<string, TValues>[]) =>
11
11
  * createGuard<string, TValues>((value, ctx) => {
12
12
  * if (typeof value !== 'string') {
13
13
  * return ctx.createError({ code: 'custom error', message: 'Не строка' });
@@ -8,12 +8,12 @@ export type CommonRuleParams<ValidationType extends ValidationTypes> = {
8
8
  /**
9
9
  * @description Функция, позволяющая для каждого правила указать исключение
10
10
  */
11
- exclude?: (value: ValidationType, ctx: ValidationContext<unknown>) => boolean;
11
+ exclude?: (value: ValidationType, ctx: ValidationContext) => boolean;
12
12
  };
13
13
  /**
14
14
  * @description Функция, которая позволяет определять частную логику для guard
15
15
  */
16
- type RuleExecutor<ValidationType extends ValidationTypes, TValues> = (value: ValidationType, ctx: ValidationContext<TValues>) => ValidationResult;
16
+ type RuleExecutor<ValidationType extends ValidationTypes, TLastSchemaValues extends Record<string, unknown>> = (value: ValidationType, ctx: ValidationContext<TLastSchemaValues>) => ValidationResult;
17
17
  /**
18
18
  * @description Создает правила валидации, которые можно использовать внутри guard или по отдельности
19
19
  * @param executor - функция, которая позволяет определять частную логику для guard
@@ -30,5 +30,5 @@ type RuleExecutor<ValidationType extends ValidationTypes, TValues> = (value: Val
30
30
  * }, params);
31
31
  * ```
32
32
  */
33
- export declare const createRule: <ValidationType extends unknown, TValues = unknown>(executor: RuleExecutor<ValidationType, TValues>, commonParams?: CommonRuleParams<ValidationType> | undefined) => (value: ValidationType, prevCtx?: ValidationContext<TValues> | undefined) => ValidationResult;
33
+ export declare const createRule: <ValidationType extends unknown, TLastSchemaValues extends Record<string, unknown> = {}>(executor: RuleExecutor<ValidationType, TLastSchemaValues>, commonParams?: CommonRuleParams<ValidationType> | undefined) => (value: ValidationType, prevCtx?: ValidationContext<TLastSchemaValues> | undefined) => ValidationResult;
34
34
  export {};
@@ -8,4 +8,4 @@ export declare const required: ({ message, }?: {
8
8
  * @default Обязательно
9
9
  */
10
10
  message?: string | undefined;
11
- }) => (value: unknown, prevCtx?: import("../..").ValidationContext<unknown> | undefined) => import("../..").ValidationResult;
11
+ }) => (value: unknown, prevCtx?: import("../..").ValidationContext<{}> | undefined) => import("../..").ValidationResult;
@@ -3,13 +3,13 @@ import { ValidationResult } from '../types';
3
3
  /**
4
4
  * @description Самостоятельное правило для валидации. Может использоваться вне guard'ов
5
5
  */
6
- export type IndependentValidationRule<TValue, TValues> = (value: TValue, ctx?: ValidationContext<TValues>) => ValidationResult;
6
+ export type IndependentValidationRule<TValue, TLastSchemaValues extends Record<string, unknown>> = (value: TValue, ctx?: ValidationContext<TLastSchemaValues>) => ValidationResult;
7
7
  /**
8
8
  * @description Правило для валидации, работающее исключительно с guard'ами
9
9
  */
10
- export type ValidationRule<TValue, TValues> = (value: TValue, ctx: ValidationContext<TValues>) => ValidationResult;
10
+ export type ValidationRule<TValue, TLastSchemaValues extends Record<string, unknown> = {}> = (value: TValue, ctx: ValidationContext<TLastSchemaValues>) => ValidationResult;
11
11
  /**
12
12
  * @description Композиционное правило валидации, умеющее работать с любыми значениями.
13
13
  * В основном используется для композиционных правил, которые принимают rule, умеющие валидировать разные значения (optional, transform...)
14
14
  */
15
- export type UniversalCompositionalValidationRule<TValues = unknown> = ValidationRule<any, TValues>;
15
+ export type UniversalCompositionalValidationRule<TLastSchemaValues extends Record<string, unknown>> = ValidationRule<any, TLastSchemaValues>;
@@ -1,3 +1,7 @@
1
1
  export * from './isStringOfZeros';
2
2
  export * from './isNoDoubleZeroStart';
3
3
  export * from './resetTime';
4
+ export * from './isStartsWithAndEndsWithLetter';
5
+ export * from './isHasConsecutiveChars';
6
+ export * from './isFullNameValidCharacters';
7
+ export * from './isValidFullNameLength';
@@ -1,3 +1,7 @@
1
1
  export * from './isStringOfZeros';
2
2
  export * from './isNoDoubleZeroStart';
3
3
  export * from './resetTime';
4
+ export * from './isStartsWithAndEndsWithLetter';
5
+ export * from './isHasConsecutiveChars';
6
+ export * from './isFullNameValidCharacters';
7
+ export * from './isValidFullNameLength';
@@ -0,0 +1 @@
1
+ export * from './isFullNameValidCharacters';
@@ -0,0 +1 @@
1
+ export * from './isFullNameValidCharacters';
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @description Проверяет, что разрешенные символы в тексте: прописные (большие) и строчные буквы (включая ё) русского алфавита,
3
+ прописные (большие) буквы I и V латинского алфавита, -, пробел, точка, апостроф, запятая, открывающая и закрывающая скобка
4
+ */
5
+ export declare const isFullNameValidCharacters: (value: string) => boolean;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @description Проверяет, что разрешенные символы в тексте: прописные (большие) и строчные буквы (включая ё) русского алфавита,
3
+ прописные (большие) буквы I и V латинского алфавита, -, пробел, точка, апостроф, запятая, открывающая и закрывающая скобка
4
+ */
5
+ export const isFullNameValidCharacters = (value) => !/^([а-яёА-ЯЁIV ё.,'’‎()\-\s]+)$/.test(value);
@@ -0,0 +1 @@
1
+ export * from './isHasConsecutiveChars';
@@ -0,0 +1 @@
1
+ export * from './isHasConsecutiveChars';
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @description Проверяет, что текст не может содержать последовательно два спецсимвола/пробела
3
+ */
4
+ export declare const isHasConsecutiveChars: (value: string) => boolean;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @description Проверяет, что текст не может содержать последовательно два спецсимвола/пробела
3
+ */
4
+ export const isHasConsecutiveChars = (value) => /([`~!@#$%^&*()\-_=+[{\]}\|;:'",<.>/?])\1|\s{2}/.test(value);
@@ -0,0 +1 @@
1
+ export * from './isStartsWithAndEndsWithLetter';
@@ -0,0 +1 @@
1
+ export * from './isStartsWithAndEndsWithLetter';
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @description Проверяет, что текст начинается с буквы и заканчивается буквой, кроме скобок ()
3
+ */
4
+ export declare const isStartsWithAndEndsWithLetter: (value: string) => boolean;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @description Проверяет, что текст начинается с буквы и заканчивается буквой, кроме скобок ()
3
+ */
4
+ export const isStartsWithAndEndsWithLetter = (value) => !/^[IV а-яёА-ЯЁ()](?:.*[IV а-яёА-ЯЁ()])?$/.test(value);
@@ -0,0 +1 @@
1
+ export * from './isValidFullNameLength';
@@ -0,0 +1 @@
1
+ export * from './isValidFullNameLength';
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @description Проверяет, что длина значения находится в допустимом диапазоне от 1 до 200 символов
3
+ */
4
+ export declare const isValidFullNameLength: (value: string) => boolean;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @description Проверяет, что длина значения находится в допустимом диапазоне от 1 до 200 символов
3
+ */
4
+ export const isValidFullNameLength = (value) => value.length < 1 || value.length > 200;
package/date/date.d.ts CHANGED
@@ -15,8 +15,8 @@ type AdditionalDefOptions = {
15
15
  * validate(new Date('22.22.2022'));
16
16
  * ```
17
17
  */
18
- export declare const date: <TValues>(...rules: ValidationRule<Date, TValues>[]) => {
19
- (value: unknown, prevCtx?: import("../core").ValidationContext<TValues> | undefined): import("../core").ValidationResult;
18
+ export declare const date: <TLastSchemaValues extends Record<string, unknown>>(...rules: ValidationRule<Date, TLastSchemaValues>[]) => {
19
+ (value: unknown, prevCtx?: import("../core").ValidationContext<TLastSchemaValues> | undefined): import("../core").ValidationResult;
20
20
  define(overridesDefOptions: Partial<AdditionalDefOptions> & {
21
21
  requiredErrorMessage?: string | undefined;
22
22
  typeErrorMessage?: string | undefined;
@@ -18,4 +18,4 @@ import { Guard } from '../core';
18
18
  * const result = validate({ info: { info: {} } });
19
19
  * ```
20
20
  */
21
- export declare const deepPartial: <TValues>(guard: Guard<TValues, {}>) => (value: unknown, prevCtx?: import("../core").ValidationContext<TValues> | undefined) => import("../core").ValidationResult;
21
+ export declare const deepPartial: <TLastSchemaValues extends Record<string, unknown>>(guard: Guard<TLastSchemaValues, {}>) => (value: unknown, prevCtx?: import("../core").ValidationContext<TLastSchemaValues> | undefined) => import("../core").ValidationResult;
package/email/email.d.ts CHANGED
@@ -16,5 +16,5 @@ type EmailParams = {
16
16
  * validate('example@mail.ru');
17
17
  * ```
18
18
  */
19
- export declare const email: <TValues>(params?: EmailParams) => (value: string, prevCtx?: import("../core").ValidationContext<TValues> | undefined) => import("../core").ValidationResult;
19
+ export declare const email: <TLastSchemaValues extends Record<string, unknown>>(params?: EmailParams) => (value: string, prevCtx?: import("../core").ValidationContext<TLastSchemaValues> | undefined) => import("../core").ValidationResult;
20
20
  export {};
package/index.d.ts CHANGED
@@ -24,6 +24,9 @@ export { snils, SNILS_ERROR_INFO } from './snils';
24
24
  export { createRule, REQUIRED_ERROR_INFO, type ValidationRule } from './core';
25
25
  export { ogrnUL, OGRN_UL_ERROR_INFO } from './ogrnUL';
26
26
  export { ogrnIP, OGRN_IP_ERROR_INFO } from './ogrnIP';
27
+ export { personName, PERSON_NAME_ERROR_INFO } from './personName';
28
+ export { personSurname, PERSON_SURNAME_ERROR_INFO } from './personSurname';
29
+ export { personPatronymic, PERSON_PATRONYMIC_ERROR_INFO, } from './personPatronymic';
27
30
  export { any } from './any';
28
31
  export { when } from './when';
29
32
  export { toPrettyError } from './toPrettyError';
package/index.js CHANGED
@@ -24,6 +24,9 @@ export { snils, SNILS_ERROR_INFO } from './snils';
24
24
  export { createRule, REQUIRED_ERROR_INFO } from './core';
25
25
  export { ogrnUL, OGRN_UL_ERROR_INFO } from './ogrnUL';
26
26
  export { ogrnIP, OGRN_IP_ERROR_INFO } from './ogrnIP';
27
+ export { personName, PERSON_NAME_ERROR_INFO } from './personName';
28
+ export { personSurname, PERSON_SURNAME_ERROR_INFO } from './personSurname';
29
+ export { personPatronymic, PERSON_PATRONYMIC_ERROR_INFO, } from './personPatronymic';
27
30
  export { any } from './any';
28
31
  export { when } from './when';
29
32
  export { toPrettyError } from './toPrettyError';
package/innIP/innIP.d.ts CHANGED
@@ -13,5 +13,5 @@ type InnIPParams = CommonRuleParams<string> & {
13
13
  * validate('384212952720');
14
14
  * ```
15
15
  */
16
- export declare const innIP: <TValues>(params?: InnIPParams) => (value: string, prevCtx?: import("../core").ValidationContext<TValues> | undefined) => import("../core").ValidationResult;
16
+ export declare const innIP: <TLastSchemaValues extends Record<string, unknown>>(params?: InnIPParams) => (value: string, prevCtx?: import("../core").ValidationContext<TLastSchemaValues> | undefined) => import("../core").ValidationResult;
17
17
  export {};
package/innUL/innUL.d.ts CHANGED
@@ -13,5 +13,5 @@ type InnULParams = CommonRuleParams<string> & {
13
13
  * validate('7728168971');
14
14
  * ```
15
15
  */
16
- export declare const innUL: <TValues>(params?: InnULParams) => (value: string, prevCtx?: import("../core").ValidationContext<TValues> | undefined) => import("../core").ValidationResult;
16
+ export declare const innUL: <TLastSchemaValues extends Record<string, unknown>>(params?: InnULParams) => (value: string, prevCtx?: import("../core").ValidationContext<TLastSchemaValues> | undefined) => import("../core").ValidationResult;
17
17
  export {};