@astral/validations 4.19.0 → 4.20.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/index.d.ts +2 -0
- package/index.js +2 -0
- package/package.json +1 -1
- package/uploadedFile/constants.d.ts +5 -0
- package/uploadedFile/constants.js +17 -0
- package/uploadedFile/index.d.ts +2 -0
- package/uploadedFile/index.js +2 -0
- package/uploadedFile/types.d.ts +46 -0
- package/uploadedFile/types.js +1 -0
- package/uploadedFile/uploadedFile.d.ts +30 -0
- package/uploadedFile/uploadedFile.js +60 -0
- package/uploadedFileList/constants.d.ts +2 -0
- package/uploadedFileList/constants.js +5 -0
- package/uploadedFileList/index.d.ts +2 -0
- package/uploadedFileList/index.js +2 -0
- package/uploadedFileList/uploadedFileList.d.ts +24 -0
- package/uploadedFileList/uploadedFileList.js +43 -0
package/index.d.ts
CHANGED
@@ -49,3 +49,5 @@ export { rangeDate, RANGE_DATE_END_EARLIER_START_ERROR_INFO, RANGE_DATE_END_INVA
|
|
49
49
|
export { rangeDateInterval, RANGE_DATE_INTERVAL_ERROR_INFO, } from './rangeDateInterval';
|
50
50
|
export { rangeDateMinMax, RANGE_DATE_MAX_ERROR_INFO, RANGE_DATE_MIN_ERROR_INFO, } from './rangeDateMinMax';
|
51
51
|
export { rangeDateNotEqual, RANGE_DATE_NOT_EQUAL_ERROR_INFO, } from './rangeDateNotEqual';
|
52
|
+
export { uploadedFile, FILE_UPLOAD_ERROR_INFO, FILE_LOADING_ERROR_INFO, FILE_REQUIRED_ERROR_INFO, FILE_RESTRICTION_ERROR_INFO, } from './uploadedFile';
|
53
|
+
export { uploadedFileList, FILE_LIST_NOT_ARRAY_ERROR_INFO, } from './uploadedFileList';
|
package/index.js
CHANGED
@@ -49,3 +49,5 @@ export { rangeDate, RANGE_DATE_END_EARLIER_START_ERROR_INFO, RANGE_DATE_END_INVA
|
|
49
49
|
export { rangeDateInterval, RANGE_DATE_INTERVAL_ERROR_INFO, } from './rangeDateInterval';
|
50
50
|
export { rangeDateMinMax, RANGE_DATE_MAX_ERROR_INFO, RANGE_DATE_MIN_ERROR_INFO, } from './rangeDateMinMax';
|
51
51
|
export { rangeDateNotEqual, RANGE_DATE_NOT_EQUAL_ERROR_INFO, } from './rangeDateNotEqual';
|
52
|
+
export { uploadedFile, FILE_UPLOAD_ERROR_INFO, FILE_LOADING_ERROR_INFO, FILE_REQUIRED_ERROR_INFO, FILE_RESTRICTION_ERROR_INFO, } from './uploadedFile';
|
53
|
+
export { uploadedFileList, FILE_LIST_NOT_ARRAY_ERROR_INFO, } from './uploadedFileList';
|
package/package.json
CHANGED
@@ -0,0 +1,5 @@
|
|
1
|
+
import { type ErrorInfo } from '../core';
|
2
|
+
export declare const FILE_RESTRICTION_ERROR_INFO: ErrorInfo;
|
3
|
+
export declare const FILE_LOADING_ERROR_INFO: ErrorInfo;
|
4
|
+
export declare const FILE_UPLOAD_ERROR_INFO: ErrorInfo;
|
5
|
+
export declare const FILE_REQUIRED_ERROR_INFO: ErrorInfo;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { createErrorCode } from '../core';
|
2
|
+
export const FILE_RESTRICTION_ERROR_INFO = {
|
3
|
+
code: createErrorCode('file-restriction'),
|
4
|
+
message: 'Файл не соответствует ограничениям',
|
5
|
+
};
|
6
|
+
export const FILE_LOADING_ERROR_INFO = {
|
7
|
+
code: createErrorCode('file-loading'),
|
8
|
+
message: 'Файл загружается',
|
9
|
+
};
|
10
|
+
export const FILE_UPLOAD_ERROR_INFO = {
|
11
|
+
code: createErrorCode('file-upload'),
|
12
|
+
message: 'Ошибка загрузки файла',
|
13
|
+
};
|
14
|
+
export const FILE_REQUIRED_ERROR_INFO = {
|
15
|
+
code: createErrorCode('file-required'),
|
16
|
+
message: 'Загрузите файл',
|
17
|
+
};
|
@@ -0,0 +1,46 @@
|
|
1
|
+
type FileStatus = {
|
2
|
+
/**
|
3
|
+
* Флаг загрузки файла
|
4
|
+
*/
|
5
|
+
isLoading?: boolean;
|
6
|
+
/**
|
7
|
+
* Флаг состояния ошибки при загрузке файла
|
8
|
+
*/
|
9
|
+
isUploadError?: boolean;
|
10
|
+
/**
|
11
|
+
* Флаг состояния ошибки при проверке файла на условия
|
12
|
+
*/
|
13
|
+
isRestrictionError?: boolean;
|
14
|
+
/**
|
15
|
+
* Текст ошибки
|
16
|
+
*/
|
17
|
+
errorMsg?: string;
|
18
|
+
/**
|
19
|
+
* Значение прогресса загрузки файла.
|
20
|
+
*/
|
21
|
+
progress?: number;
|
22
|
+
};
|
23
|
+
export type UploadFile = {
|
24
|
+
/**
|
25
|
+
* Идентификатор
|
26
|
+
*/
|
27
|
+
id: string;
|
28
|
+
/**
|
29
|
+
* Название файла
|
30
|
+
*/
|
31
|
+
name: string;
|
32
|
+
/**
|
33
|
+
* Размер файла в байтах
|
34
|
+
*/
|
35
|
+
size?: number;
|
36
|
+
file?: File;
|
37
|
+
/**
|
38
|
+
* Ссылка на файле
|
39
|
+
*/
|
40
|
+
url?: string;
|
41
|
+
/**
|
42
|
+
* Состояния файла
|
43
|
+
*/
|
44
|
+
status?: FileStatus;
|
45
|
+
};
|
46
|
+
export {};
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import { type ValidationRule } from '../core';
|
2
|
+
import type { UploadFile } from './types';
|
3
|
+
/**
|
4
|
+
* Guard для файла. Проверяет объект на соответствие формату UploadFile и его статусы загрузки.
|
5
|
+
* Валидирует наличие обязательных полей (id, name) и проверяет статусы файла (isLoading, isUploadError, isRestrictionError).
|
6
|
+
* @param rules - дополнительные правила валидации для файла
|
7
|
+
* @example
|
8
|
+
* ```ts
|
9
|
+
* const validate = uploadedFile();
|
10
|
+
*
|
11
|
+
* // Валидный файл
|
12
|
+
* validate({
|
13
|
+
* id: 1,
|
14
|
+
* name: "document.pdf",
|
15
|
+
* status: {
|
16
|
+
* isLoading: false
|
17
|
+
* }
|
18
|
+
* });
|
19
|
+
*
|
20
|
+
* // Файл с ошибкой загрузки
|
21
|
+
* validate({
|
22
|
+
* id: 1,
|
23
|
+
* name: "document.pdf",
|
24
|
+
* status: {
|
25
|
+
* isUploadError: true
|
26
|
+
* }
|
27
|
+
* });
|
28
|
+
* ```
|
29
|
+
*/
|
30
|
+
export declare const uploadedFile: <TLastSchemeValues extends Record<string, unknown>>(...rules: ValidationRule<UploadFile, TLastSchemeValues>[]) => import("../core").Guard<TLastSchemeValues, {}>;
|
@@ -0,0 +1,60 @@
|
|
1
|
+
import { compose, createGuard, } from '../core';
|
2
|
+
import { FILE_LOADING_ERROR_INFO, FILE_REQUIRED_ERROR_INFO, FILE_RESTRICTION_ERROR_INFO, FILE_UPLOAD_ERROR_INFO, } from './constants';
|
3
|
+
/**
|
4
|
+
* Guard для файла. Проверяет объект на соответствие формату UploadFile и его статусы загрузки.
|
5
|
+
* Валидирует наличие обязательных полей (id, name) и проверяет статусы файла (isLoading, isUploadError, isRestrictionError).
|
6
|
+
* @param rules - дополнительные правила валидации для файла
|
7
|
+
* @example
|
8
|
+
* ```ts
|
9
|
+
* const validate = uploadedFile();
|
10
|
+
*
|
11
|
+
* // Валидный файл
|
12
|
+
* validate({
|
13
|
+
* id: 1,
|
14
|
+
* name: "document.pdf",
|
15
|
+
* status: {
|
16
|
+
* isLoading: false
|
17
|
+
* }
|
18
|
+
* });
|
19
|
+
*
|
20
|
+
* // Файл с ошибкой загрузки
|
21
|
+
* validate({
|
22
|
+
* id: 1,
|
23
|
+
* name: "document.pdf",
|
24
|
+
* status: {
|
25
|
+
* isUploadError: true
|
26
|
+
* }
|
27
|
+
* });
|
28
|
+
* ```
|
29
|
+
*/
|
30
|
+
export const uploadedFile = (...rules) => createGuard((value, ctx) => {
|
31
|
+
if (!value ||
|
32
|
+
typeof value !== 'object' ||
|
33
|
+
!('id' in value) ||
|
34
|
+
!('name' in value)) {
|
35
|
+
return ctx.createError({
|
36
|
+
code: FILE_REQUIRED_ERROR_INFO.code,
|
37
|
+
message: FILE_REQUIRED_ERROR_INFO.message,
|
38
|
+
});
|
39
|
+
}
|
40
|
+
const { status } = value;
|
41
|
+
if (status === null || status === void 0 ? void 0 : status.isRestrictionError) {
|
42
|
+
return ctx.createError({
|
43
|
+
code: FILE_RESTRICTION_ERROR_INFO.code,
|
44
|
+
message: status.errorMsg || FILE_RESTRICTION_ERROR_INFO.message,
|
45
|
+
});
|
46
|
+
}
|
47
|
+
if (status === null || status === void 0 ? void 0 : status.isLoading) {
|
48
|
+
return ctx.createError({
|
49
|
+
code: FILE_LOADING_ERROR_INFO.code,
|
50
|
+
message: status.errorMsg || FILE_LOADING_ERROR_INFO.message,
|
51
|
+
});
|
52
|
+
}
|
53
|
+
if (status === null || status === void 0 ? void 0 : status.isUploadError) {
|
54
|
+
return ctx.createError({
|
55
|
+
code: FILE_UPLOAD_ERROR_INFO.code,
|
56
|
+
message: status.errorMsg || FILE_UPLOAD_ERROR_INFO.message,
|
57
|
+
});
|
58
|
+
}
|
59
|
+
return compose(...rules)(value, ctx);
|
60
|
+
});
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import { type ValidationRule } from '../core';
|
2
|
+
import { type UploadFile } from '../uploadedFile/types';
|
3
|
+
/**
|
4
|
+
* Guard для списка файлов. Проверяет массив на валидность и каждый файл в массиве на соответствие формату UploadFile.
|
5
|
+
* Проверяет статусы файлов (isLoading, isUploadError, isRestrictionError).
|
6
|
+
* @param rules - дополнительные правила валидации для массива файлов
|
7
|
+
* @example
|
8
|
+
* ```ts
|
9
|
+
* const validate = uploadedFileList();
|
10
|
+
*
|
11
|
+
* // Валидный массив файлов
|
12
|
+
* validate([
|
13
|
+
* { id: 1, name: "document1.pdf" },
|
14
|
+
* { id: 2, name: "document2.pdf", status: { isLoading: false } }
|
15
|
+
* ]);
|
16
|
+
*
|
17
|
+
* // Массив с ошибкой загрузки
|
18
|
+
* validate([
|
19
|
+
* { id: 1, name: "document1.pdf" },
|
20
|
+
* { id: 2, name: "document2.pdf", status: { isUploadError: true } }
|
21
|
+
* ]);
|
22
|
+
* ```
|
23
|
+
*/
|
24
|
+
export declare const uploadedFileList: <TLastSchemeValues extends Record<string, unknown>>(...rules: ValidationRule<UploadFile[], TLastSchemeValues>[]) => import("../core").Guard<TLastSchemeValues, {}>;
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import { compose, createGuard, } from '../core';
|
2
|
+
import { array } from '../array';
|
3
|
+
import { uploadedFile } from '../uploadedFile';
|
4
|
+
import { FILE_LIST_NOT_ARRAY_ERROR_INFO } from './constants';
|
5
|
+
/**
|
6
|
+
* Guard для списка файлов. Проверяет массив на валидность и каждый файл в массиве на соответствие формату UploadFile.
|
7
|
+
* Проверяет статусы файлов (isLoading, isUploadError, isRestrictionError).
|
8
|
+
* @param rules - дополнительные правила валидации для массива файлов
|
9
|
+
* @example
|
10
|
+
* ```ts
|
11
|
+
* const validate = uploadedFileList();
|
12
|
+
*
|
13
|
+
* // Валидный массив файлов
|
14
|
+
* validate([
|
15
|
+
* { id: 1, name: "document1.pdf" },
|
16
|
+
* { id: 2, name: "document2.pdf", status: { isLoading: false } }
|
17
|
+
* ]);
|
18
|
+
*
|
19
|
+
* // Массив с ошибкой загрузки
|
20
|
+
* validate([
|
21
|
+
* { id: 1, name: "document1.pdf" },
|
22
|
+
* { id: 2, name: "document2.pdf", status: { isUploadError: true } }
|
23
|
+
* ]);
|
24
|
+
* ```
|
25
|
+
*/
|
26
|
+
export const uploadedFileList = (...rules) => createGuard((value, ctx) => {
|
27
|
+
if (array()(value)) {
|
28
|
+
return ctx.createError({
|
29
|
+
code: FILE_LIST_NOT_ARRAY_ERROR_INFO.code,
|
30
|
+
message: FILE_LIST_NOT_ARRAY_ERROR_INFO.message,
|
31
|
+
});
|
32
|
+
}
|
33
|
+
const uploadFileList = value;
|
34
|
+
for (const item of uploadFileList) {
|
35
|
+
if (uploadedFile()(item)) {
|
36
|
+
const error = uploadedFile()(item, ctx);
|
37
|
+
if (error) {
|
38
|
+
return error;
|
39
|
+
}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
return compose(...rules)(uploadFileList, ctx);
|
43
|
+
});
|