@strapi/upload 5.12.1 → 5.12.3

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 (866) hide show
  1. package/dist/admin/components/AssetCard/AssetCard.js +59 -0
  2. package/dist/admin/components/AssetCard/AssetCard.js.map +1 -0
  3. package/dist/admin/components/AssetCard/AssetCard.mjs +57 -0
  4. package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -0
  5. package/dist/admin/components/AssetCard/AssetCardBase.js +130 -0
  6. package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -0
  7. package/dist/admin/components/AssetCard/AssetCardBase.mjs +128 -0
  8. package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -0
  9. package/dist/admin/components/AssetCard/AudioAssetCard.js +40 -0
  10. package/dist/admin/components/AssetCard/AudioAssetCard.js.map +1 -0
  11. package/dist/admin/components/AssetCard/AudioAssetCard.mjs +38 -0
  12. package/dist/admin/components/AssetCard/AudioAssetCard.mjs.map +1 -0
  13. package/dist/admin/components/AssetCard/AudioPreview.js +17 -0
  14. package/dist/admin/components/AssetCard/AudioPreview.js.map +1 -0
  15. package/dist/admin/components/AssetCard/AudioPreview.mjs +15 -0
  16. package/dist/admin/components/AssetCard/AudioPreview.mjs.map +1 -0
  17. package/dist/admin/components/AssetCard/DocAssetCard.js +61 -0
  18. package/dist/admin/components/AssetCard/DocAssetCard.js.map +1 -0
  19. package/dist/admin/components/AssetCard/DocAssetCard.mjs +59 -0
  20. package/dist/admin/components/AssetCard/DocAssetCard.mjs.map +1 -0
  21. package/dist/admin/components/AssetCard/ImageAssetCard.js +37 -0
  22. package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -0
  23. package/dist/admin/components/AssetCard/ImageAssetCard.mjs +35 -0
  24. package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -0
  25. package/dist/admin/components/AssetCard/UploadingAssetCard.js +152 -0
  26. package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -0
  27. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs +131 -0
  28. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -0
  29. package/dist/admin/components/AssetCard/VideoAssetCard.js +72 -0
  30. package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -0
  31. package/dist/admin/components/AssetCard/VideoAssetCard.mjs +51 -0
  32. package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -0
  33. package/dist/admin/components/AssetCard/VideoPreview.js +50 -0
  34. package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -0
  35. package/dist/admin/components/AssetCard/VideoPreview.mjs +48 -0
  36. package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -0
  37. package/dist/admin/components/AssetDialog/AssetDialog.js +321 -0
  38. package/dist/admin/components/AssetDialog/AssetDialog.js.map +1 -0
  39. package/dist/admin/components/AssetDialog/AssetDialog.mjs +299 -0
  40. package/dist/admin/components/AssetDialog/AssetDialog.mjs.map +1 -0
  41. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +313 -0
  42. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -0
  43. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +311 -0
  44. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -0
  45. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js +70 -0
  46. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -0
  47. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs +49 -0
  48. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -0
  49. package/dist/admin/components/AssetDialog/BrowseStep/PageSize.js +58 -0
  50. package/dist/admin/components/AssetDialog/BrowseStep/PageSize.js.map +1 -0
  51. package/dist/admin/components/AssetDialog/BrowseStep/PageSize.mjs +56 -0
  52. package/dist/admin/components/AssetDialog/BrowseStep/PageSize.mjs.map +1 -0
  53. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js +55 -0
  54. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js.map +1 -0
  55. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.mjs +33 -0
  56. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.mjs.map +1 -0
  57. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.js +378 -0
  58. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.js.map +1 -0
  59. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.mjs +376 -0
  60. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.mjs.map +1 -0
  61. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +102 -0
  62. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -0
  63. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +81 -0
  64. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -0
  65. package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.js +14 -0
  66. package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.js.map +1 -0
  67. package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.mjs +12 -0
  68. package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.mjs.map +1 -0
  69. package/dist/admin/components/AssetDialog/DialogFooter.js +31 -0
  70. package/dist/admin/components/AssetDialog/DialogFooter.js.map +1 -0
  71. package/dist/admin/components/AssetDialog/DialogFooter.mjs +29 -0
  72. package/dist/admin/components/AssetDialog/DialogFooter.mjs.map +1 -0
  73. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js +60 -0
  74. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -0
  75. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs +58 -0
  76. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -0
  77. package/dist/admin/components/AssetGridList/AssetGridList.js +72 -0
  78. package/dist/admin/components/AssetGridList/AssetGridList.js.map +1 -0
  79. package/dist/admin/components/AssetGridList/AssetGridList.mjs +70 -0
  80. package/dist/admin/components/AssetGridList/AssetGridList.mjs.map +1 -0
  81. package/dist/admin/components/AssetGridList/Draggable.js +65 -0
  82. package/dist/admin/components/AssetGridList/Draggable.js.map +1 -0
  83. package/dist/admin/components/AssetGridList/Draggable.mjs +44 -0
  84. package/dist/admin/components/AssetGridList/Draggable.mjs.map +1 -0
  85. package/dist/admin/components/Breadcrumbs/Breadcrumbs.js +49 -0
  86. package/dist/admin/components/Breadcrumbs/Breadcrumbs.js.map +1 -0
  87. package/dist/admin/components/Breadcrumbs/Breadcrumbs.mjs +47 -0
  88. package/dist/admin/components/Breadcrumbs/Breadcrumbs.mjs.map +1 -0
  89. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js +89 -0
  90. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -0
  91. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +68 -0
  92. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -0
  93. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +154 -0
  94. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -0
  95. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +152 -0
  96. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -0
  97. package/dist/admin/components/ContextInfo/ContextInfo.js +44 -0
  98. package/dist/admin/components/ContextInfo/ContextInfo.js.map +1 -0
  99. package/dist/admin/components/ContextInfo/ContextInfo.mjs +42 -0
  100. package/dist/admin/components/ContextInfo/ContextInfo.mjs.map +1 -0
  101. package/dist/admin/components/CopyLinkButton/CopyLinkButton.js +43 -0
  102. package/dist/admin/components/CopyLinkButton/CopyLinkButton.js.map +1 -0
  103. package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs +41 -0
  104. package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs.map +1 -0
  105. package/dist/admin/components/EditAssetDialog/DialogHeader.js +20 -0
  106. package/dist/admin/components/EditAssetDialog/DialogHeader.js.map +1 -0
  107. package/dist/admin/components/EditAssetDialog/DialogHeader.mjs +18 -0
  108. package/dist/admin/components/EditAssetDialog/DialogHeader.mjs.map +1 -0
  109. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +403 -0
  110. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -0
  111. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +380 -0
  112. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -0
  113. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +127 -0
  114. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -0
  115. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs +106 -0
  116. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -0
  117. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js +111 -0
  118. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -0
  119. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs +109 -0
  120. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -0
  121. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +260 -0
  122. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -0
  123. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +239 -0
  124. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -0
  125. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js +75 -0
  126. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js.map +1 -0
  127. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs +68 -0
  128. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs.map +1 -0
  129. package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.js +27 -0
  130. package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.js.map +1 -0
  131. package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.mjs +25 -0
  132. package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.mjs.map +1 -0
  133. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +79 -0
  134. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -0
  135. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +58 -0
  136. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -0
  137. package/dist/admin/components/EditFolderDialog/EditFolderDialog.js +336 -0
  138. package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -0
  139. package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs +313 -0
  140. package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs.map +1 -0
  141. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js +29 -0
  142. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -0
  143. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs +27 -0
  144. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -0
  145. package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.js +18 -0
  146. package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.js.map +1 -0
  147. package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.mjs +16 -0
  148. package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.mjs.map +1 -0
  149. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.js +31 -0
  150. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.js.map +1 -0
  151. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.mjs +29 -0
  152. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.mjs.map +1 -0
  153. package/dist/admin/components/EmptyAssets/EmptyAssets.js +53 -0
  154. package/dist/admin/components/EmptyAssets/EmptyAssets.js.map +1 -0
  155. package/dist/admin/components/EmptyAssets/EmptyAssets.mjs +51 -0
  156. package/dist/admin/components/EmptyAssets/EmptyAssets.mjs.map +1 -0
  157. package/dist/admin/components/FilterList/FilterList.js +74 -0
  158. package/dist/admin/components/FilterList/FilterList.js.map +1 -0
  159. package/dist/admin/components/FilterList/FilterList.mjs +72 -0
  160. package/dist/admin/components/FilterList/FilterList.mjs.map +1 -0
  161. package/dist/admin/components/FilterList/FilterTag.js +50 -0
  162. package/dist/admin/components/FilterList/FilterTag.js.map +1 -0
  163. package/dist/admin/components/FilterList/FilterTag.mjs +48 -0
  164. package/dist/admin/components/FilterList/FilterTag.mjs.map +1 -0
  165. package/dist/admin/components/FilterPopover/FilterPopover.js +275 -0
  166. package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -0
  167. package/dist/admin/components/FilterPopover/FilterPopover.mjs +254 -0
  168. package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -0
  169. package/dist/admin/components/FilterPopover/FilterValueInput.js +39 -0
  170. package/dist/admin/components/FilterPopover/FilterValueInput.js.map +1 -0
  171. package/dist/admin/components/FilterPopover/FilterValueInput.mjs +37 -0
  172. package/dist/admin/components/FilterPopover/FilterValueInput.mjs.map +1 -0
  173. package/dist/admin/components/FilterPopover/utils/getFilterList.js +114 -0
  174. package/dist/admin/components/FilterPopover/utils/getFilterList.js.map +1 -0
  175. package/dist/admin/components/FilterPopover/utils/getFilterList.mjs +112 -0
  176. package/dist/admin/components/FilterPopover/utils/getFilterList.mjs.map +1 -0
  177. package/dist/admin/components/FolderCard/FolderCard/FolderCard.js +125 -0
  178. package/dist/admin/components/FolderCard/FolderCard/FolderCard.js.map +1 -0
  179. package/dist/admin/components/FolderCard/FolderCard/FolderCard.mjs +104 -0
  180. package/dist/admin/components/FolderCard/FolderCard/FolderCard.mjs.map +1 -0
  181. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.js +26 -0
  182. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.js.map +1 -0
  183. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.mjs +24 -0
  184. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.mjs.map +1 -0
  185. package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.js +40 -0
  186. package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.js.map +1 -0
  187. package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.mjs +38 -0
  188. package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.mjs.map +1 -0
  189. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js +20 -0
  190. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js.map +1 -0
  191. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.mjs +18 -0
  192. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.mjs.map +1 -0
  193. package/dist/admin/components/FolderCard/contexts/FolderCard.js +12 -0
  194. package/dist/admin/components/FolderCard/contexts/FolderCard.js.map +1 -0
  195. package/dist/admin/components/FolderCard/contexts/FolderCard.mjs +9 -0
  196. package/dist/admin/components/FolderCard/contexts/FolderCard.mjs.map +1 -0
  197. package/dist/admin/components/FolderGridList/FolderGridList.js +29 -0
  198. package/dist/admin/components/FolderGridList/FolderGridList.js.map +1 -0
  199. package/dist/admin/components/FolderGridList/FolderGridList.mjs +27 -0
  200. package/dist/admin/components/FolderGridList/FolderGridList.mjs.map +1 -0
  201. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js +71 -0
  202. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -0
  203. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs +50 -0
  204. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -0
  205. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +78 -0
  206. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -0
  207. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +76 -0
  208. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -0
  209. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js +52 -0
  210. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -0
  211. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs +50 -0
  212. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -0
  213. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js +112 -0
  214. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -0
  215. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs +91 -0
  216. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -0
  217. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +116 -0
  218. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -0
  219. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs +95 -0
  220. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -0
  221. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +216 -0
  222. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -0
  223. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +195 -0
  224. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -0
  225. package/dist/admin/components/SelectTree/Option.js +70 -0
  226. package/dist/admin/components/SelectTree/Option.js.map +1 -0
  227. package/dist/admin/components/SelectTree/Option.mjs +68 -0
  228. package/dist/admin/components/SelectTree/Option.mjs.map +1 -0
  229. package/dist/admin/components/SelectTree/SelectTree.js +276 -0
  230. package/dist/admin/components/SelectTree/SelectTree.js.map +1 -0
  231. package/dist/admin/components/SelectTree/SelectTree.mjs +255 -0
  232. package/dist/admin/components/SelectTree/SelectTree.mjs.map +1 -0
  233. package/dist/admin/components/SelectTree/utils/flattenTree.js +19 -0
  234. package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -0
  235. package/dist/admin/components/SelectTree/utils/flattenTree.mjs +17 -0
  236. package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -0
  237. package/dist/admin/components/SelectTree/utils/getOpenValues.js +24 -0
  238. package/dist/admin/components/SelectTree/utils/getOpenValues.js.map +1 -0
  239. package/dist/admin/components/SelectTree/utils/getOpenValues.mjs +22 -0
  240. package/dist/admin/components/SelectTree/utils/getOpenValues.mjs.map +1 -0
  241. package/dist/admin/components/SelectTree/utils/getValuesToClose.js +12 -0
  242. package/dist/admin/components/SelectTree/utils/getValuesToClose.js.map +1 -0
  243. package/dist/admin/components/SelectTree/utils/getValuesToClose.mjs +10 -0
  244. package/dist/admin/components/SelectTree/utils/getValuesToClose.mjs.map +1 -0
  245. package/dist/admin/components/SortPicker/SortPicker.js +39 -0
  246. package/dist/admin/components/SortPicker/SortPicker.js.map +1 -0
  247. package/dist/admin/components/SortPicker/SortPicker.mjs +37 -0
  248. package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -0
  249. package/dist/admin/components/TableList/CellContent.js +76 -0
  250. package/dist/admin/components/TableList/CellContent.js.map +1 -0
  251. package/dist/admin/components/TableList/CellContent.mjs +74 -0
  252. package/dist/admin/components/TableList/CellContent.mjs.map +1 -0
  253. package/dist/admin/components/TableList/PreviewCell.js +82 -0
  254. package/dist/admin/components/TableList/PreviewCell.js.map +1 -0
  255. package/dist/admin/components/TableList/PreviewCell.mjs +80 -0
  256. package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -0
  257. package/dist/admin/components/TableList/TableList.js +99 -0
  258. package/dist/admin/components/TableList/TableList.js.map +1 -0
  259. package/dist/admin/components/TableList/TableList.mjs +97 -0
  260. package/dist/admin/components/TableList/TableList.mjs.map +1 -0
  261. package/dist/admin/components/TableList/TableRows.js +101 -0
  262. package/dist/admin/components/TableList/TableRows.js.map +1 -0
  263. package/dist/admin/components/TableList/TableRows.mjs +99 -0
  264. package/dist/admin/components/TableList/TableRows.mjs.map +1 -0
  265. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js +84 -0
  266. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -0
  267. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs +82 -0
  268. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -0
  269. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +203 -0
  270. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -0
  271. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +182 -0
  272. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -0
  273. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +127 -0
  274. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -0
  275. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +106 -0
  276. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -0
  277. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +206 -0
  278. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -0
  279. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +185 -0
  280. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -0
  281. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js +129 -0
  282. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -0
  283. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.mjs +108 -0
  284. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -0
  285. package/dist/admin/components/UploadProgress/UploadProgress.js +88 -0
  286. package/dist/admin/components/UploadProgress/UploadProgress.js.map +1 -0
  287. package/dist/admin/components/UploadProgress/UploadProgress.mjs +86 -0
  288. package/dist/admin/components/UploadProgress/UploadProgress.mjs.map +1 -0
  289. package/dist/admin/constants.js +205 -0
  290. package/dist/admin/constants.js.map +1 -0
  291. package/dist/admin/constants.mjs +198 -0
  292. package/dist/admin/constants.mjs.map +1 -0
  293. package/dist/admin/hooks/useAssets.js +124 -0
  294. package/dist/admin/hooks/useAssets.js.map +1 -0
  295. package/dist/admin/hooks/useAssets.mjs +103 -0
  296. package/dist/admin/hooks/useAssets.mjs.map +1 -0
  297. package/dist/admin/hooks/useBulkMove.js +79 -0
  298. package/dist/admin/hooks/useBulkMove.js.map +1 -0
  299. package/dist/admin/hooks/useBulkMove.mjs +77 -0
  300. package/dist/admin/hooks/useBulkMove.mjs.map +1 -0
  301. package/dist/admin/hooks/useBulkRemove.js +79 -0
  302. package/dist/admin/hooks/useBulkRemove.js.map +1 -0
  303. package/dist/admin/hooks/useBulkRemove.mjs +77 -0
  304. package/dist/admin/hooks/useBulkRemove.mjs.map +1 -0
  305. package/dist/admin/hooks/useConfig.js +57 -0
  306. package/dist/admin/hooks/useConfig.js.map +1 -0
  307. package/dist/admin/hooks/useConfig.mjs +55 -0
  308. package/dist/admin/hooks/useConfig.mjs.map +1 -0
  309. package/dist/admin/hooks/useCropImg.js +96 -0
  310. package/dist/admin/hooks/useCropImg.js.map +1 -0
  311. package/dist/admin/hooks/useCropImg.mjs +75 -0
  312. package/dist/admin/hooks/useCropImg.mjs.map +1 -0
  313. package/dist/admin/hooks/useEditAsset.js +114 -0
  314. package/dist/admin/hooks/useEditAsset.js.map +1 -0
  315. package/dist/admin/hooks/useEditAsset.mjs +93 -0
  316. package/dist/admin/hooks/useEditAsset.mjs.map +1 -0
  317. package/dist/admin/hooks/useEditFolder.js +44 -0
  318. package/dist/admin/hooks/useEditFolder.js.map +1 -0
  319. package/dist/admin/hooks/useEditFolder.mjs +42 -0
  320. package/dist/admin/hooks/useEditFolder.mjs.map +1 -0
  321. package/dist/admin/hooks/useFolder.js +58 -0
  322. package/dist/admin/hooks/useFolder.js.map +1 -0
  323. package/dist/admin/hooks/useFolder.mjs +56 -0
  324. package/dist/admin/hooks/useFolder.mjs.map +1 -0
  325. package/dist/admin/hooks/useFolderStructure.js +53 -0
  326. package/dist/admin/hooks/useFolderStructure.js.map +1 -0
  327. package/dist/admin/hooks/useFolderStructure.mjs +51 -0
  328. package/dist/admin/hooks/useFolderStructure.mjs.map +1 -0
  329. package/dist/admin/hooks/useFolders.js +107 -0
  330. package/dist/admin/hooks/useFolders.js.map +1 -0
  331. package/dist/admin/hooks/useFolders.mjs +86 -0
  332. package/dist/admin/hooks/useFolders.mjs.map +1 -0
  333. package/dist/admin/hooks/useMediaLibraryPermissions.js +16 -0
  334. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -0
  335. package/dist/admin/hooks/useMediaLibraryPermissions.mjs +14 -0
  336. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -0
  337. package/dist/admin/hooks/useModalQueryParams.js +138 -0
  338. package/dist/admin/hooks/useModalQueryParams.js.map +1 -0
  339. package/dist/admin/hooks/useModalQueryParams.mjs +117 -0
  340. package/dist/admin/hooks/useModalQueryParams.mjs.map +1 -0
  341. package/dist/admin/hooks/usePersistentState.js +31 -0
  342. package/dist/admin/hooks/usePersistentState.js.map +1 -0
  343. package/dist/admin/hooks/usePersistentState.mjs +29 -0
  344. package/dist/admin/hooks/usePersistentState.mjs.map +1 -0
  345. package/dist/admin/hooks/useRemoveAsset.js +53 -0
  346. package/dist/admin/hooks/useRemoveAsset.js.map +1 -0
  347. package/dist/admin/hooks/useRemoveAsset.mjs +51 -0
  348. package/dist/admin/hooks/useRemoveAsset.mjs.map +1 -0
  349. package/dist/admin/hooks/useSelectionState.js +85 -0
  350. package/dist/admin/hooks/useSelectionState.js.map +1 -0
  351. package/dist/admin/hooks/useSelectionState.mjs +64 -0
  352. package/dist/admin/hooks/useSelectionState.mjs.map +1 -0
  353. package/dist/admin/hooks/useUpload.js +86 -0
  354. package/dist/admin/hooks/useUpload.js.map +1 -0
  355. package/dist/admin/hooks/useUpload.mjs +65 -0
  356. package/dist/admin/hooks/useUpload.mjs.map +1 -0
  357. package/dist/admin/hooks/utils/renameKeys.js +12 -0
  358. package/dist/admin/hooks/utils/renameKeys.js.map +1 -0
  359. package/dist/admin/hooks/utils/renameKeys.mjs +10 -0
  360. package/dist/admin/hooks/utils/renameKeys.mjs.map +1 -0
  361. package/dist/admin/index.js +104 -22
  362. package/dist/admin/index.js.map +1 -1
  363. package/dist/admin/index.mjs +105 -21
  364. package/dist/admin/index.mjs.map +1 -1
  365. package/dist/admin/package.json.js +161 -0
  366. package/dist/admin/package.json.js.map +1 -0
  367. package/dist/admin/package.json.mjs +143 -0
  368. package/dist/admin/package.json.mjs.map +1 -0
  369. package/dist/admin/pages/App/App.js +94 -0
  370. package/dist/admin/pages/App/App.js.map +1 -0
  371. package/dist/admin/pages/App/App.mjs +73 -0
  372. package/dist/admin/pages/App/App.mjs.map +1 -0
  373. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +142 -0
  374. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -0
  375. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +121 -0
  376. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -0
  377. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js +108 -0
  378. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -0
  379. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs +106 -0
  380. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -0
  381. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.js +10 -0
  382. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.js.map +1 -0
  383. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.mjs +7 -0
  384. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.mjs.map +1 -0
  385. package/dist/admin/pages/App/ConfigureTheView/state/actions.js +16 -0
  386. package/dist/admin/pages/App/ConfigureTheView/state/actions.js.map +1 -0
  387. package/dist/admin/pages/App/ConfigureTheView/state/actions.mjs +13 -0
  388. package/dist/admin/pages/App/ConfigureTheView/state/actions.mjs.map +1 -0
  389. package/dist/admin/pages/App/ConfigureTheView/state/init.js +17 -0
  390. package/dist/admin/pages/App/ConfigureTheView/state/init.js.map +1 -0
  391. package/dist/admin/pages/App/ConfigureTheView/state/init.mjs +14 -0
  392. package/dist/admin/pages/App/ConfigureTheView/state/init.mjs.map +1 -0
  393. package/dist/admin/pages/App/ConfigureTheView/state/reducer.js +40 -0
  394. package/dist/admin/pages/App/ConfigureTheView/state/reducer.js.map +1 -0
  395. package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs +38 -0
  396. package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs.map +1 -0
  397. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js +453 -0
  398. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +1 -0
  399. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs +432 -0
  400. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +1 -0
  401. package/dist/admin/pages/App/MediaLibrary/components/BulkActions.js +49 -0
  402. package/dist/admin/pages/App/MediaLibrary/components/BulkActions.js.map +1 -0
  403. package/dist/admin/pages/App/MediaLibrary/components/BulkActions.mjs +47 -0
  404. package/dist/admin/pages/App/MediaLibrary/components/BulkActions.mjs.map +1 -0
  405. package/dist/admin/pages/App/MediaLibrary/components/BulkDeleteButton.js +38 -0
  406. package/dist/admin/pages/App/MediaLibrary/components/BulkDeleteButton.js.map +1 -0
  407. package/dist/admin/pages/App/MediaLibrary/components/BulkDeleteButton.mjs +36 -0
  408. package/dist/admin/pages/App/MediaLibrary/components/BulkDeleteButton.mjs.map +1 -0
  409. package/dist/admin/pages/App/MediaLibrary/components/BulkMoveButton.js +61 -0
  410. package/dist/admin/pages/App/MediaLibrary/components/BulkMoveButton.js.map +1 -0
  411. package/dist/admin/pages/App/MediaLibrary/components/BulkMoveButton.mjs +40 -0
  412. package/dist/admin/pages/App/MediaLibrary/components/BulkMoveButton.mjs.map +1 -0
  413. package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.js +66 -0
  414. package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.js.map +1 -0
  415. package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.mjs +64 -0
  416. package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.mjs.map +1 -0
  417. package/dist/admin/pages/App/MediaLibrary/components/Filters.js +94 -0
  418. package/dist/admin/pages/App/MediaLibrary/components/Filters.js.map +1 -0
  419. package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs +73 -0
  420. package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs.map +1 -0
  421. package/dist/admin/pages/App/MediaLibrary/components/Header.js +76 -0
  422. package/dist/admin/pages/App/MediaLibrary/components/Header.js.map +1 -0
  423. package/dist/admin/pages/App/MediaLibrary/components/Header.mjs +74 -0
  424. package/dist/admin/pages/App/MediaLibrary/components/Header.mjs.map +1 -0
  425. package/dist/admin/{chunks/SettingsPage-DcdF16oj.js → pages/SettingsPage/SettingsPage.js} +18 -67
  426. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -0
  427. package/dist/admin/{chunks/SettingsPage-kY2dZHnP.mjs → pages/SettingsPage/SettingsPage.mjs} +6 -55
  428. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -0
  429. package/dist/admin/pages/SettingsPage/init.js +8 -0
  430. package/dist/admin/pages/SettingsPage/init.js.map +1 -0
  431. package/dist/admin/pages/SettingsPage/init.mjs +6 -0
  432. package/dist/admin/pages/SettingsPage/init.mjs.map +1 -0
  433. package/dist/admin/pages/SettingsPage/reducer.js +43 -0
  434. package/dist/admin/pages/SettingsPage/reducer.js.map +1 -0
  435. package/dist/admin/pages/SettingsPage/reducer.mjs +40 -0
  436. package/dist/admin/pages/SettingsPage/reducer.mjs.map +1 -0
  437. package/dist/admin/pluginId.js +8 -0
  438. package/dist/admin/pluginId.js.map +1 -0
  439. package/dist/admin/pluginId.mjs +6 -0
  440. package/dist/admin/pluginId.mjs.map +1 -0
  441. package/dist/admin/{chunks/ca-pCOhKIn8.js → translations/ca.json.js} +2 -2
  442. package/dist/admin/translations/ca.json.js.map +1 -0
  443. package/dist/admin/{chunks/ca-Bi4qskZD.mjs → translations/ca.json.mjs} +1 -1
  444. package/dist/admin/translations/ca.json.mjs.map +1 -0
  445. package/dist/admin/{chunks/de-DUjKLmOP.js → translations/de.json.js} +2 -2
  446. package/dist/admin/translations/de.json.js.map +1 -0
  447. package/dist/admin/{chunks/de-BlbX8Dl_.mjs → translations/de.json.mjs} +1 -1
  448. package/dist/admin/translations/de.json.mjs.map +1 -0
  449. package/dist/admin/{chunks/dk-DSsspA0e.js → translations/dk.json.js} +2 -2
  450. package/dist/admin/translations/dk.json.js.map +1 -0
  451. package/dist/admin/{chunks/dk-C2ydE6A7.mjs → translations/dk.json.mjs} +1 -1
  452. package/dist/admin/translations/dk.json.mjs.map +1 -0
  453. package/dist/admin/{chunks/en-UjETkewz.js → translations/en.json.js} +2 -2
  454. package/dist/admin/translations/en.json.js.map +1 -0
  455. package/dist/admin/{chunks/en-Bw_Cb2IV.mjs → translations/en.json.mjs} +1 -1
  456. package/dist/admin/translations/en.json.mjs.map +1 -0
  457. package/dist/admin/{chunks/es-qAL8YcZz.js → translations/es.json.js} +2 -2
  458. package/dist/admin/translations/es.json.js.map +1 -0
  459. package/dist/admin/{chunks/es-CiEgbw0k.mjs → translations/es.json.mjs} +1 -1
  460. package/dist/admin/translations/es.json.mjs.map +1 -0
  461. package/dist/admin/{chunks/fr-BL0Uyj6j.js → translations/fr.json.js} +2 -2
  462. package/dist/admin/translations/fr.json.js.map +1 -0
  463. package/dist/admin/{chunks/fr-CwRt2FJu.mjs → translations/fr.json.mjs} +1 -1
  464. package/dist/admin/translations/fr.json.mjs.map +1 -0
  465. package/dist/admin/{chunks/he-BAmhVpfZ.js → translations/he.json.js} +2 -2
  466. package/dist/admin/translations/he.json.js.map +1 -0
  467. package/dist/admin/{chunks/he-DdpYNQdt.mjs → translations/he.json.mjs} +1 -1
  468. package/dist/admin/translations/he.json.mjs.map +1 -0
  469. package/dist/admin/{chunks/it-_NQZYepl.js → translations/it.json.js} +2 -2
  470. package/dist/admin/translations/it.json.js.map +1 -0
  471. package/dist/admin/{chunks/it-Be4kgSNB.mjs → translations/it.json.mjs} +1 -1
  472. package/dist/admin/translations/it.json.mjs.map +1 -0
  473. package/dist/admin/{chunks/ja-B75QiyXf.js → translations/ja.json.js} +2 -2
  474. package/dist/admin/translations/ja.json.js.map +1 -0
  475. package/dist/admin/{chunks/ja-U1NhT0bU.mjs → translations/ja.json.mjs} +1 -1
  476. package/dist/admin/translations/ja.json.mjs.map +1 -0
  477. package/dist/admin/{chunks/ko-BOvUcJqv.js → translations/ko.json.js} +2 -2
  478. package/dist/admin/translations/ko.json.js.map +1 -0
  479. package/dist/admin/{chunks/ko-BciqXefq.mjs → translations/ko.json.mjs} +1 -1
  480. package/dist/admin/translations/ko.json.mjs.map +1 -0
  481. package/dist/admin/{chunks/ms-B7Zl6Lm9.js → translations/ms.json.js} +2 -2
  482. package/dist/admin/translations/ms.json.js.map +1 -0
  483. package/dist/admin/{chunks/ms-D-8McNeg.mjs → translations/ms.json.mjs} +1 -1
  484. package/dist/admin/translations/ms.json.mjs.map +1 -0
  485. package/dist/admin/{chunks/pl-cYDYHOEf.js → translations/pl.json.js} +2 -2
  486. package/dist/admin/translations/pl.json.js.map +1 -0
  487. package/dist/admin/{chunks/pl-DdUYocl5.mjs → translations/pl.json.mjs} +1 -1
  488. package/dist/admin/translations/pl.json.mjs.map +1 -0
  489. package/dist/admin/{chunks/pt-BR-D1u_azCM.js → translations/pt-BR.json.js} +2 -2
  490. package/dist/admin/translations/pt-BR.json.js.map +1 -0
  491. package/dist/admin/{chunks/pt-BR-Demjoq41.mjs → translations/pt-BR.json.mjs} +1 -1
  492. package/dist/admin/translations/pt-BR.json.mjs.map +1 -0
  493. package/dist/admin/{chunks/pt-L2DZeTPL.js → translations/pt.json.js} +2 -2
  494. package/dist/admin/translations/pt.json.js.map +1 -0
  495. package/dist/admin/{chunks/pt-D8is2LpS.mjs → translations/pt.json.mjs} +1 -1
  496. package/dist/admin/translations/pt.json.mjs.map +1 -0
  497. package/dist/admin/{chunks/ru-Uxbk_WWv.js → translations/ru.json.js} +2 -2
  498. package/dist/admin/translations/ru.json.js.map +1 -0
  499. package/dist/admin/{chunks/ru-CGgHRTey.mjs → translations/ru.json.mjs} +1 -1
  500. package/dist/admin/translations/ru.json.mjs.map +1 -0
  501. package/dist/admin/{chunks/sk-BlLP5HAX.js → translations/sk.json.js} +2 -2
  502. package/dist/admin/translations/sk.json.js.map +1 -0
  503. package/dist/admin/{chunks/sk-xtSwaPXq.mjs → translations/sk.json.mjs} +1 -1
  504. package/dist/admin/translations/sk.json.mjs.map +1 -0
  505. package/dist/admin/{chunks/th-DNxPLegS.js → translations/th.json.js} +2 -2
  506. package/dist/admin/translations/th.json.js.map +1 -0
  507. package/dist/admin/{chunks/th-BOpLVfmg.mjs → translations/th.json.mjs} +1 -1
  508. package/dist/admin/translations/th.json.mjs.map +1 -0
  509. package/dist/admin/{chunks/tr-DWgXG75k.js → translations/tr.json.js} +2 -2
  510. package/dist/admin/translations/tr.json.js.map +1 -0
  511. package/dist/admin/{chunks/tr-BmAPh-f1.mjs → translations/tr.json.mjs} +1 -1
  512. package/dist/admin/translations/tr.json.mjs.map +1 -0
  513. package/dist/admin/{chunks/uk-Cfm1dM3v.js → translations/uk.json.js} +2 -2
  514. package/dist/admin/translations/uk.json.js.map +1 -0
  515. package/dist/admin/{chunks/uk-DPZD6U8g.mjs → translations/uk.json.mjs} +1 -1
  516. package/dist/admin/translations/uk.json.mjs.map +1 -0
  517. package/dist/admin/{chunks/zh-Hans-B8qxMQIl.js → translations/zh-Hans.json.js} +2 -2
  518. package/dist/admin/{chunks/ca-Bi4qskZD.mjs.map → translations/zh-Hans.json.js.map} +1 -1
  519. package/dist/admin/{chunks/zh-Hans-B1GabBRx.mjs → translations/zh-Hans.json.mjs} +1 -1
  520. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -0
  521. package/dist/admin/{chunks/zh-MemsyMV6.js → translations/zh.json.js} +2 -2
  522. package/dist/admin/translations/zh.json.js.map +1 -0
  523. package/dist/admin/{chunks/zh-BIl0qgBy.mjs → translations/zh.json.mjs} +1 -1
  524. package/dist/admin/translations/zh.json.mjs.map +1 -0
  525. package/dist/admin/utils/appendSearchParamsToUrl.js +17 -0
  526. package/dist/admin/utils/appendSearchParamsToUrl.js.map +1 -0
  527. package/dist/admin/utils/appendSearchParamsToUrl.mjs +15 -0
  528. package/dist/admin/utils/appendSearchParamsToUrl.mjs.map +1 -0
  529. package/dist/admin/utils/containsAssetFilter.js +18 -0
  530. package/dist/admin/utils/containsAssetFilter.js.map +1 -0
  531. package/dist/admin/utils/containsAssetFilter.mjs +16 -0
  532. package/dist/admin/utils/containsAssetFilter.mjs.map +1 -0
  533. package/dist/admin/utils/createAssetUrl.js +14 -0
  534. package/dist/admin/utils/createAssetUrl.js.map +1 -0
  535. package/dist/admin/utils/createAssetUrl.mjs +12 -0
  536. package/dist/admin/utils/createAssetUrl.mjs.map +1 -0
  537. package/dist/admin/utils/displayedFilters.js +52 -0
  538. package/dist/admin/utils/displayedFilters.js.map +1 -0
  539. package/dist/admin/utils/displayedFilters.mjs +50 -0
  540. package/dist/admin/utils/displayedFilters.mjs.map +1 -0
  541. package/dist/admin/utils/downloadFile.js +13 -0
  542. package/dist/admin/utils/downloadFile.js.map +1 -0
  543. package/dist/admin/utils/downloadFile.mjs +11 -0
  544. package/dist/admin/utils/downloadFile.mjs.map +1 -0
  545. package/dist/admin/utils/findRecursiveFolderByValue.js +17 -0
  546. package/dist/admin/utils/findRecursiveFolderByValue.js.map +1 -0
  547. package/dist/admin/utils/findRecursiveFolderByValue.mjs +15 -0
  548. package/dist/admin/utils/findRecursiveFolderByValue.mjs.map +1 -0
  549. package/dist/admin/utils/formatBytes.js +17 -0
  550. package/dist/admin/utils/formatBytes.js.map +1 -0
  551. package/dist/admin/utils/formatBytes.mjs +15 -0
  552. package/dist/admin/utils/formatBytes.mjs.map +1 -0
  553. package/dist/admin/utils/formatDuration.js +15 -0
  554. package/dist/admin/utils/formatDuration.js.map +1 -0
  555. package/dist/admin/utils/formatDuration.mjs +13 -0
  556. package/dist/admin/utils/formatDuration.mjs.map +1 -0
  557. package/dist/admin/utils/getAPIInnerErrors.js +26 -0
  558. package/dist/admin/utils/getAPIInnerErrors.js.map +1 -0
  559. package/dist/admin/utils/getAPIInnerErrors.mjs +24 -0
  560. package/dist/admin/utils/getAPIInnerErrors.mjs.map +1 -0
  561. package/dist/admin/utils/getAllowedFiles.js +25 -0
  562. package/dist/admin/utils/getAllowedFiles.js.map +1 -0
  563. package/dist/admin/utils/getAllowedFiles.mjs +23 -0
  564. package/dist/admin/utils/getAllowedFiles.mjs.map +1 -0
  565. package/dist/admin/utils/getBreadcrumbDataCM.js +36 -0
  566. package/dist/admin/utils/getBreadcrumbDataCM.js.map +1 -0
  567. package/dist/admin/utils/getBreadcrumbDataCM.mjs +34 -0
  568. package/dist/admin/utils/getBreadcrumbDataCM.mjs.map +1 -0
  569. package/dist/admin/utils/getBreadcrumbDataML.js +40 -0
  570. package/dist/admin/utils/getBreadcrumbDataML.js.map +1 -0
  571. package/dist/admin/utils/getBreadcrumbDataML.mjs +38 -0
  572. package/dist/admin/utils/getBreadcrumbDataML.mjs.map +1 -0
  573. package/dist/admin/utils/getFileExtension.js +6 -0
  574. package/dist/admin/utils/getFileExtension.js.map +1 -0
  575. package/dist/admin/utils/getFileExtension.mjs +4 -0
  576. package/dist/admin/utils/getFileExtension.mjs.map +1 -0
  577. package/dist/admin/utils/getFolderParents.js +26 -0
  578. package/dist/admin/utils/getFolderParents.js.map +1 -0
  579. package/dist/admin/utils/getFolderParents.mjs +24 -0
  580. package/dist/admin/utils/getFolderParents.mjs.map +1 -0
  581. package/dist/admin/utils/getFolderURL.js +20 -0
  582. package/dist/admin/utils/getFolderURL.js.map +1 -0
  583. package/dist/admin/utils/getFolderURL.mjs +18 -0
  584. package/dist/admin/utils/getFolderURL.mjs.map +1 -0
  585. package/dist/admin/utils/getTrad.js +8 -0
  586. package/dist/admin/utils/getTrad.js.map +1 -0
  587. package/dist/admin/utils/getTrad.mjs +6 -0
  588. package/dist/admin/utils/getTrad.mjs.map +1 -0
  589. package/dist/admin/utils/moveElement.js +16 -0
  590. package/dist/admin/utils/moveElement.js.map +1 -0
  591. package/dist/admin/utils/moveElement.mjs +14 -0
  592. package/dist/admin/utils/moveElement.mjs.map +1 -0
  593. package/dist/admin/utils/normalizeAPIError.js +55 -0
  594. package/dist/admin/utils/normalizeAPIError.js.map +1 -0
  595. package/dist/admin/utils/normalizeAPIError.mjs +53 -0
  596. package/dist/admin/utils/normalizeAPIError.mjs.map +1 -0
  597. package/dist/admin/utils/prefixFileUrlWithBackendUrl.js +8 -0
  598. package/dist/admin/utils/prefixFileUrlWithBackendUrl.js.map +1 -0
  599. package/dist/admin/utils/prefixFileUrlWithBackendUrl.mjs +6 -0
  600. package/dist/admin/utils/prefixFileUrlWithBackendUrl.mjs.map +1 -0
  601. package/dist/admin/utils/prefixPluginTranslations.js +14 -0
  602. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  603. package/dist/admin/utils/prefixPluginTranslations.mjs +12 -0
  604. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  605. package/dist/admin/utils/rawFileToAsset.js +21 -0
  606. package/dist/admin/utils/rawFileToAsset.js.map +1 -0
  607. package/dist/admin/utils/rawFileToAsset.mjs +19 -0
  608. package/dist/admin/utils/rawFileToAsset.mjs.map +1 -0
  609. package/dist/admin/utils/toSingularTypes.js +11 -0
  610. package/dist/admin/utils/toSingularTypes.js.map +1 -0
  611. package/dist/admin/utils/toSingularTypes.mjs +9 -0
  612. package/dist/admin/utils/toSingularTypes.mjs.map +1 -0
  613. package/dist/admin/utils/typeFromMime.js +19 -0
  614. package/dist/admin/utils/typeFromMime.js.map +1 -0
  615. package/dist/admin/utils/typeFromMime.mjs +17 -0
  616. package/dist/admin/utils/typeFromMime.mjs.map +1 -0
  617. package/dist/admin/utils/urlYupSchema.js +72 -0
  618. package/dist/admin/utils/urlYupSchema.js.map +1 -0
  619. package/dist/admin/utils/urlYupSchema.mjs +51 -0
  620. package/dist/admin/utils/urlYupSchema.mjs.map +1 -0
  621. package/dist/admin/utils/urlsToAssets.js +39 -0
  622. package/dist/admin/utils/urlsToAssets.js.map +1 -0
  623. package/dist/admin/utils/urlsToAssets.mjs +37 -0
  624. package/dist/admin/utils/urlsToAssets.mjs.map +1 -0
  625. package/dist/server/bootstrap.js +98 -0
  626. package/dist/server/bootstrap.js.map +1 -0
  627. package/dist/server/bootstrap.mjs +96 -0
  628. package/dist/server/bootstrap.mjs.map +1 -0
  629. package/dist/server/config.js +14 -0
  630. package/dist/server/config.js.map +1 -0
  631. package/dist/server/config.mjs +12 -0
  632. package/dist/server/config.mjs.map +1 -0
  633. package/dist/server/constants.js +35 -0
  634. package/dist/server/constants.js.map +1 -0
  635. package/dist/server/constants.mjs +28 -0
  636. package/dist/server/constants.mjs.map +1 -0
  637. package/dist/server/content-types/file.js +155 -0
  638. package/dist/server/content-types/file.js.map +1 -0
  639. package/dist/server/content-types/file.mjs +153 -0
  640. package/dist/server/content-types/file.mjs.map +1 -0
  641. package/dist/server/content-types/folder.js +78 -0
  642. package/dist/server/content-types/folder.js.map +1 -0
  643. package/dist/server/content-types/folder.mjs +76 -0
  644. package/dist/server/content-types/folder.mjs.map +1 -0
  645. package/dist/server/content-types/index.js +12 -0
  646. package/dist/server/content-types/index.js.map +1 -0
  647. package/dist/server/content-types/index.mjs +10 -0
  648. package/dist/server/content-types/index.mjs.map +1 -0
  649. package/dist/server/controllers/admin-file.js +61 -0
  650. package/dist/server/controllers/admin-file.js.map +1 -0
  651. package/dist/server/controllers/admin-file.mjs +59 -0
  652. package/dist/server/controllers/admin-file.mjs.map +1 -0
  653. package/dist/server/controllers/admin-folder-file.js +189 -0
  654. package/dist/server/controllers/admin-folder-file.js.map +1 -0
  655. package/dist/server/controllers/admin-folder-file.mjs +187 -0
  656. package/dist/server/controllers/admin-folder-file.mjs.map +1 -0
  657. package/dist/server/controllers/admin-folder.js +104 -0
  658. package/dist/server/controllers/admin-folder.js.map +1 -0
  659. package/dist/server/controllers/admin-folder.mjs +102 -0
  660. package/dist/server/controllers/admin-folder.mjs.map +1 -0
  661. package/dist/server/controllers/admin-settings.js +32 -0
  662. package/dist/server/controllers/admin-settings.js.map +1 -0
  663. package/dist/server/controllers/admin-settings.mjs +30 -0
  664. package/dist/server/controllers/admin-settings.mjs.map +1 -0
  665. package/dist/server/controllers/admin-upload.js +88 -0
  666. package/dist/server/controllers/admin-upload.js.map +1 -0
  667. package/dist/server/controllers/admin-upload.mjs +86 -0
  668. package/dist/server/controllers/admin-upload.mjs.map +1 -0
  669. package/dist/server/controllers/content-api.js +122 -0
  670. package/dist/server/controllers/content-api.js.map +1 -0
  671. package/dist/server/controllers/content-api.mjs +120 -0
  672. package/dist/server/controllers/content-api.mjs.map +1 -0
  673. package/dist/server/controllers/index.js +22 -0
  674. package/dist/server/controllers/index.js.map +1 -0
  675. package/dist/server/controllers/index.mjs +20 -0
  676. package/dist/server/controllers/index.mjs.map +1 -0
  677. package/dist/server/controllers/utils/find-entity-and-check-permissions.js +38 -0
  678. package/dist/server/controllers/utils/find-entity-and-check-permissions.js.map +1 -0
  679. package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs +36 -0
  680. package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs.map +1 -0
  681. package/dist/server/controllers/utils/folders.js +6 -0
  682. package/dist/server/controllers/utils/folders.js.map +1 -0
  683. package/dist/server/controllers/utils/folders.mjs +4 -0
  684. package/dist/server/controllers/utils/folders.mjs.map +1 -0
  685. package/dist/server/controllers/validation/admin/configureView.js +13 -0
  686. package/dist/server/controllers/validation/admin/configureView.js.map +1 -0
  687. package/dist/server/controllers/validation/admin/configureView.mjs +11 -0
  688. package/dist/server/controllers/validation/admin/configureView.mjs.map +1 -0
  689. package/dist/server/controllers/validation/admin/folder-file.js +88 -0
  690. package/dist/server/controllers/validation/admin/folder-file.js.map +1 -0
  691. package/dist/server/controllers/validation/admin/folder-file.mjs +85 -0
  692. package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -0
  693. package/dist/server/controllers/validation/admin/folder.js +69 -0
  694. package/dist/server/controllers/validation/admin/folder.js.map +1 -0
  695. package/dist/server/controllers/validation/admin/folder.mjs +66 -0
  696. package/dist/server/controllers/validation/admin/folder.mjs.map +1 -0
  697. package/dist/server/controllers/validation/admin/settings.js +13 -0
  698. package/dist/server/controllers/validation/admin/settings.js.map +1 -0
  699. package/dist/server/controllers/validation/admin/settings.mjs +11 -0
  700. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -0
  701. package/dist/server/controllers/validation/admin/upload.js +35 -0
  702. package/dist/server/controllers/validation/admin/upload.js.map +1 -0
  703. package/dist/server/controllers/validation/admin/upload.mjs +33 -0
  704. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -0
  705. package/dist/server/controllers/validation/admin/utils.js +17 -0
  706. package/dist/server/controllers/validation/admin/utils.js.map +1 -0
  707. package/dist/server/controllers/validation/admin/utils.mjs +15 -0
  708. package/dist/server/controllers/validation/admin/utils.mjs.map +1 -0
  709. package/dist/server/controllers/validation/content-api/upload.js +24 -0
  710. package/dist/server/controllers/validation/content-api/upload.js.map +1 -0
  711. package/dist/server/controllers/validation/content-api/upload.mjs +22 -0
  712. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -0
  713. package/dist/server/controllers/view-configuration.js +28 -0
  714. package/dist/server/controllers/view-configuration.js.map +1 -0
  715. package/dist/server/controllers/view-configuration.mjs +26 -0
  716. package/dist/server/controllers/view-configuration.mjs.map +1 -0
  717. package/dist/server/documentation/content-api.json.js +290 -0
  718. package/dist/server/documentation/content-api.json.js.map +1 -0
  719. package/dist/server/documentation/content-api.json.mjs +284 -0
  720. package/dist/server/documentation/content-api.json.mjs.map +1 -0
  721. package/dist/server/{chunks/graphql-CwNPX8zo.js → graphql.js} +3 -16
  722. package/dist/server/graphql.js.map +1 -0
  723. package/dist/server/{chunks/graphql-K9HaGS9d.mjs → graphql.mjs} +2 -15
  724. package/dist/server/graphql.mjs.map +1 -0
  725. package/dist/server/index.js +17 -16
  726. package/dist/server/index.js.map +1 -1
  727. package/dist/server/index.mjs +19 -14
  728. package/dist/server/index.mjs.map +1 -1
  729. package/dist/server/middlewares/upload.js +38 -0
  730. package/dist/server/middlewares/upload.js.map +1 -0
  731. package/dist/server/middlewares/upload.mjs +36 -0
  732. package/dist/server/middlewares/upload.mjs.map +1 -0
  733. package/dist/server/register.js +88 -0
  734. package/dist/server/register.js.map +1 -0
  735. package/dist/server/register.mjs +86 -0
  736. package/dist/server/register.mjs.map +1 -0
  737. package/dist/server/routes/admin.js +236 -0
  738. package/dist/server/routes/admin.js.map +1 -0
  739. package/dist/server/routes/admin.mjs +234 -0
  740. package/dist/server/routes/admin.mjs.map +1 -0
  741. package/dist/server/routes/content-api.js +30 -0
  742. package/dist/server/routes/content-api.js.map +1 -0
  743. package/dist/server/routes/content-api.mjs +28 -0
  744. package/dist/server/routes/content-api.mjs.map +1 -0
  745. package/dist/server/routes/index.js +14 -0
  746. package/dist/server/routes/index.js.map +1 -0
  747. package/dist/server/routes/index.mjs +12 -0
  748. package/dist/server/routes/index.mjs.map +1 -0
  749. package/dist/server/routes/view-configuration.js +40 -0
  750. package/dist/server/routes/view-configuration.js.map +1 -0
  751. package/dist/server/routes/view-configuration.mjs +38 -0
  752. package/dist/server/routes/view-configuration.mjs.map +1 -0
  753. package/dist/server/services/api-upload-folder.js +52 -0
  754. package/dist/server/services/api-upload-folder.js.map +1 -0
  755. package/dist/server/services/api-upload-folder.mjs +50 -0
  756. package/dist/server/services/api-upload-folder.mjs.map +1 -0
  757. package/dist/server/services/extensions/index.js +40 -0
  758. package/dist/server/services/extensions/index.js.map +1 -0
  759. package/dist/server/services/extensions/index.mjs +38 -0
  760. package/dist/server/services/extensions/index.mjs.map +1 -0
  761. package/dist/server/services/extensions/utils.js +53 -0
  762. package/dist/server/services/extensions/utils.js.map +1 -0
  763. package/dist/server/services/extensions/utils.mjs +51 -0
  764. package/dist/server/services/extensions/utils.mjs.map +1 -0
  765. package/dist/server/services/file.js +57 -0
  766. package/dist/server/services/file.js.map +1 -0
  767. package/dist/server/services/file.mjs +55 -0
  768. package/dist/server/services/file.mjs.map +1 -0
  769. package/dist/server/services/folder.js +275 -0
  770. package/dist/server/services/folder.js.map +1 -0
  771. package/dist/server/services/folder.mjs +273 -0
  772. package/dist/server/services/folder.mjs.map +1 -0
  773. package/dist/server/services/image-manipulation.js +255 -0
  774. package/dist/server/services/image-manipulation.js.map +1 -0
  775. package/dist/server/services/image-manipulation.mjs +253 -0
  776. package/dist/server/services/image-manipulation.mjs.map +1 -0
  777. package/dist/server/services/index.js +26 -0
  778. package/dist/server/services/index.js.map +1 -0
  779. package/dist/server/services/index.mjs +24 -0
  780. package/dist/server/services/index.mjs.map +1 -0
  781. package/dist/server/services/metrics.js +19 -0
  782. package/dist/server/services/metrics.js.map +1 -0
  783. package/dist/server/services/metrics.mjs +17 -0
  784. package/dist/server/services/metrics.mjs.map +1 -0
  785. package/dist/server/services/provider.js +33 -0
  786. package/dist/server/services/provider.js.map +1 -0
  787. package/dist/server/services/provider.mjs +31 -0
  788. package/dist/server/services/provider.mjs.map +1 -0
  789. package/dist/server/services/upload.js +445 -0
  790. package/dist/server/services/upload.js.map +1 -0
  791. package/dist/server/services/upload.mjs +443 -0
  792. package/dist/server/services/upload.mjs.map +1 -0
  793. package/dist/server/services/weekly-metrics.js +127 -0
  794. package/dist/server/services/weekly-metrics.js.map +1 -0
  795. package/dist/server/services/weekly-metrics.mjs +125 -0
  796. package/dist/server/services/weekly-metrics.mjs.map +1 -0
  797. package/dist/server/utils/cron.js +6 -0
  798. package/dist/server/utils/cron.js.map +1 -0
  799. package/dist/server/utils/cron.mjs +4 -0
  800. package/dist/server/utils/cron.mjs.map +1 -0
  801. package/dist/server/utils/index.js +8 -0
  802. package/dist/server/utils/index.js.map +1 -0
  803. package/dist/server/utils/index.mjs +6 -0
  804. package/dist/server/utils/index.mjs.map +1 -0
  805. package/package.json +5 -5
  806. package/dist/admin/chunks/App-G8sLZSN0.js +0 -993
  807. package/dist/admin/chunks/App-G8sLZSN0.js.map +0 -1
  808. package/dist/admin/chunks/App-h5xGw9X8.mjs +0 -972
  809. package/dist/admin/chunks/App-h5xGw9X8.mjs.map +0 -1
  810. package/dist/admin/chunks/ConfigureTheView-CO72K73d.mjs +0 -276
  811. package/dist/admin/chunks/ConfigureTheView-CO72K73d.mjs.map +0 -1
  812. package/dist/admin/chunks/ConfigureTheView-D9XLMDtA.js +0 -297
  813. package/dist/admin/chunks/ConfigureTheView-D9XLMDtA.js.map +0 -1
  814. package/dist/admin/chunks/SettingsPage-DcdF16oj.js.map +0 -1
  815. package/dist/admin/chunks/SettingsPage-kY2dZHnP.mjs.map +0 -1
  816. package/dist/admin/chunks/ca-pCOhKIn8.js.map +0 -1
  817. package/dist/admin/chunks/de-BlbX8Dl_.mjs.map +0 -1
  818. package/dist/admin/chunks/de-DUjKLmOP.js.map +0 -1
  819. package/dist/admin/chunks/dk-C2ydE6A7.mjs.map +0 -1
  820. package/dist/admin/chunks/dk-DSsspA0e.js.map +0 -1
  821. package/dist/admin/chunks/en-Bw_Cb2IV.mjs.map +0 -1
  822. package/dist/admin/chunks/en-UjETkewz.js.map +0 -1
  823. package/dist/admin/chunks/es-CiEgbw0k.mjs.map +0 -1
  824. package/dist/admin/chunks/es-qAL8YcZz.js.map +0 -1
  825. package/dist/admin/chunks/fr-BL0Uyj6j.js.map +0 -1
  826. package/dist/admin/chunks/fr-CwRt2FJu.mjs.map +0 -1
  827. package/dist/admin/chunks/he-BAmhVpfZ.js.map +0 -1
  828. package/dist/admin/chunks/he-DdpYNQdt.mjs.map +0 -1
  829. package/dist/admin/chunks/index-BUqiOq3Y.mjs +0 -7349
  830. package/dist/admin/chunks/index-BUqiOq3Y.mjs.map +0 -1
  831. package/dist/admin/chunks/index-DDQjAhM2.js +0 -7406
  832. package/dist/admin/chunks/index-DDQjAhM2.js.map +0 -1
  833. package/dist/admin/chunks/it-Be4kgSNB.mjs.map +0 -1
  834. package/dist/admin/chunks/it-_NQZYepl.js.map +0 -1
  835. package/dist/admin/chunks/ja-B75QiyXf.js.map +0 -1
  836. package/dist/admin/chunks/ja-U1NhT0bU.mjs.map +0 -1
  837. package/dist/admin/chunks/ko-BOvUcJqv.js.map +0 -1
  838. package/dist/admin/chunks/ko-BciqXefq.mjs.map +0 -1
  839. package/dist/admin/chunks/ms-B7Zl6Lm9.js.map +0 -1
  840. package/dist/admin/chunks/ms-D-8McNeg.mjs.map +0 -1
  841. package/dist/admin/chunks/pl-DdUYocl5.mjs.map +0 -1
  842. package/dist/admin/chunks/pl-cYDYHOEf.js.map +0 -1
  843. package/dist/admin/chunks/pt-BR-D1u_azCM.js.map +0 -1
  844. package/dist/admin/chunks/pt-BR-Demjoq41.mjs.map +0 -1
  845. package/dist/admin/chunks/pt-D8is2LpS.mjs.map +0 -1
  846. package/dist/admin/chunks/pt-L2DZeTPL.js.map +0 -1
  847. package/dist/admin/chunks/ru-CGgHRTey.mjs.map +0 -1
  848. package/dist/admin/chunks/ru-Uxbk_WWv.js.map +0 -1
  849. package/dist/admin/chunks/sk-BlLP5HAX.js.map +0 -1
  850. package/dist/admin/chunks/sk-xtSwaPXq.mjs.map +0 -1
  851. package/dist/admin/chunks/th-BOpLVfmg.mjs.map +0 -1
  852. package/dist/admin/chunks/th-DNxPLegS.js.map +0 -1
  853. package/dist/admin/chunks/tr-BmAPh-f1.mjs.map +0 -1
  854. package/dist/admin/chunks/tr-DWgXG75k.js.map +0 -1
  855. package/dist/admin/chunks/uk-Cfm1dM3v.js.map +0 -1
  856. package/dist/admin/chunks/uk-DPZD6U8g.mjs.map +0 -1
  857. package/dist/admin/chunks/zh-BIl0qgBy.mjs.map +0 -1
  858. package/dist/admin/chunks/zh-Hans-B1GabBRx.mjs.map +0 -1
  859. package/dist/admin/chunks/zh-Hans-B8qxMQIl.js.map +0 -1
  860. package/dist/admin/chunks/zh-MemsyMV6.js.map +0 -1
  861. package/dist/server/chunks/graphql-CwNPX8zo.js.map +0 -1
  862. package/dist/server/chunks/graphql-K9HaGS9d.mjs.map +0 -1
  863. package/dist/server/chunks/index-BzVus140.mjs +0 -3161
  864. package/dist/server/chunks/index-BzVus140.mjs.map +0 -1
  865. package/dist/server/chunks/index-D2QOphAI.js +0 -3164
  866. package/dist/server/chunks/index-D2QOphAI.js.map +0 -1
@@ -1,3164 +0,0 @@
1
- 'use strict';
2
-
3
- var _ = require('lodash');
4
- var utils = require('@strapi/utils');
5
- var range = require('koa-range');
6
- var koaStatic = require('koa-static');
7
- var fp = require('lodash/fp');
8
- var os = require('os');
9
- var path = require('path');
10
- var crypto = require('crypto');
11
- var fs = require('fs');
12
- var fse = require('fs-extra');
13
- var mimeTypes = require('mime-types');
14
- var sharp = require('sharp');
15
- var dateFns = require('date-fns');
16
-
17
- /**
18
- * Programmatic upload middleware. We do not want to expose it in the plugin
19
- */ var registerUploadMiddleware = (({ strapi })=>{
20
- strapi.server.app.on('error', (err)=>{
21
- if (err.code === 'EPIPE') {
22
- // when serving audio or video the browsers sometimes close the connection to go to range requests instead.
23
- // This causes koa to emit a write EPIPE error. We can ignore it.
24
- // Right now this ignores it globally and we cannot do much more because it is how koa handles it.
25
- return;
26
- }
27
- strapi.server.app.onerror(err);
28
- });
29
- const localServerConfig = strapi.config.get('plugin::upload.providerOptions.localServer', {});
30
- strapi.server.routes([
31
- {
32
- method: 'GET',
33
- path: '/uploads/(.*)',
34
- handler: [
35
- range,
36
- koaStatic(strapi.dirs.static.public, {
37
- defer: true,
38
- ...localServerConfig
39
- })
40
- ],
41
- config: {
42
- auth: false
43
- }
44
- }
45
- ]);
46
- });
47
-
48
- var paths = {
49
- "/upload": {
50
- post: {
51
- description: "Upload files",
52
- responses: {
53
- "200": {
54
- description: "response",
55
- content: {
56
- "application/json": {
57
- schema: {
58
- type: "array",
59
- items: {
60
- $ref: "#/components/schemas/UploadFile"
61
- }
62
- }
63
- }
64
- }
65
- }
66
- },
67
- summary: "",
68
- tags: [
69
- "Upload - File"
70
- ],
71
- requestBody: {
72
- description: "Upload files",
73
- required: true,
74
- content: {
75
- "multipart/form-data": {
76
- schema: {
77
- required: [
78
- "files"
79
- ],
80
- type: "object",
81
- properties: {
82
- path: {
83
- type: "string",
84
- description: "The folder where the file(s) will be uploaded to (only supported on strapi-provider-upload-aws-s3)."
85
- },
86
- refId: {
87
- type: "string",
88
- description: "The ID of the entry which the file(s) will be linked to"
89
- },
90
- ref: {
91
- type: "string",
92
- description: "The unique ID (uid) of the model which the file(s) will be linked to (api::restaurant.restaurant)."
93
- },
94
- field: {
95
- type: "string",
96
- description: "The field of the entry which the file(s) will be precisely linked to."
97
- },
98
- files: {
99
- type: "array",
100
- items: {
101
- type: "string",
102
- format: "binary"
103
- }
104
- }
105
- }
106
- }
107
- }
108
- }
109
- }
110
- }
111
- },
112
- "/upload?id={id}": {
113
- post: {
114
- parameters: [
115
- {
116
- name: "id",
117
- "in": "query",
118
- description: "File id",
119
- required: true,
120
- schema: {
121
- type: "string"
122
- }
123
- }
124
- ],
125
- description: "Upload file information",
126
- responses: {
127
- "200": {
128
- description: "response",
129
- content: {
130
- "application/json": {
131
- schema: {
132
- type: "array",
133
- items: {
134
- $ref: "#/components/schemas/UploadFile"
135
- }
136
- }
137
- }
138
- }
139
- }
140
- },
141
- summary: "",
142
- tags: [
143
- "Upload - File"
144
- ],
145
- requestBody: {
146
- description: "Upload files",
147
- required: true,
148
- content: {
149
- "multipart/form-data": {
150
- schema: {
151
- type: "object",
152
- properties: {
153
- fileInfo: {
154
- type: "object",
155
- properties: {
156
- name: {
157
- type: "string"
158
- },
159
- alternativeText: {
160
- type: "string"
161
- },
162
- caption: {
163
- type: "string"
164
- }
165
- }
166
- },
167
- files: {
168
- type: "string",
169
- format: "binary"
170
- }
171
- }
172
- }
173
- }
174
- }
175
- }
176
- }
177
- },
178
- "/upload/files": {
179
- get: {
180
- tags: [
181
- "Upload - File"
182
- ],
183
- responses: {
184
- "200": {
185
- description: "Get a list of files",
186
- content: {
187
- "application/json": {
188
- schema: {
189
- type: "array",
190
- items: {
191
- $ref: "#/components/schemas/UploadFile"
192
- }
193
- }
194
- }
195
- }
196
- }
197
- }
198
- }
199
- },
200
- "/upload/files/{id}": {
201
- get: {
202
- parameters: [
203
- {
204
- name: "id",
205
- "in": "path",
206
- description: "",
207
- deprecated: false,
208
- required: true,
209
- schema: {
210
- type: "string"
211
- }
212
- }
213
- ],
214
- tags: [
215
- "Upload - File"
216
- ],
217
- responses: {
218
- "200": {
219
- description: "Get a specific file",
220
- content: {
221
- "application/json": {
222
- schema: {
223
- $ref: "#/components/schemas/UploadFile"
224
- }
225
- }
226
- }
227
- }
228
- }
229
- },
230
- "delete": {
231
- parameters: [
232
- {
233
- name: "id",
234
- "in": "path",
235
- description: "",
236
- deprecated: false,
237
- required: true,
238
- schema: {
239
- type: "string"
240
- }
241
- }
242
- ],
243
- tags: [
244
- "Upload - File"
245
- ],
246
- responses: {
247
- "200": {
248
- description: "Delete a file",
249
- content: {
250
- "application/json": {
251
- schema: {
252
- $ref: "#/components/schemas/UploadFile"
253
- }
254
- }
255
- }
256
- }
257
- }
258
- }
259
- }
260
- };
261
- var components = {
262
- schemas: {
263
- UploadFile: {
264
- properties: {
265
- id: {
266
- type: "number"
267
- },
268
- name: {
269
- type: "string"
270
- },
271
- alternativeText: {
272
- type: "string"
273
- },
274
- caption: {
275
- type: "string"
276
- },
277
- width: {
278
- type: "number",
279
- format: "integer"
280
- },
281
- height: {
282
- type: "number",
283
- format: "integer"
284
- },
285
- formats: {
286
- type: "number"
287
- },
288
- hash: {
289
- type: "string"
290
- },
291
- ext: {
292
- type: "string"
293
- },
294
- mime: {
295
- type: "string"
296
- },
297
- size: {
298
- type: "number",
299
- format: "double"
300
- },
301
- url: {
302
- type: "string"
303
- },
304
- previewUrl: {
305
- type: "string"
306
- },
307
- provider: {
308
- type: "string"
309
- },
310
- provider_metadata: {
311
- type: "object"
312
- },
313
- createdAt: {
314
- type: "string",
315
- format: "date-time"
316
- },
317
- updatedAt: {
318
- type: "string",
319
- format: "date-time"
320
- }
321
- }
322
- }
323
- }
324
- };
325
- var spec = {
326
- paths: paths,
327
- components: components
328
- };
329
-
330
- const { PayloadTooLargeError } = utils.errors;
331
- const { bytesToHumanReadable, kbytesToBytes } = utils.file;
332
- /**
333
- * Register upload plugin
334
- */ async function register({ strapi }) {
335
- strapi.plugin('upload').provider = createProvider(strapi.config.get('plugin::upload'));
336
- await registerUploadMiddleware({
337
- strapi
338
- });
339
- if (strapi.plugin('graphql')) {
340
- const { installGraphqlExtension } = await Promise.resolve().then(function () { return require('./graphql-CwNPX8zo.js'); });
341
- installGraphqlExtension({
342
- strapi
343
- });
344
- }
345
- if (strapi.plugin('documentation')) {
346
- strapi.plugin('documentation').service('override').registerOverride(spec, {
347
- pluginOrigin: 'upload',
348
- excludeFromGeneration: [
349
- 'upload'
350
- ]
351
- });
352
- }
353
- }
354
- const createProvider = (config)=>{
355
- const { providerOptions, actionOptions = {} } = config;
356
- const providerName = _.toLower(config.provider);
357
- let provider;
358
- let modulePath;
359
- try {
360
- modulePath = require.resolve(`@strapi/provider-upload-${providerName}`);
361
- } catch (error) {
362
- if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'MODULE_NOT_FOUND') {
363
- modulePath = providerName;
364
- } else {
365
- throw error;
366
- }
367
- }
368
- try {
369
- provider = require(modulePath);
370
- } catch (err) {
371
- const newError = new Error(`Could not load upload provider "${providerName}".`);
372
- if (err instanceof Error) {
373
- newError.stack = err.stack;
374
- }
375
- throw newError;
376
- }
377
- const providerInstance = provider.init(providerOptions);
378
- if (!providerInstance.delete) {
379
- throw new Error(`The upload provider "${providerName}" doesn't implement the delete method.`);
380
- }
381
- if (!providerInstance.upload && !providerInstance.uploadStream) {
382
- throw new Error(`The upload provider "${providerName}" doesn't implement the uploadStream nor the upload method.`);
383
- }
384
- if (!providerInstance.uploadStream) {
385
- process.emitWarning(`The upload provider "${providerName}" doesn't implement the uploadStream function. Strapi will fallback on the upload method. Some performance issues may occur.`);
386
- }
387
- const wrappedProvider = _.mapValues(providerInstance, (method, methodName)=>{
388
- return async (file, options = actionOptions[methodName])=>providerInstance[methodName](file, options);
389
- });
390
- return Object.assign(Object.create(baseProvider), wrappedProvider);
391
- };
392
- const baseProvider = {
393
- extend (obj) {
394
- Object.assign(this, obj);
395
- },
396
- checkFileSize (file, { sizeLimit }) {
397
- if (sizeLimit && kbytesToBytes(file.size) > sizeLimit) {
398
- throw new PayloadTooLargeError(`${file.originalFilename} exceeds size limit of ${bytesToHumanReadable(sizeLimit)}.`);
399
- }
400
- },
401
- getSignedUrl (file) {
402
- return file;
403
- },
404
- isPrivate () {
405
- return false;
406
- }
407
- };
408
-
409
- const getService = (name)=>{
410
- return strapi.plugin('upload').service(name);
411
- };
412
-
413
- const ACTIONS = {
414
- read: 'plugin::upload.read',
415
- readSettings: 'plugin::upload.settings.read',
416
- create: 'plugin::upload.assets.create',
417
- update: 'plugin::upload.assets.update',
418
- download: 'plugin::upload.assets.download',
419
- copyLink: 'plugin::upload.assets.copy-link',
420
- configureView: 'plugin::upload.configure-view'
421
- };
422
- const ALLOWED_SORT_STRINGS = [
423
- 'createdAt:DESC',
424
- 'createdAt:ASC',
425
- 'name:ASC',
426
- 'name:DESC',
427
- 'updatedAt:DESC',
428
- 'updatedAt:ASC'
429
- ];
430
- const ALLOWED_WEBHOOK_EVENTS = {
431
- MEDIA_CREATE: 'media.create',
432
- MEDIA_UPDATE: 'media.update',
433
- MEDIA_DELETE: 'media.delete'
434
- };
435
- const FOLDER_MODEL_UID = 'plugin::upload.folder';
436
- const FILE_MODEL_UID = 'plugin::upload.file';
437
- const API_UPLOAD_FOLDER_BASE_NAME = 'API Uploads';
438
-
439
- async function bootstrap({ strapi: strapi1 }) {
440
- const defaultConfig = {
441
- settings: {
442
- sizeOptimization: true,
443
- responsiveDimensions: true,
444
- autoOrientation: false
445
- },
446
- view_configuration: {
447
- pageSize: 10,
448
- sort: ALLOWED_SORT_STRINGS[0]
449
- }
450
- };
451
- for (const [key, defaultValue] of Object.entries(defaultConfig)){
452
- // set plugin store
453
- const configurator = strapi1.store({
454
- type: 'plugin',
455
- name: 'upload',
456
- key
457
- });
458
- const config = await configurator.get({});
459
- if (config && Object.keys(defaultValue).every((key)=>Object.prototype.hasOwnProperty.call(config, key))) {
460
- continue;
461
- }
462
- // if the config does not exist or does not have all the required keys
463
- // set from the defaultValue ensuring all required settings are present
464
- await configurator.set({
465
- value: Object.assign(defaultValue, config || {})
466
- });
467
- }
468
- await registerPermissionActions();
469
- await registerWebhookEvents();
470
- await getService('weeklyMetrics').registerCron();
471
- getService('metrics').sendUploadPluginMetrics();
472
- getService('extensions').signFileUrlsOnDocumentService();
473
- }
474
- const registerWebhookEvents = async ()=>Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value])=>{
475
- strapi.get('webhookStore').addAllowedEvent(key, value);
476
- });
477
- const registerPermissionActions = async ()=>{
478
- const actions = [
479
- {
480
- section: 'plugins',
481
- displayName: 'Access the Media Library',
482
- uid: 'read',
483
- pluginName: 'upload'
484
- },
485
- {
486
- section: 'plugins',
487
- displayName: 'Create (upload)',
488
- uid: 'assets.create',
489
- subCategory: 'assets',
490
- pluginName: 'upload'
491
- },
492
- {
493
- section: 'plugins',
494
- displayName: 'Update (crop, details, replace) + delete',
495
- uid: 'assets.update',
496
- subCategory: 'assets',
497
- pluginName: 'upload'
498
- },
499
- {
500
- section: 'plugins',
501
- displayName: 'Download',
502
- uid: 'assets.download',
503
- subCategory: 'assets',
504
- pluginName: 'upload'
505
- },
506
- {
507
- section: 'plugins',
508
- displayName: 'Copy link',
509
- uid: 'assets.copy-link',
510
- subCategory: 'assets',
511
- pluginName: 'upload'
512
- },
513
- {
514
- section: 'plugins',
515
- displayName: 'Configure view',
516
- uid: 'configure-view',
517
- pluginName: 'upload'
518
- },
519
- {
520
- section: 'settings',
521
- displayName: 'Access the Media Library settings page',
522
- uid: 'settings.read',
523
- category: 'media library',
524
- pluginName: 'upload'
525
- }
526
- ];
527
- await strapi.service('admin::permission').actionProvider.registerMany(actions);
528
- };
529
-
530
- var file$1 = {
531
- schema: {
532
- collectionName: 'files',
533
- info: {
534
- singularName: 'file',
535
- pluralName: 'files',
536
- displayName: 'File',
537
- description: ''
538
- },
539
- options: {},
540
- pluginOptions: {
541
- 'content-manager': {
542
- visible: false
543
- },
544
- 'content-type-builder': {
545
- visible: false
546
- }
547
- },
548
- attributes: {
549
- name: {
550
- type: 'string',
551
- configurable: false,
552
- required: true
553
- },
554
- alternativeText: {
555
- type: 'string',
556
- configurable: false
557
- },
558
- caption: {
559
- type: 'string',
560
- configurable: false
561
- },
562
- width: {
563
- type: 'integer',
564
- configurable: false
565
- },
566
- height: {
567
- type: 'integer',
568
- configurable: false
569
- },
570
- formats: {
571
- type: 'json',
572
- configurable: false
573
- },
574
- hash: {
575
- type: 'string',
576
- configurable: false,
577
- required: true
578
- },
579
- ext: {
580
- type: 'string',
581
- configurable: false
582
- },
583
- mime: {
584
- type: 'string',
585
- configurable: false,
586
- required: true
587
- },
588
- size: {
589
- type: 'decimal',
590
- configurable: false,
591
- required: true
592
- },
593
- url: {
594
- type: 'string',
595
- configurable: false,
596
- required: true
597
- },
598
- previewUrl: {
599
- type: 'string',
600
- configurable: false
601
- },
602
- provider: {
603
- type: 'string',
604
- configurable: false,
605
- required: true
606
- },
607
- provider_metadata: {
608
- type: 'json',
609
- configurable: false
610
- },
611
- related: {
612
- type: 'relation',
613
- relation: 'morphToMany',
614
- configurable: false
615
- },
616
- folder: {
617
- type: 'relation',
618
- relation: 'manyToOne',
619
- target: FOLDER_MODEL_UID,
620
- inversedBy: 'files',
621
- private: true
622
- },
623
- folderPath: {
624
- type: 'string',
625
- minLength: 1,
626
- required: true,
627
- private: true,
628
- searchable: false
629
- }
630
- },
631
- // experimental feature:
632
- indexes: [
633
- {
634
- name: 'upload_files_folder_path_index',
635
- columns: [
636
- 'folder_path'
637
- ],
638
- type: null
639
- },
640
- {
641
- name: `upload_files_created_at_index`,
642
- columns: [
643
- 'created_at'
644
- ],
645
- type: null
646
- },
647
- {
648
- name: `upload_files_updated_at_index`,
649
- columns: [
650
- 'updated_at'
651
- ],
652
- type: null
653
- },
654
- {
655
- name: `upload_files_name_index`,
656
- columns: [
657
- 'name'
658
- ],
659
- type: null
660
- },
661
- {
662
- name: `upload_files_size_index`,
663
- columns: [
664
- 'size'
665
- ],
666
- type: null
667
- },
668
- {
669
- name: `upload_files_ext_index`,
670
- columns: [
671
- 'ext'
672
- ],
673
- type: null
674
- }
675
- ]
676
- }
677
- };
678
-
679
- var folder$1 = {
680
- schema: {
681
- collectionName: 'upload_folders',
682
- info: {
683
- singularName: 'folder',
684
- pluralName: 'folders',
685
- displayName: 'Folder'
686
- },
687
- options: {},
688
- pluginOptions: {
689
- 'content-manager': {
690
- visible: false
691
- },
692
- 'content-type-builder': {
693
- visible: false
694
- }
695
- },
696
- attributes: {
697
- name: {
698
- type: 'string',
699
- minLength: 1,
700
- required: true
701
- },
702
- pathId: {
703
- type: 'integer',
704
- unique: true,
705
- required: true
706
- },
707
- parent: {
708
- type: 'relation',
709
- relation: 'manyToOne',
710
- target: FOLDER_MODEL_UID,
711
- inversedBy: 'children'
712
- },
713
- children: {
714
- type: 'relation',
715
- relation: 'oneToMany',
716
- target: FOLDER_MODEL_UID,
717
- mappedBy: 'parent'
718
- },
719
- files: {
720
- type: 'relation',
721
- relation: 'oneToMany',
722
- target: FILE_MODEL_UID,
723
- mappedBy: 'folder'
724
- },
725
- path: {
726
- type: 'string',
727
- minLength: 1,
728
- required: true
729
- }
730
- },
731
- // experimental feature:
732
- indexes: [
733
- {
734
- name: 'upload_folders_path_id_index',
735
- columns: [
736
- 'path_id'
737
- ],
738
- type: 'unique'
739
- },
740
- {
741
- name: 'upload_folders_path_index',
742
- columns: [
743
- 'path'
744
- ],
745
- type: 'unique'
746
- }
747
- ]
748
- }
749
- };
750
-
751
- const contentTypes = {
752
- file: file$1,
753
- folder: folder$1
754
- };
755
-
756
- var provider = (({ strapi })=>({
757
- async checkFileSize (file) {
758
- const { sizeLimit } = strapi.config.get('plugin::upload');
759
- await strapi.plugin('upload').provider.checkFileSize(file, {
760
- sizeLimit
761
- });
762
- },
763
- async upload (file) {
764
- if (fp.isFunction(strapi.plugin('upload').provider.uploadStream)) {
765
- file.stream = file.getStream();
766
- await strapi.plugin('upload').provider.uploadStream(file);
767
- delete file.stream;
768
- if ('filepath' in file) {
769
- delete file.filepath;
770
- }
771
- } else {
772
- file.buffer = await utils.file.streamToBuffer(file.getStream());
773
- await strapi.plugin('upload').provider.upload(file);
774
- delete file.buffer;
775
- if ('filepath' in file) {
776
- delete file.filepath;
777
- }
778
- }
779
- }
780
- }));
781
-
782
- const { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = utils.contentTypes.constants;
783
- const { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;
784
- const { ApplicationError, NotFoundError } = utils.errors;
785
- const { bytesToKbytes: bytesToKbytes$1 } = utils.file;
786
- var upload = (({ strapi })=>{
787
- const randomSuffix = ()=>crypto.randomBytes(5).toString('hex');
788
- const generateFileName = (name)=>{
789
- const baseName = utils.strings.nameToSlug(name, {
790
- separator: '_',
791
- lowercase: false
792
- });
793
- return `${baseName}_${randomSuffix()}`;
794
- };
795
- const sendMediaMetrics = (data)=>{
796
- if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {
797
- strapi.telemetry.send('didSaveMediaWithCaption');
798
- }
799
- if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {
800
- strapi.telemetry.send('didSaveMediaWithAlternativeText');
801
- }
802
- };
803
- const createAndAssignTmpWorkingDirectoryToFiles = async (files)=>{
804
- const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));
805
- if (Array.isArray(files)) {
806
- files.forEach((file)=>{
807
- file.tmpWorkingDirectory = tmpWorkingDirectory;
808
- });
809
- } else {
810
- files.tmpWorkingDirectory = tmpWorkingDirectory;
811
- }
812
- return tmpWorkingDirectory;
813
- };
814
- function filenameReservedRegex() {
815
- // eslint-disable-next-line no-control-regex
816
- return /[<>:"/\\|?*\u0000-\u001F]/g;
817
- }
818
- function windowsReservedNameRegex() {
819
- return /^(con|prn|aux|nul|com\d|lpt\d)$/i;
820
- }
821
- /**
822
- * Copied from https://github.com/sindresorhus/valid-filename package
823
- */ function isValidFilename(string) {
824
- if (!string || string.length > 255) {
825
- return false;
826
- }
827
- if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {
828
- return false;
829
- }
830
- if (string === '.' || string === '..') {
831
- return false;
832
- }
833
- return true;
834
- }
835
- async function emitEvent(event, data) {
836
- const modelDef = strapi.getModel(FILE_MODEL_UID);
837
- const sanitizedData = await utils.sanitize.sanitizers.defaultSanitizeOutput({
838
- schema: modelDef,
839
- getModel (uid) {
840
- return strapi.getModel(uid);
841
- }
842
- }, data);
843
- strapi.eventHub.emit(event, {
844
- media: sanitizedData
845
- });
846
- }
847
- async function formatFileInfo({ filename, type, size }, fileInfo = {}, metas = {}) {
848
- const fileService = getService('file');
849
- if (!isValidFilename(filename)) {
850
- throw new ApplicationError('File name contains invalid characters');
851
- }
852
- let ext = path.extname(filename);
853
- if (!ext) {
854
- ext = `.${mimeTypes.extension(type)}`;
855
- }
856
- const usedName = (fileInfo.name || filename).normalize();
857
- const basename = path.basename(usedName, ext);
858
- // Prevent null characters in file name
859
- if (!isValidFilename(filename)) {
860
- throw new ApplicationError('File name contains invalid characters');
861
- }
862
- const entity = {
863
- name: usedName,
864
- alternativeText: fileInfo.alternativeText,
865
- caption: fileInfo.caption,
866
- folder: fileInfo.folder,
867
- folderPath: await fileService.getFolderPath(fileInfo.folder),
868
- hash: generateFileName(basename),
869
- ext,
870
- mime: type,
871
- size: bytesToKbytes$1(size),
872
- sizeInBytes: size
873
- };
874
- const { refId, ref, field } = metas;
875
- if (refId && ref && field) {
876
- entity.related = [
877
- {
878
- id: refId,
879
- __type: ref,
880
- __pivot: {
881
- field
882
- }
883
- }
884
- ];
885
- }
886
- if (metas.path) {
887
- entity.path = metas.path;
888
- }
889
- if (metas.tmpWorkingDirectory) {
890
- entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;
891
- }
892
- return entity;
893
- }
894
- async function enhanceAndValidateFile(file, fileInfo, metas) {
895
- const currentFile = await formatFileInfo({
896
- filename: file.originalFilename ?? 'unamed',
897
- type: file.mimetype ?? 'application/octet-stream',
898
- size: file.size
899
- }, fileInfo, {
900
- ...metas,
901
- tmpWorkingDirectory: file.tmpWorkingDirectory
902
- });
903
- currentFile.filepath = file.filepath;
904
- currentFile.getStream = ()=>fs.createReadStream(file.filepath);
905
- const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi.plugin('upload').service('image-manipulation');
906
- if (await isImage(currentFile)) {
907
- if (await isFaultyImage(currentFile)) {
908
- throw new ApplicationError('File is not a valid image');
909
- }
910
- if (await isOptimizableImage(currentFile)) {
911
- return optimize(currentFile);
912
- }
913
- }
914
- return currentFile;
915
- }
916
- async function upload({ data, files }, opts) {
917
- const { user } = opts ?? {};
918
- // create temporary folder to store files for stream manipulation
919
- const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);
920
- let uploadedFiles = [];
921
- try {
922
- const { fileInfo, ...metas } = data;
923
- const fileArray = Array.isArray(files) ? files : [
924
- files
925
- ];
926
- const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [
927
- fileInfo
928
- ];
929
- const doUpload = async (file, fileInfo)=>{
930
- const fileData = await enhanceAndValidateFile(file, fileInfo, metas);
931
- return uploadFileAndPersist(fileData, {
932
- user
933
- });
934
- };
935
- uploadedFiles = await Promise.all(fileArray.map((file, idx)=>doUpload(file, fileInfoArray[idx] || {})));
936
- } finally{
937
- // delete temporary folder
938
- await fse.remove(tmpWorkingDirectory);
939
- }
940
- return uploadedFiles;
941
- }
942
- /**
943
- * When uploading an image, an additional thumbnail is generated.
944
- * Also, if there are responsive formats defined, another set of images will be generated too.
945
- *
946
- * @param {*} fileData
947
- */ async function uploadImage(fileData) {
948
- const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } = getService('image-manipulation');
949
- // Store width and height of the original image
950
- const { width, height } = await getDimensions(fileData);
951
- // Make sure this is assigned before calling any upload
952
- // That way it can mutate the width and height
953
- _.assign(fileData, {
954
- width,
955
- height
956
- });
957
- // For performance reasons, all uploads are wrapped in a single Promise.all
958
- const uploadThumbnail = async (thumbnailFile)=>{
959
- await getService('provider').upload(thumbnailFile);
960
- _.set(fileData, 'formats.thumbnail', thumbnailFile);
961
- };
962
- // Generate thumbnail and responsive formats
963
- const uploadResponsiveFormat = async (format)=>{
964
- const { key, file } = format;
965
- await getService('provider').upload(file);
966
- _.set(fileData, [
967
- 'formats',
968
- key
969
- ], file);
970
- };
971
- const uploadPromises = [];
972
- // Upload image
973
- uploadPromises.push(getService('provider').upload(fileData));
974
- // Generate & Upload thumbnail and responsive formats
975
- if (await isResizableImage(fileData)) {
976
- const thumbnailFile = await generateThumbnail(fileData);
977
- if (thumbnailFile) {
978
- uploadPromises.push(uploadThumbnail(thumbnailFile));
979
- }
980
- const formats = await generateResponsiveFormats(fileData);
981
- if (Array.isArray(formats) && formats.length > 0) {
982
- for (const format of formats){
983
- // eslint-disable-next-line no-continue
984
- if (!format) continue;
985
- uploadPromises.push(uploadResponsiveFormat(format));
986
- }
987
- }
988
- }
989
- // Wait for all uploads to finish
990
- await Promise.all(uploadPromises);
991
- }
992
- /**
993
- * Upload a file. If it is an image it will generate a thumbnail
994
- * and responsive formats (if enabled).
995
- */ async function uploadFileAndPersist(fileData, opts) {
996
- const { user } = opts ?? {};
997
- const config = strapi.config.get('plugin::upload');
998
- const { isImage } = getService('image-manipulation');
999
- await getService('provider').checkFileSize(fileData);
1000
- if (await isImage(fileData)) {
1001
- await uploadImage(fileData);
1002
- } else {
1003
- await getService('provider').upload(fileData);
1004
- }
1005
- _.set(fileData, 'provider', config.provider);
1006
- // Persist file(s)
1007
- return add(fileData, {
1008
- user
1009
- });
1010
- }
1011
- async function updateFileInfo(id, { name, alternativeText, caption, folder }, opts) {
1012
- const { user } = opts ?? {};
1013
- const dbFile = await findOne(id);
1014
- if (!dbFile) {
1015
- throw new NotFoundError();
1016
- }
1017
- const fileService = getService('file');
1018
- const newName = _.isNil(name) ? dbFile.name : name;
1019
- const newInfos = {
1020
- name: newName,
1021
- alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,
1022
- caption: _.isNil(caption) ? dbFile.caption : caption,
1023
- folder: _.isUndefined(folder) ? dbFile.folder : folder,
1024
- folderPath: _.isUndefined(folder) ? dbFile.path : await fileService.getFolderPath(folder)
1025
- };
1026
- return update(id, newInfos, {
1027
- user
1028
- });
1029
- }
1030
- async function replace(id, { data, file }, opts) {
1031
- const { user } = opts ?? {};
1032
- const config = strapi.config.get('plugin::upload');
1033
- const { isImage } = getService('image-manipulation');
1034
- const dbFile = await findOne(id);
1035
- if (!dbFile) {
1036
- throw new NotFoundError();
1037
- }
1038
- // create temporary folder to store files for stream manipulation
1039
- const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);
1040
- let fileData;
1041
- try {
1042
- const { fileInfo } = data;
1043
- fileData = await enhanceAndValidateFile(file, fileInfo);
1044
- // keep a constant hash and extension so the file url doesn't change when the file is replaced
1045
- _.assign(fileData, {
1046
- hash: dbFile.hash,
1047
- ext: dbFile.ext
1048
- });
1049
- // execute delete function of the provider
1050
- if (dbFile.provider === config.provider) {
1051
- await strapi.plugin('upload').provider.delete(dbFile);
1052
- if (dbFile.formats) {
1053
- await Promise.all(Object.keys(dbFile.formats).map((key)=>{
1054
- return strapi.plugin('upload').provider.delete(dbFile.formats[key]);
1055
- }));
1056
- }
1057
- }
1058
- // clear old formats
1059
- _.set(fileData, 'formats', {});
1060
- if (await isImage(fileData)) {
1061
- await uploadImage(fileData);
1062
- } else {
1063
- await getService('provider').upload(fileData);
1064
- }
1065
- _.set(fileData, 'provider', config.provider);
1066
- } finally{
1067
- // delete temporary folder
1068
- await fse.remove(tmpWorkingDirectory);
1069
- }
1070
- return update(id, fileData, {
1071
- user
1072
- });
1073
- }
1074
- async function update(id, values, opts) {
1075
- const { user } = opts ?? {};
1076
- const fileValues = {
1077
- ...values
1078
- };
1079
- if (user) {
1080
- Object.assign(fileValues, {
1081
- [UPDATED_BY_ATTRIBUTE]: user.id
1082
- });
1083
- }
1084
- sendMediaMetrics(fileValues);
1085
- const res = await strapi.db.query(FILE_MODEL_UID).update({
1086
- where: {
1087
- id
1088
- },
1089
- data: fileValues
1090
- });
1091
- await emitEvent(MEDIA_UPDATE, res);
1092
- return res;
1093
- }
1094
- async function add(values, opts) {
1095
- const { user } = opts ?? {};
1096
- const fileValues = {
1097
- ...values
1098
- };
1099
- if (user) {
1100
- Object.assign(fileValues, {
1101
- [UPDATED_BY_ATTRIBUTE]: user.id,
1102
- [CREATED_BY_ATTRIBUTE]: user.id
1103
- });
1104
- }
1105
- sendMediaMetrics(fileValues);
1106
- const res = await strapi.db.query(FILE_MODEL_UID).create({
1107
- data: fileValues
1108
- });
1109
- await emitEvent(MEDIA_CREATE, res);
1110
- return res;
1111
- }
1112
- function findOne(id, populate = {}) {
1113
- const query = strapi.get('query-params').transform(FILE_MODEL_UID, {
1114
- populate
1115
- });
1116
- return strapi.db.query(FILE_MODEL_UID).findOne({
1117
- where: {
1118
- id
1119
- },
1120
- ...query
1121
- });
1122
- }
1123
- function findMany(query = {}) {
1124
- return strapi.db.query(FILE_MODEL_UID).findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));
1125
- }
1126
- function findPage(query = {}) {
1127
- return strapi.db.query(FILE_MODEL_UID).findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));
1128
- }
1129
- async function remove(file) {
1130
- const config = strapi.config.get('plugin::upload');
1131
- // execute delete function of the provider
1132
- if (file.provider === config.provider) {
1133
- await strapi.plugin('upload').provider.delete(file);
1134
- if (file.formats) {
1135
- const keys = Object.keys(file.formats);
1136
- await Promise.all(keys.map((key)=>{
1137
- return strapi.plugin('upload').provider.delete(file.formats[key]);
1138
- }));
1139
- }
1140
- }
1141
- const media = await strapi.db.query(FILE_MODEL_UID).findOne({
1142
- where: {
1143
- id: file.id
1144
- }
1145
- });
1146
- await emitEvent(MEDIA_DELETE, media);
1147
- return strapi.db.query(FILE_MODEL_UID).delete({
1148
- where: {
1149
- id: file.id
1150
- }
1151
- });
1152
- }
1153
- async function getSettings() {
1154
- const res = await strapi.store({
1155
- type: 'plugin',
1156
- name: 'upload',
1157
- key: 'settings'
1158
- }).get({});
1159
- return res;
1160
- }
1161
- function setSettings(value) {
1162
- if (value.responsiveDimensions === true) {
1163
- strapi.telemetry.send('didEnableResponsiveDimensions');
1164
- } else {
1165
- strapi.telemetry.send('didDisableResponsiveDimensions');
1166
- }
1167
- return strapi.store({
1168
- type: 'plugin',
1169
- name: 'upload',
1170
- key: 'settings'
1171
- }).set({
1172
- value
1173
- });
1174
- }
1175
- async function getConfiguration() {
1176
- const res = await strapi.store({
1177
- type: 'plugin',
1178
- name: 'upload',
1179
- key: 'view_configuration'
1180
- }).get({});
1181
- return res;
1182
- }
1183
- function setConfiguration(value) {
1184
- return strapi.store({
1185
- type: 'plugin',
1186
- name: 'upload',
1187
- key: 'view_configuration'
1188
- }).set({
1189
- value
1190
- });
1191
- }
1192
- return {
1193
- formatFileInfo,
1194
- upload,
1195
- updateFileInfo,
1196
- replace,
1197
- findOne,
1198
- findMany,
1199
- findPage,
1200
- remove,
1201
- getSettings,
1202
- setSettings,
1203
- getConfiguration,
1204
- setConfiguration,
1205
- /**
1206
- * exposed for testing only
1207
- * @internal
1208
- */ _uploadImage: uploadImage
1209
- };
1210
- });
1211
-
1212
- const { bytesToKbytes } = utils.file;
1213
- const FORMATS_TO_RESIZE = [
1214
- 'jpeg',
1215
- 'png',
1216
- 'webp',
1217
- 'tiff',
1218
- 'gif'
1219
- ];
1220
- const FORMATS_TO_PROCESS = [
1221
- 'jpeg',
1222
- 'png',
1223
- 'webp',
1224
- 'tiff',
1225
- 'svg',
1226
- 'gif',
1227
- 'avif'
1228
- ];
1229
- const FORMATS_TO_OPTIMIZE = [
1230
- 'jpeg',
1231
- 'png',
1232
- 'webp',
1233
- 'tiff',
1234
- 'avif'
1235
- ];
1236
- const isOptimizableFormat = (format)=>format !== undefined && FORMATS_TO_OPTIMIZE.includes(format);
1237
- const writeStreamToFile = (stream, path)=>new Promise((resolve, reject)=>{
1238
- const writeStream = fs.createWriteStream(path);
1239
- // Reject promise if there is an error with the provided stream
1240
- stream.on('error', reject);
1241
- stream.pipe(writeStream);
1242
- writeStream.on('close', resolve);
1243
- writeStream.on('error', reject);
1244
- });
1245
- const getMetadata = (file)=>{
1246
- if (!file.filepath) {
1247
- return new Promise((resolve, reject)=>{
1248
- const pipeline = sharp();
1249
- pipeline.metadata().then(resolve).catch(reject);
1250
- file.getStream().pipe(pipeline);
1251
- });
1252
- }
1253
- return sharp(file.filepath).metadata();
1254
- };
1255
- const getDimensions = async (file)=>{
1256
- const { width = null, height = null } = await getMetadata(file);
1257
- return {
1258
- width,
1259
- height
1260
- };
1261
- };
1262
- const THUMBNAIL_RESIZE_OPTIONS = {
1263
- width: 245,
1264
- height: 156,
1265
- fit: 'inside'
1266
- };
1267
- const resizeFileTo = async (file, options, { name, hash })=>{
1268
- const filePath = file.tmpWorkingDirectory ? path.join(file.tmpWorkingDirectory, hash) : hash;
1269
- let newInfo;
1270
- if (!file.filepath) {
1271
- const transform = sharp().resize(options).on('info', (info)=>{
1272
- newInfo = info;
1273
- });
1274
- await writeStreamToFile(file.getStream().pipe(transform), filePath);
1275
- } else {
1276
- newInfo = await sharp(file.filepath).resize(options).toFile(filePath);
1277
- }
1278
- const { width, height, size } = newInfo ?? {};
1279
- const newFile = {
1280
- name,
1281
- hash,
1282
- ext: file.ext,
1283
- mime: file.mime,
1284
- filepath: filePath,
1285
- path: file.path || null,
1286
- getStream: ()=>fs.createReadStream(filePath)
1287
- };
1288
- Object.assign(newFile, {
1289
- width,
1290
- height,
1291
- size: size ? bytesToKbytes(size) : 0,
1292
- sizeInBytes: size
1293
- });
1294
- return newFile;
1295
- };
1296
- const generateThumbnail = async (file)=>{
1297
- if (file.width && file.height && (file.width > THUMBNAIL_RESIZE_OPTIONS.width || file.height > THUMBNAIL_RESIZE_OPTIONS.height)) {
1298
- return resizeFileTo(file, THUMBNAIL_RESIZE_OPTIONS, {
1299
- name: `thumbnail_${file.name}`,
1300
- hash: `thumbnail_${file.hash}`
1301
- });
1302
- }
1303
- return null;
1304
- };
1305
- /**
1306
- * Optimize image by:
1307
- * - auto orienting image based on EXIF data
1308
- * - reduce image quality
1309
- *
1310
- */ const optimize = async (file)=>{
1311
- const { sizeOptimization = false, autoOrientation = false } = await getService('upload').getSettings() ?? {};
1312
- const { format, size } = await getMetadata(file);
1313
- if ((sizeOptimization || autoOrientation) && isOptimizableFormat(format)) {
1314
- let transformer;
1315
- if (!file.filepath) {
1316
- transformer = sharp();
1317
- } else {
1318
- transformer = sharp(file.filepath);
1319
- }
1320
- // reduce image quality
1321
- transformer[format]({
1322
- quality: sizeOptimization ? 80 : 100
1323
- });
1324
- // rotate image based on EXIF data
1325
- if (autoOrientation) {
1326
- transformer.rotate();
1327
- }
1328
- const filePath = file.tmpWorkingDirectory ? path.join(file.tmpWorkingDirectory, `optimized-${file.hash}`) : `optimized-${file.hash}`;
1329
- let newInfo;
1330
- if (!file.filepath) {
1331
- transformer.on('info', (info)=>{
1332
- newInfo = info;
1333
- });
1334
- await writeStreamToFile(file.getStream().pipe(transformer), filePath);
1335
- } else {
1336
- newInfo = await transformer.toFile(filePath);
1337
- }
1338
- const { width: newWidth, height: newHeight, size: newSize } = newInfo ?? {};
1339
- const newFile = {
1340
- ...file
1341
- };
1342
- newFile.getStream = ()=>fs.createReadStream(filePath);
1343
- newFile.filepath = filePath;
1344
- if (newSize && size && newSize > size) {
1345
- // Ignore optimization if output is bigger than original
1346
- return file;
1347
- }
1348
- return Object.assign(newFile, {
1349
- width: newWidth,
1350
- height: newHeight,
1351
- size: newSize ? bytesToKbytes(newSize) : 0,
1352
- sizeInBytes: newSize
1353
- });
1354
- }
1355
- return file;
1356
- };
1357
- const DEFAULT_BREAKPOINTS = {
1358
- large: 1000,
1359
- medium: 750,
1360
- small: 500
1361
- };
1362
- const getBreakpoints = ()=>strapi.config.get('plugin::upload.breakpoints', DEFAULT_BREAKPOINTS);
1363
- const generateResponsiveFormats = async (file)=>{
1364
- const { responsiveDimensions = false } = await getService('upload').getSettings() ?? {};
1365
- if (!responsiveDimensions) return [];
1366
- const originalDimensions = await getDimensions(file);
1367
- const breakpoints = getBreakpoints();
1368
- return Promise.all(Object.keys(breakpoints).map((key)=>{
1369
- const breakpoint = breakpoints[key];
1370
- if (breakpointSmallerThan(breakpoint, originalDimensions)) {
1371
- return generateBreakpoint(key, {
1372
- file,
1373
- breakpoint
1374
- });
1375
- }
1376
- return undefined;
1377
- }));
1378
- };
1379
- const generateBreakpoint = async (key, { file, breakpoint })=>{
1380
- const newFile = await resizeFileTo(file, {
1381
- width: breakpoint,
1382
- height: breakpoint,
1383
- fit: 'inside'
1384
- }, {
1385
- name: `${key}_${file.name}`,
1386
- hash: `${key}_${file.hash}`
1387
- });
1388
- return {
1389
- key,
1390
- file: newFile
1391
- };
1392
- };
1393
- const breakpointSmallerThan = (breakpoint, { width, height })=>{
1394
- return breakpoint < (width ?? 0) || breakpoint < (height ?? 0);
1395
- };
1396
- /**
1397
- * Applies a simple image transformation to see if the image is faulty/corrupted.
1398
- */ const isFaultyImage = async (file)=>{
1399
- if (!file.filepath) {
1400
- return new Promise((resolve, reject)=>{
1401
- const pipeline = sharp();
1402
- pipeline.stats().then(resolve).catch(reject);
1403
- file.getStream().pipe(pipeline);
1404
- });
1405
- }
1406
- try {
1407
- await sharp(file.filepath).stats();
1408
- return false;
1409
- } catch (e) {
1410
- return true;
1411
- }
1412
- };
1413
- const isOptimizableImage = async (file)=>{
1414
- let format;
1415
- try {
1416
- const metadata = await getMetadata(file);
1417
- format = metadata.format;
1418
- } catch (e) {
1419
- // throw when the file is not a supported image
1420
- return false;
1421
- }
1422
- return format && FORMATS_TO_OPTIMIZE.includes(format);
1423
- };
1424
- const isResizableImage = async (file)=>{
1425
- let format;
1426
- try {
1427
- const metadata = await getMetadata(file);
1428
- format = metadata.format;
1429
- } catch (e) {
1430
- // throw when the file is not a supported image
1431
- return false;
1432
- }
1433
- return format && FORMATS_TO_RESIZE.includes(format);
1434
- };
1435
- const isImage = async (file)=>{
1436
- let format;
1437
- try {
1438
- const metadata = await getMetadata(file);
1439
- format = metadata.format;
1440
- } catch (e) {
1441
- // throw when the file is not a supported image
1442
- return false;
1443
- }
1444
- return format && FORMATS_TO_PROCESS.includes(format);
1445
- };
1446
- var imageManipulation = {
1447
- isFaultyImage,
1448
- isOptimizableImage,
1449
- isResizableImage,
1450
- isImage,
1451
- getDimensions,
1452
- generateResponsiveFormats,
1453
- generateThumbnail,
1454
- optimize
1455
- };
1456
-
1457
- const setPathIdAndPath = async (folder)=>{
1458
- const { max } = await strapi.db.queryBuilder(FOLDER_MODEL_UID).max('pathId').first().execute();
1459
- const pathId = max + 1;
1460
- let parentPath = '/';
1461
- if (folder.parent) {
1462
- const parentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({
1463
- where: {
1464
- id: folder.parent
1465
- }
1466
- });
1467
- parentPath = parentFolder.path;
1468
- }
1469
- return Object.assign(folder, {
1470
- pathId,
1471
- path: utils.strings.joinBy('/', parentPath, `${pathId}`)
1472
- });
1473
- };
1474
- const create = async (folderData, opts)=>{
1475
- const folderService = getService('folder');
1476
- const { user } = opts || {};
1477
- let enrichedFolder = await folderService.setPathIdAndPath(folderData);
1478
- if (user) {
1479
- enrichedFolder = await utils.setCreatorFields({
1480
- user
1481
- })(enrichedFolder);
1482
- }
1483
- const folder = await strapi.db.query(FOLDER_MODEL_UID).create({
1484
- data: enrichedFolder
1485
- });
1486
- strapi.eventHub.emit('media-folder.create', {
1487
- folder
1488
- });
1489
- return folder;
1490
- };
1491
- /**
1492
- * Recursively delete folders and included files
1493
- * @param ids ids of the folders to delete
1494
- * @returns {Promise<Object[]>}
1495
- */ const deleteByIds$1 = async (ids = [])=>{
1496
- const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({
1497
- where: {
1498
- id: {
1499
- $in: ids
1500
- }
1501
- }
1502
- });
1503
- if (folders.length === 0) {
1504
- return {
1505
- folders: [],
1506
- totalFolderNumber: 0,
1507
- totalFileNumber: 0
1508
- };
1509
- }
1510
- const pathsToDelete = fp.map('path', folders);
1511
- // delete files
1512
- const filesToDelete = await strapi.db.query(FILE_MODEL_UID).findMany({
1513
- where: {
1514
- $or: pathsToDelete.flatMap((path)=>[
1515
- {
1516
- folderPath: {
1517
- $eq: path
1518
- }
1519
- },
1520
- {
1521
- folderPath: {
1522
- $startsWith: `${path}/`
1523
- }
1524
- }
1525
- ])
1526
- }
1527
- });
1528
- await Promise.all(filesToDelete.map((file)=>getService('upload').remove(file)));
1529
- // delete folders and subfolders
1530
- const { count: totalFolderNumber } = await strapi.db.query(FOLDER_MODEL_UID).deleteMany({
1531
- where: {
1532
- $or: pathsToDelete.flatMap((path)=>[
1533
- {
1534
- path: {
1535
- $eq: path
1536
- }
1537
- },
1538
- {
1539
- path: {
1540
- $startsWith: `${path}/`
1541
- }
1542
- }
1543
- ])
1544
- }
1545
- });
1546
- strapi.eventHub.emit('media-folder.delete', {
1547
- folders
1548
- });
1549
- return {
1550
- folders,
1551
- totalFolderNumber,
1552
- totalFileNumber: filesToDelete.length
1553
- };
1554
- };
1555
- /**
1556
- * Update name and location of a folder and its belonging folders and files
1557
- */ const update = async (id, { name, parent }, { user })=>{
1558
- // only name is updated
1559
- if (fp.isUndefined(parent)) {
1560
- const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({
1561
- where: {
1562
- id
1563
- }
1564
- });
1565
- if (!existingFolder) {
1566
- return undefined;
1567
- }
1568
- const newFolder = utils.setCreatorFields({
1569
- user,
1570
- isEdition: true
1571
- })({
1572
- name,
1573
- parent
1574
- });
1575
- if (fp.isUndefined(parent)) {
1576
- const folder = await strapi.db.query(FOLDER_MODEL_UID).update({
1577
- where: {
1578
- id
1579
- },
1580
- data: newFolder
1581
- });
1582
- return folder;
1583
- }
1584
- // location is updated => using transaction
1585
- } else {
1586
- const trx = await strapi.db.transaction();
1587
- try {
1588
- // fetch existing folder
1589
- const existingFolder = await strapi.db.queryBuilder(FOLDER_MODEL_UID).select([
1590
- 'pathId',
1591
- 'path'
1592
- ]).where({
1593
- id
1594
- }).transacting(trx.get()).forUpdate().first().execute();
1595
- // update parent folder (delete + insert; upsert not possible)
1596
- // @ts-expect-error - no dynamic types
1597
- const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;
1598
- await strapi.db.queryBuilder(joinTable.name).transacting(trx.get()).delete().where({
1599
- [joinTable.joinColumn.name]: id
1600
- }).execute();
1601
- if (parent !== null) {
1602
- await strapi.db.queryBuilder(joinTable.name).transacting(trx.get()).insert({
1603
- [joinTable.inverseJoinColumn.name]: parent,
1604
- [joinTable.joinColumn.name]: id
1605
- }).where({
1606
- [joinTable.joinColumn.name]: id
1607
- }).execute();
1608
- }
1609
- // fetch destinationFolder path
1610
- let destinationFolderPath = '/';
1611
- if (parent !== null) {
1612
- const destinationFolder = await strapi.db.queryBuilder(FOLDER_MODEL_UID).select('path').where({
1613
- id: parent
1614
- }).transacting(trx.get()).first().execute();
1615
- destinationFolderPath = destinationFolder.path;
1616
- }
1617
- const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;
1618
- const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;
1619
- const folderPathColumnName = // @ts-expect-error - no dynamic types
1620
- strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;
1621
- // @ts-expect-error - no dynamic types
1622
- const pathColumnName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;
1623
- // update folders below
1624
- await strapi.db.getConnection(folderTable).transacting(trx.get()).where(pathColumnName, existingFolder.path).orWhere(pathColumnName, 'like', `${existingFolder.path}/%`).update(pathColumnName, strapi.db.connection.raw('REPLACE(??, ?, ?)', [
1625
- pathColumnName,
1626
- existingFolder.path,
1627
- utils.strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`)
1628
- ]));
1629
- // update files below
1630
- await strapi.db.getConnection(fileTable).transacting(trx.get()).where(folderPathColumnName, existingFolder.path).orWhere(folderPathColumnName, 'like', `${existingFolder.path}/%`).update(folderPathColumnName, strapi.db.connection.raw('REPLACE(??, ?, ?)', [
1631
- folderPathColumnName,
1632
- existingFolder.path,
1633
- utils.strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`)
1634
- ]));
1635
- await trx.commit();
1636
- } catch (e) {
1637
- await trx.rollback();
1638
- throw e;
1639
- }
1640
- // update less critical information (name + updatedBy)
1641
- const newFolder = utils.setCreatorFields({
1642
- user,
1643
- isEdition: true
1644
- })({
1645
- name
1646
- });
1647
- const folder = await strapi.db.query(FOLDER_MODEL_UID).update({
1648
- where: {
1649
- id
1650
- },
1651
- data: newFolder
1652
- });
1653
- strapi.eventHub.emit('media-folder.update', {
1654
- folder
1655
- });
1656
- return folder;
1657
- }
1658
- };
1659
- /**
1660
- * Check if a folder exists in database
1661
- * @param params query params to find the folder
1662
- * @returns {Promise<boolean>}
1663
- */ const exists = async (params = {})=>{
1664
- const count = await strapi.db.query(FOLDER_MODEL_UID).count({
1665
- where: params
1666
- });
1667
- return count > 0;
1668
- };
1669
- /**
1670
- * Returns the nested structure of folders
1671
- * @returns {Promise<array>}
1672
- */ const getStructure = async ()=>{
1673
- // @ts-expect-error - no dynamic types
1674
- const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;
1675
- const qb = strapi.db.queryBuilder(FOLDER_MODEL_UID);
1676
- const alias = qb.getAlias();
1677
- const folders = await qb.select([
1678
- 'id',
1679
- 'name',
1680
- `${alias}.${joinTable.inverseJoinColumn.name} as parent`
1681
- ]).join({
1682
- alias,
1683
- referencedTable: joinTable.name,
1684
- referencedColumn: joinTable.joinColumn.name,
1685
- rootColumn: joinTable.joinColumn.referencedColumn,
1686
- rootTable: qb.alias
1687
- }).execute({
1688
- mapResults: false
1689
- });
1690
- const folderMap = {
1691
- null: {
1692
- children: []
1693
- }
1694
- };
1695
- folders.forEach((f)=>{
1696
- folderMap[f.id] = {
1697
- ...f,
1698
- children: []
1699
- };
1700
- });
1701
- folders.forEach((f)=>{
1702
- const parentId = f.parent || 'null';
1703
- if (!folderMap[parentId]) {
1704
- folderMap[parentId] = {
1705
- children: []
1706
- };
1707
- }
1708
- folderMap[parentId].children.push(folderMap[f.id]);
1709
- folderMap[parentId].children = fp.sortBy('name', folderMap[parentId].children);
1710
- delete folderMap[f.id].parent;
1711
- });
1712
- return folderMap.null.children;
1713
- };
1714
- var folder = {
1715
- create,
1716
- exists,
1717
- deleteByIds: deleteByIds$1,
1718
- update,
1719
- setPathIdAndPath,
1720
- getStructure
1721
- };
1722
-
1723
- const getFolderPath = async (folderId)=>{
1724
- if (!folderId) return '/';
1725
- const parentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({
1726
- where: {
1727
- id: folderId
1728
- }
1729
- });
1730
- return parentFolder.path;
1731
- };
1732
- const deleteByIds = async (ids = [])=>{
1733
- const filesToDelete = await strapi.db.query(FILE_MODEL_UID).findMany({
1734
- where: {
1735
- id: {
1736
- $in: ids
1737
- }
1738
- }
1739
- });
1740
- await Promise.all(filesToDelete.map((file)=>getService('upload').remove(file)));
1741
- return filesToDelete;
1742
- };
1743
- const signFileUrls = async (file)=>{
1744
- const { provider } = strapi.plugins.upload;
1745
- const { provider: providerConfig } = strapi.config.get('plugin::upload');
1746
- const isPrivate = await provider.isPrivate();
1747
- file.isUrlSigned = false;
1748
- // Check file provider and if provider is private
1749
- if (file.provider !== providerConfig || !isPrivate) {
1750
- return file;
1751
- }
1752
- const signUrl = async (file)=>{
1753
- const signedUrl = await provider.getSignedUrl(file);
1754
- file.url = signedUrl.url;
1755
- file.isUrlSigned = true;
1756
- };
1757
- const signedFile = fp.cloneDeep(file);
1758
- // Sign each file format
1759
- await signUrl(signedFile);
1760
- if (file.formats) {
1761
- await utils.async.map(Object.values(signedFile.formats ?? {}), signUrl);
1762
- }
1763
- return signedFile;
1764
- };
1765
- var file = {
1766
- getFolderPath,
1767
- deleteByIds,
1768
- signFileUrls
1769
- };
1770
-
1771
- const getWeeklyCronScheduleAt = (date)=>`${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;
1772
-
1773
- const ONE_WEEK = 7 * 24 * 60 * 60 * 1000;
1774
- const getMetricsStoreValue = async ()=>{
1775
- const value = await strapi.store.get({
1776
- type: 'plugin',
1777
- name: 'upload',
1778
- key: 'metrics'
1779
- });
1780
- return fp.defaultTo({}, value);
1781
- };
1782
- const setMetricsStoreValue = (value)=>strapi.store.set({
1783
- type: 'plugin',
1784
- name: 'upload',
1785
- key: 'metrics',
1786
- value
1787
- });
1788
- var weeklyMetrics = (({ strapi: strapi1 })=>({
1789
- async computeMetrics () {
1790
- // Folder metrics
1791
- // @ts-expect-error - no dynamic types for the metadata
1792
- const pathColName = strapi1.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;
1793
- const folderTable = strapi1.getModel(FOLDER_MODEL_UID).collectionName;
1794
- let keepOnlySlashesSQLString = '??';
1795
- const queryParams = [
1796
- pathColName
1797
- ];
1798
- for(let i = 0; i < 10; i += 1){
1799
- keepOnlySlashesSQLString = `REPLACE(${keepOnlySlashesSQLString}, ?, ?)`;
1800
- queryParams.push(String(i), '');
1801
- }
1802
- /*
1803
- The following query goal is to count the number of folders with depth 1, depth 2 etc.
1804
- The query returns :
1805
- [
1806
- { depth: 1, occurence: 4 },
1807
- { depth: 2, occurence: 2 },
1808
- { depth: 3, occurence: 5 },
1809
- ]
1810
-
1811
- The query is built as follow:
1812
- 1. In order to get the depth level of a folder:
1813
- - we take their path
1814
- - remove all numbers (by replacing 0123456789 by '', thus the 10 REPLACE in the query)
1815
- - count the remaining `/`, which correspond to their depth (by using LENGTH)
1816
- We now have, for each folder, its depth.
1817
- 2. In order to get the number of folders for each depth:
1818
- - we group them by their depth and use COUNT(*)
1819
- */ const res = await strapi1.db.getConnection(folderTable).select(strapi1.db.connection.raw(`LENGTH(${keepOnlySlashesSQLString}) AS depth, COUNT(*) AS occurence`, queryParams)).groupBy('depth');
1820
- const folderLevelsArray = res.map((map)=>({
1821
- depth: Number(map.depth),
1822
- occurence: Number(map.occurence)
1823
- })); // values can be strings depending on the database
1824
- let product = 0;
1825
- let folderNumber = 0;
1826
- let maxDepth = 0;
1827
- for (const folderLevel of folderLevelsArray){
1828
- product += folderLevel.depth * folderLevel.occurence;
1829
- folderNumber += folderLevel.occurence;
1830
- if (folderLevel.depth > maxDepth) {
1831
- maxDepth = folderLevel.depth;
1832
- }
1833
- }
1834
- const averageDepth = folderNumber !== 0 ? product / folderNumber : 0;
1835
- let sumOfDeviation = 0;
1836
- for (const folderLevel of folderLevelsArray){
1837
- sumOfDeviation += Math.abs(folderLevel.depth - averageDepth) * folderLevel.occurence;
1838
- }
1839
- const averageDeviationDepth = folderNumber !== 0 ? sumOfDeviation / folderNumber : 0;
1840
- // File metrics
1841
- const assetNumber = await strapi1.db.query(FILE_MODEL_UID).count();
1842
- return {
1843
- assetNumber,
1844
- folderNumber,
1845
- averageDepth,
1846
- maxDepth,
1847
- averageDeviationDepth
1848
- };
1849
- },
1850
- async sendMetrics () {
1851
- const metrics = await this.computeMetrics();
1852
- strapi1.telemetry.send('didSendUploadPropertiesOnceAWeek', {
1853
- groupProperties: {
1854
- metrics
1855
- }
1856
- });
1857
- const metricsInfoStored = await getMetricsStoreValue();
1858
- await setMetricsStoreValue({
1859
- ...metricsInfoStored,
1860
- lastWeeklyUpdate: new Date().getTime()
1861
- });
1862
- },
1863
- async ensureWeeklyStoredCronSchedule () {
1864
- const metricsInfoStored = await getMetricsStoreValue();
1865
- const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;
1866
- const now = new Date();
1867
- let weeklySchedule = currentSchedule;
1868
- if (!weeklySchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {
1869
- weeklySchedule = getWeeklyCronScheduleAt(dateFns.add(now, {
1870
- seconds: 15
1871
- }));
1872
- await setMetricsStoreValue({
1873
- ...metricsInfoStored,
1874
- weeklySchedule
1875
- });
1876
- return weeklySchedule;
1877
- }
1878
- return weeklySchedule;
1879
- },
1880
- async registerCron () {
1881
- const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();
1882
- strapi1.cron.add({
1883
- uploadWeekly: {
1884
- task: this.sendMetrics.bind(this),
1885
- options: weeklySchedule
1886
- }
1887
- });
1888
- }
1889
- }));
1890
-
1891
- const getProviderName = ()=>strapi.config.get('plugin::upload.provider', 'local');
1892
- const isProviderPrivate = async ()=>strapi.plugin('upload').provider.isPrivate();
1893
- var metrics = (({ strapi: strapi1 })=>({
1894
- async sendUploadPluginMetrics () {
1895
- const uploadProvider = getProviderName();
1896
- const privateProvider = await isProviderPrivate();
1897
- strapi1.telemetry.send('didInitializePluginUpload', {
1898
- groupProperties: {
1899
- uploadProvider,
1900
- privateProvider
1901
- }
1902
- });
1903
- }
1904
- }));
1905
-
1906
- const getStore = ()=>strapi.store({
1907
- type: 'plugin',
1908
- name: 'upload',
1909
- key: 'api-folder'
1910
- });
1911
- const createApiUploadFolder = async ()=>{
1912
- let name = API_UPLOAD_FOLDER_BASE_NAME;
1913
- const folderService = getService('folder');
1914
- let exists = true;
1915
- let index = 1;
1916
- while(exists){
1917
- exists = await folderService.exists({
1918
- name,
1919
- parent: null
1920
- });
1921
- if (exists) {
1922
- name = `${API_UPLOAD_FOLDER_BASE_NAME} (${index})`;
1923
- index += 1;
1924
- }
1925
- }
1926
- const folder = await folderService.create({
1927
- name
1928
- });
1929
- await getStore().set({
1930
- value: {
1931
- id: folder.id
1932
- }
1933
- });
1934
- return folder;
1935
- };
1936
- const getAPIUploadFolder = async ()=>{
1937
- const storeValue = await getStore().get({});
1938
- const folderId = fp.get('id', storeValue);
1939
- const folder = folderId ? await strapi.db.query(FOLDER_MODEL_UID).findOne({
1940
- where: {
1941
- id: folderId
1942
- }
1943
- }) : null;
1944
- return fp.isNil(folder) ? createApiUploadFolder() : folder;
1945
- };
1946
- var apiUploadFolder = {
1947
- getAPIUploadFolder
1948
- };
1949
-
1950
- function isFile(value, attribute) {
1951
- if (!value || attribute.type !== 'media') {
1952
- return false;
1953
- }
1954
- return true;
1955
- }
1956
- /**
1957
- * Visitor function to sign media URLs
1958
- */ const signEntityMediaVisitor = async ({ key, value, attribute }, { set })=>{
1959
- const { signFileUrls } = getService('file');
1960
- if (!attribute) {
1961
- return;
1962
- }
1963
- if (attribute.type !== 'media') {
1964
- return;
1965
- }
1966
- if (isFile(value, attribute)) {
1967
- // If the attribute is repeatable sign each file
1968
- if (attribute.multiple) {
1969
- const signedFiles = await utils.async.map(value, signFileUrls);
1970
- set(key, signedFiles);
1971
- return;
1972
- }
1973
- // If the attribute is not repeatable only sign a single file
1974
- const signedFile = await signFileUrls(value);
1975
- set(key, signedFile);
1976
- }
1977
- };
1978
- /**
1979
- *
1980
- * Iterate through an entity manager result
1981
- * Check which modelAttributes are media and pre sign the image URLs
1982
- * if they are from the current upload provider
1983
- *
1984
- * @param {Object} entity
1985
- * @param {Object} modelAttributes
1986
- * @returns
1987
- */ const signEntityMedia = async (entity, uid)=>{
1988
- const model = strapi.getModel(uid);
1989
- return utils.traverseEntity(// @ts-expect-error - FIXME: fix traverseEntity using wrong types
1990
- signEntityMediaVisitor, {
1991
- schema: model,
1992
- getModel: strapi.getModel.bind(strapi)
1993
- }, entity);
1994
- };
1995
-
1996
- const signFileUrlsOnDocumentService = async ()=>{
1997
- const { provider } = strapi.plugins.upload;
1998
- const isPrivate = await provider.isPrivate();
1999
- // We only need to sign the file urls if the provider is private
2000
- if (!isPrivate) {
2001
- return;
2002
- }
2003
- strapi.documents.use(async (ctx, next)=>{
2004
- const uid = ctx.uid;
2005
- const result = await next();
2006
- if (ctx.action === 'findMany') {
2007
- // Shape: [ entry ]
2008
- return utils.async.map(result, (entry)=>signEntityMedia(entry, uid));
2009
- }
2010
- if (ctx.action === 'findFirst' || ctx.action === 'findOne' || ctx.action === 'create' || ctx.action === 'update') {
2011
- // Shape: entry
2012
- return signEntityMedia(result, uid);
2013
- }
2014
- if (ctx.action === 'delete' || ctx.action === 'clone' || ctx.action === 'publish' || ctx.action === 'unpublish' || ctx.action === 'discardDraft') {
2015
- // Shape: { entries: [ entry ] }
2016
- // ...
2017
- return {
2018
- ...result,
2019
- entries: await utils.async.map(result.entries, (entry)=>signEntityMedia(entry, uid))
2020
- };
2021
- }
2022
- return result;
2023
- });
2024
- };
2025
- var extensions = {
2026
- signFileUrlsOnDocumentService
2027
- };
2028
-
2029
- const services = {
2030
- provider,
2031
- upload,
2032
- folder,
2033
- file,
2034
- weeklyMetrics,
2035
- metrics,
2036
- 'image-manipulation': imageManipulation,
2037
- 'api-upload-folder': apiUploadFolder,
2038
- extensions
2039
- };
2040
-
2041
- const routes$3 = {
2042
- type: 'admin',
2043
- routes: [
2044
- {
2045
- method: 'GET',
2046
- path: '/settings',
2047
- handler: 'admin-settings.getSettings',
2048
- config: {
2049
- policies: [
2050
- 'admin::isAuthenticatedAdmin',
2051
- {
2052
- name: 'admin::hasPermissions',
2053
- config: {
2054
- actions: [
2055
- 'plugin::upload.settings.read'
2056
- ]
2057
- }
2058
- }
2059
- ]
2060
- }
2061
- },
2062
- {
2063
- method: 'PUT',
2064
- path: '/settings',
2065
- handler: 'admin-settings.updateSettings',
2066
- config: {
2067
- policies: [
2068
- 'admin::isAuthenticatedAdmin',
2069
- {
2070
- name: 'admin::hasPermissions',
2071
- config: {
2072
- actions: [
2073
- 'plugin::upload.settings.read'
2074
- ]
2075
- }
2076
- }
2077
- ]
2078
- }
2079
- },
2080
- {
2081
- method: 'POST',
2082
- path: '/',
2083
- handler: 'admin-upload.upload',
2084
- config: {
2085
- policies: [
2086
- 'admin::isAuthenticatedAdmin'
2087
- ]
2088
- }
2089
- },
2090
- {
2091
- method: 'GET',
2092
- path: '/files',
2093
- handler: 'admin-file.find',
2094
- config: {
2095
- policies: [
2096
- 'admin::isAuthenticatedAdmin',
2097
- {
2098
- name: 'admin::hasPermissions',
2099
- config: {
2100
- actions: [
2101
- 'plugin::upload.read'
2102
- ]
2103
- }
2104
- }
2105
- ]
2106
- }
2107
- },
2108
- {
2109
- method: 'GET',
2110
- path: '/files/:id',
2111
- handler: 'admin-file.findOne',
2112
- config: {
2113
- policies: [
2114
- 'admin::isAuthenticatedAdmin',
2115
- {
2116
- name: 'admin::hasPermissions',
2117
- config: {
2118
- actions: [
2119
- 'plugin::upload.read'
2120
- ]
2121
- }
2122
- }
2123
- ]
2124
- }
2125
- },
2126
- {
2127
- method: 'DELETE',
2128
- path: '/files/:id',
2129
- handler: 'admin-file.destroy',
2130
- config: {
2131
- policies: [
2132
- 'admin::isAuthenticatedAdmin',
2133
- {
2134
- name: 'admin::hasPermissions',
2135
- config: {
2136
- actions: [
2137
- 'plugin::upload.assets.update'
2138
- ]
2139
- }
2140
- }
2141
- ]
2142
- }
2143
- },
2144
- {
2145
- method: 'GET',
2146
- path: '/folders/:id',
2147
- handler: 'admin-folder.findOne',
2148
- config: {
2149
- policies: [
2150
- 'admin::isAuthenticatedAdmin',
2151
- {
2152
- name: 'admin::hasPermissions',
2153
- config: {
2154
- actions: [
2155
- 'plugin::upload.read'
2156
- ]
2157
- }
2158
- }
2159
- ]
2160
- }
2161
- },
2162
- {
2163
- method: 'GET',
2164
- path: '/folders',
2165
- handler: 'admin-folder.find',
2166
- config: {
2167
- policies: [
2168
- 'admin::isAuthenticatedAdmin',
2169
- {
2170
- name: 'admin::hasPermissions',
2171
- config: {
2172
- actions: [
2173
- 'plugin::upload.read'
2174
- ]
2175
- }
2176
- }
2177
- ]
2178
- }
2179
- },
2180
- {
2181
- method: 'POST',
2182
- path: '/folders',
2183
- handler: 'admin-folder.create',
2184
- config: {
2185
- policies: [
2186
- 'admin::isAuthenticatedAdmin',
2187
- {
2188
- name: 'admin::hasPermissions',
2189
- config: {
2190
- actions: [
2191
- 'plugin::upload.assets.create'
2192
- ]
2193
- }
2194
- }
2195
- ]
2196
- }
2197
- },
2198
- {
2199
- method: 'PUT',
2200
- path: '/folders/:id',
2201
- handler: 'admin-folder.update',
2202
- config: {
2203
- policies: [
2204
- 'admin::isAuthenticatedAdmin',
2205
- {
2206
- name: 'admin::hasPermissions',
2207
- config: {
2208
- actions: [
2209
- 'plugin::upload.assets.update'
2210
- ]
2211
- }
2212
- }
2213
- ]
2214
- }
2215
- },
2216
- {
2217
- method: 'GET',
2218
- path: '/folder-structure',
2219
- handler: 'admin-folder.getStructure',
2220
- config: {
2221
- policies: [
2222
- 'admin::isAuthenticatedAdmin',
2223
- {
2224
- name: 'admin::hasPermissions',
2225
- config: {
2226
- actions: [
2227
- 'plugin::upload.read'
2228
- ]
2229
- }
2230
- }
2231
- ]
2232
- }
2233
- },
2234
- {
2235
- method: 'POST',
2236
- path: '/actions/bulk-delete',
2237
- handler: 'admin-folder-file.deleteMany',
2238
- config: {
2239
- policies: [
2240
- 'admin::isAuthenticatedAdmin',
2241
- {
2242
- name: 'admin::hasPermissions',
2243
- config: {
2244
- actions: [
2245
- 'plugin::upload.assets.update'
2246
- ]
2247
- }
2248
- }
2249
- ]
2250
- }
2251
- },
2252
- {
2253
- method: 'POST',
2254
- path: '/actions/bulk-move',
2255
- handler: 'admin-folder-file.moveMany',
2256
- config: {
2257
- policies: [
2258
- 'admin::isAuthenticatedAdmin',
2259
- {
2260
- name: 'admin::hasPermissions',
2261
- config: {
2262
- actions: [
2263
- 'plugin::upload.assets.update'
2264
- ]
2265
- }
2266
- }
2267
- ]
2268
- }
2269
- }
2270
- ]
2271
- };
2272
-
2273
- const routes$2 = {
2274
- type: 'content-api',
2275
- routes: [
2276
- {
2277
- method: 'POST',
2278
- path: '/',
2279
- handler: 'content-api.upload'
2280
- },
2281
- {
2282
- method: 'GET',
2283
- path: '/files',
2284
- handler: 'content-api.find'
2285
- },
2286
- {
2287
- method: 'GET',
2288
- path: '/files/:id',
2289
- handler: 'content-api.findOne'
2290
- },
2291
- {
2292
- method: 'DELETE',
2293
- path: '/files/:id',
2294
- handler: 'content-api.destroy'
2295
- }
2296
- ]
2297
- };
2298
-
2299
- const routes$1 = {
2300
- type: 'admin',
2301
- routes: [
2302
- {
2303
- method: 'GET',
2304
- path: '/configuration',
2305
- handler: 'view-configuration.findViewConfiguration',
2306
- config: {
2307
- policies: [
2308
- 'admin::isAuthenticatedAdmin'
2309
- ]
2310
- }
2311
- },
2312
- {
2313
- method: 'PUT',
2314
- path: '/configuration',
2315
- handler: 'view-configuration.updateViewConfiguration',
2316
- config: {
2317
- policies: [
2318
- 'admin::isAuthenticatedAdmin',
2319
- {
2320
- name: 'admin::hasPermissions',
2321
- config: {
2322
- actions: [
2323
- ACTIONS.configureView
2324
- ]
2325
- }
2326
- }
2327
- ]
2328
- }
2329
- }
2330
- ]
2331
- };
2332
-
2333
- const routes = {
2334
- admin: routes$3,
2335
- 'content-api': routes$2,
2336
- viewConfiguration: routes$1
2337
- };
2338
-
2339
- const config = {
2340
- default: {
2341
- enabled: true,
2342
- provider: 'local',
2343
- sizeLimit: 1000000000,
2344
- actionOptions: {}
2345
- },
2346
- validator () {}
2347
- };
2348
-
2349
- const findEntityAndCheckPermissions = async (ability, action, model, id)=>{
2350
- const file = await getService('upload').findOne(id, [
2351
- utils.contentTypes.constants.CREATED_BY_ATTRIBUTE,
2352
- 'folder'
2353
- ]);
2354
- if (_.isNil(file)) {
2355
- throw new utils.errors.NotFoundError();
2356
- }
2357
- const pm = strapi.service('admin::permission').createPermissionsManager({
2358
- ability,
2359
- action,
2360
- model
2361
- });
2362
- const creatorId = _.get(file, [
2363
- utils.contentTypes.constants.CREATED_BY_ATTRIBUTE,
2364
- 'id'
2365
- ]);
2366
- const author = creatorId ? await strapi.service('admin::user').findOne(creatorId, [
2367
- 'roles'
2368
- ]) : null;
2369
- const fileWithRoles = _.set(_.cloneDeep(file), 'createdBy', author);
2370
- if (pm.ability.cannot(pm.action, pm.toSubject(fileWithRoles))) {
2371
- throw new utils.errors.ForbiddenError();
2372
- }
2373
- return {
2374
- pm,
2375
- file
2376
- };
2377
- };
2378
-
2379
- var adminFile = {
2380
- async find (ctx) {
2381
- const { state: { userAbility } } = ctx;
2382
- const defaultQuery = {
2383
- populate: {
2384
- folder: true
2385
- }
2386
- };
2387
- const pm = strapi.service('admin::permission').createPermissionsManager({
2388
- ability: userAbility,
2389
- action: ACTIONS.read,
2390
- model: FILE_MODEL_UID
2391
- });
2392
- if (!pm.isAllowed) {
2393
- return ctx.forbidden();
2394
- }
2395
- // validate the incoming user query params
2396
- await pm.validateQuery(ctx.query);
2397
- const query = await utils.async.pipe(// Start by sanitizing the incoming query
2398
- (q)=>pm.sanitizeQuery(q), // Add the default query which should not be validated or sanitized
2399
- (q)=>fp.merge(defaultQuery, q), // Add the dynamic filters based on permissions' conditions
2400
- (q)=>pm.addPermissionsQueryTo(q))(ctx.query);
2401
- const { results: files, pagination } = await getService('upload').findPage(query);
2402
- // Sign file urls for private providers
2403
- const signedFiles = await utils.async.map(files, getService('file').signFileUrls);
2404
- const sanitizedFiles = await pm.sanitizeOutput(signedFiles);
2405
- return {
2406
- results: sanitizedFiles,
2407
- pagination
2408
- };
2409
- },
2410
- async findOne (ctx) {
2411
- const { state: { userAbility }, params: { id } } = ctx;
2412
- const { pm, file } = await findEntityAndCheckPermissions(userAbility, ACTIONS.read, FILE_MODEL_UID, id);
2413
- const signedFile = await getService('file').signFileUrls(file);
2414
- ctx.body = await pm.sanitizeOutput(signedFile);
2415
- },
2416
- async destroy (ctx) {
2417
- const { id } = ctx.params;
2418
- const { userAbility } = ctx.state;
2419
- const { pm, file } = await findEntityAndCheckPermissions(userAbility, ACTIONS.update, FILE_MODEL_UID, id);
2420
- const [body] = await Promise.all([
2421
- pm.sanitizeOutput(file, {
2422
- action: ACTIONS.read
2423
- }),
2424
- getService('upload').remove(file)
2425
- ]);
2426
- ctx.body = body;
2427
- }
2428
- };
2429
-
2430
- const folderExists = async (folderId)=>{
2431
- if (fp.isNil(folderId)) {
2432
- return true;
2433
- }
2434
- const exists = await getService('folder').exists({
2435
- id: folderId
2436
- });
2437
- return exists;
2438
- };
2439
-
2440
- const isFolderOrChild = (folderOrChild, folder)=>folderOrChild.path === folder.path || folderOrChild.path.startsWith(`${folder.path}/`);
2441
-
2442
- const NO_SLASH_REGEX = /^[^/]+$/;
2443
- const NO_SPACES_AROUND = RegExp("^(?! ).+(?<! )$");
2444
- const isNameUniqueInFolder = (id)=>{
2445
- return async function test(name) {
2446
- const { exists } = getService('folder');
2447
- const filters = {
2448
- name,
2449
- parent: this.parent.parent || null
2450
- };
2451
- if (id) {
2452
- filters.id = {
2453
- $ne: id
2454
- };
2455
- if (fp.isUndefined(name)) {
2456
- const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({
2457
- where: {
2458
- id
2459
- }
2460
- });
2461
- filters.name = fp.get('name', existingFolder);
2462
- }
2463
- }
2464
- const doesExist = await exists(filters);
2465
- return !doesExist;
2466
- };
2467
- };
2468
- const validateCreateFolderSchema = utils.yup.object().shape({
2469
- name: utils.yup.string().min(1).matches(NO_SLASH_REGEX, 'name cannot contain slashes').matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace').required().test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder()),
2470
- parent: utils.yup.strapiID().nullable().test('folder-exists', 'parent folder does not exist', folderExists)
2471
- }).noUnknown().required();
2472
- const validateUpdateFolderSchema = (id)=>utils.yup.object().shape({
2473
- name: utils.yup.string().min(1).matches(NO_SLASH_REGEX, 'name cannot contain slashes').matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace').test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder(id)),
2474
- parent: utils.yup.strapiID().nullable().test('folder-exists', 'parent folder does not exist', folderExists).test('dont-move-inside-self', 'folder cannot be moved inside itself', async function test(parent) {
2475
- if (fp.isNil(parent)) return true;
2476
- const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({
2477
- select: [
2478
- 'path'
2479
- ],
2480
- where: {
2481
- id: parent
2482
- }
2483
- });
2484
- const currentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({
2485
- select: [
2486
- 'path'
2487
- ],
2488
- where: {
2489
- id
2490
- }
2491
- });
2492
- if (!destinationFolder || !currentFolder) return true;
2493
- return !isFolderOrChild(destinationFolder, currentFolder);
2494
- })
2495
- }).noUnknown().required();
2496
- const validateCreateFolder = utils.validateYupSchema(validateCreateFolderSchema);
2497
- const validateUpdateFolder = (id)=>utils.validateYupSchema(validateUpdateFolderSchema(id));
2498
-
2499
- var adminFolder = {
2500
- async findOne (ctx) {
2501
- const { id } = ctx.params;
2502
- const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
2503
- ability: ctx.state.userAbility,
2504
- model: FOLDER_MODEL_UID
2505
- });
2506
- await permissionsManager.validateQuery(ctx.query);
2507
- const query = await permissionsManager.sanitizeQuery(ctx.query);
2508
- const { results } = await strapi.db.query(FOLDER_MODEL_UID).findPage(strapi.get('query-params').transform(FOLDER_MODEL_UID, fp.defaultsDeep({
2509
- filters: {
2510
- id
2511
- },
2512
- populate: {
2513
- children: {
2514
- count: true
2515
- },
2516
- files: {
2517
- count: true
2518
- }
2519
- }
2520
- }, query)));
2521
- if (results.length === 0) {
2522
- return ctx.notFound('folder not found');
2523
- }
2524
- ctx.body = {
2525
- data: await permissionsManager.sanitizeOutput(results[0])
2526
- };
2527
- },
2528
- async find (ctx) {
2529
- const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
2530
- ability: ctx.state.userAbility,
2531
- model: FOLDER_MODEL_UID
2532
- });
2533
- await permissionsManager.validateQuery(ctx.query);
2534
- const query = await permissionsManager.sanitizeQuery(ctx.query);
2535
- const results = await strapi.db.query(FOLDER_MODEL_UID).findMany(strapi.get('query-params').transform(FOLDER_MODEL_UID, fp.defaultsDeep({
2536
- populate: {
2537
- children: {
2538
- count: true
2539
- },
2540
- files: {
2541
- count: true
2542
- }
2543
- }
2544
- }, query)));
2545
- ctx.body = {
2546
- data: await permissionsManager.sanitizeOutput(results)
2547
- };
2548
- },
2549
- async create (ctx) {
2550
- const { user } = ctx.state;
2551
- const { body } = ctx.request;
2552
- await validateCreateFolder(body);
2553
- const folderService = getService('folder');
2554
- const folder = await folderService.create(body, {
2555
- user
2556
- });
2557
- const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
2558
- ability: ctx.state.userAbility,
2559
- model: FOLDER_MODEL_UID
2560
- });
2561
- ctx.created({
2562
- data: await permissionsManager.sanitizeOutput(folder)
2563
- });
2564
- },
2565
- async update (ctx) {
2566
- const { id } = ctx.params;
2567
- const { user } = ctx.state;
2568
- const { body } = ctx.request;
2569
- const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
2570
- ability: ctx.state.userAbility,
2571
- model: FOLDER_MODEL_UID
2572
- });
2573
- await validateUpdateFolder(id)(body);
2574
- const folderService = getService('folder');
2575
- const updatedFolder = await folderService.update(id, body, {
2576
- user
2577
- });
2578
- if (!updatedFolder) {
2579
- return ctx.notFound('folder not found');
2580
- }
2581
- ctx.body = {
2582
- data: await permissionsManager.sanitizeOutput(updatedFolder)
2583
- };
2584
- },
2585
- async getStructure (ctx) {
2586
- const { getStructure } = getService('folder');
2587
- const structure = await getStructure();
2588
- ctx.body = {
2589
- data: structure
2590
- };
2591
- }
2592
- };
2593
-
2594
- const validateDeleteManyFoldersFilesSchema = utils.yup.object().shape({
2595
- fileIds: utils.yup.array().of(utils.yup.strapiID().required()),
2596
- folderIds: utils.yup.array().of(utils.yup.strapiID().required())
2597
- }).noUnknown().required();
2598
- const validateStructureMoveManyFoldersFilesSchema = utils.yup.object().shape({
2599
- destinationFolderId: utils.yup.strapiID().nullable().defined().test('folder-exists', 'destination folder does not exist', folderExists),
2600
- fileIds: utils.yup.array().of(utils.yup.strapiID().required()),
2601
- folderIds: utils.yup.array().of(utils.yup.strapiID().required())
2602
- }).noUnknown().required();
2603
- const validateDuplicatesMoveManyFoldersFilesSchema = utils.yup.object().test('are-folders-unique', 'some folders already exist', async function areFoldersUnique(value) {
2604
- const { folderIds, destinationFolderId } = value;
2605
- if (fp.isEmpty(folderIds)) return true;
2606
- const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({
2607
- select: [
2608
- 'name'
2609
- ],
2610
- where: {
2611
- id: {
2612
- $in: folderIds
2613
- }
2614
- }
2615
- });
2616
- const existingFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({
2617
- select: [
2618
- 'name'
2619
- ],
2620
- where: {
2621
- parent: {
2622
- id: destinationFolderId
2623
- }
2624
- }
2625
- });
2626
- const duplicatedNames = fp.intersection(fp.map('name', folders), fp.map('name', existingFolders));
2627
- if (duplicatedNames.length > 0) {
2628
- return this.createError({
2629
- message: `some folders already exists: ${duplicatedNames.join(', ')}`
2630
- });
2631
- }
2632
- return true;
2633
- });
2634
- const validateMoveFoldersNotInsideThemselvesSchema = utils.yup.object().test('dont-move-inside-self', 'folders cannot be moved inside themselves or one of its children', async function validateMoveFoldersNotInsideThemselves(value) {
2635
- const { folderIds, destinationFolderId } = value;
2636
- if (destinationFolderId === null || fp.isEmpty(folderIds)) return true;
2637
- const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({
2638
- select: [
2639
- 'path'
2640
- ],
2641
- where: {
2642
- id: destinationFolderId
2643
- }
2644
- });
2645
- const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({
2646
- select: [
2647
- 'name',
2648
- 'path'
2649
- ],
2650
- where: {
2651
- id: {
2652
- $in: folderIds
2653
- }
2654
- }
2655
- });
2656
- const unmovableFoldersNames = folders.filter((folder)=>isFolderOrChild(destinationFolder, folder)).map((f)=>f.name);
2657
- if (unmovableFoldersNames.length > 0) {
2658
- return this.createError({
2659
- message: `folders cannot be moved inside themselves or one of its children: ${unmovableFoldersNames.join(', ')}`
2660
- });
2661
- }
2662
- return true;
2663
- });
2664
- const validateDeleteManyFoldersFiles = utils.validateYupSchema(validateDeleteManyFoldersFilesSchema);
2665
- async function validateMoveManyFoldersFiles(body) {
2666
- await utils.validateYupSchema(validateStructureMoveManyFoldersFilesSchema)(body);
2667
- await utils.validateYupSchema(validateDuplicatesMoveManyFoldersFilesSchema)(body);
2668
- await utils.validateYupSchema(validateMoveFoldersNotInsideThemselvesSchema)(body);
2669
- }
2670
-
2671
- var adminFolderFile = {
2672
- async deleteMany (ctx) {
2673
- const { body } = ctx.request;
2674
- const { state: { userAbility } } = ctx;
2675
- const pmFolder = strapi.service('admin::permission').createPermissionsManager({
2676
- ability: ctx.state.userAbility,
2677
- model: FOLDER_MODEL_UID
2678
- });
2679
- const pmFile = strapi.service('admin::permission').createPermissionsManager({
2680
- ability: userAbility,
2681
- action: ACTIONS.read,
2682
- model: FILE_MODEL_UID
2683
- });
2684
- await validateDeleteManyFoldersFiles(body);
2685
- const fileService = getService('file');
2686
- const folderService = getService('folder');
2687
- const deletedFiles = await fileService.deleteByIds(body.fileIds);
2688
- const { folders: deletedFolders, totalFolderNumber, totalFileNumber } = await folderService.deleteByIds(body.folderIds);
2689
- if (deletedFiles.length + deletedFolders.length > 1) {
2690
- strapi.telemetry.send('didBulkDeleteMediaLibraryElements', {
2691
- eventProperties: {
2692
- rootFolderNumber: deletedFolders.length,
2693
- rootAssetNumber: deletedFiles.length,
2694
- totalFolderNumber,
2695
- totalAssetNumber: totalFileNumber + deletedFiles.length
2696
- }
2697
- });
2698
- }
2699
- ctx.body = {
2700
- data: {
2701
- files: await pmFile.sanitizeOutput(deletedFiles),
2702
- folders: await pmFolder.sanitizeOutput(deletedFolders)
2703
- }
2704
- };
2705
- },
2706
- async moveMany (ctx) {
2707
- const { body } = ctx.request;
2708
- const { state: { userAbility } } = ctx;
2709
- const pmFolder = strapi.service('admin::permission').createPermissionsManager({
2710
- ability: ctx.state.userAbility,
2711
- model: FOLDER_MODEL_UID
2712
- });
2713
- const pmFile = strapi.service('admin::permission').createPermissionsManager({
2714
- ability: userAbility,
2715
- action: ACTIONS.read,
2716
- model: FILE_MODEL_UID
2717
- });
2718
- await validateMoveManyFoldersFiles(body);
2719
- const { folderIds = [], fileIds = [], destinationFolderId } = body;
2720
- let totalFolderNumber = 0;
2721
- let totalFileNumber = 0;
2722
- const trx = await strapi.db.transaction();
2723
- try {
2724
- // fetch folders
2725
- const existingFolders = await strapi.db.queryBuilder(FOLDER_MODEL_UID).select([
2726
- 'id',
2727
- 'pathId',
2728
- 'path'
2729
- ]).where({
2730
- id: {
2731
- $in: folderIds
2732
- }
2733
- }).transacting(trx.get()).forUpdate().execute();
2734
- // fetch files
2735
- const existingFiles = await strapi.db.queryBuilder(FILE_MODEL_UID).select([
2736
- 'id'
2737
- ]).where({
2738
- id: {
2739
- $in: fileIds
2740
- }
2741
- }).transacting(trx.get()).forUpdate().execute();
2742
- // fetch destinationFolder path
2743
- let destinationFolderPath = '/';
2744
- if (destinationFolderId !== null) {
2745
- const destinationFolder = await strapi.db.queryBuilder(FOLDER_MODEL_UID).select('path').where({
2746
- id: destinationFolderId
2747
- }).transacting(trx.get()).first().execute();
2748
- destinationFolderPath = destinationFolder.path;
2749
- }
2750
- const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;
2751
- const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;
2752
- const folderPathColName = // @ts-expect-error - no dynamic typings for the models
2753
- strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;
2754
- // @ts-expect-error - no dynamic typings for the models
2755
- const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;
2756
- if (existingFolders.length > 0) {
2757
- // update folders' parent relation
2758
- // @ts-expect-error - no dynamic typings for the models
2759
- const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;
2760
- await strapi.db.queryBuilder(joinTable.name).transacting(trx.get()).delete().where({
2761
- [joinTable.joinColumn.name]: {
2762
- $in: folderIds
2763
- }
2764
- }).execute();
2765
- if (destinationFolderId !== null) {
2766
- await strapi.db.queryBuilder(joinTable.name).transacting(trx.get()).insert(existingFolders.map((folder)=>({
2767
- [joinTable.inverseJoinColumn.name]: destinationFolderId,
2768
- [joinTable.joinColumn.name]: folder.id
2769
- }))).execute();
2770
- }
2771
- for (const existingFolder of existingFolders){
2772
- let replaceQuery;
2773
- switch(strapi.db.dialect.client){
2774
- case 'sqlite':
2775
- replaceQuery = '? || SUBSTRING(??, ?)';
2776
- break;
2777
- case 'postgres':
2778
- replaceQuery = 'CONCAT(?::TEXT, SUBSTRING(??, ?::INTEGER))';
2779
- break;
2780
- default:
2781
- replaceQuery = 'CONCAT(?, SUBSTRING(??, ?))';
2782
- }
2783
- // update path for folders themselves & folders below
2784
- totalFolderNumber = await strapi.db.getConnection(folderTable).transacting(trx.get()).where(pathColName, existingFolder.path).orWhere(pathColName, 'like', `${existingFolder.path}/%`).update(pathColName, strapi.db.connection.raw(replaceQuery, [
2785
- utils.strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),
2786
- pathColName,
2787
- existingFolder.path.length + 1
2788
- ]));
2789
- // update path of files below
2790
- totalFileNumber = await strapi.db.getConnection(fileTable).transacting(trx.get()).where(folderPathColName, existingFolder.path).orWhere(folderPathColName, 'like', `${existingFolder.path}/%`).update(folderPathColName, strapi.db.connection.raw(replaceQuery, [
2791
- utils.strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),
2792
- folderPathColName,
2793
- existingFolder.path.length + 1
2794
- ]));
2795
- }
2796
- }
2797
- if (existingFiles.length > 0) {
2798
- // update files' folder relation (delete + insert; upsert not possible)
2799
- // @ts-expect-error - no dynamic typings for the models
2800
- const fileJoinTable = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folder.joinTable;
2801
- await strapi.db.queryBuilder(fileJoinTable.name).transacting(trx.get()).delete().where({
2802
- [fileJoinTable.joinColumn.name]: {
2803
- $in: fileIds
2804
- }
2805
- }).execute();
2806
- if (destinationFolderId !== null) {
2807
- await strapi.db.queryBuilder(fileJoinTable.name).transacting(trx.get()).insert(existingFiles.map((file)=>({
2808
- [fileJoinTable.inverseJoinColumn.name]: destinationFolderId,
2809
- [fileJoinTable.joinColumn.name]: file.id
2810
- }))).execute();
2811
- }
2812
- // update files main fields (path + updatedBy)
2813
- await strapi.db.getConnection(fileTable).transacting(trx.get()).whereIn('id', fileIds).update(folderPathColName, destinationFolderPath);
2814
- }
2815
- await trx.commit();
2816
- } catch (e) {
2817
- await trx.rollback();
2818
- throw e;
2819
- }
2820
- const updatedFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({
2821
- where: {
2822
- id: {
2823
- $in: folderIds
2824
- }
2825
- }
2826
- });
2827
- const updatedFiles = await strapi.db.query(FILE_MODEL_UID).findMany({
2828
- where: {
2829
- id: {
2830
- $in: fileIds
2831
- }
2832
- }
2833
- });
2834
- strapi.telemetry.send('didBulkMoveMediaLibraryElements', {
2835
- eventProperties: {
2836
- rootFolderNumber: updatedFolders.length,
2837
- rootAssetNumber: updatedFiles.length,
2838
- totalFolderNumber,
2839
- totalAssetNumber: totalFileNumber + updatedFiles.length
2840
- }
2841
- });
2842
- ctx.body = {
2843
- data: {
2844
- files: await pmFile.sanitizeOutput(updatedFiles),
2845
- folders: await pmFolder.sanitizeOutput(updatedFolders)
2846
- }
2847
- };
2848
- }
2849
- };
2850
-
2851
- const settingsSchema = utils.yup.object({
2852
- sizeOptimization: utils.yup.boolean().required(),
2853
- responsiveDimensions: utils.yup.boolean().required(),
2854
- autoOrientation: utils.yup.boolean()
2855
- });
2856
- var validateSettings = utils.validateYupSchema(settingsSchema);
2857
-
2858
- var adminSettings = {
2859
- async updateSettings (ctx) {
2860
- const { request: { body }, state: { userAbility } } = ctx;
2861
- if (userAbility.cannot(ACTIONS.readSettings, FILE_MODEL_UID)) {
2862
- return ctx.forbidden();
2863
- }
2864
- const data = await validateSettings(body);
2865
- await getService('upload').setSettings(data);
2866
- ctx.body = {
2867
- data
2868
- };
2869
- },
2870
- async getSettings (ctx) {
2871
- const { state: { userAbility } } = ctx;
2872
- if (userAbility.cannot(ACTIONS.readSettings, FILE_MODEL_UID)) {
2873
- return ctx.forbidden();
2874
- }
2875
- const data = await getService('upload').getSettings();
2876
- ctx.body = {
2877
- data
2878
- };
2879
- }
2880
- };
2881
-
2882
- const fileInfoSchema$1 = utils.yup.object({
2883
- name: utils.yup.string().nullable(),
2884
- alternativeText: utils.yup.string().nullable(),
2885
- caption: utils.yup.string().nullable(),
2886
- folder: utils.yup.strapiID().nullable().test('folder-exists', 'the folder does not exist', async (folderId)=>{
2887
- if (fp.isNil(folderId)) {
2888
- return true;
2889
- }
2890
- const exists = await getService('folder').exists({
2891
- id: folderId
2892
- });
2893
- return exists;
2894
- })
2895
- });
2896
- const uploadSchema$1 = utils.yup.object({
2897
- fileInfo: fileInfoSchema$1
2898
- });
2899
- const multiUploadSchema$1 = utils.yup.object({
2900
- fileInfo: utils.yup.array().of(fileInfoSchema$1)
2901
- });
2902
- const validateUploadBody$1 = (data = {}, isMulti = false)=>{
2903
- const schema = isMulti ? multiUploadSchema$1 : uploadSchema$1;
2904
- return utils.validateYupSchema(schema, {
2905
- strict: false
2906
- })(data);
2907
- };
2908
-
2909
- var adminUpload = {
2910
- async updateFileInfo (ctx) {
2911
- const { state: { userAbility, user }, query: { id }, request: { body } } = ctx;
2912
- if (typeof id !== 'string') {
2913
- throw new utils.errors.ValidationError('File id is required');
2914
- }
2915
- const uploadService = getService('upload');
2916
- const { pm } = await findEntityAndCheckPermissions(userAbility, ACTIONS.update, FILE_MODEL_UID, id);
2917
- const data = await validateUploadBody$1(body);
2918
- const file = await uploadService.updateFileInfo(id, data.fileInfo, {
2919
- user
2920
- });
2921
- ctx.body = await pm.sanitizeOutput(file, {
2922
- action: ACTIONS.read
2923
- });
2924
- },
2925
- async replaceFile (ctx) {
2926
- const { state: { userAbility, user }, query: { id }, request: { body, files: { files } = {} } } = ctx;
2927
- if (typeof id !== 'string') {
2928
- throw new utils.errors.ValidationError('File id is required');
2929
- }
2930
- const uploadService = getService('upload');
2931
- const { pm } = await findEntityAndCheckPermissions(userAbility, ACTIONS.update, FILE_MODEL_UID, id);
2932
- if (Array.isArray(files)) {
2933
- throw new utils.errors.ApplicationError('Cannot replace a file with multiple ones');
2934
- }
2935
- const data = await validateUploadBody$1(body);
2936
- const replacedFile = await uploadService.replace(id, {
2937
- data,
2938
- file: files
2939
- }, {
2940
- user
2941
- });
2942
- // Sign file urls for private providers
2943
- const signedFile = await getService('file').signFileUrls(replacedFile);
2944
- ctx.body = await pm.sanitizeOutput(signedFile, {
2945
- action: ACTIONS.read
2946
- });
2947
- },
2948
- async uploadFiles (ctx) {
2949
- const { state: { userAbility, user }, request: { body, files: { files } = {} } } = ctx;
2950
- const uploadService = getService('upload');
2951
- const pm = strapi.service('admin::permission').createPermissionsManager({
2952
- ability: userAbility,
2953
- action: ACTIONS.create,
2954
- model: FILE_MODEL_UID
2955
- });
2956
- if (!pm.isAllowed) {
2957
- return ctx.forbidden();
2958
- }
2959
- const data = await validateUploadBody$1(body);
2960
- const uploadedFiles = await uploadService.upload({
2961
- data,
2962
- files
2963
- }, {
2964
- user
2965
- });
2966
- // Sign file urls for private providers
2967
- const signedFiles = await utils.async.map(uploadedFiles, getService('file').signFileUrls);
2968
- ctx.body = await pm.sanitizeOutput(signedFiles, {
2969
- action: ACTIONS.read
2970
- });
2971
- ctx.status = 201;
2972
- },
2973
- // TODO: split into multiple endpoints
2974
- async upload (ctx) {
2975
- const { query: { id }, request: { files: { files } = {} } } = ctx;
2976
- if (_.isEmpty(files) || !Array.isArray(files) && files.size === 0) {
2977
- if (id) {
2978
- return this.updateFileInfo(ctx);
2979
- }
2980
- throw new utils.errors.ApplicationError('Files are empty');
2981
- }
2982
- await (id ? this.replaceFile : this.uploadFiles)(ctx);
2983
- }
2984
- };
2985
-
2986
- const fileInfoSchema = utils.yup.object({
2987
- name: utils.yup.string().nullable(),
2988
- alternativeText: utils.yup.string().nullable(),
2989
- caption: utils.yup.string().nullable()
2990
- }).noUnknown();
2991
- const uploadSchema = utils.yup.object({
2992
- fileInfo: fileInfoSchema
2993
- });
2994
- const multiUploadSchema = utils.yup.object({
2995
- fileInfo: utils.yup.array().of(fileInfoSchema)
2996
- });
2997
- const validateUploadBody = (data = {}, isMulti = false)=>{
2998
- const schema = isMulti ? multiUploadSchema : uploadSchema;
2999
- return utils.validateYupSchema(schema, {
3000
- strict: false
3001
- })(data);
3002
- };
3003
-
3004
- const { ValidationError } = utils.errors;
3005
- var contentApi = (({ strapi })=>{
3006
- const sanitizeOutput = async (data, ctx)=>{
3007
- const schema = strapi.getModel(FILE_MODEL_UID);
3008
- const { auth } = ctx.state;
3009
- return strapi.contentAPI.sanitize.output(data, schema, {
3010
- auth
3011
- });
3012
- };
3013
- const validateQuery = async (data, ctx)=>{
3014
- const schema = strapi.getModel(FILE_MODEL_UID);
3015
- const { auth } = ctx.state;
3016
- return strapi.contentAPI.validate.query(data, schema, {
3017
- auth
3018
- });
3019
- };
3020
- const sanitizeQuery = async (data, ctx)=>{
3021
- const schema = strapi.getModel(FILE_MODEL_UID);
3022
- const { auth } = ctx.state;
3023
- return strapi.contentAPI.sanitize.query(data, schema, {
3024
- auth
3025
- });
3026
- };
3027
- return {
3028
- async find (ctx) {
3029
- await validateQuery(ctx.query, ctx);
3030
- const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);
3031
- const files = await getService('upload').findMany(sanitizedQuery);
3032
- ctx.body = await sanitizeOutput(files, ctx);
3033
- },
3034
- async findOne (ctx) {
3035
- const { params: { id } } = ctx;
3036
- await validateQuery(ctx.query, ctx);
3037
- const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);
3038
- const file = await getService('upload').findOne(id, sanitizedQuery.populate);
3039
- if (!file) {
3040
- return ctx.notFound('file.notFound');
3041
- }
3042
- ctx.body = await sanitizeOutput(file, ctx);
3043
- },
3044
- async destroy (ctx) {
3045
- const { params: { id } } = ctx;
3046
- const file = await getService('upload').findOne(id);
3047
- if (!file) {
3048
- return ctx.notFound('file.notFound');
3049
- }
3050
- await getService('upload').remove(file);
3051
- ctx.body = await sanitizeOutput(file, ctx);
3052
- },
3053
- async updateFileInfo (ctx) {
3054
- const { query: { id }, request: { body } } = ctx;
3055
- const data = await validateUploadBody(body);
3056
- if (!id || typeof id !== 'string' && typeof id !== 'number') {
3057
- throw new ValidationError('File id is required and must be a single value');
3058
- }
3059
- const result = await getService('upload').updateFileInfo(id, data.fileInfo);
3060
- ctx.body = await sanitizeOutput(result, ctx);
3061
- },
3062
- async replaceFile (ctx) {
3063
- const { query: { id }, request: { body, files: { files } = {} } } = ctx;
3064
- // cannot replace with more than one file
3065
- if (Array.isArray(files)) {
3066
- throw new ValidationError('Cannot replace a file with multiple ones');
3067
- }
3068
- if (!id || typeof id !== 'string' && typeof id !== 'number') {
3069
- throw new ValidationError('File id is required and must be a single value');
3070
- }
3071
- const data = await validateUploadBody(body);
3072
- const replacedFiles = await getService('upload').replace(id, {
3073
- data,
3074
- file: files
3075
- });
3076
- ctx.body = await sanitizeOutput(replacedFiles, ctx);
3077
- },
3078
- async uploadFiles (ctx) {
3079
- const { request: { body, files: { files } = {} } } = ctx;
3080
- const data = await validateUploadBody(body, Array.isArray(files));
3081
- const apiUploadFolderService = getService('api-upload-folder');
3082
- const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();
3083
- if (Array.isArray(files)) {
3084
- data.fileInfo = data.fileInfo || [];
3085
- data.fileInfo = files.map((_f, i)=>({
3086
- ...data.fileInfo[i],
3087
- folder: apiUploadFolder.id
3088
- }));
3089
- } else {
3090
- data.fileInfo = {
3091
- ...data.fileInfo,
3092
- folder: apiUploadFolder.id
3093
- };
3094
- }
3095
- const uploadedFiles = await getService('upload').upload({
3096
- data,
3097
- files
3098
- });
3099
- ctx.body = await sanitizeOutput(uploadedFiles, ctx);
3100
- ctx.status = 201;
3101
- },
3102
- // TODO: split into multiple endpoints
3103
- async upload (ctx) {
3104
- const { query: { id }, request: { files: { files } = {} } } = ctx;
3105
- if (_.isEmpty(files) || !Array.isArray(files) && files.size === 0) {
3106
- if (id) {
3107
- return this.updateFileInfo(ctx);
3108
- }
3109
- throw new ValidationError('Files are empty');
3110
- }
3111
- await (id ? this.replaceFile : this.uploadFiles)(ctx);
3112
- }
3113
- };
3114
- });
3115
-
3116
- const configSchema = utils.yup.object({
3117
- pageSize: utils.yup.number().required(),
3118
- sort: utils.yup.mixed().oneOf(ALLOWED_SORT_STRINGS)
3119
- });
3120
- const validateViewConfiguration = utils.validateYupSchema(configSchema);
3121
-
3122
- var viewConfiguration = {
3123
- async updateViewConfiguration (ctx) {
3124
- const { request: { body }, state: { userAbility } } = ctx;
3125
- if (userAbility.cannot(ACTIONS.configureView)) {
3126
- return ctx.forbidden();
3127
- }
3128
- const data = await validateViewConfiguration(body);
3129
- await getService('upload').setConfiguration(data);
3130
- ctx.body = {
3131
- data
3132
- };
3133
- },
3134
- async findViewConfiguration (ctx) {
3135
- const data = await getService('upload').getConfiguration();
3136
- ctx.body = {
3137
- data
3138
- };
3139
- }
3140
- };
3141
-
3142
- const controllers = {
3143
- 'admin-file': adminFile,
3144
- 'admin-folder': adminFolder,
3145
- 'admin-folder-file': adminFolderFile,
3146
- 'admin-settings': adminSettings,
3147
- 'admin-upload': adminUpload,
3148
- 'content-api': contentApi,
3149
- 'view-configuration': viewConfiguration
3150
- };
3151
-
3152
- var index = (()=>({
3153
- register,
3154
- bootstrap,
3155
- config,
3156
- routes,
3157
- controllers,
3158
- contentTypes,
3159
- services
3160
- }));
3161
-
3162
- exports.FILE_MODEL_UID = FILE_MODEL_UID;
3163
- exports.index = index;
3164
- //# sourceMappingURL=index-D2QOphAI.js.map