@astral/validations 4.15.0 → 4.16.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/README.md CHANGED
@@ -52,10 +52,10 @@
52
52
  - [min](#min-date)
53
53
  - [max](#max-date)
54
54
  - [minYearsOld](#min-years-old-date)
55
- - [rangeDate](#range-date)
56
- - [rangeDateInterval](#range-date-interval)
57
- - [rangeDateMinMax](#range-date-minmax)
58
- - [rangeDateNotEqual](#range-date-notequal)
55
+ - [rangeDate](#rangeDate)
56
+ - [rangeDateInterval](#rangeDateInterval)
57
+ - [rangeDateMinMax](#rangeDateMinMax)
58
+ - [rangeDateNotEqual](#rangeDateNotEqual)
59
59
  - [boolean](#boolean)
60
60
  - [object](#object)
61
61
  - [partial](#partial)
@@ -995,7 +995,8 @@ validate(new Date('10.10.2005'));
995
995
 
996
996
  ### rangeDate
997
997
 
998
- Проверяет даты интервала на обязательность заполнения, валидность значений и хронологический порядок
998
+ - Проверяет даты интервала на обязательность заполнения, валидность значений и хронологический порядок
999
+ - Выполняет композицию правил, переданных в параметры
999
1000
 
1000
1001
  ```ts
1001
1002
  import { rangeDate } from '@astral/validations';
@@ -1039,6 +1040,24 @@ validate({
1039
1040
  end: new Date('2024.09.24'),
1040
1041
  });
1041
1042
 
1043
+
1044
+ const customValidate = (...rules: DateRangeRule[]) => dateRange(...rules).define({
1045
+ required: { start: false, end: false },
1046
+ message: {
1047
+ startRequired: 'Укажите начало периода'
1048
+ }
1049
+ })
1050
+
1051
+ // undefined
1052
+ customValidate({
1053
+ start: new Date('2024.09.05'),
1054
+ });
1055
+
1056
+ // { message: 'Укажите начало периода' }
1057
+ validate({
1058
+ end: new Date('2024.09.05'),
1059
+ })
1060
+
1042
1061
  ```
1043
1062
 
1044
1063
  ---
@@ -1051,7 +1070,7 @@ validate({
1051
1070
  ```ts
1052
1071
  import { rangeDateInterval } from '@astral/validations';
1053
1072
 
1054
- const validate = object(rangeDateInterval({ limit: 14 }));
1073
+ const validate = rangeDate(rangeDateInterval({ limit: 14 }));
1055
1074
 
1056
1075
  // { message: 'Период не может превышать 14 дней' }
1057
1076
  validate({
@@ -1065,7 +1084,7 @@ validate({
1065
1084
  end: new Date('2024.09.12'),
1066
1085
  });
1067
1086
 
1068
- const validateMonthInterval = object(rangeDateInterval({ limit: 2, unit: 'month' }));
1087
+ const validateMonthInterval = rangeDate(rangeDateInterval({ limit: 2, unit: 'month' }));
1069
1088
 
1070
1089
  // { message: 'Период не может превышать 2 месяца' }
1071
1090
  validateMonthInterval({
@@ -1091,7 +1110,7 @@ validateMonthInterval({
1091
1110
  ```ts
1092
1111
  import { rangeDateMinMax } from '@astral/validations';
1093
1112
 
1094
- const validate = object(rangeDateMinMax({ start: { min: { limit: new Date('2024.09.05') }}, end: { max: { limit: new Date('2024.09.15') } } }))
1113
+ const validate = rangeDate(rangeDateMinMax({ start: { min: { limit: new Date('2024.09.05') }}, end: { max: { limit: new Date('2024.09.15') } } }))
1095
1114
 
1096
1115
  // { message: 'Дата начала должна быть позже 05.09.2024' }
1097
1116
  validate({
@@ -1122,7 +1141,7 @@ validate({
1122
1141
  ```ts
1123
1142
  import { rangeDateNotEqual } from '@astral/validations';
1124
1143
 
1125
- const validate = object(
1144
+ const validate = rangeDate(
1126
1145
  rangeDateNotEqual(),
1127
1146
  );
1128
1147
 
@@ -1179,7 +1198,7 @@ validate(null)
1179
1198
  - Value не является простым объектом
1180
1199
  - Свойства не соответсвуют переданной схеме валидации
1181
1200
  - Возвращаем объект ошибок, соответсвующих ошибкам для свойств объекта
1182
- - Требует схему для валидации, свойства которой должны соответсвовать валидируемому values
1201
+ - Требует схему для валидации, свойства которой должны соответствовать валидируемому values
1183
1202
 
1184
1203
  ```ts
1185
1204
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astral/validations",
3
- "version": "4.15.0",
3
+ "version": "4.16.0",
4
4
  "browser": "./index.js",
5
5
  "main": "./index.js",
6
6
  "dependencies": {
@@ -1,3 +1,4 @@
1
+ import { type ValidationRule } from '../core';
1
2
  type RangeDateValue = {
2
3
  start?: Date;
3
4
  end?: Date;
@@ -37,12 +38,13 @@ type RangeDateParams = {
37
38
  };
38
39
  };
39
40
  /**
40
- * Проверяет даты интервала на обязательность заполнения, валидность значений и хронологический порядок
41
+ * Guard для интервала дат. Проверяет даты интервала на обязательность заполнения, валидность значений и хронологический порядок
42
+ * @param rules - правила валидаций, применяющиеся к интервалу дат
41
43
  * @example
42
44
  * ```ts
43
- * const validate = object(rangeDate());
45
+ * const validate = rangeDate();
44
46
  * validate({ start: new Date(), end: new Date() });
45
47
  * ```
46
48
  */
47
- export declare const rangeDate: <TLastSchemaValues extends Record<string, unknown>>(params?: RangeDateParams) => (value: RangeDateValue, prevCtx?: import("../core").ValidationContext<TLastSchemaValues> | undefined) => import("../core").ValidationResult;
49
+ export declare const rangeDate: <TLastSchemaValues extends Record<string, unknown>>(...rules: ValidationRule<RangeDateValue, TLastSchemaValues>[]) => import("../core").Guard<TLastSchemaValues, RangeDateParams>;
48
50
  export {};
@@ -1,15 +1,16 @@
1
1
  import { isDate } from '@astral/utils';
2
- import { createRule, isDateEarlier } from '../core';
2
+ import { compose, createGuard, isDateEarlier, } from '../core';
3
3
  import { RANGE_DATE_END_EARLIER_START_ERROR_INFO, RANGE_DATE_END_INVALID_ERROR_INFO, RANGE_DATE_END_REQUIRED_ERROR_INFO, RANGE_DATE_REQUIRED_ERROR_INFO, RANGE_DATE_START_INVALID_ERROR_INFO, RANGE_DATE_START_REQUIRED_ERROR_INFO, } from './constants';
4
4
  /**
5
- * Проверяет даты интервала на обязательность заполнения, валидность значений и хронологический порядок
5
+ * Guard для интервала дат. Проверяет даты интервала на обязательность заполнения, валидность значений и хронологический порядок
6
+ * @param rules - правила валидаций, применяющиеся к интервалу дат
6
7
  * @example
7
8
  * ```ts
8
- * const validate = object(rangeDate());
9
+ * const validate = rangeDate();
9
10
  * validate({ start: new Date(), end: new Date() });
10
11
  * ```
11
12
  */
12
- export const rangeDate = (params) => createRule((value, ctx) => {
13
+ export const rangeDate = (...rules) => createGuard((externalValue, ctx, params) => {
13
14
  const { required, messages } = Object.assign(Object.assign({}, (params || {})), { required: {
14
15
  start: (params === null || params === void 0 ? void 0 : params.required) && 'start' in (params === null || params === void 0 ? void 0 : params.required)
15
16
  ? params === null || params === void 0 ? void 0 : params.required.start
@@ -18,6 +19,10 @@ export const rangeDate = (params) => createRule((value, ctx) => {
18
19
  ? params === null || params === void 0 ? void 0 : params.required.end
19
20
  : true,
20
21
  } });
22
+ // Приводим тип, чтобы не усложнять код и не дублировать часть проверок
23
+ // Существующие проверки покрывают все кейсы
24
+ // Иначе необходимо делать проверку на объект и наличие полей start и end с учетом вариативности
25
+ const value = externalValue;
21
26
  if ((required === null || required === void 0 ? void 0 : required.start) && (required === null || required === void 0 ? void 0 : required.end) && !value.start && !value.end) {
22
27
  return ctx.createError({
23
28
  message: RANGE_DATE_REQUIRED_ERROR_INFO.message,
@@ -56,5 +61,5 @@ export const rangeDate = (params) => createRule((value, ctx) => {
56
61
  code: RANGE_DATE_END_EARLIER_START_ERROR_INFO.code,
57
62
  });
58
63
  }
59
- return undefined;
64
+ return compose(...rules)(value, ctx);
60
65
  });
@@ -15,7 +15,7 @@ type RangeDateIntervalParams = {
15
15
  * Позволяет ограничить интервал на конкретное значение. Установка интревала возможна в следующих единицах: день, месяц и год.
16
16
  * @example
17
17
  * ```ts
18
- * const validate = object(rangeDateInterval({ limit: 14 }));
18
+ * const validate = rangeDate(rangeDateInterval({ limit: 14 }));
19
19
  * validate({ start: new Date('2024.08.15'), end: new Date('2024.09.05') });
20
20
  * ```
21
21
  */
@@ -13,7 +13,7 @@ const selectAddingStrategy = (unit) => {
13
13
  * Позволяет ограничить интервал на конкретное значение. Установка интревала возможна в следующих единицах: день, месяц и год.
14
14
  * @example
15
15
  * ```ts
16
- * const validate = object(rangeDateInterval({ limit: 14 }));
16
+ * const validate = rangeDate(rangeDateInterval({ limit: 14 }));
17
17
  * validate({ start: new Date('2024.08.15'), end: new Date('2024.09.05') });
18
18
  * ```
19
19
  */
@@ -26,7 +26,7 @@ type RangeDateMinMaxParams = {
26
26
  * Проверяет даты на минимальное и максимальное допустимое значение
27
27
  * @example
28
28
  * ```ts
29
- * const validate = object(rangeDateMinMax({ start: { min: { limit: new Date(2023, 0, 1) }}, end: { max: { limit: new Date() } } }));
29
+ * const validate = rangeDate(rangeDateMinMax({ start: { min: { limit: new Date(2023, 0, 1) }}, end: { max: { limit: new Date() } } }));
30
30
  * validate({ start: new Date(), end: new Date() });
31
31
  * ```
32
32
  */
@@ -9,7 +9,7 @@ const formatDateToView = (date) => {
9
9
  * Проверяет даты на минимальное и максимальное допустимое значение
10
10
  * @example
11
11
  * ```ts
12
- * const validate = object(rangeDateMinMax({ start: { min: { limit: new Date(2023, 0, 1) }}, end: { max: { limit: new Date() } } }));
12
+ * const validate = rangeDate(rangeDateMinMax({ start: { min: { limit: new Date(2023, 0, 1) }}, end: { max: { limit: new Date() } } }));
13
13
  * validate({ start: new Date(), end: new Date() });
14
14
  * ```
15
15
  */
@@ -12,7 +12,7 @@ type RangeDateNotEqualParams = {
12
12
  * Проверяет даты интервала на совпадение даты начала и окончания
13
13
  * @example
14
14
  * ```ts
15
- * const validate = object(rangeDateNotEqual());
15
+ * const validate = rangeDate(rangeDateNotEqual());
16
16
  * validate({ start: new Date(), end: new Date() });
17
17
  * ```
18
18
  */
@@ -8,7 +8,7 @@ const isDateEqual = (dateA, dateB) => {
8
8
  * Проверяет даты интервала на совпадение даты начала и окончания
9
9
  * @example
10
10
  * ```ts
11
- * const validate = object(rangeDateNotEqual());
11
+ * const validate = rangeDate(rangeDateNotEqual());
12
12
  * validate({ start: new Date(), end: new Date() });
13
13
  * ```
14
14
  */