@strapi/upload 5.52.2 → 5.53.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/dist/admin/components/AssetCard/AssetCard.js +1 -0
- package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCard.mjs +1 -0
- package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.js +1 -0
- package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.mjs +1 -0
- package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.js +1 -0
- package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.mjs +1 -0
- package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.js +1 -0
- package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.mjs +1 -0
- package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.js +1 -0
- package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.mjs +1 -0
- package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.js +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js +1 -0
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs +1 -0
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +1 -0
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +1 -0
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js +1 -0
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +1 -0
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js +1 -0
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs +1 -0
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -1
- package/dist/admin/components/FilterList/FilterList.js +2 -2
- package/dist/admin/components/FilterList/FilterList.js.map +1 -1
- package/dist/admin/components/FilterList/FilterList.mjs +2 -2
- package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
- package/dist/admin/components/FilterPopover/FilterPopover.js +4 -4
- package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
- package/dist/admin/components/FilterPopover/FilterPopover.mjs +4 -4
- package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +1 -0
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +1 -0
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js +1 -0
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs +1 -0
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +4 -10
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs +4 -10
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.js +1 -0
- package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.mjs +1 -0
- package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
- package/dist/admin/components/TableList/CellContent.js +1 -0
- package/dist/admin/components/TableList/CellContent.js.map +1 -1
- package/dist/admin/components/TableList/CellContent.mjs +1 -0
- package/dist/admin/components/TableList/CellContent.mjs.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.js +1 -0
- package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.mjs +1 -0
- package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
- package/dist/admin/components/TableList/TableList.js +1 -0
- package/dist/admin/components/TableList/TableList.js.map +1 -1
- package/dist/admin/components/TableList/TableList.mjs +1 -0
- package/dist/admin/components/TableList/TableList.mjs.map +1 -1
- package/dist/admin/components/TableList/TableRows.js +1 -0
- package/dist/admin/components/TableList/TableRows.js.map +1 -1
- package/dist/admin/components/TableList/TableRows.mjs +1 -0
- package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js +1 -0
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs +1 -0
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +9 -21
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +9 -21
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +1 -0
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +1 -0
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +1 -0
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +1 -0
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
- package/dist/admin/constants.js +1 -0
- package/dist/admin/constants.js.map +1 -1
- package/dist/admin/constants.mjs +1 -0
- package/dist/admin/constants.mjs.map +1 -1
- package/dist/admin/future/components/Drawer.js +17 -3
- package/dist/admin/future/components/Drawer.js.map +1 -1
- package/dist/admin/future/components/Drawer.mjs +17 -3
- package/dist/admin/future/components/Drawer.mjs.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.js +46 -12
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.mjs +47 -13
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.js +27 -2
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +27 -2
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +9 -1
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +9 -1
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +19 -4
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +19 -4
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +64 -10
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +66 -12
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +17 -5
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +17 -5
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +56 -28
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +58 -30
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +203 -83
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +207 -87
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +21 -3
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +21 -3
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.js +181 -0
- package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.mjs +179 -0
- package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/constants.js +22 -0
- package/dist/admin/future/pages/Assets/constants.js.map +1 -1
- package/dist/admin/future/pages/Assets/constants.mjs +19 -1
- package/dist/admin/future/pages/Assets/constants.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +4 -3
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +5 -4
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +105 -12
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +106 -13
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useListFilters.js +5 -5
- package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +6 -6
- package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.js +111 -0
- package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.mjs +109 -0
- package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.js +10 -10
- package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +11 -11
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.js +86 -0
- package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.mjs +83 -0
- package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/renderedKeys.js +19 -0
- package/dist/admin/future/pages/Assets/utils/renderedKeys.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/renderedKeys.mjs +17 -0
- package/dist/admin/future/pages/Assets/utils/renderedKeys.mjs.map +1 -0
- package/dist/admin/future/services/api.js +19 -6
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +19 -6
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/store/uploadProgress.js +55 -2
- package/dist/admin/future/store/uploadProgress.js.map +1 -1
- package/dist/admin/future/store/uploadProgress.mjs +53 -3
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.js +1 -0
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs +1 -0
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/App/MediaLibrary.js +7 -9
- package/dist/admin/pages/App/MediaLibrary.js.map +1 -1
- package/dist/admin/pages/App/MediaLibrary.mjs +8 -10
- package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -1
- package/dist/admin/pages/App/components/BulkActions.js +1 -0
- package/dist/admin/pages/App/components/BulkActions.js.map +1 -1
- package/dist/admin/pages/App/components/BulkActions.mjs +1 -0
- package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.js +1 -0
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs +1 -0
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -1
- package/dist/admin/pages/App/components/Filters.js +8 -8
- package/dist/admin/pages/App/components/Filters.js.map +1 -1
- package/dist/admin/pages/App/components/Filters.mjs +9 -9
- package/dist/admin/pages/App/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/App/components/Header.js +1 -1
- package/dist/admin/pages/App/components/Header.js.map +1 -1
- package/dist/admin/pages/App/components/Header.mjs +2 -2
- package/dist/admin/pages/App/components/Header.mjs.map +1 -1
- package/dist/admin/src/future/components/Drawer.d.ts +10 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +4 -1
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +4 -1
- package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/components/MainAreaContextMenu.d.ts +28 -0
- package/dist/admin/src/future/pages/Assets/constants.d.ts +20 -0
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +4 -0
- package/dist/admin/src/future/pages/Assets/hooks/useListScrollRestoration.d.ts +15 -0
- package/dist/admin/src/future/pages/Assets/utils/mergeUploadedAssets.d.ts +35 -0
- package/dist/admin/src/future/pages/Assets/utils/renderedKeys.d.ts +19 -0
- package/dist/admin/src/future/store/uploadProgress.d.ts +51 -0
- package/dist/admin/src/utils/index.d.ts +1 -0
- package/dist/admin/src/utils/rawFileToAsset.d.ts +2 -2
- package/dist/admin/src/utils/resolveFileMime.d.ts +13 -0
- package/dist/admin/translations/en.json.js +5 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +5 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/getFolderURL.js +2 -1
- package/dist/admin/utils/getFolderURL.js.map +1 -1
- package/dist/admin/utils/getFolderURL.mjs +2 -1
- package/dist/admin/utils/getFolderURL.mjs.map +1 -1
- package/dist/admin/utils/rawFileToAsset.js +5 -3
- package/dist/admin/utils/rawFileToAsset.js.map +1 -1
- package/dist/admin/utils/rawFileToAsset.mjs +5 -3
- package/dist/admin/utils/rawFileToAsset.mjs.map +1 -1
- package/dist/admin/utils/resolveFileMime.js +69 -0
- package/dist/admin/utils/resolveFileMime.js.map +1 -0
- package/dist/admin/utils/resolveFileMime.mjs +64 -0
- package/dist/admin/utils/resolveFileMime.mjs.map +1 -0
- package/dist/admin/utils/urlsToAssets.js +8 -4
- package/dist/admin/utils/urlsToAssets.js.map +1 -1
- package/dist/admin/utils/urlsToAssets.mjs +8 -4
- package/dist/admin/utils/urlsToAssets.mjs.map +1 -1
- package/dist/server/services/upload.js +20 -8
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +20 -8
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/index.d.ts +2 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +2 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts +2 -0
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/package.json +6 -6
|
@@ -74,7 +74,8 @@ var en = {
|
|
|
74
74
|
"upload.progress.success": "Upload successful!",
|
|
75
75
|
"upload.progress.success.subtitle": "{count, plural, one {# file uploaded successfully} other {# files uploaded successfully}}",
|
|
76
76
|
"upload.progress.success.subtitle.withErrors": "{successCount} uploaded, {errorCount} failed",
|
|
77
|
-
"upload.progress.uploading.withCount": "Uploading {total} items ({percentage}%)",
|
|
77
|
+
"upload.progress.uploading.withCount": "Uploading {total, plural, one {# item} other {# items}} ({percentage}%)",
|
|
78
|
+
"upload.progress.uploading.indeterminate": "Uploading {total, plural, one {# item} other {# items}}",
|
|
78
79
|
"upload.progress.uploading-files": "Uploading {count, plural, one {# file} other {# files}}",
|
|
79
80
|
"upload.progress.indicator.in-progress": "Upload in progress indicator",
|
|
80
81
|
"upload.progress.indicator.complete": "Upload complete indicator",
|
|
@@ -338,8 +339,10 @@ var en = {
|
|
|
338
339
|
"list.table.row.select": "Select {name}",
|
|
339
340
|
"list.table.row.metadata-missing": "This asset is missing metadata (caption or alternative text).",
|
|
340
341
|
"list.table.content.empty-label": "This field is empty",
|
|
342
|
+
"list.context-menu.label": "Media library actions",
|
|
341
343
|
"list.bulk-actions.label": "Bulk actions",
|
|
342
344
|
"list.bulk-actions.selected-count": "{count, plural, =1 {# item selected} other {# items selected}}",
|
|
345
|
+
"list.bulk-actions.select-all": "Select all",
|
|
343
346
|
"list.bulk-actions.clear": "Clear selection",
|
|
344
347
|
"list.bulk-actions.create-metadata": "Create metadata",
|
|
345
348
|
"list.bulk-actions.create-metadata.success": "{count, plural, =1 {Metadata generated for # asset} other {Metadata generated for # assets}}",
|
|
@@ -385,6 +388,7 @@ var en = {
|
|
|
385
388
|
"sidebar.folders": "Folders",
|
|
386
389
|
"sidebar.tree.aria-label": "Media library folders",
|
|
387
390
|
"sidebar.tree.expand": "Expand {name}",
|
|
391
|
+
"sidebar.tree.no-subfolders": "The folder {name} has no subfolders",
|
|
388
392
|
"sidebar.tree.collapse": "Collapse {name}",
|
|
389
393
|
"sidebar.tree.empty": "No folders yet",
|
|
390
394
|
"sidebar.tree.loading": "Loading folders...",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
3
4
|
var qs = require('qs');
|
|
4
5
|
|
|
5
6
|
const getFolderURL = (pathname, currentQuery, { folder, folderPath } = {})=>{
|
|
6
7
|
const { _q, ...queryParamsWithoutQ } = currentQuery;
|
|
7
8
|
const queryParamsString = qs.stringify({
|
|
8
|
-
...queryParamsWithoutQ,
|
|
9
|
+
...strapiAdmin.deepEncodeQueryValues(queryParamsWithoutQ),
|
|
9
10
|
folder,
|
|
10
11
|
folderPath
|
|
11
12
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFolderURL.js","sources":["../../../admin/src/utils/getFolderURL.ts"],"sourcesContent":["import { stringify } from 'qs';\n\nimport type { Query } from '../../../shared/contracts/files';\n\nexport const getFolderURL = (\n pathname: string,\n currentQuery: Query,\n { folder, folderPath }: { folder?: string; folderPath?: string } = {}\n) => {\n const { _q, ...queryParamsWithoutQ } = currentQuery;\n const queryParamsString = stringify(\n {\n ...queryParamsWithoutQ,\n folder,\n folderPath,\n },\n { encode: false }\n );\n\n // Search query will always fetch the same results\n // we remove it here to allow navigating in a folder and see the result of this navigation\n return `${pathname}${queryParamsString ? `?${queryParamsString}` : ''}`;\n};\n"],"names":["getFolderURL","pathname","currentQuery","folder","folderPath","_q","queryParamsWithoutQ","queryParamsString","stringify","encode"],"mappings":"
|
|
1
|
+
{"version":3,"file":"getFolderURL.js","sources":["../../../admin/src/utils/getFolderURL.ts"],"sourcesContent":["import { deepEncodeQueryValues } from '@strapi/admin/strapi-admin';\nimport { stringify } from 'qs';\n\nimport type { Query } from '../../../shared/contracts/files';\n\nexport const getFolderURL = (\n pathname: string,\n currentQuery: Query,\n { folder, folderPath }: { folder?: string; folderPath?: string } = {}\n) => {\n const { _q, ...queryParamsWithoutQ } = currentQuery;\n const queryParamsString = stringify(\n {\n ...deepEncodeQueryValues(queryParamsWithoutQ),\n folder,\n folderPath,\n },\n { encode: false }\n );\n\n // Search query will always fetch the same results\n // we remove it here to allow navigating in a folder and see the result of this navigation\n return `${pathname}${queryParamsString ? `?${queryParamsString}` : ''}`;\n};\n"],"names":["getFolderURL","pathname","currentQuery","folder","folderPath","_q","queryParamsWithoutQ","queryParamsString","stringify","deepEncodeQueryValues","encode"],"mappings":";;;;;AAKO,MAAMA,YAAAA,GAAe,CAC1BC,QAAAA,EACAC,YAAAA,EACA,EAAEC,MAAM,EAAEC,UAAU,EAA4C,GAAG,EAAE,GAAA;AAErE,IAAA,MAAM,EAAEC,EAAE,EAAE,GAAGC,qBAAqB,GAAGJ,YAAAA;AACvC,IAAA,MAAMK,oBAAoBC,YAAAA,CACxB;AACE,QAAA,GAAGC,kCAAsBH,mBAAAA,CAAoB;AAC7CH,QAAAA,MAAAA;AACAC,QAAAA;KACF,EACA;QAAEM,MAAAA,EAAQ;AAAM,KAAA,CAAA;;;IAKlB,OAAO,CAAA,EAAGT,WAAWM,iBAAAA,GAAoB,CAAC,CAAC,EAAEA,iBAAAA,CAAAA,CAAmB,GAAG,EAAA,CAAA,CAAI;AACzE;;;;"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { deepEncodeQueryValues } from '@strapi/admin/strapi-admin';
|
|
1
2
|
import { stringify } from 'qs';
|
|
2
3
|
|
|
3
4
|
const getFolderURL = (pathname, currentQuery, { folder, folderPath } = {})=>{
|
|
4
5
|
const { _q, ...queryParamsWithoutQ } = currentQuery;
|
|
5
6
|
const queryParamsString = stringify({
|
|
6
|
-
...queryParamsWithoutQ,
|
|
7
|
+
...deepEncodeQueryValues(queryParamsWithoutQ),
|
|
7
8
|
folder,
|
|
8
9
|
folderPath
|
|
9
10
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFolderURL.mjs","sources":["../../../admin/src/utils/getFolderURL.ts"],"sourcesContent":["import { stringify } from 'qs';\n\nimport type { Query } from '../../../shared/contracts/files';\n\nexport const getFolderURL = (\n pathname: string,\n currentQuery: Query,\n { folder, folderPath }: { folder?: string; folderPath?: string } = {}\n) => {\n const { _q, ...queryParamsWithoutQ } = currentQuery;\n const queryParamsString = stringify(\n {\n ...queryParamsWithoutQ,\n folder,\n folderPath,\n },\n { encode: false }\n );\n\n // Search query will always fetch the same results\n // we remove it here to allow navigating in a folder and see the result of this navigation\n return `${pathname}${queryParamsString ? `?${queryParamsString}` : ''}`;\n};\n"],"names":["getFolderURL","pathname","currentQuery","folder","folderPath","_q","queryParamsWithoutQ","queryParamsString","stringify","encode"],"mappings":"
|
|
1
|
+
{"version":3,"file":"getFolderURL.mjs","sources":["../../../admin/src/utils/getFolderURL.ts"],"sourcesContent":["import { deepEncodeQueryValues } from '@strapi/admin/strapi-admin';\nimport { stringify } from 'qs';\n\nimport type { Query } from '../../../shared/contracts/files';\n\nexport const getFolderURL = (\n pathname: string,\n currentQuery: Query,\n { folder, folderPath }: { folder?: string; folderPath?: string } = {}\n) => {\n const { _q, ...queryParamsWithoutQ } = currentQuery;\n const queryParamsString = stringify(\n {\n ...deepEncodeQueryValues(queryParamsWithoutQ),\n folder,\n folderPath,\n },\n { encode: false }\n );\n\n // Search query will always fetch the same results\n // we remove it here to allow navigating in a folder and see the result of this navigation\n return `${pathname}${queryParamsString ? `?${queryParamsString}` : ''}`;\n};\n"],"names":["getFolderURL","pathname","currentQuery","folder","folderPath","_q","queryParamsWithoutQ","queryParamsString","stringify","deepEncodeQueryValues","encode"],"mappings":";;;AAKO,MAAMA,YAAAA,GAAe,CAC1BC,QAAAA,EACAC,YAAAA,EACA,EAAEC,MAAM,EAAEC,UAAU,EAA4C,GAAG,EAAE,GAAA;AAErE,IAAA,MAAM,EAAEC,EAAE,EAAE,GAAGC,qBAAqB,GAAGJ,YAAAA;AACvC,IAAA,MAAMK,oBAAoBC,SAAAA,CACxB;AACE,QAAA,GAAGC,sBAAsBH,mBAAAA,CAAoB;AAC7CH,QAAAA,MAAAA;AACAC,QAAAA;KACF,EACA;QAAEM,MAAAA,EAAQ;AAAM,KAAA,CAAA;;;IAKlB,OAAO,CAAA,EAAGT,WAAWM,iBAAAA,GAAoB,CAAC,CAAC,EAAEA,iBAAAA,CAAAA,CAAmB,GAAG,EAAA,CAAA,CAAI;AACzE;;;;"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var resolveFileMime = require('./resolveFileMime.js');
|
|
3
4
|
var typeFromMime = require('./typeFromMime.js');
|
|
4
5
|
|
|
5
|
-
const rawFileToAsset = (rawFile, assetSource)=>{
|
|
6
|
+
const rawFileToAsset = async (rawFile, assetSource)=>{
|
|
7
|
+
const mime = await resolveFileMime.resolveFileMime(rawFile.type, rawFile);
|
|
6
8
|
return {
|
|
7
9
|
size: rawFile.size / 1000,
|
|
8
10
|
createdAt: new Date(rawFile.lastModified).toISOString(),
|
|
9
11
|
name: rawFile.name,
|
|
10
12
|
source: assetSource,
|
|
11
|
-
type: typeFromMime.typeFromMime(
|
|
13
|
+
type: typeFromMime.typeFromMime(mime),
|
|
12
14
|
url: URL.createObjectURL(rawFile),
|
|
13
15
|
ext: rawFile.name.split('.').pop(),
|
|
14
|
-
mime
|
|
16
|
+
mime,
|
|
15
17
|
rawFile,
|
|
16
18
|
isLocal: true
|
|
17
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rawFileToAsset.js","sources":["../../../admin/src/utils/rawFileToAsset.ts"],"sourcesContent":["import { AssetSource } from '../constants';\n\nimport { typeFromMime } from './typeFromMime';\n\nimport type { RawFile } from '../../../shared/contracts/files';\n\nexport const rawFileToAsset = (rawFile: RawFile, assetSource: AssetSource) => {\n return {\n size: rawFile.size / 1000,\n createdAt: new Date(rawFile.lastModified).toISOString(),\n name: rawFile.name,\n source: assetSource,\n type: typeFromMime(
|
|
1
|
+
{"version":3,"file":"rawFileToAsset.js","sources":["../../../admin/src/utils/rawFileToAsset.ts"],"sourcesContent":["import { AssetSource } from '../constants';\n\nimport { resolveFileMime } from './resolveFileMime';\nimport { typeFromMime } from './typeFromMime';\n\nimport type { RawFile } from '../../../shared/contracts/files';\n\nexport const rawFileToAsset = async (rawFile: RawFile, assetSource: AssetSource) => {\n const mime = await resolveFileMime(rawFile.type, rawFile);\n\n return {\n size: rawFile.size / 1000,\n createdAt: new Date(rawFile.lastModified).toISOString(),\n name: rawFile.name,\n source: assetSource,\n type: typeFromMime(mime),\n url: URL.createObjectURL(rawFile),\n ext: rawFile.name.split('.').pop(),\n mime,\n rawFile,\n isLocal: true,\n };\n};\n"],"names":["rawFileToAsset","rawFile","assetSource","mime","resolveFileMime","type","size","createdAt","Date","lastModified","toISOString","name","source","typeFromMime","url","URL","createObjectURL","ext","split","pop","isLocal"],"mappings":";;;;;AAOO,MAAMA,cAAAA,GAAiB,OAAOC,OAAAA,EAAkBC,WAAAA,GAAAA;AACrD,IAAA,MAAMC,IAAAA,GAAO,MAAMC,+BAAAA,CAAgBH,OAAAA,CAAQI,IAAI,EAAEJ,OAAAA,CAAAA;IAEjD,OAAO;QACLK,IAAAA,EAAML,OAAAA,CAAQK,IAAI,GAAG,IAAA;AACrBC,QAAAA,SAAAA,EAAW,IAAIC,IAAAA,CAAKP,OAAAA,CAAQQ,YAAY,EAAEC,WAAW,EAAA;AACrDC,QAAAA,IAAAA,EAAMV,QAAQU,IAAI;QAClBC,MAAAA,EAAQV,WAAAA;AACRG,QAAAA,IAAAA,EAAMQ,yBAAAA,CAAaV,IAAAA,CAAAA;QACnBW,GAAAA,EAAKC,GAAAA,CAAIC,eAAe,CAACf,OAAAA,CAAAA;AACzBgB,QAAAA,GAAAA,EAAKhB,QAAQU,IAAI,CAACO,KAAK,CAAC,KAAKC,GAAG,EAAA;AAChChB,QAAAA,IAAAA;AACAF,QAAAA,OAAAA;QACAmB,OAAAA,EAAS;AACX,KAAA;AACF;;;;"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import { resolveFileMime } from './resolveFileMime.mjs';
|
|
1
2
|
import { typeFromMime } from './typeFromMime.mjs';
|
|
2
3
|
|
|
3
|
-
const rawFileToAsset = (rawFile, assetSource)=>{
|
|
4
|
+
const rawFileToAsset = async (rawFile, assetSource)=>{
|
|
5
|
+
const mime = await resolveFileMime(rawFile.type, rawFile);
|
|
4
6
|
return {
|
|
5
7
|
size: rawFile.size / 1000,
|
|
6
8
|
createdAt: new Date(rawFile.lastModified).toISOString(),
|
|
7
9
|
name: rawFile.name,
|
|
8
10
|
source: assetSource,
|
|
9
|
-
type: typeFromMime(
|
|
11
|
+
type: typeFromMime(mime),
|
|
10
12
|
url: URL.createObjectURL(rawFile),
|
|
11
13
|
ext: rawFile.name.split('.').pop(),
|
|
12
|
-
mime
|
|
14
|
+
mime,
|
|
13
15
|
rawFile,
|
|
14
16
|
isLocal: true
|
|
15
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rawFileToAsset.mjs","sources":["../../../admin/src/utils/rawFileToAsset.ts"],"sourcesContent":["import { AssetSource } from '../constants';\n\nimport { typeFromMime } from './typeFromMime';\n\nimport type { RawFile } from '../../../shared/contracts/files';\n\nexport const rawFileToAsset = (rawFile: RawFile, assetSource: AssetSource) => {\n return {\n size: rawFile.size / 1000,\n createdAt: new Date(rawFile.lastModified).toISOString(),\n name: rawFile.name,\n source: assetSource,\n type: typeFromMime(
|
|
1
|
+
{"version":3,"file":"rawFileToAsset.mjs","sources":["../../../admin/src/utils/rawFileToAsset.ts"],"sourcesContent":["import { AssetSource } from '../constants';\n\nimport { resolveFileMime } from './resolveFileMime';\nimport { typeFromMime } from './typeFromMime';\n\nimport type { RawFile } from '../../../shared/contracts/files';\n\nexport const rawFileToAsset = async (rawFile: RawFile, assetSource: AssetSource) => {\n const mime = await resolveFileMime(rawFile.type, rawFile);\n\n return {\n size: rawFile.size / 1000,\n createdAt: new Date(rawFile.lastModified).toISOString(),\n name: rawFile.name,\n source: assetSource,\n type: typeFromMime(mime),\n url: URL.createObjectURL(rawFile),\n ext: rawFile.name.split('.').pop(),\n mime,\n rawFile,\n isLocal: true,\n };\n};\n"],"names":["rawFileToAsset","rawFile","assetSource","mime","resolveFileMime","type","size","createdAt","Date","lastModified","toISOString","name","source","typeFromMime","url","URL","createObjectURL","ext","split","pop","isLocal"],"mappings":";;;AAOO,MAAMA,cAAAA,GAAiB,OAAOC,OAAAA,EAAkBC,WAAAA,GAAAA;AACrD,IAAA,MAAMC,IAAAA,GAAO,MAAMC,eAAAA,CAAgBH,OAAAA,CAAQI,IAAI,EAAEJ,OAAAA,CAAAA;IAEjD,OAAO;QACLK,IAAAA,EAAML,OAAAA,CAAQK,IAAI,GAAG,IAAA;AACrBC,QAAAA,SAAAA,EAAW,IAAIC,IAAAA,CAAKP,OAAAA,CAAQQ,YAAY,EAAEC,WAAW,EAAA;AACrDC,QAAAA,IAAAA,EAAMV,QAAQU,IAAI;QAClBC,MAAAA,EAAQV,WAAAA;AACRG,QAAAA,IAAAA,EAAMQ,YAAAA,CAAaV,IAAAA,CAAAA;QACnBW,GAAAA,EAAKC,GAAAA,CAAIC,eAAe,CAACf,OAAAA,CAAAA;AACzBgB,QAAAA,GAAAA,EAAKhB,QAAQU,IAAI,CAACO,KAAK,CAAC,KAAKC,GAAG,EAAA;AAChChB,QAAAA,IAAAA;AACAF,QAAAA,OAAAA;QACAmB,OAAAA,EAAS;AACX,KAAA;AACF;;;;"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const GENERIC_MIMES = new Set([
|
|
4
|
+
'',
|
|
5
|
+
'application/octet-stream'
|
|
6
|
+
]);
|
|
7
|
+
/**
|
|
8
|
+
* Same byte window currently used by server MIME validation (`readFileChunk(..., 4100)`).
|
|
9
|
+
* Magic-number detection only needs the start of the file.
|
|
10
|
+
*/ const FILE_TYPE_SNIFF_BYTES = 4100;
|
|
11
|
+
const normalizeDeclaredMime = (mime)=>(mime ?? '').trim().split(';')[0].trim();
|
|
12
|
+
const isGenericMime = (mime)=>{
|
|
13
|
+
const declared = normalizeDeclaredMime(mime);
|
|
14
|
+
return !declared || GENERIC_MIMES.has(declared.toLowerCase());
|
|
15
|
+
};
|
|
16
|
+
const readBlobBytes = async (blob)=>{
|
|
17
|
+
const chunk = typeof blob.slice === 'function' ? blob.slice(0, FILE_TYPE_SNIFF_BYTES) : blob;
|
|
18
|
+
if (typeof chunk.arrayBuffer === 'function') {
|
|
19
|
+
return new Uint8Array(await chunk.arrayBuffer());
|
|
20
|
+
}
|
|
21
|
+
// jsdom's Blob.slice() result has no arrayBuffer(); FileReader works in browsers and tests.
|
|
22
|
+
return new Promise((resolve, reject)=>{
|
|
23
|
+
const reader = new FileReader();
|
|
24
|
+
reader.onload = ()=>{
|
|
25
|
+
resolve(new Uint8Array(reader.result));
|
|
26
|
+
};
|
|
27
|
+
reader.onerror = ()=>{
|
|
28
|
+
reject(reader.error ?? new Error('Failed to read file'));
|
|
29
|
+
};
|
|
30
|
+
reader.readAsArrayBuffer(chunk);
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Detect MIME from file bytes with file-type.
|
|
35
|
+
* The admin normalizes declared MIME values more permissively; server validation remains authoritative.
|
|
36
|
+
* Returns undefined when the blob cannot be read or the type is unknown.
|
|
37
|
+
*/ const detectMimeFromBlob = async (blob)=>{
|
|
38
|
+
try {
|
|
39
|
+
const buffer = await readBlobBytes(blob);
|
|
40
|
+
// Browser/core build — do not pull the Node `file-type` entry into the admin bundle.
|
|
41
|
+
const { fileTypeFromBuffer } = await import('file-type/core');
|
|
42
|
+
const result = await fileTypeFromBuffer(buffer);
|
|
43
|
+
return result?.mime;
|
|
44
|
+
} catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* When the browser MIME is missing or generic, sniff the file contents.
|
|
50
|
+
* If there is no blob (library assets) or detection fails, keep the declared type.
|
|
51
|
+
*/ const resolveFileMime = async (mime, blob)=>{
|
|
52
|
+
const declared = normalizeDeclaredMime(mime);
|
|
53
|
+
if (declared && !isGenericMime(declared)) {
|
|
54
|
+
return declared;
|
|
55
|
+
}
|
|
56
|
+
if (blob) {
|
|
57
|
+
const detected = await detectMimeFromBlob(blob);
|
|
58
|
+
if (detected) {
|
|
59
|
+
return detected;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return declared;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
exports.detectMimeFromBlob = detectMimeFromBlob;
|
|
66
|
+
exports.isGenericMime = isGenericMime;
|
|
67
|
+
exports.normalizeDeclaredMime = normalizeDeclaredMime;
|
|
68
|
+
exports.resolveFileMime = resolveFileMime;
|
|
69
|
+
//# sourceMappingURL=resolveFileMime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveFileMime.js","sources":["../../../admin/src/utils/resolveFileMime.ts"],"sourcesContent":["const GENERIC_MIMES = new Set(['', 'application/octet-stream']);\n\n/**\n * Same byte window currently used by server MIME validation (`readFileChunk(..., 4100)`).\n * Magic-number detection only needs the start of the file.\n */\nconst FILE_TYPE_SNIFF_BYTES = 4100;\n\nexport const normalizeDeclaredMime = (mime?: string | null): string =>\n (mime ?? '').trim().split(';')[0].trim();\n\nexport const isGenericMime = (mime?: string | null): boolean => {\n const declared = normalizeDeclaredMime(mime);\n\n return !declared || GENERIC_MIMES.has(declared.toLowerCase());\n};\n\nconst readBlobBytes = async (blob: Blob): Promise<Uint8Array> => {\n const chunk = typeof blob.slice === 'function' ? blob.slice(0, FILE_TYPE_SNIFF_BYTES) : blob;\n\n if (typeof chunk.arrayBuffer === 'function') {\n return new Uint8Array(await chunk.arrayBuffer());\n }\n\n // jsdom's Blob.slice() result has no arrayBuffer(); FileReader works in browsers and tests.\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(new Uint8Array(reader.result as ArrayBuffer));\n };\n reader.onerror = () => {\n reject(reader.error ?? new Error('Failed to read file'));\n };\n reader.readAsArrayBuffer(chunk);\n });\n};\n\n/**\n * Detect MIME from file bytes with file-type.\n * The admin normalizes declared MIME values more permissively; server validation remains authoritative.\n * Returns undefined when the blob cannot be read or the type is unknown.\n */\nexport const detectMimeFromBlob = async (blob: Blob): Promise<string | undefined> => {\n try {\n const buffer = await readBlobBytes(blob);\n // Browser/core build — do not pull the Node `file-type` entry into the admin bundle.\n const { fileTypeFromBuffer } = await import('file-type/core');\n const result = await fileTypeFromBuffer(buffer);\n\n return result?.mime;\n } catch {\n return undefined;\n }\n};\n\n/**\n * When the browser MIME is missing or generic, sniff the file contents.\n * If there is no blob (library assets) or detection fails, keep the declared type.\n */\nexport const resolveFileMime = async (\n mime?: string | null,\n blob?: Blob | null\n): Promise<string> => {\n const declared = normalizeDeclaredMime(mime);\n\n if (declared && !isGenericMime(declared)) {\n return declared;\n }\n\n if (blob) {\n const detected = await detectMimeFromBlob(blob);\n\n if (detected) {\n return detected;\n }\n }\n\n return declared;\n};\n"],"names":["GENERIC_MIMES","Set","FILE_TYPE_SNIFF_BYTES","normalizeDeclaredMime","mime","trim","split","isGenericMime","declared","has","toLowerCase","readBlobBytes","blob","chunk","slice","arrayBuffer","Uint8Array","Promise","resolve","reject","reader","FileReader","onload","result","onerror","error","Error","readAsArrayBuffer","detectMimeFromBlob","buffer","fileTypeFromBuffer","undefined","resolveFileMime","detected"],"mappings":";;AAAA,MAAMA,aAAAA,GAAgB,IAAIC,GAAAA,CAAI;AAAC,IAAA,EAAA;AAAI,IAAA;AAA2B,CAAA,CAAA;AAE9D;;;AAGC,IACD,MAAMC,qBAAAA,GAAwB,IAAA;MAEjBC,qBAAAA,GAAwB,CAACC,OACpC,CAACA,QAAQ,EAAC,EAAGC,IAAI,EAAA,CAAGC,KAAK,CAAC,GAAA,CAAI,CAAC,CAAA,CAAE,CAACD,IAAI;AAEjC,MAAME,gBAAgB,CAACH,IAAAA,GAAAA;AAC5B,IAAA,MAAMI,WAAWL,qBAAAA,CAAsBC,IAAAA,CAAAA;AAEvC,IAAA,OAAO,CAACI,QAAAA,IAAYR,aAAAA,CAAcS,GAAG,CAACD,SAASE,WAAW,EAAA,CAAA;AAC5D;AAEA,MAAMC,gBAAgB,OAAOC,IAAAA,GAAAA;IAC3B,MAAMC,KAAAA,GAAQ,OAAOD,IAAAA,CAAKE,KAAK,KAAK,aAAaF,IAAAA,CAAKE,KAAK,CAAC,CAAA,EAAGZ,qBAAAA,CAAAA,GAAyBU,IAAAA;AAExF,IAAA,IAAI,OAAOC,KAAAA,CAAME,WAAW,KAAK,UAAA,EAAY;AAC3C,QAAA,OAAO,IAAIC,UAAAA,CAAW,MAAMH,KAAAA,CAAME,WAAW,EAAA,CAAA;AAC/C,IAAA;;IAGA,OAAO,IAAIE,OAAAA,CAAQ,CAACC,OAAAA,EAASC,MAAAA,GAAAA;AAC3B,QAAA,MAAMC,SAAS,IAAIC,UAAAA,EAAAA;AAEnBD,QAAAA,MAAAA,CAAOE,MAAM,GAAG,IAAA;YACdJ,OAAAA,CAAQ,IAAIF,UAAAA,CAAWI,MAAAA,CAAOG,MAAM,CAAA,CAAA;AACtC,QAAA,CAAA;AACAH,QAAAA,MAAAA,CAAOI,OAAO,GAAG,IAAA;AACfL,YAAAA,MAAAA,CAAOC,MAAAA,CAAOK,KAAK,IAAI,IAAIC,KAAAA,CAAM,qBAAA,CAAA,CAAA;AACnC,QAAA,CAAA;AACAN,QAAAA,MAAAA,CAAOO,iBAAiB,CAACd,KAAAA,CAAAA;AAC3B,IAAA,CAAA,CAAA;AACF,CAAA;AAEA;;;;IAKO,MAAMe,kBAAAA,GAAqB,OAAOhB,IAAAA,GAAAA;IACvC,IAAI;QACF,MAAMiB,MAAAA,GAAS,MAAMlB,aAAAA,CAAcC,IAAAA,CAAAA;;AAEnC,QAAA,MAAM,EAAEkB,kBAAkB,EAAE,GAAG,MAAM,OAAO,gBAAA,CAAA;QAC5C,MAAMP,MAAAA,GAAS,MAAMO,kBAAAA,CAAmBD,MAAAA,CAAAA;AAExC,QAAA,OAAON,MAAAA,EAAQnB,IAAAA;AACjB,IAAA,CAAA,CAAE,OAAM;QACN,OAAO2B,SAAAA;AACT,IAAA;AACF;AAEA;;;AAGC,IACM,MAAMC,eAAAA,GAAkB,OAC7B5B,IAAAA,EACAQ,IAAAA,GAAAA;AAEA,IAAA,MAAMJ,WAAWL,qBAAAA,CAAsBC,IAAAA,CAAAA;IAEvC,IAAII,QAAAA,IAAY,CAACD,aAAAA,CAAcC,QAAAA,CAAAA,EAAW;QACxC,OAAOA,QAAAA;AACT,IAAA;AAEA,IAAA,IAAII,IAAAA,EAAM;QACR,MAAMqB,QAAAA,GAAW,MAAML,kBAAAA,CAAmBhB,IAAAA,CAAAA;AAE1C,QAAA,IAAIqB,QAAAA,EAAU;YACZ,OAAOA,QAAAA;AACT,QAAA;AACF,IAAA;IAEA,OAAOzB,QAAAA;AACT;;;;;;;"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const GENERIC_MIMES = new Set([
|
|
2
|
+
'',
|
|
3
|
+
'application/octet-stream'
|
|
4
|
+
]);
|
|
5
|
+
/**
|
|
6
|
+
* Same byte window currently used by server MIME validation (`readFileChunk(..., 4100)`).
|
|
7
|
+
* Magic-number detection only needs the start of the file.
|
|
8
|
+
*/ const FILE_TYPE_SNIFF_BYTES = 4100;
|
|
9
|
+
const normalizeDeclaredMime = (mime)=>(mime ?? '').trim().split(';')[0].trim();
|
|
10
|
+
const isGenericMime = (mime)=>{
|
|
11
|
+
const declared = normalizeDeclaredMime(mime);
|
|
12
|
+
return !declared || GENERIC_MIMES.has(declared.toLowerCase());
|
|
13
|
+
};
|
|
14
|
+
const readBlobBytes = async (blob)=>{
|
|
15
|
+
const chunk = typeof blob.slice === 'function' ? blob.slice(0, FILE_TYPE_SNIFF_BYTES) : blob;
|
|
16
|
+
if (typeof chunk.arrayBuffer === 'function') {
|
|
17
|
+
return new Uint8Array(await chunk.arrayBuffer());
|
|
18
|
+
}
|
|
19
|
+
// jsdom's Blob.slice() result has no arrayBuffer(); FileReader works in browsers and tests.
|
|
20
|
+
return new Promise((resolve, reject)=>{
|
|
21
|
+
const reader = new FileReader();
|
|
22
|
+
reader.onload = ()=>{
|
|
23
|
+
resolve(new Uint8Array(reader.result));
|
|
24
|
+
};
|
|
25
|
+
reader.onerror = ()=>{
|
|
26
|
+
reject(reader.error ?? new Error('Failed to read file'));
|
|
27
|
+
};
|
|
28
|
+
reader.readAsArrayBuffer(chunk);
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Detect MIME from file bytes with file-type.
|
|
33
|
+
* The admin normalizes declared MIME values more permissively; server validation remains authoritative.
|
|
34
|
+
* Returns undefined when the blob cannot be read or the type is unknown.
|
|
35
|
+
*/ const detectMimeFromBlob = async (blob)=>{
|
|
36
|
+
try {
|
|
37
|
+
const buffer = await readBlobBytes(blob);
|
|
38
|
+
// Browser/core build — do not pull the Node `file-type` entry into the admin bundle.
|
|
39
|
+
const { fileTypeFromBuffer } = await import('file-type/core');
|
|
40
|
+
const result = await fileTypeFromBuffer(buffer);
|
|
41
|
+
return result?.mime;
|
|
42
|
+
} catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* When the browser MIME is missing or generic, sniff the file contents.
|
|
48
|
+
* If there is no blob (library assets) or detection fails, keep the declared type.
|
|
49
|
+
*/ const resolveFileMime = async (mime, blob)=>{
|
|
50
|
+
const declared = normalizeDeclaredMime(mime);
|
|
51
|
+
if (declared && !isGenericMime(declared)) {
|
|
52
|
+
return declared;
|
|
53
|
+
}
|
|
54
|
+
if (blob) {
|
|
55
|
+
const detected = await detectMimeFromBlob(blob);
|
|
56
|
+
if (detected) {
|
|
57
|
+
return detected;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return declared;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export { detectMimeFromBlob, isGenericMime, normalizeDeclaredMime, resolveFileMime };
|
|
64
|
+
//# sourceMappingURL=resolveFileMime.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveFileMime.mjs","sources":["../../../admin/src/utils/resolveFileMime.ts"],"sourcesContent":["const GENERIC_MIMES = new Set(['', 'application/octet-stream']);\n\n/**\n * Same byte window currently used by server MIME validation (`readFileChunk(..., 4100)`).\n * Magic-number detection only needs the start of the file.\n */\nconst FILE_TYPE_SNIFF_BYTES = 4100;\n\nexport const normalizeDeclaredMime = (mime?: string | null): string =>\n (mime ?? '').trim().split(';')[0].trim();\n\nexport const isGenericMime = (mime?: string | null): boolean => {\n const declared = normalizeDeclaredMime(mime);\n\n return !declared || GENERIC_MIMES.has(declared.toLowerCase());\n};\n\nconst readBlobBytes = async (blob: Blob): Promise<Uint8Array> => {\n const chunk = typeof blob.slice === 'function' ? blob.slice(0, FILE_TYPE_SNIFF_BYTES) : blob;\n\n if (typeof chunk.arrayBuffer === 'function') {\n return new Uint8Array(await chunk.arrayBuffer());\n }\n\n // jsdom's Blob.slice() result has no arrayBuffer(); FileReader works in browsers and tests.\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(new Uint8Array(reader.result as ArrayBuffer));\n };\n reader.onerror = () => {\n reject(reader.error ?? new Error('Failed to read file'));\n };\n reader.readAsArrayBuffer(chunk);\n });\n};\n\n/**\n * Detect MIME from file bytes with file-type.\n * The admin normalizes declared MIME values more permissively; server validation remains authoritative.\n * Returns undefined when the blob cannot be read or the type is unknown.\n */\nexport const detectMimeFromBlob = async (blob: Blob): Promise<string | undefined> => {\n try {\n const buffer = await readBlobBytes(blob);\n // Browser/core build — do not pull the Node `file-type` entry into the admin bundle.\n const { fileTypeFromBuffer } = await import('file-type/core');\n const result = await fileTypeFromBuffer(buffer);\n\n return result?.mime;\n } catch {\n return undefined;\n }\n};\n\n/**\n * When the browser MIME is missing or generic, sniff the file contents.\n * If there is no blob (library assets) or detection fails, keep the declared type.\n */\nexport const resolveFileMime = async (\n mime?: string | null,\n blob?: Blob | null\n): Promise<string> => {\n const declared = normalizeDeclaredMime(mime);\n\n if (declared && !isGenericMime(declared)) {\n return declared;\n }\n\n if (blob) {\n const detected = await detectMimeFromBlob(blob);\n\n if (detected) {\n return detected;\n }\n }\n\n return declared;\n};\n"],"names":["GENERIC_MIMES","Set","FILE_TYPE_SNIFF_BYTES","normalizeDeclaredMime","mime","trim","split","isGenericMime","declared","has","toLowerCase","readBlobBytes","blob","chunk","slice","arrayBuffer","Uint8Array","Promise","resolve","reject","reader","FileReader","onload","result","onerror","error","Error","readAsArrayBuffer","detectMimeFromBlob","buffer","fileTypeFromBuffer","undefined","resolveFileMime","detected"],"mappings":"AAAA,MAAMA,aAAAA,GAAgB,IAAIC,GAAAA,CAAI;AAAC,IAAA,EAAA;AAAI,IAAA;AAA2B,CAAA,CAAA;AAE9D;;;AAGC,IACD,MAAMC,qBAAAA,GAAwB,IAAA;MAEjBC,qBAAAA,GAAwB,CAACC,OACpC,CAACA,QAAQ,EAAC,EAAGC,IAAI,EAAA,CAAGC,KAAK,CAAC,GAAA,CAAI,CAAC,CAAA,CAAE,CAACD,IAAI;AAEjC,MAAME,gBAAgB,CAACH,IAAAA,GAAAA;AAC5B,IAAA,MAAMI,WAAWL,qBAAAA,CAAsBC,IAAAA,CAAAA;AAEvC,IAAA,OAAO,CAACI,QAAAA,IAAYR,aAAAA,CAAcS,GAAG,CAACD,SAASE,WAAW,EAAA,CAAA;AAC5D;AAEA,MAAMC,gBAAgB,OAAOC,IAAAA,GAAAA;IAC3B,MAAMC,KAAAA,GAAQ,OAAOD,IAAAA,CAAKE,KAAK,KAAK,aAAaF,IAAAA,CAAKE,KAAK,CAAC,CAAA,EAAGZ,qBAAAA,CAAAA,GAAyBU,IAAAA;AAExF,IAAA,IAAI,OAAOC,KAAAA,CAAME,WAAW,KAAK,UAAA,EAAY;AAC3C,QAAA,OAAO,IAAIC,UAAAA,CAAW,MAAMH,KAAAA,CAAME,WAAW,EAAA,CAAA;AAC/C,IAAA;;IAGA,OAAO,IAAIE,OAAAA,CAAQ,CAACC,OAAAA,EAASC,MAAAA,GAAAA;AAC3B,QAAA,MAAMC,SAAS,IAAIC,UAAAA,EAAAA;AAEnBD,QAAAA,MAAAA,CAAOE,MAAM,GAAG,IAAA;YACdJ,OAAAA,CAAQ,IAAIF,UAAAA,CAAWI,MAAAA,CAAOG,MAAM,CAAA,CAAA;AACtC,QAAA,CAAA;AACAH,QAAAA,MAAAA,CAAOI,OAAO,GAAG,IAAA;AACfL,YAAAA,MAAAA,CAAOC,MAAAA,CAAOK,KAAK,IAAI,IAAIC,KAAAA,CAAM,qBAAA,CAAA,CAAA;AACnC,QAAA,CAAA;AACAN,QAAAA,MAAAA,CAAOO,iBAAiB,CAACd,KAAAA,CAAAA;AAC3B,IAAA,CAAA,CAAA;AACF,CAAA;AAEA;;;;IAKO,MAAMe,kBAAAA,GAAqB,OAAOhB,IAAAA,GAAAA;IACvC,IAAI;QACF,MAAMiB,MAAAA,GAAS,MAAMlB,aAAAA,CAAcC,IAAAA,CAAAA;;AAEnC,QAAA,MAAM,EAAEkB,kBAAkB,EAAE,GAAG,MAAM,OAAO,gBAAA,CAAA;QAC5C,MAAMP,MAAAA,GAAS,MAAMO,kBAAAA,CAAmBD,MAAAA,CAAAA;AAExC,QAAA,OAAON,MAAAA,EAAQnB,IAAAA;AACjB,IAAA,CAAA,CAAE,OAAM;QACN,OAAO2B,SAAAA;AACT,IAAA;AACF;AAEA;;;AAGC,IACM,MAAMC,eAAAA,GAAkB,OAC7B5B,IAAAA,EACAQ,IAAAA,GAAAA;AAEA,IAAA,MAAMJ,WAAWL,qBAAAA,CAAsBC,IAAAA,CAAAA;IAEvC,IAAII,QAAAA,IAAY,CAACD,aAAAA,CAAcC,QAAAA,CAAAA,EAAW;QACxC,OAAOA,QAAAA;AACT,IAAA;AAEA,IAAA,IAAII,IAAAA,EAAM;QACR,MAAMqB,QAAAA,GAAW,MAAML,kBAAAA,CAAmBhB,IAAAA,CAAAA;AAE1C,QAAA,IAAIqB,QAAAA,EAAU;YACZ,OAAOA,QAAAA;AACT,QAAA;AACF,IAAA;IAEA,OAAOzB,QAAAA;AACT;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var resolveFileMime = require('./resolveFileMime.js');
|
|
3
4
|
var typeFromMime = require('./typeFromMime.js');
|
|
4
5
|
|
|
5
6
|
function getFilenameFromURL(url) {
|
|
@@ -22,15 +23,18 @@ const urlsToAssets = async (urls)=>{
|
|
|
22
23
|
}));
|
|
23
24
|
// Retrieve the assets metadata
|
|
24
25
|
const assetsResults = await Promise.all(assetPromises);
|
|
25
|
-
const assets = assetsResults.map((fullFilledAsset)=>
|
|
26
|
+
const assets = await Promise.all(assetsResults.map(async (fullFilledAsset)=>{
|
|
27
|
+
const mime = await resolveFileMime.resolveFileMime(fullFilledAsset.mime, fullFilledAsset.rawFile);
|
|
28
|
+
return {
|
|
26
29
|
source: 'url',
|
|
27
30
|
name: fullFilledAsset.name,
|
|
28
|
-
type: typeFromMime.typeFromMime(
|
|
31
|
+
type: typeFromMime.typeFromMime(mime),
|
|
29
32
|
url: fullFilledAsset.url,
|
|
30
33
|
ext: fullFilledAsset.url.split('.').pop(),
|
|
31
|
-
mime:
|
|
34
|
+
mime: mime || undefined,
|
|
32
35
|
rawFile: fullFilledAsset.rawFile
|
|
33
|
-
}
|
|
36
|
+
};
|
|
37
|
+
}));
|
|
34
38
|
return assets;
|
|
35
39
|
};
|
|
36
40
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlsToAssets.js","sources":["../../../admin/src/utils/urlsToAssets.ts"],"sourcesContent":["import { FileWithRawFile } from '../components/UploadAssetDialog/AddAssetStep/AddAssetStep';\n\nimport { typeFromMime } from './typeFromMime';\n\nfunction getFilenameFromURL(url: string) {\n return new URL(url).pathname.split('/').pop();\n}\n\nexport const urlsToAssets = async (urls: string[]): Promise<FileWithRawFile[]> => {\n const assetPromises = urls.map((url) =>\n fetch(url).then(async (res) => {\n const blob = await res.blob();\n\n const loadedFile = new File([blob], getFilenameFromURL(res.url)!, {\n type: res.headers.get('content-type') || undefined,\n });\n\n return {\n name: loadedFile.name,\n url: res.url,\n mime: res.headers.get('content-type'),\n rawFile: loadedFile,\n };\n })\n );\n // Retrieve the assets metadata\n const assetsResults = await Promise.all(assetPromises);\n\n const assets = assetsResults.map
|
|
1
|
+
{"version":3,"file":"urlsToAssets.js","sources":["../../../admin/src/utils/urlsToAssets.ts"],"sourcesContent":["import { FileWithRawFile } from '../components/UploadAssetDialog/AddAssetStep/AddAssetStep';\n\nimport { resolveFileMime } from './resolveFileMime';\nimport { typeFromMime } from './typeFromMime';\n\nfunction getFilenameFromURL(url: string) {\n return new URL(url).pathname.split('/').pop();\n}\n\nexport const urlsToAssets = async (urls: string[]): Promise<FileWithRawFile[]> => {\n const assetPromises = urls.map((url) =>\n fetch(url).then(async (res) => {\n const blob = await res.blob();\n\n const loadedFile = new File([blob], getFilenameFromURL(res.url)!, {\n type: res.headers.get('content-type') || undefined,\n });\n\n return {\n name: loadedFile.name,\n url: res.url,\n mime: res.headers.get('content-type'),\n rawFile: loadedFile,\n };\n })\n );\n // Retrieve the assets metadata\n const assetsResults = await Promise.all(assetPromises);\n\n const assets = await Promise.all(\n assetsResults.map(async (fullFilledAsset) => {\n const mime = await resolveFileMime(fullFilledAsset.mime, fullFilledAsset.rawFile);\n\n return {\n source: 'url' as const,\n name: fullFilledAsset.name,\n type: typeFromMime(mime),\n url: fullFilledAsset.url,\n ext: fullFilledAsset.url.split('.').pop(),\n mime: mime || undefined,\n rawFile: fullFilledAsset.rawFile,\n };\n })\n );\n\n return assets;\n};\n"],"names":["getFilenameFromURL","url","URL","pathname","split","pop","urlsToAssets","urls","assetPromises","map","fetch","then","res","blob","loadedFile","File","type","headers","get","undefined","name","mime","rawFile","assetsResults","Promise","all","assets","fullFilledAsset","resolveFileMime","source","typeFromMime","ext"],"mappings":";;;;;AAKA,SAASA,mBAAmBC,GAAW,EAAA;IACrC,OAAO,IAAIC,IAAID,GAAAA,CAAAA,CAAKE,QAAQ,CAACC,KAAK,CAAC,KAAKC,GAAG,EAAA;AAC7C;AAEO,MAAMC,eAAe,OAAOC,IAAAA,GAAAA;IACjC,MAAMC,aAAAA,GAAgBD,IAAAA,CAAKE,GAAG,CAAC,CAACR,MAC9BS,KAAAA,CAAMT,GAAAA,CAAAA,CAAKU,IAAI,CAAC,OAAOC,GAAAA,GAAAA;YACrB,MAAMC,IAAAA,GAAO,MAAMD,GAAAA,CAAIC,IAAI,EAAA;YAE3B,MAAMC,UAAAA,GAAa,IAAIC,IAAAA,CAAK;AAACF,gBAAAA;aAAK,EAAEb,kBAAAA,CAAmBY,GAAAA,CAAIX,GAAG,CAAA,EAAI;AAChEe,gBAAAA,IAAAA,EAAMJ,GAAAA,CAAIK,OAAO,CAACC,GAAG,CAAC,cAAA,CAAA,IAAmBC;AAC3C,aAAA,CAAA;YAEA,OAAO;AACLC,gBAAAA,IAAAA,EAAMN,WAAWM,IAAI;AACrBnB,gBAAAA,GAAAA,EAAKW,IAAIX,GAAG;AACZoB,gBAAAA,IAAAA,EAAMT,GAAAA,CAAIK,OAAO,CAACC,GAAG,CAAC,cAAA,CAAA;gBACtBI,OAAAA,EAASR;AACX,aAAA;AACF,QAAA,CAAA,CAAA,CAAA;;AAGF,IAAA,MAAMS,aAAAA,GAAgB,MAAMC,OAAAA,CAAQC,GAAG,CAACjB,aAAAA,CAAAA;IAExC,MAAMkB,MAAAA,GAAS,MAAMF,OAAAA,CAAQC,GAAG,CAC9BF,aAAAA,CAAcd,GAAG,CAAC,OAAOkB,eAAAA,GAAAA;AACvB,QAAA,MAAMN,OAAO,MAAMO,+BAAAA,CAAgBD,gBAAgBN,IAAI,EAAEM,gBAAgBL,OAAO,CAAA;QAEhF,OAAO;YACLO,MAAAA,EAAQ,KAAA;AACRT,YAAAA,IAAAA,EAAMO,gBAAgBP,IAAI;AAC1BJ,YAAAA,IAAAA,EAAMc,yBAAAA,CAAaT,IAAAA,CAAAA;AACnBpB,YAAAA,GAAAA,EAAK0B,gBAAgB1B,GAAG;AACxB8B,YAAAA,GAAAA,EAAKJ,gBAAgB1B,GAAG,CAACG,KAAK,CAAC,KAAKC,GAAG,EAAA;AACvCgB,YAAAA,IAAAA,EAAMA,IAAAA,IAAQF,SAAAA;AACdG,YAAAA,OAAAA,EAASK,gBAAgBL;AAC3B,SAAA;AACF,IAAA,CAAA,CAAA,CAAA;IAGF,OAAOI,MAAAA;AACT;;;;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolveFileMime } from './resolveFileMime.mjs';
|
|
1
2
|
import { typeFromMime } from './typeFromMime.mjs';
|
|
2
3
|
|
|
3
4
|
function getFilenameFromURL(url) {
|
|
@@ -20,15 +21,18 @@ const urlsToAssets = async (urls)=>{
|
|
|
20
21
|
}));
|
|
21
22
|
// Retrieve the assets metadata
|
|
22
23
|
const assetsResults = await Promise.all(assetPromises);
|
|
23
|
-
const assets = assetsResults.map((fullFilledAsset)=>
|
|
24
|
+
const assets = await Promise.all(assetsResults.map(async (fullFilledAsset)=>{
|
|
25
|
+
const mime = await resolveFileMime(fullFilledAsset.mime, fullFilledAsset.rawFile);
|
|
26
|
+
return {
|
|
24
27
|
source: 'url',
|
|
25
28
|
name: fullFilledAsset.name,
|
|
26
|
-
type: typeFromMime(
|
|
29
|
+
type: typeFromMime(mime),
|
|
27
30
|
url: fullFilledAsset.url,
|
|
28
31
|
ext: fullFilledAsset.url.split('.').pop(),
|
|
29
|
-
mime:
|
|
32
|
+
mime: mime || undefined,
|
|
30
33
|
rawFile: fullFilledAsset.rawFile
|
|
31
|
-
}
|
|
34
|
+
};
|
|
35
|
+
}));
|
|
32
36
|
return assets;
|
|
33
37
|
};
|
|
34
38
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlsToAssets.mjs","sources":["../../../admin/src/utils/urlsToAssets.ts"],"sourcesContent":["import { FileWithRawFile } from '../components/UploadAssetDialog/AddAssetStep/AddAssetStep';\n\nimport { typeFromMime } from './typeFromMime';\n\nfunction getFilenameFromURL(url: string) {\n return new URL(url).pathname.split('/').pop();\n}\n\nexport const urlsToAssets = async (urls: string[]): Promise<FileWithRawFile[]> => {\n const assetPromises = urls.map((url) =>\n fetch(url).then(async (res) => {\n const blob = await res.blob();\n\n const loadedFile = new File([blob], getFilenameFromURL(res.url)!, {\n type: res.headers.get('content-type') || undefined,\n });\n\n return {\n name: loadedFile.name,\n url: res.url,\n mime: res.headers.get('content-type'),\n rawFile: loadedFile,\n };\n })\n );\n // Retrieve the assets metadata\n const assetsResults = await Promise.all(assetPromises);\n\n const assets = assetsResults.map
|
|
1
|
+
{"version":3,"file":"urlsToAssets.mjs","sources":["../../../admin/src/utils/urlsToAssets.ts"],"sourcesContent":["import { FileWithRawFile } from '../components/UploadAssetDialog/AddAssetStep/AddAssetStep';\n\nimport { resolveFileMime } from './resolveFileMime';\nimport { typeFromMime } from './typeFromMime';\n\nfunction getFilenameFromURL(url: string) {\n return new URL(url).pathname.split('/').pop();\n}\n\nexport const urlsToAssets = async (urls: string[]): Promise<FileWithRawFile[]> => {\n const assetPromises = urls.map((url) =>\n fetch(url).then(async (res) => {\n const blob = await res.blob();\n\n const loadedFile = new File([blob], getFilenameFromURL(res.url)!, {\n type: res.headers.get('content-type') || undefined,\n });\n\n return {\n name: loadedFile.name,\n url: res.url,\n mime: res.headers.get('content-type'),\n rawFile: loadedFile,\n };\n })\n );\n // Retrieve the assets metadata\n const assetsResults = await Promise.all(assetPromises);\n\n const assets = await Promise.all(\n assetsResults.map(async (fullFilledAsset) => {\n const mime = await resolveFileMime(fullFilledAsset.mime, fullFilledAsset.rawFile);\n\n return {\n source: 'url' as const,\n name: fullFilledAsset.name,\n type: typeFromMime(mime),\n url: fullFilledAsset.url,\n ext: fullFilledAsset.url.split('.').pop(),\n mime: mime || undefined,\n rawFile: fullFilledAsset.rawFile,\n };\n })\n );\n\n return assets;\n};\n"],"names":["getFilenameFromURL","url","URL","pathname","split","pop","urlsToAssets","urls","assetPromises","map","fetch","then","res","blob","loadedFile","File","type","headers","get","undefined","name","mime","rawFile","assetsResults","Promise","all","assets","fullFilledAsset","resolveFileMime","source","typeFromMime","ext"],"mappings":";;;AAKA,SAASA,mBAAmBC,GAAW,EAAA;IACrC,OAAO,IAAIC,IAAID,GAAAA,CAAAA,CAAKE,QAAQ,CAACC,KAAK,CAAC,KAAKC,GAAG,EAAA;AAC7C;AAEO,MAAMC,eAAe,OAAOC,IAAAA,GAAAA;IACjC,MAAMC,aAAAA,GAAgBD,IAAAA,CAAKE,GAAG,CAAC,CAACR,MAC9BS,KAAAA,CAAMT,GAAAA,CAAAA,CAAKU,IAAI,CAAC,OAAOC,GAAAA,GAAAA;YACrB,MAAMC,IAAAA,GAAO,MAAMD,GAAAA,CAAIC,IAAI,EAAA;YAE3B,MAAMC,UAAAA,GAAa,IAAIC,IAAAA,CAAK;AAACF,gBAAAA;aAAK,EAAEb,kBAAAA,CAAmBY,GAAAA,CAAIX,GAAG,CAAA,EAAI;AAChEe,gBAAAA,IAAAA,EAAMJ,GAAAA,CAAIK,OAAO,CAACC,GAAG,CAAC,cAAA,CAAA,IAAmBC;AAC3C,aAAA,CAAA;YAEA,OAAO;AACLC,gBAAAA,IAAAA,EAAMN,WAAWM,IAAI;AACrBnB,gBAAAA,GAAAA,EAAKW,IAAIX,GAAG;AACZoB,gBAAAA,IAAAA,EAAMT,GAAAA,CAAIK,OAAO,CAACC,GAAG,CAAC,cAAA,CAAA;gBACtBI,OAAAA,EAASR;AACX,aAAA;AACF,QAAA,CAAA,CAAA,CAAA;;AAGF,IAAA,MAAMS,aAAAA,GAAgB,MAAMC,OAAAA,CAAQC,GAAG,CAACjB,aAAAA,CAAAA;IAExC,MAAMkB,MAAAA,GAAS,MAAMF,OAAAA,CAAQC,GAAG,CAC9BF,aAAAA,CAAcd,GAAG,CAAC,OAAOkB,eAAAA,GAAAA;AACvB,QAAA,MAAMN,OAAO,MAAMO,eAAAA,CAAgBD,gBAAgBN,IAAI,EAAEM,gBAAgBL,OAAO,CAAA;QAEhF,OAAO;YACLO,MAAAA,EAAQ,KAAA;AACRT,YAAAA,IAAAA,EAAMO,gBAAgBP,IAAI;AAC1BJ,YAAAA,IAAAA,EAAMc,YAAAA,CAAaT,IAAAA,CAAAA;AACnBpB,YAAAA,GAAAA,EAAK0B,gBAAgB1B,GAAG;AACxB8B,YAAAA,GAAAA,EAAKJ,gBAAgB1B,GAAG,CAACG,KAAK,CAAC,KAAKC,GAAG,EAAA;AACvCgB,YAAAA,IAAAA,EAAMA,IAAAA,IAAQF,SAAAA;AACdG,YAAAA,OAAAA,EAASK,gBAAgBL;AAC3B,SAAA;AACF,IAAA,CAAA,CAAA,CAAA;IAGF,OAAOI,MAAAA;AACT;;;;"}
|
|
@@ -23,6 +23,16 @@ const { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = utils.contentTypes.consta
|
|
|
23
23
|
const { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = constants.ALLOWED_WEBHOOK_EVENTS;
|
|
24
24
|
const { ApplicationError, NotFoundError } = utils.errors;
|
|
25
25
|
const { bytesToKbytes } = utils.file;
|
|
26
|
+
/**
|
|
27
|
+
* Queue a provider operation for a later `Promise.all`, with a rejection handler
|
|
28
|
+
* attached in the same turn so a fast failure is never an unhandled rejection.
|
|
29
|
+
*
|
|
30
|
+
* `Promise.resolve` first — a provider may hand back a plain value, which
|
|
31
|
+
* `Promise.all` accepts but `.catch` would throw on.
|
|
32
|
+
*/ const queueConcurrentOperation = (queue, operation)=>{
|
|
33
|
+
Promise.resolve(operation).catch(()=>undefined);
|
|
34
|
+
queue.push(operation);
|
|
35
|
+
};
|
|
26
36
|
var upload = (({ strapi })=>{
|
|
27
37
|
const fileService = index.getService('file');
|
|
28
38
|
const sendMediaMetrics = async (data)=>{
|
|
@@ -218,19 +228,19 @@ var upload = (({ strapi })=>{
|
|
|
218
228
|
};
|
|
219
229
|
const uploadPromises = [];
|
|
220
230
|
// Upload image
|
|
221
|
-
uploadPromises
|
|
231
|
+
queueConcurrentOperation(uploadPromises, index.getService('provider').upload(fileData));
|
|
222
232
|
// Generate & Upload thumbnail and responsive formats
|
|
223
233
|
if (await isResizableImage(fileData)) {
|
|
224
234
|
const thumbnailFile = await generateThumbnail(fileData);
|
|
225
235
|
if (thumbnailFile) {
|
|
226
|
-
uploadPromises
|
|
236
|
+
queueConcurrentOperation(uploadPromises, uploadThumbnail(thumbnailFile));
|
|
227
237
|
}
|
|
228
238
|
const formats = await generateResponsiveFormats(fileData);
|
|
229
239
|
if (Array.isArray(formats) && formats.length > 0) {
|
|
230
240
|
for (const format of formats){
|
|
231
241
|
// eslint-disable-next-line no-continue
|
|
232
242
|
if (!format) continue;
|
|
233
|
-
uploadPromises
|
|
243
|
+
queueConcurrentOperation(uploadPromises, uploadResponsiveFormat(format));
|
|
234
244
|
}
|
|
235
245
|
}
|
|
236
246
|
}
|
|
@@ -263,13 +273,13 @@ var upload = (({ strapi })=>{
|
|
|
263
273
|
};
|
|
264
274
|
const promises = [];
|
|
265
275
|
// Replace the main file
|
|
266
|
-
promises
|
|
276
|
+
queueConcurrentOperation(promises, index.getService('provider').replace(fileData, oldFile));
|
|
267
277
|
const newFormatKeys = new Set();
|
|
268
278
|
if (await isResizableImage(fileData)) {
|
|
269
279
|
const thumbnailFile = await generateThumbnail(fileData);
|
|
270
280
|
if (thumbnailFile) {
|
|
271
281
|
newFormatKeys.add('thumbnail');
|
|
272
|
-
promises
|
|
282
|
+
queueConcurrentOperation(promises, replaceFormat('thumbnail', thumbnailFile));
|
|
273
283
|
}
|
|
274
284
|
const formats = await generateResponsiveFormats(fileData);
|
|
275
285
|
if (Array.isArray(formats) && formats.length > 0) {
|
|
@@ -277,7 +287,7 @@ var upload = (({ strapi })=>{
|
|
|
277
287
|
// eslint-disable-next-line no-continue
|
|
278
288
|
if (!format) continue;
|
|
279
289
|
newFormatKeys.add(format.key);
|
|
280
|
-
promises
|
|
290
|
+
queueConcurrentOperation(promises, replaceFormat(format.key, format.file));
|
|
281
291
|
}
|
|
282
292
|
}
|
|
283
293
|
}
|
|
@@ -286,7 +296,7 @@ var upload = (({ strapi })=>{
|
|
|
286
296
|
for (const oldKey of Object.keys(oldFile.formats)){
|
|
287
297
|
if (!newFormatKeys.has(oldKey)) {
|
|
288
298
|
const oldFormat = oldFile.formats[oldKey];
|
|
289
|
-
promises
|
|
299
|
+
queueConcurrentOperation(promises, strapi.plugin('upload').provider.delete(oldFormat));
|
|
290
300
|
}
|
|
291
301
|
}
|
|
292
302
|
}
|
|
@@ -616,7 +626,9 @@ var upload = (({ strapi })=>{
|
|
|
616
626
|
/**
|
|
617
627
|
* exposed for testing only
|
|
618
628
|
* @internal
|
|
619
|
-
*/ _uploadImage: uploadImage
|
|
629
|
+
*/ _uploadImage: uploadImage,
|
|
630
|
+
_replaceImage: replaceImage,
|
|
631
|
+
_queueConcurrentOperation: queueConcurrentOperation
|
|
620
632
|
};
|
|
621
633
|
});
|
|
622
634
|
|