@strapi/content-manager 5.37.1 → 5.38.1

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 (582) hide show
  1. package/dist/admin/components/ActionsDrawer.js.map +1 -1
  2. package/dist/admin/components/ActionsDrawer.mjs.map +1 -1
  3. package/dist/admin/components/ComponentIcon.js.map +1 -1
  4. package/dist/admin/components/ComponentIcon.mjs.map +1 -1
  5. package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
  6. package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs.map +1 -1
  7. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  8. package/dist/admin/components/ConfigurationForm/Fields.mjs +2 -2
  9. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  10. package/dist/admin/components/ConfigurationForm/Form.js +62 -30
  11. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  12. package/dist/admin/components/ConfigurationForm/Form.mjs +62 -30
  13. package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
  14. package/dist/admin/components/DragLayer.js.map +1 -1
  15. package/dist/admin/components/DragLayer.mjs.map +1 -1
  16. package/dist/admin/components/DragPreviews/CardDragPreview.js.map +1 -1
  17. package/dist/admin/components/DragPreviews/CardDragPreview.mjs.map +1 -1
  18. package/dist/admin/components/DragPreviews/ComponentDragPreview.js.map +1 -1
  19. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs.map +1 -1
  20. package/dist/admin/components/DragPreviews/RelationDragPreview.js.map +1 -1
  21. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs.map +1 -1
  22. package/dist/admin/components/FieldTypeIcon.js.map +1 -1
  23. package/dist/admin/components/FieldTypeIcon.mjs +1 -1
  24. package/dist/admin/components/FieldTypeIcon.mjs.map +1 -1
  25. package/dist/admin/components/InjectionZone.js.map +1 -1
  26. package/dist/admin/components/InjectionZone.mjs.map +1 -1
  27. package/dist/admin/components/LeftMenu.js.map +1 -1
  28. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  29. package/dist/admin/components/RelativeTime.js.map +1 -1
  30. package/dist/admin/components/RelativeTime.mjs.map +1 -1
  31. package/dist/admin/components/Widgets.js.map +1 -1
  32. package/dist/admin/components/Widgets.mjs +1 -1
  33. package/dist/admin/components/Widgets.mjs.map +1 -1
  34. package/dist/admin/constants/attributes.js.map +1 -1
  35. package/dist/admin/constants/attributes.mjs.map +1 -1
  36. package/dist/admin/constants/collections.js.map +1 -1
  37. package/dist/admin/constants/collections.mjs.map +1 -1
  38. package/dist/admin/constants/dragAndDrop.js.map +1 -1
  39. package/dist/admin/constants/dragAndDrop.mjs.map +1 -1
  40. package/dist/admin/constants/hooks.js.map +1 -1
  41. package/dist/admin/constants/hooks.mjs.map +1 -1
  42. package/dist/admin/constants/plugin.js.map +1 -1
  43. package/dist/admin/constants/plugin.mjs.map +1 -1
  44. package/dist/admin/content-manager.js.map +1 -1
  45. package/dist/admin/content-manager.mjs.map +1 -1
  46. package/dist/admin/features/DocumentRBAC.js.map +1 -1
  47. package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
  48. package/dist/admin/history/components/HistoryAction.js.map +1 -1
  49. package/dist/admin/history/components/HistoryAction.mjs.map +1 -1
  50. package/dist/admin/history/components/VersionContent.js +48 -16
  51. package/dist/admin/history/components/VersionContent.js.map +1 -1
  52. package/dist/admin/history/components/VersionContent.mjs +48 -16
  53. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  54. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  55. package/dist/admin/history/components/VersionHeader.mjs +1 -1
  56. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  57. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  58. package/dist/admin/history/components/VersionInputRenderer.mjs +1 -1
  59. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  60. package/dist/admin/history/components/VersionsList.js.map +1 -1
  61. package/dist/admin/history/components/VersionsList.mjs.map +1 -1
  62. package/dist/admin/history/index.js.map +1 -1
  63. package/dist/admin/history/index.mjs.map +1 -1
  64. package/dist/admin/history/pages/History.js.map +1 -1
  65. package/dist/admin/history/pages/History.mjs +1 -1
  66. package/dist/admin/history/pages/History.mjs.map +1 -1
  67. package/dist/admin/history/routes.js.map +1 -1
  68. package/dist/admin/history/routes.mjs.map +1 -1
  69. package/dist/admin/history/services/historyVersion.js.map +1 -1
  70. package/dist/admin/history/services/historyVersion.mjs.map +1 -1
  71. package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
  72. package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
  73. package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
  74. package/dist/admin/hooks/useContentTypeSchema.mjs.map +1 -1
  75. package/dist/admin/hooks/useDebounce.js.map +1 -1
  76. package/dist/admin/hooks/useDebounce.mjs.map +1 -1
  77. package/dist/admin/hooks/useDocument.js.map +1 -1
  78. package/dist/admin/hooks/useDocument.mjs +1 -1
  79. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  80. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  81. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  82. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  83. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
  84. package/dist/admin/hooks/useDocumentLayout.js +2 -1
  85. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  86. package/dist/admin/hooks/useDocumentLayout.mjs +2 -1
  87. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  88. package/dist/admin/hooks/useDragAndDrop.js +1 -3
  89. package/dist/admin/hooks/useDragAndDrop.js.map +1 -1
  90. package/dist/admin/hooks/useDragAndDrop.mjs +1 -3
  91. package/dist/admin/hooks/useDragAndDrop.mjs.map +1 -1
  92. package/dist/admin/hooks/useKeyboardDragAndDrop.js.map +1 -1
  93. package/dist/admin/hooks/useKeyboardDragAndDrop.mjs.map +1 -1
  94. package/dist/admin/hooks/useLazyComponents.js.map +1 -1
  95. package/dist/admin/hooks/useLazyComponents.mjs.map +1 -1
  96. package/dist/admin/hooks/useOnce.js.map +1 -1
  97. package/dist/admin/hooks/useOnce.mjs.map +1 -1
  98. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  99. package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
  100. package/dist/admin/hooks/usePrev.js.map +1 -1
  101. package/dist/admin/hooks/usePrev.mjs.map +1 -1
  102. package/dist/admin/index.js.map +1 -1
  103. package/dist/admin/index.mjs.map +1 -1
  104. package/dist/admin/layout.js.map +1 -1
  105. package/dist/admin/layout.mjs.map +1 -1
  106. package/dist/admin/modules/app.js.map +1 -1
  107. package/dist/admin/modules/app.mjs.map +1 -1
  108. package/dist/admin/modules/hooks.js.map +1 -1
  109. package/dist/admin/modules/hooks.mjs +1 -1
  110. package/dist/admin/modules/hooks.mjs.map +1 -1
  111. package/dist/admin/modules/reducers.js.map +1 -1
  112. package/dist/admin/modules/reducers.mjs.map +1 -1
  113. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
  114. package/dist/admin/pages/ComponentConfigurationPage.mjs +1 -1
  115. package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
  116. package/dist/admin/pages/EditConfigurationPage.js.map +1 -1
  117. package/dist/admin/pages/EditConfigurationPage.mjs +1 -1
  118. package/dist/admin/pages/EditConfigurationPage.mjs.map +1 -1
  119. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  120. package/dist/admin/pages/EditView/EditViewPage.mjs +4 -4
  121. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  122. package/dist/admin/pages/EditView/components/Blocker.js.map +1 -1
  123. package/dist/admin/pages/EditView/components/Blocker.mjs.map +1 -1
  124. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  125. package/dist/admin/pages/EditView/components/DocumentActions.mjs +4 -4
  126. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  127. package/dist/admin/pages/EditView/components/DocumentStatus.js.map +1 -1
  128. package/dist/admin/pages/EditView/components/DocumentStatus.mjs.map +1 -1
  129. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js.map +1 -1
  130. package/dist/admin/pages/EditView/components/EditorToolbarObserver.mjs.map +1 -1
  131. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
  132. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs +1 -1
  133. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs.map +1 -1
  134. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.js.map +1 -1
  135. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.mjs +1 -1
  136. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.mjs.map +1 -1
  137. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
  138. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs +1 -1
  139. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs.map +1 -1
  140. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
  141. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs.map +1 -1
  142. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js +51 -0
  143. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js.map +1 -1
  144. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs +53 -2
  145. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs.map +1 -1
  146. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Paragraph.js.map +1 -1
  147. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Paragraph.mjs.map +1 -1
  148. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.js.map +1 -1
  149. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.mjs.map +1 -1
  150. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +6 -2
  151. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  152. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +6 -2
  153. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  154. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  155. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  156. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -1
  157. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.mjs.map +1 -1
  158. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  159. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +1 -1
  160. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  161. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  162. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +1 -1
  163. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  164. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Modifiers.js.map +1 -1
  165. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Modifiers.mjs +2 -2
  166. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Modifiers.mjs.map +1 -1
  167. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js.map +1 -1
  168. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs.map +1 -1
  169. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/constants.js.map +1 -1
  170. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/constants.mjs.map +1 -1
  171. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.js.map +1 -1
  172. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.mjs.map +1 -1
  173. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/enterKey.js.map +1 -1
  174. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/enterKey.mjs.map +1 -1
  175. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/types.js.map +1 -1
  176. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/types.mjs.map +1 -1
  177. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
  178. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
  179. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  180. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  181. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  182. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  183. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  184. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  185. package/dist/admin/pages/EditView/components/FormInputs/ComponentContext.js.map +1 -1
  186. package/dist/admin/pages/EditView/components/FormInputs/ComponentContext.mjs.map +1 -1
  187. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.js.map +1 -1
  188. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.mjs.map +1 -1
  189. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  190. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  191. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
  192. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
  193. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +1 -1
  194. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  195. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +1 -1
  196. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  197. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicZoneLabel.js.map +1 -1
  198. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicZoneLabel.mjs.map +1 -1
  199. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  200. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  201. package/dist/admin/pages/EditView/components/FormInputs/NotAllowed.js.map +1 -1
  202. package/dist/admin/pages/EditView/components/FormInputs/NotAllowed.mjs.map +1 -1
  203. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +45 -6
  204. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  205. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +45 -8
  206. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  207. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +148 -111
  208. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  209. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +152 -115
  210. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  211. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  212. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  213. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  214. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  215. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  216. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  217. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js.map +1 -1
  218. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.mjs.map +1 -1
  219. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
  220. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs.map +1 -1
  221. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.js.map +1 -1
  222. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.mjs.map +1 -1
  223. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
  224. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +2 -2
  225. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
  226. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.js.map +1 -1
  227. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.mjs.map +1 -1
  228. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js.map +1 -1
  229. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.mjs.map +1 -1
  230. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js.map +1 -1
  231. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.mjs.map +1 -1
  232. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.js +8 -6
  233. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.js.map +1 -1
  234. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.mjs +8 -6
  235. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.mjs.map +1 -1
  236. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  237. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  238. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  239. package/dist/admin/pages/EditView/components/Header.mjs +2 -2
  240. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
  241. package/dist/admin/pages/EditView/components/InputRenderer.js +15 -5
  242. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  243. package/dist/admin/pages/EditView/components/InputRenderer.mjs +15 -5
  244. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  245. package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
  246. package/dist/admin/pages/EditView/components/Panels.mjs.map +1 -1
  247. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  248. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  249. package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
  250. package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
  251. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  252. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +1 -1
  253. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  254. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  255. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +1 -1
  256. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
  257. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  258. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +1 -1
  259. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
  260. package/dist/admin/pages/ListConfiguration/components/Header.js.map +1 -1
  261. package/dist/admin/pages/ListConfiguration/components/Header.mjs.map +1 -1
  262. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  263. package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
  264. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  265. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
  266. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  267. package/dist/admin/pages/ListView/ListViewPage.mjs +3 -3
  268. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  269. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js.map +1 -1
  270. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs.map +1 -1
  271. package/dist/admin/pages/ListView/components/BulkActions/Actions.js.map +1 -1
  272. package/dist/admin/pages/ListView/components/BulkActions/Actions.mjs.map +1 -1
  273. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +1 -4
  274. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  275. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +2 -5
  276. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  277. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +4 -4
  278. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  279. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +2 -2
  280. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  281. package/dist/admin/pages/ListView/components/Filters.js +54 -1
  282. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  283. package/dist/admin/pages/ListView/components/Filters.mjs +54 -1
  284. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  285. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  286. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  287. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  288. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs.map +1 -1
  289. package/dist/admin/pages/ListView/components/TableCells/CellValue.js +7 -1
  290. package/dist/admin/pages/ListView/components/TableCells/CellValue.js.map +1 -1
  291. package/dist/admin/pages/ListView/components/TableCells/CellValue.mjs +7 -1
  292. package/dist/admin/pages/ListView/components/TableCells/CellValue.mjs.map +1 -1
  293. package/dist/admin/pages/ListView/components/TableCells/Components.js.map +1 -1
  294. package/dist/admin/pages/ListView/components/TableCells/Components.mjs +2 -2
  295. package/dist/admin/pages/ListView/components/TableCells/Components.mjs.map +1 -1
  296. package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -1
  297. package/dist/admin/pages/ListView/components/TableCells/Media.mjs +1 -1
  298. package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -1
  299. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  300. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
  301. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js.map +1 -1
  302. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs.map +1 -1
  303. package/dist/admin/pages/NoContentTypePage.js.map +1 -1
  304. package/dist/admin/pages/NoContentTypePage.mjs.map +1 -1
  305. package/dist/admin/pages/NoPermissionsPage.js.map +1 -1
  306. package/dist/admin/pages/NoPermissionsPage.mjs.map +1 -1
  307. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  308. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  309. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  310. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  311. package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
  312. package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
  313. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  314. package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -1
  315. package/dist/admin/preview/index.js.map +1 -1
  316. package/dist/admin/preview/index.mjs.map +1 -1
  317. package/dist/admin/preview/pages/Preview.js.map +1 -1
  318. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  319. package/dist/admin/preview/routes.js.map +1 -1
  320. package/dist/admin/preview/routes.mjs.map +1 -1
  321. package/dist/admin/preview/services/preview.js.map +1 -1
  322. package/dist/admin/preview/services/preview.mjs.map +1 -1
  323. package/dist/admin/preview/utils/constants.js +0 -1
  324. package/dist/admin/preview/utils/constants.js.map +1 -1
  325. package/dist/admin/preview/utils/constants.mjs +0 -1
  326. package/dist/admin/preview/utils/constants.mjs.map +1 -1
  327. package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
  328. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
  329. package/dist/admin/preview/utils/getSendMessage.js.map +1 -1
  330. package/dist/admin/preview/utils/getSendMessage.mjs.map +1 -1
  331. package/dist/admin/preview/utils/previewScript.js.map +1 -1
  332. package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
  333. package/dist/admin/router.js.map +1 -1
  334. package/dist/admin/router.mjs.map +1 -1
  335. package/dist/admin/services/api.js.map +1 -1
  336. package/dist/admin/services/api.mjs.map +1 -1
  337. package/dist/admin/services/components.js.map +1 -1
  338. package/dist/admin/services/components.mjs.map +1 -1
  339. package/dist/admin/services/contentTypes.js.map +1 -1
  340. package/dist/admin/services/contentTypes.mjs.map +1 -1
  341. package/dist/admin/services/documents.js.map +1 -1
  342. package/dist/admin/services/documents.mjs.map +1 -1
  343. package/dist/admin/services/homepage.js.map +1 -1
  344. package/dist/admin/services/homepage.mjs.map +1 -1
  345. package/dist/admin/services/init.js.map +1 -1
  346. package/dist/admin/services/init.mjs.map +1 -1
  347. package/dist/admin/services/relations.js.map +1 -1
  348. package/dist/admin/services/relations.mjs.map +1 -1
  349. package/dist/admin/services/uid.js.map +1 -1
  350. package/dist/admin/services/uid.mjs.map +1 -1
  351. package/dist/admin/src/exports.d.ts +1 -1
  352. package/dist/admin/src/hooks/useDocumentLayout.d.ts +1 -0
  353. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +1 -0
  354. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +7 -2
  355. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +1 -1
  356. package/dist/admin/src/utils/conditionalFields.d.ts +12 -0
  357. package/dist/admin/translations/en.json.js +10 -0
  358. package/dist/admin/translations/en.json.js.map +1 -1
  359. package/dist/admin/translations/en.json.mjs +10 -0
  360. package/dist/admin/translations/en.json.mjs.map +1 -1
  361. package/dist/admin/translations/es.json.js +136 -2
  362. package/dist/admin/translations/es.json.js.map +1 -1
  363. package/dist/admin/translations/es.json.mjs +136 -2
  364. package/dist/admin/translations/es.json.mjs.map +1 -1
  365. package/dist/admin/translations/fr.json.js +72 -1
  366. package/dist/admin/translations/fr.json.js.map +1 -1
  367. package/dist/admin/translations/fr.json.mjs +72 -1
  368. package/dist/admin/translations/fr.json.mjs.map +1 -1
  369. package/dist/admin/utils/api.js.map +1 -1
  370. package/dist/admin/utils/api.mjs.map +1 -1
  371. package/dist/admin/utils/attributes.js.map +1 -1
  372. package/dist/admin/utils/attributes.mjs.map +1 -1
  373. package/dist/admin/utils/conditionalFields.js +76 -0
  374. package/dist/admin/utils/conditionalFields.js.map +1 -0
  375. package/dist/admin/utils/conditionalFields.mjs +69 -0
  376. package/dist/admin/utils/conditionalFields.mjs.map +1 -0
  377. package/dist/admin/utils/objects.js.map +1 -1
  378. package/dist/admin/utils/objects.mjs.map +1 -1
  379. package/dist/admin/utils/relations.js.map +1 -1
  380. package/dist/admin/utils/relations.mjs.map +1 -1
  381. package/dist/admin/utils/strings.js.map +1 -1
  382. package/dist/admin/utils/strings.mjs.map +1 -1
  383. package/dist/admin/utils/translations.js.map +1 -1
  384. package/dist/admin/utils/translations.mjs.map +1 -1
  385. package/dist/admin/utils/urls.js.map +1 -1
  386. package/dist/admin/utils/urls.mjs.map +1 -1
  387. package/dist/admin/utils/users.js.map +1 -1
  388. package/dist/admin/utils/users.mjs.map +1 -1
  389. package/dist/admin/utils/validation.js.map +1 -1
  390. package/dist/admin/utils/validation.mjs.map +1 -1
  391. package/dist/server/bootstrap.js.map +1 -1
  392. package/dist/server/bootstrap.mjs.map +1 -1
  393. package/dist/server/constants/index.js.map +1 -1
  394. package/dist/server/constants/index.mjs.map +1 -1
  395. package/dist/server/controllers/collection-types.js +157 -4
  396. package/dist/server/controllers/collection-types.js.map +1 -1
  397. package/dist/server/controllers/collection-types.mjs +159 -6
  398. package/dist/server/controllers/collection-types.mjs.map +1 -1
  399. package/dist/server/controllers/components.js.map +1 -1
  400. package/dist/server/controllers/components.mjs.map +1 -1
  401. package/dist/server/controllers/content-types.js +10 -10
  402. package/dist/server/controllers/content-types.js.map +1 -1
  403. package/dist/server/controllers/content-types.mjs.map +1 -1
  404. package/dist/server/controllers/index.js +4 -4
  405. package/dist/server/controllers/index.js.map +1 -1
  406. package/dist/server/controllers/index.mjs.map +1 -1
  407. package/dist/server/controllers/init.js.map +1 -1
  408. package/dist/server/controllers/init.mjs.map +1 -1
  409. package/dist/server/controllers/relations.js.map +1 -1
  410. package/dist/server/controllers/relations.mjs +3 -3
  411. package/dist/server/controllers/relations.mjs.map +1 -1
  412. package/dist/server/controllers/single-types.js +19 -4
  413. package/dist/server/controllers/single-types.js.map +1 -1
  414. package/dist/server/controllers/single-types.mjs +20 -5
  415. package/dist/server/controllers/single-types.mjs.map +1 -1
  416. package/dist/server/controllers/uid.js.map +1 -1
  417. package/dist/server/controllers/uid.mjs +1 -1
  418. package/dist/server/controllers/uid.mjs.map +1 -1
  419. package/dist/server/controllers/utils/clone.js.map +1 -1
  420. package/dist/server/controllers/utils/clone.mjs.map +1 -1
  421. package/dist/server/controllers/utils/document-status.js.map +1 -1
  422. package/dist/server/controllers/utils/document-status.mjs.map +1 -1
  423. package/dist/server/controllers/utils/metadata.js.map +1 -1
  424. package/dist/server/controllers/utils/metadata.mjs.map +1 -1
  425. package/dist/server/controllers/validation/dimensions.js.map +1 -1
  426. package/dist/server/controllers/validation/dimensions.mjs.map +1 -1
  427. package/dist/server/controllers/validation/index.js.map +1 -1
  428. package/dist/server/controllers/validation/index.mjs +1 -1
  429. package/dist/server/controllers/validation/index.mjs.map +1 -1
  430. package/dist/server/controllers/validation/model-configuration.js +6 -1
  431. package/dist/server/controllers/validation/model-configuration.js.map +1 -1
  432. package/dist/server/controllers/validation/model-configuration.mjs +6 -1
  433. package/dist/server/controllers/validation/model-configuration.mjs.map +1 -1
  434. package/dist/server/controllers/validation/relations.js.map +1 -1
  435. package/dist/server/controllers/validation/relations.mjs.map +1 -1
  436. package/dist/server/destroy.js.map +1 -1
  437. package/dist/server/destroy.mjs.map +1 -1
  438. package/dist/server/history/constants.js.map +1 -1
  439. package/dist/server/history/constants.mjs.map +1 -1
  440. package/dist/server/history/controllers/history-version.js.map +1 -1
  441. package/dist/server/history/controllers/history-version.mjs.map +1 -1
  442. package/dist/server/history/controllers/index.js.map +1 -1
  443. package/dist/server/history/controllers/index.mjs.map +1 -1
  444. package/dist/server/history/controllers/validation/history-version.js.map +1 -1
  445. package/dist/server/history/controllers/validation/history-version.mjs.map +1 -1
  446. package/dist/server/history/index.js +4 -4
  447. package/dist/server/history/index.js.map +1 -1
  448. package/dist/server/history/index.mjs.map +1 -1
  449. package/dist/server/history/models/history-version.js.map +1 -1
  450. package/dist/server/history/models/history-version.mjs.map +1 -1
  451. package/dist/server/history/routes/history-version.js.map +1 -1
  452. package/dist/server/history/routes/history-version.mjs.map +1 -1
  453. package/dist/server/history/routes/index.js.map +1 -1
  454. package/dist/server/history/routes/index.mjs.map +1 -1
  455. package/dist/server/history/services/history.js.map +1 -1
  456. package/dist/server/history/services/history.mjs.map +1 -1
  457. package/dist/server/history/services/index.js.map +1 -1
  458. package/dist/server/history/services/index.mjs.map +1 -1
  459. package/dist/server/history/services/lifecycles.js.map +1 -1
  460. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  461. package/dist/server/history/services/utils.js.map +1 -1
  462. package/dist/server/history/services/utils.mjs.map +1 -1
  463. package/dist/server/history/utils.js.map +1 -1
  464. package/dist/server/history/utils.mjs.map +1 -1
  465. package/dist/server/homepage/controllers/homepage.js.map +1 -1
  466. package/dist/server/homepage/controllers/homepage.mjs.map +1 -1
  467. package/dist/server/homepage/controllers/index.js.map +1 -1
  468. package/dist/server/homepage/controllers/index.mjs.map +1 -1
  469. package/dist/server/homepage/index.js +6 -6
  470. package/dist/server/homepage/index.js.map +1 -1
  471. package/dist/server/homepage/index.mjs.map +1 -1
  472. package/dist/server/homepage/routes/homepage.js.map +1 -1
  473. package/dist/server/homepage/routes/homepage.mjs.map +1 -1
  474. package/dist/server/homepage/routes/index.js.map +1 -1
  475. package/dist/server/homepage/routes/index.mjs.map +1 -1
  476. package/dist/server/homepage/services/homepage.js.map +1 -1
  477. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  478. package/dist/server/homepage/services/index.js.map +1 -1
  479. package/dist/server/homepage/services/index.mjs.map +1 -1
  480. package/dist/server/index.js +8 -8
  481. package/dist/server/middlewares/routing.js.map +1 -1
  482. package/dist/server/middlewares/routing.mjs.map +1 -1
  483. package/dist/server/policies/hasPermissions.js.map +1 -1
  484. package/dist/server/policies/hasPermissions.mjs.map +1 -1
  485. package/dist/server/policies/index.js.map +1 -1
  486. package/dist/server/policies/index.mjs.map +1 -1
  487. package/dist/server/preview/controllers/index.js.map +1 -1
  488. package/dist/server/preview/controllers/index.mjs.map +1 -1
  489. package/dist/server/preview/controllers/preview.js.map +1 -1
  490. package/dist/server/preview/controllers/preview.mjs.map +1 -1
  491. package/dist/server/preview/controllers/validation/preview.js.map +1 -1
  492. package/dist/server/preview/controllers/validation/preview.mjs.map +1 -1
  493. package/dist/server/preview/index.js +4 -4
  494. package/dist/server/preview/index.js.map +1 -1
  495. package/dist/server/preview/index.mjs.map +1 -1
  496. package/dist/server/preview/routes/index.js.map +1 -1
  497. package/dist/server/preview/routes/index.mjs.map +1 -1
  498. package/dist/server/preview/routes/preview.js.map +1 -1
  499. package/dist/server/preview/routes/preview.mjs.map +1 -1
  500. package/dist/server/preview/services/index.js.map +1 -1
  501. package/dist/server/preview/services/index.mjs.map +1 -1
  502. package/dist/server/preview/services/preview-config.js.map +1 -1
  503. package/dist/server/preview/services/preview-config.mjs +1 -1
  504. package/dist/server/preview/services/preview-config.mjs.map +1 -1
  505. package/dist/server/preview/services/preview.js +2 -1
  506. package/dist/server/preview/services/preview.js.map +1 -1
  507. package/dist/server/preview/services/preview.mjs +2 -1
  508. package/dist/server/preview/services/preview.mjs.map +1 -1
  509. package/dist/server/preview/utils.js.map +1 -1
  510. package/dist/server/preview/utils.mjs.map +1 -1
  511. package/dist/server/register.js.map +1 -1
  512. package/dist/server/register.mjs.map +1 -1
  513. package/dist/server/routes/admin.js.map +1 -1
  514. package/dist/server/routes/admin.mjs.map +1 -1
  515. package/dist/server/routes/index.js +4 -4
  516. package/dist/server/routes/index.js.map +1 -1
  517. package/dist/server/routes/index.mjs.map +1 -1
  518. package/dist/server/services/components.js.map +1 -1
  519. package/dist/server/services/components.mjs.map +1 -1
  520. package/dist/server/services/configuration.js.map +1 -1
  521. package/dist/server/services/configuration.mjs.map +1 -1
  522. package/dist/server/services/content-types.js.map +1 -1
  523. package/dist/server/services/content-types.mjs.map +1 -1
  524. package/dist/server/services/data-mapper.js.map +1 -1
  525. package/dist/server/services/data-mapper.mjs.map +1 -1
  526. package/dist/server/services/document-manager.js.map +1 -1
  527. package/dist/server/services/document-manager.mjs +2 -2
  528. package/dist/server/services/document-manager.mjs.map +1 -1
  529. package/dist/server/services/document-metadata.js.map +1 -1
  530. package/dist/server/services/document-metadata.mjs +2 -2
  531. package/dist/server/services/document-metadata.mjs.map +1 -1
  532. package/dist/server/services/field-sizes.js.map +1 -1
  533. package/dist/server/services/field-sizes.mjs.map +1 -1
  534. package/dist/server/services/index.js +4 -4
  535. package/dist/server/services/index.js.map +1 -1
  536. package/dist/server/services/index.mjs.map +1 -1
  537. package/dist/server/services/metrics.js.map +1 -1
  538. package/dist/server/services/metrics.mjs.map +1 -1
  539. package/dist/server/services/permission-checker.js.map +1 -1
  540. package/dist/server/services/permission-checker.mjs.map +1 -1
  541. package/dist/server/services/permission.js.map +1 -1
  542. package/dist/server/services/permission.mjs.map +1 -1
  543. package/dist/server/services/populate-builder.js.map +1 -1
  544. package/dist/server/services/populate-builder.mjs +4 -4
  545. package/dist/server/services/populate-builder.mjs.map +1 -1
  546. package/dist/server/services/uid.js.map +1 -1
  547. package/dist/server/services/uid.mjs.map +1 -1
  548. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  549. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  550. package/dist/server/services/utils/configuration/index.js.map +1 -1
  551. package/dist/server/services/utils/configuration/index.mjs +3 -3
  552. package/dist/server/services/utils/configuration/index.mjs.map +1 -1
  553. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  554. package/dist/server/services/utils/configuration/layouts.mjs +1 -1
  555. package/dist/server/services/utils/configuration/layouts.mjs.map +1 -1
  556. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  557. package/dist/server/services/utils/configuration/metadatas.mjs +1 -1
  558. package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -1
  559. package/dist/server/services/utils/configuration/settings.js +4 -2
  560. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  561. package/dist/server/services/utils/configuration/settings.mjs +5 -3
  562. package/dist/server/services/utils/configuration/settings.mjs.map +1 -1
  563. package/dist/server/services/utils/draft.js.map +1 -1
  564. package/dist/server/services/utils/draft.mjs.map +1 -1
  565. package/dist/server/services/utils/populate.js.map +1 -1
  566. package/dist/server/services/utils/populate.mjs +1 -1
  567. package/dist/server/services/utils/populate.mjs.map +1 -1
  568. package/dist/server/services/utils/store.js.map +1 -1
  569. package/dist/server/services/utils/store.mjs.map +1 -1
  570. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  571. package/dist/server/src/controllers/single-types.d.ts.map +1 -1
  572. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  573. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  574. package/dist/server/utils/index.js.map +1 -1
  575. package/dist/server/utils/index.mjs.map +1 -1
  576. package/dist/server/validation/policies/hasPermissions.js.map +1 -1
  577. package/dist/server/validation/policies/hasPermissions.mjs.map +1 -1
  578. package/dist/shared/contracts/content-types.d.ts +2 -0
  579. package/dist/shared/contracts/content-types.d.ts.map +1 -1
  580. package/dist/shared/contracts/relations.d.ts +1 -1
  581. package/dist/shared/contracts/relations.d.ts.map +1 -1
  582. package/package.json +15 -10
@@ -1 +1 @@
1
- {"version":3,"file":"history.mjs","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash/fp';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n const [{ results, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n populate: ['createdBy'],\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(['id', ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","pagination","localeDictionary","Promise","all","findPage","where","$and","documentId","relatedDocumentId","populate","orderBy","getLocaleDictionary","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","map","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","version","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
1
+ {"version":3,"file":"history.mjs","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash/fp';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n const [{ results, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n populate: ['createdBy'],\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(['id', ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","pagination","localeDictionary","Promise","all","findPage","where","$and","documentId","relatedDocumentId","populate","orderBy","getLocaleDictionary","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","map","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","version","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../server/src/history/services/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { createHistoryService } from './history';\nimport { createLifecyclesService } from './lifecycles';\n\nexport const services = {\n history: createHistoryService,\n lifecycles: createLifecyclesService,\n} satisfies Plugin.LoadedPlugin['services'];\n"],"names":["services","history","createHistoryService","lifecycles","createLifecyclesService"],"mappings":";;;;;MAIaA,QAAW,GAAA;IACtBC,OAASC,EAAAA,4BAAAA;IACTC,UAAYC,EAAAA;AACd;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../server/src/history/services/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { createHistoryService } from './history';\nimport { createLifecyclesService } from './lifecycles';\n\nexport const services = {\n history: createHistoryService,\n lifecycles: createLifecyclesService,\n} satisfies Plugin.LoadedPlugin['services'];\n"],"names":["services","history","createHistoryService","lifecycles","createLifecyclesService"],"mappings":";;;;;MAIaA,QAAAA,GAAW;IACtBC,OAAAA,EAASC,4BAAAA;IACTC,UAAAA,EAAYC;AACd;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../server/src/history/services/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { createHistoryService } from './history';\nimport { createLifecyclesService } from './lifecycles';\n\nexport const services = {\n history: createHistoryService,\n lifecycles: createLifecyclesService,\n} satisfies Plugin.LoadedPlugin['services'];\n"],"names":["services","history","createHistoryService","lifecycles","createLifecyclesService"],"mappings":";;;MAIaA,QAAW,GAAA;IACtBC,OAASC,EAAAA,oBAAAA;IACTC,UAAYC,EAAAA;AACd;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/history/services/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { createHistoryService } from './history';\nimport { createLifecyclesService } from './lifecycles';\n\nexport const services = {\n history: createHistoryService,\n lifecycles: createLifecyclesService,\n} satisfies Plugin.LoadedPlugin['services'];\n"],"names":["services","history","createHistoryService","lifecycles","createLifecyclesService"],"mappings":";;;MAIaA,QAAAA,GAAW;IACtBC,OAAAA,EAASC,oBAAAA;IACTC,UAAAA,EAAYC;AACd;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.js","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const BATCH_SIZE = 1000;\n\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n // Delete in batches of 1000 to avoid a single query that\n // exhausts the DB connection pool and blocks other operations.\n let deleted: number;\n do {\n // Fetch up to BATCH_SIZE expired IDs\n const expiredVersions = await strapi.db.query(HISTORY_VERSION_UID).findMany({\n select: ['id'],\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n limit: BATCH_SIZE,\n });\n\n const ids = expiredVersions.map((v: { id: number | string }) => v.id);\n deleted = ids.length;\n\n // Delete this batch by ID\n if (deleted > 0) {\n await strapi.db.query(HISTORY_VERSION_UID).deleteMany({\n where: {\n id: { $in: ids },\n },\n });\n }\n\n // If we got a full batch, there are likely more rows to delete — loop again.\n // If we got fewer, we've handled everything and can stop.\n } while (deleted >= BATCH_SIZE);\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","BATCH_SIZE","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","deleted","expiredVersions","HISTORY_VERSION_UID","select","created_at","$lt","limit","ids","map","v","id","deleteMany","options","destroy","remove"],"mappings":"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"}
1
+ {"version":3,"file":"lifecycles.js","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const BATCH_SIZE = 1000;\n\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n // Delete in batches of 1000 to avoid a single query that\n // exhausts the DB connection pool and blocks other operations.\n let deleted: number;\n do {\n // Fetch up to BATCH_SIZE expired IDs\n const expiredVersions = await strapi.db.query(HISTORY_VERSION_UID).findMany({\n select: ['id'],\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n limit: BATCH_SIZE,\n });\n\n const ids = expiredVersions.map((v: { id: number | string }) => v.id);\n deleted = ids.length;\n\n // Delete this batch by ID\n if (deleted > 0) {\n await strapi.db.query(HISTORY_VERSION_UID).deleteMany({\n where: {\n id: { $in: ids },\n },\n });\n }\n\n // If we got a full batch, there are likely more rows to delete — loop again.\n // If we got fewer, we've handled everything and can stop.\n } while (deleted >= BATCH_SIZE);\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","BATCH_SIZE","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","deleted","expiredVersions","HISTORY_VERSION_UID","select","created_at","$lt","limit","ids","map","v","id","deleteMany","options","destroy","remove"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.mjs","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const BATCH_SIZE = 1000;\n\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n // Delete in batches of 1000 to avoid a single query that\n // exhausts the DB connection pool and blocks other operations.\n let deleted: number;\n do {\n // Fetch up to BATCH_SIZE expired IDs\n const expiredVersions = await strapi.db.query(HISTORY_VERSION_UID).findMany({\n select: ['id'],\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n limit: BATCH_SIZE,\n });\n\n const ids = expiredVersions.map((v: { id: number | string }) => v.id);\n deleted = ids.length;\n\n // Delete this batch by ID\n if (deleted > 0) {\n await strapi.db.query(HISTORY_VERSION_UID).deleteMany({\n where: {\n id: { $in: ids },\n },\n });\n }\n\n // If we got a full batch, there are likely more rows to delete — loop again.\n // If we got fewer, we've handled everything and can stop.\n } while (deleted >= BATCH_SIZE);\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","BATCH_SIZE","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","deleted","expiredVersions","HISTORY_VERSION_UID","select","created_at","$lt","limit","ids","map","v","id","deleteMany","options","destroy","remove"],"mappings":"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"}
1
+ {"version":3,"file":"lifecycles.mjs","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const BATCH_SIZE = 1000;\n\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n // Delete in batches of 1000 to avoid a single query that\n // exhausts the DB connection pool and blocks other operations.\n let deleted: number;\n do {\n // Fetch up to BATCH_SIZE expired IDs\n const expiredVersions = await strapi.db.query(HISTORY_VERSION_UID).findMany({\n select: ['id'],\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n limit: BATCH_SIZE,\n });\n\n const ids = expiredVersions.map((v: { id: number | string }) => v.id);\n deleted = ids.length;\n\n // Delete this batch by ID\n if (deleted > 0) {\n await strapi.db.query(HISTORY_VERSION_UID).deleteMany({\n where: {\n id: { $in: ids },\n },\n });\n }\n\n // If we got a full batch, there are likely more rows to delete — loop again.\n // If we got fewer, we've handled everything and can stop.\n } while (deleted >= BATCH_SIZE);\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","BATCH_SIZE","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","deleted","expiredVersions","HISTORY_VERSION_UID","select","created_at","$lt","limit","ids","map","v","id","deleteMany","options","destroy","remove"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../server/src/history/services/utils.ts"],"sourcesContent":["import { difference, omit } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { Core, Modules, Schema, Data, Struct, UID } from '@strapi/types';\n\nimport { FIELDS_TO_IGNORE } from '../constants';\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type { RelationResult } from '../../../../shared/contracts/relations';\n\nconst DEFAULT_RETENTION_DAYS = 90;\n\ntype RelationResponse = {\n results: RelationResult[];\n meta: { missingCount: number };\n};\n\nexport const createServiceUtils = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * @description\n * Get the difference between the version schema and the content type schema\n */\n const getSchemaAttributesDiff = (\n versionSchemaAttributes: CreateHistoryVersion['schema'],\n contentTypeSchemaAttributes: Struct.SchemaAttributes\n ) => {\n // Omit the same fields that were omitted when creating a history version\n const sanitizedContentTypeSchemaAttributes = omit(\n FIELDS_TO_IGNORE,\n contentTypeSchemaAttributes\n );\n\n const reduceDifferenceToAttributesObject = (\n diffKeys: string[],\n source: CreateHistoryVersion['schema']\n ) => {\n return diffKeys.reduce<CreateHistoryVersion['schema']>(\n (previousAttributesObject, diffKey) => {\n previousAttributesObject[diffKey] = source[diffKey];\n\n return previousAttributesObject;\n },\n {}\n );\n };\n\n const versionSchemaKeys = Object.keys(versionSchemaAttributes);\n const contentTypeSchemaAttributesKeys = Object.keys(sanitizedContentTypeSchemaAttributes);\n // The attribute is new if it's on the content type schema but not on the version schema\n const uniqueToContentType = difference(contentTypeSchemaAttributesKeys, versionSchemaKeys);\n const added = reduceDifferenceToAttributesObject(\n uniqueToContentType,\n sanitizedContentTypeSchemaAttributes\n );\n // The attribute was removed or renamed if it's on the version schema but not on the content type schema\n const uniqueToVersion = difference(versionSchemaKeys, contentTypeSchemaAttributesKeys);\n const removed = reduceDifferenceToAttributesObject(uniqueToVersion, versionSchemaAttributes);\n\n return { added, removed };\n };\n\n /**\n * @description\n * Gets the value to set for a relation when restoring a document\n * @returns\n * The relation if it exists or null\n */\n const getRelationRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[],\n attribute: Schema.Attribute.RelationWithTarget\n ) => {\n if (Array.isArray(versionRelationData)) {\n if (versionRelationData.length === 0) return versionRelationData;\n\n const existingAndMissingRelations = await Promise.all(\n versionRelationData.map((relation) => {\n return strapi.documents(attribute.target).findOne({\n documentId: relation.documentId,\n locale: relation.locale || undefined,\n });\n })\n );\n\n return existingAndMissingRelations.filter((relation) => relation !== null);\n }\n\n return strapi.documents(attribute.target).findOne({\n documentId: versionRelationData.documentId,\n locale: versionRelationData.locale || undefined,\n });\n };\n\n /**\n * @description\n * Gets the value to set for a media asset when restoring a document\n * @returns\n * The media asset if it exists or null\n */\n const getMediaRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[]\n ) => {\n if (Array.isArray(versionRelationData)) {\n const existingAndMissingMedias = await Promise.all(\n versionRelationData.map((media) => {\n return strapi.db.query('plugin::upload.file').findOne({ where: { id: media.id } });\n })\n );\n\n return existingAndMissingMedias.filter((media) => media != null);\n }\n\n return strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: versionRelationData.id } });\n };\n\n const localesService = strapi.plugin('i18n')?.service('locales');\n const i18nContentTypeService = strapi.plugin('i18n')?.service('content-types');\n\n const getDefaultLocale = async () => (localesService ? localesService.getDefaultLocale() : null);\n\n const isLocalizedContentType = (model: Schema.ContentType) =>\n i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;\n\n /**\n *\n * @description\n * Creates a dictionary of all locales available\n */\n const getLocaleDictionary = async (): Promise<{\n [key: string]: { name: string; code: string };\n }> => {\n if (!localesService) return {};\n\n const locales = (await localesService.find()) || [];\n return locales.reduce(\n (\n acc: Record<string, NonNullable<HistoryVersions.HistoryVersionDataResponse['locale']>>,\n locale: NonNullable<HistoryVersions.HistoryVersionDataResponse['locale']>\n ) => {\n acc[locale.code] = { name: locale.name, code: locale.code };\n\n return acc;\n },\n {}\n );\n };\n\n /**\n *\n * @description\n * Gets the number of retention days defined on the license or configured by the user\n */\n const getRetentionDays = () => {\n const featureConfig = strapi.ee.features.get('cms-content-history');\n const licenseRetentionDays =\n typeof featureConfig === 'object' && featureConfig?.options.retentionDays;\n const userRetentionDays: number = strapi.config.get('admin.history.retentionDays');\n\n // Allow users to override the license retention days, but not to increase it\n if (userRetentionDays && userRetentionDays < licenseRetentionDays) {\n return userRetentionDays;\n }\n\n // User didn't provide retention days value, use the license or fallback to default\n return Math.min(licenseRetentionDays, DEFAULT_RETENTION_DAYS);\n };\n\n const getVersionStatus = async (\n contentTypeUid: HistoryVersions.CreateHistoryVersion['contentType'],\n document: Modules.Documents.AnyDocument | null\n ) => {\n const documentMetadataService = strapi.plugin('content-manager').service('document-metadata');\n const meta = await documentMetadataService.getMetadata(contentTypeUid, document);\n\n return documentMetadataService.getStatus(document, meta.availableStatus);\n };\n\n /**\n * Lists all the fields of a component, excepts those that will be populated.\n * The goal is to exclude the ID, because when restoring a component,\n * referencing an ID for a component db row that was deleted creates an error.\n * So we never store component IDs to ensure they're re-created while restoring a version.\n */\n const getComponentFields = (componentUID: UID.Component): string[] => {\n return Object.entries(strapi.getModel(componentUID).attributes).reduce<string[]>(\n (fieldsAcc, [key, attribute]) => {\n if (!['relation', 'media', 'component', 'dynamiczone'].includes(attribute.type)) {\n fieldsAcc.push(key);\n }\n\n return fieldsAcc;\n },\n []\n );\n };\n\n /**\n * @description\n * Creates a populate object that looks for all the relations that need\n * to be saved in history, and populates only the fields needed to later retrieve the content.\n *\n * @param uid - The content type UID\n * @param useDatabaseSyntax - Whether to use the database syntax for populate, defaults to false\n */\n const getDeepPopulate = (uid: UID.Schema, useDatabaseSyntax = false) => {\n const model = strapi.getModel(uid);\n const attributes = Object.entries(model.attributes);\n const fieldSelector = useDatabaseSyntax ? 'select' : 'fields';\n\n return attributes.reduce((acc: any, [attributeName, attribute]) => {\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n const isVisible = contentTypes.isVisibleAttribute(model, attributeName);\n if (isVisible) {\n acc[attributeName] = { [fieldSelector]: ['documentId', 'locale', 'publishedAt'] };\n }\n break;\n }\n\n case 'media': {\n acc[attributeName] = { [fieldSelector]: ['id'] };\n break;\n }\n\n case 'component': {\n const populate = getDeepPopulate(attribute.component);\n acc[attributeName] = {\n populate,\n [fieldSelector]: getComponentFields(attribute.component),\n };\n break;\n }\n\n case 'dynamiczone': {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => {\n acc[componentUID] = {\n populate: getDeepPopulate(componentUID),\n [fieldSelector]: getComponentFields(componentUID),\n };\n return acc;\n },\n {}\n );\n\n acc[attributeName] = { on: populatedComponents };\n break;\n }\n default:\n break;\n }\n\n return acc;\n }, {});\n };\n\n /**\n * @description\n * Builds a response object for relations containing the related data and a count of missing relations\n */\n const buildMediaResponse = async (values: { id: Data.ID }[]): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n\n const relatedEntry = await strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: entry.id } });\n\n if (relatedEntry) {\n currentRelationData.results.push(relatedEntry);\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n /**\n * @description\n * Builds a response object for media containing the media assets data and a count of missing media assets\n */\n const buildRelationReponse = async (\n values: {\n documentId: string;\n locale: string | null;\n }[],\n attributeSchema: Schema.Attribute.RelationWithTarget\n ): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n const relatedEntry = await strapi\n .documents(attributeSchema.target)\n .findOne({ documentId: entry.documentId, locale: entry.locale || undefined });\n\n if (relatedEntry) {\n currentRelationData.results.push({\n ...relatedEntry,\n status: await getVersionStatus(attributeSchema.target, relatedEntry),\n });\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n return {\n getSchemaAttributesDiff,\n getRelationRestoreValue,\n getMediaRestoreValue,\n getDefaultLocale,\n isLocalizedContentType,\n getLocaleDictionary,\n getRetentionDays,\n getVersionStatus,\n getDeepPopulate,\n buildMediaResponse,\n buildRelationReponse,\n };\n};\n"],"names":["DEFAULT_RETENTION_DAYS","createServiceUtils","strapi","getSchemaAttributesDiff","versionSchemaAttributes","contentTypeSchemaAttributes","sanitizedContentTypeSchemaAttributes","omit","FIELDS_TO_IGNORE","reduceDifferenceToAttributesObject","diffKeys","source","reduce","previousAttributesObject","diffKey","versionSchemaKeys","Object","keys","contentTypeSchemaAttributesKeys","uniqueToContentType","difference","added","uniqueToVersion","removed","getRelationRestoreValue","versionRelationData","attribute","Array","isArray","length","existingAndMissingRelations","Promise","all","map","relation","documents","target","findOne","documentId","locale","undefined","filter","getMediaRestoreValue","existingAndMissingMedias","media","db","query","where","id","localesService","plugin","service","i18nContentTypeService","getDefaultLocale","isLocalizedContentType","model","getLocaleDictionary","locales","find","acc","code","name","getRetentionDays","featureConfig","ee","features","get","licenseRetentionDays","options","retentionDays","userRetentionDays","config","Math","min","getVersionStatus","contentTypeUid","document","documentMetadataService","meta","getMetadata","getStatus","availableStatus","getComponentFields","componentUID","entries","getModel","attributes","fieldsAcc","key","includes","type","push","getDeepPopulate","uid","useDatabaseSyntax","fieldSelector","attributeName","isMorphRelation","toLowerCase","startsWith","isVisible","contentTypes","isVisibleAttribute","populate","component","populatedComponents","components","on","buildMediaResponse","values","slice","currentRelationDataPromise","entry","currentRelationData","relatedEntry","results","missingCount","resolve","buildRelationReponse","attributeSchema","status"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../server/src/history/services/utils.ts"],"sourcesContent":["import { difference, omit } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { Core, Modules, Schema, Data, Struct, UID } from '@strapi/types';\n\nimport { FIELDS_TO_IGNORE } from '../constants';\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type { RelationResult } from '../../../../shared/contracts/relations';\n\nconst DEFAULT_RETENTION_DAYS = 90;\n\ntype RelationResponse = {\n results: RelationResult[];\n meta: { missingCount: number };\n};\n\nexport const createServiceUtils = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * @description\n * Get the difference between the version schema and the content type schema\n */\n const getSchemaAttributesDiff = (\n versionSchemaAttributes: CreateHistoryVersion['schema'],\n contentTypeSchemaAttributes: Struct.SchemaAttributes\n ) => {\n // Omit the same fields that were omitted when creating a history version\n const sanitizedContentTypeSchemaAttributes = omit(\n FIELDS_TO_IGNORE,\n contentTypeSchemaAttributes\n );\n\n const reduceDifferenceToAttributesObject = (\n diffKeys: string[],\n source: CreateHistoryVersion['schema']\n ) => {\n return diffKeys.reduce<CreateHistoryVersion['schema']>(\n (previousAttributesObject, diffKey) => {\n previousAttributesObject[diffKey] = source[diffKey];\n\n return previousAttributesObject;\n },\n {}\n );\n };\n\n const versionSchemaKeys = Object.keys(versionSchemaAttributes);\n const contentTypeSchemaAttributesKeys = Object.keys(sanitizedContentTypeSchemaAttributes);\n // The attribute is new if it's on the content type schema but not on the version schema\n const uniqueToContentType = difference(contentTypeSchemaAttributesKeys, versionSchemaKeys);\n const added = reduceDifferenceToAttributesObject(\n uniqueToContentType,\n sanitizedContentTypeSchemaAttributes\n );\n // The attribute was removed or renamed if it's on the version schema but not on the content type schema\n const uniqueToVersion = difference(versionSchemaKeys, contentTypeSchemaAttributesKeys);\n const removed = reduceDifferenceToAttributesObject(uniqueToVersion, versionSchemaAttributes);\n\n return { added, removed };\n };\n\n /**\n * @description\n * Gets the value to set for a relation when restoring a document\n * @returns\n * The relation if it exists or null\n */\n const getRelationRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[],\n attribute: Schema.Attribute.RelationWithTarget\n ) => {\n if (Array.isArray(versionRelationData)) {\n if (versionRelationData.length === 0) return versionRelationData;\n\n const existingAndMissingRelations = await Promise.all(\n versionRelationData.map((relation) => {\n return strapi.documents(attribute.target).findOne({\n documentId: relation.documentId,\n locale: relation.locale || undefined,\n });\n })\n );\n\n return existingAndMissingRelations.filter((relation) => relation !== null);\n }\n\n return strapi.documents(attribute.target).findOne({\n documentId: versionRelationData.documentId,\n locale: versionRelationData.locale || undefined,\n });\n };\n\n /**\n * @description\n * Gets the value to set for a media asset when restoring a document\n * @returns\n * The media asset if it exists or null\n */\n const getMediaRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[]\n ) => {\n if (Array.isArray(versionRelationData)) {\n const existingAndMissingMedias = await Promise.all(\n versionRelationData.map((media) => {\n return strapi.db.query('plugin::upload.file').findOne({ where: { id: media.id } });\n })\n );\n\n return existingAndMissingMedias.filter((media) => media != null);\n }\n\n return strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: versionRelationData.id } });\n };\n\n const localesService = strapi.plugin('i18n')?.service('locales');\n const i18nContentTypeService = strapi.plugin('i18n')?.service('content-types');\n\n const getDefaultLocale = async () => (localesService ? localesService.getDefaultLocale() : null);\n\n const isLocalizedContentType = (model: Schema.ContentType) =>\n i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;\n\n /**\n *\n * @description\n * Creates a dictionary of all locales available\n */\n const getLocaleDictionary = async (): Promise<{\n [key: string]: { name: string; code: string };\n }> => {\n if (!localesService) return {};\n\n const locales = (await localesService.find()) || [];\n return locales.reduce(\n (\n acc: Record<string, NonNullable<HistoryVersions.HistoryVersionDataResponse['locale']>>,\n locale: NonNullable<HistoryVersions.HistoryVersionDataResponse['locale']>\n ) => {\n acc[locale.code] = { name: locale.name, code: locale.code };\n\n return acc;\n },\n {}\n );\n };\n\n /**\n *\n * @description\n * Gets the number of retention days defined on the license or configured by the user\n */\n const getRetentionDays = () => {\n const featureConfig = strapi.ee.features.get('cms-content-history');\n const licenseRetentionDays =\n typeof featureConfig === 'object' && featureConfig?.options.retentionDays;\n const userRetentionDays: number = strapi.config.get('admin.history.retentionDays');\n\n // Allow users to override the license retention days, but not to increase it\n if (userRetentionDays && userRetentionDays < licenseRetentionDays) {\n return userRetentionDays;\n }\n\n // User didn't provide retention days value, use the license or fallback to default\n return Math.min(licenseRetentionDays, DEFAULT_RETENTION_DAYS);\n };\n\n const getVersionStatus = async (\n contentTypeUid: HistoryVersions.CreateHistoryVersion['contentType'],\n document: Modules.Documents.AnyDocument | null\n ) => {\n const documentMetadataService = strapi.plugin('content-manager').service('document-metadata');\n const meta = await documentMetadataService.getMetadata(contentTypeUid, document);\n\n return documentMetadataService.getStatus(document, meta.availableStatus);\n };\n\n /**\n * Lists all the fields of a component, excepts those that will be populated.\n * The goal is to exclude the ID, because when restoring a component,\n * referencing an ID for a component db row that was deleted creates an error.\n * So we never store component IDs to ensure they're re-created while restoring a version.\n */\n const getComponentFields = (componentUID: UID.Component): string[] => {\n return Object.entries(strapi.getModel(componentUID).attributes).reduce<string[]>(\n (fieldsAcc, [key, attribute]) => {\n if (!['relation', 'media', 'component', 'dynamiczone'].includes(attribute.type)) {\n fieldsAcc.push(key);\n }\n\n return fieldsAcc;\n },\n []\n );\n };\n\n /**\n * @description\n * Creates a populate object that looks for all the relations that need\n * to be saved in history, and populates only the fields needed to later retrieve the content.\n *\n * @param uid - The content type UID\n * @param useDatabaseSyntax - Whether to use the database syntax for populate, defaults to false\n */\n const getDeepPopulate = (uid: UID.Schema, useDatabaseSyntax = false) => {\n const model = strapi.getModel(uid);\n const attributes = Object.entries(model.attributes);\n const fieldSelector = useDatabaseSyntax ? 'select' : 'fields';\n\n return attributes.reduce((acc: any, [attributeName, attribute]) => {\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n const isVisible = contentTypes.isVisibleAttribute(model, attributeName);\n if (isVisible) {\n acc[attributeName] = { [fieldSelector]: ['documentId', 'locale', 'publishedAt'] };\n }\n break;\n }\n\n case 'media': {\n acc[attributeName] = { [fieldSelector]: ['id'] };\n break;\n }\n\n case 'component': {\n const populate = getDeepPopulate(attribute.component);\n acc[attributeName] = {\n populate,\n [fieldSelector]: getComponentFields(attribute.component),\n };\n break;\n }\n\n case 'dynamiczone': {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => {\n acc[componentUID] = {\n populate: getDeepPopulate(componentUID),\n [fieldSelector]: getComponentFields(componentUID),\n };\n return acc;\n },\n {}\n );\n\n acc[attributeName] = { on: populatedComponents };\n break;\n }\n default:\n break;\n }\n\n return acc;\n }, {});\n };\n\n /**\n * @description\n * Builds a response object for relations containing the related data and a count of missing relations\n */\n const buildMediaResponse = async (values: { id: Data.ID }[]): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n\n const relatedEntry = await strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: entry.id } });\n\n if (relatedEntry) {\n currentRelationData.results.push(relatedEntry);\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n /**\n * @description\n * Builds a response object for media containing the media assets data and a count of missing media assets\n */\n const buildRelationReponse = async (\n values: {\n documentId: string;\n locale: string | null;\n }[],\n attributeSchema: Schema.Attribute.RelationWithTarget\n ): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n const relatedEntry = await strapi\n .documents(attributeSchema.target)\n .findOne({ documentId: entry.documentId, locale: entry.locale || undefined });\n\n if (relatedEntry) {\n currentRelationData.results.push({\n ...relatedEntry,\n status: await getVersionStatus(attributeSchema.target, relatedEntry),\n });\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n return {\n getSchemaAttributesDiff,\n getRelationRestoreValue,\n getMediaRestoreValue,\n getDefaultLocale,\n isLocalizedContentType,\n getLocaleDictionary,\n getRetentionDays,\n getVersionStatus,\n getDeepPopulate,\n buildMediaResponse,\n buildRelationReponse,\n };\n};\n"],"names":["DEFAULT_RETENTION_DAYS","createServiceUtils","strapi","getSchemaAttributesDiff","versionSchemaAttributes","contentTypeSchemaAttributes","sanitizedContentTypeSchemaAttributes","omit","FIELDS_TO_IGNORE","reduceDifferenceToAttributesObject","diffKeys","source","reduce","previousAttributesObject","diffKey","versionSchemaKeys","Object","keys","contentTypeSchemaAttributesKeys","uniqueToContentType","difference","added","uniqueToVersion","removed","getRelationRestoreValue","versionRelationData","attribute","Array","isArray","length","existingAndMissingRelations","Promise","all","map","relation","documents","target","findOne","documentId","locale","undefined","filter","getMediaRestoreValue","existingAndMissingMedias","media","db","query","where","id","localesService","plugin","service","i18nContentTypeService","getDefaultLocale","isLocalizedContentType","model","getLocaleDictionary","locales","find","acc","code","name","getRetentionDays","featureConfig","ee","features","get","licenseRetentionDays","options","retentionDays","userRetentionDays","config","Math","min","getVersionStatus","contentTypeUid","document","documentMetadataService","meta","getMetadata","getStatus","availableStatus","getComponentFields","componentUID","entries","getModel","attributes","fieldsAcc","key","includes","type","push","getDeepPopulate","uid","useDatabaseSyntax","fieldSelector","attributeName","isMorphRelation","toLowerCase","startsWith","isVisible","contentTypes","isVisibleAttribute","populate","component","populatedComponents","components","on","buildMediaResponse","values","slice","currentRelationDataPromise","entry","currentRelationData","relatedEntry","results","missingCount","resolve","buildRelationReponse","attributeSchema","status"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sources":["../../../../server/src/history/services/utils.ts"],"sourcesContent":["import { difference, omit } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { Core, Modules, Schema, Data, Struct, UID } from '@strapi/types';\n\nimport { FIELDS_TO_IGNORE } from '../constants';\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type { RelationResult } from '../../../../shared/contracts/relations';\n\nconst DEFAULT_RETENTION_DAYS = 90;\n\ntype RelationResponse = {\n results: RelationResult[];\n meta: { missingCount: number };\n};\n\nexport const createServiceUtils = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * @description\n * Get the difference between the version schema and the content type schema\n */\n const getSchemaAttributesDiff = (\n versionSchemaAttributes: CreateHistoryVersion['schema'],\n contentTypeSchemaAttributes: Struct.SchemaAttributes\n ) => {\n // Omit the same fields that were omitted when creating a history version\n const sanitizedContentTypeSchemaAttributes = omit(\n FIELDS_TO_IGNORE,\n contentTypeSchemaAttributes\n );\n\n const reduceDifferenceToAttributesObject = (\n diffKeys: string[],\n source: CreateHistoryVersion['schema']\n ) => {\n return diffKeys.reduce<CreateHistoryVersion['schema']>(\n (previousAttributesObject, diffKey) => {\n previousAttributesObject[diffKey] = source[diffKey];\n\n return previousAttributesObject;\n },\n {}\n );\n };\n\n const versionSchemaKeys = Object.keys(versionSchemaAttributes);\n const contentTypeSchemaAttributesKeys = Object.keys(sanitizedContentTypeSchemaAttributes);\n // The attribute is new if it's on the content type schema but not on the version schema\n const uniqueToContentType = difference(contentTypeSchemaAttributesKeys, versionSchemaKeys);\n const added = reduceDifferenceToAttributesObject(\n uniqueToContentType,\n sanitizedContentTypeSchemaAttributes\n );\n // The attribute was removed or renamed if it's on the version schema but not on the content type schema\n const uniqueToVersion = difference(versionSchemaKeys, contentTypeSchemaAttributesKeys);\n const removed = reduceDifferenceToAttributesObject(uniqueToVersion, versionSchemaAttributes);\n\n return { added, removed };\n };\n\n /**\n * @description\n * Gets the value to set for a relation when restoring a document\n * @returns\n * The relation if it exists or null\n */\n const getRelationRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[],\n attribute: Schema.Attribute.RelationWithTarget\n ) => {\n if (Array.isArray(versionRelationData)) {\n if (versionRelationData.length === 0) return versionRelationData;\n\n const existingAndMissingRelations = await Promise.all(\n versionRelationData.map((relation) => {\n return strapi.documents(attribute.target).findOne({\n documentId: relation.documentId,\n locale: relation.locale || undefined,\n });\n })\n );\n\n return existingAndMissingRelations.filter((relation) => relation !== null);\n }\n\n return strapi.documents(attribute.target).findOne({\n documentId: versionRelationData.documentId,\n locale: versionRelationData.locale || undefined,\n });\n };\n\n /**\n * @description\n * Gets the value to set for a media asset when restoring a document\n * @returns\n * The media asset if it exists or null\n */\n const getMediaRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[]\n ) => {\n if (Array.isArray(versionRelationData)) {\n const existingAndMissingMedias = await Promise.all(\n versionRelationData.map((media) => {\n return strapi.db.query('plugin::upload.file').findOne({ where: { id: media.id } });\n })\n );\n\n return existingAndMissingMedias.filter((media) => media != null);\n }\n\n return strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: versionRelationData.id } });\n };\n\n const localesService = strapi.plugin('i18n')?.service('locales');\n const i18nContentTypeService = strapi.plugin('i18n')?.service('content-types');\n\n const getDefaultLocale = async () => (localesService ? localesService.getDefaultLocale() : null);\n\n const isLocalizedContentType = (model: Schema.ContentType) =>\n i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;\n\n /**\n *\n * @description\n * Creates a dictionary of all locales available\n */\n const getLocaleDictionary = async (): Promise<{\n [key: string]: { name: string; code: string };\n }> => {\n if (!localesService) return {};\n\n const locales = (await localesService.find()) || [];\n return locales.reduce(\n (\n acc: Record<string, NonNullable<HistoryVersions.HistoryVersionDataResponse['locale']>>,\n locale: NonNullable<HistoryVersions.HistoryVersionDataResponse['locale']>\n ) => {\n acc[locale.code] = { name: locale.name, code: locale.code };\n\n return acc;\n },\n {}\n );\n };\n\n /**\n *\n * @description\n * Gets the number of retention days defined on the license or configured by the user\n */\n const getRetentionDays = () => {\n const featureConfig = strapi.ee.features.get('cms-content-history');\n const licenseRetentionDays =\n typeof featureConfig === 'object' && featureConfig?.options.retentionDays;\n const userRetentionDays: number = strapi.config.get('admin.history.retentionDays');\n\n // Allow users to override the license retention days, but not to increase it\n if (userRetentionDays && userRetentionDays < licenseRetentionDays) {\n return userRetentionDays;\n }\n\n // User didn't provide retention days value, use the license or fallback to default\n return Math.min(licenseRetentionDays, DEFAULT_RETENTION_DAYS);\n };\n\n const getVersionStatus = async (\n contentTypeUid: HistoryVersions.CreateHistoryVersion['contentType'],\n document: Modules.Documents.AnyDocument | null\n ) => {\n const documentMetadataService = strapi.plugin('content-manager').service('document-metadata');\n const meta = await documentMetadataService.getMetadata(contentTypeUid, document);\n\n return documentMetadataService.getStatus(document, meta.availableStatus);\n };\n\n /**\n * Lists all the fields of a component, excepts those that will be populated.\n * The goal is to exclude the ID, because when restoring a component,\n * referencing an ID for a component db row that was deleted creates an error.\n * So we never store component IDs to ensure they're re-created while restoring a version.\n */\n const getComponentFields = (componentUID: UID.Component): string[] => {\n return Object.entries(strapi.getModel(componentUID).attributes).reduce<string[]>(\n (fieldsAcc, [key, attribute]) => {\n if (!['relation', 'media', 'component', 'dynamiczone'].includes(attribute.type)) {\n fieldsAcc.push(key);\n }\n\n return fieldsAcc;\n },\n []\n );\n };\n\n /**\n * @description\n * Creates a populate object that looks for all the relations that need\n * to be saved in history, and populates only the fields needed to later retrieve the content.\n *\n * @param uid - The content type UID\n * @param useDatabaseSyntax - Whether to use the database syntax for populate, defaults to false\n */\n const getDeepPopulate = (uid: UID.Schema, useDatabaseSyntax = false) => {\n const model = strapi.getModel(uid);\n const attributes = Object.entries(model.attributes);\n const fieldSelector = useDatabaseSyntax ? 'select' : 'fields';\n\n return attributes.reduce((acc: any, [attributeName, attribute]) => {\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n const isVisible = contentTypes.isVisibleAttribute(model, attributeName);\n if (isVisible) {\n acc[attributeName] = { [fieldSelector]: ['documentId', 'locale', 'publishedAt'] };\n }\n break;\n }\n\n case 'media': {\n acc[attributeName] = { [fieldSelector]: ['id'] };\n break;\n }\n\n case 'component': {\n const populate = getDeepPopulate(attribute.component);\n acc[attributeName] = {\n populate,\n [fieldSelector]: getComponentFields(attribute.component),\n };\n break;\n }\n\n case 'dynamiczone': {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => {\n acc[componentUID] = {\n populate: getDeepPopulate(componentUID),\n [fieldSelector]: getComponentFields(componentUID),\n };\n return acc;\n },\n {}\n );\n\n acc[attributeName] = { on: populatedComponents };\n break;\n }\n default:\n break;\n }\n\n return acc;\n }, {});\n };\n\n /**\n * @description\n * Builds a response object for relations containing the related data and a count of missing relations\n */\n const buildMediaResponse = async (values: { id: Data.ID }[]): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n\n const relatedEntry = await strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: entry.id } });\n\n if (relatedEntry) {\n currentRelationData.results.push(relatedEntry);\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n /**\n * @description\n * Builds a response object for media containing the media assets data and a count of missing media assets\n */\n const buildRelationReponse = async (\n values: {\n documentId: string;\n locale: string | null;\n }[],\n attributeSchema: Schema.Attribute.RelationWithTarget\n ): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n const relatedEntry = await strapi\n .documents(attributeSchema.target)\n .findOne({ documentId: entry.documentId, locale: entry.locale || undefined });\n\n if (relatedEntry) {\n currentRelationData.results.push({\n ...relatedEntry,\n status: await getVersionStatus(attributeSchema.target, relatedEntry),\n });\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n return {\n getSchemaAttributesDiff,\n getRelationRestoreValue,\n getMediaRestoreValue,\n getDefaultLocale,\n isLocalizedContentType,\n getLocaleDictionary,\n getRetentionDays,\n getVersionStatus,\n getDeepPopulate,\n buildMediaResponse,\n buildRelationReponse,\n };\n};\n"],"names":["DEFAULT_RETENTION_DAYS","createServiceUtils","strapi","getSchemaAttributesDiff","versionSchemaAttributes","contentTypeSchemaAttributes","sanitizedContentTypeSchemaAttributes","omit","FIELDS_TO_IGNORE","reduceDifferenceToAttributesObject","diffKeys","source","reduce","previousAttributesObject","diffKey","versionSchemaKeys","Object","keys","contentTypeSchemaAttributesKeys","uniqueToContentType","difference","added","uniqueToVersion","removed","getRelationRestoreValue","versionRelationData","attribute","Array","isArray","length","existingAndMissingRelations","Promise","all","map","relation","documents","target","findOne","documentId","locale","undefined","filter","getMediaRestoreValue","existingAndMissingMedias","media","db","query","where","id","localesService","plugin","service","i18nContentTypeService","getDefaultLocale","isLocalizedContentType","model","getLocaleDictionary","locales","find","acc","code","name","getRetentionDays","featureConfig","ee","features","get","licenseRetentionDays","options","retentionDays","userRetentionDays","config","Math","min","getVersionStatus","contentTypeUid","document","documentMetadataService","meta","getMetadata","getStatus","availableStatus","getComponentFields","componentUID","entries","getModel","attributes","fieldsAcc","key","includes","type","push","getDeepPopulate","uid","useDatabaseSyntax","fieldSelector","attributeName","isMorphRelation","toLowerCase","startsWith","isVisible","contentTypes","isVisibleAttribute","populate","component","populatedComponents","components","on","buildMediaResponse","values","slice","currentRelationDataPromise","entry","currentRelationData","relatedEntry","results","missingCount","resolve","buildRelationReponse","attributeSchema","status"],"mappings":"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"}
1
+ {"version":3,"file":"utils.mjs","sources":["../../../../server/src/history/services/utils.ts"],"sourcesContent":["import { difference, omit } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { Core, Modules, Schema, Data, Struct, UID } from '@strapi/types';\n\nimport { FIELDS_TO_IGNORE } from '../constants';\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type { RelationResult } from '../../../../shared/contracts/relations';\n\nconst DEFAULT_RETENTION_DAYS = 90;\n\ntype RelationResponse = {\n results: RelationResult[];\n meta: { missingCount: number };\n};\n\nexport const createServiceUtils = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * @description\n * Get the difference between the version schema and the content type schema\n */\n const getSchemaAttributesDiff = (\n versionSchemaAttributes: CreateHistoryVersion['schema'],\n contentTypeSchemaAttributes: Struct.SchemaAttributes\n ) => {\n // Omit the same fields that were omitted when creating a history version\n const sanitizedContentTypeSchemaAttributes = omit(\n FIELDS_TO_IGNORE,\n contentTypeSchemaAttributes\n );\n\n const reduceDifferenceToAttributesObject = (\n diffKeys: string[],\n source: CreateHistoryVersion['schema']\n ) => {\n return diffKeys.reduce<CreateHistoryVersion['schema']>(\n (previousAttributesObject, diffKey) => {\n previousAttributesObject[diffKey] = source[diffKey];\n\n return previousAttributesObject;\n },\n {}\n );\n };\n\n const versionSchemaKeys = Object.keys(versionSchemaAttributes);\n const contentTypeSchemaAttributesKeys = Object.keys(sanitizedContentTypeSchemaAttributes);\n // The attribute is new if it's on the content type schema but not on the version schema\n const uniqueToContentType = difference(contentTypeSchemaAttributesKeys, versionSchemaKeys);\n const added = reduceDifferenceToAttributesObject(\n uniqueToContentType,\n sanitizedContentTypeSchemaAttributes\n );\n // The attribute was removed or renamed if it's on the version schema but not on the content type schema\n const uniqueToVersion = difference(versionSchemaKeys, contentTypeSchemaAttributesKeys);\n const removed = reduceDifferenceToAttributesObject(uniqueToVersion, versionSchemaAttributes);\n\n return { added, removed };\n };\n\n /**\n * @description\n * Gets the value to set for a relation when restoring a document\n * @returns\n * The relation if it exists or null\n */\n const getRelationRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[],\n attribute: Schema.Attribute.RelationWithTarget\n ) => {\n if (Array.isArray(versionRelationData)) {\n if (versionRelationData.length === 0) return versionRelationData;\n\n const existingAndMissingRelations = await Promise.all(\n versionRelationData.map((relation) => {\n return strapi.documents(attribute.target).findOne({\n documentId: relation.documentId,\n locale: relation.locale || undefined,\n });\n })\n );\n\n return existingAndMissingRelations.filter((relation) => relation !== null);\n }\n\n return strapi.documents(attribute.target).findOne({\n documentId: versionRelationData.documentId,\n locale: versionRelationData.locale || undefined,\n });\n };\n\n /**\n * @description\n * Gets the value to set for a media asset when restoring a document\n * @returns\n * The media asset if it exists or null\n */\n const getMediaRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[]\n ) => {\n if (Array.isArray(versionRelationData)) {\n const existingAndMissingMedias = await Promise.all(\n versionRelationData.map((media) => {\n return strapi.db.query('plugin::upload.file').findOne({ where: { id: media.id } });\n })\n );\n\n return existingAndMissingMedias.filter((media) => media != null);\n }\n\n return strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: versionRelationData.id } });\n };\n\n const localesService = strapi.plugin('i18n')?.service('locales');\n const i18nContentTypeService = strapi.plugin('i18n')?.service('content-types');\n\n const getDefaultLocale = async () => (localesService ? localesService.getDefaultLocale() : null);\n\n const isLocalizedContentType = (model: Schema.ContentType) =>\n i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;\n\n /**\n *\n * @description\n * Creates a dictionary of all locales available\n */\n const getLocaleDictionary = async (): Promise<{\n [key: string]: { name: string; code: string };\n }> => {\n if (!localesService) return {};\n\n const locales = (await localesService.find()) || [];\n return locales.reduce(\n (\n acc: Record<string, NonNullable<HistoryVersions.HistoryVersionDataResponse['locale']>>,\n locale: NonNullable<HistoryVersions.HistoryVersionDataResponse['locale']>\n ) => {\n acc[locale.code] = { name: locale.name, code: locale.code };\n\n return acc;\n },\n {}\n );\n };\n\n /**\n *\n * @description\n * Gets the number of retention days defined on the license or configured by the user\n */\n const getRetentionDays = () => {\n const featureConfig = strapi.ee.features.get('cms-content-history');\n const licenseRetentionDays =\n typeof featureConfig === 'object' && featureConfig?.options.retentionDays;\n const userRetentionDays: number = strapi.config.get('admin.history.retentionDays');\n\n // Allow users to override the license retention days, but not to increase it\n if (userRetentionDays && userRetentionDays < licenseRetentionDays) {\n return userRetentionDays;\n }\n\n // User didn't provide retention days value, use the license or fallback to default\n return Math.min(licenseRetentionDays, DEFAULT_RETENTION_DAYS);\n };\n\n const getVersionStatus = async (\n contentTypeUid: HistoryVersions.CreateHistoryVersion['contentType'],\n document: Modules.Documents.AnyDocument | null\n ) => {\n const documentMetadataService = strapi.plugin('content-manager').service('document-metadata');\n const meta = await documentMetadataService.getMetadata(contentTypeUid, document);\n\n return documentMetadataService.getStatus(document, meta.availableStatus);\n };\n\n /**\n * Lists all the fields of a component, excepts those that will be populated.\n * The goal is to exclude the ID, because when restoring a component,\n * referencing an ID for a component db row that was deleted creates an error.\n * So we never store component IDs to ensure they're re-created while restoring a version.\n */\n const getComponentFields = (componentUID: UID.Component): string[] => {\n return Object.entries(strapi.getModel(componentUID).attributes).reduce<string[]>(\n (fieldsAcc, [key, attribute]) => {\n if (!['relation', 'media', 'component', 'dynamiczone'].includes(attribute.type)) {\n fieldsAcc.push(key);\n }\n\n return fieldsAcc;\n },\n []\n );\n };\n\n /**\n * @description\n * Creates a populate object that looks for all the relations that need\n * to be saved in history, and populates only the fields needed to later retrieve the content.\n *\n * @param uid - The content type UID\n * @param useDatabaseSyntax - Whether to use the database syntax for populate, defaults to false\n */\n const getDeepPopulate = (uid: UID.Schema, useDatabaseSyntax = false) => {\n const model = strapi.getModel(uid);\n const attributes = Object.entries(model.attributes);\n const fieldSelector = useDatabaseSyntax ? 'select' : 'fields';\n\n return attributes.reduce((acc: any, [attributeName, attribute]) => {\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n const isVisible = contentTypes.isVisibleAttribute(model, attributeName);\n if (isVisible) {\n acc[attributeName] = { [fieldSelector]: ['documentId', 'locale', 'publishedAt'] };\n }\n break;\n }\n\n case 'media': {\n acc[attributeName] = { [fieldSelector]: ['id'] };\n break;\n }\n\n case 'component': {\n const populate = getDeepPopulate(attribute.component);\n acc[attributeName] = {\n populate,\n [fieldSelector]: getComponentFields(attribute.component),\n };\n break;\n }\n\n case 'dynamiczone': {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => {\n acc[componentUID] = {\n populate: getDeepPopulate(componentUID),\n [fieldSelector]: getComponentFields(componentUID),\n };\n return acc;\n },\n {}\n );\n\n acc[attributeName] = { on: populatedComponents };\n break;\n }\n default:\n break;\n }\n\n return acc;\n }, {});\n };\n\n /**\n * @description\n * Builds a response object for relations containing the related data and a count of missing relations\n */\n const buildMediaResponse = async (values: { id: Data.ID }[]): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n\n const relatedEntry = await strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: entry.id } });\n\n if (relatedEntry) {\n currentRelationData.results.push(relatedEntry);\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n /**\n * @description\n * Builds a response object for media containing the media assets data and a count of missing media assets\n */\n const buildRelationReponse = async (\n values: {\n documentId: string;\n locale: string | null;\n }[],\n attributeSchema: Schema.Attribute.RelationWithTarget\n ): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n const relatedEntry = await strapi\n .documents(attributeSchema.target)\n .findOne({ documentId: entry.documentId, locale: entry.locale || undefined });\n\n if (relatedEntry) {\n currentRelationData.results.push({\n ...relatedEntry,\n status: await getVersionStatus(attributeSchema.target, relatedEntry),\n });\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n return {\n getSchemaAttributesDiff,\n getRelationRestoreValue,\n getMediaRestoreValue,\n getDefaultLocale,\n isLocalizedContentType,\n getLocaleDictionary,\n getRetentionDays,\n getVersionStatus,\n getDeepPopulate,\n buildMediaResponse,\n buildRelationReponse,\n };\n};\n"],"names":["DEFAULT_RETENTION_DAYS","createServiceUtils","strapi","getSchemaAttributesDiff","versionSchemaAttributes","contentTypeSchemaAttributes","sanitizedContentTypeSchemaAttributes","omit","FIELDS_TO_IGNORE","reduceDifferenceToAttributesObject","diffKeys","source","reduce","previousAttributesObject","diffKey","versionSchemaKeys","Object","keys","contentTypeSchemaAttributesKeys","uniqueToContentType","difference","added","uniqueToVersion","removed","getRelationRestoreValue","versionRelationData","attribute","Array","isArray","length","existingAndMissingRelations","Promise","all","map","relation","documents","target","findOne","documentId","locale","undefined","filter","getMediaRestoreValue","existingAndMissingMedias","media","db","query","where","id","localesService","plugin","service","i18nContentTypeService","getDefaultLocale","isLocalizedContentType","model","getLocaleDictionary","locales","find","acc","code","name","getRetentionDays","featureConfig","ee","features","get","licenseRetentionDays","options","retentionDays","userRetentionDays","config","Math","min","getVersionStatus","contentTypeUid","document","documentMetadataService","meta","getMetadata","getStatus","availableStatus","getComponentFields","componentUID","entries","getModel","attributes","fieldsAcc","key","includes","type","push","getDeepPopulate","uid","useDatabaseSyntax","fieldSelector","attributeName","isMorphRelation","toLowerCase","startsWith","isVisible","contentTypes","isVisibleAttribute","populate","component","populatedComponents","components","on","buildMediaResponse","values","slice","currentRelationDataPromise","entry","currentRelationData","relatedEntry","results","missingCount","resolve","buildRelationReponse","attributeSchema","status"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../server/src/history/utils.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\ntype HistoryServices = typeof import('./services').services;\n\nfunction getService<T extends keyof HistoryServices>(strapi: Core.Strapi, name: T) {\n // Cast is needed because the return type of strapi.service is too vague\n return strapi.service(`plugin::content-manager.${name}`) as ReturnType<HistoryServices[T]>;\n}\n\nexport { getService };\n"],"names":["getService","strapi","name","service"],"mappings":";;AAIA,SAASA,UAAAA,CAA4CC,MAAmB,EAAEC,IAAO,EAAA;;AAE/E,IAAA,OAAOD,OAAOE,OAAO,CAAC,CAAC,wBAAwB,EAAED,IAAM,CAAA,CAAA,CAAA;AACzD;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../server/src/history/utils.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\ntype HistoryServices = typeof import('./services').services;\n\nfunction getService<T extends keyof HistoryServices>(strapi: Core.Strapi, name: T) {\n // Cast is needed because the return type of strapi.service is too vague\n return strapi.service(`plugin::content-manager.${name}`) as ReturnType<HistoryServices[T]>;\n}\n\nexport { getService };\n"],"names":["getService","strapi","name","service"],"mappings":";;AAIA,SAASA,UAAAA,CAA4CC,MAAmB,EAAEC,IAAO,EAAA;;AAE/E,IAAA,OAAOD,OAAOE,OAAO,CAAC,CAAC,wBAAwB,EAAED,IAAAA,CAAAA,CAAM,CAAA;AACzD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sources":["../../../server/src/history/utils.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\ntype HistoryServices = typeof import('./services').services;\n\nfunction getService<T extends keyof HistoryServices>(strapi: Core.Strapi, name: T) {\n // Cast is needed because the return type of strapi.service is too vague\n return strapi.service(`plugin::content-manager.${name}`) as ReturnType<HistoryServices[T]>;\n}\n\nexport { getService };\n"],"names":["getService","strapi","name","service"],"mappings":"AAIA,SAASA,UAAAA,CAA4CC,MAAmB,EAAEC,IAAO,EAAA;;AAE/E,IAAA,OAAOD,OAAOE,OAAO,CAAC,CAAC,wBAAwB,EAAED,IAAM,CAAA,CAAA,CAAA;AACzD;;;;"}
1
+ {"version":3,"file":"utils.mjs","sources":["../../../server/src/history/utils.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\ntype HistoryServices = typeof import('./services').services;\n\nfunction getService<T extends keyof HistoryServices>(strapi: Core.Strapi, name: T) {\n // Cast is needed because the return type of strapi.service is too vague\n return strapi.service(`plugin::content-manager.${name}`) as ReturnType<HistoryServices[T]>;\n}\n\nexport { getService };\n"],"names":["getService","strapi","name","service"],"mappings":"AAIA,SAASA,UAAAA,CAA4CC,MAAmB,EAAEC,IAAO,EAAA;;AAE/E,IAAA,OAAOD,OAAOE,OAAO,CAAC,CAAC,wBAAwB,EAAED,IAAAA,CAAAA,CAAM,CAAA;AACzD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments, GetCountDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n async getCountDocuments(): Promise<GetCountDocuments.Response> {\n return { data: await homepageService.getCountDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments","getCountDocuments"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,cAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,cACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,cAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,kBAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE,SAAA;QACA,MAAMC,iBAAAA,CAAAA,GAAAA;YACJ,OAAO;gBAAEH,IAAM,EAAA,MAAMpB,gBAAgBuB,iBAAiB;AAAG,aAAA;AAC3D;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments, GetCountDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n async getCountDocuments(): Promise<GetCountDocuments.Response> {\n return { data: await homepageService.getCountDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments","getCountDocuments"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,wBAAAA,GAA2B,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAAA,CAAOC,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAAAA,GAA6BC,cAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,cAAAA,CACLI,KAAK,EAAA,CACLC,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAAA,GAAU,CAAA,MAAMJ,0BAAAA,CAA2BU,QAAQ,CAACD,GAAAA,CAAIE,KAAK,CAAA,EAAGP,MAAM;AACxE,YAAA,CAAA,CAAE,OAAOQ,KAAAA,EAAO;gBACd,IAAIA,KAAAA,YAAiBX,cAAAA,CAAIY,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,kBAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD,gBAAA;gBACA,MAAMH,KAAAA;AACR,YAAA;AAEA,YAAA,IAAIR,WAAW,SAAA,EAAW;gBACxB,OAAO;oBAAEY,IAAAA,EAAM,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE,YAAA;YAEA,OAAO;gBAAED,IAAAA,EAAM,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE,QAAA,CAAA;QACA,MAAMC,iBAAAA,CAAAA,GAAAA;YACJ,OAAO;gBAAEH,IAAAA,EAAM,MAAMpB,gBAAgBuB,iBAAiB;AAAG,aAAA;AAC3D,QAAA;AACF,KAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments, GetCountDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n async getCountDocuments(): Promise<GetCountDocuments.Response> {\n return { data: await homepageService.getCountDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments","getCountDocuments"],"mappings":";;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,GACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,GAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,MAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE,SAAA;QACA,MAAMC,iBAAAA,CAAAA,GAAAA;YACJ,OAAO;gBAAEH,IAAM,EAAA,MAAMpB,gBAAgBuB,iBAAiB;AAAG,aAAA;AAC3D;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments, GetCountDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n async getCountDocuments(): Promise<GetCountDocuments.Response> {\n return { data: await homepageService.getCountDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments","getCountDocuments"],"mappings":";;;AAKA,MAAMA,wBAAAA,GAA2B,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAAA,CAAOC,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAAAA,GAA6BC,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,GAAAA,CACLI,KAAK,EAAA,CACLC,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAAA,GAAU,CAAA,MAAMJ,0BAAAA,CAA2BU,QAAQ,CAACD,GAAAA,CAAIE,KAAK,CAAA,EAAGP,MAAM;AACxE,YAAA,CAAA,CAAE,OAAOQ,KAAAA,EAAO;gBACd,IAAIA,KAAAA,YAAiBX,GAAAA,CAAIY,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,MAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD,gBAAA;gBACA,MAAMH,KAAAA;AACR,YAAA;AAEA,YAAA,IAAIR,WAAW,SAAA,EAAW;gBACxB,OAAO;oBAAEY,IAAAA,EAAM,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE,YAAA;YAEA,OAAO;gBAAED,IAAAA,EAAM,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE,QAAA,CAAA;QACA,MAAMC,iBAAAA,CAAAA,GAAAA;YACJ,OAAO;gBAAEH,IAAAA,EAAM,MAAMpB,gBAAgBuB,iBAAiB;AAAG,aAAA;AAC3D,QAAA;AACF,KAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../server/src/homepage/controllers/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { createHomepageController } from './homepage';\n\nexport const controllers = {\n homepage: createHomepageController,\n /**\n * Casting is needed because the types aren't aware that Strapi supports\n * passing a controller factory as the value, instead of a controller object directly\n */\n} as unknown as Plugin.LoadedPlugin['controllers'];\n"],"names":["controllers","homepage","createHomepageController"],"mappings":";;;;MAGaA,WAAc,GAAA;IACzBC,QAAUC,EAAAA;AAKZ;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../server/src/homepage/controllers/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { createHomepageController } from './homepage';\n\nexport const controllers = {\n homepage: createHomepageController,\n /**\n * Casting is needed because the types aren't aware that Strapi supports\n * passing a controller factory as the value, instead of a controller object directly\n */\n} as unknown as Plugin.LoadedPlugin['controllers'];\n"],"names":["controllers","homepage","createHomepageController"],"mappings":";;;;MAGaA,WAAAA,GAAc;IACzBC,QAAAA,EAAUC;AAKZ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../server/src/homepage/controllers/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { createHomepageController } from './homepage';\n\nexport const controllers = {\n homepage: createHomepageController,\n /**\n * Casting is needed because the types aren't aware that Strapi supports\n * passing a controller factory as the value, instead of a controller object directly\n */\n} as unknown as Plugin.LoadedPlugin['controllers'];\n"],"names":["controllers","homepage","createHomepageController"],"mappings":";;MAGaA,WAAc,GAAA;IACzBC,QAAUC,EAAAA;AAKZ;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/homepage/controllers/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { createHomepageController } from './homepage';\n\nexport const controllers = {\n homepage: createHomepageController,\n /**\n * Casting is needed because the types aren't aware that Strapi supports\n * passing a controller factory as the value, instead of a controller object directly\n */\n} as unknown as Plugin.LoadedPlugin['controllers'];\n"],"names":["controllers","homepage","createHomepageController"],"mappings":";;MAGaA,WAAAA,GAAc;IACzBC,QAAAA,EAAUC;AAKZ;;;;"}
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./routes/index.js');
4
- var index$1 = require('./controllers/index.js');
5
- var index$2 = require('./services/index.js');
3
+ var index$1 = require('./routes/index.js');
4
+ var index$2 = require('./controllers/index.js');
5
+ var index = require('./services/index.js');
6
6
 
7
7
  var homepage = {
8
- routes: index.routes,
9
- controllers: index$1.controllers,
10
- services: index$2.services
8
+ routes: index$1.routes,
9
+ controllers: index$2.controllers,
10
+ services: index.services
11
11
  };
12
12
 
13
13
  module.exports = homepage;