@astral/ui 4.55.1 → 4.55.3

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 (124) hide show
  1. package/components/ConfigProvider/ConfigProvider.d.ts +3 -2
  2. package/components/ConfigProvider/ConfigProvider.js +10 -4
  3. package/components/ErrorBoundary/ErrorBoundary.d.ts +2 -5
  4. package/components/ErrorBoundary/ErrorBoundary.js +9 -10
  5. package/components/ProductSwitcher/useLogic/useLogic.js +5 -4
  6. package/components/fileUploading/FileUploaderFile/Actions/useLogic/useLogic.js +6 -7
  7. package/components/fileUploading/PreviewFileUploader/PreviewFileUploader.d.ts +8 -1
  8. package/components/fileUploading/PreviewFileUploaderFile/FilePreview/useLogic/useLogic.js +8 -9
  9. package/components/fileUploading/hooks/useFileUploader/hooks/index.d.ts +1 -0
  10. package/components/fileUploading/hooks/useFileUploader/hooks/index.js +1 -0
  11. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/index.d.ts +1 -0
  12. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/index.js +1 -0
  13. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/usePrepareAccept.d.ts +2 -0
  14. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/usePrepareAccept.js +14 -0
  15. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/getAcceptMeta.d.ts +5 -0
  16. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/getAcceptMeta.js +23 -0
  17. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/index.d.ts +1 -0
  18. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/index.js +1 -0
  19. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/index.d.ts +2 -0
  20. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/index.js +2 -0
  21. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/index.d.ts +1 -0
  22. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/index.js +1 -0
  23. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/validateAcceptMeta.d.ts +2 -0
  24. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/validateAcceptMeta.js +10 -0
  25. package/components/fileUploading/hooks/useFileUploader/useFileUploader.js +3 -1
  26. package/components/fileUploading/hooks/usePreviewFileUploader/usePreviewFileUploader.d.ts +34 -120
  27. package/components/fileUploading/hooks/usePreviewFileUploader/usePreviewFileUploader.js +10 -137
  28. package/components/fileUploading/restrictions/restrictFileType/constants.d.ts +4 -0
  29. package/components/fileUploading/restrictions/restrictFileType/constants.js +4 -0
  30. package/components/fileUploading/restrictions/restrictFileType/restrictFileType.d.ts +2 -2
  31. package/components/fileUploading/restrictions/restrictFileType/restrictFileType.js +31 -55
  32. package/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/getFileMeta.d.ts +5 -0
  33. package/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/getFileMeta.js +21 -0
  34. package/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/index.d.ts +1 -0
  35. package/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/index.js +1 -0
  36. package/components/fileUploading/restrictions/restrictFileType/utils/index.d.ts +1 -2
  37. package/components/fileUploading/restrictions/restrictFileType/utils/index.js +1 -2
  38. package/components/fileUploading/services/MimeTypeRegistry/MimeTypeRegistry.d.ts +9 -0
  39. package/components/fileUploading/services/MimeTypeRegistry/MimeTypeRegistry.js +27 -0
  40. package/components/fileUploading/services/MimeTypeRegistry/constants.d.ts +1 -0
  41. package/components/fileUploading/services/MimeTypeRegistry/constants.js +343 -0
  42. package/components/fileUploading/services/MimeTypeRegistry/index.d.ts +1 -0
  43. package/components/fileUploading/services/MimeTypeRegistry/index.js +1 -0
  44. package/components/fileUploading/types.d.ts +10 -0
  45. package/components/fileUploading/utils/index.d.ts +1 -1
  46. package/components/fileUploading/utils/index.js +1 -1
  47. package/components/services/ErrorService/ErrorService.d.ts +29 -0
  48. package/components/services/ErrorService/ErrorService.js +36 -0
  49. package/components/services/ErrorService/index.d.ts +1 -0
  50. package/components/services/ErrorService/index.js +1 -0
  51. package/hook-form/useFormWizard/useFormWizard.js +7 -4
  52. package/node/components/ConfigProvider/ConfigProvider.d.ts +3 -2
  53. package/node/components/ConfigProvider/ConfigProvider.js +9 -3
  54. package/node/components/ErrorBoundary/ErrorBoundary.d.ts +2 -5
  55. package/node/components/ErrorBoundary/ErrorBoundary.js +9 -10
  56. package/node/components/ProductSwitcher/useLogic/useLogic.js +4 -3
  57. package/node/components/fileUploading/FileUploaderFile/Actions/useLogic/useLogic.js +6 -7
  58. package/node/components/fileUploading/PreviewFileUploader/PreviewFileUploader.d.ts +8 -1
  59. package/node/components/fileUploading/PreviewFileUploaderFile/FilePreview/useLogic/useLogic.js +8 -9
  60. package/node/components/fileUploading/hooks/useFileUploader/hooks/index.d.ts +1 -0
  61. package/node/components/fileUploading/{restrictions/restrictFileType/utils/getFileTypeFromName → hooks/useFileUploader/hooks}/index.js +1 -1
  62. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/index.d.ts +1 -0
  63. package/node/components/fileUploading/{restrictions/restrictFileType/utils/getFileTypeFromFile → hooks/useFileUploader/hooks/usePrepareAccept}/index.js +1 -1
  64. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/usePrepareAccept.d.ts +2 -0
  65. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/usePrepareAccept.js +18 -0
  66. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/getAcceptMeta.d.ts +5 -0
  67. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/getAcceptMeta.js +27 -0
  68. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/index.d.ts +1 -0
  69. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/index.js +17 -0
  70. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/index.d.ts +2 -0
  71. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/index.js +18 -0
  72. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/index.d.ts +1 -0
  73. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/index.js +17 -0
  74. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/validateAcceptMeta.d.ts +2 -0
  75. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/validateAcceptMeta.js +14 -0
  76. package/node/components/fileUploading/hooks/useFileUploader/useFileUploader.js +3 -1
  77. package/node/components/fileUploading/hooks/usePreviewFileUploader/usePreviewFileUploader.d.ts +34 -120
  78. package/node/components/fileUploading/hooks/usePreviewFileUploader/usePreviewFileUploader.js +9 -136
  79. package/node/components/fileUploading/restrictions/restrictFileType/constants.d.ts +4 -0
  80. package/node/components/fileUploading/restrictions/restrictFileType/constants.js +5 -1
  81. package/node/components/fileUploading/restrictions/restrictFileType/restrictFileType.d.ts +2 -2
  82. package/node/components/fileUploading/restrictions/restrictFileType/restrictFileType.js +29 -53
  83. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/getFileMeta.d.ts +5 -0
  84. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/getFileMeta.js +25 -0
  85. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/index.d.ts +1 -0
  86. package/node/components/fileUploading/restrictions/restrictFileType/utils/{prepareType → getFileMeta}/index.js +1 -1
  87. package/node/components/fileUploading/restrictions/restrictFileType/utils/index.d.ts +1 -2
  88. package/node/components/fileUploading/restrictions/restrictFileType/utils/index.js +1 -2
  89. package/node/components/fileUploading/services/MimeTypeRegistry/MimeTypeRegistry.d.ts +9 -0
  90. package/node/components/fileUploading/services/MimeTypeRegistry/MimeTypeRegistry.js +31 -0
  91. package/node/components/fileUploading/services/MimeTypeRegistry/constants.d.ts +1 -0
  92. package/node/components/fileUploading/services/MimeTypeRegistry/constants.js +347 -0
  93. package/node/components/fileUploading/services/MimeTypeRegistry/index.d.ts +1 -0
  94. package/node/components/fileUploading/services/MimeTypeRegistry/index.js +17 -0
  95. package/node/components/fileUploading/types.d.ts +10 -0
  96. package/node/components/fileUploading/utils/index.d.ts +1 -1
  97. package/node/components/fileUploading/utils/index.js +16 -3
  98. package/node/components/services/ErrorService/ErrorService.d.ts +29 -0
  99. package/node/components/services/ErrorService/ErrorService.js +40 -0
  100. package/node/components/services/ErrorService/index.d.ts +1 -0
  101. package/node/components/services/ErrorService/index.js +17 -0
  102. package/node/hook-form/useFormWizard/useFormWizard.js +6 -3
  103. package/package.json +1 -1
  104. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/getFileTypeFromFile.d.ts +0 -4
  105. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/getFileTypeFromFile.js +0 -10
  106. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/index.d.ts +0 -1
  107. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/index.js +0 -1
  108. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/getFileTypeFromName.d.ts +0 -4
  109. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/getFileTypeFromName.js +0 -13
  110. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/index.d.ts +0 -1
  111. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/index.js +0 -1
  112. package/components/fileUploading/restrictions/restrictFileType/utils/prepareType/index.d.ts +0 -1
  113. package/components/fileUploading/restrictions/restrictFileType/utils/prepareType/index.js +0 -1
  114. package/components/fileUploading/restrictions/restrictFileType/utils/prepareType/prepareType.d.ts +0 -5
  115. package/components/fileUploading/restrictions/restrictFileType/utils/prepareType/prepareType.js +0 -5
  116. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/getFileTypeFromFile.d.ts +0 -4
  117. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/getFileTypeFromFile.js +0 -14
  118. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/index.d.ts +0 -1
  119. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/getFileTypeFromName.d.ts +0 -4
  120. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/getFileTypeFromName.js +0 -17
  121. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/index.d.ts +0 -1
  122. package/node/components/fileUploading/restrictions/restrictFileType/utils/prepareType/index.d.ts +0 -1
  123. package/node/components/fileUploading/restrictions/restrictFileType/utils/prepareType/prepareType.d.ts +0 -5
  124. package/node/components/fileUploading/restrictions/restrictFileType/utils/prepareType/prepareType.js +0 -9
@@ -1,151 +1,24 @@
1
- import { declensionOfWords } from '@astral/utils/declension/declensionOfWords';
2
- import { formatFileSizeToView } from '@astral/utils/file/formatFileSizeToView';
3
- import { useMemo, useState, } from 'react';
4
- import { useGenerateLocalId } from '../../../useGenerateLocalId';
5
- import { useId } from '../../../useId';
6
- import { DEFAULT_FILE_STATUS, previewFileUploaderClassnames, } from '../../constants';
7
- import { restrictFileMaxSize, restrictFileType } from '../../restrictions';
8
- import { compareFile } from '../../utils/compareFile';
9
- import { rulePipe } from '../../utils/rulePipe';
10
- import { toArray } from '../../utils/toArray';
11
- import { useDnD } from '../useDnD';
12
- import { useUploadFiles } from '../useUploadFiles';
13
- export const usePreviewFileUploader = ({ value, isDisabled, accept, restrictions = [], maxFileSize, inputRef, notify, onChange, onUploadFile, onDeleteFile, label, isError, generateDownloadLink, onView, getErrorMessage, name, helperText, className, placeholder, placeholderImgSrc, isHidePersonalData, PdfViewer, }) => {
14
- const inputId = useId();
15
- const [deletingFileId, setDeletingFileId] = useState(null);
16
- const { generateId } = useGenerateLocalId();
17
- // Преобразуем value к массиву
18
- const files = useMemo(() => toArray(value), [value]);
19
- const isVisibleAddFile = !files.length;
20
- const isVisibleFileList = Boolean(files.length);
21
- const restrict = (file) => {
22
- return rulePipe(restrictFileMaxSize(formatFileSizeToView, maxFileSize), ...(accept ? [restrictFileType(accept)] : []), ...restrictions)(file);
23
- };
24
- const declensionFile = declensionOfWords(['файл', 'файла', 'файлов']);
25
- const declensionAdded = declensionOfWords([
26
- 'Добавлен',
27
- 'Добавлено',
28
- 'Добавлено',
29
- ]);
30
- const notifyWarning = (addedFilesLength, droppedFilesLength) => {
31
- notify?.warning(`${declensionAdded(addedFilesLength)} ${addedFilesLength} ${declensionFile(addedFilesLength)} из ${droppedFilesLength}`, {
32
- content: 'Вы превысили максимально допустимое количество файлов для загрузки',
33
- });
34
- };
35
- const getInitialStatusUploadFile = (error) => {
36
- if (error) {
37
- return {
38
- ...DEFAULT_FILE_STATUS,
39
- isRestrictionError: Boolean(error),
40
- errorMsg: error.message,
41
- };
42
- }
43
- return DEFAULT_FILE_STATUS;
44
- };
45
- const { enqueueFiles, refetchFile, setErrorStatusFile, selfFiles } = useUploadFiles({
46
- files,
47
- onChange,
48
- onUploadFile,
49
- getErrorMessage,
50
- });
51
- const handleChange = (event) => {
52
- // Преобразуем к массиву и удаляем дубликаты
53
- const droppedFiles = Array.from(event.target.files || []).filter((droppedFile) => !files.find((file) => compareFile(droppedFile, file)));
54
- const addedFiles = droppedFiles
55
- .slice(0, 1 - files.length)
56
- .reduce((acc, droppedFile) => {
57
- const error = restrict(droppedFile);
58
- return [
59
- // biome-ignore lint/performance/noAccumulatingSpread: <>
60
- ...acc,
61
- {
62
- id: `${inputId}${generateId()}`,
63
- name: droppedFile.name,
64
- type: droppedFile.type,
65
- size: droppedFile.size,
66
- file: droppedFile,
67
- status: getInitialStatusUploadFile(error),
68
- },
69
- ];
70
- }, []);
71
- onChange(addedFiles[0]);
72
- if (addedFiles.length < droppedFiles.length) {
73
- notifyWarning(addedFiles.length, droppedFiles.length);
74
- }
75
- enqueueFiles(addedFiles);
76
- };
77
- const { isDragActive, ...dropZoneActions } = useDnD({
78
- isDisabled,
79
- onChange: (droppedFiles) => {
80
- handleChange({
81
- target: { files: droppedFiles },
82
- });
83
- },
1
+ import { previewFileUploaderClassnames } from '../../constants';
2
+ import { useFileUploader } from '../useFileUploader';
3
+ export const usePreviewFileUploader = ({ placeholderImgSrc, isHidePersonalData, PdfViewer, accept = [], ...props }) => {
4
+ const { dropZoneProps, fileListProps } = useFileUploader({
5
+ ...props,
6
+ accept,
7
+ isMultiple: false,
84
8
  });
85
- const handleDelete = (fileId) => {
86
- const deleteFile = () => onChange(null);
87
- if (!onDeleteFile) {
88
- return deleteFile();
89
- }
90
- setDeletingFileId(fileId);
91
- onDeleteFile(fileId)
92
- .then(deleteFile)
93
- .catch(() => notify.error('Ошибка удаления файла'))
94
- .finally(() => setDeletingFileId(null));
95
- };
96
- const getHandlerOnRetry = () => {
97
- if (onUploadFile) {
98
- return (fileId, file) => refetchFile({ id: fileId, file });
99
- }
100
- return undefined;
101
- };
102
9
  return {
103
10
  dropZoneProps: {
104
- isActive: !isDisabled && isDragActive,
105
- htmlFor: inputId,
11
+ ...dropZoneProps,
106
12
  className: previewFileUploaderClassnames.dropzone,
107
- isDisabled,
108
- isError,
109
- ...dropZoneActions,
110
- isVisibleAddFile,
111
- isVisibleFileList,
112
- fileInputProps: {
113
- id: inputId,
114
- accept: accept?.join() ?? '',
115
- ref: inputRef,
116
- value: '',
117
- onChange: handleChange,
118
- name,
119
- isDisabled,
120
- },
121
13
  hintPlaceholderProps: {
122
- accept,
123
- placeholder,
14
+ ...dropZoneProps.hintPlaceholderProps,
124
15
  placeholderImgSrc,
125
- maxFileSize,
126
- },
127
- uploadButtonProps: {
128
- isDisabled,
129
- htmlFor: inputId,
130
- },
131
- containerProps: {
132
- className,
133
- label,
134
- isError,
135
- helperText,
136
16
  },
137
17
  },
138
18
  fileListProps: {
139
- onDelete: handleDelete,
140
- onRetry: getHandlerOnRetry(),
141
- setErrorStatusFile,
142
- selfFiles,
143
- generateDownloadLink,
144
- onView,
145
- files,
19
+ ...fileListProps,
146
20
  isHidePersonalData,
147
21
  PdfViewer,
148
- deletingFileId,
149
22
  },
150
23
  };
151
24
  };
@@ -2,3 +2,7 @@ export declare const FILE_TYPE_ERROR_INFO: {
2
2
  code: string;
3
3
  message: string;
4
4
  };
5
+ export declare const INCONSISTENCY_EXTENSION_AND_MIME_TYPE_ERROR_INFO: {
6
+ code: string;
7
+ message: string;
8
+ };
@@ -2,3 +2,7 @@ export const FILE_TYPE_ERROR_INFO = {
2
2
  code: 'file-type',
3
3
  message: 'Тип файла недопустим',
4
4
  };
5
+ export const INCONSISTENCY_EXTENSION_AND_MIME_TYPE_ERROR_INFO = {
6
+ code: 'inconsistency-file-type',
7
+ message: 'Содержимое файла не соответствует его расширению',
8
+ };
@@ -1,2 +1,2 @@
1
- import type { RestrictionFn } from '../../types';
2
- export declare const restrictFileType: (accept: string[]) => RestrictionFn;
1
+ import type { AcceptMeta, RestrictionFn } from '../../types';
2
+ export declare const restrictFileType: (acceptMeta: AcceptMeta) => RestrictionFn;
@@ -1,63 +1,39 @@
1
- import { getFileType } from '@astral/utils/file/getFileType';
2
- import { FILE_TYPE_ERROR_INFO } from './constants';
3
- import { getFileTypeFromFile, prepareType } from './utils';
4
- const getGeneralType = (type) => type.split('/')[0];
5
- const compareFileType = (fileTypeA, fileTypeB) => {
6
- if (Object.is(prepareType(fileTypeA), prepareType(fileTypeB))) {
7
- return true;
8
- }
9
- const isGeneralType = /^[\w.-]+\/\*$/.test(fileTypeA);
10
- // Если переданный тип заканчивается на '/*'
11
- if (isGeneralType) {
12
- return Object.is(getGeneralType(fileTypeA), getGeneralType(fileTypeB));
13
- }
14
- return false;
15
- };
16
- export const restrictFileType = (accept) => (file) => {
17
- if (!file || !accept.length) {
1
+ import { MimeTypeRegistry } from '../../services/MimeTypeRegistry';
2
+ import { FILE_TYPE_ERROR_INFO, INCONSISTENCY_EXTENSION_AND_MIME_TYPE_ERROR_INFO, } from './constants';
3
+ import { getFileMeta } from './utils';
4
+ const getAcceptMimeTypes = (acceptMeta) => acceptMeta.mimeTypes.concat(...acceptMeta.extensions
5
+ .map((extension) => MimeTypeRegistry.getInstance().getMimeTypeByExtension(extension))
6
+ .filter((value) => typeof value === 'string'));
7
+ const checkEmptyAccept = (acceptMeta) => !acceptMeta.extensions.length &&
8
+ !acceptMeta.mimeTypes.length &&
9
+ !acceptMeta.generalMimeTypes.length;
10
+ export const restrictFileType = (acceptMeta) => (file) => {
11
+ if (!file || checkEmptyAccept(acceptMeta)) {
18
12
  return undefined;
19
13
  }
20
- const acceptInput = [...accept];
21
- const addMimeTypes = (mimeType) => {
22
- mimeType.forEach((type) => {
23
- if (!accept.includes(type)) {
24
- acceptInput.push(type);
25
- }
26
- });
27
- };
28
- if (accept.includes('.xml')) {
29
- addMimeTypes(['text/xml']);
14
+ const fileMeta = getFileMeta(file);
15
+ const acceptMimeTypes = getAcceptMimeTypes(acceptMeta);
16
+ if (acceptMeta.generalMimeTypes.length) {
17
+ const isValid = acceptMeta.generalMimeTypes.some((mimeType) => mimeType.split('/')[0] === fileMeta.mimeType.split('/')[0]);
18
+ if (!isValid) {
19
+ return FILE_TYPE_ERROR_INFO;
20
+ }
21
+ return undefined;
30
22
  }
31
- if (accept.includes('.zip')) {
32
- addMimeTypes([
33
- 'application/zip',
34
- 'application/zip-compressed',
35
- 'application/x-zip-compressed',
36
- ]);
23
+ const isInconsistencyExtensionAndMimeType = !MimeTypeRegistry.getInstance()
24
+ .getExtensionsByMimeType(fileMeta.mimeType)
25
+ ?.includes(fileMeta.extension);
26
+ if (isInconsistencyExtensionAndMimeType) {
27
+ return INCONSISTENCY_EXTENSION_AND_MIME_TYPE_ERROR_INFO;
37
28
  }
38
- if (accept.includes('.rar')) {
39
- addMimeTypes([
40
- 'application/x-rar-compressed',
41
- 'application/vnd.rar',
42
- 'application/x-compressed',
43
- ]);
29
+ if (!acceptMimeTypes.includes(fileMeta.mimeType)) {
30
+ return FILE_TYPE_ERROR_INFO;
44
31
  }
45
- // Приводим к MIME-Type
46
- const acceptedTypes = acceptInput.map((acceptType) => {
47
- if (acceptType.includes('/')) {
48
- return acceptType;
49
- }
50
- return getFileType(acceptType) || acceptType;
51
- });
52
- const fileType = getFileTypeFromFile(file);
53
- const isValid = acceptedTypes.some((acceptedType) => {
54
- return compareFileType(acceptedType, fileType);
55
- });
56
- if (!isValid) {
57
- return {
58
- code: FILE_TYPE_ERROR_INFO.code,
59
- message: FILE_TYPE_ERROR_INFO.message,
60
- };
32
+ // Если в accept указаны только расширения, то нужно проверить соотносится ли расширение с разрешенным
33
+ // Ибо mime type может подойти (например, image/jpeg может быть jpg, jpeg, jpe)
34
+ if (acceptMeta.isOnlyExtensions &&
35
+ !acceptMeta.extensions.includes(fileMeta.extension)) {
36
+ return FILE_TYPE_ERROR_INFO;
61
37
  }
62
38
  return undefined;
63
39
  };
@@ -0,0 +1,5 @@
1
+ export type FileMeta = {
2
+ mimeType: string;
3
+ extension: string;
4
+ };
5
+ export declare const getFileMeta: (file: File) => FileMeta;
@@ -0,0 +1,21 @@
1
+ import { MimeTypeRegistry } from '../../../../services/MimeTypeRegistry';
2
+ const getExtensionFromName = (filename) => {
3
+ const lastDotIndex = filename.lastIndexOf('.');
4
+ if (lastDotIndex < 0) {
5
+ return '';
6
+ }
7
+ return filename.slice(lastDotIndex + 1);
8
+ };
9
+ export const getFileMeta = (file) => {
10
+ const extension = getExtensionFromName(file.name);
11
+ if (file.type) {
12
+ return {
13
+ mimeType: file.type,
14
+ extension,
15
+ };
16
+ }
17
+ return {
18
+ mimeType: MimeTypeRegistry.getInstance().getMimeTypeByExtension(extension) || '',
19
+ extension,
20
+ };
21
+ };
@@ -1,2 +1 @@
1
- export * from './getFileTypeFromFile';
2
- export * from './prepareType';
1
+ export * from './getFileMeta';
@@ -1,2 +1 @@
1
- export * from './getFileTypeFromFile';
2
- export * from './prepareType';
1
+ export * from './getFileMeta';
@@ -0,0 +1,9 @@
1
+ export declare class MimeTypeRegistry {
2
+ private static instanceRef?;
3
+ private readonly extensionsMap;
4
+ private readonly mimeTypesMap;
5
+ private constructor();
6
+ getMimeTypeByExtension(extension: string): string | null;
7
+ getExtensionsByMimeType(mimeType: string): string[] | null;
8
+ static getInstance(): MimeTypeRegistry;
9
+ }
@@ -0,0 +1,27 @@
1
+ import { getMimeTypesMap } from './constants';
2
+ export class MimeTypeRegistry {
3
+ constructor() {
4
+ this.mimeTypesMap = getMimeTypesMap();
5
+ this.extensionsMap = new Map();
6
+ for (const [mimeType, extensions] of Object.entries(this.mimeTypesMap)) {
7
+ for (const extension of extensions) {
8
+ this.extensionsMap.set(extension, mimeType);
9
+ }
10
+ }
11
+ }
12
+ getMimeTypeByExtension(extension) {
13
+ return (this.extensionsMap.get(extension.toLowerCase().replace('.', '')) || null);
14
+ }
15
+ getExtensionsByMimeType(mimeType) {
16
+ return this.mimeTypesMap[mimeType] || null;
17
+ }
18
+ static getInstance() {
19
+ const instance = this.instanceRef?.deref();
20
+ if (instance) {
21
+ return instance;
22
+ }
23
+ const newInstance = new MimeTypeRegistry();
24
+ this.instanceRef = new WeakRef(newInstance);
25
+ return newInstance;
26
+ }
27
+ }
@@ -0,0 +1 @@
1
+ export declare const getMimeTypesMap: () => Record<string, string[]>;