@strapi/upload 5.37.0 → 5.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
  2. package/dist/admin/ai/components/AIAssetCard.mjs +1 -1
  3. package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
  4. package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
  5. package/dist/admin/ai/components/AIUploadModal.mjs +1 -1
  6. package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
  7. package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
  8. package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
  9. package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -1
  10. package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -1
  11. package/dist/admin/components/AssetCard/AudioAssetCard.js.map +1 -1
  12. package/dist/admin/components/AssetCard/AudioAssetCard.mjs.map +1 -1
  13. package/dist/admin/components/AssetCard/AudioPreview.js.map +1 -1
  14. package/dist/admin/components/AssetCard/AudioPreview.mjs.map +1 -1
  15. package/dist/admin/components/AssetCard/DocAssetCard.js.map +1 -1
  16. package/dist/admin/components/AssetCard/DocAssetCard.mjs.map +1 -1
  17. package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
  18. package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
  19. package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
  20. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
  21. package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -1
  22. package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -1
  23. package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
  24. package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
  25. package/dist/admin/components/AssetDialog/AssetDialog.js.map +1 -1
  26. package/dist/admin/components/AssetDialog/AssetDialog.mjs.map +1 -1
  27. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +1 -1
  28. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  29. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +1 -1
  30. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  31. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  32. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
  33. package/dist/admin/components/AssetDialog/BrowseStep/PageSize.js.map +1 -1
  34. package/dist/admin/components/AssetDialog/BrowseStep/PageSize.mjs.map +1 -1
  35. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js.map +1 -1
  36. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.mjs.map +1 -1
  37. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.js.map +1 -1
  38. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.mjs.map +1 -1
  39. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
  40. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
  41. package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.js.map +1 -1
  42. package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.mjs.map +1 -1
  43. package/dist/admin/components/AssetDialog/DialogFooter.js.map +1 -1
  44. package/dist/admin/components/AssetDialog/DialogFooter.mjs.map +1 -1
  45. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -1
  46. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -1
  47. package/dist/admin/components/AssetGridList/AssetGridList.js.map +1 -1
  48. package/dist/admin/components/AssetGridList/AssetGridList.mjs.map +1 -1
  49. package/dist/admin/components/AssetGridList/Draggable.js.map +1 -1
  50. package/dist/admin/components/AssetGridList/Draggable.mjs.map +1 -1
  51. package/dist/admin/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  52. package/dist/admin/components/Breadcrumbs/Breadcrumbs.mjs.map +1 -1
  53. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  54. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  55. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  56. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  57. package/dist/admin/components/ContextInfo/ContextInfo.js.map +1 -1
  58. package/dist/admin/components/ContextInfo/ContextInfo.mjs.map +1 -1
  59. package/dist/admin/components/CopyLinkButton/CopyLinkButton.js.map +1 -1
  60. package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs.map +1 -1
  61. package/dist/admin/components/EditAssetDialog/DialogHeader.js.map +1 -1
  62. package/dist/admin/components/EditAssetDialog/DialogHeader.mjs.map +1 -1
  63. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  64. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  65. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
  66. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
  67. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -1
  68. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -1
  69. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -1
  70. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -1
  71. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +1 -4
  72. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  73. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -4
  74. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  75. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js.map +1 -1
  76. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs.map +1 -1
  77. package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.js.map +1 -1
  78. package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.mjs.map +1 -1
  79. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
  80. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
  81. package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -1
  82. package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs.map +1 -1
  83. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -1
  84. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -1
  85. package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.js.map +1 -1
  86. package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.mjs.map +1 -1
  87. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.js.map +1 -1
  88. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.mjs.map +1 -1
  89. package/dist/admin/components/EmptyAssets/EmptyAssets.js.map +1 -1
  90. package/dist/admin/components/EmptyAssets/EmptyAssets.mjs.map +1 -1
  91. package/dist/admin/components/FilterList/FilterList.js.map +1 -1
  92. package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
  93. package/dist/admin/components/FilterList/FilterTag.js.map +1 -1
  94. package/dist/admin/components/FilterList/FilterTag.mjs.map +1 -1
  95. package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
  96. package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -1
  97. package/dist/admin/components/FilterPopover/FilterValueInput.js.map +1 -1
  98. package/dist/admin/components/FilterPopover/FilterValueInput.mjs.map +1 -1
  99. package/dist/admin/components/FilterPopover/utils/getFilterList.js.map +1 -1
  100. package/dist/admin/components/FilterPopover/utils/getFilterList.mjs.map +1 -1
  101. package/dist/admin/components/FolderCard/FolderCard/FolderCard.js.map +1 -1
  102. package/dist/admin/components/FolderCard/FolderCard/FolderCard.mjs.map +1 -1
  103. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.js.map +1 -1
  104. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.mjs.map +1 -1
  105. package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.js.map +1 -1
  106. package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.mjs.map +1 -1
  107. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js.map +1 -1
  108. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.mjs.map +1 -1
  109. package/dist/admin/components/FolderCard/contexts/FolderCard.js.map +1 -1
  110. package/dist/admin/components/FolderCard/contexts/FolderCard.mjs.map +1 -1
  111. package/dist/admin/components/FolderGridList/FolderGridList.js.map +1 -1
  112. package/dist/admin/components/FolderGridList/FolderGridList.mjs.map +1 -1
  113. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
  114. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
  115. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
  116. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
  117. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -1
  118. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -1
  119. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
  120. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
  121. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
  122. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
  123. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  124. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  125. package/dist/admin/components/SelectTree/Option.js.map +1 -1
  126. package/dist/admin/components/SelectTree/Option.mjs.map +1 -1
  127. package/dist/admin/components/SelectTree/SelectTree.js.map +1 -1
  128. package/dist/admin/components/SelectTree/SelectTree.mjs +1 -1
  129. package/dist/admin/components/SelectTree/SelectTree.mjs.map +1 -1
  130. package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
  131. package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
  132. package/dist/admin/components/SelectTree/utils/getOpenValues.js.map +1 -1
  133. package/dist/admin/components/SelectTree/utils/getOpenValues.mjs.map +1 -1
  134. package/dist/admin/components/SelectTree/utils/getValuesToClose.js.map +1 -1
  135. package/dist/admin/components/SelectTree/utils/getValuesToClose.mjs.map +1 -1
  136. package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
  137. package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
  138. package/dist/admin/components/TableList/CellContent.js.map +1 -1
  139. package/dist/admin/components/TableList/CellContent.mjs.map +1 -1
  140. package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
  141. package/dist/admin/components/TableList/PreviewCell.mjs +1 -1
  142. package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
  143. package/dist/admin/components/TableList/TableList.js.map +1 -1
  144. package/dist/admin/components/TableList/TableList.mjs +1 -1
  145. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  146. package/dist/admin/components/TableList/TableRows.js.map +1 -1
  147. package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
  148. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -1
  149. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -1
  150. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
  151. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
  152. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  153. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  154. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
  155. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
  156. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
  157. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
  158. package/dist/admin/components/UploadProgress/UploadProgress.js.map +1 -1
  159. package/dist/admin/components/UploadProgress/UploadProgress.mjs.map +1 -1
  160. package/dist/admin/constants.js.map +1 -1
  161. package/dist/admin/constants.mjs.map +1 -1
  162. package/dist/admin/future/App.js.map +1 -1
  163. package/dist/admin/future/App.mjs.map +1 -1
  164. package/dist/admin/future/components/Drawer.js +189 -0
  165. package/dist/admin/future/components/Drawer.js.map +1 -0
  166. package/dist/admin/future/components/Drawer.mjs +166 -0
  167. package/dist/admin/future/components/Drawer.mjs.map +1 -0
  168. package/dist/admin/future/components/UploadProgressDialog.js +60 -101
  169. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  170. package/dist/admin/future/components/UploadProgressDialog.mjs +62 -84
  171. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  172. package/dist/admin/future/pages/Assets/AssetsPage.js +155 -100
  173. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  174. package/dist/admin/future/pages/Assets/AssetsPage.mjs +160 -105
  175. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  176. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +406 -0
  177. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -0
  178. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +384 -0
  179. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -0
  180. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js +215 -0
  181. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js.map +1 -0
  182. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs +194 -0
  183. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs.map +1 -0
  184. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +37 -8
  185. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  186. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +38 -9
  187. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  188. package/dist/admin/future/pages/Assets/components/AssetsTable.js +35 -5
  189. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  190. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +37 -7
  191. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  192. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js +143 -0
  193. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +1 -0
  194. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs +141 -0
  195. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +1 -0
  196. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -1
  197. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -1
  198. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  199. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  200. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js +127 -0
  201. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js.map +1 -0
  202. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.mjs +106 -0
  203. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.mjs.map +1 -0
  204. package/dist/admin/future/pages/Assets/constants.js.map +1 -1
  205. package/dist/admin/future/pages/Assets/constants.mjs.map +1 -1
  206. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js.map +1 -1
  207. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs.map +1 -1
  208. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  209. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  210. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  211. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  212. package/dist/admin/future/services/api.js +181 -97
  213. package/dist/admin/future/services/api.js.map +1 -1
  214. package/dist/admin/future/services/api.mjs +181 -98
  215. package/dist/admin/future/services/api.mjs.map +1 -1
  216. package/dist/admin/future/services/assets.js +14 -1
  217. package/dist/admin/future/services/assets.js.map +1 -1
  218. package/dist/admin/future/services/assets.mjs +14 -2
  219. package/dist/admin/future/services/assets.mjs.map +1 -1
  220. package/dist/admin/future/services/folders.js +16 -1
  221. package/dist/admin/future/services/folders.js.map +1 -1
  222. package/dist/admin/future/services/folders.mjs +16 -2
  223. package/dist/admin/future/services/folders.mjs.map +1 -1
  224. package/dist/admin/future/store/hooks.js.map +1 -1
  225. package/dist/admin/future/store/hooks.mjs.map +1 -1
  226. package/dist/admin/future/store/uploadProgress.js +7 -4
  227. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  228. package/dist/admin/future/store/uploadProgress.mjs +7 -4
  229. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  230. package/dist/admin/future/utils/files.js +105 -3
  231. package/dist/admin/future/utils/files.js.map +1 -1
  232. package/dist/admin/future/utils/files.mjs +104 -4
  233. package/dist/admin/future/utils/files.mjs.map +1 -1
  234. package/dist/admin/future/utils/getAssetIcon.js +3 -3
  235. package/dist/admin/future/utils/getAssetIcon.js.map +1 -1
  236. package/dist/admin/future/utils/getAssetIcon.mjs +4 -4
  237. package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -1
  238. package/dist/admin/future/utils/translations.js.map +1 -1
  239. package/dist/admin/future/utils/translations.mjs.map +1 -1
  240. package/dist/admin/hooks/useAIMetadataJob.js.map +1 -1
  241. package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -1
  242. package/dist/admin/hooks/useAiAvailability.js.map +1 -1
  243. package/dist/admin/hooks/useAiAvailability.mjs.map +1 -1
  244. package/dist/admin/hooks/useAssets.js.map +1 -1
  245. package/dist/admin/hooks/useAssets.mjs.map +1 -1
  246. package/dist/admin/hooks/useBulkEdit.js.map +1 -1
  247. package/dist/admin/hooks/useBulkEdit.mjs.map +1 -1
  248. package/dist/admin/hooks/useBulkMove.js.map +1 -1
  249. package/dist/admin/hooks/useBulkMove.mjs.map +1 -1
  250. package/dist/admin/hooks/useBulkRemove.js.map +1 -1
  251. package/dist/admin/hooks/useBulkRemove.mjs.map +1 -1
  252. package/dist/admin/hooks/useConfig.js.map +1 -1
  253. package/dist/admin/hooks/useConfig.mjs.map +1 -1
  254. package/dist/admin/hooks/useCropImg.js.map +1 -1
  255. package/dist/admin/hooks/useCropImg.mjs.map +1 -1
  256. package/dist/admin/hooks/useEditAsset.js.map +1 -1
  257. package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
  258. package/dist/admin/hooks/useEditFolder.js.map +1 -1
  259. package/dist/admin/hooks/useEditFolder.mjs.map +1 -1
  260. package/dist/admin/hooks/useFolder.js.map +1 -1
  261. package/dist/admin/hooks/useFolder.mjs.map +1 -1
  262. package/dist/admin/hooks/useFolderStructure.js.map +1 -1
  263. package/dist/admin/hooks/useFolderStructure.mjs.map +1 -1
  264. package/dist/admin/hooks/useFolders.js.map +1 -1
  265. package/dist/admin/hooks/useFolders.mjs.map +1 -1
  266. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  267. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  268. package/dist/admin/hooks/useModalQueryParams.js.map +1 -1
  269. package/dist/admin/hooks/useModalQueryParams.mjs.map +1 -1
  270. package/dist/admin/hooks/usePersistentState.js.map +1 -1
  271. package/dist/admin/hooks/usePersistentState.mjs.map +1 -1
  272. package/dist/admin/hooks/useRemoveAsset.js.map +1 -1
  273. package/dist/admin/hooks/useRemoveAsset.mjs.map +1 -1
  274. package/dist/admin/hooks/useSelectionState.js.map +1 -1
  275. package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
  276. package/dist/admin/hooks/useSettings.js.map +1 -1
  277. package/dist/admin/hooks/useSettings.mjs.map +1 -1
  278. package/dist/admin/hooks/useTracking.js.map +1 -1
  279. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  280. package/dist/admin/hooks/useUpload.js.map +1 -1
  281. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  282. package/dist/admin/hooks/utils/renameKeys.js.map +1 -1
  283. package/dist/admin/hooks/utils/renameKeys.mjs.map +1 -1
  284. package/dist/admin/index.js.map +1 -1
  285. package/dist/admin/index.mjs.map +1 -1
  286. package/dist/admin/package.json.js +1 -152
  287. package/dist/admin/package.json.js.map +1 -1
  288. package/dist/admin/package.json.mjs +2 -141
  289. package/dist/admin/package.json.mjs.map +1 -1
  290. package/dist/admin/pages/App/App.js.map +1 -1
  291. package/dist/admin/pages/App/App.mjs.map +1 -1
  292. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  293. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +3 -3
  294. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  295. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
  296. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
  297. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.js.map +1 -1
  298. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.mjs.map +1 -1
  299. package/dist/admin/pages/App/ConfigureTheView/state/actions.js.map +1 -1
  300. package/dist/admin/pages/App/ConfigureTheView/state/actions.mjs.map +1 -1
  301. package/dist/admin/pages/App/ConfigureTheView/state/init.js.map +1 -1
  302. package/dist/admin/pages/App/ConfigureTheView/state/init.mjs.map +1 -1
  303. package/dist/admin/pages/App/ConfigureTheView/state/reducer.js.map +1 -1
  304. package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs +1 -1
  305. package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs.map +1 -1
  306. package/dist/admin/pages/App/MediaLibrary.js +1 -1
  307. package/dist/admin/pages/App/MediaLibrary.js.map +1 -1
  308. package/dist/admin/pages/App/MediaLibrary.mjs +2 -2
  309. package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -1
  310. package/dist/admin/pages/App/components/BulkActions.js.map +1 -1
  311. package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -1
  312. package/dist/admin/pages/App/components/BulkDeleteButton.js.map +1 -1
  313. package/dist/admin/pages/App/components/BulkDeleteButton.mjs.map +1 -1
  314. package/dist/admin/pages/App/components/BulkMoveButton.js.map +1 -1
  315. package/dist/admin/pages/App/components/BulkMoveButton.mjs.map +1 -1
  316. package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -1
  317. package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -1
  318. package/dist/admin/pages/App/components/Filters.js.map +1 -1
  319. package/dist/admin/pages/App/components/Filters.mjs.map +1 -1
  320. package/dist/admin/pages/App/components/Header.js.map +1 -1
  321. package/dist/admin/pages/App/components/Header.mjs +2 -2
  322. package/dist/admin/pages/App/components/Header.mjs.map +1 -1
  323. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  324. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  325. package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
  326. package/dist/admin/pages/SettingsPage/reducer.mjs.map +1 -1
  327. package/dist/admin/pluginId.js.map +1 -1
  328. package/dist/admin/pluginId.mjs.map +1 -1
  329. package/dist/admin/src/future/components/Drawer.d.ts +32 -0
  330. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +8 -0
  331. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetPreview.d.ts +6 -0
  332. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +2 -1
  333. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +2 -1
  334. package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +8 -0
  335. package/dist/admin/src/future/pages/Assets/components/ImportFromUrlDialog.d.ts +7 -0
  336. package/dist/admin/src/future/services/api.d.ts +10 -1
  337. package/dist/admin/src/future/services/assets.d.ts +2 -2
  338. package/dist/admin/src/future/services/folders.d.ts +1 -1
  339. package/dist/admin/src/future/store/uploadProgress.d.ts +1 -1
  340. package/dist/admin/src/future/utils/files.d.ts +70 -0
  341. package/dist/admin/translations/en.json.js +35 -3
  342. package/dist/admin/translations/en.json.js.map +1 -1
  343. package/dist/admin/translations/en.json.mjs +35 -3
  344. package/dist/admin/translations/en.json.mjs.map +1 -1
  345. package/dist/admin/translations/es.json.js +1 -1
  346. package/dist/admin/translations/es.json.mjs +1 -1
  347. package/dist/admin/utils/appendSearchParamsToUrl.js.map +1 -1
  348. package/dist/admin/utils/appendSearchParamsToUrl.mjs.map +1 -1
  349. package/dist/admin/utils/containsAssetFilter.js.map +1 -1
  350. package/dist/admin/utils/containsAssetFilter.mjs.map +1 -1
  351. package/dist/admin/utils/createAssetUrl.js.map +1 -1
  352. package/dist/admin/utils/createAssetUrl.mjs.map +1 -1
  353. package/dist/admin/utils/displayedFilters.js.map +1 -1
  354. package/dist/admin/utils/displayedFilters.mjs.map +1 -1
  355. package/dist/admin/utils/downloadFile.js.map +1 -1
  356. package/dist/admin/utils/downloadFile.mjs.map +1 -1
  357. package/dist/admin/utils/findRecursiveFolderByValue.js.map +1 -1
  358. package/dist/admin/utils/findRecursiveFolderByValue.mjs.map +1 -1
  359. package/dist/admin/utils/formatBytes.js.map +1 -1
  360. package/dist/admin/utils/formatBytes.mjs.map +1 -1
  361. package/dist/admin/utils/formatDuration.js.map +1 -1
  362. package/dist/admin/utils/formatDuration.mjs.map +1 -1
  363. package/dist/admin/utils/getAPIInnerErrors.js.map +1 -1
  364. package/dist/admin/utils/getAPIInnerErrors.mjs.map +1 -1
  365. package/dist/admin/utils/getAllowedFiles.js.map +1 -1
  366. package/dist/admin/utils/getAllowedFiles.mjs.map +1 -1
  367. package/dist/admin/utils/getBreadcrumbDataCM.js.map +1 -1
  368. package/dist/admin/utils/getBreadcrumbDataCM.mjs.map +1 -1
  369. package/dist/admin/utils/getBreadcrumbDataML.js.map +1 -1
  370. package/dist/admin/utils/getBreadcrumbDataML.mjs.map +1 -1
  371. package/dist/admin/utils/getFileExtension.js.map +1 -1
  372. package/dist/admin/utils/getFileExtension.mjs.map +1 -1
  373. package/dist/admin/utils/getFolderParents.js.map +1 -1
  374. package/dist/admin/utils/getFolderParents.mjs.map +1 -1
  375. package/dist/admin/utils/getFolderURL.js.map +1 -1
  376. package/dist/admin/utils/getFolderURL.mjs.map +1 -1
  377. package/dist/admin/utils/getTrad.js.map +1 -1
  378. package/dist/admin/utils/getTrad.mjs.map +1 -1
  379. package/dist/admin/utils/icons.js.map +1 -1
  380. package/dist/admin/utils/icons.mjs +1 -1
  381. package/dist/admin/utils/icons.mjs.map +1 -1
  382. package/dist/admin/utils/moveElement.js.map +1 -1
  383. package/dist/admin/utils/moveElement.mjs.map +1 -1
  384. package/dist/admin/utils/normalizeAPIError.js.map +1 -1
  385. package/dist/admin/utils/normalizeAPIError.mjs.map +1 -1
  386. package/dist/admin/utils/prefixFileUrlWithBackendUrl.js.map +1 -1
  387. package/dist/admin/utils/prefixFileUrlWithBackendUrl.mjs.map +1 -1
  388. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
  389. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
  390. package/dist/admin/utils/rawFileToAsset.js.map +1 -1
  391. package/dist/admin/utils/rawFileToAsset.mjs.map +1 -1
  392. package/dist/admin/utils/toSingularTypes.js.map +1 -1
  393. package/dist/admin/utils/toSingularTypes.mjs.map +1 -1
  394. package/dist/admin/utils/typeFromMime.js.map +1 -1
  395. package/dist/admin/utils/typeFromMime.mjs.map +1 -1
  396. package/dist/admin/utils/urlYupSchema.js.map +1 -1
  397. package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
  398. package/dist/admin/utils/urlsToAssets.js.map +1 -1
  399. package/dist/admin/utils/urlsToAssets.mjs.map +1 -1
  400. package/dist/server/bootstrap.js.map +1 -1
  401. package/dist/server/bootstrap.mjs.map +1 -1
  402. package/dist/server/config.js.map +1 -1
  403. package/dist/server/config.mjs.map +1 -1
  404. package/dist/server/constants.js.map +1 -1
  405. package/dist/server/constants.mjs.map +1 -1
  406. package/dist/server/content-types/file.js.map +1 -1
  407. package/dist/server/content-types/file.mjs.map +1 -1
  408. package/dist/server/content-types/folder.js.map +1 -1
  409. package/dist/server/content-types/folder.mjs +1 -1
  410. package/dist/server/content-types/folder.mjs.map +1 -1
  411. package/dist/server/content-types/index.js.map +1 -1
  412. package/dist/server/content-types/index.mjs.map +1 -1
  413. package/dist/server/controllers/admin-file.js.map +1 -1
  414. package/dist/server/controllers/admin-file.mjs +1 -1
  415. package/dist/server/controllers/admin-file.mjs.map +1 -1
  416. package/dist/server/controllers/admin-folder-file.js.map +1 -1
  417. package/dist/server/controllers/admin-folder-file.mjs +2 -2
  418. package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
  419. package/dist/server/controllers/admin-folder.js.map +1 -1
  420. package/dist/server/controllers/admin-folder.mjs +1 -1
  421. package/dist/server/controllers/admin-folder.mjs.map +1 -1
  422. package/dist/server/controllers/admin-settings.js.map +1 -1
  423. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  424. package/dist/server/controllers/admin-upload.js +144 -0
  425. package/dist/server/controllers/admin-upload.js.map +1 -1
  426. package/dist/server/controllers/admin-upload.mjs +147 -3
  427. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  428. package/dist/server/controllers/content-api.js.map +1 -1
  429. package/dist/server/controllers/content-api.mjs.map +1 -1
  430. package/dist/server/controllers/index.js.map +1 -1
  431. package/dist/server/controllers/index.mjs.map +1 -1
  432. package/dist/server/controllers/utils/find-entity-and-check-permissions.js.map +1 -1
  433. package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs.map +1 -1
  434. package/dist/server/controllers/utils/folders.js.map +1 -1
  435. package/dist/server/controllers/utils/folders.mjs.map +1 -1
  436. package/dist/server/controllers/validation/admin/configureView.js.map +1 -1
  437. package/dist/server/controllers/validation/admin/configureView.mjs.map +1 -1
  438. package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
  439. package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
  440. package/dist/server/controllers/validation/admin/folder.js.map +1 -1
  441. package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
  442. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  443. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  444. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  445. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  446. package/dist/server/controllers/validation/admin/utils.js.map +1 -1
  447. package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
  448. package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
  449. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
  450. package/dist/server/controllers/view-configuration.js.map +1 -1
  451. package/dist/server/controllers/view-configuration.mjs.map +1 -1
  452. package/dist/server/graphql.js.map +1 -1
  453. package/dist/server/graphql.mjs.map +1 -1
  454. package/dist/server/index.js +8 -8
  455. package/dist/server/middlewares/upload.js.map +1 -1
  456. package/dist/server/middlewares/upload.mjs.map +1 -1
  457. package/dist/server/models/ai-metadata-job.js.map +1 -1
  458. package/dist/server/models/ai-metadata-job.mjs.map +1 -1
  459. package/dist/server/register.js.map +1 -1
  460. package/dist/server/register.mjs.map +1 -1
  461. package/dist/server/routes/admin.js +10 -0
  462. package/dist/server/routes/admin.js.map +1 -1
  463. package/dist/server/routes/admin.mjs +10 -0
  464. package/dist/server/routes/admin.mjs.map +1 -1
  465. package/dist/server/routes/content-api.js.map +1 -1
  466. package/dist/server/routes/content-api.mjs.map +1 -1
  467. package/dist/server/routes/index.js.map +1 -1
  468. package/dist/server/routes/index.mjs +4 -4
  469. package/dist/server/routes/index.mjs.map +1 -1
  470. package/dist/server/routes/validation/upload.js.map +1 -1
  471. package/dist/server/routes/validation/upload.mjs.map +1 -1
  472. package/dist/server/routes/view-configuration.js.map +1 -1
  473. package/dist/server/routes/view-configuration.mjs.map +1 -1
  474. package/dist/server/services/ai-metadata-jobs.js.map +1 -1
  475. package/dist/server/services/ai-metadata-jobs.mjs.map +1 -1
  476. package/dist/server/services/ai-metadata.js.map +1 -1
  477. package/dist/server/services/ai-metadata.mjs.map +1 -1
  478. package/dist/server/services/api-upload-folder.js.map +1 -1
  479. package/dist/server/services/api-upload-folder.mjs.map +1 -1
  480. package/dist/server/services/extensions/index.js.map +1 -1
  481. package/dist/server/services/extensions/index.mjs.map +1 -1
  482. package/dist/server/services/extensions/utils.js.map +1 -1
  483. package/dist/server/services/extensions/utils.mjs.map +1 -1
  484. package/dist/server/services/file.js +120 -1
  485. package/dist/server/services/file.js.map +1 -1
  486. package/dist/server/services/file.mjs +122 -3
  487. package/dist/server/services/file.mjs.map +1 -1
  488. package/dist/server/services/folder.js.map +1 -1
  489. package/dist/server/services/folder.mjs +1 -1
  490. package/dist/server/services/folder.mjs.map +1 -1
  491. package/dist/server/services/image-manipulation.js.map +1 -1
  492. package/dist/server/services/image-manipulation.mjs +1 -1
  493. package/dist/server/services/image-manipulation.mjs.map +1 -1
  494. package/dist/server/services/index.js.map +1 -1
  495. package/dist/server/services/index.mjs.map +1 -1
  496. package/dist/server/services/metrics.js.map +1 -1
  497. package/dist/server/services/metrics.mjs.map +1 -1
  498. package/dist/server/services/provider.js.map +1 -1
  499. package/dist/server/services/provider.mjs.map +1 -1
  500. package/dist/server/services/upload.js.map +1 -1
  501. package/dist/server/services/upload.mjs +1 -1
  502. package/dist/server/services/upload.mjs.map +1 -1
  503. package/dist/server/services/weekly-metrics.js.map +1 -1
  504. package/dist/server/services/weekly-metrics.mjs.map +1 -1
  505. package/dist/server/src/controllers/admin-upload.d.ts +13 -0
  506. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  507. package/dist/server/src/controllers/index.d.ts +1 -0
  508. package/dist/server/src/controllers/index.d.ts.map +1 -1
  509. package/dist/server/src/index.d.ts +2 -0
  510. package/dist/server/src/index.d.ts.map +1 -1
  511. package/dist/server/src/routes/admin.d.ts.map +1 -1
  512. package/dist/server/src/services/file.d.ts +15 -0
  513. package/dist/server/src/services/file.d.ts.map +1 -1
  514. package/dist/server/src/services/index.d.ts +1 -0
  515. package/dist/server/src/services/index.d.ts.map +1 -1
  516. package/dist/server/utils/cron.js.map +1 -1
  517. package/dist/server/utils/cron.mjs.map +1 -1
  518. package/dist/server/utils/images.js.map +1 -1
  519. package/dist/server/utils/images.mjs.map +1 -1
  520. package/dist/server/utils/index.js.map +1 -1
  521. package/dist/server/utils/index.mjs.map +1 -1
  522. package/dist/server/utils/mime-validation.js.map +1 -1
  523. package/dist/server/utils/mime-validation.mjs.map +1 -1
  524. package/dist/shared/contracts/files.d.ts +11 -0
  525. package/dist/shared/contracts/files.d.ts.map +1 -1
  526. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"folder.mjs","sources":["../../../server/src/services/folder.ts"],"sourcesContent":["import { sortBy, map, isUndefined } from 'lodash/fp';\nimport { strings, setCreatorFields } from '@strapi/utils';\nimport { FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport { getService } from '../utils';\n\nimport type { File, Folder } from '../types';\n\ntype FolderMap = {\n [key: string]: Partial<Folder> & {\n children: FolderNode[];\n };\n};\n\ntype FolderNode = Partial<Folder> & {\n children: FolderNode[];\n};\n\nconst setPathIdAndPath = async (folder: Pick<Folder, 'parent'>) => {\n const { max } = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .max('pathId')\n .first()\n .execute<{ max: number }>();\n\n const pathId = max + 1;\n let parentPath = '/';\n if (folder.parent) {\n const parentFolder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .findOne({ where: { id: folder.parent } });\n\n parentPath = parentFolder.path;\n }\n\n return Object.assign(folder, {\n pathId,\n path: strings.joinBy('/', parentPath, `${pathId}`),\n });\n};\n\nconst create = async (\n folderData: Pick<Folder, 'name' | 'parent'>,\n opts?: { user: { id: string | number } }\n) => {\n const folderService = getService('folder');\n\n const { user } = opts || {};\n\n let enrichedFolder = await folderService.setPathIdAndPath(folderData);\n if (user) {\n enrichedFolder = await setCreatorFields({ user })(enrichedFolder);\n }\n\n const folder = await strapi.db.query(FOLDER_MODEL_UID).create({ data: enrichedFolder });\n\n strapi.eventHub.emit('media-folder.create', { folder });\n\n return folder;\n};\n\n/**\n * Recursively delete folders and included files\n * @param ids ids of the folders to delete\n * @returns {Promise<Object[]>}\n */\nconst deleteByIds = async (ids = []) => {\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({ where: { id: { $in: ids } } });\n if (folders.length === 0) {\n return {\n folders: [],\n totalFolderNumber: 0,\n totalFileNumber: 0,\n };\n }\n\n const pathsToDelete = map('path', folders);\n\n // delete files\n const filesToDelete = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { folderPath: { $eq: path } },\n { folderPath: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n await Promise.all(filesToDelete.map((file: File) => getService('upload').remove(file)));\n\n // delete folders and subfolders\n const { count: totalFolderNumber } = await strapi.db.query(FOLDER_MODEL_UID).deleteMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { path: { $eq: path } },\n { path: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n strapi.eventHub.emit('media-folder.delete', { folders });\n\n return {\n folders,\n totalFolderNumber,\n totalFileNumber: filesToDelete.length,\n };\n};\n\n/**\n * Update name and location of a folder and its belonging folders and files\n */\nconst update = async (\n id: number,\n {\n name,\n parent,\n }: {\n name: string;\n parent: number | null;\n },\n { user }: { user: { id: string | number } }\n) => {\n // only name is updated\n if (isUndefined(parent)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n\n if (!existingFolder) {\n return undefined;\n }\n\n const newFolder = setCreatorFields({ user, isEdition: true })({ name, parent });\n\n if (isUndefined(parent)) {\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n return folder;\n }\n // location is updated => using transaction\n } else {\n const trx = await strapi.db.transaction();\n try {\n // fetch existing folder\n const existingFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['pathId', 'path'])\n .where({ id })\n .transacting(trx.get())\n .forUpdate()\n .first()\n .execute<Folder>();\n\n // update parent folder (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic types\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [joinTable.joinColumn.name]: id })\n .execute();\n\n if (parent !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert({ [joinTable.inverseJoinColumn.name]: parent, [joinTable.joinColumn.name]: id })\n .where({ [joinTable.joinColumn.name]: id })\n .execute();\n }\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (parent !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: parent })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderPathColumnName =\n // @ts-expect-error - no dynamic types\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic types\n const pathColumnName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n // update folders below\n await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColumnName, existingFolder.path)\n .orWhere(pathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n pathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n // update files below\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColumnName, existingFolder.path)\n .orWhere(folderPathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n folderPathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n // update less critical information (name + updatedBy)\n const newFolder = setCreatorFields({ user, isEdition: true })({ name });\n\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n strapi.eventHub.emit('media-folder.update', { folder });\n return folder;\n }\n};\n\n/**\n * Check if a folder exists in database\n * @param params query params to find the folder\n * @returns {Promise<boolean>}\n */\nconst exists = async (params = {}) => {\n const count = await strapi.db.query(FOLDER_MODEL_UID).count({ where: params });\n return count > 0;\n};\n\n/**\n * Returns the nested structure of folders\n * @returns {Promise<array>}\n */\nconst getStructure = async () => {\n // @ts-expect-error - no dynamic types\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n const qb = strapi.db.queryBuilder(FOLDER_MODEL_UID);\n const alias = qb.getAlias();\n const folders = (await qb\n .select(['id', 'name', `${alias}.${joinTable.inverseJoinColumn.name} as parent`])\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.joinColumn.name,\n rootColumn: joinTable.joinColumn.referencedColumn,\n rootTable: qb.alias,\n })\n .execute({ mapResults: false })) as Folder[];\n\n const folderMap: FolderMap = {\n null: { children: [] },\n };\n\n folders.forEach((f) => {\n folderMap[f.id] = { ...f, children: [] };\n });\n\n folders.forEach((f) => {\n const parentId = f.parent || 'null';\n\n if (!folderMap[parentId]) {\n folderMap[parentId] = { children: [] };\n }\n\n folderMap[parentId].children.push(folderMap[f.id]);\n folderMap[parentId].children = sortBy('name', folderMap[parentId].children);\n delete folderMap[f.id].parent;\n });\n\n return folderMap.null.children;\n};\n\nexport default {\n create,\n exists,\n deleteByIds,\n update,\n setPathIdAndPath,\n getStructure,\n};\n"],"names":["setPathIdAndPath","folder","max","strapi","db","queryBuilder","FOLDER_MODEL_UID","first","execute","pathId","parentPath","parent","parentFolder","query","findOne","where","id","path","Object","assign","strings","joinBy","create","folderData","opts","folderService","getService","user","enrichedFolder","setCreatorFields","data","eventHub","emit","deleteByIds","ids","folders","findMany","$in","length","totalFolderNumber","totalFileNumber","pathsToDelete","map","filesToDelete","FILE_MODEL_UID","$or","flatMap","folderPath","$eq","$startsWith","Promise","all","file","remove","count","deleteMany","update","name","isUndefined","existingFolder","undefined","newFolder","isEdition","trx","transaction","select","transacting","get","forUpdate","joinTable","metadata","attributes","delete","joinColumn","insert","inverseJoinColumn","destinationFolderPath","destinationFolder","folderTable","getModel","collectionName","fileTable","folderPathColumnName","columnName","pathColumnName","getConnection","orWhere","connection","raw","commit","e","rollback","exists","params","getStructure","qb","alias","getAlias","join","referencedTable","referencedColumn","rootColumn","rootTable","mapResults","folderMap","null","children","forEach","f","parentId","push","sortBy"],"mappings":"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"}
1
+ {"version":3,"file":"folder.mjs","sources":["../../../server/src/services/folder.ts"],"sourcesContent":["import { sortBy, map, isUndefined } from 'lodash/fp';\nimport { strings, setCreatorFields } from '@strapi/utils';\nimport { FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport { getService } from '../utils';\n\nimport type { File, Folder } from '../types';\n\ntype FolderMap = {\n [key: string]: Partial<Folder> & {\n children: FolderNode[];\n };\n};\n\ntype FolderNode = Partial<Folder> & {\n children: FolderNode[];\n};\n\nconst setPathIdAndPath = async (folder: Pick<Folder, 'parent'>) => {\n const { max } = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .max('pathId')\n .first()\n .execute<{ max: number }>();\n\n const pathId = max + 1;\n let parentPath = '/';\n if (folder.parent) {\n const parentFolder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .findOne({ where: { id: folder.parent } });\n\n parentPath = parentFolder.path;\n }\n\n return Object.assign(folder, {\n pathId,\n path: strings.joinBy('/', parentPath, `${pathId}`),\n });\n};\n\nconst create = async (\n folderData: Pick<Folder, 'name' | 'parent'>,\n opts?: { user: { id: string | number } }\n) => {\n const folderService = getService('folder');\n\n const { user } = opts || {};\n\n let enrichedFolder = await folderService.setPathIdAndPath(folderData);\n if (user) {\n enrichedFolder = await setCreatorFields({ user })(enrichedFolder);\n }\n\n const folder = await strapi.db.query(FOLDER_MODEL_UID).create({ data: enrichedFolder });\n\n strapi.eventHub.emit('media-folder.create', { folder });\n\n return folder;\n};\n\n/**\n * Recursively delete folders and included files\n * @param ids ids of the folders to delete\n * @returns {Promise<Object[]>}\n */\nconst deleteByIds = async (ids = []) => {\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({ where: { id: { $in: ids } } });\n if (folders.length === 0) {\n return {\n folders: [],\n totalFolderNumber: 0,\n totalFileNumber: 0,\n };\n }\n\n const pathsToDelete = map('path', folders);\n\n // delete files\n const filesToDelete = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { folderPath: { $eq: path } },\n { folderPath: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n await Promise.all(filesToDelete.map((file: File) => getService('upload').remove(file)));\n\n // delete folders and subfolders\n const { count: totalFolderNumber } = await strapi.db.query(FOLDER_MODEL_UID).deleteMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { path: { $eq: path } },\n { path: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n strapi.eventHub.emit('media-folder.delete', { folders });\n\n return {\n folders,\n totalFolderNumber,\n totalFileNumber: filesToDelete.length,\n };\n};\n\n/**\n * Update name and location of a folder and its belonging folders and files\n */\nconst update = async (\n id: number,\n {\n name,\n parent,\n }: {\n name: string;\n parent: number | null;\n },\n { user }: { user: { id: string | number } }\n) => {\n // only name is updated\n if (isUndefined(parent)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n\n if (!existingFolder) {\n return undefined;\n }\n\n const newFolder = setCreatorFields({ user, isEdition: true })({ name, parent });\n\n if (isUndefined(parent)) {\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n return folder;\n }\n // location is updated => using transaction\n } else {\n const trx = await strapi.db.transaction();\n try {\n // fetch existing folder\n const existingFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['pathId', 'path'])\n .where({ id })\n .transacting(trx.get())\n .forUpdate()\n .first()\n .execute<Folder>();\n\n // update parent folder (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic types\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [joinTable.joinColumn.name]: id })\n .execute();\n\n if (parent !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert({ [joinTable.inverseJoinColumn.name]: parent, [joinTable.joinColumn.name]: id })\n .where({ [joinTable.joinColumn.name]: id })\n .execute();\n }\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (parent !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: parent })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderPathColumnName =\n // @ts-expect-error - no dynamic types\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic types\n const pathColumnName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n // update folders below\n await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColumnName, existingFolder.path)\n .orWhere(pathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n pathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n // update files below\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColumnName, existingFolder.path)\n .orWhere(folderPathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n folderPathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n // update less critical information (name + updatedBy)\n const newFolder = setCreatorFields({ user, isEdition: true })({ name });\n\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n strapi.eventHub.emit('media-folder.update', { folder });\n return folder;\n }\n};\n\n/**\n * Check if a folder exists in database\n * @param params query params to find the folder\n * @returns {Promise<boolean>}\n */\nconst exists = async (params = {}) => {\n const count = await strapi.db.query(FOLDER_MODEL_UID).count({ where: params });\n return count > 0;\n};\n\n/**\n * Returns the nested structure of folders\n * @returns {Promise<array>}\n */\nconst getStructure = async () => {\n // @ts-expect-error - no dynamic types\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n const qb = strapi.db.queryBuilder(FOLDER_MODEL_UID);\n const alias = qb.getAlias();\n const folders = (await qb\n .select(['id', 'name', `${alias}.${joinTable.inverseJoinColumn.name} as parent`])\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.joinColumn.name,\n rootColumn: joinTable.joinColumn.referencedColumn,\n rootTable: qb.alias,\n })\n .execute({ mapResults: false })) as Folder[];\n\n const folderMap: FolderMap = {\n null: { children: [] },\n };\n\n folders.forEach((f) => {\n folderMap[f.id] = { ...f, children: [] };\n });\n\n folders.forEach((f) => {\n const parentId = f.parent || 'null';\n\n if (!folderMap[parentId]) {\n folderMap[parentId] = { children: [] };\n }\n\n folderMap[parentId].children.push(folderMap[f.id]);\n folderMap[parentId].children = sortBy('name', folderMap[parentId].children);\n delete folderMap[f.id].parent;\n });\n\n return folderMap.null.children;\n};\n\nexport default {\n create,\n exists,\n deleteByIds,\n update,\n setPathIdAndPath,\n getStructure,\n};\n"],"names":["setPathIdAndPath","folder","max","strapi","db","queryBuilder","FOLDER_MODEL_UID","first","execute","pathId","parentPath","parent","parentFolder","query","findOne","where","id","path","Object","assign","strings","joinBy","create","folderData","opts","folderService","getService","user","enrichedFolder","setCreatorFields","data","eventHub","emit","deleteByIds","ids","folders","findMany","$in","length","totalFolderNumber","totalFileNumber","pathsToDelete","map","filesToDelete","FILE_MODEL_UID","$or","flatMap","folderPath","$eq","$startsWith","Promise","all","file","remove","count","deleteMany","update","name","isUndefined","existingFolder","undefined","newFolder","isEdition","trx","transaction","select","transacting","get","forUpdate","joinTable","metadata","attributes","delete","joinColumn","insert","inverseJoinColumn","destinationFolderPath","destinationFolder","folderTable","getModel","collectionName","fileTable","folderPathColumnName","columnName","pathColumnName","getConnection","orWhere","connection","raw","commit","e","rollback","exists","params","getStructure","qb","alias","getAlias","join","referencedTable","referencedColumn","rootColumn","rootTable","mapResults","folderMap","null","children","forEach","f","parentId","push","sortBy"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"image-manipulation.js","sources":["../../../server/src/services/image-manipulation.ts"],"sourcesContent":["import fs from 'fs';\nimport { join } from 'path';\nimport sharp from 'sharp';\nimport crypto from 'crypto';\nimport { strings, file as fileUtils } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nimport type { UploadableFile } from '../types';\n\ntype Dimensions = {\n width: number | null;\n height: number | null;\n};\n\nconst { bytesToKbytes } = fileUtils;\n\nconst FORMATS_TO_RESIZE = ['jpeg', 'png', 'webp', 'tiff', 'gif'];\nconst FORMATS_TO_PROCESS = ['jpeg', 'png', 'webp', 'tiff', 'svg', 'gif', 'avif'];\nconst FORMATS_TO_OPTIMIZE = ['jpeg', 'png', 'webp', 'tiff', 'avif'];\n\nconst isOptimizableFormat = (\n format: string | undefined\n): format is 'jpeg' | 'png' | 'webp' | 'tiff' | 'avif' =>\n format !== undefined && FORMATS_TO_OPTIMIZE.includes(format);\n\nconst writeStreamToFile = (stream: NodeJS.ReadWriteStream, path: string) =>\n new Promise<void>((resolve, reject) => {\n const writeStream = fs.createWriteStream(path);\n // Reject promise if there is an error with the provided stream\n stream.on('error', reject);\n stream.pipe(writeStream);\n writeStream.on('close', () => resolve());\n writeStream.on('error', reject);\n });\n\nconst getMetadata = (file: UploadableFile): Promise<sharp.Metadata> => {\n if (!file.filepath) {\n return new Promise((resolve, reject) => {\n const pipeline = sharp();\n pipeline.metadata().then(resolve).catch(reject);\n file.getStream().pipe(pipeline);\n });\n }\n\n return sharp(file.filepath).metadata();\n};\n\nconst getDimensions = async (file: UploadableFile): Promise<Dimensions> => {\n const { width = null, height = null } = await getMetadata(file);\n\n return { width, height };\n};\n\nconst THUMBNAIL_RESIZE_OPTIONS = {\n width: 245,\n height: 156,\n fit: 'inside',\n} satisfies sharp.ResizeOptions;\n\nconst resizeFileTo = async (\n file: UploadableFile,\n options: sharp.ResizeOptions,\n {\n name,\n hash,\n }: {\n name: string;\n hash: string;\n }\n) => {\n const filePath = file.tmpWorkingDirectory ? join(file.tmpWorkingDirectory, hash) : hash;\n\n let newInfo;\n if (!file.filepath) {\n const transform = sharp()\n .resize(options)\n .on('info', (info) => {\n newInfo = info;\n });\n\n await writeStreamToFile(file.getStream().pipe(transform), filePath);\n } else {\n newInfo = await sharp(file.filepath).resize(options).toFile(filePath);\n }\n\n const { width, height, size } = newInfo ?? {};\n\n const newFile: UploadableFile = {\n name,\n hash,\n ext: file.ext,\n mime: file.mime,\n filepath: filePath,\n path: file.path || null,\n getStream: () => fs.createReadStream(filePath),\n };\n\n Object.assign(newFile, {\n width,\n height,\n size: size ? bytesToKbytes(size) : 0,\n sizeInBytes: size,\n });\n return newFile;\n};\n\nconst generateThumbnail = async (file: UploadableFile) => {\n if (\n file.width &&\n file.height &&\n (file.width > THUMBNAIL_RESIZE_OPTIONS.width || file.height > THUMBNAIL_RESIZE_OPTIONS.height)\n ) {\n return resizeFileTo(file, THUMBNAIL_RESIZE_OPTIONS, {\n name: `thumbnail_${file.name}`,\n hash: `thumbnail_${file.hash}`,\n });\n }\n\n return null;\n};\n\n/**\n * Optimize image by:\n * - auto orienting image based on EXIF data\n * - reduce image quality\n *\n */\nconst optimize = async (file: UploadableFile) => {\n const { sizeOptimization = false, autoOrientation = false } =\n (await getService('upload').getSettings()) ?? {};\n\n const { format, size } = await getMetadata(file);\n\n if ((sizeOptimization || autoOrientation) && isOptimizableFormat(format)) {\n let transformer;\n if (!file.filepath) {\n transformer = sharp();\n } else {\n transformer = sharp(file.filepath);\n }\n // reduce image quality\n transformer[format]({ quality: sizeOptimization ? 80 : 100 });\n // rotate image based on EXIF data\n if (autoOrientation) {\n transformer.rotate();\n }\n const filePath = file.tmpWorkingDirectory\n ? join(file.tmpWorkingDirectory, `optimized-${file.hash}`)\n : `optimized-${file.hash}`;\n\n let newInfo;\n if (!file.filepath) {\n transformer.on('info', (info) => {\n newInfo = info;\n });\n\n await writeStreamToFile(file.getStream().pipe(transformer), filePath);\n } else {\n newInfo = await transformer.toFile(filePath);\n }\n\n const { width: newWidth, height: newHeight, size: newSize } = newInfo ?? {};\n\n const newFile = { ...file };\n\n newFile.getStream = () => fs.createReadStream(filePath);\n newFile.filepath = filePath;\n\n if (newSize && size && newSize > size) {\n // Ignore optimization if output is bigger than original\n return file;\n }\n\n return Object.assign(newFile, {\n width: newWidth,\n height: newHeight,\n size: newSize ? bytesToKbytes(newSize) : 0,\n sizeInBytes: newSize,\n });\n }\n\n return file;\n};\n\nconst DEFAULT_BREAKPOINTS = {\n large: 1000,\n medium: 750,\n small: 500,\n};\n\nconst getBreakpoints = () =>\n strapi.config.get<Record<string, number>>('plugin::upload.breakpoints', DEFAULT_BREAKPOINTS);\n\nconst generateResponsiveFormats = async (file: UploadableFile) => {\n const { responsiveDimensions = false } = (await getService('upload').getSettings()) ?? {};\n\n if (!responsiveDimensions) return [];\n\n const originalDimensions = await getDimensions(file);\n\n const breakpoints = getBreakpoints();\n return Promise.all(\n Object.keys(breakpoints).map((key) => {\n const breakpoint = breakpoints[key];\n\n if (breakpointSmallerThan(breakpoint, originalDimensions)) {\n return generateBreakpoint(key, { file, breakpoint });\n }\n\n return undefined;\n })\n );\n};\n\nconst generateBreakpoint = async (\n key: string,\n { file, breakpoint }: { file: UploadableFile; breakpoint: number }\n) => {\n const newFile = await resizeFileTo(\n file,\n {\n width: breakpoint,\n height: breakpoint,\n fit: 'inside',\n },\n {\n name: `${key}_${file.name}`,\n hash: `${key}_${file.hash}`,\n }\n );\n return {\n key,\n file: newFile,\n };\n};\n\nconst breakpointSmallerThan = (breakpoint: number, { width, height }: Dimensions) => {\n return breakpoint < (width ?? 0) || breakpoint < (height ?? 0);\n};\n\n/**\n * Applies a simple image transformation to see if the image is faulty/corrupted.\n */\nconst isFaultyImage = async (file: UploadableFile) => {\n if (!file.filepath) {\n return new Promise((resolve, reject) => {\n const pipeline = sharp();\n pipeline.stats().then(resolve).catch(reject);\n file.getStream().pipe(pipeline);\n });\n }\n\n try {\n await sharp(file.filepath).stats();\n return false;\n } catch (e) {\n return true;\n }\n};\n\nconst isOptimizableImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_OPTIMIZE.includes(format);\n};\n\nconst isResizableImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_RESIZE.includes(format);\n};\n\nconst isImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_PROCESS.includes(format);\n};\n\nconst generateFileName = (name: string) => {\n const randomSuffix = () => crypto.randomBytes(5).toString('hex');\n const baseName = strings.nameToSlug(name, { separator: '_', lowercase: false });\n\n return `${baseName}_${randomSuffix()}`;\n};\n\nexport default {\n isFaultyImage,\n isOptimizableImage,\n isResizableImage,\n isImage,\n getDimensions,\n generateResponsiveFormats,\n generateThumbnail,\n optimize,\n generateFileName,\n};\n"],"names":["bytesToKbytes","fileUtils","FORMATS_TO_RESIZE","FORMATS_TO_PROCESS","FORMATS_TO_OPTIMIZE","isOptimizableFormat","format","undefined","includes","writeStreamToFile","stream","path","Promise","resolve","reject","writeStream","fs","createWriteStream","on","pipe","getMetadata","file","filepath","pipeline","sharp","metadata","then","catch","getStream","getDimensions","width","height","THUMBNAIL_RESIZE_OPTIONS","fit","resizeFileTo","options","name","hash","filePath","tmpWorkingDirectory","join","newInfo","transform","resize","info","toFile","size","newFile","ext","mime","createReadStream","Object","assign","sizeInBytes","generateThumbnail","optimize","sizeOptimization","autoOrientation","getService","getSettings","transformer","quality","rotate","newWidth","newHeight","newSize","DEFAULT_BREAKPOINTS","large","medium","small","getBreakpoints","strapi","config","get","generateResponsiveFormats","responsiveDimensions","originalDimensions","breakpoints","all","keys","map","key","breakpoint","breakpointSmallerThan","generateBreakpoint","isFaultyImage","stats","e","isOptimizableImage","isResizableImage","isImage","generateFileName","randomSuffix","crypto","randomBytes","toString","baseName","strings","nameToSlug","separator","lowercase"],"mappings":"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"}
1
+ {"version":3,"file":"image-manipulation.js","sources":["../../../server/src/services/image-manipulation.ts"],"sourcesContent":["import fs from 'fs';\nimport { join } from 'path';\nimport sharp from 'sharp';\nimport crypto from 'crypto';\nimport { strings, file as fileUtils } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nimport type { UploadableFile } from '../types';\n\ntype Dimensions = {\n width: number | null;\n height: number | null;\n};\n\nconst { bytesToKbytes } = fileUtils;\n\nconst FORMATS_TO_RESIZE = ['jpeg', 'png', 'webp', 'tiff', 'gif'];\nconst FORMATS_TO_PROCESS = ['jpeg', 'png', 'webp', 'tiff', 'svg', 'gif', 'avif'];\nconst FORMATS_TO_OPTIMIZE = ['jpeg', 'png', 'webp', 'tiff', 'avif'];\n\nconst isOptimizableFormat = (\n format: string | undefined\n): format is 'jpeg' | 'png' | 'webp' | 'tiff' | 'avif' =>\n format !== undefined && FORMATS_TO_OPTIMIZE.includes(format);\n\nconst writeStreamToFile = (stream: NodeJS.ReadWriteStream, path: string) =>\n new Promise<void>((resolve, reject) => {\n const writeStream = fs.createWriteStream(path);\n // Reject promise if there is an error with the provided stream\n stream.on('error', reject);\n stream.pipe(writeStream);\n writeStream.on('close', () => resolve());\n writeStream.on('error', reject);\n });\n\nconst getMetadata = (file: UploadableFile): Promise<sharp.Metadata> => {\n if (!file.filepath) {\n return new Promise((resolve, reject) => {\n const pipeline = sharp();\n pipeline.metadata().then(resolve).catch(reject);\n file.getStream().pipe(pipeline);\n });\n }\n\n return sharp(file.filepath).metadata();\n};\n\nconst getDimensions = async (file: UploadableFile): Promise<Dimensions> => {\n const { width = null, height = null } = await getMetadata(file);\n\n return { width, height };\n};\n\nconst THUMBNAIL_RESIZE_OPTIONS = {\n width: 245,\n height: 156,\n fit: 'inside',\n} satisfies sharp.ResizeOptions;\n\nconst resizeFileTo = async (\n file: UploadableFile,\n options: sharp.ResizeOptions,\n {\n name,\n hash,\n }: {\n name: string;\n hash: string;\n }\n) => {\n const filePath = file.tmpWorkingDirectory ? join(file.tmpWorkingDirectory, hash) : hash;\n\n let newInfo;\n if (!file.filepath) {\n const transform = sharp()\n .resize(options)\n .on('info', (info) => {\n newInfo = info;\n });\n\n await writeStreamToFile(file.getStream().pipe(transform), filePath);\n } else {\n newInfo = await sharp(file.filepath).resize(options).toFile(filePath);\n }\n\n const { width, height, size } = newInfo ?? {};\n\n const newFile: UploadableFile = {\n name,\n hash,\n ext: file.ext,\n mime: file.mime,\n filepath: filePath,\n path: file.path || null,\n getStream: () => fs.createReadStream(filePath),\n };\n\n Object.assign(newFile, {\n width,\n height,\n size: size ? bytesToKbytes(size) : 0,\n sizeInBytes: size,\n });\n return newFile;\n};\n\nconst generateThumbnail = async (file: UploadableFile) => {\n if (\n file.width &&\n file.height &&\n (file.width > THUMBNAIL_RESIZE_OPTIONS.width || file.height > THUMBNAIL_RESIZE_OPTIONS.height)\n ) {\n return resizeFileTo(file, THUMBNAIL_RESIZE_OPTIONS, {\n name: `thumbnail_${file.name}`,\n hash: `thumbnail_${file.hash}`,\n });\n }\n\n return null;\n};\n\n/**\n * Optimize image by:\n * - auto orienting image based on EXIF data\n * - reduce image quality\n *\n */\nconst optimize = async (file: UploadableFile) => {\n const { sizeOptimization = false, autoOrientation = false } =\n (await getService('upload').getSettings()) ?? {};\n\n const { format, size } = await getMetadata(file);\n\n if ((sizeOptimization || autoOrientation) && isOptimizableFormat(format)) {\n let transformer;\n if (!file.filepath) {\n transformer = sharp();\n } else {\n transformer = sharp(file.filepath);\n }\n // reduce image quality\n transformer[format]({ quality: sizeOptimization ? 80 : 100 });\n // rotate image based on EXIF data\n if (autoOrientation) {\n transformer.rotate();\n }\n const filePath = file.tmpWorkingDirectory\n ? join(file.tmpWorkingDirectory, `optimized-${file.hash}`)\n : `optimized-${file.hash}`;\n\n let newInfo;\n if (!file.filepath) {\n transformer.on('info', (info) => {\n newInfo = info;\n });\n\n await writeStreamToFile(file.getStream().pipe(transformer), filePath);\n } else {\n newInfo = await transformer.toFile(filePath);\n }\n\n const { width: newWidth, height: newHeight, size: newSize } = newInfo ?? {};\n\n const newFile = { ...file };\n\n newFile.getStream = () => fs.createReadStream(filePath);\n newFile.filepath = filePath;\n\n if (newSize && size && newSize > size) {\n // Ignore optimization if output is bigger than original\n return file;\n }\n\n return Object.assign(newFile, {\n width: newWidth,\n height: newHeight,\n size: newSize ? bytesToKbytes(newSize) : 0,\n sizeInBytes: newSize,\n });\n }\n\n return file;\n};\n\nconst DEFAULT_BREAKPOINTS = {\n large: 1000,\n medium: 750,\n small: 500,\n};\n\nconst getBreakpoints = () =>\n strapi.config.get<Record<string, number>>('plugin::upload.breakpoints', DEFAULT_BREAKPOINTS);\n\nconst generateResponsiveFormats = async (file: UploadableFile) => {\n const { responsiveDimensions = false } = (await getService('upload').getSettings()) ?? {};\n\n if (!responsiveDimensions) return [];\n\n const originalDimensions = await getDimensions(file);\n\n const breakpoints = getBreakpoints();\n return Promise.all(\n Object.keys(breakpoints).map((key) => {\n const breakpoint = breakpoints[key];\n\n if (breakpointSmallerThan(breakpoint, originalDimensions)) {\n return generateBreakpoint(key, { file, breakpoint });\n }\n\n return undefined;\n })\n );\n};\n\nconst generateBreakpoint = async (\n key: string,\n { file, breakpoint }: { file: UploadableFile; breakpoint: number }\n) => {\n const newFile = await resizeFileTo(\n file,\n {\n width: breakpoint,\n height: breakpoint,\n fit: 'inside',\n },\n {\n name: `${key}_${file.name}`,\n hash: `${key}_${file.hash}`,\n }\n );\n return {\n key,\n file: newFile,\n };\n};\n\nconst breakpointSmallerThan = (breakpoint: number, { width, height }: Dimensions) => {\n return breakpoint < (width ?? 0) || breakpoint < (height ?? 0);\n};\n\n/**\n * Applies a simple image transformation to see if the image is faulty/corrupted.\n */\nconst isFaultyImage = async (file: UploadableFile) => {\n if (!file.filepath) {\n return new Promise((resolve, reject) => {\n const pipeline = sharp();\n pipeline.stats().then(resolve).catch(reject);\n file.getStream().pipe(pipeline);\n });\n }\n\n try {\n await sharp(file.filepath).stats();\n return false;\n } catch (e) {\n return true;\n }\n};\n\nconst isOptimizableImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_OPTIMIZE.includes(format);\n};\n\nconst isResizableImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_RESIZE.includes(format);\n};\n\nconst isImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_PROCESS.includes(format);\n};\n\nconst generateFileName = (name: string) => {\n const randomSuffix = () => crypto.randomBytes(5).toString('hex');\n const baseName = strings.nameToSlug(name, { separator: '_', lowercase: false });\n\n return `${baseName}_${randomSuffix()}`;\n};\n\nexport default {\n isFaultyImage,\n isOptimizableImage,\n isResizableImage,\n isImage,\n getDimensions,\n generateResponsiveFormats,\n generateThumbnail,\n optimize,\n generateFileName,\n};\n"],"names":["bytesToKbytes","fileUtils","FORMATS_TO_RESIZE","FORMATS_TO_PROCESS","FORMATS_TO_OPTIMIZE","isOptimizableFormat","format","undefined","includes","writeStreamToFile","stream","path","Promise","resolve","reject","writeStream","fs","createWriteStream","on","pipe","getMetadata","file","filepath","pipeline","sharp","metadata","then","catch","getStream","getDimensions","width","height","THUMBNAIL_RESIZE_OPTIONS","fit","resizeFileTo","options","name","hash","filePath","tmpWorkingDirectory","join","newInfo","transform","resize","info","toFile","size","newFile","ext","mime","createReadStream","Object","assign","sizeInBytes","generateThumbnail","optimize","sizeOptimization","autoOrientation","getService","getSettings","transformer","quality","rotate","newWidth","newHeight","newSize","DEFAULT_BREAKPOINTS","large","medium","small","getBreakpoints","strapi","config","get","generateResponsiveFormats","responsiveDimensions","originalDimensions","breakpoints","all","keys","map","key","breakpoint","breakpointSmallerThan","generateBreakpoint","isFaultyImage","stats","e","isOptimizableImage","isResizableImage","isImage","generateFileName","randomSuffix","crypto","randomBytes","toString","baseName","strings","nameToSlug","separator","lowercase"],"mappings":";;;;;;;;;AAeA,MAAM,EAAEA,aAAa,EAAE,GAAGC,UAAAA;AAE1B,MAAMC,iBAAAA,GAAoB;AAAC,IAAA,MAAA;AAAQ,IAAA,KAAA;AAAO,IAAA,MAAA;AAAQ,IAAA,MAAA;AAAQ,IAAA;AAAM,CAAA;AAChE,MAAMC,kBAAAA,GAAqB;AAAC,IAAA,MAAA;AAAQ,IAAA,KAAA;AAAO,IAAA,MAAA;AAAQ,IAAA,MAAA;AAAQ,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA;AAAO,CAAA;AAChF,MAAMC,mBAAAA,GAAsB;AAAC,IAAA,MAAA;AAAQ,IAAA,KAAA;AAAO,IAAA,MAAA;AAAQ,IAAA,MAAA;AAAQ,IAAA;AAAO,CAAA;AAEnE,MAAMC,sBAAsB,CAC1BC,MAAAA,GAEAA,WAAWC,SAAAA,IAAaH,mBAAAA,CAAoBI,QAAQ,CAACF,MAAAA,CAAAA;AAEvD,MAAMG,oBAAoB,CAACC,MAAAA,EAAgCC,OACzD,IAAIC,OAAAA,CAAc,CAACC,OAAAA,EAASC,MAAAA,GAAAA;QAC1B,MAAMC,WAAAA,GAAcC,EAAAA,CAAGC,iBAAiB,CAACN,IAAAA,CAAAA;;QAEzCD,MAAAA,CAAOQ,EAAE,CAAC,OAAA,EAASJ,MAAAA,CAAAA;AACnBJ,QAAAA,MAAAA,CAAOS,IAAI,CAACJ,WAAAA,CAAAA;QACZA,WAAAA,CAAYG,EAAE,CAAC,OAAA,EAAS,IAAML,OAAAA,EAAAA,CAAAA;QAC9BE,WAAAA,CAAYG,EAAE,CAAC,OAAA,EAASJ,MAAAA,CAAAA;AAC1B,IAAA,CAAA,CAAA;AAEF,MAAMM,cAAc,CAACC,IAAAA,GAAAA;IACnB,IAAI,CAACA,IAAAA,CAAKC,QAAQ,EAAE;QAClB,OAAO,IAAIV,OAAAA,CAAQ,CAACC,OAAAA,EAASC,MAAAA,GAAAA;AAC3B,YAAA,MAAMS,QAAAA,GAAWC,KAAAA,EAAAA;AACjBD,YAAAA,QAAAA,CAASE,QAAQ,EAAA,CAAGC,IAAI,CAACb,OAAAA,CAAAA,CAASc,KAAK,CAACb,MAAAA,CAAAA;YACxCO,IAAAA,CAAKO,SAAS,EAAA,CAAGT,IAAI,CAACI,QAAAA,CAAAA;AACxB,QAAA,CAAA,CAAA;AACF,IAAA;AAEA,IAAA,OAAOC,KAAAA,CAAMH,IAAAA,CAAKC,QAAQ,CAAA,CAAEG,QAAQ,EAAA;AACtC,CAAA;AAEA,MAAMI,gBAAgB,OAAOR,IAAAA,GAAAA;IAC3B,MAAM,EAAES,QAAQ,IAAI,EAAEC,SAAS,IAAI,EAAE,GAAG,MAAMX,WAAAA,CAAYC,IAAAA,CAAAA;IAE1D,OAAO;AAAES,QAAAA,KAAAA;AAAOC,QAAAA;AAAO,KAAA;AACzB,CAAA;AAEA,MAAMC,wBAAAA,GAA2B;IAC/BF,KAAAA,EAAO,GAAA;IACPC,MAAAA,EAAQ,GAAA;IACRE,GAAAA,EAAK;AACP,CAAA;AAEA,MAAMC,YAAAA,GAAe,OACnBb,IAAAA,EACAc,OAAAA,EACA,EACEC,IAAI,EACJC,IAAI,EAIL,GAAA;IAED,MAAMC,QAAAA,GAAWjB,KAAKkB,mBAAmB,GAAGC,UAAKnB,IAAAA,CAAKkB,mBAAmB,EAAEF,IAAAA,CAAAA,GAAQA,IAAAA;IAEnF,IAAII,OAAAA;IACJ,IAAI,CAACpB,IAAAA,CAAKC,QAAQ,EAAE;QAClB,MAAMoB,SAAAA,GAAYlB,QACfmB,MAAM,CAACR,SACPjB,EAAE,CAAC,QAAQ,CAAC0B,IAAAA,GAAAA;YACXH,OAAAA,GAAUG,IAAAA;AACZ,QAAA,CAAA,CAAA;AAEF,QAAA,MAAMnC,kBAAkBY,IAAAA,CAAKO,SAAS,EAAA,CAAGT,IAAI,CAACuB,SAAAA,CAAAA,EAAYJ,QAAAA,CAAAA;IAC5D,CAAA,MAAO;QACLG,OAAAA,GAAU,MAAMjB,MAAMH,IAAAA,CAAKC,QAAQ,EAAEqB,MAAM,CAACR,OAAAA,CAAAA,CAASU,MAAM,CAACP,QAAAA,CAAAA;AAC9D,IAAA;IAEA,MAAM,EAAER,KAAK,EAAEC,MAAM,EAAEe,IAAI,EAAE,GAAGL,OAAAA,IAAW,EAAC;AAE5C,IAAA,MAAMM,OAAAA,GAA0B;AAC9BX,QAAAA,IAAAA;AACAC,QAAAA,IAAAA;AACAW,QAAAA,GAAAA,EAAK3B,KAAK2B,GAAG;AACbC,QAAAA,IAAAA,EAAM5B,KAAK4B,IAAI;QACf3B,QAAAA,EAAUgB,QAAAA;QACV3B,IAAAA,EAAMU,IAAAA,CAAKV,IAAI,IAAI,IAAA;QACnBiB,SAAAA,EAAW,IAAMZ,EAAAA,CAAGkC,gBAAgB,CAACZ,QAAAA;AACvC,KAAA;IAEAa,MAAAA,CAAOC,MAAM,CAACL,OAAAA,EAAS;AACrBjB,QAAAA,KAAAA;AACAC,QAAAA,MAAAA;QACAe,IAAAA,EAAMA,IAAAA,GAAO9C,cAAc8C,IAAAA,CAAAA,GAAQ,CAAA;QACnCO,WAAAA,EAAaP;AACf,KAAA,CAAA;IACA,OAAOC,OAAAA;AACT,CAAA;AAEA,MAAMO,oBAAoB,OAAOjC,IAAAA,GAAAA;AAC/B,IAAA,IACEA,KAAKS,KAAK,IACVT,KAAKU,MAAM,KACVV,IAAAA,CAAKS,KAAK,GAAGE,wBAAAA,CAAyBF,KAAK,IAAIT,IAAAA,CAAKU,MAAM,GAAGC,wBAAAA,CAAyBD,MAAM,CAAD,EAC5F;QACA,OAAOG,YAAAA,CAAab,MAAMW,wBAAAA,EAA0B;AAClDI,YAAAA,IAAAA,EAAM,CAAC,UAAU,EAAEf,IAAAA,CAAKe,IAAI,CAAA,CAAE;AAC9BC,YAAAA,IAAAA,EAAM,CAAC,UAAU,EAAEhB,IAAAA,CAAKgB,IAAI,CAAA;AAC9B,SAAA,CAAA;AACF,IAAA;IAEA,OAAO,IAAA;AACT,CAAA;AAEA;;;;;IAMA,MAAMkB,WAAW,OAAOlC,IAAAA,GAAAA;AACtB,IAAA,MAAM,EAAEmC,gBAAAA,GAAmB,KAAK,EAAEC,kBAAkB,KAAK,EAAE,GACxD,MAAMC,gBAAAA,CAAW,QAAA,CAAA,CAAUC,WAAW,MAAO,EAAC;AAEjD,IAAA,MAAM,EAAErD,MAAM,EAAEwC,IAAI,EAAE,GAAG,MAAM1B,WAAAA,CAAYC,IAAAA,CAAAA;AAE3C,IAAA,IAAI,CAACmC,gBAAAA,IAAoBC,eAAc,KAAMpD,oBAAoBC,MAAAA,CAAAA,EAAS;QACxE,IAAIsD,WAAAA;QACJ,IAAI,CAACvC,IAAAA,CAAKC,QAAQ,EAAE;YAClBsC,WAAAA,GAAcpC,KAAAA,EAAAA;QAChB,CAAA,MAAO;YACLoC,WAAAA,GAAcpC,KAAAA,CAAMH,KAAKC,QAAQ,CAAA;AACnC,QAAA;;QAEAsC,WAAW,CAACtD,OAAO,CAAC;AAAEuD,YAAAA,OAAAA,EAASL,mBAAmB,EAAA,GAAK;AAAI,SAAA,CAAA;;AAE3D,QAAA,IAAIC,eAAAA,EAAiB;AACnBG,YAAAA,WAAAA,CAAYE,MAAM,EAAA;AACpB,QAAA;QACA,MAAMxB,QAAAA,GAAWjB,KAAKkB,mBAAmB,GACrCC,UAAKnB,IAAAA,CAAKkB,mBAAmB,EAAE,CAAC,UAAU,EAAElB,IAAAA,CAAKgB,IAAI,EAAE,CAAA,GACvD,CAAC,UAAU,EAAEhB,IAAAA,CAAKgB,IAAI,CAAA,CAAE;QAE5B,IAAII,OAAAA;QACJ,IAAI,CAACpB,IAAAA,CAAKC,QAAQ,EAAE;YAClBsC,WAAAA,CAAY1C,EAAE,CAAC,MAAA,EAAQ,CAAC0B,IAAAA,GAAAA;gBACtBH,OAAAA,GAAUG,IAAAA;AACZ,YAAA,CAAA,CAAA;AAEA,YAAA,MAAMnC,kBAAkBY,IAAAA,CAAKO,SAAS,EAAA,CAAGT,IAAI,CAACyC,WAAAA,CAAAA,EAActB,QAAAA,CAAAA;QAC9D,CAAA,MAAO;YACLG,OAAAA,GAAU,MAAMmB,WAAAA,CAAYf,MAAM,CAACP,QAAAA,CAAAA;AACrC,QAAA;AAEA,QAAA,MAAM,EAAER,KAAAA,EAAOiC,QAAQ,EAAEhC,MAAAA,EAAQiC,SAAS,EAAElB,IAAAA,EAAMmB,OAAO,EAAE,GAAGxB,OAAAA,IAAW,EAAC;AAE1E,QAAA,MAAMM,OAAAA,GAAU;AAAE,YAAA,GAAG1B;AAAK,SAAA;AAE1B0B,QAAAA,OAAAA,CAAQnB,SAAS,GAAG,IAAMZ,EAAAA,CAAGkC,gBAAgB,CAACZ,QAAAA,CAAAA;AAC9CS,QAAAA,OAAAA,CAAQzB,QAAQ,GAAGgB,QAAAA;QAEnB,IAAI2B,OAAAA,IAAWnB,IAAAA,IAAQmB,OAAAA,GAAUnB,IAAAA,EAAM;;YAErC,OAAOzB,IAAAA;AACT,QAAA;QAEA,OAAO8B,MAAAA,CAAOC,MAAM,CAACL,OAAAA,EAAS;YAC5BjB,KAAAA,EAAOiC,QAAAA;YACPhC,MAAAA,EAAQiC,SAAAA;YACRlB,IAAAA,EAAMmB,OAAAA,GAAUjE,cAAciE,OAAAA,CAAAA,GAAW,CAAA;YACzCZ,WAAAA,EAAaY;AACf,SAAA,CAAA;AACF,IAAA;IAEA,OAAO5C,IAAAA;AACT,CAAA;AAEA,MAAM6C,mBAAAA,GAAsB;IAC1BC,KAAAA,EAAO,IAAA;IACPC,MAAAA,EAAQ,GAAA;IACRC,KAAAA,EAAO;AACT,CAAA;AAEA,MAAMC,iBAAiB,IACrBC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAyB,4BAAA,EAA8BP,mBAAAA,CAAAA;AAE1E,MAAMQ,4BAA4B,OAAOrD,IAAAA,GAAAA;IACvC,MAAM,EAAEsD,oBAAAA,GAAuB,KAAK,EAAE,GAAG,MAAOjB,gBAAAA,CAAW,QAAA,CAAA,CAAUC,WAAW,EAAA,IAAO,EAAC;IAExF,IAAI,CAACgB,oBAAAA,EAAsB,OAAO,EAAE;IAEpC,MAAMC,kBAAAA,GAAqB,MAAM/C,aAAAA,CAAcR,IAAAA,CAAAA;AAE/C,IAAA,MAAMwD,WAAAA,GAAcP,cAAAA,EAAAA;IACpB,OAAO1D,OAAAA,CAAQkE,GAAG,CAChB3B,MAAAA,CAAO4B,IAAI,CAACF,WAAAA,CAAAA,CAAaG,GAAG,CAAC,CAACC,GAAAA,GAAAA;QAC5B,MAAMC,UAAAA,GAAaL,WAAW,CAACI,GAAAA,CAAI;QAEnC,IAAIE,qBAAAA,CAAsBD,YAAYN,kBAAAA,CAAAA,EAAqB;AACzD,YAAA,OAAOQ,mBAAmBH,GAAAA,EAAK;AAAE5D,gBAAAA,IAAAA;AAAM6D,gBAAAA;AAAW,aAAA,CAAA;AACpD,QAAA;QAEA,OAAO3E,SAAAA;AACT,IAAA,CAAA,CAAA,CAAA;AAEJ,CAAA;AAEA,MAAM6E,qBAAqB,OACzBH,GAAAA,EACA,EAAE5D,IAAI,EAAE6D,UAAU,EAAgD,GAAA;IAElE,MAAMnC,OAAAA,GAAU,MAAMb,YAAAA,CACpBb,IAAAA,EACA;QACES,KAAAA,EAAOoD,UAAAA;QACPnD,MAAAA,EAAQmD,UAAAA;QACRjD,GAAAA,EAAK;KACP,EACA;AACEG,QAAAA,IAAAA,EAAM,GAAG6C,GAAAA,CAAI,CAAC,EAAE5D,IAAAA,CAAKe,IAAI,CAAA,CAAE;AAC3BC,QAAAA,IAAAA,EAAM,GAAG4C,GAAAA,CAAI,CAAC,EAAE5D,IAAAA,CAAKgB,IAAI,CAAA;AAC3B,KAAA,CAAA;IAEF,OAAO;AACL4C,QAAAA,GAAAA;QACA5D,IAAAA,EAAM0B;AACR,KAAA;AACF,CAAA;AAEA,MAAMoC,wBAAwB,CAACD,UAAAA,EAAoB,EAAEpD,KAAK,EAAEC,MAAM,EAAc,GAAA;IAC9E,OAAOmD,UAAAA,IAAcpD,KAAAA,IAAS,CAAA,KAAMoD,UAAAA,IAAcnD,UAAU,CAAA,CAAA;AAC9D,CAAA;AAEA;;IAGA,MAAMsD,gBAAgB,OAAOhE,IAAAA,GAAAA;IAC3B,IAAI,CAACA,IAAAA,CAAKC,QAAQ,EAAE;QAClB,OAAO,IAAIV,OAAAA,CAAQ,CAACC,OAAAA,EAASC,MAAAA,GAAAA;AAC3B,YAAA,MAAMS,QAAAA,GAAWC,KAAAA,EAAAA;AACjBD,YAAAA,QAAAA,CAAS+D,KAAK,EAAA,CAAG5D,IAAI,CAACb,OAAAA,CAAAA,CAASc,KAAK,CAACb,MAAAA,CAAAA;YACrCO,IAAAA,CAAKO,SAAS,EAAA,CAAGT,IAAI,CAACI,QAAAA,CAAAA;AACxB,QAAA,CAAA,CAAA;AACF,IAAA;IAEA,IAAI;AACF,QAAA,MAAMC,KAAAA,CAAMH,IAAAA,CAAKC,QAAQ,CAAA,CAAEgE,KAAK,EAAA;QAChC,OAAO,KAAA;AACT,IAAA,CAAA,CAAE,OAAOC,CAAAA,EAAG;QACV,OAAO,IAAA;AACT,IAAA;AACF,CAAA;AAEA,MAAMC,qBAAqB,OAAOnE,IAAAA,GAAAA;IAChC,IAAIf,MAAAA;IACJ,IAAI;QACF,MAAMmB,QAAAA,GAAW,MAAML,WAAAA,CAAYC,IAAAA,CAAAA;AACnCf,QAAAA,MAAAA,GAASmB,SAASnB,MAAM;AAC1B,IAAA,CAAA,CAAE,OAAOiF,CAAAA,EAAG;;QAEV,OAAO,KAAA;AACT,IAAA;IACA,OAAOjF,MAAAA,IAAUF,mBAAAA,CAAoBI,QAAQ,CAACF,MAAAA,CAAAA;AAChD,CAAA;AAEA,MAAMmF,mBAAmB,OAAOpE,IAAAA,GAAAA;IAC9B,IAAIf,MAAAA;IACJ,IAAI;QACF,MAAMmB,QAAAA,GAAW,MAAML,WAAAA,CAAYC,IAAAA,CAAAA;AACnCf,QAAAA,MAAAA,GAASmB,SAASnB,MAAM;AAC1B,IAAA,CAAA,CAAE,OAAOiF,CAAAA,EAAG;;QAEV,OAAO,KAAA;AACT,IAAA;IACA,OAAOjF,MAAAA,IAAUJ,iBAAAA,CAAkBM,QAAQ,CAACF,MAAAA,CAAAA;AAC9C,CAAA;AAEA,MAAMoF,UAAU,OAAOrE,IAAAA,GAAAA;IACrB,IAAIf,MAAAA;IACJ,IAAI;QACF,MAAMmB,QAAAA,GAAW,MAAML,WAAAA,CAAYC,IAAAA,CAAAA;AACnCf,QAAAA,MAAAA,GAASmB,SAASnB,MAAM;AAC1B,IAAA,CAAA,CAAE,OAAOiF,CAAAA,EAAG;;QAEV,OAAO,KAAA;AACT,IAAA;IACA,OAAOjF,MAAAA,IAAUH,kBAAAA,CAAmBK,QAAQ,CAACF,MAAAA,CAAAA;AAC/C,CAAA;AAEA,MAAMqF,mBAAmB,CAACvD,IAAAA,GAAAA;AACxB,IAAA,MAAMwD,eAAe,IAAMC,MAAAA,CAAOC,WAAW,CAAC,CAAA,CAAA,CAAGC,QAAQ,CAAC,KAAA,CAAA;AAC1D,IAAA,MAAMC,QAAAA,GAAWC,aAAAA,CAAQC,UAAU,CAAC9D,IAAAA,EAAM;QAAE+D,SAAAA,EAAW,GAAA;QAAKC,SAAAA,EAAW;AAAM,KAAA,CAAA;AAE7E,IAAA,OAAO,CAAA,EAAGJ,QAAAA,CAAS,CAAC,EAAEJ,YAAAA,EAAAA,CAAAA,CAAgB;AACxC,CAAA;AAEA,wBAAe;AACbP,IAAAA,aAAAA;AACAG,IAAAA,kBAAAA;AACAC,IAAAA,gBAAAA;AACAC,IAAAA,OAAAA;AACA7D,IAAAA,aAAAA;AACA6C,IAAAA,yBAAAA;AACApB,IAAAA,iBAAAA;AACAC,IAAAA,QAAAA;AACAoC,IAAAA;AACF,CAAA;;;;"}
@@ -2,7 +2,7 @@ import fs from 'fs';
2
2
  import { join } from 'path';
3
3
  import sharp from 'sharp';
4
4
  import crypto from 'crypto';
5
- import { strings, file } from '@strapi/utils';
5
+ import { file, strings } from '@strapi/utils';
6
6
  import { getService } from '../utils/index.mjs';
7
7
 
8
8
  const { bytesToKbytes } = file;
@@ -1 +1 @@
1
- {"version":3,"file":"image-manipulation.mjs","sources":["../../../server/src/services/image-manipulation.ts"],"sourcesContent":["import fs from 'fs';\nimport { join } from 'path';\nimport sharp from 'sharp';\nimport crypto from 'crypto';\nimport { strings, file as fileUtils } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nimport type { UploadableFile } from '../types';\n\ntype Dimensions = {\n width: number | null;\n height: number | null;\n};\n\nconst { bytesToKbytes } = fileUtils;\n\nconst FORMATS_TO_RESIZE = ['jpeg', 'png', 'webp', 'tiff', 'gif'];\nconst FORMATS_TO_PROCESS = ['jpeg', 'png', 'webp', 'tiff', 'svg', 'gif', 'avif'];\nconst FORMATS_TO_OPTIMIZE = ['jpeg', 'png', 'webp', 'tiff', 'avif'];\n\nconst isOptimizableFormat = (\n format: string | undefined\n): format is 'jpeg' | 'png' | 'webp' | 'tiff' | 'avif' =>\n format !== undefined && FORMATS_TO_OPTIMIZE.includes(format);\n\nconst writeStreamToFile = (stream: NodeJS.ReadWriteStream, path: string) =>\n new Promise<void>((resolve, reject) => {\n const writeStream = fs.createWriteStream(path);\n // Reject promise if there is an error with the provided stream\n stream.on('error', reject);\n stream.pipe(writeStream);\n writeStream.on('close', () => resolve());\n writeStream.on('error', reject);\n });\n\nconst getMetadata = (file: UploadableFile): Promise<sharp.Metadata> => {\n if (!file.filepath) {\n return new Promise((resolve, reject) => {\n const pipeline = sharp();\n pipeline.metadata().then(resolve).catch(reject);\n file.getStream().pipe(pipeline);\n });\n }\n\n return sharp(file.filepath).metadata();\n};\n\nconst getDimensions = async (file: UploadableFile): Promise<Dimensions> => {\n const { width = null, height = null } = await getMetadata(file);\n\n return { width, height };\n};\n\nconst THUMBNAIL_RESIZE_OPTIONS = {\n width: 245,\n height: 156,\n fit: 'inside',\n} satisfies sharp.ResizeOptions;\n\nconst resizeFileTo = async (\n file: UploadableFile,\n options: sharp.ResizeOptions,\n {\n name,\n hash,\n }: {\n name: string;\n hash: string;\n }\n) => {\n const filePath = file.tmpWorkingDirectory ? join(file.tmpWorkingDirectory, hash) : hash;\n\n let newInfo;\n if (!file.filepath) {\n const transform = sharp()\n .resize(options)\n .on('info', (info) => {\n newInfo = info;\n });\n\n await writeStreamToFile(file.getStream().pipe(transform), filePath);\n } else {\n newInfo = await sharp(file.filepath).resize(options).toFile(filePath);\n }\n\n const { width, height, size } = newInfo ?? {};\n\n const newFile: UploadableFile = {\n name,\n hash,\n ext: file.ext,\n mime: file.mime,\n filepath: filePath,\n path: file.path || null,\n getStream: () => fs.createReadStream(filePath),\n };\n\n Object.assign(newFile, {\n width,\n height,\n size: size ? bytesToKbytes(size) : 0,\n sizeInBytes: size,\n });\n return newFile;\n};\n\nconst generateThumbnail = async (file: UploadableFile) => {\n if (\n file.width &&\n file.height &&\n (file.width > THUMBNAIL_RESIZE_OPTIONS.width || file.height > THUMBNAIL_RESIZE_OPTIONS.height)\n ) {\n return resizeFileTo(file, THUMBNAIL_RESIZE_OPTIONS, {\n name: `thumbnail_${file.name}`,\n hash: `thumbnail_${file.hash}`,\n });\n }\n\n return null;\n};\n\n/**\n * Optimize image by:\n * - auto orienting image based on EXIF data\n * - reduce image quality\n *\n */\nconst optimize = async (file: UploadableFile) => {\n const { sizeOptimization = false, autoOrientation = false } =\n (await getService('upload').getSettings()) ?? {};\n\n const { format, size } = await getMetadata(file);\n\n if ((sizeOptimization || autoOrientation) && isOptimizableFormat(format)) {\n let transformer;\n if (!file.filepath) {\n transformer = sharp();\n } else {\n transformer = sharp(file.filepath);\n }\n // reduce image quality\n transformer[format]({ quality: sizeOptimization ? 80 : 100 });\n // rotate image based on EXIF data\n if (autoOrientation) {\n transformer.rotate();\n }\n const filePath = file.tmpWorkingDirectory\n ? join(file.tmpWorkingDirectory, `optimized-${file.hash}`)\n : `optimized-${file.hash}`;\n\n let newInfo;\n if (!file.filepath) {\n transformer.on('info', (info) => {\n newInfo = info;\n });\n\n await writeStreamToFile(file.getStream().pipe(transformer), filePath);\n } else {\n newInfo = await transformer.toFile(filePath);\n }\n\n const { width: newWidth, height: newHeight, size: newSize } = newInfo ?? {};\n\n const newFile = { ...file };\n\n newFile.getStream = () => fs.createReadStream(filePath);\n newFile.filepath = filePath;\n\n if (newSize && size && newSize > size) {\n // Ignore optimization if output is bigger than original\n return file;\n }\n\n return Object.assign(newFile, {\n width: newWidth,\n height: newHeight,\n size: newSize ? bytesToKbytes(newSize) : 0,\n sizeInBytes: newSize,\n });\n }\n\n return file;\n};\n\nconst DEFAULT_BREAKPOINTS = {\n large: 1000,\n medium: 750,\n small: 500,\n};\n\nconst getBreakpoints = () =>\n strapi.config.get<Record<string, number>>('plugin::upload.breakpoints', DEFAULT_BREAKPOINTS);\n\nconst generateResponsiveFormats = async (file: UploadableFile) => {\n const { responsiveDimensions = false } = (await getService('upload').getSettings()) ?? {};\n\n if (!responsiveDimensions) return [];\n\n const originalDimensions = await getDimensions(file);\n\n const breakpoints = getBreakpoints();\n return Promise.all(\n Object.keys(breakpoints).map((key) => {\n const breakpoint = breakpoints[key];\n\n if (breakpointSmallerThan(breakpoint, originalDimensions)) {\n return generateBreakpoint(key, { file, breakpoint });\n }\n\n return undefined;\n })\n );\n};\n\nconst generateBreakpoint = async (\n key: string,\n { file, breakpoint }: { file: UploadableFile; breakpoint: number }\n) => {\n const newFile = await resizeFileTo(\n file,\n {\n width: breakpoint,\n height: breakpoint,\n fit: 'inside',\n },\n {\n name: `${key}_${file.name}`,\n hash: `${key}_${file.hash}`,\n }\n );\n return {\n key,\n file: newFile,\n };\n};\n\nconst breakpointSmallerThan = (breakpoint: number, { width, height }: Dimensions) => {\n return breakpoint < (width ?? 0) || breakpoint < (height ?? 0);\n};\n\n/**\n * Applies a simple image transformation to see if the image is faulty/corrupted.\n */\nconst isFaultyImage = async (file: UploadableFile) => {\n if (!file.filepath) {\n return new Promise((resolve, reject) => {\n const pipeline = sharp();\n pipeline.stats().then(resolve).catch(reject);\n file.getStream().pipe(pipeline);\n });\n }\n\n try {\n await sharp(file.filepath).stats();\n return false;\n } catch (e) {\n return true;\n }\n};\n\nconst isOptimizableImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_OPTIMIZE.includes(format);\n};\n\nconst isResizableImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_RESIZE.includes(format);\n};\n\nconst isImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_PROCESS.includes(format);\n};\n\nconst generateFileName = (name: string) => {\n const randomSuffix = () => crypto.randomBytes(5).toString('hex');\n const baseName = strings.nameToSlug(name, { separator: '_', lowercase: false });\n\n return `${baseName}_${randomSuffix()}`;\n};\n\nexport default {\n isFaultyImage,\n isOptimizableImage,\n isResizableImage,\n isImage,\n getDimensions,\n generateResponsiveFormats,\n generateThumbnail,\n optimize,\n generateFileName,\n};\n"],"names":["bytesToKbytes","fileUtils","FORMATS_TO_RESIZE","FORMATS_TO_PROCESS","FORMATS_TO_OPTIMIZE","isOptimizableFormat","format","undefined","includes","writeStreamToFile","stream","path","Promise","resolve","reject","writeStream","fs","createWriteStream","on","pipe","getMetadata","file","filepath","pipeline","sharp","metadata","then","catch","getStream","getDimensions","width","height","THUMBNAIL_RESIZE_OPTIONS","fit","resizeFileTo","options","name","hash","filePath","tmpWorkingDirectory","join","newInfo","transform","resize","info","toFile","size","newFile","ext","mime","createReadStream","Object","assign","sizeInBytes","generateThumbnail","optimize","sizeOptimization","autoOrientation","getService","getSettings","transformer","quality","rotate","newWidth","newHeight","newSize","DEFAULT_BREAKPOINTS","large","medium","small","getBreakpoints","strapi","config","get","generateResponsiveFormats","responsiveDimensions","originalDimensions","breakpoints","all","keys","map","key","breakpoint","breakpointSmallerThan","generateBreakpoint","isFaultyImage","stats","e","isOptimizableImage","isResizableImage","isImage","generateFileName","randomSuffix","crypto","randomBytes","toString","baseName","strings","nameToSlug","separator","lowercase"],"mappings":"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"}
1
+ {"version":3,"file":"image-manipulation.mjs","sources":["../../../server/src/services/image-manipulation.ts"],"sourcesContent":["import fs from 'fs';\nimport { join } from 'path';\nimport sharp from 'sharp';\nimport crypto from 'crypto';\nimport { strings, file as fileUtils } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nimport type { UploadableFile } from '../types';\n\ntype Dimensions = {\n width: number | null;\n height: number | null;\n};\n\nconst { bytesToKbytes } = fileUtils;\n\nconst FORMATS_TO_RESIZE = ['jpeg', 'png', 'webp', 'tiff', 'gif'];\nconst FORMATS_TO_PROCESS = ['jpeg', 'png', 'webp', 'tiff', 'svg', 'gif', 'avif'];\nconst FORMATS_TO_OPTIMIZE = ['jpeg', 'png', 'webp', 'tiff', 'avif'];\n\nconst isOptimizableFormat = (\n format: string | undefined\n): format is 'jpeg' | 'png' | 'webp' | 'tiff' | 'avif' =>\n format !== undefined && FORMATS_TO_OPTIMIZE.includes(format);\n\nconst writeStreamToFile = (stream: NodeJS.ReadWriteStream, path: string) =>\n new Promise<void>((resolve, reject) => {\n const writeStream = fs.createWriteStream(path);\n // Reject promise if there is an error with the provided stream\n stream.on('error', reject);\n stream.pipe(writeStream);\n writeStream.on('close', () => resolve());\n writeStream.on('error', reject);\n });\n\nconst getMetadata = (file: UploadableFile): Promise<sharp.Metadata> => {\n if (!file.filepath) {\n return new Promise((resolve, reject) => {\n const pipeline = sharp();\n pipeline.metadata().then(resolve).catch(reject);\n file.getStream().pipe(pipeline);\n });\n }\n\n return sharp(file.filepath).metadata();\n};\n\nconst getDimensions = async (file: UploadableFile): Promise<Dimensions> => {\n const { width = null, height = null } = await getMetadata(file);\n\n return { width, height };\n};\n\nconst THUMBNAIL_RESIZE_OPTIONS = {\n width: 245,\n height: 156,\n fit: 'inside',\n} satisfies sharp.ResizeOptions;\n\nconst resizeFileTo = async (\n file: UploadableFile,\n options: sharp.ResizeOptions,\n {\n name,\n hash,\n }: {\n name: string;\n hash: string;\n }\n) => {\n const filePath = file.tmpWorkingDirectory ? join(file.tmpWorkingDirectory, hash) : hash;\n\n let newInfo;\n if (!file.filepath) {\n const transform = sharp()\n .resize(options)\n .on('info', (info) => {\n newInfo = info;\n });\n\n await writeStreamToFile(file.getStream().pipe(transform), filePath);\n } else {\n newInfo = await sharp(file.filepath).resize(options).toFile(filePath);\n }\n\n const { width, height, size } = newInfo ?? {};\n\n const newFile: UploadableFile = {\n name,\n hash,\n ext: file.ext,\n mime: file.mime,\n filepath: filePath,\n path: file.path || null,\n getStream: () => fs.createReadStream(filePath),\n };\n\n Object.assign(newFile, {\n width,\n height,\n size: size ? bytesToKbytes(size) : 0,\n sizeInBytes: size,\n });\n return newFile;\n};\n\nconst generateThumbnail = async (file: UploadableFile) => {\n if (\n file.width &&\n file.height &&\n (file.width > THUMBNAIL_RESIZE_OPTIONS.width || file.height > THUMBNAIL_RESIZE_OPTIONS.height)\n ) {\n return resizeFileTo(file, THUMBNAIL_RESIZE_OPTIONS, {\n name: `thumbnail_${file.name}`,\n hash: `thumbnail_${file.hash}`,\n });\n }\n\n return null;\n};\n\n/**\n * Optimize image by:\n * - auto orienting image based on EXIF data\n * - reduce image quality\n *\n */\nconst optimize = async (file: UploadableFile) => {\n const { sizeOptimization = false, autoOrientation = false } =\n (await getService('upload').getSettings()) ?? {};\n\n const { format, size } = await getMetadata(file);\n\n if ((sizeOptimization || autoOrientation) && isOptimizableFormat(format)) {\n let transformer;\n if (!file.filepath) {\n transformer = sharp();\n } else {\n transformer = sharp(file.filepath);\n }\n // reduce image quality\n transformer[format]({ quality: sizeOptimization ? 80 : 100 });\n // rotate image based on EXIF data\n if (autoOrientation) {\n transformer.rotate();\n }\n const filePath = file.tmpWorkingDirectory\n ? join(file.tmpWorkingDirectory, `optimized-${file.hash}`)\n : `optimized-${file.hash}`;\n\n let newInfo;\n if (!file.filepath) {\n transformer.on('info', (info) => {\n newInfo = info;\n });\n\n await writeStreamToFile(file.getStream().pipe(transformer), filePath);\n } else {\n newInfo = await transformer.toFile(filePath);\n }\n\n const { width: newWidth, height: newHeight, size: newSize } = newInfo ?? {};\n\n const newFile = { ...file };\n\n newFile.getStream = () => fs.createReadStream(filePath);\n newFile.filepath = filePath;\n\n if (newSize && size && newSize > size) {\n // Ignore optimization if output is bigger than original\n return file;\n }\n\n return Object.assign(newFile, {\n width: newWidth,\n height: newHeight,\n size: newSize ? bytesToKbytes(newSize) : 0,\n sizeInBytes: newSize,\n });\n }\n\n return file;\n};\n\nconst DEFAULT_BREAKPOINTS = {\n large: 1000,\n medium: 750,\n small: 500,\n};\n\nconst getBreakpoints = () =>\n strapi.config.get<Record<string, number>>('plugin::upload.breakpoints', DEFAULT_BREAKPOINTS);\n\nconst generateResponsiveFormats = async (file: UploadableFile) => {\n const { responsiveDimensions = false } = (await getService('upload').getSettings()) ?? {};\n\n if (!responsiveDimensions) return [];\n\n const originalDimensions = await getDimensions(file);\n\n const breakpoints = getBreakpoints();\n return Promise.all(\n Object.keys(breakpoints).map((key) => {\n const breakpoint = breakpoints[key];\n\n if (breakpointSmallerThan(breakpoint, originalDimensions)) {\n return generateBreakpoint(key, { file, breakpoint });\n }\n\n return undefined;\n })\n );\n};\n\nconst generateBreakpoint = async (\n key: string,\n { file, breakpoint }: { file: UploadableFile; breakpoint: number }\n) => {\n const newFile = await resizeFileTo(\n file,\n {\n width: breakpoint,\n height: breakpoint,\n fit: 'inside',\n },\n {\n name: `${key}_${file.name}`,\n hash: `${key}_${file.hash}`,\n }\n );\n return {\n key,\n file: newFile,\n };\n};\n\nconst breakpointSmallerThan = (breakpoint: number, { width, height }: Dimensions) => {\n return breakpoint < (width ?? 0) || breakpoint < (height ?? 0);\n};\n\n/**\n * Applies a simple image transformation to see if the image is faulty/corrupted.\n */\nconst isFaultyImage = async (file: UploadableFile) => {\n if (!file.filepath) {\n return new Promise((resolve, reject) => {\n const pipeline = sharp();\n pipeline.stats().then(resolve).catch(reject);\n file.getStream().pipe(pipeline);\n });\n }\n\n try {\n await sharp(file.filepath).stats();\n return false;\n } catch (e) {\n return true;\n }\n};\n\nconst isOptimizableImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_OPTIMIZE.includes(format);\n};\n\nconst isResizableImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_RESIZE.includes(format);\n};\n\nconst isImage = async (file: UploadableFile) => {\n let format;\n try {\n const metadata = await getMetadata(file);\n format = metadata.format;\n } catch (e) {\n // throw when the file is not a supported image\n return false;\n }\n return format && FORMATS_TO_PROCESS.includes(format);\n};\n\nconst generateFileName = (name: string) => {\n const randomSuffix = () => crypto.randomBytes(5).toString('hex');\n const baseName = strings.nameToSlug(name, { separator: '_', lowercase: false });\n\n return `${baseName}_${randomSuffix()}`;\n};\n\nexport default {\n isFaultyImage,\n isOptimizableImage,\n isResizableImage,\n isImage,\n getDimensions,\n generateResponsiveFormats,\n generateThumbnail,\n optimize,\n generateFileName,\n};\n"],"names":["bytesToKbytes","fileUtils","FORMATS_TO_RESIZE","FORMATS_TO_PROCESS","FORMATS_TO_OPTIMIZE","isOptimizableFormat","format","undefined","includes","writeStreamToFile","stream","path","Promise","resolve","reject","writeStream","fs","createWriteStream","on","pipe","getMetadata","file","filepath","pipeline","sharp","metadata","then","catch","getStream","getDimensions","width","height","THUMBNAIL_RESIZE_OPTIONS","fit","resizeFileTo","options","name","hash","filePath","tmpWorkingDirectory","join","newInfo","transform","resize","info","toFile","size","newFile","ext","mime","createReadStream","Object","assign","sizeInBytes","generateThumbnail","optimize","sizeOptimization","autoOrientation","getService","getSettings","transformer","quality","rotate","newWidth","newHeight","newSize","DEFAULT_BREAKPOINTS","large","medium","small","getBreakpoints","strapi","config","get","generateResponsiveFormats","responsiveDimensions","originalDimensions","breakpoints","all","keys","map","key","breakpoint","breakpointSmallerThan","generateBreakpoint","isFaultyImage","stats","e","isOptimizableImage","isResizableImage","isImage","generateFileName","randomSuffix","crypto","randomBytes","toString","baseName","strings","nameToSlug","separator","lowercase"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import provider from './provider';\nimport upload from './upload';\nimport imageManipulation from './image-manipulation';\nimport folder from './folder';\nimport file from './file';\nimport weeklyMetrics from './weekly-metrics';\nimport metrics from './metrics';\nimport apiUploadFolder from './api-upload-folder';\nimport extensions from './extensions';\nimport { createAIMetadataService } from './ai-metadata';\nimport { createAIMetadataJobsService } from './ai-metadata-jobs';\n\nexport const services = {\n provider,\n upload,\n folder,\n file,\n weeklyMetrics,\n metrics,\n 'image-manipulation': imageManipulation,\n 'api-upload-folder': apiUploadFolder,\n extensions,\n aiMetadata: createAIMetadataService,\n aiMetadataJobs: createAIMetadataJobsService,\n};\n"],"names":["services","provider","upload","folder","file","weeklyMetrics","metrics","imageManipulation","apiUploadFolder","extensions","aiMetadata","createAIMetadataService","aiMetadataJobs","createAIMetadataJobsService"],"mappings":";;;;;;;;;;;;;;MAYaA,QAAW,GAAA;AACtBC,IAAAA,QAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,aAAAA;AACAC,IAAAA,OAAAA;IACA,oBAAsBC,EAAAA,iBAAAA;IACtB,mBAAqBC,EAAAA,eAAAA;AACrBC,gBAAAA,KAAAA;IACAC,UAAYC,EAAAA,kCAAAA;IACZC,cAAgBC,EAAAA;AAClB;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import provider from './provider';\nimport upload from './upload';\nimport imageManipulation from './image-manipulation';\nimport folder from './folder';\nimport file from './file';\nimport weeklyMetrics from './weekly-metrics';\nimport metrics from './metrics';\nimport apiUploadFolder from './api-upload-folder';\nimport extensions from './extensions';\nimport { createAIMetadataService } from './ai-metadata';\nimport { createAIMetadataJobsService } from './ai-metadata-jobs';\n\nexport const services = {\n provider,\n upload,\n folder,\n file,\n weeklyMetrics,\n metrics,\n 'image-manipulation': imageManipulation,\n 'api-upload-folder': apiUploadFolder,\n extensions,\n aiMetadata: createAIMetadataService,\n aiMetadataJobs: createAIMetadataJobsService,\n};\n"],"names":["services","provider","upload","folder","file","weeklyMetrics","metrics","imageManipulation","apiUploadFolder","extensions","aiMetadata","createAIMetadataService","aiMetadataJobs","createAIMetadataJobsService"],"mappings":";;;;;;;;;;;;;;MAYaA,QAAAA,GAAW;AACtBC,IAAAA,QAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,aAAAA;AACAC,IAAAA,OAAAA;IACA,oBAAA,EAAsBC,iBAAAA;IACtB,mBAAA,EAAqBC,eAAAA;AACrBC,gBAAAA,KAAAA;IACAC,UAAAA,EAAYC,kCAAAA;IACZC,cAAAA,EAAgBC;AAClB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import provider from './provider';\nimport upload from './upload';\nimport imageManipulation from './image-manipulation';\nimport folder from './folder';\nimport file from './file';\nimport weeklyMetrics from './weekly-metrics';\nimport metrics from './metrics';\nimport apiUploadFolder from './api-upload-folder';\nimport extensions from './extensions';\nimport { createAIMetadataService } from './ai-metadata';\nimport { createAIMetadataJobsService } from './ai-metadata-jobs';\n\nexport const services = {\n provider,\n upload,\n folder,\n file,\n weeklyMetrics,\n metrics,\n 'image-manipulation': imageManipulation,\n 'api-upload-folder': apiUploadFolder,\n extensions,\n aiMetadata: createAIMetadataService,\n aiMetadataJobs: createAIMetadataJobsService,\n};\n"],"names":["services","provider","upload","folder","file","weeklyMetrics","metrics","imageManipulation","apiUploadFolder","extensions","aiMetadata","createAIMetadataService","aiMetadataJobs","createAIMetadataJobsService"],"mappings":";;;;;;;;;;;;MAYaA,QAAW,GAAA;AACtBC,IAAAA,QAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,aAAAA;AACAC,IAAAA,OAAAA;IACA,oBAAsBC,EAAAA,iBAAAA;IACtB,mBAAqBC,EAAAA,eAAAA;AACrBC,IAAAA,UAAAA;IACAC,UAAYC,EAAAA,uBAAAA;IACZC,cAAgBC,EAAAA;AAClB;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import provider from './provider';\nimport upload from './upload';\nimport imageManipulation from './image-manipulation';\nimport folder from './folder';\nimport file from './file';\nimport weeklyMetrics from './weekly-metrics';\nimport metrics from './metrics';\nimport apiUploadFolder from './api-upload-folder';\nimport extensions from './extensions';\nimport { createAIMetadataService } from './ai-metadata';\nimport { createAIMetadataJobsService } from './ai-metadata-jobs';\n\nexport const services = {\n provider,\n upload,\n folder,\n file,\n weeklyMetrics,\n metrics,\n 'image-manipulation': imageManipulation,\n 'api-upload-folder': apiUploadFolder,\n extensions,\n aiMetadata: createAIMetadataService,\n aiMetadataJobs: createAIMetadataJobsService,\n};\n"],"names":["services","provider","upload","folder","file","weeklyMetrics","metrics","imageManipulation","apiUploadFolder","extensions","aiMetadata","createAIMetadataService","aiMetadataJobs","createAIMetadataJobsService"],"mappings":";;;;;;;;;;;;MAYaA,QAAAA,GAAW;AACtBC,IAAAA,QAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,aAAAA;AACAC,IAAAA,OAAAA;IACA,oBAAA,EAAsBC,iBAAAA;IACtB,mBAAA,EAAqBC,eAAAA;AACrBC,IAAAA,UAAAA;IACAC,UAAAA,EAAYC,uBAAAA;IACZC,cAAAA,EAAgBC;AAClB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst getProviderName = () => strapi.config.get('plugin::upload.provider', 'local');\nconst isProviderPrivate = async () => strapi.plugin('upload').provider.isPrivate();\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async trackUsage(event: string, properties?: Record<string, any>) {\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const isAIAvailable =\n strapi.config.get('admin.ai.enabled', true) && strapi.ee.features.isEnabled('cms-ai');\n\n return strapi.telemetry.send(event, {\n ...properties,\n eventProperties: {\n ...properties?.eventProperties,\n ...(isAIAvailable ? { isAIMediaLibraryConfigured: Boolean(settings.aiMetadata) } : {}),\n },\n });\n },\n async sendUploadPluginMetrics() {\n const uploadProvider = getProviderName();\n const privateProvider = await isProviderPrivate();\n\n await this.trackUsage('didInitializePluginUpload', {\n groupProperties: {\n uploadProvider,\n privateProvider,\n },\n });\n },\n});\n"],"names":["getProviderName","strapi","config","get","isProviderPrivate","plugin","provider","isPrivate","trackUsage","event","properties","settings","service","getSettings","isAIAvailable","ee","features","isEnabled","telemetry","send","eventProperties","isAIMediaLibraryConfigured","Boolean","aiMetadata","sendUploadPluginMetrics","uploadProvider","privateProvider","groupProperties"],"mappings":";;AAGA,MAAMA,kBAAkB,IAAMC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAA2B,EAAA,OAAA,CAAA;AAC3E,MAAMC,iBAAAA,GAAoB,UAAYH,MAAOI,CAAAA,MAAM,CAAC,QAAUC,CAAAA,CAAAA,QAAQ,CAACC,SAAS,EAAA;AAEhF,cAAe,CAAA,CAAC,EAAEN,QAAAA,OAAM,EAA2B,IAAM;QACvD,MAAMO,UAAAA,CAAAA,CAAWC,KAAa,EAAEC,UAAgC,EAAA;YAC9D,MAAMC,QAAAA,GAAqB,MAAMV,OAAOI,CAAAA,MAAM,CAAC,QAAUO,CAAAA,CAAAA,OAAO,CAAC,QAAA,CAAA,CAAUC,WAAW,EAAA;AACtF,YAAA,MAAMC,aACJb,GAAAA,OAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,kBAAA,EAAoB,IAASF,CAAAA,IAAAA,OAAAA,CAAOc,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,QAAA,CAAA;AAE9E,YAAA,OAAOhB,OAAOiB,CAAAA,SAAS,CAACC,IAAI,CAACV,KAAO,EAAA;AAClC,gBAAA,GAAGC,UAAU;gBACbU,eAAiB,EAAA;AACf,oBAAA,GAAGV,YAAYU,eAAe;AAC9B,oBAAA,GAAIN,aAAgB,GAAA;wBAAEO,0BAA4BC,EAAAA,OAAAA,CAAQX,SAASY,UAAU;AAAE,qBAAA,GAAI;AACrF;AACF,aAAA,CAAA;AACF,SAAA;QACA,MAAMC,uBAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,cAAiBzB,GAAAA,eAAAA,EAAAA;AACvB,YAAA,MAAM0B,kBAAkB,MAAMtB,iBAAAA,EAAAA;AAE9B,YAAA,MAAM,IAAI,CAACI,UAAU,CAAC,2BAA6B,EAAA;gBACjDmB,eAAiB,EAAA;AACfF,oBAAAA,cAAAA;AACAC,oBAAAA;AACF;AACF,aAAA,CAAA;AACF;AACF,KAAA,CAAC;;;;"}
1
+ {"version":3,"file":"metrics.js","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst getProviderName = () => strapi.config.get('plugin::upload.provider', 'local');\nconst isProviderPrivate = async () => strapi.plugin('upload').provider.isPrivate();\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async trackUsage(event: string, properties?: Record<string, any>) {\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const isAIAvailable =\n strapi.config.get('admin.ai.enabled', true) && strapi.ee.features.isEnabled('cms-ai');\n\n return strapi.telemetry.send(event, {\n ...properties,\n eventProperties: {\n ...properties?.eventProperties,\n ...(isAIAvailable ? { isAIMediaLibraryConfigured: Boolean(settings.aiMetadata) } : {}),\n },\n });\n },\n async sendUploadPluginMetrics() {\n const uploadProvider = getProviderName();\n const privateProvider = await isProviderPrivate();\n\n await this.trackUsage('didInitializePluginUpload', {\n groupProperties: {\n uploadProvider,\n privateProvider,\n },\n });\n },\n});\n"],"names":["getProviderName","strapi","config","get","isProviderPrivate","plugin","provider","isPrivate","trackUsage","event","properties","settings","service","getSettings","isAIAvailable","ee","features","isEnabled","telemetry","send","eventProperties","isAIMediaLibraryConfigured","Boolean","aiMetadata","sendUploadPluginMetrics","uploadProvider","privateProvider","groupProperties"],"mappings":";;AAGA,MAAMA,kBAAkB,IAAMC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,OAAA,CAAA;AAC3E,MAAMC,iBAAAA,GAAoB,UAAYH,MAAAA,CAAOI,MAAM,CAAC,QAAA,CAAA,CAAUC,QAAQ,CAACC,SAAS,EAAA;AAEhF,cAAe,CAAA,CAAC,EAAEN,QAAAA,OAAM,EAA2B,IAAM;QACvD,MAAMO,UAAAA,CAAAA,CAAWC,KAAa,EAAEC,UAAgC,EAAA;YAC9D,MAAMC,QAAAA,GAAqB,MAAMV,OAAAA,CAAOI,MAAM,CAAC,QAAA,CAAA,CAAUO,OAAO,CAAC,QAAA,CAAA,CAAUC,WAAW,EAAA;AACtF,YAAA,MAAMC,aAAAA,GACJb,OAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,kBAAA,EAAoB,IAAA,CAAA,IAASF,OAAAA,CAAOc,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,QAAA,CAAA;AAE9E,YAAA,OAAOhB,OAAAA,CAAOiB,SAAS,CAACC,IAAI,CAACV,KAAAA,EAAO;AAClC,gBAAA,GAAGC,UAAU;gBACbU,eAAAA,EAAiB;AACf,oBAAA,GAAGV,YAAYU,eAAe;AAC9B,oBAAA,GAAIN,aAAAA,GAAgB;wBAAEO,0BAAAA,EAA4BC,OAAAA,CAAQX,SAASY,UAAU;AAAE,qBAAA,GAAI;AACrF;AACF,aAAA,CAAA;AACF,QAAA,CAAA;QACA,MAAMC,uBAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,cAAAA,GAAiBzB,eAAAA,EAAAA;AACvB,YAAA,MAAM0B,kBAAkB,MAAMtB,iBAAAA,EAAAA;AAE9B,YAAA,MAAM,IAAI,CAACI,UAAU,CAAC,2BAAA,EAA6B;gBACjDmB,eAAAA,EAAiB;AACfF,oBAAAA,cAAAA;AACAC,oBAAAA;AACF;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.mjs","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst getProviderName = () => strapi.config.get('plugin::upload.provider', 'local');\nconst isProviderPrivate = async () => strapi.plugin('upload').provider.isPrivate();\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async trackUsage(event: string, properties?: Record<string, any>) {\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const isAIAvailable =\n strapi.config.get('admin.ai.enabled', true) && strapi.ee.features.isEnabled('cms-ai');\n\n return strapi.telemetry.send(event, {\n ...properties,\n eventProperties: {\n ...properties?.eventProperties,\n ...(isAIAvailable ? { isAIMediaLibraryConfigured: Boolean(settings.aiMetadata) } : {}),\n },\n });\n },\n async sendUploadPluginMetrics() {\n const uploadProvider = getProviderName();\n const privateProvider = await isProviderPrivate();\n\n await this.trackUsage('didInitializePluginUpload', {\n groupProperties: {\n uploadProvider,\n privateProvider,\n },\n });\n },\n});\n"],"names":["getProviderName","strapi","config","get","isProviderPrivate","plugin","provider","isPrivate","trackUsage","event","properties","settings","service","getSettings","isAIAvailable","ee","features","isEnabled","telemetry","send","eventProperties","isAIMediaLibraryConfigured","Boolean","aiMetadata","sendUploadPluginMetrics","uploadProvider","privateProvider","groupProperties"],"mappings":"AAGA,MAAMA,kBAAkB,IAAMC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAA2B,EAAA,OAAA,CAAA;AAC3E,MAAMC,iBAAAA,GAAoB,UAAYH,MAAOI,CAAAA,MAAM,CAAC,QAAUC,CAAAA,CAAAA,QAAQ,CAACC,SAAS,EAAA;AAEhF,cAAe,CAAA,CAAC,EAAEN,QAAAA,OAAM,EAA2B,IAAM;QACvD,MAAMO,UAAAA,CAAAA,CAAWC,KAAa,EAAEC,UAAgC,EAAA;YAC9D,MAAMC,QAAAA,GAAqB,MAAMV,OAAOI,CAAAA,MAAM,CAAC,QAAUO,CAAAA,CAAAA,OAAO,CAAC,QAAA,CAAA,CAAUC,WAAW,EAAA;AACtF,YAAA,MAAMC,aACJb,GAAAA,OAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,kBAAA,EAAoB,IAASF,CAAAA,IAAAA,OAAAA,CAAOc,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,QAAA,CAAA;AAE9E,YAAA,OAAOhB,OAAOiB,CAAAA,SAAS,CAACC,IAAI,CAACV,KAAO,EAAA;AAClC,gBAAA,GAAGC,UAAU;gBACbU,eAAiB,EAAA;AACf,oBAAA,GAAGV,YAAYU,eAAe;AAC9B,oBAAA,GAAIN,aAAgB,GAAA;wBAAEO,0BAA4BC,EAAAA,OAAAA,CAAQX,SAASY,UAAU;AAAE,qBAAA,GAAI;AACrF;AACF,aAAA,CAAA;AACF,SAAA;QACA,MAAMC,uBAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,cAAiBzB,GAAAA,eAAAA,EAAAA;AACvB,YAAA,MAAM0B,kBAAkB,MAAMtB,iBAAAA,EAAAA;AAE9B,YAAA,MAAM,IAAI,CAACI,UAAU,CAAC,2BAA6B,EAAA;gBACjDmB,eAAiB,EAAA;AACfF,oBAAAA,cAAAA;AACAC,oBAAAA;AACF;AACF,aAAA,CAAA;AACF;AACF,KAAA,CAAC;;;;"}
1
+ {"version":3,"file":"metrics.mjs","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst getProviderName = () => strapi.config.get('plugin::upload.provider', 'local');\nconst isProviderPrivate = async () => strapi.plugin('upload').provider.isPrivate();\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async trackUsage(event: string, properties?: Record<string, any>) {\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const isAIAvailable =\n strapi.config.get('admin.ai.enabled', true) && strapi.ee.features.isEnabled('cms-ai');\n\n return strapi.telemetry.send(event, {\n ...properties,\n eventProperties: {\n ...properties?.eventProperties,\n ...(isAIAvailable ? { isAIMediaLibraryConfigured: Boolean(settings.aiMetadata) } : {}),\n },\n });\n },\n async sendUploadPluginMetrics() {\n const uploadProvider = getProviderName();\n const privateProvider = await isProviderPrivate();\n\n await this.trackUsage('didInitializePluginUpload', {\n groupProperties: {\n uploadProvider,\n privateProvider,\n },\n });\n },\n});\n"],"names":["getProviderName","strapi","config","get","isProviderPrivate","plugin","provider","isPrivate","trackUsage","event","properties","settings","service","getSettings","isAIAvailable","ee","features","isEnabled","telemetry","send","eventProperties","isAIMediaLibraryConfigured","Boolean","aiMetadata","sendUploadPluginMetrics","uploadProvider","privateProvider","groupProperties"],"mappings":"AAGA,MAAMA,kBAAkB,IAAMC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,OAAA,CAAA;AAC3E,MAAMC,iBAAAA,GAAoB,UAAYH,MAAAA,CAAOI,MAAM,CAAC,QAAA,CAAA,CAAUC,QAAQ,CAACC,SAAS,EAAA;AAEhF,cAAe,CAAA,CAAC,EAAEN,QAAAA,OAAM,EAA2B,IAAM;QACvD,MAAMO,UAAAA,CAAAA,CAAWC,KAAa,EAAEC,UAAgC,EAAA;YAC9D,MAAMC,QAAAA,GAAqB,MAAMV,OAAAA,CAAOI,MAAM,CAAC,QAAA,CAAA,CAAUO,OAAO,CAAC,QAAA,CAAA,CAAUC,WAAW,EAAA;AACtF,YAAA,MAAMC,aAAAA,GACJb,OAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,kBAAA,EAAoB,IAAA,CAAA,IAASF,OAAAA,CAAOc,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,QAAA,CAAA;AAE9E,YAAA,OAAOhB,OAAAA,CAAOiB,SAAS,CAACC,IAAI,CAACV,KAAAA,EAAO;AAClC,gBAAA,GAAGC,UAAU;gBACbU,eAAAA,EAAiB;AACf,oBAAA,GAAGV,YAAYU,eAAe;AAC9B,oBAAA,GAAIN,aAAAA,GAAgB;wBAAEO,0BAAAA,EAA4BC,OAAAA,CAAQX,SAASY,UAAU;AAAE,qBAAA,GAAI;AACrF;AACF,aAAA,CAAA;AACF,QAAA,CAAA;QACA,MAAMC,uBAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,cAAAA,GAAiBzB,eAAAA,EAAAA;AACvB,YAAA,MAAM0B,kBAAkB,MAAMtB,iBAAAA,EAAAA;AAE9B,YAAA,MAAM,IAAI,CAACI,UAAU,CAAC,2BAAA,EAA6B;gBACjDmB,eAAAA,EAAiB;AACfF,oBAAAA,cAAAA;AACAC,oBAAAA;AACF;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sources":["../../../server/src/services/provider.ts"],"sourcesContent":["import { isFunction } from 'lodash/fp';\nimport { file as fileUtils } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport { Config, UploadableFile } from '../types';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async checkFileSize(file: UploadableFile) {\n const { sizeLimit } = strapi.config.get<Config>('plugin::upload');\n await strapi.plugin('upload').provider.checkFileSize(file, { sizeLimit });\n },\n\n async upload(file: UploadableFile) {\n if (isFunction(strapi.plugin('upload').provider.uploadStream)) {\n file.stream = file.getStream();\n await strapi.plugin('upload').provider.uploadStream(file);\n\n delete file.stream;\n\n if ('filepath' in file) {\n delete file.filepath;\n }\n } else {\n file.buffer = await fileUtils.streamToBuffer(file.getStream());\n await strapi.plugin('upload').provider.upload(file);\n\n delete file.buffer;\n\n if ('filepath' in file) {\n delete file.filepath;\n }\n }\n },\n});\n"],"names":["strapi","checkFileSize","file","sizeLimit","config","get","plugin","provider","upload","isFunction","uploadStream","stream","getStream","filepath","buffer","fileUtils","streamToBuffer"],"mappings":";;;;;AAMA,eAAe,CAAA,CAAC,EAAEA,MAAM,EAA2B,IAAM;AACvD,QAAA,MAAMC,eAAcC,IAAoB,EAAA;YACtC,MAAM,EAAEC,SAAS,EAAE,GAAGH,OAAOI,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA;YAChD,MAAML,MAAAA,CAAOM,MAAM,CAAC,QAAA,CAAA,CAAUC,QAAQ,CAACN,aAAa,CAACC,IAAM,EAAA;AAAEC,gBAAAA;AAAU,aAAA,CAAA;AACzE,SAAA;AAEA,QAAA,MAAMK,QAAON,IAAoB,EAAA;YAC/B,IAAIO,aAAAA,CAAWT,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACG,YAAY,CAAG,EAAA;gBAC7DR,IAAKS,CAAAA,MAAM,GAAGT,IAAAA,CAAKU,SAAS,EAAA;AAC5B,gBAAA,MAAMZ,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACG,YAAY,CAACR,IAAAA,CAAAA;AAEpD,gBAAA,OAAOA,KAAKS,MAAM;AAElB,gBAAA,IAAI,cAAcT,IAAM,EAAA;AACtB,oBAAA,OAAOA,KAAKW,QAAQ;AACtB;aACK,MAAA;AACLX,gBAAAA,IAAAA,CAAKY,MAAM,GAAG,MAAMC,WAAUC,cAAc,CAACd,KAAKU,SAAS,EAAA,CAAA;AAC3D,gBAAA,MAAMZ,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACC,MAAM,CAACN,IAAAA,CAAAA;AAE9C,gBAAA,OAAOA,KAAKY,MAAM;AAElB,gBAAA,IAAI,cAAcZ,IAAM,EAAA;AACtB,oBAAA,OAAOA,KAAKW,QAAQ;AACtB;AACF;AACF;AACF,KAAA,CAAC;;;;"}
1
+ {"version":3,"file":"provider.js","sources":["../../../server/src/services/provider.ts"],"sourcesContent":["import { isFunction } from 'lodash/fp';\nimport { file as fileUtils } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport { Config, UploadableFile } from '../types';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async checkFileSize(file: UploadableFile) {\n const { sizeLimit } = strapi.config.get<Config>('plugin::upload');\n await strapi.plugin('upload').provider.checkFileSize(file, { sizeLimit });\n },\n\n async upload(file: UploadableFile) {\n if (isFunction(strapi.plugin('upload').provider.uploadStream)) {\n file.stream = file.getStream();\n await strapi.plugin('upload').provider.uploadStream(file);\n\n delete file.stream;\n\n if ('filepath' in file) {\n delete file.filepath;\n }\n } else {\n file.buffer = await fileUtils.streamToBuffer(file.getStream());\n await strapi.plugin('upload').provider.upload(file);\n\n delete file.buffer;\n\n if ('filepath' in file) {\n delete file.filepath;\n }\n }\n },\n});\n"],"names":["strapi","checkFileSize","file","sizeLimit","config","get","plugin","provider","upload","isFunction","uploadStream","stream","getStream","filepath","buffer","fileUtils","streamToBuffer"],"mappings":";;;;;AAMA,eAAe,CAAA,CAAC,EAAEA,MAAM,EAA2B,IAAM;AACvD,QAAA,MAAMC,eAAcC,IAAoB,EAAA;YACtC,MAAM,EAAEC,SAAS,EAAE,GAAGH,OAAOI,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA;YAChD,MAAML,MAAAA,CAAOM,MAAM,CAAC,QAAA,CAAA,CAAUC,QAAQ,CAACN,aAAa,CAACC,IAAAA,EAAM;AAAEC,gBAAAA;AAAU,aAAA,CAAA;AACzE,QAAA,CAAA;AAEA,QAAA,MAAMK,QAAON,IAAoB,EAAA;YAC/B,IAAIO,aAAAA,CAAWT,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACG,YAAY,CAAA,EAAG;gBAC7DR,IAAAA,CAAKS,MAAM,GAAGT,IAAAA,CAAKU,SAAS,EAAA;AAC5B,gBAAA,MAAMZ,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACG,YAAY,CAACR,IAAAA,CAAAA;AAEpD,gBAAA,OAAOA,KAAKS,MAAM;AAElB,gBAAA,IAAI,cAAcT,IAAAA,EAAM;AACtB,oBAAA,OAAOA,KAAKW,QAAQ;AACtB,gBAAA;YACF,CAAA,MAAO;AACLX,gBAAAA,IAAAA,CAAKY,MAAM,GAAG,MAAMC,WAAUC,cAAc,CAACd,KAAKU,SAAS,EAAA,CAAA;AAC3D,gBAAA,MAAMZ,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACC,MAAM,CAACN,IAAAA,CAAAA;AAE9C,gBAAA,OAAOA,KAAKY,MAAM;AAElB,gBAAA,IAAI,cAAcZ,IAAAA,EAAM;AACtB,oBAAA,OAAOA,KAAKW,QAAQ;AACtB,gBAAA;AACF,YAAA;AACF,QAAA;AACF,KAAA,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.mjs","sources":["../../../server/src/services/provider.ts"],"sourcesContent":["import { isFunction } from 'lodash/fp';\nimport { file as fileUtils } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport { Config, UploadableFile } from '../types';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async checkFileSize(file: UploadableFile) {\n const { sizeLimit } = strapi.config.get<Config>('plugin::upload');\n await strapi.plugin('upload').provider.checkFileSize(file, { sizeLimit });\n },\n\n async upload(file: UploadableFile) {\n if (isFunction(strapi.plugin('upload').provider.uploadStream)) {\n file.stream = file.getStream();\n await strapi.plugin('upload').provider.uploadStream(file);\n\n delete file.stream;\n\n if ('filepath' in file) {\n delete file.filepath;\n }\n } else {\n file.buffer = await fileUtils.streamToBuffer(file.getStream());\n await strapi.plugin('upload').provider.upload(file);\n\n delete file.buffer;\n\n if ('filepath' in file) {\n delete file.filepath;\n }\n }\n },\n});\n"],"names":["strapi","checkFileSize","file","sizeLimit","config","get","plugin","provider","upload","isFunction","uploadStream","stream","getStream","filepath","buffer","fileUtils","streamToBuffer"],"mappings":";;;AAMA,eAAe,CAAA,CAAC,EAAEA,MAAM,EAA2B,IAAM;AACvD,QAAA,MAAMC,eAAcC,IAAoB,EAAA;YACtC,MAAM,EAAEC,SAAS,EAAE,GAAGH,OAAOI,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA;YAChD,MAAML,MAAAA,CAAOM,MAAM,CAAC,QAAA,CAAA,CAAUC,QAAQ,CAACN,aAAa,CAACC,IAAM,EAAA;AAAEC,gBAAAA;AAAU,aAAA,CAAA;AACzE,SAAA;AAEA,QAAA,MAAMK,QAAON,MAAoB,EAAA;YAC/B,IAAIO,UAAAA,CAAWT,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACG,YAAY,CAAG,EAAA;gBAC7DR,MAAKS,CAAAA,MAAM,GAAGT,MAAAA,CAAKU,SAAS,EAAA;AAC5B,gBAAA,MAAMZ,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACG,YAAY,CAACR,MAAAA,CAAAA;AAEpD,gBAAA,OAAOA,OAAKS,MAAM;AAElB,gBAAA,IAAI,cAAcT,MAAM,EAAA;AACtB,oBAAA,OAAOA,OAAKW,QAAQ;AACtB;aACK,MAAA;AACLX,gBAAAA,MAAAA,CAAKY,MAAM,GAAG,MAAMC,KAAUC,cAAc,CAACd,OAAKU,SAAS,EAAA,CAAA;AAC3D,gBAAA,MAAMZ,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACC,MAAM,CAACN,MAAAA,CAAAA;AAE9C,gBAAA,OAAOA,OAAKY,MAAM;AAElB,gBAAA,IAAI,cAAcZ,MAAM,EAAA;AACtB,oBAAA,OAAOA,OAAKW,QAAQ;AACtB;AACF;AACF;AACF,KAAA,CAAC;;;;"}
1
+ {"version":3,"file":"provider.mjs","sources":["../../../server/src/services/provider.ts"],"sourcesContent":["import { isFunction } from 'lodash/fp';\nimport { file as fileUtils } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport { Config, UploadableFile } from '../types';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async checkFileSize(file: UploadableFile) {\n const { sizeLimit } = strapi.config.get<Config>('plugin::upload');\n await strapi.plugin('upload').provider.checkFileSize(file, { sizeLimit });\n },\n\n async upload(file: UploadableFile) {\n if (isFunction(strapi.plugin('upload').provider.uploadStream)) {\n file.stream = file.getStream();\n await strapi.plugin('upload').provider.uploadStream(file);\n\n delete file.stream;\n\n if ('filepath' in file) {\n delete file.filepath;\n }\n } else {\n file.buffer = await fileUtils.streamToBuffer(file.getStream());\n await strapi.plugin('upload').provider.upload(file);\n\n delete file.buffer;\n\n if ('filepath' in file) {\n delete file.filepath;\n }\n }\n },\n});\n"],"names":["strapi","checkFileSize","file","sizeLimit","config","get","plugin","provider","upload","isFunction","uploadStream","stream","getStream","filepath","buffer","fileUtils","streamToBuffer"],"mappings":";;;AAMA,eAAe,CAAA,CAAC,EAAEA,MAAM,EAA2B,IAAM;AACvD,QAAA,MAAMC,eAAcC,IAAoB,EAAA;YACtC,MAAM,EAAEC,SAAS,EAAE,GAAGH,OAAOI,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA;YAChD,MAAML,MAAAA,CAAOM,MAAM,CAAC,QAAA,CAAA,CAAUC,QAAQ,CAACN,aAAa,CAACC,IAAAA,EAAM;AAAEC,gBAAAA;AAAU,aAAA,CAAA;AACzE,QAAA,CAAA;AAEA,QAAA,MAAMK,QAAON,MAAoB,EAAA;YAC/B,IAAIO,UAAAA,CAAWT,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACG,YAAY,CAAA,EAAG;gBAC7DR,MAAAA,CAAKS,MAAM,GAAGT,MAAAA,CAAKU,SAAS,EAAA;AAC5B,gBAAA,MAAMZ,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACG,YAAY,CAACR,MAAAA,CAAAA;AAEpD,gBAAA,OAAOA,OAAKS,MAAM;AAElB,gBAAA,IAAI,cAAcT,MAAAA,EAAM;AACtB,oBAAA,OAAOA,OAAKW,QAAQ;AACtB,gBAAA;YACF,CAAA,MAAO;AACLX,gBAAAA,MAAAA,CAAKY,MAAM,GAAG,MAAMC,KAAUC,cAAc,CAACd,OAAKU,SAAS,EAAA,CAAA;AAC3D,gBAAA,MAAMZ,OAAOM,MAAM,CAAC,UAAUC,QAAQ,CAACC,MAAM,CAACN,MAAAA,CAAAA;AAE9C,gBAAA,OAAOA,OAAKY,MAAM;AAElB,gBAAA,IAAI,cAAcZ,MAAAA,EAAM;AACtB,oBAAA,OAAOA,OAAKW,QAAQ;AACtB,gBAAA;AACF,YAAA;AACF,QAAA;AACF,KAAA,CAAC;;;;"}
@@ -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} from '@strapi/utils';\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 const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: file.mimetype ?? 'application/octet-stream',\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 let uploadedFiles: any[] = [];\n\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 uploadedFiles = await Promise.all(\n fileArray.map((file, idx) => doUpload(file, fileInfoArray[idx] || {}))\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 * 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) ? dbFile.path : 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 // 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 // execute delete function of the provider\n if (dbFile.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(dbFile);\n\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) => {\n return strapi.plugin('upload').provider.delete(dbFile.formats[key]);\n })\n );\n }\n }\n\n // clear old formats\n _.set(fileData, 'formats', {});\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 } 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 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 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","currentFile","originalFilename","mimetype","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","Promise","all","map","idx","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","push","formats","config","get","checkFileSize","provider","add","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","replace","delete","Object","keys","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","results","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} from '@strapi/utils';\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 const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: file.mimetype ?? 'application/octet-stream',\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 let uploadedFiles: any[] = [];\n\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 uploadedFiles = await Promise.all(\n fileArray.map((file, idx) => doUpload(file, fileInfoArray[idx] || {}))\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 * 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) ? dbFile.path : 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 // 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 // execute delete function of the provider\n if (dbFile.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(dbFile);\n\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) => {\n return strapi.plugin('upload').provider.delete(dbFile.formats[key]);\n })\n );\n }\n }\n\n // clear old formats\n _.set(fileData, 'formats', {});\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 } 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 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 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","currentFile","originalFilename","mimetype","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","Promise","all","map","idx","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","push","formats","config","get","checkFileSize","provider","add","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","replace","delete","Object","keys","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","results","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage"],"mappings":"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"}
@@ -4,7 +4,7 @@ import fs from 'fs';
4
4
  import fse from 'fs-extra';
5
5
  import _ from 'lodash';
6
6
  import { extension } from 'mime-types';
7
- import { contentTypes, async, errors, file, sanitize } from '@strapi/utils';
7
+ import { contentTypes, errors, file, async, sanitize } from '@strapi/utils';
8
8
  import { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants.mjs';
9
9
  import { getService } from '../utils/index.mjs';
10
10