@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sources":["../../../server/src/services/upload.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\nimport { extension } from 'mime-types';\nimport {\n async,\n sanitize,\n contentTypes as contentTypesUtils,\n errors,\n file as fileUtils,\n pagination as paginationUtils,\n} from '@strapi/utils';\nimport { has, toNumber, isNil } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants';\nimport { getService } from '../utils';\n\nimport type { Config, File, InputFile, UploadableFile, FileInfo } from '../types';\nimport type { ViewConfiguration } from '../controllers/validation/admin/configureView';\nimport type { Settings } from '../controllers/validation/admin/settings';\n\ntype User = {\n id: string | number;\n};\n\ntype ID = string | number;\n\ntype CommonOptions = {\n user?: User;\n};\n\ntype Metas = {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n};\n\nconst { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;\nconst { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { ApplicationError, NotFoundError } = errors;\nconst { bytesToKbytes } = fileUtils;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const fileService = getService('file');\n\n const sendMediaMetrics = async (data: Pick<File, 'caption' | 'alternativeText'>) => {\n if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {\n await getService('metrics').trackUsage('didSaveMediaWithCaption');\n }\n\n if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {\n await getService('metrics').trackUsage('didSaveMediaWithAlternativeText');\n }\n };\n\n const createAndAssignTmpWorkingDirectoryToFiles = async (\n files: InputFile | InputFile[]\n ): Promise<string> => {\n const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));\n\n if (Array.isArray(files)) {\n files.forEach((file) => {\n file.tmpWorkingDirectory = tmpWorkingDirectory;\n });\n } else {\n files.tmpWorkingDirectory = tmpWorkingDirectory;\n }\n\n return tmpWorkingDirectory;\n };\n\n function filenameReservedRegex() {\n // eslint-disable-next-line no-control-regex\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g;\n }\n\n function windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n }\n\n /**\n * Copied from https://github.com/sindresorhus/valid-filename package\n */\n function isValidFilename(string: string) {\n if (!string || string.length > 255) {\n return false;\n }\n if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {\n return false;\n }\n if (string === '.' || string === '..') {\n return false;\n }\n return true;\n }\n\n async function emitEvent(event: string, data: Record<string, any>) {\n const modelDef = strapi.getModel(FILE_MODEL_UID);\n const sanitizedData = await sanitize.sanitizers.defaultSanitizeOutput(\n {\n schema: modelDef,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n },\n data\n );\n\n strapi.eventHub.emit(event, { media: sanitizedData });\n }\n\n async function formatFileInfo(\n { filename, type, size }: { filename: string; type: string; size: number },\n fileInfo: Partial<FileInfo> = {},\n metas: {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n } = {}\n ): Promise<Omit<UploadableFile, 'getStream'>> {\n const fileService = getService('file');\n const imageManipulationService = getService('image-manipulation');\n\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n let ext = path.extname(filename);\n if (!ext) {\n ext = `.${extension(type)}`;\n }\n const usedName = (fileInfo.name || filename).normalize();\n const basename = path.basename(usedName, ext);\n\n // Prevent null characters in file name\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n const entity: Omit<UploadableFile, 'getStream'> = {\n name: usedName,\n alternativeText: fileInfo.alternativeText,\n caption: fileInfo.caption,\n focalPoint: fileInfo.focalPoint,\n folder: fileInfo.folder,\n folderPath: await fileService.getFolderPath(fileInfo.folder),\n hash: imageManipulationService.generateFileName(basename),\n ext,\n mime: type,\n size: bytesToKbytes(size),\n sizeInBytes: size,\n };\n\n const { refId, ref, field } = metas;\n\n if (refId && ref && field) {\n entity.related = [\n {\n id: refId,\n __type: ref,\n __pivot: { field },\n },\n ];\n }\n\n if (metas.path) {\n entity.path = metas.path;\n }\n\n if (metas.tmpWorkingDirectory) {\n entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;\n }\n\n return entity;\n }\n\n async function enhanceAndValidateFile(\n file: InputFile,\n fileInfo: FileInfo,\n metas?: Metas\n ): Promise<UploadableFile> {\n // Prefer detected MIME type from security validation. Treat application/octet-stream as\n // undeclared so we use detected type when the client sends no real Content-Type.\n const detected = (file as any).detectedMimeType;\n const declared = file.mimetype || '';\n const mimeType =\n detected ||\n (declared && declared !== 'application/octet-stream' ? declared : undefined) ||\n 'application/octet-stream';\n\n const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: mimeType,\n size: file.size,\n },\n fileInfo,\n {\n ...metas,\n tmpWorkingDirectory: file.tmpWorkingDirectory,\n }\n )) as UploadableFile;\n\n currentFile.filepath = file.filepath;\n currentFile.getStream = () => fs.createReadStream(file.filepath);\n\n const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi\n .plugin('upload')\n .service('image-manipulation');\n\n if (await isImage(currentFile)) {\n if (await isFaultyImage(currentFile)) {\n throw new ApplicationError('File is not a valid image');\n }\n if (await isOptimizableImage(currentFile)) {\n return optimize(currentFile);\n }\n }\n\n return currentFile;\n }\n\n async function upload(\n {\n data,\n files,\n }: {\n data: Record<string, unknown>;\n files: InputFile[];\n },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);\n\n const uploadedFiles = [];\n try {\n const { fileInfo, ...metas } = data;\n\n const fileArray = Array.isArray(files) ? files : [files];\n const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [fileInfo];\n\n const doUpload = async (file: InputFile, fileInfo: FileInfo) => {\n const fileData = await enhanceAndValidateFile(file, fileInfo, metas);\n return uploadFileAndPersist(fileData, { user });\n };\n\n const concurrentUploadSize = Math.max(\n 1,\n strapi.config.get<Config>('plugin::upload').concurrentUploadSize ?? 1\n );\n\n const fileBatches = _.chunk(\n fileArray.map((file, idx) => ({ file, fileInfo: fileInfoArray[idx] || {} })),\n concurrentUploadSize\n );\n\n for (const batch of fileBatches) {\n const results = await Promise.all(\n batch.map(({ file, fileInfo }) => doUpload(file, fileInfo))\n );\n uploadedFiles.push(...results);\n }\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return uploadedFiles;\n }\n\n /**\n * When uploading an image, an additional thumbnail is generated.\n * Also, if there are responsive formats defined, another set of images will be generated too.\n *\n * @param {*} fileData\n */\n async function uploadImage(fileData: UploadableFile) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n // Store width and height of the original image\n const { width, height } = await getDimensions(fileData);\n\n // Make sure this is assigned before calling any upload\n // That way it can mutate the width and height\n _.assign(fileData, {\n width,\n height,\n });\n\n // For performance reasons, all uploads are wrapped in a single Promise.all\n const uploadThumbnail = async (thumbnailFile: UploadableFile) => {\n await getService('provider').upload(thumbnailFile);\n _.set(fileData, 'formats.thumbnail', thumbnailFile);\n };\n\n // Generate thumbnail and responsive formats\n const uploadResponsiveFormat = async (format: { key: string; file: UploadableFile }) => {\n const { key, file } = format;\n await getService('provider').upload(file);\n _.set(fileData, ['formats', key], file);\n };\n\n const uploadPromises: Promise<void>[] = [];\n\n // Upload image\n uploadPromises.push(getService('provider').upload(fileData));\n\n // Generate & Upload thumbnail and responsive formats\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n uploadPromises.push(uploadThumbnail(thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n uploadPromises.push(uploadResponsiveFormat(format));\n }\n }\n }\n // Wait for all uploads to finish\n await Promise.all(uploadPromises);\n }\n\n /**\n * Like uploadImage, but pairs the main file and each format with its old\n * counterpart and routes through provider.replace so providers that implement\n * an atomic replace can use it. Formats that no longer exist on the new image\n * are deleted; formats that didn't exist on the old image are uploaded fresh.\n */\n async function replaceImage(fileData: UploadableFile, oldFile: File) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n const { width, height } = await getDimensions(fileData);\n\n _.assign(fileData, {\n width,\n height,\n });\n\n const replaceFormat = async (key: string, newFormat: UploadableFile) => {\n const oldFormat = oldFile.formats?.[key] as File | undefined;\n if (oldFormat) {\n await getService('provider').replace(newFormat, oldFormat);\n } else {\n await getService('provider').upload(newFormat);\n }\n _.set(fileData, ['formats', key], newFormat);\n };\n\n const promises: Promise<unknown>[] = [];\n\n // Replace the main file\n promises.push(getService('provider').replace(fileData, oldFile));\n\n const newFormatKeys = new Set<string>();\n\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n newFormatKeys.add('thumbnail');\n promises.push(replaceFormat('thumbnail', thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n newFormatKeys.add(format.key);\n promises.push(replaceFormat(format.key, format.file));\n }\n }\n }\n\n // Delete any formats that existed on the old file but are not present on the new one\n if (\n oldFile.formats &&\n oldFile.provider === strapi.config.get<Config>('plugin::upload').provider\n ) {\n for (const oldKey of Object.keys(oldFile.formats)) {\n if (!newFormatKeys.has(oldKey)) {\n const oldFormat = oldFile.formats[oldKey] as File;\n promises.push(strapi.plugin('upload').provider.delete(oldFormat));\n }\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Upload a file. If it is an image it will generate a thumbnail\n * and responsive formats (if enabled).\n */\n async function uploadFileAndPersist(fileData: UploadableFile, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n const { isImage } = getService('image-manipulation');\n\n await getService('provider').checkFileSize(fileData);\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n\n // Persist file(s)\n return add(fileData, { user });\n }\n\n async function updateFileInfo(\n id: ID,\n { name, alternativeText, caption, focalPoint, folder }: FileInfo,\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const dbFile = await findOne(id);\n\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n const fileService = getService('file');\n\n const newName = _.isNil(name) ? dbFile.name : name;\n const newInfos = {\n name: newName,\n alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,\n caption: _.isNil(caption) ? dbFile.caption : caption,\n focalPoint: _.isNil(focalPoint) ? dbFile.focalPoint : focalPoint,\n folder: _.isUndefined(folder) ? dbFile.folder : folder,\n folderPath: _.isUndefined(folder)\n ? dbFile.folderPath\n : await fileService.getFolderPath(folder),\n };\n\n return update(id, newInfos, { user });\n }\n\n async function replace(\n id: ID,\n { data, file }: { data: { fileInfo: FileInfo }; file: InputFile },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n\n const { isImage } = getService('image-manipulation');\n\n const dbFile = await findOne(id);\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);\n\n let fileData: UploadableFile;\n\n try {\n const { fileInfo } = data;\n fileData = await enhanceAndValidateFile(file, fileInfo);\n\n // Replacing a file writes new bytes just like creating one, so it has to\n // respect sizeLimit too. Checked before any provider write, and measured on\n // the same post-optimization file as the create path (uploadFileAndPersist).\n await getService('provider').checkFileSize(fileData);\n\n // keep a constant hash and extension so the file url doesn't change when the file is replaced\n _.assign(fileData, {\n hash: dbFile.hash,\n ext: dbFile.ext,\n });\n\n // clear old formats — replaceImage / replace will set new ones\n _.set(fileData, 'formats', {});\n\n if (dbFile.provider === config.provider) {\n if (await isImage(fileData)) {\n await replaceImage(fileData, dbFile);\n } else {\n // The new file is not an image, so it has no formats. Replace the main\n // file, then delete any formats the old image left behind — otherwise\n // they're orphaned in storage since the DB record no longer tracks them.\n await getService('provider').replace(fileData, dbFile);\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) =>\n strapi.plugin('upload').provider.delete(dbFile.formats![key] as File)\n )\n );\n }\n }\n } else if (await isImage(fileData)) {\n // Cross-provider replacement: no delete on the old provider, upload to the new one.\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return update(id, fileData, { user });\n }\n\n async function update(id: ID, values: Partial<File>, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).update({ where: { id }, data: fileValues });\n\n await emitEvent(MEDIA_UPDATE, res);\n\n return res;\n }\n\n async function add(values: any, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n [CREATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).create({ data: fileValues });\n\n await emitEvent(MEDIA_CREATE, res);\n\n return res;\n }\n\n async function findOne(id: ID, populate = {}) {\n const query = strapi.get('query-params').transform(FILE_MODEL_UID, {\n populate,\n });\n\n const file = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id },\n ...query,\n });\n\n if (!file) return file;\n\n // Sign file URLs if using private provider\n return fileService.signFileUrls(file);\n }\n\n async function findMany(query: any = {}): Promise<File[]> {\n const files = await strapi.db\n .query(FILE_MODEL_UID)\n .findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n return async.map(files, (file: File) => fileService.signFileUrls(file));\n }\n\n async function findPage(query: any = {}) {\n const result = await strapi.db\n .query(FILE_MODEL_UID)\n .findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n const signedResults = await async.map(result.results, (file: File) =>\n fileService.signFileUrls(file)\n );\n\n return {\n ...result,\n results: signedResults,\n };\n }\n\n /**\n * Resolve whether the count query should run, mirroring core-api's `shouldCount`.\n * Defaults to the `api.rest.withCount` config (true) when not specified on the request.\n */\n function resolveWithCount(pagination: Record<string, unknown>): boolean {\n if (has('withCount', pagination)) {\n const withCount = pagination.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount as string | number)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount as string | number)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n }\n\n /**\n * REST-aware paginated find for the content API.\n *\n * Unlike `findPage` (used by the admin API), this honors the standard nested\n * `pagination` query object (`pagination[page]`, `pagination[pageSize]`,\n * `pagination[start]`, `pagination[limit]`, `pagination[withCount]`) and the\n * `api.rest.defaultLimit` / `api.rest.maxLimit` / `api.rest.withCount` config,\n * exactly like every other Strapi REST collection-type endpoint.\n */\n async function findAndCountPage(query: any = {}) {\n const { pagination = {} } = query;\n\n const defaultLimit = toNumber(strapi.config.get('api.rest.defaultLimit', 25));\n const maxLimit = toNumber(strapi.config.get('api.rest.maxLimit')) || null;\n\n // Whether the consumer used page-based pagination (default) vs offset-based.\n const isOffset = has('start', pagination) || has('limit', pagination);\n const isPaged = !isOffset;\n\n // Resolve start/limit applying defaults and the maxLimit cap.\n const { start, limit } = paginationUtils.withDefaultPagination(pagination, {\n defaults: { offset: { limit: defaultLimit }, page: { pageSize: defaultLimit } },\n maxLimit: maxLimit || -1,\n });\n\n // Feed the transform the resolved offset/limit so it ignores the nested\n // `pagination` object (which it cannot read) and applies real bounds.\n const transformed = strapi\n .get('query-params')\n .transform(FILE_MODEL_UID, { ...query, pagination: undefined, start, limit });\n\n const shouldCount = resolveWithCount(pagination);\n\n const [results, total] = await Promise.all([\n strapi.db.query(FILE_MODEL_UID).findMany(transformed),\n shouldCount ? strapi.db.query(FILE_MODEL_UID).count(transformed) : Promise.resolve(undefined),\n ]);\n\n const signedResults = await async.map(results, (file: File) => fileService.signFileUrls(file));\n\n const transform = isPaged\n ? paginationUtils.transformPagedPaginationInfo\n : paginationUtils.transformOffsetPaginationInfo;\n\n const paginationInfo = transform({ start, limit }, total as number);\n\n return {\n results: signedResults,\n // Omit total & pageCount when counting is disabled (withCount=false).\n pagination: isNil(total) ? _.omit(paginationInfo, ['total', 'pageCount']) : paginationInfo,\n };\n }\n\n async function remove(file: File) {\n const config = strapi.config.get<Config>('plugin::upload');\n\n // execute delete function of the provider\n if (file.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(file);\n\n if (file.formats) {\n const keys = Object.keys(file.formats);\n\n await Promise.all(\n keys.map((key) => {\n return strapi.plugin('upload').provider.delete(file.formats![key]);\n })\n );\n }\n }\n\n const media = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id: file.id },\n });\n\n await emitEvent(MEDIA_DELETE, media);\n\n return strapi.db.query(FILE_MODEL_UID).delete({ where: { id: file.id } });\n }\n\n async function getSettings() {\n const res = await strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).get({});\n\n return res as Settings | null;\n }\n\n async function setSettings(value: Settings) {\n if (value.responsiveDimensions === true) {\n await getService('metrics').trackUsage('didEnableResponsiveDimensions');\n } else {\n await getService('metrics').trackUsage('didDisableResponsiveDimensions');\n }\n\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).set({ value });\n }\n\n async function getConfiguration() {\n const res = await strapi.store!({\n type: 'plugin',\n name: 'upload',\n key: 'view_configuration',\n }).get({});\n\n return res as ViewConfiguration | null;\n }\n\n function setConfiguration(value: ViewConfiguration) {\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'view_configuration' }).set({\n value,\n });\n }\n\n return {\n formatFileInfo,\n upload,\n updateFileInfo,\n replace,\n findOne,\n findMany,\n findPage,\n findAndCountPage,\n remove,\n getSettings,\n setSettings,\n getConfiguration,\n setConfiguration,\n\n /**\n * exposed for testing only\n * @internal\n */\n _uploadImage: uploadImage,\n };\n};\n"],"names":["UPDATED_BY_ATTRIBUTE","CREATED_BY_ATTRIBUTE","contentTypesUtils","constants","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","ALLOWED_WEBHOOK_EVENTS","ApplicationError","NotFoundError","errors","bytesToKbytes","fileUtils","strapi","fileService","getService","sendMediaMetrics","data","_","has","isEmpty","caption","trackUsage","alternativeText","createAndAssignTmpWorkingDirectoryToFiles","files","tmpWorkingDirectory","fse","mkdtemp","path","join","os","tmpdir","Array","isArray","forEach","file","filenameReservedRegex","windowsReservedNameRegex","isValidFilename","string","length","test","emitEvent","event","modelDef","getModel","FILE_MODEL_UID","sanitizedData","sanitize","sanitizers","defaultSanitizeOutput","schema","uid","eventHub","emit","media","formatFileInfo","filename","type","size","fileInfo","metas","imageManipulationService","ext","extname","extension","usedName","name","normalize","basename","entity","focalPoint","folder","folderPath","getFolderPath","hash","generateFileName","mime","sizeInBytes","refId","ref","field","related","id","__type","__pivot","enhanceAndValidateFile","detected","detectedMimeType","declared","mimetype","mimeType","undefined","currentFile","originalFilename","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","concurrentUploadSize","Math","max","config","get","fileBatches","chunk","map","idx","batch","results","Promise","all","push","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","formats","replaceImage","oldFile","replaceFormat","newFormat","oldFormat","replace","promises","newFormatKeys","Set","add","provider","oldKey","Object","keys","delete","checkFileSize","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","resolveWithCount","pagination","withCount","includes","ValidationError","Boolean","findAndCountPage","defaultLimit","toNumber","maxLimit","isOffset","isPaged","start","limit","paginationUtils","withDefaultPagination","defaults","offset","page","pageSize","transformed","shouldCount","total","count","resolve","transformPagedPaginationInfo","transformOffsetPaginationInfo","paginationInfo","omit","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"upload.js","sources":["../../../server/src/services/upload.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\nimport { extension } from 'mime-types';\nimport {\n async,\n sanitize,\n contentTypes as contentTypesUtils,\n errors,\n file as fileUtils,\n pagination as paginationUtils,\n} from '@strapi/utils';\nimport { has, toNumber, isNil } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants';\nimport { getService } from '../utils';\n\nimport type { Config, File, InputFile, UploadableFile, FileInfo } from '../types';\nimport type { ViewConfiguration } from '../controllers/validation/admin/configureView';\nimport type { Settings } from '../controllers/validation/admin/settings';\n\ntype User = {\n id: string | number;\n};\n\ntype ID = string | number;\n\ntype CommonOptions = {\n user?: User;\n};\n\ntype Metas = {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n};\n\nconst { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;\nconst { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { ApplicationError, NotFoundError } = errors;\nconst { bytesToKbytes } = fileUtils;\n\n/**\n * Queue a provider operation for a later `Promise.all`, with a rejection handler\n * attached in the same turn so a fast failure is never an unhandled rejection.\n *\n * `Promise.resolve` first — a provider may hand back a plain value, which\n * `Promise.all` accepts but `.catch` would throw on.\n */\nconst queueConcurrentOperation = <T>(queue: Promise<T>[], operation: Promise<T>) => {\n Promise.resolve(operation).catch(() => undefined);\n queue.push(operation);\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const fileService = getService('file');\n\n const sendMediaMetrics = async (data: Pick<File, 'caption' | 'alternativeText'>) => {\n if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {\n await getService('metrics').trackUsage('didSaveMediaWithCaption');\n }\n\n if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {\n await getService('metrics').trackUsage('didSaveMediaWithAlternativeText');\n }\n };\n\n const createAndAssignTmpWorkingDirectoryToFiles = async (\n files: InputFile | InputFile[]\n ): Promise<string> => {\n const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));\n\n if (Array.isArray(files)) {\n files.forEach((file) => {\n file.tmpWorkingDirectory = tmpWorkingDirectory;\n });\n } else {\n files.tmpWorkingDirectory = tmpWorkingDirectory;\n }\n\n return tmpWorkingDirectory;\n };\n\n function filenameReservedRegex() {\n // eslint-disable-next-line no-control-regex\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g;\n }\n\n function windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n }\n\n /**\n * Copied from https://github.com/sindresorhus/valid-filename package\n */\n function isValidFilename(string: string) {\n if (!string || string.length > 255) {\n return false;\n }\n if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {\n return false;\n }\n if (string === '.' || string === '..') {\n return false;\n }\n return true;\n }\n\n async function emitEvent(event: string, data: Record<string, any>) {\n const modelDef = strapi.getModel(FILE_MODEL_UID);\n const sanitizedData = await sanitize.sanitizers.defaultSanitizeOutput(\n {\n schema: modelDef,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n },\n data\n );\n\n strapi.eventHub.emit(event, { media: sanitizedData });\n }\n\n async function formatFileInfo(\n { filename, type, size }: { filename: string; type: string; size: number },\n fileInfo: Partial<FileInfo> = {},\n metas: {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n } = {}\n ): Promise<Omit<UploadableFile, 'getStream'>> {\n const fileService = getService('file');\n const imageManipulationService = getService('image-manipulation');\n\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n let ext = path.extname(filename);\n if (!ext) {\n ext = `.${extension(type)}`;\n }\n const usedName = (fileInfo.name || filename).normalize();\n const basename = path.basename(usedName, ext);\n\n // Prevent null characters in file name\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n const entity: Omit<UploadableFile, 'getStream'> = {\n name: usedName,\n alternativeText: fileInfo.alternativeText,\n caption: fileInfo.caption,\n focalPoint: fileInfo.focalPoint,\n folder: fileInfo.folder,\n folderPath: await fileService.getFolderPath(fileInfo.folder),\n hash: imageManipulationService.generateFileName(basename),\n ext,\n mime: type,\n size: bytesToKbytes(size),\n sizeInBytes: size,\n };\n\n const { refId, ref, field } = metas;\n\n if (refId && ref && field) {\n entity.related = [\n {\n id: refId,\n __type: ref,\n __pivot: { field },\n },\n ];\n }\n\n if (metas.path) {\n entity.path = metas.path;\n }\n\n if (metas.tmpWorkingDirectory) {\n entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;\n }\n\n return entity;\n }\n\n async function enhanceAndValidateFile(\n file: InputFile,\n fileInfo: FileInfo,\n metas?: Metas\n ): Promise<UploadableFile> {\n // Prefer detected MIME type from security validation. Treat application/octet-stream as\n // undeclared so we use detected type when the client sends no real Content-Type.\n const detected = (file as any).detectedMimeType;\n const declared = file.mimetype || '';\n const mimeType =\n detected ||\n (declared && declared !== 'application/octet-stream' ? declared : undefined) ||\n 'application/octet-stream';\n\n const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: mimeType,\n size: file.size,\n },\n fileInfo,\n {\n ...metas,\n tmpWorkingDirectory: file.tmpWorkingDirectory,\n }\n )) as UploadableFile;\n\n currentFile.filepath = file.filepath;\n currentFile.getStream = () => fs.createReadStream(file.filepath);\n\n const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi\n .plugin('upload')\n .service('image-manipulation');\n\n if (await isImage(currentFile)) {\n if (await isFaultyImage(currentFile)) {\n throw new ApplicationError('File is not a valid image');\n }\n if (await isOptimizableImage(currentFile)) {\n return optimize(currentFile);\n }\n }\n\n return currentFile;\n }\n\n async function upload(\n {\n data,\n files,\n }: {\n data: Record<string, unknown>;\n files: InputFile[];\n },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);\n\n const uploadedFiles = [];\n try {\n const { fileInfo, ...metas } = data;\n\n const fileArray = Array.isArray(files) ? files : [files];\n const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [fileInfo];\n\n const doUpload = async (file: InputFile, fileInfo: FileInfo) => {\n const fileData = await enhanceAndValidateFile(file, fileInfo, metas);\n return uploadFileAndPersist(fileData, { user });\n };\n\n const concurrentUploadSize = Math.max(\n 1,\n strapi.config.get<Config>('plugin::upload').concurrentUploadSize ?? 1\n );\n\n const fileBatches = _.chunk(\n fileArray.map((file, idx) => ({ file, fileInfo: fileInfoArray[idx] || {} })),\n concurrentUploadSize\n );\n\n for (const batch of fileBatches) {\n const results = await Promise.all(\n batch.map(({ file, fileInfo }) => doUpload(file, fileInfo))\n );\n uploadedFiles.push(...results);\n }\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return uploadedFiles;\n }\n\n /**\n * When uploading an image, an additional thumbnail is generated.\n * Also, if there are responsive formats defined, another set of images will be generated too.\n *\n * @param {*} fileData\n */\n async function uploadImage(fileData: UploadableFile) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n // Store width and height of the original image\n const { width, height } = await getDimensions(fileData);\n\n // Make sure this is assigned before calling any upload\n // That way it can mutate the width and height\n _.assign(fileData, {\n width,\n height,\n });\n\n // For performance reasons, all uploads are wrapped in a single Promise.all\n const uploadThumbnail = async (thumbnailFile: UploadableFile) => {\n await getService('provider').upload(thumbnailFile);\n _.set(fileData, 'formats.thumbnail', thumbnailFile);\n };\n\n // Generate thumbnail and responsive formats\n const uploadResponsiveFormat = async (format: { key: string; file: UploadableFile }) => {\n const { key, file } = format;\n await getService('provider').upload(file);\n _.set(fileData, ['formats', key], file);\n };\n\n const uploadPromises: Promise<void>[] = [];\n\n // Upload image\n queueConcurrentOperation(uploadPromises, getService('provider').upload(fileData));\n\n // Generate & Upload thumbnail and responsive formats\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n queueConcurrentOperation(uploadPromises, uploadThumbnail(thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n queueConcurrentOperation(uploadPromises, uploadResponsiveFormat(format));\n }\n }\n }\n // Wait for all uploads to finish\n await Promise.all(uploadPromises);\n }\n\n /**\n * Like uploadImage, but pairs the main file and each format with its old\n * counterpart and routes through provider.replace so providers that implement\n * an atomic replace can use it. Formats that no longer exist on the new image\n * are deleted; formats that didn't exist on the old image are uploaded fresh.\n */\n async function replaceImage(fileData: UploadableFile, oldFile: File) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n const { width, height } = await getDimensions(fileData);\n\n _.assign(fileData, {\n width,\n height,\n });\n\n const replaceFormat = async (key: string, newFormat: UploadableFile) => {\n const oldFormat = oldFile.formats?.[key] as File | undefined;\n if (oldFormat) {\n await getService('provider').replace(newFormat, oldFormat);\n } else {\n await getService('provider').upload(newFormat);\n }\n _.set(fileData, ['formats', key], newFormat);\n };\n\n const promises: Promise<unknown>[] = [];\n\n // Replace the main file\n queueConcurrentOperation(promises, getService('provider').replace(fileData, oldFile));\n\n const newFormatKeys = new Set<string>();\n\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n newFormatKeys.add('thumbnail');\n queueConcurrentOperation(promises, replaceFormat('thumbnail', thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n newFormatKeys.add(format.key);\n queueConcurrentOperation(promises, replaceFormat(format.key, format.file));\n }\n }\n }\n\n // Delete any formats that existed on the old file but are not present on the new one\n if (\n oldFile.formats &&\n oldFile.provider === strapi.config.get<Config>('plugin::upload').provider\n ) {\n for (const oldKey of Object.keys(oldFile.formats)) {\n if (!newFormatKeys.has(oldKey)) {\n const oldFormat = oldFile.formats[oldKey] as File;\n queueConcurrentOperation(promises, strapi.plugin('upload').provider.delete(oldFormat));\n }\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Upload a file. If it is an image it will generate a thumbnail\n * and responsive formats (if enabled).\n */\n async function uploadFileAndPersist(fileData: UploadableFile, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n const { isImage } = getService('image-manipulation');\n\n await getService('provider').checkFileSize(fileData);\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n\n // Persist file(s)\n return add(fileData, { user });\n }\n\n async function updateFileInfo(\n id: ID,\n { name, alternativeText, caption, focalPoint, folder }: FileInfo,\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const dbFile = await findOne(id);\n\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n const fileService = getService('file');\n\n const newName = _.isNil(name) ? dbFile.name : name;\n const newInfos = {\n name: newName,\n alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,\n caption: _.isNil(caption) ? dbFile.caption : caption,\n focalPoint: _.isNil(focalPoint) ? dbFile.focalPoint : focalPoint,\n folder: _.isUndefined(folder) ? dbFile.folder : folder,\n folderPath: _.isUndefined(folder)\n ? dbFile.folderPath\n : await fileService.getFolderPath(folder),\n };\n\n return update(id, newInfos, { user });\n }\n\n async function replace(\n id: ID,\n { data, file }: { data: { fileInfo: FileInfo }; file: InputFile },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n\n const { isImage } = getService('image-manipulation');\n\n const dbFile = await findOne(id);\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);\n\n let fileData: UploadableFile;\n\n try {\n const { fileInfo } = data;\n fileData = await enhanceAndValidateFile(file, fileInfo);\n\n // Replacing a file writes new bytes just like creating one, so it has to\n // respect sizeLimit too. Checked before any provider write, and measured on\n // the same post-optimization file as the create path (uploadFileAndPersist).\n await getService('provider').checkFileSize(fileData);\n\n // keep a constant hash and extension so the file url doesn't change when the file is replaced\n _.assign(fileData, {\n hash: dbFile.hash,\n ext: dbFile.ext,\n });\n\n // clear old formats — replaceImage / replace will set new ones\n _.set(fileData, 'formats', {});\n\n if (dbFile.provider === config.provider) {\n if (await isImage(fileData)) {\n await replaceImage(fileData, dbFile);\n } else {\n // The new file is not an image, so it has no formats. Replace the main\n // file, then delete any formats the old image left behind — otherwise\n // they're orphaned in storage since the DB record no longer tracks them.\n await getService('provider').replace(fileData, dbFile);\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) =>\n strapi.plugin('upload').provider.delete(dbFile.formats![key] as File)\n )\n );\n }\n }\n } else if (await isImage(fileData)) {\n // Cross-provider replacement: no delete on the old provider, upload to the new one.\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return update(id, fileData, { user });\n }\n\n async function update(id: ID, values: Partial<File>, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).update({ where: { id }, data: fileValues });\n\n await emitEvent(MEDIA_UPDATE, res);\n\n return res;\n }\n\n async function add(values: any, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n [CREATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).create({ data: fileValues });\n\n await emitEvent(MEDIA_CREATE, res);\n\n return res;\n }\n\n async function findOne(id: ID, populate = {}) {\n const query = strapi.get('query-params').transform(FILE_MODEL_UID, {\n populate,\n });\n\n const file = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id },\n ...query,\n });\n\n if (!file) return file;\n\n // Sign file URLs if using private provider\n return fileService.signFileUrls(file);\n }\n\n async function findMany(query: any = {}): Promise<File[]> {\n const files = await strapi.db\n .query(FILE_MODEL_UID)\n .findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n return async.map(files, (file: File) => fileService.signFileUrls(file));\n }\n\n async function findPage(query: any = {}) {\n const result = await strapi.db\n .query(FILE_MODEL_UID)\n .findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n const signedResults = await async.map(result.results, (file: File) =>\n fileService.signFileUrls(file)\n );\n\n return {\n ...result,\n results: signedResults,\n };\n }\n\n /**\n * Resolve whether the count query should run, mirroring core-api's `shouldCount`.\n * Defaults to the `api.rest.withCount` config (true) when not specified on the request.\n */\n function resolveWithCount(pagination: Record<string, unknown>): boolean {\n if (has('withCount', pagination)) {\n const withCount = pagination.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount as string | number)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount as string | number)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n }\n\n /**\n * REST-aware paginated find for the content API.\n *\n * Unlike `findPage` (used by the admin API), this honors the standard nested\n * `pagination` query object (`pagination[page]`, `pagination[pageSize]`,\n * `pagination[start]`, `pagination[limit]`, `pagination[withCount]`) and the\n * `api.rest.defaultLimit` / `api.rest.maxLimit` / `api.rest.withCount` config,\n * exactly like every other Strapi REST collection-type endpoint.\n */\n async function findAndCountPage(query: any = {}) {\n const { pagination = {} } = query;\n\n const defaultLimit = toNumber(strapi.config.get('api.rest.defaultLimit', 25));\n const maxLimit = toNumber(strapi.config.get('api.rest.maxLimit')) || null;\n\n // Whether the consumer used page-based pagination (default) vs offset-based.\n const isOffset = has('start', pagination) || has('limit', pagination);\n const isPaged = !isOffset;\n\n // Resolve start/limit applying defaults and the maxLimit cap.\n const { start, limit } = paginationUtils.withDefaultPagination(pagination, {\n defaults: { offset: { limit: defaultLimit }, page: { pageSize: defaultLimit } },\n maxLimit: maxLimit || -1,\n });\n\n // Feed the transform the resolved offset/limit so it ignores the nested\n // `pagination` object (which it cannot read) and applies real bounds.\n const transformed = strapi\n .get('query-params')\n .transform(FILE_MODEL_UID, { ...query, pagination: undefined, start, limit });\n\n const shouldCount = resolveWithCount(pagination);\n\n const [results, total] = await Promise.all([\n strapi.db.query(FILE_MODEL_UID).findMany(transformed),\n shouldCount ? strapi.db.query(FILE_MODEL_UID).count(transformed) : Promise.resolve(undefined),\n ]);\n\n const signedResults = await async.map(results, (file: File) => fileService.signFileUrls(file));\n\n const transform = isPaged\n ? paginationUtils.transformPagedPaginationInfo\n : paginationUtils.transformOffsetPaginationInfo;\n\n const paginationInfo = transform({ start, limit }, total as number);\n\n return {\n results: signedResults,\n // Omit total & pageCount when counting is disabled (withCount=false).\n pagination: isNil(total) ? _.omit(paginationInfo, ['total', 'pageCount']) : paginationInfo,\n };\n }\n\n async function remove(file: File) {\n const config = strapi.config.get<Config>('plugin::upload');\n\n // execute delete function of the provider\n if (file.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(file);\n\n if (file.formats) {\n const keys = Object.keys(file.formats);\n\n await Promise.all(\n keys.map((key) => {\n return strapi.plugin('upload').provider.delete(file.formats![key]);\n })\n );\n }\n }\n\n const media = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id: file.id },\n });\n\n await emitEvent(MEDIA_DELETE, media);\n\n return strapi.db.query(FILE_MODEL_UID).delete({ where: { id: file.id } });\n }\n\n async function getSettings() {\n const res = await strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).get({});\n\n return res as Settings | null;\n }\n\n async function setSettings(value: Settings) {\n if (value.responsiveDimensions === true) {\n await getService('metrics').trackUsage('didEnableResponsiveDimensions');\n } else {\n await getService('metrics').trackUsage('didDisableResponsiveDimensions');\n }\n\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).set({ value });\n }\n\n async function getConfiguration() {\n const res = await strapi.store!({\n type: 'plugin',\n name: 'upload',\n key: 'view_configuration',\n }).get({});\n\n return res as ViewConfiguration | null;\n }\n\n function setConfiguration(value: ViewConfiguration) {\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'view_configuration' }).set({\n value,\n });\n }\n\n return {\n formatFileInfo,\n upload,\n updateFileInfo,\n replace,\n findOne,\n findMany,\n findPage,\n findAndCountPage,\n remove,\n getSettings,\n setSettings,\n getConfiguration,\n setConfiguration,\n\n /**\n * exposed for testing only\n * @internal\n */\n _uploadImage: uploadImage,\n _replaceImage: replaceImage,\n _queueConcurrentOperation: queueConcurrentOperation,\n };\n};\n"],"names":["UPDATED_BY_ATTRIBUTE","CREATED_BY_ATTRIBUTE","contentTypesUtils","constants","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","ALLOWED_WEBHOOK_EVENTS","ApplicationError","NotFoundError","errors","bytesToKbytes","fileUtils","queueConcurrentOperation","queue","operation","Promise","resolve","catch","undefined","push","strapi","fileService","getService","sendMediaMetrics","data","_","has","isEmpty","caption","trackUsage","alternativeText","createAndAssignTmpWorkingDirectoryToFiles","files","tmpWorkingDirectory","fse","mkdtemp","path","join","os","tmpdir","Array","isArray","forEach","file","filenameReservedRegex","windowsReservedNameRegex","isValidFilename","string","length","test","emitEvent","event","modelDef","getModel","FILE_MODEL_UID","sanitizedData","sanitize","sanitizers","defaultSanitizeOutput","schema","uid","eventHub","emit","media","formatFileInfo","filename","type","size","fileInfo","metas","imageManipulationService","ext","extname","extension","usedName","name","normalize","basename","entity","focalPoint","folder","folderPath","getFolderPath","hash","generateFileName","mime","sizeInBytes","refId","ref","field","related","id","__type","__pivot","enhanceAndValidateFile","detected","detectedMimeType","declared","mimetype","mimeType","currentFile","originalFilename","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","concurrentUploadSize","Math","max","config","get","fileBatches","chunk","map","idx","batch","results","all","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","formats","replaceImage","oldFile","replaceFormat","newFormat","oldFormat","replace","promises","newFormatKeys","Set","add","provider","oldKey","Object","keys","delete","checkFileSize","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","resolveWithCount","pagination","withCount","includes","ValidationError","Boolean","findAndCountPage","defaultLimit","toNumber","maxLimit","isOffset","isPaged","start","limit","paginationUtils","withDefaultPagination","defaults","offset","page","pageSize","transformed","shouldCount","total","count","transformPagedPaginationInfo","transformOffsetPaginationInfo","paginationInfo","omit","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage","_replaceImage","_queueConcurrentOperation"],"mappings":"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"}
|
|
@@ -13,6 +13,16 @@ const { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypes.constants;
|
|
|
13
13
|
const { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;
|
|
14
14
|
const { ApplicationError, NotFoundError } = errors;
|
|
15
15
|
const { bytesToKbytes } = file;
|
|
16
|
+
/**
|
|
17
|
+
* Queue a provider operation for a later `Promise.all`, with a rejection handler
|
|
18
|
+
* attached in the same turn so a fast failure is never an unhandled rejection.
|
|
19
|
+
*
|
|
20
|
+
* `Promise.resolve` first — a provider may hand back a plain value, which
|
|
21
|
+
* `Promise.all` accepts but `.catch` would throw on.
|
|
22
|
+
*/ const queueConcurrentOperation = (queue, operation)=>{
|
|
23
|
+
Promise.resolve(operation).catch(()=>undefined);
|
|
24
|
+
queue.push(operation);
|
|
25
|
+
};
|
|
16
26
|
var upload = (({ strapi })=>{
|
|
17
27
|
const fileService = getService('file');
|
|
18
28
|
const sendMediaMetrics = async (data)=>{
|
|
@@ -208,19 +218,19 @@ var upload = (({ strapi })=>{
|
|
|
208
218
|
};
|
|
209
219
|
const uploadPromises = [];
|
|
210
220
|
// Upload image
|
|
211
|
-
uploadPromises
|
|
221
|
+
queueConcurrentOperation(uploadPromises, getService('provider').upload(fileData));
|
|
212
222
|
// Generate & Upload thumbnail and responsive formats
|
|
213
223
|
if (await isResizableImage(fileData)) {
|
|
214
224
|
const thumbnailFile = await generateThumbnail(fileData);
|
|
215
225
|
if (thumbnailFile) {
|
|
216
|
-
uploadPromises
|
|
226
|
+
queueConcurrentOperation(uploadPromises, uploadThumbnail(thumbnailFile));
|
|
217
227
|
}
|
|
218
228
|
const formats = await generateResponsiveFormats(fileData);
|
|
219
229
|
if (Array.isArray(formats) && formats.length > 0) {
|
|
220
230
|
for (const format of formats){
|
|
221
231
|
// eslint-disable-next-line no-continue
|
|
222
232
|
if (!format) continue;
|
|
223
|
-
uploadPromises
|
|
233
|
+
queueConcurrentOperation(uploadPromises, uploadResponsiveFormat(format));
|
|
224
234
|
}
|
|
225
235
|
}
|
|
226
236
|
}
|
|
@@ -253,13 +263,13 @@ var upload = (({ strapi })=>{
|
|
|
253
263
|
};
|
|
254
264
|
const promises = [];
|
|
255
265
|
// Replace the main file
|
|
256
|
-
promises
|
|
266
|
+
queueConcurrentOperation(promises, getService('provider').replace(fileData, oldFile));
|
|
257
267
|
const newFormatKeys = new Set();
|
|
258
268
|
if (await isResizableImage(fileData)) {
|
|
259
269
|
const thumbnailFile = await generateThumbnail(fileData);
|
|
260
270
|
if (thumbnailFile) {
|
|
261
271
|
newFormatKeys.add('thumbnail');
|
|
262
|
-
promises
|
|
272
|
+
queueConcurrentOperation(promises, replaceFormat('thumbnail', thumbnailFile));
|
|
263
273
|
}
|
|
264
274
|
const formats = await generateResponsiveFormats(fileData);
|
|
265
275
|
if (Array.isArray(formats) && formats.length > 0) {
|
|
@@ -267,7 +277,7 @@ var upload = (({ strapi })=>{
|
|
|
267
277
|
// eslint-disable-next-line no-continue
|
|
268
278
|
if (!format) continue;
|
|
269
279
|
newFormatKeys.add(format.key);
|
|
270
|
-
promises
|
|
280
|
+
queueConcurrentOperation(promises, replaceFormat(format.key, format.file));
|
|
271
281
|
}
|
|
272
282
|
}
|
|
273
283
|
}
|
|
@@ -276,7 +286,7 @@ var upload = (({ strapi })=>{
|
|
|
276
286
|
for (const oldKey of Object.keys(oldFile.formats)){
|
|
277
287
|
if (!newFormatKeys.has(oldKey)) {
|
|
278
288
|
const oldFormat = oldFile.formats[oldKey];
|
|
279
|
-
promises
|
|
289
|
+
queueConcurrentOperation(promises, strapi.plugin('upload').provider.delete(oldFormat));
|
|
280
290
|
}
|
|
281
291
|
}
|
|
282
292
|
}
|
|
@@ -606,7 +616,9 @@ var upload = (({ strapi })=>{
|
|
|
606
616
|
/**
|
|
607
617
|
* exposed for testing only
|
|
608
618
|
* @internal
|
|
609
|
-
*/ _uploadImage: uploadImage
|
|
619
|
+
*/ _uploadImage: uploadImage,
|
|
620
|
+
_replaceImage: replaceImage,
|
|
621
|
+
_queueConcurrentOperation: queueConcurrentOperation
|
|
610
622
|
};
|
|
611
623
|
});
|
|
612
624
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.mjs","sources":["../../../server/src/services/upload.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\nimport { extension } from 'mime-types';\nimport {\n async,\n sanitize,\n contentTypes as contentTypesUtils,\n errors,\n file as fileUtils,\n pagination as paginationUtils,\n} from '@strapi/utils';\nimport { has, toNumber, isNil } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants';\nimport { getService } from '../utils';\n\nimport type { Config, File, InputFile, UploadableFile, FileInfo } from '../types';\nimport type { ViewConfiguration } from '../controllers/validation/admin/configureView';\nimport type { Settings } from '../controllers/validation/admin/settings';\n\ntype User = {\n id: string | number;\n};\n\ntype ID = string | number;\n\ntype CommonOptions = {\n user?: User;\n};\n\ntype Metas = {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n};\n\nconst { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;\nconst { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { ApplicationError, NotFoundError } = errors;\nconst { bytesToKbytes } = fileUtils;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const fileService = getService('file');\n\n const sendMediaMetrics = async (data: Pick<File, 'caption' | 'alternativeText'>) => {\n if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {\n await getService('metrics').trackUsage('didSaveMediaWithCaption');\n }\n\n if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {\n await getService('metrics').trackUsage('didSaveMediaWithAlternativeText');\n }\n };\n\n const createAndAssignTmpWorkingDirectoryToFiles = async (\n files: InputFile | InputFile[]\n ): Promise<string> => {\n const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));\n\n if (Array.isArray(files)) {\n files.forEach((file) => {\n file.tmpWorkingDirectory = tmpWorkingDirectory;\n });\n } else {\n files.tmpWorkingDirectory = tmpWorkingDirectory;\n }\n\n return tmpWorkingDirectory;\n };\n\n function filenameReservedRegex() {\n // eslint-disable-next-line no-control-regex\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g;\n }\n\n function windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n }\n\n /**\n * Copied from https://github.com/sindresorhus/valid-filename package\n */\n function isValidFilename(string: string) {\n if (!string || string.length > 255) {\n return false;\n }\n if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {\n return false;\n }\n if (string === '.' || string === '..') {\n return false;\n }\n return true;\n }\n\n async function emitEvent(event: string, data: Record<string, any>) {\n const modelDef = strapi.getModel(FILE_MODEL_UID);\n const sanitizedData = await sanitize.sanitizers.defaultSanitizeOutput(\n {\n schema: modelDef,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n },\n data\n );\n\n strapi.eventHub.emit(event, { media: sanitizedData });\n }\n\n async function formatFileInfo(\n { filename, type, size }: { filename: string; type: string; size: number },\n fileInfo: Partial<FileInfo> = {},\n metas: {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n } = {}\n ): Promise<Omit<UploadableFile, 'getStream'>> {\n const fileService = getService('file');\n const imageManipulationService = getService('image-manipulation');\n\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n let ext = path.extname(filename);\n if (!ext) {\n ext = `.${extension(type)}`;\n }\n const usedName = (fileInfo.name || filename).normalize();\n const basename = path.basename(usedName, ext);\n\n // Prevent null characters in file name\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n const entity: Omit<UploadableFile, 'getStream'> = {\n name: usedName,\n alternativeText: fileInfo.alternativeText,\n caption: fileInfo.caption,\n focalPoint: fileInfo.focalPoint,\n folder: fileInfo.folder,\n folderPath: await fileService.getFolderPath(fileInfo.folder),\n hash: imageManipulationService.generateFileName(basename),\n ext,\n mime: type,\n size: bytesToKbytes(size),\n sizeInBytes: size,\n };\n\n const { refId, ref, field } = metas;\n\n if (refId && ref && field) {\n entity.related = [\n {\n id: refId,\n __type: ref,\n __pivot: { field },\n },\n ];\n }\n\n if (metas.path) {\n entity.path = metas.path;\n }\n\n if (metas.tmpWorkingDirectory) {\n entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;\n }\n\n return entity;\n }\n\n async function enhanceAndValidateFile(\n file: InputFile,\n fileInfo: FileInfo,\n metas?: Metas\n ): Promise<UploadableFile> {\n // Prefer detected MIME type from security validation. Treat application/octet-stream as\n // undeclared so we use detected type when the client sends no real Content-Type.\n const detected = (file as any).detectedMimeType;\n const declared = file.mimetype || '';\n const mimeType =\n detected ||\n (declared && declared !== 'application/octet-stream' ? declared : undefined) ||\n 'application/octet-stream';\n\n const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: mimeType,\n size: file.size,\n },\n fileInfo,\n {\n ...metas,\n tmpWorkingDirectory: file.tmpWorkingDirectory,\n }\n )) as UploadableFile;\n\n currentFile.filepath = file.filepath;\n currentFile.getStream = () => fs.createReadStream(file.filepath);\n\n const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi\n .plugin('upload')\n .service('image-manipulation');\n\n if (await isImage(currentFile)) {\n if (await isFaultyImage(currentFile)) {\n throw new ApplicationError('File is not a valid image');\n }\n if (await isOptimizableImage(currentFile)) {\n return optimize(currentFile);\n }\n }\n\n return currentFile;\n }\n\n async function upload(\n {\n data,\n files,\n }: {\n data: Record<string, unknown>;\n files: InputFile[];\n },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);\n\n const uploadedFiles = [];\n try {\n const { fileInfo, ...metas } = data;\n\n const fileArray = Array.isArray(files) ? files : [files];\n const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [fileInfo];\n\n const doUpload = async (file: InputFile, fileInfo: FileInfo) => {\n const fileData = await enhanceAndValidateFile(file, fileInfo, metas);\n return uploadFileAndPersist(fileData, { user });\n };\n\n const concurrentUploadSize = Math.max(\n 1,\n strapi.config.get<Config>('plugin::upload').concurrentUploadSize ?? 1\n );\n\n const fileBatches = _.chunk(\n fileArray.map((file, idx) => ({ file, fileInfo: fileInfoArray[idx] || {} })),\n concurrentUploadSize\n );\n\n for (const batch of fileBatches) {\n const results = await Promise.all(\n batch.map(({ file, fileInfo }) => doUpload(file, fileInfo))\n );\n uploadedFiles.push(...results);\n }\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return uploadedFiles;\n }\n\n /**\n * When uploading an image, an additional thumbnail is generated.\n * Also, if there are responsive formats defined, another set of images will be generated too.\n *\n * @param {*} fileData\n */\n async function uploadImage(fileData: UploadableFile) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n // Store width and height of the original image\n const { width, height } = await getDimensions(fileData);\n\n // Make sure this is assigned before calling any upload\n // That way it can mutate the width and height\n _.assign(fileData, {\n width,\n height,\n });\n\n // For performance reasons, all uploads are wrapped in a single Promise.all\n const uploadThumbnail = async (thumbnailFile: UploadableFile) => {\n await getService('provider').upload(thumbnailFile);\n _.set(fileData, 'formats.thumbnail', thumbnailFile);\n };\n\n // Generate thumbnail and responsive formats\n const uploadResponsiveFormat = async (format: { key: string; file: UploadableFile }) => {\n const { key, file } = format;\n await getService('provider').upload(file);\n _.set(fileData, ['formats', key], file);\n };\n\n const uploadPromises: Promise<void>[] = [];\n\n // Upload image\n uploadPromises.push(getService('provider').upload(fileData));\n\n // Generate & Upload thumbnail and responsive formats\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n uploadPromises.push(uploadThumbnail(thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n uploadPromises.push(uploadResponsiveFormat(format));\n }\n }\n }\n // Wait for all uploads to finish\n await Promise.all(uploadPromises);\n }\n\n /**\n * Like uploadImage, but pairs the main file and each format with its old\n * counterpart and routes through provider.replace so providers that implement\n * an atomic replace can use it. Formats that no longer exist on the new image\n * are deleted; formats that didn't exist on the old image are uploaded fresh.\n */\n async function replaceImage(fileData: UploadableFile, oldFile: File) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n const { width, height } = await getDimensions(fileData);\n\n _.assign(fileData, {\n width,\n height,\n });\n\n const replaceFormat = async (key: string, newFormat: UploadableFile) => {\n const oldFormat = oldFile.formats?.[key] as File | undefined;\n if (oldFormat) {\n await getService('provider').replace(newFormat, oldFormat);\n } else {\n await getService('provider').upload(newFormat);\n }\n _.set(fileData, ['formats', key], newFormat);\n };\n\n const promises: Promise<unknown>[] = [];\n\n // Replace the main file\n promises.push(getService('provider').replace(fileData, oldFile));\n\n const newFormatKeys = new Set<string>();\n\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n newFormatKeys.add('thumbnail');\n promises.push(replaceFormat('thumbnail', thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n newFormatKeys.add(format.key);\n promises.push(replaceFormat(format.key, format.file));\n }\n }\n }\n\n // Delete any formats that existed on the old file but are not present on the new one\n if (\n oldFile.formats &&\n oldFile.provider === strapi.config.get<Config>('plugin::upload').provider\n ) {\n for (const oldKey of Object.keys(oldFile.formats)) {\n if (!newFormatKeys.has(oldKey)) {\n const oldFormat = oldFile.formats[oldKey] as File;\n promises.push(strapi.plugin('upload').provider.delete(oldFormat));\n }\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Upload a file. If it is an image it will generate a thumbnail\n * and responsive formats (if enabled).\n */\n async function uploadFileAndPersist(fileData: UploadableFile, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n const { isImage } = getService('image-manipulation');\n\n await getService('provider').checkFileSize(fileData);\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n\n // Persist file(s)\n return add(fileData, { user });\n }\n\n async function updateFileInfo(\n id: ID,\n { name, alternativeText, caption, focalPoint, folder }: FileInfo,\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const dbFile = await findOne(id);\n\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n const fileService = getService('file');\n\n const newName = _.isNil(name) ? dbFile.name : name;\n const newInfos = {\n name: newName,\n alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,\n caption: _.isNil(caption) ? dbFile.caption : caption,\n focalPoint: _.isNil(focalPoint) ? dbFile.focalPoint : focalPoint,\n folder: _.isUndefined(folder) ? dbFile.folder : folder,\n folderPath: _.isUndefined(folder)\n ? dbFile.folderPath\n : await fileService.getFolderPath(folder),\n };\n\n return update(id, newInfos, { user });\n }\n\n async function replace(\n id: ID,\n { data, file }: { data: { fileInfo: FileInfo }; file: InputFile },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n\n const { isImage } = getService('image-manipulation');\n\n const dbFile = await findOne(id);\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);\n\n let fileData: UploadableFile;\n\n try {\n const { fileInfo } = data;\n fileData = await enhanceAndValidateFile(file, fileInfo);\n\n // Replacing a file writes new bytes just like creating one, so it has to\n // respect sizeLimit too. Checked before any provider write, and measured on\n // the same post-optimization file as the create path (uploadFileAndPersist).\n await getService('provider').checkFileSize(fileData);\n\n // keep a constant hash and extension so the file url doesn't change when the file is replaced\n _.assign(fileData, {\n hash: dbFile.hash,\n ext: dbFile.ext,\n });\n\n // clear old formats — replaceImage / replace will set new ones\n _.set(fileData, 'formats', {});\n\n if (dbFile.provider === config.provider) {\n if (await isImage(fileData)) {\n await replaceImage(fileData, dbFile);\n } else {\n // The new file is not an image, so it has no formats. Replace the main\n // file, then delete any formats the old image left behind — otherwise\n // they're orphaned in storage since the DB record no longer tracks them.\n await getService('provider').replace(fileData, dbFile);\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) =>\n strapi.plugin('upload').provider.delete(dbFile.formats![key] as File)\n )\n );\n }\n }\n } else if (await isImage(fileData)) {\n // Cross-provider replacement: no delete on the old provider, upload to the new one.\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return update(id, fileData, { user });\n }\n\n async function update(id: ID, values: Partial<File>, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).update({ where: { id }, data: fileValues });\n\n await emitEvent(MEDIA_UPDATE, res);\n\n return res;\n }\n\n async function add(values: any, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n [CREATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).create({ data: fileValues });\n\n await emitEvent(MEDIA_CREATE, res);\n\n return res;\n }\n\n async function findOne(id: ID, populate = {}) {\n const query = strapi.get('query-params').transform(FILE_MODEL_UID, {\n populate,\n });\n\n const file = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id },\n ...query,\n });\n\n if (!file) return file;\n\n // Sign file URLs if using private provider\n return fileService.signFileUrls(file);\n }\n\n async function findMany(query: any = {}): Promise<File[]> {\n const files = await strapi.db\n .query(FILE_MODEL_UID)\n .findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n return async.map(files, (file: File) => fileService.signFileUrls(file));\n }\n\n async function findPage(query: any = {}) {\n const result = await strapi.db\n .query(FILE_MODEL_UID)\n .findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n const signedResults = await async.map(result.results, (file: File) =>\n fileService.signFileUrls(file)\n );\n\n return {\n ...result,\n results: signedResults,\n };\n }\n\n /**\n * Resolve whether the count query should run, mirroring core-api's `shouldCount`.\n * Defaults to the `api.rest.withCount` config (true) when not specified on the request.\n */\n function resolveWithCount(pagination: Record<string, unknown>): boolean {\n if (has('withCount', pagination)) {\n const withCount = pagination.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount as string | number)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount as string | number)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n }\n\n /**\n * REST-aware paginated find for the content API.\n *\n * Unlike `findPage` (used by the admin API), this honors the standard nested\n * `pagination` query object (`pagination[page]`, `pagination[pageSize]`,\n * `pagination[start]`, `pagination[limit]`, `pagination[withCount]`) and the\n * `api.rest.defaultLimit` / `api.rest.maxLimit` / `api.rest.withCount` config,\n * exactly like every other Strapi REST collection-type endpoint.\n */\n async function findAndCountPage(query: any = {}) {\n const { pagination = {} } = query;\n\n const defaultLimit = toNumber(strapi.config.get('api.rest.defaultLimit', 25));\n const maxLimit = toNumber(strapi.config.get('api.rest.maxLimit')) || null;\n\n // Whether the consumer used page-based pagination (default) vs offset-based.\n const isOffset = has('start', pagination) || has('limit', pagination);\n const isPaged = !isOffset;\n\n // Resolve start/limit applying defaults and the maxLimit cap.\n const { start, limit } = paginationUtils.withDefaultPagination(pagination, {\n defaults: { offset: { limit: defaultLimit }, page: { pageSize: defaultLimit } },\n maxLimit: maxLimit || -1,\n });\n\n // Feed the transform the resolved offset/limit so it ignores the nested\n // `pagination` object (which it cannot read) and applies real bounds.\n const transformed = strapi\n .get('query-params')\n .transform(FILE_MODEL_UID, { ...query, pagination: undefined, start, limit });\n\n const shouldCount = resolveWithCount(pagination);\n\n const [results, total] = await Promise.all([\n strapi.db.query(FILE_MODEL_UID).findMany(transformed),\n shouldCount ? strapi.db.query(FILE_MODEL_UID).count(transformed) : Promise.resolve(undefined),\n ]);\n\n const signedResults = await async.map(results, (file: File) => fileService.signFileUrls(file));\n\n const transform = isPaged\n ? paginationUtils.transformPagedPaginationInfo\n : paginationUtils.transformOffsetPaginationInfo;\n\n const paginationInfo = transform({ start, limit }, total as number);\n\n return {\n results: signedResults,\n // Omit total & pageCount when counting is disabled (withCount=false).\n pagination: isNil(total) ? _.omit(paginationInfo, ['total', 'pageCount']) : paginationInfo,\n };\n }\n\n async function remove(file: File) {\n const config = strapi.config.get<Config>('plugin::upload');\n\n // execute delete function of the provider\n if (file.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(file);\n\n if (file.formats) {\n const keys = Object.keys(file.formats);\n\n await Promise.all(\n keys.map((key) => {\n return strapi.plugin('upload').provider.delete(file.formats![key]);\n })\n );\n }\n }\n\n const media = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id: file.id },\n });\n\n await emitEvent(MEDIA_DELETE, media);\n\n return strapi.db.query(FILE_MODEL_UID).delete({ where: { id: file.id } });\n }\n\n async function getSettings() {\n const res = await strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).get({});\n\n return res as Settings | null;\n }\n\n async function setSettings(value: Settings) {\n if (value.responsiveDimensions === true) {\n await getService('metrics').trackUsage('didEnableResponsiveDimensions');\n } else {\n await getService('metrics').trackUsage('didDisableResponsiveDimensions');\n }\n\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).set({ value });\n }\n\n async function getConfiguration() {\n const res = await strapi.store!({\n type: 'plugin',\n name: 'upload',\n key: 'view_configuration',\n }).get({});\n\n return res as ViewConfiguration | null;\n }\n\n function setConfiguration(value: ViewConfiguration) {\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'view_configuration' }).set({\n value,\n });\n }\n\n return {\n formatFileInfo,\n upload,\n updateFileInfo,\n replace,\n findOne,\n findMany,\n findPage,\n findAndCountPage,\n remove,\n getSettings,\n setSettings,\n getConfiguration,\n setConfiguration,\n\n /**\n * exposed for testing only\n * @internal\n */\n _uploadImage: uploadImage,\n };\n};\n"],"names":["UPDATED_BY_ATTRIBUTE","CREATED_BY_ATTRIBUTE","contentTypesUtils","constants","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","ALLOWED_WEBHOOK_EVENTS","ApplicationError","NotFoundError","errors","bytesToKbytes","fileUtils","strapi","fileService","getService","sendMediaMetrics","data","_","has","isEmpty","caption","trackUsage","alternativeText","createAndAssignTmpWorkingDirectoryToFiles","files","tmpWorkingDirectory","fse","mkdtemp","path","join","os","tmpdir","Array","isArray","forEach","file","filenameReservedRegex","windowsReservedNameRegex","isValidFilename","string","length","test","emitEvent","event","modelDef","getModel","FILE_MODEL_UID","sanitizedData","sanitize","sanitizers","defaultSanitizeOutput","schema","uid","eventHub","emit","media","formatFileInfo","filename","type","size","fileInfo","metas","imageManipulationService","ext","extname","extension","usedName","name","normalize","basename","entity","focalPoint","folder","folderPath","getFolderPath","hash","generateFileName","mime","sizeInBytes","refId","ref","field","related","id","__type","__pivot","enhanceAndValidateFile","detected","detectedMimeType","declared","mimetype","mimeType","undefined","currentFile","originalFilename","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","concurrentUploadSize","Math","max","config","get","fileBatches","chunk","map","idx","batch","results","Promise","all","push","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","formats","replaceImage","oldFile","replaceFormat","newFormat","oldFormat","replace","promises","newFormatKeys","Set","add","provider","oldKey","Object","keys","delete","checkFileSize","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","resolveWithCount","pagination","withCount","includes","ValidationError","Boolean","findAndCountPage","defaultLimit","toNumber","maxLimit","isOffset","isPaged","start","limit","paginationUtils","withDefaultPagination","defaults","offset","page","pageSize","transformed","shouldCount","total","count","resolve","transformPagedPaginationInfo","transformOffsetPaginationInfo","paginationInfo","omit","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"upload.mjs","sources":["../../../server/src/services/upload.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\nimport { extension } from 'mime-types';\nimport {\n async,\n sanitize,\n contentTypes as contentTypesUtils,\n errors,\n file as fileUtils,\n pagination as paginationUtils,\n} from '@strapi/utils';\nimport { has, toNumber, isNil } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants';\nimport { getService } from '../utils';\n\nimport type { Config, File, InputFile, UploadableFile, FileInfo } from '../types';\nimport type { ViewConfiguration } from '../controllers/validation/admin/configureView';\nimport type { Settings } from '../controllers/validation/admin/settings';\n\ntype User = {\n id: string | number;\n};\n\ntype ID = string | number;\n\ntype CommonOptions = {\n user?: User;\n};\n\ntype Metas = {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n};\n\nconst { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;\nconst { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { ApplicationError, NotFoundError } = errors;\nconst { bytesToKbytes } = fileUtils;\n\n/**\n * Queue a provider operation for a later `Promise.all`, with a rejection handler\n * attached in the same turn so a fast failure is never an unhandled rejection.\n *\n * `Promise.resolve` first — a provider may hand back a plain value, which\n * `Promise.all` accepts but `.catch` would throw on.\n */\nconst queueConcurrentOperation = <T>(queue: Promise<T>[], operation: Promise<T>) => {\n Promise.resolve(operation).catch(() => undefined);\n queue.push(operation);\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const fileService = getService('file');\n\n const sendMediaMetrics = async (data: Pick<File, 'caption' | 'alternativeText'>) => {\n if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {\n await getService('metrics').trackUsage('didSaveMediaWithCaption');\n }\n\n if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {\n await getService('metrics').trackUsage('didSaveMediaWithAlternativeText');\n }\n };\n\n const createAndAssignTmpWorkingDirectoryToFiles = async (\n files: InputFile | InputFile[]\n ): Promise<string> => {\n const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));\n\n if (Array.isArray(files)) {\n files.forEach((file) => {\n file.tmpWorkingDirectory = tmpWorkingDirectory;\n });\n } else {\n files.tmpWorkingDirectory = tmpWorkingDirectory;\n }\n\n return tmpWorkingDirectory;\n };\n\n function filenameReservedRegex() {\n // eslint-disable-next-line no-control-regex\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g;\n }\n\n function windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n }\n\n /**\n * Copied from https://github.com/sindresorhus/valid-filename package\n */\n function isValidFilename(string: string) {\n if (!string || string.length > 255) {\n return false;\n }\n if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {\n return false;\n }\n if (string === '.' || string === '..') {\n return false;\n }\n return true;\n }\n\n async function emitEvent(event: string, data: Record<string, any>) {\n const modelDef = strapi.getModel(FILE_MODEL_UID);\n const sanitizedData = await sanitize.sanitizers.defaultSanitizeOutput(\n {\n schema: modelDef,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n },\n data\n );\n\n strapi.eventHub.emit(event, { media: sanitizedData });\n }\n\n async function formatFileInfo(\n { filename, type, size }: { filename: string; type: string; size: number },\n fileInfo: Partial<FileInfo> = {},\n metas: {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n } = {}\n ): Promise<Omit<UploadableFile, 'getStream'>> {\n const fileService = getService('file');\n const imageManipulationService = getService('image-manipulation');\n\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n let ext = path.extname(filename);\n if (!ext) {\n ext = `.${extension(type)}`;\n }\n const usedName = (fileInfo.name || filename).normalize();\n const basename = path.basename(usedName, ext);\n\n // Prevent null characters in file name\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n const entity: Omit<UploadableFile, 'getStream'> = {\n name: usedName,\n alternativeText: fileInfo.alternativeText,\n caption: fileInfo.caption,\n focalPoint: fileInfo.focalPoint,\n folder: fileInfo.folder,\n folderPath: await fileService.getFolderPath(fileInfo.folder),\n hash: imageManipulationService.generateFileName(basename),\n ext,\n mime: type,\n size: bytesToKbytes(size),\n sizeInBytes: size,\n };\n\n const { refId, ref, field } = metas;\n\n if (refId && ref && field) {\n entity.related = [\n {\n id: refId,\n __type: ref,\n __pivot: { field },\n },\n ];\n }\n\n if (metas.path) {\n entity.path = metas.path;\n }\n\n if (metas.tmpWorkingDirectory) {\n entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;\n }\n\n return entity;\n }\n\n async function enhanceAndValidateFile(\n file: InputFile,\n fileInfo: FileInfo,\n metas?: Metas\n ): Promise<UploadableFile> {\n // Prefer detected MIME type from security validation. Treat application/octet-stream as\n // undeclared so we use detected type when the client sends no real Content-Type.\n const detected = (file as any).detectedMimeType;\n const declared = file.mimetype || '';\n const mimeType =\n detected ||\n (declared && declared !== 'application/octet-stream' ? declared : undefined) ||\n 'application/octet-stream';\n\n const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: mimeType,\n size: file.size,\n },\n fileInfo,\n {\n ...metas,\n tmpWorkingDirectory: file.tmpWorkingDirectory,\n }\n )) as UploadableFile;\n\n currentFile.filepath = file.filepath;\n currentFile.getStream = () => fs.createReadStream(file.filepath);\n\n const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi\n .plugin('upload')\n .service('image-manipulation');\n\n if (await isImage(currentFile)) {\n if (await isFaultyImage(currentFile)) {\n throw new ApplicationError('File is not a valid image');\n }\n if (await isOptimizableImage(currentFile)) {\n return optimize(currentFile);\n }\n }\n\n return currentFile;\n }\n\n async function upload(\n {\n data,\n files,\n }: {\n data: Record<string, unknown>;\n files: InputFile[];\n },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);\n\n const uploadedFiles = [];\n try {\n const { fileInfo, ...metas } = data;\n\n const fileArray = Array.isArray(files) ? files : [files];\n const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [fileInfo];\n\n const doUpload = async (file: InputFile, fileInfo: FileInfo) => {\n const fileData = await enhanceAndValidateFile(file, fileInfo, metas);\n return uploadFileAndPersist(fileData, { user });\n };\n\n const concurrentUploadSize = Math.max(\n 1,\n strapi.config.get<Config>('plugin::upload').concurrentUploadSize ?? 1\n );\n\n const fileBatches = _.chunk(\n fileArray.map((file, idx) => ({ file, fileInfo: fileInfoArray[idx] || {} })),\n concurrentUploadSize\n );\n\n for (const batch of fileBatches) {\n const results = await Promise.all(\n batch.map(({ file, fileInfo }) => doUpload(file, fileInfo))\n );\n uploadedFiles.push(...results);\n }\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return uploadedFiles;\n }\n\n /**\n * When uploading an image, an additional thumbnail is generated.\n * Also, if there are responsive formats defined, another set of images will be generated too.\n *\n * @param {*} fileData\n */\n async function uploadImage(fileData: UploadableFile) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n // Store width and height of the original image\n const { width, height } = await getDimensions(fileData);\n\n // Make sure this is assigned before calling any upload\n // That way it can mutate the width and height\n _.assign(fileData, {\n width,\n height,\n });\n\n // For performance reasons, all uploads are wrapped in a single Promise.all\n const uploadThumbnail = async (thumbnailFile: UploadableFile) => {\n await getService('provider').upload(thumbnailFile);\n _.set(fileData, 'formats.thumbnail', thumbnailFile);\n };\n\n // Generate thumbnail and responsive formats\n const uploadResponsiveFormat = async (format: { key: string; file: UploadableFile }) => {\n const { key, file } = format;\n await getService('provider').upload(file);\n _.set(fileData, ['formats', key], file);\n };\n\n const uploadPromises: Promise<void>[] = [];\n\n // Upload image\n queueConcurrentOperation(uploadPromises, getService('provider').upload(fileData));\n\n // Generate & Upload thumbnail and responsive formats\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n queueConcurrentOperation(uploadPromises, uploadThumbnail(thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n queueConcurrentOperation(uploadPromises, uploadResponsiveFormat(format));\n }\n }\n }\n // Wait for all uploads to finish\n await Promise.all(uploadPromises);\n }\n\n /**\n * Like uploadImage, but pairs the main file and each format with its old\n * counterpart and routes through provider.replace so providers that implement\n * an atomic replace can use it. Formats that no longer exist on the new image\n * are deleted; formats that didn't exist on the old image are uploaded fresh.\n */\n async function replaceImage(fileData: UploadableFile, oldFile: File) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n const { width, height } = await getDimensions(fileData);\n\n _.assign(fileData, {\n width,\n height,\n });\n\n const replaceFormat = async (key: string, newFormat: UploadableFile) => {\n const oldFormat = oldFile.formats?.[key] as File | undefined;\n if (oldFormat) {\n await getService('provider').replace(newFormat, oldFormat);\n } else {\n await getService('provider').upload(newFormat);\n }\n _.set(fileData, ['formats', key], newFormat);\n };\n\n const promises: Promise<unknown>[] = [];\n\n // Replace the main file\n queueConcurrentOperation(promises, getService('provider').replace(fileData, oldFile));\n\n const newFormatKeys = new Set<string>();\n\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n newFormatKeys.add('thumbnail');\n queueConcurrentOperation(promises, replaceFormat('thumbnail', thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n newFormatKeys.add(format.key);\n queueConcurrentOperation(promises, replaceFormat(format.key, format.file));\n }\n }\n }\n\n // Delete any formats that existed on the old file but are not present on the new one\n if (\n oldFile.formats &&\n oldFile.provider === strapi.config.get<Config>('plugin::upload').provider\n ) {\n for (const oldKey of Object.keys(oldFile.formats)) {\n if (!newFormatKeys.has(oldKey)) {\n const oldFormat = oldFile.formats[oldKey] as File;\n queueConcurrentOperation(promises, strapi.plugin('upload').provider.delete(oldFormat));\n }\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Upload a file. If it is an image it will generate a thumbnail\n * and responsive formats (if enabled).\n */\n async function uploadFileAndPersist(fileData: UploadableFile, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n const { isImage } = getService('image-manipulation');\n\n await getService('provider').checkFileSize(fileData);\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n\n // Persist file(s)\n return add(fileData, { user });\n }\n\n async function updateFileInfo(\n id: ID,\n { name, alternativeText, caption, focalPoint, folder }: FileInfo,\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const dbFile = await findOne(id);\n\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n const fileService = getService('file');\n\n const newName = _.isNil(name) ? dbFile.name : name;\n const newInfos = {\n name: newName,\n alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,\n caption: _.isNil(caption) ? dbFile.caption : caption,\n focalPoint: _.isNil(focalPoint) ? dbFile.focalPoint : focalPoint,\n folder: _.isUndefined(folder) ? dbFile.folder : folder,\n folderPath: _.isUndefined(folder)\n ? dbFile.folderPath\n : await fileService.getFolderPath(folder),\n };\n\n return update(id, newInfos, { user });\n }\n\n async function replace(\n id: ID,\n { data, file }: { data: { fileInfo: FileInfo }; file: InputFile },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n\n const { isImage } = getService('image-manipulation');\n\n const dbFile = await findOne(id);\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);\n\n let fileData: UploadableFile;\n\n try {\n const { fileInfo } = data;\n fileData = await enhanceAndValidateFile(file, fileInfo);\n\n // Replacing a file writes new bytes just like creating one, so it has to\n // respect sizeLimit too. Checked before any provider write, and measured on\n // the same post-optimization file as the create path (uploadFileAndPersist).\n await getService('provider').checkFileSize(fileData);\n\n // keep a constant hash and extension so the file url doesn't change when the file is replaced\n _.assign(fileData, {\n hash: dbFile.hash,\n ext: dbFile.ext,\n });\n\n // clear old formats — replaceImage / replace will set new ones\n _.set(fileData, 'formats', {});\n\n if (dbFile.provider === config.provider) {\n if (await isImage(fileData)) {\n await replaceImage(fileData, dbFile);\n } else {\n // The new file is not an image, so it has no formats. Replace the main\n // file, then delete any formats the old image left behind — otherwise\n // they're orphaned in storage since the DB record no longer tracks them.\n await getService('provider').replace(fileData, dbFile);\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) =>\n strapi.plugin('upload').provider.delete(dbFile.formats![key] as File)\n )\n );\n }\n }\n } else if (await isImage(fileData)) {\n // Cross-provider replacement: no delete on the old provider, upload to the new one.\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return update(id, fileData, { user });\n }\n\n async function update(id: ID, values: Partial<File>, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).update({ where: { id }, data: fileValues });\n\n await emitEvent(MEDIA_UPDATE, res);\n\n return res;\n }\n\n async function add(values: any, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n [CREATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).create({ data: fileValues });\n\n await emitEvent(MEDIA_CREATE, res);\n\n return res;\n }\n\n async function findOne(id: ID, populate = {}) {\n const query = strapi.get('query-params').transform(FILE_MODEL_UID, {\n populate,\n });\n\n const file = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id },\n ...query,\n });\n\n if (!file) return file;\n\n // Sign file URLs if using private provider\n return fileService.signFileUrls(file);\n }\n\n async function findMany(query: any = {}): Promise<File[]> {\n const files = await strapi.db\n .query(FILE_MODEL_UID)\n .findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n return async.map(files, (file: File) => fileService.signFileUrls(file));\n }\n\n async function findPage(query: any = {}) {\n const result = await strapi.db\n .query(FILE_MODEL_UID)\n .findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n const signedResults = await async.map(result.results, (file: File) =>\n fileService.signFileUrls(file)\n );\n\n return {\n ...result,\n results: signedResults,\n };\n }\n\n /**\n * Resolve whether the count query should run, mirroring core-api's `shouldCount`.\n * Defaults to the `api.rest.withCount` config (true) when not specified on the request.\n */\n function resolveWithCount(pagination: Record<string, unknown>): boolean {\n if (has('withCount', pagination)) {\n const withCount = pagination.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount as string | number)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount as string | number)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n }\n\n /**\n * REST-aware paginated find for the content API.\n *\n * Unlike `findPage` (used by the admin API), this honors the standard nested\n * `pagination` query object (`pagination[page]`, `pagination[pageSize]`,\n * `pagination[start]`, `pagination[limit]`, `pagination[withCount]`) and the\n * `api.rest.defaultLimit` / `api.rest.maxLimit` / `api.rest.withCount` config,\n * exactly like every other Strapi REST collection-type endpoint.\n */\n async function findAndCountPage(query: any = {}) {\n const { pagination = {} } = query;\n\n const defaultLimit = toNumber(strapi.config.get('api.rest.defaultLimit', 25));\n const maxLimit = toNumber(strapi.config.get('api.rest.maxLimit')) || null;\n\n // Whether the consumer used page-based pagination (default) vs offset-based.\n const isOffset = has('start', pagination) || has('limit', pagination);\n const isPaged = !isOffset;\n\n // Resolve start/limit applying defaults and the maxLimit cap.\n const { start, limit } = paginationUtils.withDefaultPagination(pagination, {\n defaults: { offset: { limit: defaultLimit }, page: { pageSize: defaultLimit } },\n maxLimit: maxLimit || -1,\n });\n\n // Feed the transform the resolved offset/limit so it ignores the nested\n // `pagination` object (which it cannot read) and applies real bounds.\n const transformed = strapi\n .get('query-params')\n .transform(FILE_MODEL_UID, { ...query, pagination: undefined, start, limit });\n\n const shouldCount = resolveWithCount(pagination);\n\n const [results, total] = await Promise.all([\n strapi.db.query(FILE_MODEL_UID).findMany(transformed),\n shouldCount ? strapi.db.query(FILE_MODEL_UID).count(transformed) : Promise.resolve(undefined),\n ]);\n\n const signedResults = await async.map(results, (file: File) => fileService.signFileUrls(file));\n\n const transform = isPaged\n ? paginationUtils.transformPagedPaginationInfo\n : paginationUtils.transformOffsetPaginationInfo;\n\n const paginationInfo = transform({ start, limit }, total as number);\n\n return {\n results: signedResults,\n // Omit total & pageCount when counting is disabled (withCount=false).\n pagination: isNil(total) ? _.omit(paginationInfo, ['total', 'pageCount']) : paginationInfo,\n };\n }\n\n async function remove(file: File) {\n const config = strapi.config.get<Config>('plugin::upload');\n\n // execute delete function of the provider\n if (file.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(file);\n\n if (file.formats) {\n const keys = Object.keys(file.formats);\n\n await Promise.all(\n keys.map((key) => {\n return strapi.plugin('upload').provider.delete(file.formats![key]);\n })\n );\n }\n }\n\n const media = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id: file.id },\n });\n\n await emitEvent(MEDIA_DELETE, media);\n\n return strapi.db.query(FILE_MODEL_UID).delete({ where: { id: file.id } });\n }\n\n async function getSettings() {\n const res = await strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).get({});\n\n return res as Settings | null;\n }\n\n async function setSettings(value: Settings) {\n if (value.responsiveDimensions === true) {\n await getService('metrics').trackUsage('didEnableResponsiveDimensions');\n } else {\n await getService('metrics').trackUsage('didDisableResponsiveDimensions');\n }\n\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).set({ value });\n }\n\n async function getConfiguration() {\n const res = await strapi.store!({\n type: 'plugin',\n name: 'upload',\n key: 'view_configuration',\n }).get({});\n\n return res as ViewConfiguration | null;\n }\n\n function setConfiguration(value: ViewConfiguration) {\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'view_configuration' }).set({\n value,\n });\n }\n\n return {\n formatFileInfo,\n upload,\n updateFileInfo,\n replace,\n findOne,\n findMany,\n findPage,\n findAndCountPage,\n remove,\n getSettings,\n setSettings,\n getConfiguration,\n setConfiguration,\n\n /**\n * exposed for testing only\n * @internal\n */\n _uploadImage: uploadImage,\n _replaceImage: replaceImage,\n _queueConcurrentOperation: queueConcurrentOperation,\n };\n};\n"],"names":["UPDATED_BY_ATTRIBUTE","CREATED_BY_ATTRIBUTE","contentTypesUtils","constants","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","ALLOWED_WEBHOOK_EVENTS","ApplicationError","NotFoundError","errors","bytesToKbytes","fileUtils","queueConcurrentOperation","queue","operation","Promise","resolve","catch","undefined","push","strapi","fileService","getService","sendMediaMetrics","data","_","has","isEmpty","caption","trackUsage","alternativeText","createAndAssignTmpWorkingDirectoryToFiles","files","tmpWorkingDirectory","fse","mkdtemp","path","join","os","tmpdir","Array","isArray","forEach","file","filenameReservedRegex","windowsReservedNameRegex","isValidFilename","string","length","test","emitEvent","event","modelDef","getModel","FILE_MODEL_UID","sanitizedData","sanitize","sanitizers","defaultSanitizeOutput","schema","uid","eventHub","emit","media","formatFileInfo","filename","type","size","fileInfo","metas","imageManipulationService","ext","extname","extension","usedName","name","normalize","basename","entity","focalPoint","folder","folderPath","getFolderPath","hash","generateFileName","mime","sizeInBytes","refId","ref","field","related","id","__type","__pivot","enhanceAndValidateFile","detected","detectedMimeType","declared","mimetype","mimeType","currentFile","originalFilename","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","concurrentUploadSize","Math","max","config","get","fileBatches","chunk","map","idx","batch","results","all","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","formats","replaceImage","oldFile","replaceFormat","newFormat","oldFormat","replace","promises","newFormatKeys","Set","add","provider","oldKey","Object","keys","delete","checkFileSize","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","resolveWithCount","pagination","withCount","includes","ValidationError","Boolean","findAndCountPage","defaultLimit","toNumber","maxLimit","isOffset","isPaged","start","limit","paginationUtils","withDefaultPagination","defaults","offset","page","pageSize","transformed","shouldCount","total","count","transformPagedPaginationInfo","transformOffsetPaginationInfo","paginationInfo","omit","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage","_replaceImage","_queueConcurrentOperation"],"mappings":"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"}
|
|
@@ -357,6 +357,8 @@ declare const _default: () => {
|
|
|
357
357
|
}> | null>;
|
|
358
358
|
setConfiguration: (value: import("./controllers/validation/admin/configureView").ViewConfiguration) => Promise<void>;
|
|
359
359
|
_uploadImage: (fileData: import("./types").UploadableFile) => Promise<void>;
|
|
360
|
+
_replaceImage: (fileData: import("./types").UploadableFile, oldFile: import("./types").File) => Promise<void>;
|
|
361
|
+
_queueConcurrentOperation: <T>(queue: Promise<T>[], operation: Promise<T>) => void;
|
|
360
362
|
};
|
|
361
363
|
folder: {
|
|
362
364
|
create: (folderData: Pick<import("./types").Folder, "name" | "parent">, opts?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;;;gCAKxC,CAAC;oCAAmC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;;;gCAKxC,CAAC;oCAAmC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAW00G,CAAC;mBAAe,CAAC;qBAAqB,CAAC;oBAAoB,CAAC;mCAAmC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAT/8G,wBAQG"}
|
|
@@ -72,6 +72,8 @@ export declare const services: {
|
|
|
72
72
|
}> | null>;
|
|
73
73
|
setConfiguration: (value: import("../controllers/validation/admin/configureView").ViewConfiguration) => Promise<void>;
|
|
74
74
|
_uploadImage: (fileData: import("../types").UploadableFile) => Promise<void>;
|
|
75
|
+
_replaceImage: (fileData: import("../types").UploadableFile, oldFile: import("../types").File) => Promise<void>;
|
|
76
|
+
_queueConcurrentOperation: <T>(queue: Promise<T>[], operation: Promise<T>) => void;
|
|
75
77
|
};
|
|
76
78
|
folder: {
|
|
77
79
|
create: (folderData: Pick<import("../types").Folder, "name" | "parent">, opts?: {
|