@strapi/content-manager 0.0.0-next.e21fe90bf2ab9906267ea6e6ca620bdcc729906c → 0.0.0-next.e326c69a49373b420f6566c30aca26f4b6274c6a

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 (407) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +304 -205
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +309 -211
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/components/ConfigurationForm/Form.js +1 -1
  6. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  7. package/dist/admin/components/ConfigurationForm/Form.mjs +3 -3
  8. package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
  9. package/dist/admin/components/DragPreviews/CardDragPreview.js +3 -1
  10. package/dist/admin/components/DragPreviews/CardDragPreview.js.map +1 -1
  11. package/dist/admin/components/DragPreviews/CardDragPreview.mjs +3 -1
  12. package/dist/admin/components/DragPreviews/CardDragPreview.mjs.map +1 -1
  13. package/dist/admin/components/DragPreviews/ComponentDragPreview.js +3 -1
  14. package/dist/admin/components/DragPreviews/ComponentDragPreview.js.map +1 -1
  15. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs +3 -1
  16. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs.map +1 -1
  17. package/dist/admin/components/DragPreviews/RelationDragPreview.js +3 -1
  18. package/dist/admin/components/DragPreviews/RelationDragPreview.js.map +1 -1
  19. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs +3 -1
  20. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs.map +1 -1
  21. package/dist/admin/components/LeftMenu.js +92 -48
  22. package/dist/admin/components/LeftMenu.js.map +1 -1
  23. package/dist/admin/components/LeftMenu.mjs +95 -51
  24. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  25. package/dist/admin/components/Widgets.js +269 -9
  26. package/dist/admin/components/Widgets.js.map +1 -1
  27. package/dist/admin/components/Widgets.mjs +252 -12
  28. package/dist/admin/components/Widgets.mjs.map +1 -1
  29. package/dist/admin/history/components/VersionContent.js +24 -3
  30. package/dist/admin/history/components/VersionContent.js.map +1 -1
  31. package/dist/admin/history/components/VersionContent.mjs +25 -4
  32. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  33. package/dist/admin/history/components/VersionHeader.js +7 -0
  34. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  35. package/dist/admin/history/components/VersionHeader.mjs +8 -1
  36. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  37. package/dist/admin/history/components/VersionsList.js +1 -1
  38. package/dist/admin/history/components/VersionsList.js.map +1 -1
  39. package/dist/admin/history/components/VersionsList.mjs +1 -1
  40. package/dist/admin/history/components/VersionsList.mjs.map +1 -1
  41. package/dist/admin/history/pages/History.js +7 -7
  42. package/dist/admin/history/pages/History.js.map +1 -1
  43. package/dist/admin/history/pages/History.mjs +7 -7
  44. package/dist/admin/history/pages/History.mjs.map +1 -1
  45. package/dist/admin/hooks/useDocumentActions.js +12 -7
  46. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  47. package/dist/admin/hooks/useDocumentActions.mjs +13 -8
  48. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  49. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  50. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
  51. package/dist/admin/index.js +48 -11
  52. package/dist/admin/index.js.map +1 -1
  53. package/dist/admin/index.mjs +47 -9
  54. package/dist/admin/index.mjs.map +1 -1
  55. package/dist/admin/layout.js +28 -33
  56. package/dist/admin/layout.js.map +1 -1
  57. package/dist/admin/layout.mjs +29 -15
  58. package/dist/admin/layout.mjs.map +1 -1
  59. package/dist/admin/pages/EditView/EditViewPage.js +98 -77
  60. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  61. package/dist/admin/pages/EditView/EditViewPage.mjs +100 -79
  62. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  63. package/dist/admin/pages/EditView/components/Blocker.js +18 -0
  64. package/dist/admin/pages/EditView/components/Blocker.js.map +1 -0
  65. package/dist/admin/pages/EditView/components/Blocker.mjs +16 -0
  66. package/dist/admin/pages/EditView/components/Blocker.mjs.map +1 -0
  67. package/dist/admin/pages/EditView/components/DocumentActions.js +304 -91
  68. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  69. package/dist/admin/pages/EditView/components/DocumentActions.mjs +308 -95
  70. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +12 -15
  72. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +12 -15
  74. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +61 -26
  76. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +63 -28
  78. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +21 -35
  80. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +21 -35
  82. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
  84. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
  86. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +12 -1
  88. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +13 -2
  90. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +17 -3
  92. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +18 -4
  94. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +1 -2
  96. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +1 -2
  98. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +20 -6
  100. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +22 -8
  102. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +129 -55
  104. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +129 -55
  106. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +126 -34
  108. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  109. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +130 -38
  110. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  111. package/dist/admin/pages/EditView/components/FormInputs/UID.js +4 -2
  112. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  113. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +4 -2
  114. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  115. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +1 -1
  116. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  117. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +1 -1
  118. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  119. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
  120. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  121. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
  122. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  123. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +86 -118
  124. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
  125. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +86 -118
  126. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
  127. package/dist/admin/pages/EditView/components/FormLayout.js +59 -34
  128. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  129. package/dist/admin/pages/EditView/components/FormLayout.mjs +60 -34
  130. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  131. package/dist/admin/pages/EditView/components/Header.js +22 -7
  132. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  133. package/dist/admin/pages/EditView/components/Header.mjs +23 -8
  134. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
  135. package/dist/admin/pages/EditView/components/InputRenderer.js +20 -7
  136. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  137. package/dist/admin/pages/EditView/components/InputRenderer.mjs +20 -7
  138. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  139. package/dist/admin/pages/EditView/utils/data.js +128 -0
  140. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  141. package/dist/admin/pages/EditView/utils/data.mjs +128 -1
  142. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  143. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +1 -0
  144. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  145. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +1 -0
  146. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  147. package/dist/admin/pages/ListView/ListViewPage.js +227 -132
  148. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  149. package/dist/admin/pages/ListView/ListViewPage.mjs +229 -134
  150. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  151. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +2 -1
  152. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  153. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +2 -1
  154. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  155. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +12 -2
  156. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  157. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +12 -2
  158. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  159. package/dist/admin/pages/ListView/components/Filters.js +4 -1
  160. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  161. package/dist/admin/pages/ListView/components/Filters.mjs +4 -1
  162. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  163. package/dist/admin/pages/ListView/components/TableActions.js +13 -3
  164. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  165. package/dist/admin/pages/ListView/components/TableActions.mjs +13 -3
  166. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  167. package/dist/admin/preview/components/InputPopover.js +189 -0
  168. package/dist/admin/preview/components/InputPopover.js.map +1 -0
  169. package/dist/admin/preview/components/InputPopover.mjs +167 -0
  170. package/dist/admin/preview/components/InputPopover.mjs.map +1 -0
  171. package/dist/admin/preview/components/PreviewHeader.js +1 -2
  172. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  173. package/dist/admin/preview/components/PreviewHeader.mjs +1 -2
  174. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  175. package/dist/admin/preview/components/PreviewSidePanel.js +31 -4
  176. package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
  177. package/dist/admin/preview/components/PreviewSidePanel.mjs +32 -5
  178. package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
  179. package/dist/admin/preview/hooks/usePreviewInputManager.js +77 -0
  180. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -0
  181. package/dist/admin/preview/hooks/usePreviewInputManager.mjs +56 -0
  182. package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -0
  183. package/dist/admin/preview/pages/Preview.js +178 -74
  184. package/dist/admin/preview/pages/Preview.js.map +1 -1
  185. package/dist/admin/preview/pages/Preview.mjs +180 -76
  186. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  187. package/dist/admin/preview/utils/constants.js +56 -0
  188. package/dist/admin/preview/utils/constants.js.map +1 -0
  189. package/dist/admin/preview/utils/constants.mjs +52 -0
  190. package/dist/admin/preview/utils/constants.mjs.map +1 -0
  191. package/dist/admin/preview/utils/fieldUtils.js +107 -0
  192. package/dist/admin/preview/utils/fieldUtils.js.map +1 -0
  193. package/dist/admin/preview/utils/fieldUtils.mjs +102 -0
  194. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -0
  195. package/dist/admin/preview/utils/getSendMessage.js +22 -0
  196. package/dist/admin/preview/utils/getSendMessage.js.map +1 -0
  197. package/dist/admin/preview/utils/getSendMessage.mjs +20 -0
  198. package/dist/admin/preview/utils/getSendMessage.mjs.map +1 -0
  199. package/dist/admin/preview/utils/previewScript.js +534 -0
  200. package/dist/admin/preview/utils/previewScript.js.map +1 -0
  201. package/dist/admin/preview/utils/previewScript.mjs +532 -0
  202. package/dist/admin/preview/utils/previewScript.mjs.map +1 -0
  203. package/dist/admin/services/api.js +4 -1
  204. package/dist/admin/services/api.js.map +1 -1
  205. package/dist/admin/services/api.mjs +4 -1
  206. package/dist/admin/services/api.mjs.map +1 -1
  207. package/dist/admin/services/documents.js +42 -16
  208. package/dist/admin/services/documents.js.map +1 -1
  209. package/dist/admin/services/documents.mjs +42 -16
  210. package/dist/admin/services/documents.mjs.map +1 -1
  211. package/dist/admin/services/homepage.js +9 -5
  212. package/dist/admin/services/homepage.js.map +1 -1
  213. package/dist/admin/services/homepage.mjs +9 -5
  214. package/dist/admin/services/homepage.mjs.map +1 -1
  215. package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +6 -4
  216. package/dist/admin/src/components/LeftMenu.d.ts +3 -1
  217. package/dist/admin/src/components/Widgets.d.ts +2 -1
  218. package/dist/admin/src/exports.d.ts +1 -0
  219. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  220. package/dist/admin/src/hooks/useDocumentActions.d.ts +1 -0
  221. package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
  222. package/dist/admin/src/pages/EditView/components/Blocker.d.ts +5 -0
  223. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
  224. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +26 -5
  225. package/dist/admin/src/pages/EditView/components/FormInputs/UID.d.ts +1 -0
  226. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +7 -11
  227. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
  228. package/dist/admin/src/pages/EditView/utils/data.d.ts +19 -1
  229. package/dist/admin/src/preview/components/InputPopover.d.ts +6 -0
  230. package/dist/admin/src/preview/hooks/usePreviewInputManager.d.ts +5 -0
  231. package/dist/admin/src/preview/pages/Preview.d.ts +12 -0
  232. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  233. package/dist/admin/src/preview/utils/constants.d.ts +55 -0
  234. package/dist/admin/src/preview/utils/fieldUtils.d.ts +22 -0
  235. package/dist/admin/src/preview/utils/getSendMessage.d.ts +11 -0
  236. package/dist/admin/src/preview/utils/previewScript.d.ts +24 -0
  237. package/dist/admin/src/services/api.d.ts +1 -1
  238. package/dist/admin/src/services/components.d.ts +2 -2
  239. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  240. package/dist/admin/src/services/documents.d.ts +23 -17
  241. package/dist/admin/src/services/homepage.d.ts +1 -1
  242. package/dist/admin/src/services/init.d.ts +1 -1
  243. package/dist/admin/src/services/relations.d.ts +2 -2
  244. package/dist/admin/src/services/uid.d.ts +3 -3
  245. package/dist/admin/src/utils/api.d.ts +1 -1
  246. package/dist/admin/src/utils/validation.d.ts +1 -0
  247. package/dist/admin/translations/en.json.js +15 -1
  248. package/dist/admin/translations/en.json.js.map +1 -1
  249. package/dist/admin/translations/en.json.mjs +15 -1
  250. package/dist/admin/translations/en.json.mjs.map +1 -1
  251. package/dist/admin/translations/es.json.js +6 -2
  252. package/dist/admin/translations/es.json.js.map +1 -1
  253. package/dist/admin/translations/es.json.mjs +6 -2
  254. package/dist/admin/translations/es.json.mjs.map +1 -1
  255. package/dist/admin/translations/fr.json.js +11 -2
  256. package/dist/admin/translations/fr.json.js.map +1 -1
  257. package/dist/admin/translations/fr.json.mjs +11 -2
  258. package/dist/admin/translations/fr.json.mjs.map +1 -1
  259. package/dist/admin/translations/ru.json.js +235 -226
  260. package/dist/admin/translations/ru.json.js.map +1 -1
  261. package/dist/admin/translations/ru.json.mjs +230 -226
  262. package/dist/admin/translations/ru.json.mjs.map +1 -1
  263. package/dist/admin/utils/api.js +1 -1
  264. package/dist/admin/utils/api.js.map +1 -1
  265. package/dist/admin/utils/api.mjs +1 -1
  266. package/dist/admin/utils/api.mjs.map +1 -1
  267. package/dist/admin/utils/validation.js +19 -7
  268. package/dist/admin/utils/validation.js.map +1 -1
  269. package/dist/admin/utils/validation.mjs +19 -7
  270. package/dist/admin/utils/validation.mjs.map +1 -1
  271. package/dist/server/controllers/content-types.js +11 -1
  272. package/dist/server/controllers/content-types.js.map +1 -1
  273. package/dist/server/controllers/content-types.mjs +11 -1
  274. package/dist/server/controllers/content-types.mjs.map +1 -1
  275. package/dist/server/controllers/index.js +3 -1
  276. package/dist/server/controllers/index.js.map +1 -1
  277. package/dist/server/controllers/index.mjs +3 -1
  278. package/dist/server/controllers/index.mjs.map +1 -1
  279. package/dist/server/controllers/relations.js +2 -2
  280. package/dist/server/controllers/relations.js.map +1 -1
  281. package/dist/server/controllers/relations.mjs +2 -2
  282. package/dist/server/controllers/relations.mjs.map +1 -1
  283. package/dist/server/controllers/validation/index.js +14 -2
  284. package/dist/server/controllers/validation/index.js.map +1 -1
  285. package/dist/server/controllers/validation/index.mjs +14 -2
  286. package/dist/server/controllers/validation/index.mjs.map +1 -1
  287. package/dist/server/history/services/lifecycles.js +23 -19
  288. package/dist/server/history/services/lifecycles.js.map +1 -1
  289. package/dist/server/history/services/lifecycles.mjs +23 -19
  290. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  291. package/dist/server/homepage/controllers/homepage.js +62 -0
  292. package/dist/server/homepage/controllers/homepage.js.map +1 -0
  293. package/dist/server/homepage/controllers/homepage.mjs +41 -0
  294. package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
  295. package/dist/server/homepage/controllers/index.js +10 -0
  296. package/dist/server/homepage/controllers/index.js.map +1 -0
  297. package/dist/server/homepage/controllers/index.mjs +8 -0
  298. package/dist/server/homepage/controllers/index.mjs.map +1 -0
  299. package/dist/server/homepage/index.js +14 -0
  300. package/dist/server/homepage/index.js.map +1 -0
  301. package/dist/server/homepage/index.mjs +12 -0
  302. package/dist/server/homepage/index.mjs.map +1 -0
  303. package/dist/server/homepage/routes/homepage.js +36 -0
  304. package/dist/server/homepage/routes/homepage.js.map +1 -0
  305. package/dist/server/homepage/routes/homepage.mjs +34 -0
  306. package/dist/server/homepage/routes/homepage.mjs.map +1 -0
  307. package/dist/server/homepage/routes/index.js +13 -0
  308. package/dist/server/homepage/routes/index.js.map +1 -0
  309. package/dist/server/homepage/routes/index.mjs +11 -0
  310. package/dist/server/homepage/routes/index.mjs.map +1 -0
  311. package/dist/server/homepage/services/homepage.js +197 -0
  312. package/dist/server/homepage/services/homepage.js.map +1 -0
  313. package/dist/server/homepage/services/homepage.mjs +195 -0
  314. package/dist/server/homepage/services/homepage.mjs.map +1 -0
  315. package/dist/server/homepage/services/index.js +10 -0
  316. package/dist/server/homepage/services/index.js.map +1 -0
  317. package/dist/server/homepage/services/index.mjs +8 -0
  318. package/dist/server/homepage/services/index.mjs.map +1 -0
  319. package/dist/server/preview/services/preview-config.js +5 -1
  320. package/dist/server/preview/services/preview-config.js.map +1 -1
  321. package/dist/server/preview/services/preview-config.mjs +5 -1
  322. package/dist/server/preview/services/preview-config.mjs.map +1 -1
  323. package/dist/server/preview/services/preview.js +4 -1
  324. package/dist/server/preview/services/preview.js.map +1 -1
  325. package/dist/server/preview/services/preview.mjs +4 -1
  326. package/dist/server/preview/services/preview.mjs.map +1 -1
  327. package/dist/server/routes/index.js +3 -1
  328. package/dist/server/routes/index.js.map +1 -1
  329. package/dist/server/routes/index.mjs +3 -1
  330. package/dist/server/routes/index.mjs.map +1 -1
  331. package/dist/server/services/data-mapper.js +4 -1
  332. package/dist/server/services/data-mapper.js.map +1 -1
  333. package/dist/server/services/data-mapper.mjs +4 -1
  334. package/dist/server/services/data-mapper.mjs.map +1 -1
  335. package/dist/server/services/document-manager.js +8 -1
  336. package/dist/server/services/document-manager.js.map +1 -1
  337. package/dist/server/services/document-manager.mjs +8 -1
  338. package/dist/server/services/document-manager.mjs.map +1 -1
  339. package/dist/server/services/document-metadata.js +3 -1
  340. package/dist/server/services/document-metadata.js.map +1 -1
  341. package/dist/server/services/document-metadata.mjs +3 -1
  342. package/dist/server/services/document-metadata.mjs.map +1 -1
  343. package/dist/server/services/index.js +3 -1
  344. package/dist/server/services/index.js.map +1 -1
  345. package/dist/server/services/index.mjs +3 -1
  346. package/dist/server/services/index.mjs.map +1 -1
  347. package/dist/server/services/utils/configuration/attributes.js +1 -1
  348. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  349. package/dist/server/services/utils/configuration/attributes.mjs +1 -1
  350. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  351. package/dist/server/services/utils/configuration/layouts.js +1 -1
  352. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  353. package/dist/server/services/utils/configuration/layouts.mjs +1 -1
  354. package/dist/server/services/utils/configuration/layouts.mjs.map +1 -1
  355. package/dist/server/services/utils/configuration/metadatas.js +8 -0
  356. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  357. package/dist/server/services/utils/configuration/metadatas.mjs +8 -0
  358. package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -1
  359. package/dist/server/services/utils/populate.js +11 -0
  360. package/dist/server/services/utils/populate.js.map +1 -1
  361. package/dist/server/services/utils/populate.mjs +11 -0
  362. package/dist/server/services/utils/populate.mjs.map +1 -1
  363. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  364. package/dist/server/src/controllers/index.d.ts.map +1 -1
  365. package/dist/server/src/controllers/validation/index.d.ts +6 -1
  366. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  367. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  368. package/dist/server/src/homepage/controllers/homepage.d.ts +8 -0
  369. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
  370. package/dist/server/src/homepage/controllers/index.d.ts +2 -0
  371. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
  372. package/dist/server/src/homepage/index.d.ts +23 -0
  373. package/dist/server/src/homepage/index.d.ts.map +1 -0
  374. package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
  375. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
  376. package/dist/server/src/homepage/routes/index.d.ts +8 -0
  377. package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
  378. package/dist/server/src/homepage/services/homepage.d.ts +14 -0
  379. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
  380. package/dist/server/src/homepage/services/index.d.ts +16 -0
  381. package/dist/server/src/homepage/services/index.d.ts.map +1 -0
  382. package/dist/server/src/index.d.ts +15 -0
  383. package/dist/server/src/index.d.ts.map +1 -1
  384. package/dist/server/src/preview/services/index.d.ts +1 -0
  385. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  386. package/dist/server/src/preview/services/preview-config.d.ts +1 -0
  387. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  388. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  389. package/dist/server/src/preview/utils.d.ts +1 -0
  390. package/dist/server/src/preview/utils.d.ts.map +1 -1
  391. package/dist/server/src/routes/index.d.ts +1 -0
  392. package/dist/server/src/routes/index.d.ts.map +1 -1
  393. package/dist/server/src/services/data-mapper.d.ts +1 -0
  394. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  395. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  396. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  397. package/dist/server/src/services/index.d.ts +14 -0
  398. package/dist/server/src/services/index.d.ts.map +1 -1
  399. package/dist/server/src/services/utils/configuration/metadatas.d.ts.map +1 -1
  400. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  401. package/dist/shared/contracts/collection-types.d.ts +0 -1
  402. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  403. package/dist/shared/contracts/homepage.d.ts +13 -0
  404. package/dist/shared/contracts/homepage.d.ts.map +1 -1
  405. package/package.json +11 -9
  406. package/dist/server/src/services/homepage.d.ts +0 -11
  407. package/dist/server/src/services/homepage.d.ts.map +0 -1
@@ -0,0 +1,197 @@
1
+ 'use strict';
2
+
3
+ var strapiUtils = require('@strapi/utils');
4
+
5
+ const createHomepageService = ({ strapi })=>{
6
+ const MAX_DOCUMENTS = 4;
7
+ const metadataService = strapi.plugin('content-manager').service('document-metadata');
8
+ const permissionService = strapi.admin.services.permission;
9
+ const getConfiguration = async (contentTypeUids)=>{
10
+ /**
11
+ * Don't use the strapi.store util because we need to make
12
+ * more precise queries than exact key matches, in order to make as few queries as possible.
13
+ */ const coreStore = strapi.db.query('strapi::core-store');
14
+ const rawConfigurations = await coreStore.findMany({
15
+ where: {
16
+ key: {
17
+ $in: contentTypeUids.map((contentType)=>`plugin_content_manager_configuration_content_types::${contentType}`)
18
+ }
19
+ }
20
+ });
21
+ return rawConfigurations.map((rawConfiguration)=>{
22
+ return JSON.parse(rawConfiguration.value);
23
+ });
24
+ };
25
+ const getPermittedContentTypes = async ()=>{
26
+ const readPermissions = await permissionService.findMany({
27
+ where: {
28
+ role: {
29
+ users: {
30
+ id: strapi.requestContext.get()?.state?.user.id
31
+ }
32
+ },
33
+ action: 'plugin::content-manager.explorer.read'
34
+ }
35
+ });
36
+ return readPermissions.map((permission)=>permission.subject).filter(Boolean);
37
+ };
38
+ const getContentTypesMeta = (allowedContentTypeUids, configurations)=>{
39
+ return allowedContentTypeUids.map((uid)=>{
40
+ const configuration = configurations.find((config)=>config.uid === uid);
41
+ const contentType = strapi.contentType(uid);
42
+ const fields = [
43
+ 'documentId',
44
+ 'updatedAt'
45
+ ];
46
+ // Add fields required to get the status if D&P is enabled
47
+ const hasDraftAndPublish = strapiUtils.contentTypes.hasDraftAndPublish(contentType);
48
+ if (hasDraftAndPublish) {
49
+ fields.push('publishedAt');
50
+ }
51
+ // Only add the main field if it's defined
52
+ if (configuration?.settings.mainField) {
53
+ fields.push(configuration.settings.mainField);
54
+ }
55
+ // Only add locale if it's localized
56
+ const isLocalized = contentType.pluginOptions?.i18n?.localized;
57
+ if (isLocalized) {
58
+ fields.push('locale');
59
+ }
60
+ return {
61
+ fields,
62
+ mainField: configuration.settings.mainField,
63
+ contentType,
64
+ hasDraftAndPublish,
65
+ uid
66
+ };
67
+ });
68
+ };
69
+ const formatDocuments = (documents, meta, populate)=>{
70
+ return documents.map((document)=>{
71
+ const additionalFields = populate?.reduce((acc, key)=>{
72
+ acc[key] = document[key];
73
+ return acc;
74
+ }, {}) || {};
75
+ return {
76
+ documentId: document.documentId,
77
+ locale: document.locale ?? null,
78
+ updatedAt: new Date(document.updatedAt),
79
+ title: document[meta.mainField ?? 'documentId'],
80
+ publishedAt: meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,
81
+ contentTypeUid: meta.uid,
82
+ contentTypeDisplayName: meta.contentType.info.displayName,
83
+ kind: meta.contentType.kind,
84
+ ...additionalFields
85
+ };
86
+ });
87
+ };
88
+ const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');
89
+ const getPermissionChecker = (uid)=>permissionCheckerService.create({
90
+ userAbility: strapi.requestContext.get()?.state.userAbility,
91
+ model: uid
92
+ });
93
+ return {
94
+ async addStatusToDocuments (documents) {
95
+ return Promise.all(documents.map(async (recentDocument)=>{
96
+ const hasDraftAndPublish = strapiUtils.contentTypes.hasDraftAndPublish(strapi.contentType(recentDocument.contentTypeUid));
97
+ /**
98
+ * Tries to query the other version of the document if draft and publish is enabled,
99
+ * so that we know when to give the "modified" status.
100
+ */ const { availableStatus } = await metadataService.getMetadata(recentDocument.contentTypeUid, recentDocument, {
101
+ availableStatus: hasDraftAndPublish,
102
+ availableLocales: false
103
+ });
104
+ const status = metadataService.getStatus(recentDocument, availableStatus);
105
+ return {
106
+ ...recentDocument,
107
+ status: hasDraftAndPublish ? status : undefined
108
+ };
109
+ }));
110
+ },
111
+ async queryLastDocuments (additionalQueryParams, draftAndPublishOnly) {
112
+ const permittedContentTypes = await getPermittedContentTypes();
113
+ const allowedContentTypeUids = draftAndPublishOnly ? permittedContentTypes.filter((uid)=>{
114
+ return strapiUtils.contentTypes.hasDraftAndPublish(strapi.contentType(uid));
115
+ }) : permittedContentTypes;
116
+ // Fetch the configuration for each content type in a single query
117
+ const configurations = await getConfiguration(allowedContentTypeUids);
118
+ // Get the necessary metadata for the documents
119
+ const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);
120
+ const recentDocuments = await Promise.all(contentTypesMeta.map(async (meta)=>{
121
+ const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({
122
+ limit: MAX_DOCUMENTS,
123
+ fields: meta.fields,
124
+ ...additionalQueryParams
125
+ });
126
+ const docs = await strapi.documents(meta.uid).findMany(permissionQuery);
127
+ const populate = additionalQueryParams?.populate;
128
+ return formatDocuments(docs, meta, populate);
129
+ }));
130
+ return recentDocuments.flat().sort((a, b)=>{
131
+ switch(additionalQueryParams?.sort){
132
+ case 'publishedAt:desc':
133
+ if (!a.publishedAt || !b.publishedAt) return 0;
134
+ return b.publishedAt.valueOf() - a.publishedAt.valueOf();
135
+ case 'publishedAt:asc':
136
+ if (!a.publishedAt || !b.publishedAt) return 0;
137
+ return a.publishedAt.valueOf() - b.publishedAt.valueOf();
138
+ case 'updatedAt:desc':
139
+ if (!a.updatedAt || !b.updatedAt) return 0;
140
+ return b.updatedAt.valueOf() - a.updatedAt.valueOf();
141
+ case 'updatedAt:asc':
142
+ if (!a.updatedAt || !b.updatedAt) return 0;
143
+ return a.updatedAt.valueOf() - b.updatedAt.valueOf();
144
+ default:
145
+ return 0;
146
+ }
147
+ }).slice(0, MAX_DOCUMENTS);
148
+ },
149
+ async getRecentlyPublishedDocuments () {
150
+ const recentlyPublishedDocuments = await this.queryLastDocuments({
151
+ sort: 'publishedAt:desc',
152
+ status: 'published'
153
+ }, true);
154
+ return this.addStatusToDocuments(recentlyPublishedDocuments);
155
+ },
156
+ async getRecentlyUpdatedDocuments () {
157
+ const recentlyUpdatedDocuments = await this.queryLastDocuments({
158
+ sort: 'updatedAt:desc'
159
+ });
160
+ return this.addStatusToDocuments(recentlyUpdatedDocuments);
161
+ },
162
+ async getCountDocuments () {
163
+ const permittedContentTypes = await getPermittedContentTypes();
164
+ // Fetch the configuration for each content type in a single query
165
+ const configurations = await getConfiguration(permittedContentTypes);
166
+ // Get the necessary metadata for the documents
167
+ const contentTypesMeta = getContentTypesMeta(permittedContentTypes, configurations);
168
+ const countDocuments = {
169
+ draft: 0,
170
+ published: 0,
171
+ modified: 0
172
+ };
173
+ await Promise.all(contentTypesMeta.map(async (meta)=>{
174
+ const strapiDBConnection = strapi.db.connection;
175
+ const tableName = strapi.contentType(meta.uid).collectionName;
176
+ if (tableName) {
177
+ const draftDocuments = await strapiDBConnection(tableName).whereNull('published_at').whereIn('document_id', function() {
178
+ this.select('document_id').from(tableName).groupBy('document_id').havingRaw('COUNT(*) = 1');
179
+ }).count('* as count').first();
180
+ countDocuments.draft += Number(draftDocuments?.count) || 0;
181
+ const publishedDocuments = meta.hasDraftAndPublish ? await strapiDBConnection(tableName).countDistinct('draft.document_id as count').from(`${tableName} as draft`).join(`${tableName} as published`, function() {
182
+ this.on('draft.document_id', '=', 'published.document_id').andOn('draft.updated_at', '=', 'published.updated_at').andOnNull('draft.published_at').andOnNotNull('published.published_at');
183
+ }).first() : await strapiDBConnection(tableName).countDistinct('document_id as count').from(`${tableName}`).first();
184
+ countDocuments.published += Number(publishedDocuments?.count) || 0;
185
+ const modifiedDocuments = await strapiDBConnection(tableName).select('draft.document_id').from(`${tableName} as draft`).join(`${tableName} as published`, function() {
186
+ this.on('draft.document_id', '=', 'published.document_id').andOn('draft.updated_at', '!=', 'published.updated_at').andOnNull('draft.published_at').andOnNotNull('published.published_at');
187
+ }).countDistinct('draft.document_id as count').groupBy('draft.document_id').first();
188
+ countDocuments.modified += Number(modifiedDocuments?.count) || 0;
189
+ }
190
+ }));
191
+ return countDocuments;
192
+ }
193
+ };
194
+ };
195
+
196
+ exports.createHomepageService = createHomepageService;
197
+ //# sourceMappingURL=homepage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/services/homepage.ts"],"sourcesContent":["/* eslint-disable func-names */\nimport type { Core, Modules, Schema } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport type {\n GetCountDocuments,\n GetRecentDocuments,\n RecentDocument,\n} from '../../../../shared/contracts/homepage';\n\nconst createHomepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const MAX_DOCUMENTS = 4;\n\n const metadataService = strapi.plugin('content-manager').service('document-metadata');\n const permissionService = strapi.admin.services.permission;\n\n type ContentTypeConfiguration = {\n uid: RecentDocument['contentTypeUid'];\n settings: { mainField: string };\n };\n const getConfiguration = async (\n contentTypeUids: RecentDocument['contentTypeUid'][]\n ): Promise<ContentTypeConfiguration[]> => {\n /**\n * Don't use the strapi.store util because we need to make\n * more precise queries than exact key matches, in order to make as few queries as possible.\n */\n const coreStore = strapi.db.query('strapi::core-store');\n const rawConfigurations = await coreStore.findMany({\n where: {\n key: {\n $in: contentTypeUids.map(\n (contentType) => `plugin_content_manager_configuration_content_types::${contentType}`\n ),\n },\n },\n });\n\n return rawConfigurations.map((rawConfiguration) => {\n return JSON.parse(rawConfiguration.value);\n });\n };\n\n const getPermittedContentTypes = async () => {\n const readPermissions: Modules.Permissions.PermissionRule[] = await permissionService.findMany({\n where: {\n role: { users: { id: strapi.requestContext.get()?.state?.user.id } },\n action: 'plugin::content-manager.explorer.read',\n },\n });\n\n return readPermissions\n .map((permission) => permission.subject)\n .filter(Boolean) as RecentDocument['contentTypeUid'][];\n };\n\n type ContentTypeMeta = {\n fields: string[];\n mainField: string;\n contentType: Schema.ContentType;\n hasDraftAndPublish: boolean;\n uid: RecentDocument['contentTypeUid'];\n };\n\n const getContentTypesMeta = (\n allowedContentTypeUids: RecentDocument['contentTypeUid'][],\n configurations: ContentTypeConfiguration[]\n ): ContentTypeMeta[] => {\n return allowedContentTypeUids.map((uid) => {\n const configuration = configurations.find((config) => config.uid === uid);\n const contentType = strapi.contentType(uid);\n const fields = ['documentId', 'updatedAt'];\n\n // Add fields required to get the status if D&P is enabled\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);\n if (hasDraftAndPublish) {\n fields.push('publishedAt');\n }\n\n // Only add the main field if it's defined\n if (configuration?.settings.mainField) {\n fields.push(configuration.settings.mainField);\n }\n\n // Only add locale if it's localized\n const isLocalized = (contentType.pluginOptions?.i18n as any)?.localized;\n if (isLocalized) {\n fields.push('locale');\n }\n\n return {\n fields,\n mainField: configuration!.settings.mainField,\n contentType,\n hasDraftAndPublish,\n uid,\n };\n });\n };\n\n const formatDocuments = (\n documents: Modules.Documents.AnyDocument[],\n meta: ContentTypeMeta,\n populate?: string[]\n ) => {\n return documents.map((document) => {\n const additionalFields =\n populate?.reduce(\n (acc, key) => {\n acc[key] = document[key];\n return acc;\n },\n {} as Record<string, any>\n ) || {};\n return {\n documentId: document.documentId,\n locale: document.locale ?? null,\n updatedAt: new Date(document.updatedAt),\n title: document[meta.mainField ?? 'documentId'],\n publishedAt:\n meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,\n contentTypeUid: meta.uid,\n contentTypeDisplayName: meta.contentType.info.displayName,\n kind: meta.contentType.kind,\n ...additionalFields,\n };\n });\n };\n\n const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');\n const getPermissionChecker = (uid: string) =>\n permissionCheckerService.create({\n userAbility: strapi.requestContext.get()?.state.userAbility,\n model: uid,\n });\n\n return {\n async addStatusToDocuments(documents: RecentDocument[]): Promise<RecentDocument[]> {\n return Promise.all(\n documents.map(async (recentDocument) => {\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(\n strapi.contentType(recentDocument.contentTypeUid)\n );\n /**\n * Tries to query the other version of the document if draft and publish is enabled,\n * so that we know when to give the \"modified\" status.\n */\n const { availableStatus } = await metadataService.getMetadata(\n recentDocument.contentTypeUid,\n recentDocument,\n {\n availableStatus: hasDraftAndPublish,\n availableLocales: false,\n }\n );\n const status: RecentDocument['status'] = metadataService.getStatus(\n recentDocument,\n availableStatus\n );\n\n return {\n ...recentDocument,\n status: hasDraftAndPublish ? status : undefined,\n };\n })\n );\n },\n\n async queryLastDocuments(\n additionalQueryParams?: Record<string, unknown>,\n draftAndPublishOnly?: boolean\n ): Promise<RecentDocument[]> {\n const permittedContentTypes = await getPermittedContentTypes();\n const allowedContentTypeUids = draftAndPublishOnly\n ? permittedContentTypes.filter((uid) => {\n return contentTypes.hasDraftAndPublish(strapi.contentType(uid));\n })\n : permittedContentTypes;\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(allowedContentTypeUids);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n\n const recentDocuments = await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n limit: MAX_DOCUMENTS,\n fields: meta.fields,\n ...additionalQueryParams,\n });\n\n const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n const populate = additionalQueryParams?.populate as string[];\n\n return formatDocuments(docs, meta, populate);\n })\n );\n\n return recentDocuments\n .flat()\n .sort((a, b) => {\n switch (additionalQueryParams?.sort) {\n case 'publishedAt:desc':\n if (!a.publishedAt || !b.publishedAt) return 0;\n return b.publishedAt.valueOf() - a.publishedAt.valueOf();\n case 'publishedAt:asc':\n if (!a.publishedAt || !b.publishedAt) return 0;\n return a.publishedAt.valueOf() - b.publishedAt.valueOf();\n case 'updatedAt:desc':\n if (!a.updatedAt || !b.updatedAt) return 0;\n return b.updatedAt.valueOf() - a.updatedAt.valueOf();\n case 'updatedAt:asc':\n if (!a.updatedAt || !b.updatedAt) return 0;\n return a.updatedAt.valueOf() - b.updatedAt.valueOf();\n default:\n return 0;\n }\n })\n .slice(0, MAX_DOCUMENTS);\n },\n\n async getRecentlyPublishedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const recentlyPublishedDocuments = await this.queryLastDocuments(\n {\n sort: 'publishedAt:desc',\n status: 'published',\n },\n true\n );\n\n return this.addStatusToDocuments(recentlyPublishedDocuments);\n },\n\n async getRecentlyUpdatedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const recentlyUpdatedDocuments = await this.queryLastDocuments({\n sort: 'updatedAt:desc',\n });\n\n return this.addStatusToDocuments(recentlyUpdatedDocuments);\n },\n\n async getCountDocuments(): Promise<GetCountDocuments.Response['data']> {\n const permittedContentTypes = await getPermittedContentTypes();\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(permittedContentTypes);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(permittedContentTypes, configurations);\n\n const countDocuments = {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const strapiDBConnection = strapi.db.connection;\n const tableName = strapi.contentType(meta.uid).collectionName;\n if (tableName) {\n const draftDocuments = await strapiDBConnection(tableName)\n .whereNull('published_at')\n .whereIn('document_id', function () {\n this.select('document_id')\n .from(tableName)\n .groupBy('document_id')\n .havingRaw('COUNT(*) = 1');\n })\n .count('* as count')\n .first();\n countDocuments.draft += Number(draftDocuments?.count) || 0;\n\n const publishedDocuments = meta.hasDraftAndPublish\n ? await strapiDBConnection(tableName)\n .countDistinct('draft.document_id as count')\n .from(`${tableName} as draft`)\n .join(`${tableName} as published`, function () {\n this.on('draft.document_id', '=', 'published.document_id')\n .andOn('draft.updated_at', '=', 'published.updated_at')\n .andOnNull('draft.published_at')\n .andOnNotNull('published.published_at');\n })\n .first()\n : await strapiDBConnection(tableName)\n .countDistinct('document_id as count')\n .from(`${tableName}`)\n .first();\n countDocuments.published += Number(publishedDocuments?.count) || 0;\n\n const modifiedDocuments = await strapiDBConnection(tableName)\n .select('draft.document_id')\n .from(`${tableName} as draft`)\n .join(`${tableName} as published`, function () {\n this.on('draft.document_id', '=', 'published.document_id')\n .andOn('draft.updated_at', '!=', 'published.updated_at')\n .andOnNull('draft.published_at')\n .andOnNotNull('published.published_at');\n })\n .countDistinct('draft.document_id as count')\n .groupBy('draft.document_id')\n .first();\n countDocuments.modified += Number(modifiedDocuments?.count) || 0;\n }\n })\n );\n\n return countDocuments;\n },\n };\n};\n\nexport { createHomepageService };\n"],"names":["createHomepageService","strapi","MAX_DOCUMENTS","metadataService","plugin","service","permissionService","admin","services","permission","getConfiguration","contentTypeUids","coreStore","db","query","rawConfigurations","findMany","where","key","$in","map","contentType","rawConfiguration","JSON","parse","value","getPermittedContentTypes","readPermissions","role","users","id","requestContext","get","state","user","action","subject","filter","Boolean","getContentTypesMeta","allowedContentTypeUids","configurations","uid","configuration","find","config","fields","hasDraftAndPublish","contentTypes","push","settings","mainField","isLocalized","pluginOptions","i18n","localized","formatDocuments","documents","meta","populate","document","additionalFields","reduce","acc","documentId","locale","updatedAt","Date","title","publishedAt","contentTypeUid","contentTypeDisplayName","info","displayName","kind","permissionCheckerService","getPermissionChecker","create","userAbility","model","addStatusToDocuments","Promise","all","recentDocument","availableStatus","getMetadata","availableLocales","status","getStatus","undefined","queryLastDocuments","additionalQueryParams","draftAndPublishOnly","permittedContentTypes","contentTypesMeta","recentDocuments","permissionQuery","sanitizedQuery","read","limit","docs","flat","sort","a","b","valueOf","slice","getRecentlyPublishedDocuments","recentlyPublishedDocuments","getRecentlyUpdatedDocuments","recentlyUpdatedDocuments","getCountDocuments","countDocuments","draft","published","modified","strapiDBConnection","connection","tableName","collectionName","draftDocuments","whereNull","whereIn","select","from","groupBy","havingRaw","count","first","Number","publishedDocuments","countDistinct","join","on","andOn","andOnNull","andOnNotNull","modifiedDocuments"],"mappings":"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"}
@@ -0,0 +1,195 @@
1
+ import { contentTypes } from '@strapi/utils';
2
+
3
+ const createHomepageService = ({ strapi })=>{
4
+ const MAX_DOCUMENTS = 4;
5
+ const metadataService = strapi.plugin('content-manager').service('document-metadata');
6
+ const permissionService = strapi.admin.services.permission;
7
+ const getConfiguration = async (contentTypeUids)=>{
8
+ /**
9
+ * Don't use the strapi.store util because we need to make
10
+ * more precise queries than exact key matches, in order to make as few queries as possible.
11
+ */ const coreStore = strapi.db.query('strapi::core-store');
12
+ const rawConfigurations = await coreStore.findMany({
13
+ where: {
14
+ key: {
15
+ $in: contentTypeUids.map((contentType)=>`plugin_content_manager_configuration_content_types::${contentType}`)
16
+ }
17
+ }
18
+ });
19
+ return rawConfigurations.map((rawConfiguration)=>{
20
+ return JSON.parse(rawConfiguration.value);
21
+ });
22
+ };
23
+ const getPermittedContentTypes = async ()=>{
24
+ const readPermissions = await permissionService.findMany({
25
+ where: {
26
+ role: {
27
+ users: {
28
+ id: strapi.requestContext.get()?.state?.user.id
29
+ }
30
+ },
31
+ action: 'plugin::content-manager.explorer.read'
32
+ }
33
+ });
34
+ return readPermissions.map((permission)=>permission.subject).filter(Boolean);
35
+ };
36
+ const getContentTypesMeta = (allowedContentTypeUids, configurations)=>{
37
+ return allowedContentTypeUids.map((uid)=>{
38
+ const configuration = configurations.find((config)=>config.uid === uid);
39
+ const contentType = strapi.contentType(uid);
40
+ const fields = [
41
+ 'documentId',
42
+ 'updatedAt'
43
+ ];
44
+ // Add fields required to get the status if D&P is enabled
45
+ const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);
46
+ if (hasDraftAndPublish) {
47
+ fields.push('publishedAt');
48
+ }
49
+ // Only add the main field if it's defined
50
+ if (configuration?.settings.mainField) {
51
+ fields.push(configuration.settings.mainField);
52
+ }
53
+ // Only add locale if it's localized
54
+ const isLocalized = contentType.pluginOptions?.i18n?.localized;
55
+ if (isLocalized) {
56
+ fields.push('locale');
57
+ }
58
+ return {
59
+ fields,
60
+ mainField: configuration.settings.mainField,
61
+ contentType,
62
+ hasDraftAndPublish,
63
+ uid
64
+ };
65
+ });
66
+ };
67
+ const formatDocuments = (documents, meta, populate)=>{
68
+ return documents.map((document)=>{
69
+ const additionalFields = populate?.reduce((acc, key)=>{
70
+ acc[key] = document[key];
71
+ return acc;
72
+ }, {}) || {};
73
+ return {
74
+ documentId: document.documentId,
75
+ locale: document.locale ?? null,
76
+ updatedAt: new Date(document.updatedAt),
77
+ title: document[meta.mainField ?? 'documentId'],
78
+ publishedAt: meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,
79
+ contentTypeUid: meta.uid,
80
+ contentTypeDisplayName: meta.contentType.info.displayName,
81
+ kind: meta.contentType.kind,
82
+ ...additionalFields
83
+ };
84
+ });
85
+ };
86
+ const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');
87
+ const getPermissionChecker = (uid)=>permissionCheckerService.create({
88
+ userAbility: strapi.requestContext.get()?.state.userAbility,
89
+ model: uid
90
+ });
91
+ return {
92
+ async addStatusToDocuments (documents) {
93
+ return Promise.all(documents.map(async (recentDocument)=>{
94
+ const hasDraftAndPublish = contentTypes.hasDraftAndPublish(strapi.contentType(recentDocument.contentTypeUid));
95
+ /**
96
+ * Tries to query the other version of the document if draft and publish is enabled,
97
+ * so that we know when to give the "modified" status.
98
+ */ const { availableStatus } = await metadataService.getMetadata(recentDocument.contentTypeUid, recentDocument, {
99
+ availableStatus: hasDraftAndPublish,
100
+ availableLocales: false
101
+ });
102
+ const status = metadataService.getStatus(recentDocument, availableStatus);
103
+ return {
104
+ ...recentDocument,
105
+ status: hasDraftAndPublish ? status : undefined
106
+ };
107
+ }));
108
+ },
109
+ async queryLastDocuments (additionalQueryParams, draftAndPublishOnly) {
110
+ const permittedContentTypes = await getPermittedContentTypes();
111
+ const allowedContentTypeUids = draftAndPublishOnly ? permittedContentTypes.filter((uid)=>{
112
+ return contentTypes.hasDraftAndPublish(strapi.contentType(uid));
113
+ }) : permittedContentTypes;
114
+ // Fetch the configuration for each content type in a single query
115
+ const configurations = await getConfiguration(allowedContentTypeUids);
116
+ // Get the necessary metadata for the documents
117
+ const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);
118
+ const recentDocuments = await Promise.all(contentTypesMeta.map(async (meta)=>{
119
+ const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({
120
+ limit: MAX_DOCUMENTS,
121
+ fields: meta.fields,
122
+ ...additionalQueryParams
123
+ });
124
+ const docs = await strapi.documents(meta.uid).findMany(permissionQuery);
125
+ const populate = additionalQueryParams?.populate;
126
+ return formatDocuments(docs, meta, populate);
127
+ }));
128
+ return recentDocuments.flat().sort((a, b)=>{
129
+ switch(additionalQueryParams?.sort){
130
+ case 'publishedAt:desc':
131
+ if (!a.publishedAt || !b.publishedAt) return 0;
132
+ return b.publishedAt.valueOf() - a.publishedAt.valueOf();
133
+ case 'publishedAt:asc':
134
+ if (!a.publishedAt || !b.publishedAt) return 0;
135
+ return a.publishedAt.valueOf() - b.publishedAt.valueOf();
136
+ case 'updatedAt:desc':
137
+ if (!a.updatedAt || !b.updatedAt) return 0;
138
+ return b.updatedAt.valueOf() - a.updatedAt.valueOf();
139
+ case 'updatedAt:asc':
140
+ if (!a.updatedAt || !b.updatedAt) return 0;
141
+ return a.updatedAt.valueOf() - b.updatedAt.valueOf();
142
+ default:
143
+ return 0;
144
+ }
145
+ }).slice(0, MAX_DOCUMENTS);
146
+ },
147
+ async getRecentlyPublishedDocuments () {
148
+ const recentlyPublishedDocuments = await this.queryLastDocuments({
149
+ sort: 'publishedAt:desc',
150
+ status: 'published'
151
+ }, true);
152
+ return this.addStatusToDocuments(recentlyPublishedDocuments);
153
+ },
154
+ async getRecentlyUpdatedDocuments () {
155
+ const recentlyUpdatedDocuments = await this.queryLastDocuments({
156
+ sort: 'updatedAt:desc'
157
+ });
158
+ return this.addStatusToDocuments(recentlyUpdatedDocuments);
159
+ },
160
+ async getCountDocuments () {
161
+ const permittedContentTypes = await getPermittedContentTypes();
162
+ // Fetch the configuration for each content type in a single query
163
+ const configurations = await getConfiguration(permittedContentTypes);
164
+ // Get the necessary metadata for the documents
165
+ const contentTypesMeta = getContentTypesMeta(permittedContentTypes, configurations);
166
+ const countDocuments = {
167
+ draft: 0,
168
+ published: 0,
169
+ modified: 0
170
+ };
171
+ await Promise.all(contentTypesMeta.map(async (meta)=>{
172
+ const strapiDBConnection = strapi.db.connection;
173
+ const tableName = strapi.contentType(meta.uid).collectionName;
174
+ if (tableName) {
175
+ const draftDocuments = await strapiDBConnection(tableName).whereNull('published_at').whereIn('document_id', function() {
176
+ this.select('document_id').from(tableName).groupBy('document_id').havingRaw('COUNT(*) = 1');
177
+ }).count('* as count').first();
178
+ countDocuments.draft += Number(draftDocuments?.count) || 0;
179
+ const publishedDocuments = meta.hasDraftAndPublish ? await strapiDBConnection(tableName).countDistinct('draft.document_id as count').from(`${tableName} as draft`).join(`${tableName} as published`, function() {
180
+ this.on('draft.document_id', '=', 'published.document_id').andOn('draft.updated_at', '=', 'published.updated_at').andOnNull('draft.published_at').andOnNotNull('published.published_at');
181
+ }).first() : await strapiDBConnection(tableName).countDistinct('document_id as count').from(`${tableName}`).first();
182
+ countDocuments.published += Number(publishedDocuments?.count) || 0;
183
+ const modifiedDocuments = await strapiDBConnection(tableName).select('draft.document_id').from(`${tableName} as draft`).join(`${tableName} as published`, function() {
184
+ this.on('draft.document_id', '=', 'published.document_id').andOn('draft.updated_at', '!=', 'published.updated_at').andOnNull('draft.published_at').andOnNotNull('published.published_at');
185
+ }).countDistinct('draft.document_id as count').groupBy('draft.document_id').first();
186
+ countDocuments.modified += Number(modifiedDocuments?.count) || 0;
187
+ }
188
+ }));
189
+ return countDocuments;
190
+ }
191
+ };
192
+ };
193
+
194
+ export { createHomepageService };
195
+ //# sourceMappingURL=homepage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/services/homepage.ts"],"sourcesContent":["/* eslint-disable func-names */\nimport type { Core, Modules, Schema } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport type {\n GetCountDocuments,\n GetRecentDocuments,\n RecentDocument,\n} from '../../../../shared/contracts/homepage';\n\nconst createHomepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const MAX_DOCUMENTS = 4;\n\n const metadataService = strapi.plugin('content-manager').service('document-metadata');\n const permissionService = strapi.admin.services.permission;\n\n type ContentTypeConfiguration = {\n uid: RecentDocument['contentTypeUid'];\n settings: { mainField: string };\n };\n const getConfiguration = async (\n contentTypeUids: RecentDocument['contentTypeUid'][]\n ): Promise<ContentTypeConfiguration[]> => {\n /**\n * Don't use the strapi.store util because we need to make\n * more precise queries than exact key matches, in order to make as few queries as possible.\n */\n const coreStore = strapi.db.query('strapi::core-store');\n const rawConfigurations = await coreStore.findMany({\n where: {\n key: {\n $in: contentTypeUids.map(\n (contentType) => `plugin_content_manager_configuration_content_types::${contentType}`\n ),\n },\n },\n });\n\n return rawConfigurations.map((rawConfiguration) => {\n return JSON.parse(rawConfiguration.value);\n });\n };\n\n const getPermittedContentTypes = async () => {\n const readPermissions: Modules.Permissions.PermissionRule[] = await permissionService.findMany({\n where: {\n role: { users: { id: strapi.requestContext.get()?.state?.user.id } },\n action: 'plugin::content-manager.explorer.read',\n },\n });\n\n return readPermissions\n .map((permission) => permission.subject)\n .filter(Boolean) as RecentDocument['contentTypeUid'][];\n };\n\n type ContentTypeMeta = {\n fields: string[];\n mainField: string;\n contentType: Schema.ContentType;\n hasDraftAndPublish: boolean;\n uid: RecentDocument['contentTypeUid'];\n };\n\n const getContentTypesMeta = (\n allowedContentTypeUids: RecentDocument['contentTypeUid'][],\n configurations: ContentTypeConfiguration[]\n ): ContentTypeMeta[] => {\n return allowedContentTypeUids.map((uid) => {\n const configuration = configurations.find((config) => config.uid === uid);\n const contentType = strapi.contentType(uid);\n const fields = ['documentId', 'updatedAt'];\n\n // Add fields required to get the status if D&P is enabled\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);\n if (hasDraftAndPublish) {\n fields.push('publishedAt');\n }\n\n // Only add the main field if it's defined\n if (configuration?.settings.mainField) {\n fields.push(configuration.settings.mainField);\n }\n\n // Only add locale if it's localized\n const isLocalized = (contentType.pluginOptions?.i18n as any)?.localized;\n if (isLocalized) {\n fields.push('locale');\n }\n\n return {\n fields,\n mainField: configuration!.settings.mainField,\n contentType,\n hasDraftAndPublish,\n uid,\n };\n });\n };\n\n const formatDocuments = (\n documents: Modules.Documents.AnyDocument[],\n meta: ContentTypeMeta,\n populate?: string[]\n ) => {\n return documents.map((document) => {\n const additionalFields =\n populate?.reduce(\n (acc, key) => {\n acc[key] = document[key];\n return acc;\n },\n {} as Record<string, any>\n ) || {};\n return {\n documentId: document.documentId,\n locale: document.locale ?? null,\n updatedAt: new Date(document.updatedAt),\n title: document[meta.mainField ?? 'documentId'],\n publishedAt:\n meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,\n contentTypeUid: meta.uid,\n contentTypeDisplayName: meta.contentType.info.displayName,\n kind: meta.contentType.kind,\n ...additionalFields,\n };\n });\n };\n\n const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');\n const getPermissionChecker = (uid: string) =>\n permissionCheckerService.create({\n userAbility: strapi.requestContext.get()?.state.userAbility,\n model: uid,\n });\n\n return {\n async addStatusToDocuments(documents: RecentDocument[]): Promise<RecentDocument[]> {\n return Promise.all(\n documents.map(async (recentDocument) => {\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(\n strapi.contentType(recentDocument.contentTypeUid)\n );\n /**\n * Tries to query the other version of the document if draft and publish is enabled,\n * so that we know when to give the \"modified\" status.\n */\n const { availableStatus } = await metadataService.getMetadata(\n recentDocument.contentTypeUid,\n recentDocument,\n {\n availableStatus: hasDraftAndPublish,\n availableLocales: false,\n }\n );\n const status: RecentDocument['status'] = metadataService.getStatus(\n recentDocument,\n availableStatus\n );\n\n return {\n ...recentDocument,\n status: hasDraftAndPublish ? status : undefined,\n };\n })\n );\n },\n\n async queryLastDocuments(\n additionalQueryParams?: Record<string, unknown>,\n draftAndPublishOnly?: boolean\n ): Promise<RecentDocument[]> {\n const permittedContentTypes = await getPermittedContentTypes();\n const allowedContentTypeUids = draftAndPublishOnly\n ? permittedContentTypes.filter((uid) => {\n return contentTypes.hasDraftAndPublish(strapi.contentType(uid));\n })\n : permittedContentTypes;\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(allowedContentTypeUids);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n\n const recentDocuments = await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n limit: MAX_DOCUMENTS,\n fields: meta.fields,\n ...additionalQueryParams,\n });\n\n const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n const populate = additionalQueryParams?.populate as string[];\n\n return formatDocuments(docs, meta, populate);\n })\n );\n\n return recentDocuments\n .flat()\n .sort((a, b) => {\n switch (additionalQueryParams?.sort) {\n case 'publishedAt:desc':\n if (!a.publishedAt || !b.publishedAt) return 0;\n return b.publishedAt.valueOf() - a.publishedAt.valueOf();\n case 'publishedAt:asc':\n if (!a.publishedAt || !b.publishedAt) return 0;\n return a.publishedAt.valueOf() - b.publishedAt.valueOf();\n case 'updatedAt:desc':\n if (!a.updatedAt || !b.updatedAt) return 0;\n return b.updatedAt.valueOf() - a.updatedAt.valueOf();\n case 'updatedAt:asc':\n if (!a.updatedAt || !b.updatedAt) return 0;\n return a.updatedAt.valueOf() - b.updatedAt.valueOf();\n default:\n return 0;\n }\n })\n .slice(0, MAX_DOCUMENTS);\n },\n\n async getRecentlyPublishedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const recentlyPublishedDocuments = await this.queryLastDocuments(\n {\n sort: 'publishedAt:desc',\n status: 'published',\n },\n true\n );\n\n return this.addStatusToDocuments(recentlyPublishedDocuments);\n },\n\n async getRecentlyUpdatedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const recentlyUpdatedDocuments = await this.queryLastDocuments({\n sort: 'updatedAt:desc',\n });\n\n return this.addStatusToDocuments(recentlyUpdatedDocuments);\n },\n\n async getCountDocuments(): Promise<GetCountDocuments.Response['data']> {\n const permittedContentTypes = await getPermittedContentTypes();\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(permittedContentTypes);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(permittedContentTypes, configurations);\n\n const countDocuments = {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const strapiDBConnection = strapi.db.connection;\n const tableName = strapi.contentType(meta.uid).collectionName;\n if (tableName) {\n const draftDocuments = await strapiDBConnection(tableName)\n .whereNull('published_at')\n .whereIn('document_id', function () {\n this.select('document_id')\n .from(tableName)\n .groupBy('document_id')\n .havingRaw('COUNT(*) = 1');\n })\n .count('* as count')\n .first();\n countDocuments.draft += Number(draftDocuments?.count) || 0;\n\n const publishedDocuments = meta.hasDraftAndPublish\n ? await strapiDBConnection(tableName)\n .countDistinct('draft.document_id as count')\n .from(`${tableName} as draft`)\n .join(`${tableName} as published`, function () {\n this.on('draft.document_id', '=', 'published.document_id')\n .andOn('draft.updated_at', '=', 'published.updated_at')\n .andOnNull('draft.published_at')\n .andOnNotNull('published.published_at');\n })\n .first()\n : await strapiDBConnection(tableName)\n .countDistinct('document_id as count')\n .from(`${tableName}`)\n .first();\n countDocuments.published += Number(publishedDocuments?.count) || 0;\n\n const modifiedDocuments = await strapiDBConnection(tableName)\n .select('draft.document_id')\n .from(`${tableName} as draft`)\n .join(`${tableName} as published`, function () {\n this.on('draft.document_id', '=', 'published.document_id')\n .andOn('draft.updated_at', '!=', 'published.updated_at')\n .andOnNull('draft.published_at')\n .andOnNotNull('published.published_at');\n })\n .countDistinct('draft.document_id as count')\n .groupBy('draft.document_id')\n .first();\n countDocuments.modified += Number(modifiedDocuments?.count) || 0;\n }\n })\n );\n\n return countDocuments;\n },\n };\n};\n\nexport { createHomepageService };\n"],"names":["createHomepageService","strapi","MAX_DOCUMENTS","metadataService","plugin","service","permissionService","admin","services","permission","getConfiguration","contentTypeUids","coreStore","db","query","rawConfigurations","findMany","where","key","$in","map","contentType","rawConfiguration","JSON","parse","value","getPermittedContentTypes","readPermissions","role","users","id","requestContext","get","state","user","action","subject","filter","Boolean","getContentTypesMeta","allowedContentTypeUids","configurations","uid","configuration","find","config","fields","hasDraftAndPublish","contentTypes","push","settings","mainField","isLocalized","pluginOptions","i18n","localized","formatDocuments","documents","meta","populate","document","additionalFields","reduce","acc","documentId","locale","updatedAt","Date","title","publishedAt","contentTypeUid","contentTypeDisplayName","info","displayName","kind","permissionCheckerService","getPermissionChecker","create","userAbility","model","addStatusToDocuments","Promise","all","recentDocument","availableStatus","getMetadata","availableLocales","status","getStatus","undefined","queryLastDocuments","additionalQueryParams","draftAndPublishOnly","permittedContentTypes","contentTypesMeta","recentDocuments","permissionQuery","sanitizedQuery","read","limit","docs","flat","sort","a","b","valueOf","slice","getRecentlyPublishedDocuments","recentlyPublishedDocuments","getRecentlyUpdatedDocuments","recentlyUpdatedDocuments","getCountDocuments","countDocuments","draft","published","modified","strapiDBConnection","connection","tableName","collectionName","draftDocuments","whereNull","whereIn","select","from","groupBy","havingRaw","count","first","Number","publishedDocuments","countDistinct","join","on","andOn","andOnNull","andOnNotNull","modifiedDocuments"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var homepage = require('./homepage.js');
4
+
5
+ const services = {
6
+ homepage: homepage.createHomepageService
7
+ };
8
+
9
+ exports.services = services;
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../server/src/homepage/services/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\n\nimport { createHomepageService } from './homepage';\n\nexport const services = {\n homepage: createHomepageService,\n} satisfies Plugin.LoadedPlugin['services'];\n"],"names":["services","homepage","createHomepageService"],"mappings":";;;;MAIaA,QAAW,GAAA;IACtBC,QAAUC,EAAAA;AACZ;;;;"}
@@ -0,0 +1,8 @@
1
+ import { createHomepageService } from './homepage.mjs';
2
+
3
+ const services = {
4
+ homepage: createHomepageService
5
+ };
6
+
7
+ export { services };
8
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/homepage/services/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\n\nimport { createHomepageService } from './homepage';\n\nexport const services = {\n homepage: createHomepageService,\n} satisfies Plugin.LoadedPlugin['services'];\n"],"names":["services","homepage","createHomepageService"],"mappings":";;MAIaA,QAAW,GAAA;IACtBC,QAAUC,EAAAA;AACZ;;;;"}
@@ -53,6 +53,10 @@ var strapiUtils = require('@strapi/utils');
53
53
  });
54
54
  }
55
55
  },
56
+ isConfigured () {
57
+ const config = strapi1.config.get('admin.preview');
58
+ return config?.enabled === false || config?.config?.handler != null;
59
+ },
56
60
  isEnabled () {
57
61
  const config = strapi1.config.get('admin.preview');
58
62
  if (!config) {
@@ -75,13 +79,13 @@ var strapiUtils = require('@strapi/utils');
75
79
  /**
76
80
  * Utility to get the preview handler from the configuration
77
81
  */ getPreviewHandler () {
78
- const config = strapi1.config.get('admin.preview');
79
82
  const emptyHandler = ()=>{
80
83
  return undefined;
81
84
  };
82
85
  if (!this.isEnabled()) {
83
86
  return emptyHandler;
84
87
  }
88
+ const config = strapi1.config.get('admin.preview');
85
89
  return config?.config?.handler || emptyHandler;
86
90
  }
87
91
  };
@@ -1 +1 @@
1
- {"version":3,"file":"preview-config.js","sources":["../../../../server/src/preview/services/preview-config.ts"],"sourcesContent":["import { mergeWith } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\nimport { errors } from '@strapi/utils';\n\nexport type HandlerParams = {\n documentId: string;\n locale: string;\n status: 'published' | 'draft';\n};\n\nexport interface PreviewConfig {\n enabled: boolean;\n config: {\n // List of CSP allowed origins. This is a shortcut to setting it up inside `config/middlewares.js`\n allowedOrigins: string[];\n handler: (uid: UID.Schema, params: HandlerParams) => string | undefined;\n };\n}\n\n/**\n * Utility to extend Strapi configuration middlewares. Mainly used to extend the CSP directives from the security middleware.\n */\nconst extendMiddlewareConfiguration = (middleware = { name: '', config: {} }) => {\n const middlewares = strapi.config.get('middlewares') as (string | object)[];\n\n const configuredMiddlewares = middlewares.map((currentMiddleware) => {\n if (currentMiddleware === middleware.name) {\n // Use the new config object if the middleware has no config property yet\n return middleware;\n }\n\n // @ts-expect-error - currentMiddleware is not a string\n if (currentMiddleware.name === middleware.name) {\n // Deep merge (+ concat arrays) the new config with the current middleware config\n return mergeWith(\n (objValue, srcValue) => {\n if (Array.isArray(objValue)) {\n return objValue.concat(srcValue);\n }\n\n return undefined;\n },\n currentMiddleware,\n middleware\n );\n }\n\n return currentMiddleware;\n });\n\n strapi.config.set('middlewares', configuredMiddlewares);\n};\n\n/**\n * Read configuration for static preview\n */\nconst createPreviewConfigService = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n register() {\n if (!this.isEnabled()) {\n return;\n }\n\n const config = strapi.config.get('admin.preview') as PreviewConfig;\n\n /**\n * Register the allowed origins for CSP, so the preview URL can be displayed\n */\n if (config.config?.allowedOrigins) {\n extendMiddlewareConfiguration({\n name: 'strapi::security',\n config: {\n contentSecurityPolicy: {\n directives: {\n 'frame-src': config.config.allowedOrigins,\n },\n },\n },\n });\n }\n },\n\n isEnabled() {\n const config = strapi.config.get('admin.preview') as PreviewConfig;\n\n if (!config) {\n return false;\n }\n\n return config?.enabled ?? true;\n },\n\n /**\n * Validate if the configuration is valid\n */\n validate() {\n if (!this.isEnabled()) {\n return;\n }\n\n const handler = this.getPreviewHandler();\n\n // Handler must be a function\n if (typeof handler !== 'function') {\n throw new errors.ValidationError(\n 'Preview configuration is invalid. Handler must be a function'\n );\n }\n },\n\n /**\n * Utility to get the preview handler from the configuration\n */\n getPreviewHandler(): PreviewConfig['config']['handler'] {\n const config = strapi.config.get('admin.preview') as PreviewConfig;\n\n const emptyHandler = () => {\n return undefined;\n };\n\n if (!this.isEnabled()) {\n return emptyHandler;\n }\n\n return config?.config?.handler || emptyHandler;\n },\n };\n};\n\nexport { createPreviewConfigService };\n"],"names":["extendMiddlewareConfiguration","middleware","name","config","middlewares","strapi","get","configuredMiddlewares","map","currentMiddleware","mergeWith","objValue","srcValue","Array","isArray","concat","undefined","set","createPreviewConfigService","register","isEnabled","allowedOrigins","contentSecurityPolicy","directives","enabled","validate","handler","getPreviewHandler","errors","ValidationError","emptyHandler"],"mappings":";;;;;AAoBA;;IAGA,MAAMA,6BAAgC,GAAA,CAACC,UAAa,GAAA;IAAEC,IAAM,EAAA,EAAA;AAAIC,IAAAA,MAAAA,EAAQ;AAAG,CAAC,GAAA;AAC1E,IAAA,MAAMC,WAAcC,GAAAA,MAAAA,CAAOF,MAAM,CAACG,GAAG,CAAC,aAAA,CAAA;AAEtC,IAAA,MAAMC,qBAAwBH,GAAAA,WAAAA,CAAYI,GAAG,CAAC,CAACC,iBAAAA,GAAAA;QAC7C,IAAIA,iBAAAA,KAAsBR,UAAWC,CAAAA,IAAI,EAAE;;YAEzC,OAAOD,UAAAA;AACT;;AAGA,QAAA,IAAIQ,iBAAkBP,CAAAA,IAAI,KAAKD,UAAAA,CAAWC,IAAI,EAAE;;YAE9C,OAAOQ,YAAAA,CACL,CAACC,QAAUC,EAAAA,QAAAA,GAAAA;gBACT,IAAIC,KAAAA,CAAMC,OAAO,CAACH,QAAW,CAAA,EAAA;oBAC3B,OAAOA,QAAAA,CAASI,MAAM,CAACH,QAAAA,CAAAA;AACzB;gBAEA,OAAOI,SAAAA;AACT,aAAA,EACAP,iBACAR,EAAAA,UAAAA,CAAAA;AAEJ;QAEA,OAAOQ,iBAAAA;AACT,KAAA,CAAA;AAEAJ,IAAAA,MAAAA,CAAOF,MAAM,CAACc,GAAG,CAAC,aAAeV,EAAAA,qBAAAA,CAAAA;AACnC,CAAA;AAEA;;AAEC,UACKW,0BAA6B,GAAA,CAAC,EAAEb,MAAAA,EAAAA,OAAM,EAA2B,GAAA;IACrE,OAAO;AACLc,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAAC,IAAI,CAACC,SAAS,EAAI,EAAA;AACrB,gBAAA;AACF;AAEA,YAAA,MAAMjB,MAASE,GAAAA,OAAAA,CAAOF,MAAM,CAACG,GAAG,CAAC,eAAA,CAAA;AAEjC;;AAEC,UACD,IAAIH,MAAAA,CAAOA,MAAM,EAAEkB,cAAgB,EAAA;gBACjCrB,6BAA8B,CAAA;oBAC5BE,IAAM,EAAA,kBAAA;oBACNC,MAAQ,EAAA;wBACNmB,qBAAuB,EAAA;4BACrBC,UAAY,EAAA;gCACV,WAAapB,EAAAA,MAAAA,CAAOA,MAAM,CAACkB;AAC7B;AACF;AACF;AACF,iBAAA,CAAA;AACF;AACF,SAAA;AAEAD,QAAAA,SAAAA,CAAAA,GAAAA;AACE,YAAA,MAAMjB,MAASE,GAAAA,OAAAA,CAAOF,MAAM,CAACG,GAAG,CAAC,eAAA,CAAA;AAEjC,YAAA,IAAI,CAACH,MAAQ,EAAA;gBACX,OAAO,KAAA;AACT;AAEA,YAAA,OAAOA,QAAQqB,OAAW,IAAA,IAAA;AAC5B,SAAA;AAEA;;QAGAC,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAAC,IAAI,CAACL,SAAS,EAAI,EAAA;AACrB,gBAAA;AACF;YAEA,MAAMM,OAAAA,GAAU,IAAI,CAACC,iBAAiB,EAAA;;YAGtC,IAAI,OAAOD,YAAY,UAAY,EAAA;gBACjC,MAAM,IAAIE,kBAAOC,CAAAA,eAAe,CAC9B,8DAAA,CAAA;AAEJ;AACF,SAAA;AAEA;;QAGAF,iBAAAA,CAAAA,GAAAA;AACE,YAAA,MAAMxB,MAASE,GAAAA,OAAAA,CAAOF,MAAM,CAACG,GAAG,CAAC,eAAA,CAAA;AAEjC,YAAA,MAAMwB,YAAe,GAAA,IAAA;gBACnB,OAAOd,SAAAA;AACT,aAAA;AAEA,YAAA,IAAI,CAAC,IAAI,CAACI,SAAS,EAAI,EAAA;gBACrB,OAAOU,YAAAA;AACT;YAEA,OAAO3B,MAAAA,EAAQA,QAAQuB,OAAWI,IAAAA,YAAAA;AACpC;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"preview-config.js","sources":["../../../../server/src/preview/services/preview-config.ts"],"sourcesContent":["import { mergeWith } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\nimport { errors } from '@strapi/utils';\n\nexport type HandlerParams = {\n documentId: string;\n locale: string;\n status: 'published' | 'draft';\n};\n\nexport interface PreviewConfig {\n enabled: boolean;\n config: {\n // List of CSP allowed origins. This is a shortcut to setting it up inside `config/middlewares.js`\n allowedOrigins: string[];\n handler: (uid: UID.Schema, params: HandlerParams) => string | undefined;\n };\n}\n\n/**\n * Utility to extend Strapi configuration middlewares. Mainly used to extend the CSP directives from the security middleware.\n */\nconst extendMiddlewareConfiguration = (middleware = { name: '', config: {} }) => {\n const middlewares = strapi.config.get('middlewares') as (string | object)[];\n\n const configuredMiddlewares = middlewares.map((currentMiddleware) => {\n if (currentMiddleware === middleware.name) {\n // Use the new config object if the middleware has no config property yet\n return middleware;\n }\n\n // @ts-expect-error - currentMiddleware is not a string\n if (currentMiddleware.name === middleware.name) {\n // Deep merge (+ concat arrays) the new config with the current middleware config\n return mergeWith(\n (objValue, srcValue) => {\n if (Array.isArray(objValue)) {\n return objValue.concat(srcValue);\n }\n\n return undefined;\n },\n currentMiddleware,\n middleware\n );\n }\n\n return currentMiddleware;\n });\n\n strapi.config.set('middlewares', configuredMiddlewares);\n};\n\n/**\n * Read configuration for static preview\n */\nconst createPreviewConfigService = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n register() {\n if (!this.isEnabled()) {\n return;\n }\n\n const config = strapi.config.get('admin.preview') as PreviewConfig;\n\n /**\n * Register the allowed origins for CSP, so the preview URL can be displayed\n */\n if (config.config?.allowedOrigins) {\n extendMiddlewareConfiguration({\n name: 'strapi::security',\n config: {\n contentSecurityPolicy: {\n directives: {\n 'frame-src': config.config.allowedOrigins,\n },\n },\n },\n });\n }\n },\n\n isConfigured() {\n const config = strapi.config.get('admin.preview') as PreviewConfig;\n return config?.enabled === false || config?.config?.handler != null;\n },\n\n isEnabled() {\n const config = strapi.config.get('admin.preview') as PreviewConfig;\n\n if (!config) {\n return false;\n }\n\n return config?.enabled ?? true;\n },\n\n /**\n * Validate if the configuration is valid\n */\n validate() {\n if (!this.isEnabled()) {\n return;\n }\n\n const handler = this.getPreviewHandler();\n\n // Handler must be a function\n if (typeof handler !== 'function') {\n throw new errors.ValidationError(\n 'Preview configuration is invalid. Handler must be a function'\n );\n }\n },\n\n /**\n * Utility to get the preview handler from the configuration\n */\n getPreviewHandler(): PreviewConfig['config']['handler'] {\n const emptyHandler = () => {\n return undefined;\n };\n\n if (!this.isEnabled()) {\n return emptyHandler;\n }\n\n const config = strapi.config.get('admin.preview') as PreviewConfig;\n\n return config?.config?.handler || emptyHandler;\n },\n };\n};\n\nexport { createPreviewConfigService };\n"],"names":["extendMiddlewareConfiguration","middleware","name","config","middlewares","strapi","get","configuredMiddlewares","map","currentMiddleware","mergeWith","objValue","srcValue","Array","isArray","concat","undefined","set","createPreviewConfigService","register","isEnabled","allowedOrigins","contentSecurityPolicy","directives","isConfigured","enabled","handler","validate","getPreviewHandler","errors","ValidationError","emptyHandler"],"mappings":"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"}
@@ -51,6 +51,10 @@ import { errors } from '@strapi/utils';
51
51
  });
52
52
  }
53
53
  },
54
+ isConfigured () {
55
+ const config = strapi1.config.get('admin.preview');
56
+ return config?.enabled === false || config?.config?.handler != null;
57
+ },
54
58
  isEnabled () {
55
59
  const config = strapi1.config.get('admin.preview');
56
60
  if (!config) {
@@ -73,13 +77,13 @@ import { errors } from '@strapi/utils';
73
77
  /**
74
78
  * Utility to get the preview handler from the configuration
75
79
  */ getPreviewHandler () {
76
- const config = strapi1.config.get('admin.preview');
77
80
  const emptyHandler = ()=>{
78
81
  return undefined;
79
82
  };
80
83
  if (!this.isEnabled()) {
81
84
  return emptyHandler;
82
85
  }
86
+ const config = strapi1.config.get('admin.preview');
83
87
  return config?.config?.handler || emptyHandler;
84
88
  }
85
89
  };