@strapi/upload 5.37.0 → 5.38.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/ai/components/AIAssetCard.js.map +1 -1
- package/dist/admin/ai/components/AIAssetCard.mjs +1 -1
- package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.mjs +1 -1
- package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AudioAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/AudioAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AudioPreview.js.map +1 -1
- package/dist/admin/components/AssetCard/AudioPreview.mjs.map +1 -1
- package/dist/admin/components/AssetCard/DocAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/DocAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/AssetDialog.js.map +1 -1
- package/dist/admin/components/AssetDialog/AssetDialog.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PageSize.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PageSize.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/DialogFooter.js.map +1 -1
- package/dist/admin/components/AssetDialog/DialogFooter.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -1
- package/dist/admin/components/AssetGridList/AssetGridList.js.map +1 -1
- package/dist/admin/components/AssetGridList/AssetGridList.mjs.map +1 -1
- package/dist/admin/components/AssetGridList/Draggable.js.map +1 -1
- package/dist/admin/components/AssetGridList/Draggable.mjs.map +1 -1
- package/dist/admin/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/admin/components/Breadcrumbs/Breadcrumbs.mjs.map +1 -1
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/components/ContextInfo/ContextInfo.js.map +1 -1
- package/dist/admin/components/ContextInfo/ContextInfo.mjs.map +1 -1
- package/dist/admin/components/CopyLinkButton/CopyLinkButton.js.map +1 -1
- package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/DialogHeader.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/DialogHeader.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +1 -4
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -4
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.mjs.map +1 -1
- package/dist/admin/components/EmptyAssets/EmptyAssetGrid.js.map +1 -1
- package/dist/admin/components/EmptyAssets/EmptyAssetGrid.mjs.map +1 -1
- package/dist/admin/components/EmptyAssets/EmptyAssets.js.map +1 -1
- package/dist/admin/components/EmptyAssets/EmptyAssets.mjs.map +1 -1
- package/dist/admin/components/FilterList/FilterList.js.map +1 -1
- package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
- package/dist/admin/components/FilterList/FilterTag.js.map +1 -1
- package/dist/admin/components/FilterList/FilterTag.mjs.map +1 -1
- package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
- package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -1
- package/dist/admin/components/FilterPopover/FilterValueInput.js.map +1 -1
- package/dist/admin/components/FilterPopover/FilterValueInput.mjs.map +1 -1
- package/dist/admin/components/FilterPopover/utils/getFilterList.js.map +1 -1
- package/dist/admin/components/FilterPopover/utils/getFilterList.mjs.map +1 -1
- package/dist/admin/components/FolderCard/FolderCard/FolderCard.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCard/FolderCard.mjs.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.mjs.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.mjs.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.mjs.map +1 -1
- package/dist/admin/components/FolderCard/contexts/FolderCard.js.map +1 -1
- package/dist/admin/components/FolderCard/contexts/FolderCard.mjs.map +1 -1
- package/dist/admin/components/FolderGridList/FolderGridList.js.map +1 -1
- package/dist/admin/components/FolderGridList/FolderGridList.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
- package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
- package/dist/admin/components/SelectTree/Option.js.map +1 -1
- package/dist/admin/components/SelectTree/Option.mjs.map +1 -1
- package/dist/admin/components/SelectTree/SelectTree.js.map +1 -1
- package/dist/admin/components/SelectTree/SelectTree.mjs +1 -1
- package/dist/admin/components/SelectTree/SelectTree.mjs.map +1 -1
- package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
- package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
- package/dist/admin/components/SelectTree/utils/getOpenValues.js.map +1 -1
- package/dist/admin/components/SelectTree/utils/getOpenValues.mjs.map +1 -1
- package/dist/admin/components/SelectTree/utils/getValuesToClose.js.map +1 -1
- package/dist/admin/components/SelectTree/utils/getValuesToClose.mjs.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
- package/dist/admin/components/TableList/CellContent.js.map +1 -1
- package/dist/admin/components/TableList/CellContent.mjs.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.mjs +1 -1
- package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
- package/dist/admin/components/TableList/TableList.js.map +1 -1
- package/dist/admin/components/TableList/TableList.mjs +1 -1
- package/dist/admin/components/TableList/TableList.mjs.map +1 -1
- package/dist/admin/components/TableList/TableRows.js.map +1 -1
- package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
- package/dist/admin/components/UploadProgress/UploadProgress.js.map +1 -1
- package/dist/admin/components/UploadProgress/UploadProgress.mjs.map +1 -1
- package/dist/admin/constants.js.map +1 -1
- package/dist/admin/constants.mjs.map +1 -1
- package/dist/admin/future/App.js.map +1 -1
- package/dist/admin/future/App.mjs.map +1 -1
- package/dist/admin/future/components/Drawer.js +189 -0
- package/dist/admin/future/components/Drawer.js.map +1 -0
- package/dist/admin/future/components/Drawer.mjs +166 -0
- package/dist/admin/future/components/Drawer.mjs.map +1 -0
- package/dist/admin/future/components/UploadProgressDialog.js +60 -101
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.mjs +62 -84
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.js +155 -100
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +160 -105
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +406 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +384 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js +215 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs +194 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +37 -8
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +38 -9
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +35 -5
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +37 -7
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js +143 -0
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs +141 -0
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js +127 -0
- package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.mjs +106 -0
- package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/constants.js.map +1 -1
- package/dist/admin/future/pages/Assets/constants.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- package/dist/admin/future/services/api.js +181 -97
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +181 -98
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/assets.js +14 -1
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +14 -2
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +16 -1
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +16 -2
- package/dist/admin/future/services/folders.mjs.map +1 -1
- package/dist/admin/future/store/hooks.js.map +1 -1
- package/dist/admin/future/store/hooks.mjs.map +1 -1
- package/dist/admin/future/store/uploadProgress.js +7 -4
- package/dist/admin/future/store/uploadProgress.js.map +1 -1
- package/dist/admin/future/store/uploadProgress.mjs +7 -4
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/future/utils/files.js +105 -3
- package/dist/admin/future/utils/files.js.map +1 -1
- package/dist/admin/future/utils/files.mjs +104 -4
- package/dist/admin/future/utils/files.mjs.map +1 -1
- package/dist/admin/future/utils/getAssetIcon.js +3 -3
- package/dist/admin/future/utils/getAssetIcon.js.map +1 -1
- package/dist/admin/future/utils/getAssetIcon.mjs +4 -4
- package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -1
- package/dist/admin/future/utils/translations.js.map +1 -1
- package/dist/admin/future/utils/translations.mjs.map +1 -1
- package/dist/admin/hooks/useAIMetadataJob.js.map +1 -1
- package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -1
- package/dist/admin/hooks/useAiAvailability.js.map +1 -1
- package/dist/admin/hooks/useAiAvailability.mjs.map +1 -1
- package/dist/admin/hooks/useAssets.js.map +1 -1
- package/dist/admin/hooks/useAssets.mjs.map +1 -1
- package/dist/admin/hooks/useBulkEdit.js.map +1 -1
- package/dist/admin/hooks/useBulkEdit.mjs.map +1 -1
- package/dist/admin/hooks/useBulkMove.js.map +1 -1
- package/dist/admin/hooks/useBulkMove.mjs.map +1 -1
- package/dist/admin/hooks/useBulkRemove.js.map +1 -1
- package/dist/admin/hooks/useBulkRemove.mjs.map +1 -1
- package/dist/admin/hooks/useConfig.js.map +1 -1
- package/dist/admin/hooks/useConfig.mjs.map +1 -1
- package/dist/admin/hooks/useCropImg.js.map +1 -1
- package/dist/admin/hooks/useCropImg.mjs.map +1 -1
- package/dist/admin/hooks/useEditAsset.js.map +1 -1
- package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
- package/dist/admin/hooks/useEditFolder.js.map +1 -1
- package/dist/admin/hooks/useEditFolder.mjs.map +1 -1
- package/dist/admin/hooks/useFolder.js.map +1 -1
- package/dist/admin/hooks/useFolder.mjs.map +1 -1
- package/dist/admin/hooks/useFolderStructure.js.map +1 -1
- package/dist/admin/hooks/useFolderStructure.mjs.map +1 -1
- package/dist/admin/hooks/useFolders.js.map +1 -1
- package/dist/admin/hooks/useFolders.mjs.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
- package/dist/admin/hooks/useModalQueryParams.js.map +1 -1
- package/dist/admin/hooks/useModalQueryParams.mjs.map +1 -1
- package/dist/admin/hooks/usePersistentState.js.map +1 -1
- package/dist/admin/hooks/usePersistentState.mjs.map +1 -1
- package/dist/admin/hooks/useRemoveAsset.js.map +1 -1
- package/dist/admin/hooks/useRemoveAsset.mjs.map +1 -1
- package/dist/admin/hooks/useSelectionState.js.map +1 -1
- package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
- package/dist/admin/hooks/useSettings.js.map +1 -1
- package/dist/admin/hooks/useSettings.mjs.map +1 -1
- package/dist/admin/hooks/useTracking.js.map +1 -1
- package/dist/admin/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/hooks/useUpload.js.map +1 -1
- package/dist/admin/hooks/useUpload.mjs.map +1 -1
- package/dist/admin/hooks/utils/renameKeys.js.map +1 -1
- package/dist/admin/hooks/utils/renameKeys.mjs.map +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/package.json.js +1 -152
- package/dist/admin/package.json.js.map +1 -1
- package/dist/admin/package.json.mjs +2 -141
- package/dist/admin/package.json.mjs.map +1 -1
- package/dist/admin/pages/App/App.js.map +1 -1
- package/dist/admin/pages/App/App.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +3 -3
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/actions.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/actions.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/init.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/init.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/reducer.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs.map +1 -1
- package/dist/admin/pages/App/MediaLibrary.js +1 -1
- package/dist/admin/pages/App/MediaLibrary.js.map +1 -1
- package/dist/admin/pages/App/MediaLibrary.mjs +2 -2
- package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -1
- package/dist/admin/pages/App/components/BulkActions.js.map +1 -1
- package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -1
- package/dist/admin/pages/App/components/BulkDeleteButton.js.map +1 -1
- package/dist/admin/pages/App/components/BulkDeleteButton.mjs.map +1 -1
- package/dist/admin/pages/App/components/BulkMoveButton.js.map +1 -1
- package/dist/admin/pages/App/components/BulkMoveButton.mjs.map +1 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -1
- package/dist/admin/pages/App/components/Filters.js.map +1 -1
- package/dist/admin/pages/App/components/Filters.mjs.map +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/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
- package/dist/admin/pages/SettingsPage/reducer.mjs.map +1 -1
- package/dist/admin/pluginId.js.map +1 -1
- package/dist/admin/pluginId.mjs.map +1 -1
- package/dist/admin/src/future/components/Drawer.d.ts +32 -0
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetPreview.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +2 -1
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +2 -1
- package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/ImportFromUrlDialog.d.ts +7 -0
- package/dist/admin/src/future/services/api.d.ts +10 -1
- package/dist/admin/src/future/services/assets.d.ts +2 -2
- package/dist/admin/src/future/services/folders.d.ts +1 -1
- package/dist/admin/src/future/store/uploadProgress.d.ts +1 -1
- package/dist/admin/src/future/utils/files.d.ts +70 -0
- package/dist/admin/translations/en.json.js +35 -3
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +35 -3
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +1 -1
- package/dist/admin/translations/es.json.mjs +1 -1
- package/dist/admin/utils/appendSearchParamsToUrl.js.map +1 -1
- package/dist/admin/utils/appendSearchParamsToUrl.mjs.map +1 -1
- package/dist/admin/utils/containsAssetFilter.js.map +1 -1
- package/dist/admin/utils/containsAssetFilter.mjs.map +1 -1
- package/dist/admin/utils/createAssetUrl.js.map +1 -1
- package/dist/admin/utils/createAssetUrl.mjs.map +1 -1
- package/dist/admin/utils/displayedFilters.js.map +1 -1
- package/dist/admin/utils/displayedFilters.mjs.map +1 -1
- package/dist/admin/utils/downloadFile.js.map +1 -1
- package/dist/admin/utils/downloadFile.mjs.map +1 -1
- package/dist/admin/utils/findRecursiveFolderByValue.js.map +1 -1
- package/dist/admin/utils/findRecursiveFolderByValue.mjs.map +1 -1
- package/dist/admin/utils/formatBytes.js.map +1 -1
- package/dist/admin/utils/formatBytes.mjs.map +1 -1
- package/dist/admin/utils/formatDuration.js.map +1 -1
- package/dist/admin/utils/formatDuration.mjs.map +1 -1
- package/dist/admin/utils/getAPIInnerErrors.js.map +1 -1
- package/dist/admin/utils/getAPIInnerErrors.mjs.map +1 -1
- package/dist/admin/utils/getAllowedFiles.js.map +1 -1
- package/dist/admin/utils/getAllowedFiles.mjs.map +1 -1
- package/dist/admin/utils/getBreadcrumbDataCM.js.map +1 -1
- package/dist/admin/utils/getBreadcrumbDataCM.mjs.map +1 -1
- package/dist/admin/utils/getBreadcrumbDataML.js.map +1 -1
- package/dist/admin/utils/getBreadcrumbDataML.mjs.map +1 -1
- package/dist/admin/utils/getFileExtension.js.map +1 -1
- package/dist/admin/utils/getFileExtension.mjs.map +1 -1
- package/dist/admin/utils/getFolderParents.js.map +1 -1
- package/dist/admin/utils/getFolderParents.mjs.map +1 -1
- package/dist/admin/utils/getFolderURL.js.map +1 -1
- package/dist/admin/utils/getFolderURL.mjs.map +1 -1
- package/dist/admin/utils/getTrad.js.map +1 -1
- package/dist/admin/utils/getTrad.mjs.map +1 -1
- package/dist/admin/utils/icons.js.map +1 -1
- package/dist/admin/utils/icons.mjs +1 -1
- package/dist/admin/utils/icons.mjs.map +1 -1
- package/dist/admin/utils/moveElement.js.map +1 -1
- package/dist/admin/utils/moveElement.mjs.map +1 -1
- package/dist/admin/utils/normalizeAPIError.js.map +1 -1
- package/dist/admin/utils/normalizeAPIError.mjs.map +1 -1
- package/dist/admin/utils/prefixFileUrlWithBackendUrl.js.map +1 -1
- package/dist/admin/utils/prefixFileUrlWithBackendUrl.mjs.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
- package/dist/admin/utils/rawFileToAsset.js.map +1 -1
- package/dist/admin/utils/rawFileToAsset.mjs.map +1 -1
- package/dist/admin/utils/toSingularTypes.js.map +1 -1
- package/dist/admin/utils/toSingularTypes.mjs.map +1 -1
- package/dist/admin/utils/typeFromMime.js.map +1 -1
- package/dist/admin/utils/typeFromMime.mjs.map +1 -1
- package/dist/admin/utils/urlYupSchema.js.map +1 -1
- package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
- package/dist/admin/utils/urlsToAssets.js.map +1 -1
- package/dist/admin/utils/urlsToAssets.mjs.map +1 -1
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/constants.js.map +1 -1
- package/dist/server/constants.mjs.map +1 -1
- package/dist/server/content-types/file.js.map +1 -1
- package/dist/server/content-types/file.mjs.map +1 -1
- package/dist/server/content-types/folder.js.map +1 -1
- package/dist/server/content-types/folder.mjs +1 -1
- package/dist/server/content-types/folder.mjs.map +1 -1
- package/dist/server/content-types/index.js.map +1 -1
- package/dist/server/content-types/index.mjs.map +1 -1
- package/dist/server/controllers/admin-file.js.map +1 -1
- package/dist/server/controllers/admin-file.mjs +1 -1
- package/dist/server/controllers/admin-file.mjs.map +1 -1
- package/dist/server/controllers/admin-folder-file.js.map +1 -1
- package/dist/server/controllers/admin-folder-file.mjs +2 -2
- package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
- package/dist/server/controllers/admin-folder.js.map +1 -1
- package/dist/server/controllers/admin-folder.mjs +1 -1
- package/dist/server/controllers/admin-folder.mjs.map +1 -1
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +144 -0
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +147 -3
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/controllers/utils/find-entity-and-check-permissions.js.map +1 -1
- package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs.map +1 -1
- package/dist/server/controllers/utils/folders.js.map +1 -1
- package/dist/server/controllers/utils/folders.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/configureView.js.map +1 -1
- package/dist/server/controllers/validation/admin/configureView.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/settings.js.map +1 -1
- package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/upload.js.map +1 -1
- package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/utils.js.map +1 -1
- package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
- package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
- package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
- package/dist/server/controllers/view-configuration.js.map +1 -1
- package/dist/server/controllers/view-configuration.mjs.map +1 -1
- package/dist/server/graphql.js.map +1 -1
- package/dist/server/graphql.mjs.map +1 -1
- package/dist/server/index.js +8 -8
- package/dist/server/middlewares/upload.js.map +1 -1
- package/dist/server/middlewares/upload.mjs.map +1 -1
- package/dist/server/models/ai-metadata-job.js.map +1 -1
- package/dist/server/models/ai-metadata-job.mjs.map +1 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/admin.js +10 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +10 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/routes/content-api.mjs.map +1 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/index.mjs +4 -4
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/routes/validation/upload.js.map +1 -1
- package/dist/server/routes/validation/upload.mjs.map +1 -1
- package/dist/server/routes/view-configuration.js.map +1 -1
- package/dist/server/routes/view-configuration.mjs.map +1 -1
- package/dist/server/services/ai-metadata-jobs.js.map +1 -1
- package/dist/server/services/ai-metadata-jobs.mjs.map +1 -1
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/api-upload-folder.js.map +1 -1
- package/dist/server/services/api-upload-folder.mjs.map +1 -1
- package/dist/server/services/extensions/index.js.map +1 -1
- package/dist/server/services/extensions/index.mjs.map +1 -1
- package/dist/server/services/extensions/utils.js.map +1 -1
- package/dist/server/services/extensions/utils.mjs.map +1 -1
- package/dist/server/services/file.js +120 -1
- package/dist/server/services/file.js.map +1 -1
- package/dist/server/services/file.mjs +122 -3
- package/dist/server/services/file.mjs.map +1 -1
- package/dist/server/services/folder.js.map +1 -1
- package/dist/server/services/folder.mjs +1 -1
- package/dist/server/services/folder.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +1 -1
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/services/provider.js.map +1 -1
- package/dist/server/services/provider.mjs.map +1 -1
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +1 -1
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/services/weekly-metrics.js.map +1 -1
- package/dist/server/services/weekly-metrics.mjs.map +1 -1
- package/dist/server/src/controllers/admin-upload.d.ts +13 -0
- package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.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/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/file.d.ts +15 -0
- package/dist/server/src/services/file.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/utils/cron.js.map +1 -1
- package/dist/server/utils/cron.mjs.map +1 -1
- package/dist/server/utils/images.js.map +1 -1
- package/dist/server/utils/images.mjs.map +1 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/server/utils/mime-validation.js.map +1 -1
- package/dist/server/utils/mime-validation.mjs.map +1 -1
- package/dist/shared/contracts/files.d.ts +11 -0
- package/dist/shared/contracts/files.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sources":["../../../../admin/src/future/services/api.ts"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { adminApi } from '@strapi/admin/strapi-admin';\n\nimport {\n openUploadProgress,\n setFileUploading,\n setFileComplete,\n setFileError,\n updateProgress,\n setUploadFailed,\n retryCancelledFiles,\n} from '../store/uploadProgress';\n\nimport type {\n CreateFilesStream,\n CreateFilesStreamEvents,\n} from '../../../../shared/contracts/files';\n\ninterface UploadFilesArgs {\n formData: FormData;\n totalFiles: number;\n}\n\ninterface RootState {\n admin_app: {\n token?: string | null;\n };\n uploadProgress: {\n uploadId: number;\n files: Array<{\n index: number;\n name: string;\n size: number;\n status: 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n }>;\n };\n}\n\n/**\n * Stores original File objects for retry functionality.\n *\n * Similar to abortControllers, File objects cannot be stored in Redux state\n * (they are not serializable). This Map allows us to retry cancelled uploads\n * by retrieving the original files using the uploadId.\n */\nconst uploadedFiles = new Map<number, File[]>();\n\n/**\n * Registers files for a specific upload to enable retry.\n */\nconst registerUploadedFiles = (uploadId: number, files: File[]) => {\n uploadedFiles.set(uploadId, files);\n};\n\n/**\n * Retrieves stored files for an upload.\n */\nconst getUploadedFiles = (uploadId: number): File[] | undefined => {\n return uploadedFiles.get(uploadId);\n};\n\n/**\n * Manages abort controllers for in-flight uploads.\n *\n * Design decision: Uses a Map to track uploads by their unique uploadId.\n * This approach is necessary because:\n * 1. Redux state cannot store function references (abort controllers)\n * 2. RTK Query's signal is only accessible within the queryFn\n * 3. The upload is triggered in AssetsPage but cancelled from UploadProgressDialog\n *\n * The uploadId ensures we abort the correct upload even if multiple uploads\n * are queued, though the current UI prevents simultaneous uploads.\n */\nconst abortControllers = new Map<number, AbortController>();\n\n/**\n * Registers an abort controller for a specific upload.\n * Called internally when an upload starts.\n */\nconst registerAbortController = (uploadId: number, controller: AbortController) => {\n abortControllers.set(uploadId, controller);\n};\n\n/**\n * Removes an abort controller when an upload completes or is aborted.\n */\nconst unregisterAbortController = (uploadId: number) => {\n abortControllers.delete(uploadId);\n};\n\n/**\n * Aborts an upload by its uploadId.\n * Called from the UploadProgressDialog when the user clicks cancel or close.\n */\nexport const abortUpload = (uploadId: number) => {\n const controller = abortControllers.get(uploadId);\n if (controller) {\n controller.abort();\n unregisterAbortController(uploadId);\n }\n};\n\n/**\n * Parses a raw SSE text chunk into event/data pairs.\n *\n * SSE format:\n * event: <eventName>\\n\n * data: <json>\\n\n * \\n\n */\nconst parseSSEEvents = (chunk: string): Array<{ event: string; data: string }> => {\n const events: Array<{ event: string; data: string }> = [];\n const blocks = chunk.split('\\n\\n').filter(Boolean);\n\n for (const block of blocks) {\n let event = '';\n let data = '';\n\n for (const line of block.split('\\n')) {\n if (line.startsWith('event: ')) {\n event = line.slice(7);\n } else if (line.startsWith('data: ')) {\n data = line.slice(6);\n }\n }\n\n if (event && data) {\n events.push({ event, data });\n }\n }\n\n return events;\n};\n\n/**\n * Makes a streaming upload request to the server.\n *\n * We use fetch directly instead of RTK Query's fetchBaseQuery because:\n * 1. We need access to the raw Response to read the body as a stream\n * 2. RTK Query's baseQuery awaits the full response and parses it as JSON,\n * which doesn't work for Server-Sent Events (SSE) streaming\n * 3. The stream must be read incrementally via response.body.getReader()\n * to dispatch progress updates as files upload\n */\nconst fetchUploadStream = async ({\n token,\n formData,\n signal,\n}: {\n token: string | null | undefined;\n formData: FormData;\n signal: AbortSignal;\n}): Promise<Response> => {\n const backendURL = window.strapi.backendURL;\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n return fetch(`${backendURL}/upload/unstable/stream`, {\n method: 'POST',\n headers,\n body: formData,\n signal,\n });\n};\n\n/**\n * Options for processing an SSE upload stream.\n */\ninterface ProcessSSEStreamOptions {\n response: Response;\n dispatch: Dispatch;\n indexMapper?: (serverIndex: number) => number;\n}\n\n/**\n * Processes an SSE stream from the upload endpoint.\n * Dispatches Redux actions for each file event and returns the final result.\n *\n * @param options.response - The fetch Response object with SSE body\n * @param options.dispatch - Redux dispatch function\n * @param options.indexMapper - Optional function to map server indices to state indices (for retry)\n * @param options.logPrefix - Optional prefix for console logs\n * @returns The stream result or null if no files completed\n */\nconst processSSEStream = async ({\n response,\n dispatch,\n indexMapper = (i) => i,\n}: ProcessSSEStreamOptions): Promise<CreateFilesStream.Response | null> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n let streamResult: CreateFilesStream.Response | null = null;\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete SSE events from the buffer\n const lastDoubleNewline = buffer.lastIndexOf('\\n\\n');\n if (lastDoubleNewline === -1) {\n // No complete events yet, keep buffering\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const completePart = buffer.slice(0, lastDoubleNewline + 2);\n buffer = buffer.slice(lastDoubleNewline + 2);\n\n const events = parseSSEEvents(completePart);\n\n for (const { event, data } of events) {\n const parsed = JSON.parse(data);\n const mappedIndex = indexMapper(parsed.index as number);\n\n switch (event) {\n case 'file:uploading': {\n const payload = parsed as CreateFilesStreamEvents.FileUploadingEvent;\n dispatch(\n setFileUploading({\n name: payload.name,\n index: mappedIndex,\n total: payload.total,\n size: payload.size,\n })\n );\n break;\n }\n case 'file:complete': {\n const payload = parsed as CreateFilesStreamEvents.FileCompleteEvent;\n dispatch(\n setFileComplete({\n index: mappedIndex,\n file: payload.file,\n })\n );\n break;\n }\n case 'file:error': {\n const payload = parsed as CreateFilesStreamEvents.FileErrorEvent;\n dispatch(\n setFileError({\n index: mappedIndex,\n name: payload.name,\n message: payload.message,\n })\n );\n break;\n }\n case 'stream:complete': {\n const payload = parsed as CreateFilesStreamEvents.StreamCompleteEvent;\n streamResult = {\n data: payload.data,\n errors: payload.errors,\n };\n break;\n }\n default:\n console.error(`[SSE Upload] unknown event: ${event}`, parsed);\n }\n }\n }\n\n return streamResult;\n};\n\nconst uploadApi = adminApi\n .enhanceEndpoints({\n addTagTypes: ['Asset', 'Folder'],\n })\n .injectEndpoints({\n endpoints: (builder) => ({\n /**\n * Stream upload files to the /upload/unstable/stream endpoint.\n * Reads SSE stream for per-file progress updates.\n */\n uploadFilesStream: builder.mutation<CreateFilesStream.Response, UploadFilesArgs>({\n queryFn: async ({ formData, totalFiles }, { dispatch, getState }) => {\n const token = (getState() as RootState).admin_app?.token;\n\n // Extract file names and sizes from FormData\n const files = formData.getAll('files') as File[];\n const fileInfoJson = formData.get('fileInfo') as string;\n const fileInfo = JSON.parse(fileInfoJson) as Array<{ name: string }>;\n const fileNames = fileInfo.map((info) => info.name);\n const fileSizes = files.map((file) => file.size);\n\n // Open the progress dialog and get the uploadId\n dispatch(openUploadProgress({ totalFiles, fileNames, fileSizes }));\n dispatch(updateProgress(0));\n\n // Get the uploadId from state after dispatching\n const uploadId = (getState() as RootState).uploadProgress.uploadId;\n\n // Store original files for retry functionality\n registerUploadedFiles(uploadId, files);\n\n // Create abort controller for this upload\n const abortController = new AbortController();\n registerAbortController(uploadId, abortController);\n\n try {\n const response = await fetchUploadStream({\n token,\n formData,\n signal: abortController.signal,\n });\n\n if (!response.ok || !response.body) {\n unregisterAbortController(uploadId);\n\n // Try to parse error message from response\n let errorMessage = 'Upload request failed';\n try {\n const errorData = await response.json();\n if (errorData.error?.message) {\n errorMessage = errorData.error.message;\n } else if (errorData.message) {\n errorMessage = errorData.message;\n }\n } catch {\n // If we can't parse the error, use a generic message with status code\n errorMessage = `Upload failed with status ${response.status}`;\n }\n\n // Mark all files as failed in the UI\n dispatch(setUploadFailed({ message: errorMessage }));\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n status: response.status,\n },\n };\n }\n\n const streamResult = await processSSEStream({\n response,\n dispatch,\n });\n\n unregisterAbortController(uploadId);\n\n if (streamResult && streamResult.data.length > 0) {\n return { data: streamResult };\n }\n\n // If stream ended without completing any files, mark all as failed\n const errorMessage = 'No files were uploaded successfully';\n dispatch(setUploadFailed({ message: errorMessage }));\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n },\n };\n } catch (err) {\n unregisterAbortController(uploadId);\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n // Don't mark as failed for user-initiated cancellations\n return {\n error: { name: 'UnknownError', message: 'Upload cancelled' },\n };\n }\n\n // For network errors or other exceptions, mark all files as failed\n const errorMessage = err instanceof Error ? err.message : 'Network error occurred';\n dispatch(setUploadFailed({ message: errorMessage }));\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n },\n };\n }\n },\n invalidatesTags: [{ type: 'Asset', id: 'LIST' }],\n }),\n\n /**\n * Retry uploading cancelled files.\n * Retrieves original File objects and re-uploads only the cancelled ones.\n */\n retryCancelledFilesStream: builder.mutation<CreateFilesStream.Response, void>({\n queryFn: async (_, { dispatch, getState }) => {\n const token = (getState() as RootState).admin_app?.token;\n const { uploadId, files: stateFiles } = (getState() as RootState).uploadProgress;\n\n // Get cancelled files with their original indices\n const cancelledFiles = stateFiles.filter((f) => f.status === 'cancelled');\n if (cancelledFiles.length === 0) {\n return { error: { name: 'UnknownError', message: 'No cancelled files to retry' } };\n }\n\n // Get the original File objects\n const originalFiles = getUploadedFiles(uploadId);\n if (!originalFiles) {\n return { error: { name: 'UnknownError', message: 'Original files not found' } };\n }\n\n // Build mapping from new index to original index\n const indexMapping = cancelledFiles.map((f) => f.index);\n const filesToRetry = cancelledFiles.map((f) => originalFiles[f.index]);\n\n // Reset cancelled files to pending\n dispatch(retryCancelledFiles());\n\n // Build FormData for retry\n const formData = new FormData();\n const fileInfoArray = filesToRetry.map((file) => ({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: null, // TODO: preserve folder from original upload if needed\n }));\n\n filesToRetry.forEach((file) => {\n formData.append('files', file);\n });\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n\n // Create abort controller for this retry\n const abortController = new AbortController();\n registerAbortController(uploadId, abortController);\n\n try {\n const response = await fetchUploadStream({\n token,\n formData,\n signal: abortController.signal,\n });\n\n if (!response.ok || !response.body) {\n unregisterAbortController(uploadId);\n\n let errorMessage = 'Retry request failed';\n try {\n const errorData = await response.json();\n if (errorData.error?.message) {\n errorMessage = errorData.error.message;\n } else if (errorData.message) {\n errorMessage = errorData.message;\n }\n } catch {\n errorMessage = `Retry failed with status ${response.status}`;\n }\n\n // Mark retried files as failed\n for (const originalIndex of indexMapping) {\n dispatch(\n setFileError({\n index: originalIndex,\n name: stateFiles[originalIndex].name,\n message: errorMessage,\n })\n );\n }\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n status: response.status,\n },\n };\n }\n\n const streamResult = await processSSEStream({\n response,\n dispatch,\n indexMapper: (serverIndex) => indexMapping[serverIndex],\n });\n\n unregisterAbortController(uploadId);\n\n if (streamResult && streamResult.data.length > 0) {\n return { data: streamResult };\n }\n\n return {\n error: {\n name: 'UnknownError',\n message: 'No files were uploaded successfully',\n },\n };\n } catch (err) {\n unregisterAbortController(uploadId);\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n return {\n error: { name: 'UnknownError', message: 'Retry cancelled' },\n };\n }\n\n const errorMessage = err instanceof Error ? err.message : 'Network error occurred';\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n },\n };\n }\n },\n invalidatesTags: [{ type: 'Asset', id: 'LIST' }],\n }),\n }),\n });\n\nexport const { useUploadFilesStreamMutation, useRetryCancelledFilesStreamMutation } = uploadApi;\nexport { uploadApi };\n"],"names":["uploadedFiles","Map","registerUploadedFiles","uploadId","files","set","getUploadedFiles","get","abortControllers","registerAbortController","controller","unregisterAbortController","delete","abortUpload","abort","parseSSEEvents","chunk","events","blocks","split","filter","Boolean","block","event","data","line","startsWith","slice","push","fetchUploadStream","token","formData","signal","backendURL","window","strapi","headers","Authorization","fetch","method","body","processSSEStream","response","dispatch","indexMapper","i","reader","getReader","decoder","TextDecoder","streamResult","buffer","done","value","read","decode","stream","lastDoubleNewline","lastIndexOf","completePart","parsed","JSON","parse","mappedIndex","index","payload","setFileUploading","name","total","size","setFileComplete","file","setFileError","message","errors","console","error","uploadApi","adminApi","enhanceEndpoints","addTagTypes","injectEndpoints","endpoints","builder","uploadFilesStream","mutation","queryFn","totalFiles","getState","admin_app","getAll","fileInfoJson","fileInfo","fileNames","map","info","fileSizes","openUploadProgress","updateProgress","uploadProgress","abortController","AbortController","ok","errorMessage","errorData","json","status","setUploadFailed","length","err","DOMException","Error","invalidatesTags","type","id","retryCancelledFilesStream","_","stateFiles","cancelledFiles","f","originalFiles","indexMapping","filesToRetry","retryCancelledFiles","FormData","fileInfoArray","caption","alternativeText","folder","forEach","append","stringify","originalIndex","serverIndex","useUploadFilesStreamMutation","useRetryCancelledFilesStreamMutation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.js","sources":["../../../../admin/src/future/services/api.ts"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { adminApi } from '@strapi/admin/strapi-admin';\n\nimport {\n openUploadProgress,\n setFileUploading,\n setFileComplete,\n setFileError,\n updateProgress,\n setUploadFailed,\n retryCancelledFiles,\n} from '../store/uploadProgress';\nimport { getFilenameFromUrl } from '../utils/files';\n\nimport type {\n CreateFilesStream,\n CreateFilesStreamEvents,\n} from '../../../../shared/contracts/files';\n\ninterface UploadFilesArgs {\n formData: FormData;\n totalFiles: number;\n}\n\ninterface UploadFromUrlsArgs {\n urls: string[];\n folderId: number | null;\n}\n\ninterface RootState {\n admin_app: {\n token?: string | null;\n };\n uploadProgress: {\n uploadId: number;\n files: Array<{\n index: number;\n name: string;\n size: number;\n status: 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n }>;\n };\n}\n\n/**\n * Stores original File objects for retry functionality.\n *\n * Similar to abortControllers, File objects cannot be stored in Redux state\n * (they are not serializable). This Map allows us to retry cancelled uploads\n * by retrieving the original files using the uploadId.\n */\nconst uploadedFiles = new Map<number, File[]>();\n\n/**\n * Registers files for a specific upload to enable retry.\n */\nconst registerUploadedFiles = (uploadId: number, files: File[]) => {\n uploadedFiles.set(uploadId, files);\n};\n\n/**\n * Retrieves stored files for an upload.\n */\nconst getUploadedFiles = (uploadId: number): File[] | undefined => {\n return uploadedFiles.get(uploadId);\n};\n\n/**\n * Manages abort controllers for in-flight uploads.\n *\n * Design decision: Uses a Map to track uploads by their unique uploadId.\n * This approach is necessary because:\n * 1. Redux state cannot store function references (abort controllers)\n * 2. RTK Query's signal is only accessible within the queryFn\n * 3. The upload is triggered in AssetsPage but cancelled from UploadProgressDialog\n *\n * The uploadId ensures we abort the correct upload even if multiple uploads\n * are queued, though the current UI prevents simultaneous uploads.\n */\nconst abortControllers = new Map<number, AbortController>();\n\n/**\n * Registers an abort controller for a specific upload.\n * Called internally when an upload starts.\n */\nconst registerAbortController = (uploadId: number, controller: AbortController) => {\n abortControllers.set(uploadId, controller);\n};\n\n/**\n * Removes an abort controller when an upload completes or is aborted.\n */\nconst unregisterAbortController = (uploadId: number) => {\n abortControllers.delete(uploadId);\n};\n\n/**\n * Aborts an upload by its uploadId.\n * Called from the UploadProgressDialog when the user clicks cancel or close.\n */\nexport const abortUpload = (uploadId: number) => {\n const controller = abortControllers.get(uploadId);\n if (controller) {\n controller.abort();\n unregisterAbortController(uploadId);\n }\n};\n\n/**\n * Parses a raw SSE text chunk into event/data pairs.\n *\n * SSE format:\n * event: <eventName>\\n\n * data: <json>\\n\n * \\n\n */\nconst parseSSEEvents = (chunk: string): Array<{ event: string; data: string }> => {\n const events: Array<{ event: string; data: string }> = [];\n const blocks = chunk.split('\\n\\n').filter(Boolean);\n\n for (const block of blocks) {\n let event = '';\n let data = '';\n\n for (const line of block.split('\\n')) {\n if (line.startsWith('event: ')) {\n event = line.slice(7);\n } else if (line.startsWith('data: ')) {\n data = line.slice(6);\n }\n }\n\n if (event && data) {\n events.push({ event, data });\n }\n }\n\n return events;\n};\n\n/**\n * Makes a streaming upload request to the server.\n *\n * We use fetch directly instead of RTK Query's fetchBaseQuery because:\n * 1. We need access to the raw Response to read the body as a stream\n * 2. RTK Query's baseQuery awaits the full response and parses it as JSON,\n * which doesn't work for Server-Sent Events (SSE) streaming\n * 3. The stream must be read incrementally via response.body.getReader()\n * to dispatch progress updates as files upload\n */\nconst fetchUploadStream = async ({\n token,\n formData,\n signal,\n}: {\n token: string | null | undefined;\n formData: FormData;\n signal: AbortSignal;\n}): Promise<Response> => {\n const backendURL = window.strapi.backendURL;\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n return fetch(`${backendURL}/upload/unstable/stream`, {\n method: 'POST',\n headers,\n body: formData,\n signal,\n });\n};\n\n/**\n * Makes a streaming upload-from-URLs request to the server.\n * Sends URLs as JSON body instead of FormData.\n */\nconst fetchUrlUploadStream = async ({\n token,\n urls,\n folderId,\n signal,\n}: {\n token: string | null | undefined;\n urls: string[];\n folderId: number | null;\n signal: AbortSignal;\n}): Promise<Response> => {\n const backendURL = window.strapi.backendURL;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n return fetch(`${backendURL}/upload/unstable/stream-from-urls`, {\n method: 'POST',\n headers,\n body: JSON.stringify({ urls, folderId }),\n signal,\n });\n};\n\n/**\n * Options for processing an SSE upload stream.\n */\ninterface ProcessSSEStreamOptions {\n response: Response;\n dispatch: Dispatch;\n indexMapper?: (serverIndex: number) => number;\n}\n\n/**\n * Processes an SSE stream from the upload endpoint.\n * Dispatches Redux actions for each file event and returns the final result.\n *\n * @param options.response - The fetch Response object with SSE body\n * @param options.dispatch - Redux dispatch function\n * @param options.indexMapper - Optional function to map server indices to state indices (for retry)\n * @param options.logPrefix - Optional prefix for console logs\n * @returns The stream result or null if no files completed\n */\nconst processSSEStream = async ({\n response,\n dispatch,\n indexMapper = (i) => i,\n}: ProcessSSEStreamOptions): Promise<CreateFilesStream.Response | null> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n let streamResult: CreateFilesStream.Response | null = null;\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete SSE events from the buffer\n const lastDoubleNewline = buffer.lastIndexOf('\\n\\n');\n if (lastDoubleNewline === -1) {\n // No complete events yet, keep buffering\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const completePart = buffer.slice(0, lastDoubleNewline + 2);\n buffer = buffer.slice(lastDoubleNewline + 2);\n\n const events = parseSSEEvents(completePart);\n\n for (const { event, data } of events) {\n const parsed = JSON.parse(data);\n const mappedIndex = indexMapper(parsed.index as number);\n\n switch (event) {\n case 'file:fetching': {\n // URL is being fetched server-side - mark as uploading (processing)\n dispatch(\n setFileUploading({\n name: parsed.url as string,\n index: mappedIndex,\n total: parsed.total as number,\n size: 0,\n })\n );\n break;\n }\n case 'file:uploading': {\n const payload = parsed as CreateFilesStreamEvents.FileUploadingEvent;\n dispatch(\n setFileUploading({\n name: payload.name,\n index: mappedIndex,\n total: payload.total,\n size: payload.size,\n })\n );\n break;\n }\n case 'file:complete': {\n const payload = parsed as CreateFilesStreamEvents.FileCompleteEvent;\n dispatch(\n setFileComplete({\n index: mappedIndex,\n file: payload.file,\n })\n );\n break;\n }\n case 'file:error': {\n const payload = parsed as CreateFilesStreamEvents.FileErrorEvent;\n dispatch(\n setFileError({\n index: mappedIndex,\n name: payload.name,\n message: payload.message,\n })\n );\n break;\n }\n case 'stream:complete': {\n const payload = parsed as CreateFilesStreamEvents.StreamCompleteEvent;\n streamResult = {\n data: payload.data,\n errors: payload.errors,\n };\n break;\n }\n default:\n console.error(`[SSE Upload] unknown event: ${event}`, parsed);\n }\n }\n }\n\n return streamResult;\n};\n\n/**\n * Options for performing a streaming upload.\n */\ninterface PerformStreamUploadOptions {\n token: string | null | undefined;\n formData: FormData;\n abortController: AbortController;\n uploadId: number;\n dispatch: Dispatch;\n indexMapper?: (serverIndex: number) => number;\n onUploadFailed?: (message: string) => void;\n}\n\n/**\n * Error shape returned by upload operations.\n */\ninterface UploadError {\n name: 'UnknownError';\n message: string;\n status?: number;\n}\n\n/**\n * Result of a streaming upload operation.\n * Matches RTK Query's expected return type for queryFn.\n */\ntype UploadResult =\n | { data: CreateFilesStream.Response; error?: undefined }\n | { error: UploadError; data?: undefined };\n\n/**\n * Performs the actual streaming upload to the server.\n * Shared by uploadFilesStream, retryCancelledFilesStream, and uploadFromUrls.\n *\n * @param options - Upload configuration\n * @returns The upload result or error\n */\nconst performStreamUpload = async ({\n token,\n formData,\n abortController,\n uploadId,\n dispatch,\n indexMapper = (i) => i,\n onUploadFailed = (message) => dispatch(setUploadFailed({ message })),\n}: PerformStreamUploadOptions): Promise<UploadResult> => {\n try {\n const response = await fetchUploadStream({\n token,\n formData,\n signal: abortController.signal,\n });\n\n if (!response.ok || !response.body) {\n unregisterAbortController(uploadId);\n\n let errorMessage = 'Upload request failed';\n try {\n const errorData = await response.json();\n if (errorData.error?.message) {\n errorMessage = errorData.error.message;\n } else if (errorData.message) {\n errorMessage = errorData.message;\n }\n } catch {\n errorMessage = `Upload failed with status ${response.status}`;\n }\n\n onUploadFailed(errorMessage);\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n status: response.status,\n },\n };\n }\n\n const streamResult = await processSSEStream({\n response,\n dispatch,\n indexMapper,\n });\n\n unregisterAbortController(uploadId);\n\n if (streamResult && streamResult.data.length > 0) {\n return { data: streamResult };\n }\n\n return { data: { data: [], errors: [] } };\n } catch (err) {\n unregisterAbortController(uploadId);\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n return { error: { name: 'UnknownError', message: 'Upload cancelled' } };\n }\n\n const errorMessage = err instanceof Error ? err.message : 'Network error occurred';\n onUploadFailed(errorMessage);\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n },\n };\n }\n};\n\nconst uploadApi = adminApi\n .enhanceEndpoints({\n addTagTypes: ['Asset', 'Folder'],\n })\n .injectEndpoints({\n endpoints: (builder) => ({\n /**\n * Stream upload files to the /upload/unstable/stream endpoint.\n * Reads SSE stream for per-file progress updates.\n */\n uploadFilesStream: builder.mutation<CreateFilesStream.Response, UploadFilesArgs>({\n queryFn: async ({ formData, totalFiles }, { dispatch, getState }) => {\n const token = (getState() as RootState).admin_app?.token;\n\n // Extract file names and sizes from FormData\n const files = formData.getAll('files') as File[];\n const fileInfoJson = formData.get('fileInfo') as string;\n const fileInfo = JSON.parse(fileInfoJson) as Array<{ name: string }>;\n const fileNames = fileInfo.map((info) => info.name);\n const fileSizes = files.map((file) => file.size);\n\n // Open the progress dialog\n dispatch(openUploadProgress({ totalFiles, fileNames, fileSizes }));\n dispatch(updateProgress(0));\n\n // Get the uploadId from state after dispatching\n const uploadId = (getState() as RootState).uploadProgress.uploadId;\n\n // Store original files for retry functionality\n registerUploadedFiles(uploadId, files);\n\n // Create abort controller for this upload\n const abortController = new AbortController();\n registerAbortController(uploadId, abortController);\n\n return performStreamUpload({\n token,\n formData,\n abortController,\n uploadId,\n dispatch,\n });\n },\n invalidatesTags: [{ type: 'Asset', id: 'LIST' }],\n }),\n\n /**\n * Retry uploading cancelled files.\n * Retrieves original File objects and re-uploads only the cancelled ones.\n */\n retryCancelledFilesStream: builder.mutation<CreateFilesStream.Response, void>({\n queryFn: async (_, { dispatch, getState }) => {\n const token = (getState() as RootState).admin_app?.token;\n const { uploadId, files: stateFiles } = (getState() as RootState).uploadProgress;\n\n // Get cancelled files with their original indices\n const cancelledFiles = stateFiles.filter((f) => f.status === 'cancelled');\n if (cancelledFiles.length === 0) {\n return { error: { name: 'UnknownError', message: 'No cancelled files to retry' } };\n }\n\n // Get the original File objects\n const originalFiles = getUploadedFiles(uploadId);\n if (!originalFiles) {\n return { error: { name: 'UnknownError', message: 'Original files not found' } };\n }\n\n // Build mapping from new index to original index\n const indexMapping = cancelledFiles.map((f) => f.index);\n const filesToRetry = cancelledFiles.map((f) => originalFiles[f.index]);\n\n // Reset cancelled files to pending\n dispatch(retryCancelledFiles());\n\n // Build FormData for retry\n const formData = new FormData();\n const fileInfoArray = filesToRetry.map((file) => ({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: null, // TODO: preserve folder from original upload if needed\n }));\n\n filesToRetry.forEach((file) => {\n formData.append('files', file);\n });\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n\n // Create abort controller for this retry\n const abortController = new AbortController();\n registerAbortController(uploadId, abortController);\n\n // Custom error handler: mark individual retried files as failed\n const onUploadFailed = (message: string) => {\n for (const originalIndex of indexMapping) {\n dispatch(\n setFileError({\n index: originalIndex,\n name: stateFiles[originalIndex].name,\n message,\n })\n );\n }\n };\n\n return performStreamUpload({\n token,\n formData,\n abortController,\n uploadId,\n dispatch,\n indexMapper: (serverIndex) => indexMapping[serverIndex],\n onUploadFailed,\n });\n },\n invalidatesTags: [{ type: 'Asset', id: 'LIST' }],\n }),\n\n /**\n * Upload files from URLs.\n * Sends URLs to the server which fetches and uploads them.\n */\n uploadFromUrls: builder.mutation<CreateFilesStream.Response, UploadFromUrlsArgs>({\n queryFn: async ({ urls, folderId }, { dispatch, getState }) => {\n const token = (getState() as RootState).admin_app?.token;\n\n // Extract filenames from URLs for the progress dialog\n const fileNames = urls.map((url) => getFilenameFromUrl(url));\n\n // Open progress dialog with all URLs as pending files\n dispatch(\n openUploadProgress({\n totalFiles: urls.length,\n fileNames,\n })\n );\n dispatch(updateProgress(0));\n\n // Get the uploadId from state after dispatching\n const uploadId = (getState() as RootState).uploadProgress.uploadId;\n\n // Create abort controller for this upload\n const abortController = new AbortController();\n registerAbortController(uploadId, abortController);\n\n try {\n // Send URLs to server for fetching and uploading\n const response = await fetchUrlUploadStream({\n token,\n urls,\n folderId,\n signal: abortController.signal,\n });\n\n if (!response.ok || !response.body) {\n unregisterAbortController(uploadId);\n\n let errorMessage = 'Upload request failed';\n try {\n const errorData = await response.json();\n if (errorData.error?.message) {\n errorMessage = errorData.error.message;\n } else if (errorData.message) {\n errorMessage = errorData.message;\n }\n } catch {\n errorMessage = `Upload failed with status ${response.status}`;\n }\n\n dispatch(setUploadFailed({ message: errorMessage }));\n\n return {\n error: {\n name: 'UnknownError' as const,\n message: errorMessage,\n status: response.status,\n },\n };\n }\n\n // Process SSE stream from server\n const streamResult = await processSSEStream({\n response,\n dispatch,\n });\n\n unregisterAbortController(uploadId);\n\n if (streamResult && streamResult.data.length > 0) {\n return { data: streamResult };\n }\n\n return { data: { data: [], errors: [] } };\n } catch (err) {\n unregisterAbortController(uploadId);\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n return { error: { name: 'UnknownError' as const, message: 'Upload cancelled' } };\n }\n\n const errorMessage = err instanceof Error ? err.message : 'Network error occurred';\n dispatch(setUploadFailed({ message: errorMessage }));\n\n return {\n error: {\n name: 'UnknownError' as const,\n message: errorMessage,\n },\n };\n }\n },\n invalidatesTags: [{ type: 'Asset', id: 'LIST' }],\n }),\n }),\n });\n\nexport const {\n useUploadFilesStreamMutation,\n useRetryCancelledFilesStreamMutation,\n useUploadFromUrlsMutation,\n} = uploadApi;\nexport { uploadApi };\n"],"names":["uploadedFiles","Map","registerUploadedFiles","uploadId","files","set","getUploadedFiles","get","abortControllers","registerAbortController","controller","unregisterAbortController","delete","abortUpload","abort","parseSSEEvents","chunk","events","blocks","split","filter","Boolean","block","event","data","line","startsWith","slice","push","fetchUploadStream","token","formData","signal","backendURL","window","strapi","headers","Authorization","fetch","method","body","fetchUrlUploadStream","urls","folderId","JSON","stringify","processSSEStream","response","dispatch","indexMapper","i","reader","getReader","decoder","TextDecoder","streamResult","buffer","done","value","read","decode","stream","lastDoubleNewline","lastIndexOf","completePart","parsed","parse","mappedIndex","index","setFileUploading","name","url","total","size","payload","setFileComplete","file","setFileError","message","errors","console","error","performStreamUpload","abortController","onUploadFailed","setUploadFailed","ok","errorMessage","errorData","json","status","length","err","DOMException","Error","uploadApi","adminApi","enhanceEndpoints","addTagTypes","injectEndpoints","endpoints","builder","uploadFilesStream","mutation","queryFn","totalFiles","getState","admin_app","getAll","fileInfoJson","fileInfo","fileNames","map","info","fileSizes","openUploadProgress","updateProgress","uploadProgress","AbortController","invalidatesTags","type","id","retryCancelledFilesStream","_","stateFiles","cancelledFiles","f","originalFiles","indexMapping","filesToRetry","retryCancelledFiles","FormData","fileInfoArray","caption","alternativeText","folder","forEach","append","originalIndex","serverIndex","uploadFromUrls","getFilenameFromUrl","useUploadFilesStreamMutation","useRetryCancelledFilesStreamMutation","useUploadFromUrlsMutation"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { adminApi } from '@strapi/admin/strapi-admin';
|
|
2
2
|
import { openUploadProgress, updateProgress, setUploadFailed, retryCancelledFiles, setFileError, setFileComplete, setFileUploading } from '../store/uploadProgress.mjs';
|
|
3
|
+
import { getFilenameFromUrl } from '../utils/files.mjs';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Stores original File objects for retry functionality.
|
|
@@ -102,6 +103,27 @@ import { openUploadProgress, updateProgress, setUploadFailed, retryCancelledFile
|
|
|
102
103
|
signal
|
|
103
104
|
});
|
|
104
105
|
};
|
|
106
|
+
/**
|
|
107
|
+
* Makes a streaming upload-from-URLs request to the server.
|
|
108
|
+
* Sends URLs as JSON body instead of FormData.
|
|
109
|
+
*/ const fetchUrlUploadStream = async ({ token, urls, folderId, signal })=>{
|
|
110
|
+
const backendURL = window.strapi.backendURL;
|
|
111
|
+
const headers = {
|
|
112
|
+
'Content-Type': 'application/json'
|
|
113
|
+
};
|
|
114
|
+
if (token) {
|
|
115
|
+
headers.Authorization = `Bearer ${token}`;
|
|
116
|
+
}
|
|
117
|
+
return fetch(`${backendURL}/upload/unstable/stream-from-urls`, {
|
|
118
|
+
method: 'POST',
|
|
119
|
+
headers,
|
|
120
|
+
body: JSON.stringify({
|
|
121
|
+
urls,
|
|
122
|
+
folderId
|
|
123
|
+
}),
|
|
124
|
+
signal
|
|
125
|
+
});
|
|
126
|
+
};
|
|
105
127
|
/**
|
|
106
128
|
* Processes an SSE stream from the upload endpoint.
|
|
107
129
|
* Dispatches Redux actions for each file event and returns the final result.
|
|
@@ -136,6 +158,17 @@ import { openUploadProgress, updateProgress, setUploadFailed, retryCancelledFile
|
|
|
136
158
|
const parsed = JSON.parse(data);
|
|
137
159
|
const mappedIndex = indexMapper(parsed.index);
|
|
138
160
|
switch(event){
|
|
161
|
+
case 'file:fetching':
|
|
162
|
+
{
|
|
163
|
+
// URL is being fetched server-side - mark as uploading (processing)
|
|
164
|
+
dispatch(setFileUploading({
|
|
165
|
+
name: parsed.url,
|
|
166
|
+
index: mappedIndex,
|
|
167
|
+
total: parsed.total,
|
|
168
|
+
size: 0
|
|
169
|
+
}));
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
139
172
|
case 'file:uploading':
|
|
140
173
|
{
|
|
141
174
|
const payload = parsed;
|
|
@@ -182,6 +215,80 @@ import { openUploadProgress, updateProgress, setUploadFailed, retryCancelledFile
|
|
|
182
215
|
}
|
|
183
216
|
return streamResult;
|
|
184
217
|
};
|
|
218
|
+
/**
|
|
219
|
+
* Performs the actual streaming upload to the server.
|
|
220
|
+
* Shared by uploadFilesStream, retryCancelledFilesStream, and uploadFromUrls.
|
|
221
|
+
*
|
|
222
|
+
* @param options - Upload configuration
|
|
223
|
+
* @returns The upload result or error
|
|
224
|
+
*/ const performStreamUpload = async ({ token, formData, abortController, uploadId, dispatch, indexMapper = (i)=>i, onUploadFailed = (message)=>dispatch(setUploadFailed({
|
|
225
|
+
message
|
|
226
|
+
})) })=>{
|
|
227
|
+
try {
|
|
228
|
+
const response = await fetchUploadStream({
|
|
229
|
+
token,
|
|
230
|
+
formData,
|
|
231
|
+
signal: abortController.signal
|
|
232
|
+
});
|
|
233
|
+
if (!response.ok || !response.body) {
|
|
234
|
+
unregisterAbortController(uploadId);
|
|
235
|
+
let errorMessage = 'Upload request failed';
|
|
236
|
+
try {
|
|
237
|
+
const errorData = await response.json();
|
|
238
|
+
if (errorData.error?.message) {
|
|
239
|
+
errorMessage = errorData.error.message;
|
|
240
|
+
} else if (errorData.message) {
|
|
241
|
+
errorMessage = errorData.message;
|
|
242
|
+
}
|
|
243
|
+
} catch {
|
|
244
|
+
errorMessage = `Upload failed with status ${response.status}`;
|
|
245
|
+
}
|
|
246
|
+
onUploadFailed(errorMessage);
|
|
247
|
+
return {
|
|
248
|
+
error: {
|
|
249
|
+
name: 'UnknownError',
|
|
250
|
+
message: errorMessage,
|
|
251
|
+
status: response.status
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const streamResult = await processSSEStream({
|
|
256
|
+
response,
|
|
257
|
+
dispatch,
|
|
258
|
+
indexMapper
|
|
259
|
+
});
|
|
260
|
+
unregisterAbortController(uploadId);
|
|
261
|
+
if (streamResult && streamResult.data.length > 0) {
|
|
262
|
+
return {
|
|
263
|
+
data: streamResult
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
data: {
|
|
268
|
+
data: [],
|
|
269
|
+
errors: []
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
} catch (err) {
|
|
273
|
+
unregisterAbortController(uploadId);
|
|
274
|
+
if (err instanceof DOMException && err.name === 'AbortError') {
|
|
275
|
+
return {
|
|
276
|
+
error: {
|
|
277
|
+
name: 'UnknownError',
|
|
278
|
+
message: 'Upload cancelled'
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
const errorMessage = err instanceof Error ? err.message : 'Network error occurred';
|
|
283
|
+
onUploadFailed(errorMessage);
|
|
284
|
+
return {
|
|
285
|
+
error: {
|
|
286
|
+
name: 'UnknownError',
|
|
287
|
+
message: errorMessage
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
};
|
|
185
292
|
const uploadApi = adminApi.enhanceEndpoints({
|
|
186
293
|
addTagTypes: [
|
|
187
294
|
'Asset',
|
|
@@ -201,7 +308,7 @@ const uploadApi = adminApi.enhanceEndpoints({
|
|
|
201
308
|
const fileInfo = JSON.parse(fileInfoJson);
|
|
202
309
|
const fileNames = fileInfo.map((info)=>info.name);
|
|
203
310
|
const fileSizes = files.map((file)=>file.size);
|
|
204
|
-
// Open the progress dialog
|
|
311
|
+
// Open the progress dialog
|
|
205
312
|
dispatch(openUploadProgress({
|
|
206
313
|
totalFiles,
|
|
207
314
|
fileNames,
|
|
@@ -215,83 +322,13 @@ const uploadApi = adminApi.enhanceEndpoints({
|
|
|
215
322
|
// Create abort controller for this upload
|
|
216
323
|
const abortController = new AbortController();
|
|
217
324
|
registerAbortController(uploadId, abortController);
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
unregisterAbortController(uploadId);
|
|
226
|
-
// Try to parse error message from response
|
|
227
|
-
let errorMessage = 'Upload request failed';
|
|
228
|
-
try {
|
|
229
|
-
const errorData = await response.json();
|
|
230
|
-
if (errorData.error?.message) {
|
|
231
|
-
errorMessage = errorData.error.message;
|
|
232
|
-
} else if (errorData.message) {
|
|
233
|
-
errorMessage = errorData.message;
|
|
234
|
-
}
|
|
235
|
-
} catch {
|
|
236
|
-
// If we can't parse the error, use a generic message with status code
|
|
237
|
-
errorMessage = `Upload failed with status ${response.status}`;
|
|
238
|
-
}
|
|
239
|
-
// Mark all files as failed in the UI
|
|
240
|
-
dispatch(setUploadFailed({
|
|
241
|
-
message: errorMessage
|
|
242
|
-
}));
|
|
243
|
-
return {
|
|
244
|
-
error: {
|
|
245
|
-
name: 'UnknownError',
|
|
246
|
-
message: errorMessage,
|
|
247
|
-
status: response.status
|
|
248
|
-
}
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
const streamResult = await processSSEStream({
|
|
252
|
-
response,
|
|
253
|
-
dispatch
|
|
254
|
-
});
|
|
255
|
-
unregisterAbortController(uploadId);
|
|
256
|
-
if (streamResult && streamResult.data.length > 0) {
|
|
257
|
-
return {
|
|
258
|
-
data: streamResult
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
// If stream ended without completing any files, mark all as failed
|
|
262
|
-
const errorMessage = 'No files were uploaded successfully';
|
|
263
|
-
dispatch(setUploadFailed({
|
|
264
|
-
message: errorMessage
|
|
265
|
-
}));
|
|
266
|
-
return {
|
|
267
|
-
error: {
|
|
268
|
-
name: 'UnknownError',
|
|
269
|
-
message: errorMessage
|
|
270
|
-
}
|
|
271
|
-
};
|
|
272
|
-
} catch (err) {
|
|
273
|
-
unregisterAbortController(uploadId);
|
|
274
|
-
if (err instanceof DOMException && err.name === 'AbortError') {
|
|
275
|
-
// Don't mark as failed for user-initiated cancellations
|
|
276
|
-
return {
|
|
277
|
-
error: {
|
|
278
|
-
name: 'UnknownError',
|
|
279
|
-
message: 'Upload cancelled'
|
|
280
|
-
}
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
// For network errors or other exceptions, mark all files as failed
|
|
284
|
-
const errorMessage = err instanceof Error ? err.message : 'Network error occurred';
|
|
285
|
-
dispatch(setUploadFailed({
|
|
286
|
-
message: errorMessage
|
|
287
|
-
}));
|
|
288
|
-
return {
|
|
289
|
-
error: {
|
|
290
|
-
name: 'UnknownError',
|
|
291
|
-
message: errorMessage
|
|
292
|
-
}
|
|
293
|
-
};
|
|
294
|
-
}
|
|
325
|
+
return performStreamUpload({
|
|
326
|
+
token,
|
|
327
|
+
formData,
|
|
328
|
+
abortController,
|
|
329
|
+
uploadId,
|
|
330
|
+
dispatch
|
|
331
|
+
});
|
|
295
332
|
},
|
|
296
333
|
invalidatesTags: [
|
|
297
334
|
{
|
|
@@ -347,15 +384,63 @@ const uploadApi = adminApi.enhanceEndpoints({
|
|
|
347
384
|
// Create abort controller for this retry
|
|
348
385
|
const abortController = new AbortController();
|
|
349
386
|
registerAbortController(uploadId, abortController);
|
|
387
|
+
// Custom error handler: mark individual retried files as failed
|
|
388
|
+
const onUploadFailed = (message)=>{
|
|
389
|
+
for (const originalIndex of indexMapping){
|
|
390
|
+
dispatch(setFileError({
|
|
391
|
+
index: originalIndex,
|
|
392
|
+
name: stateFiles[originalIndex].name,
|
|
393
|
+
message
|
|
394
|
+
}));
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
return performStreamUpload({
|
|
398
|
+
token,
|
|
399
|
+
formData,
|
|
400
|
+
abortController,
|
|
401
|
+
uploadId,
|
|
402
|
+
dispatch,
|
|
403
|
+
indexMapper: (serverIndex)=>indexMapping[serverIndex],
|
|
404
|
+
onUploadFailed
|
|
405
|
+
});
|
|
406
|
+
},
|
|
407
|
+
invalidatesTags: [
|
|
408
|
+
{
|
|
409
|
+
type: 'Asset',
|
|
410
|
+
id: 'LIST'
|
|
411
|
+
}
|
|
412
|
+
]
|
|
413
|
+
}),
|
|
414
|
+
/**
|
|
415
|
+
* Upload files from URLs.
|
|
416
|
+
* Sends URLs to the server which fetches and uploads them.
|
|
417
|
+
*/ uploadFromUrls: builder.mutation({
|
|
418
|
+
queryFn: async ({ urls, folderId }, { dispatch, getState })=>{
|
|
419
|
+
const token = getState().admin_app?.token;
|
|
420
|
+
// Extract filenames from URLs for the progress dialog
|
|
421
|
+
const fileNames = urls.map((url)=>getFilenameFromUrl(url));
|
|
422
|
+
// Open progress dialog with all URLs as pending files
|
|
423
|
+
dispatch(openUploadProgress({
|
|
424
|
+
totalFiles: urls.length,
|
|
425
|
+
fileNames
|
|
426
|
+
}));
|
|
427
|
+
dispatch(updateProgress(0));
|
|
428
|
+
// Get the uploadId from state after dispatching
|
|
429
|
+
const uploadId = getState().uploadProgress.uploadId;
|
|
430
|
+
// Create abort controller for this upload
|
|
431
|
+
const abortController = new AbortController();
|
|
432
|
+
registerAbortController(uploadId, abortController);
|
|
350
433
|
try {
|
|
351
|
-
|
|
434
|
+
// Send URLs to server for fetching and uploading
|
|
435
|
+
const response = await fetchUrlUploadStream({
|
|
352
436
|
token,
|
|
353
|
-
|
|
437
|
+
urls,
|
|
438
|
+
folderId,
|
|
354
439
|
signal: abortController.signal
|
|
355
440
|
});
|
|
356
441
|
if (!response.ok || !response.body) {
|
|
357
442
|
unregisterAbortController(uploadId);
|
|
358
|
-
let errorMessage = '
|
|
443
|
+
let errorMessage = 'Upload request failed';
|
|
359
444
|
try {
|
|
360
445
|
const errorData = await response.json();
|
|
361
446
|
if (errorData.error?.message) {
|
|
@@ -364,16 +449,11 @@ const uploadApi = adminApi.enhanceEndpoints({
|
|
|
364
449
|
errorMessage = errorData.message;
|
|
365
450
|
}
|
|
366
451
|
} catch {
|
|
367
|
-
errorMessage = `
|
|
368
|
-
}
|
|
369
|
-
// Mark retried files as failed
|
|
370
|
-
for (const originalIndex of indexMapping){
|
|
371
|
-
dispatch(setFileError({
|
|
372
|
-
index: originalIndex,
|
|
373
|
-
name: stateFiles[originalIndex].name,
|
|
374
|
-
message: errorMessage
|
|
375
|
-
}));
|
|
452
|
+
errorMessage = `Upload failed with status ${response.status}`;
|
|
376
453
|
}
|
|
454
|
+
dispatch(setUploadFailed({
|
|
455
|
+
message: errorMessage
|
|
456
|
+
}));
|
|
377
457
|
return {
|
|
378
458
|
error: {
|
|
379
459
|
name: 'UnknownError',
|
|
@@ -382,10 +462,10 @@ const uploadApi = adminApi.enhanceEndpoints({
|
|
|
382
462
|
}
|
|
383
463
|
};
|
|
384
464
|
}
|
|
465
|
+
// Process SSE stream from server
|
|
385
466
|
const streamResult = await processSSEStream({
|
|
386
467
|
response,
|
|
387
|
-
dispatch
|
|
388
|
-
indexMapper: (serverIndex)=>indexMapping[serverIndex]
|
|
468
|
+
dispatch
|
|
389
469
|
});
|
|
390
470
|
unregisterAbortController(uploadId);
|
|
391
471
|
if (streamResult && streamResult.data.length > 0) {
|
|
@@ -394,9 +474,9 @@ const uploadApi = adminApi.enhanceEndpoints({
|
|
|
394
474
|
};
|
|
395
475
|
}
|
|
396
476
|
return {
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
477
|
+
data: {
|
|
478
|
+
data: [],
|
|
479
|
+
errors: []
|
|
400
480
|
}
|
|
401
481
|
};
|
|
402
482
|
} catch (err) {
|
|
@@ -405,11 +485,14 @@ const uploadApi = adminApi.enhanceEndpoints({
|
|
|
405
485
|
return {
|
|
406
486
|
error: {
|
|
407
487
|
name: 'UnknownError',
|
|
408
|
-
message: '
|
|
488
|
+
message: 'Upload cancelled'
|
|
409
489
|
}
|
|
410
490
|
};
|
|
411
491
|
}
|
|
412
492
|
const errorMessage = err instanceof Error ? err.message : 'Network error occurred';
|
|
493
|
+
dispatch(setUploadFailed({
|
|
494
|
+
message: errorMessage
|
|
495
|
+
}));
|
|
413
496
|
return {
|
|
414
497
|
error: {
|
|
415
498
|
name: 'UnknownError',
|
|
@@ -427,7 +510,7 @@ const uploadApi = adminApi.enhanceEndpoints({
|
|
|
427
510
|
})
|
|
428
511
|
})
|
|
429
512
|
});
|
|
430
|
-
const { useUploadFilesStreamMutation, useRetryCancelledFilesStreamMutation } = uploadApi;
|
|
513
|
+
const { useUploadFilesStreamMutation, useRetryCancelledFilesStreamMutation, useUploadFromUrlsMutation } = uploadApi;
|
|
431
514
|
|
|
432
|
-
export { abortUpload, uploadApi, useRetryCancelledFilesStreamMutation, useUploadFilesStreamMutation };
|
|
515
|
+
export { abortUpload, uploadApi, useRetryCancelledFilesStreamMutation, useUploadFilesStreamMutation, useUploadFromUrlsMutation };
|
|
433
516
|
//# sourceMappingURL=api.mjs.map
|