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