@strapi/content-manager 0.0.0-experimental.25e22c6cc9bc6b35392bb55d09f641a0a65e7403 → 0.0.0-experimental.267375bdc00aa57de5e78acd345a838d21a63676

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 (1425) hide show
  1. package/LICENSE +18 -3
  2. package/dist/admin/components/ComponentIcon.js +176 -0
  3. package/dist/admin/components/ComponentIcon.js.map +1 -0
  4. package/dist/admin/components/ComponentIcon.mjs +153 -0
  5. package/dist/admin/components/ComponentIcon.mjs.map +1 -0
  6. package/dist/admin/components/ConfigurationForm/EditFieldForm.js +259 -0
  7. package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -0
  8. package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs +238 -0
  9. package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs.map +1 -0
  10. package/dist/admin/components/ConfigurationForm/Fields.js +630 -0
  11. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -0
  12. package/dist/admin/components/ConfigurationForm/Fields.mjs +607 -0
  13. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -0
  14. package/dist/admin/components/ConfigurationForm/Form.js +253 -0
  15. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -0
  16. package/dist/admin/components/ConfigurationForm/Form.mjs +232 -0
  17. package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -0
  18. package/dist/admin/components/DragLayer.js +50 -0
  19. package/dist/admin/components/DragLayer.js.map +1 -0
  20. package/dist/admin/components/DragLayer.mjs +48 -0
  21. package/dist/admin/components/DragLayer.mjs.map +1 -0
  22. package/dist/admin/components/DragPreviews/CardDragPreview.js +82 -0
  23. package/dist/admin/components/DragPreviews/CardDragPreview.js.map +1 -0
  24. package/dist/admin/components/DragPreviews/CardDragPreview.mjs +80 -0
  25. package/dist/admin/components/DragPreviews/CardDragPreview.mjs.map +1 -0
  26. package/dist/admin/components/DragPreviews/ComponentDragPreview.js +83 -0
  27. package/dist/admin/components/DragPreviews/ComponentDragPreview.js.map +1 -0
  28. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs +81 -0
  29. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs.map +1 -0
  30. package/dist/admin/components/DragPreviews/RelationDragPreview.js +73 -0
  31. package/dist/admin/components/DragPreviews/RelationDragPreview.js.map +1 -0
  32. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs +71 -0
  33. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs.map +1 -0
  34. package/dist/admin/components/FieldTypeIcon.js +58 -0
  35. package/dist/admin/components/FieldTypeIcon.js.map +1 -0
  36. package/dist/admin/components/FieldTypeIcon.mjs +56 -0
  37. package/dist/admin/components/FieldTypeIcon.mjs.map +1 -0
  38. package/dist/admin/components/InjectionZone.js +44 -0
  39. package/dist/admin/components/InjectionZone.js.map +1 -0
  40. package/dist/admin/components/InjectionZone.mjs +40 -0
  41. package/dist/admin/components/InjectionZone.mjs.map +1 -0
  42. package/dist/admin/components/LeftMenu.js +176 -0
  43. package/dist/admin/components/LeftMenu.js.map +1 -0
  44. package/dist/admin/components/LeftMenu.mjs +155 -0
  45. package/dist/admin/components/LeftMenu.mjs.map +1 -0
  46. package/dist/admin/components/RelativeTime.js +76 -0
  47. package/dist/admin/components/RelativeTime.js.map +1 -0
  48. package/dist/admin/components/RelativeTime.mjs +55 -0
  49. package/dist/admin/components/RelativeTime.mjs.map +1 -0
  50. package/dist/admin/components/Widgets.js +161 -0
  51. package/dist/admin/components/Widgets.js.map +1 -0
  52. package/dist/admin/components/Widgets.mjs +158 -0
  53. package/dist/admin/components/Widgets.mjs.map +1 -0
  54. package/dist/admin/constants/attributes.js +48 -0
  55. package/dist/admin/constants/attributes.js.map +1 -0
  56. package/dist/admin/constants/attributes.mjs +38 -0
  57. package/dist/admin/constants/attributes.mjs.map +1 -0
  58. package/dist/admin/constants/collections.js +8 -0
  59. package/dist/admin/constants/collections.js.map +1 -0
  60. package/dist/admin/constants/collections.mjs +5 -0
  61. package/dist/admin/constants/collections.mjs.map +1 -0
  62. package/dist/admin/constants/dragAndDrop.js +13 -0
  63. package/dist/admin/constants/dragAndDrop.js.map +1 -0
  64. package/dist/admin/constants/dragAndDrop.mjs +11 -0
  65. package/dist/admin/constants/dragAndDrop.mjs.map +1 -0
  66. package/dist/admin/constants/hooks.js +27 -0
  67. package/dist/admin/constants/hooks.js.map +1 -0
  68. package/dist/admin/constants/hooks.mjs +25 -0
  69. package/dist/admin/constants/hooks.mjs.map +1 -0
  70. package/dist/admin/constants/plugin.js +14 -0
  71. package/dist/admin/constants/plugin.js.map +1 -0
  72. package/dist/admin/constants/plugin.mjs +11 -0
  73. package/dist/admin/constants/plugin.mjs.map +1 -0
  74. package/dist/admin/content-manager.js +133 -0
  75. package/dist/admin/content-manager.js.map +1 -0
  76. package/dist/admin/content-manager.mjs +131 -0
  77. package/dist/admin/content-manager.mjs.map +1 -0
  78. package/dist/admin/features/DocumentRBAC.js +126 -0
  79. package/dist/admin/features/DocumentRBAC.js.map +1 -0
  80. package/dist/admin/features/DocumentRBAC.mjs +104 -0
  81. package/dist/admin/features/DocumentRBAC.mjs.map +1 -0
  82. package/dist/admin/history/components/HistoryAction.js +61 -0
  83. package/dist/admin/history/components/HistoryAction.js.map +1 -0
  84. package/dist/admin/history/components/HistoryAction.mjs +59 -0
  85. package/dist/admin/history/components/HistoryAction.mjs.map +1 -0
  86. package/dist/admin/history/components/VersionContent.js +264 -0
  87. package/dist/admin/history/components/VersionContent.js.map +1 -0
  88. package/dist/admin/history/components/VersionContent.mjs +242 -0
  89. package/dist/admin/history/components/VersionContent.mjs.map +1 -0
  90. package/dist/admin/history/components/VersionHeader.js +216 -0
  91. package/dist/admin/history/components/VersionHeader.js.map +1 -0
  92. package/dist/admin/history/components/VersionHeader.mjs +195 -0
  93. package/dist/admin/history/components/VersionHeader.mjs.map +1 -0
  94. package/dist/admin/history/components/VersionInputRenderer.js +490 -0
  95. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -0
  96. package/dist/admin/history/components/VersionInputRenderer.mjs +469 -0
  97. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -0
  98. package/dist/admin/history/components/VersionsList.js +210 -0
  99. package/dist/admin/history/components/VersionsList.js.map +1 -0
  100. package/dist/admin/history/components/VersionsList.mjs +208 -0
  101. package/dist/admin/history/components/VersionsList.mjs.map +1 -0
  102. package/dist/admin/history/index.js +21 -0
  103. package/dist/admin/history/index.js.map +1 -0
  104. package/dist/admin/history/index.mjs +19 -0
  105. package/dist/admin/history/index.mjs.map +1 -0
  106. package/dist/admin/history/pages/History.js +220 -0
  107. package/dist/admin/history/pages/History.js.map +1 -0
  108. package/dist/admin/history/pages/History.mjs +197 -0
  109. package/dist/admin/history/pages/History.mjs.map +1 -0
  110. package/dist/admin/history/routes.js +41 -0
  111. package/dist/admin/history/routes.js.map +1 -0
  112. package/dist/admin/history/routes.mjs +20 -0
  113. package/dist/admin/history/routes.mjs.map +1 -0
  114. package/dist/admin/history/services/historyVersion.js +46 -0
  115. package/dist/admin/history/services/historyVersion.js.map +1 -0
  116. package/dist/admin/history/services/historyVersion.mjs +43 -0
  117. package/dist/admin/history/services/historyVersion.mjs.map +1 -0
  118. package/dist/admin/hooks/useContentManagerInitData.js +166 -0
  119. package/dist/admin/hooks/useContentManagerInitData.js.map +1 -0
  120. package/dist/admin/hooks/useContentManagerInitData.mjs +164 -0
  121. package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -0
  122. package/dist/admin/hooks/useContentTypeSchema.js +115 -0
  123. package/dist/admin/hooks/useContentTypeSchema.js.map +1 -0
  124. package/dist/admin/hooks/useContentTypeSchema.mjs +93 -0
  125. package/dist/admin/hooks/useContentTypeSchema.mjs.map +1 -0
  126. package/dist/admin/hooks/useDebounce.js +22 -0
  127. package/dist/admin/hooks/useDebounce.js.map +1 -0
  128. package/dist/admin/hooks/useDebounce.mjs +20 -0
  129. package/dist/admin/hooks/useDebounce.mjs.map +1 -0
  130. package/dist/admin/hooks/useDocument.js +244 -0
  131. package/dist/admin/hooks/useDocument.js.map +1 -0
  132. package/dist/admin/hooks/useDocument.mjs +221 -0
  133. package/dist/admin/hooks/useDocument.mjs.map +1 -0
  134. package/dist/admin/hooks/useDocumentActions.js +607 -0
  135. package/dist/admin/hooks/useDocumentActions.js.map +1 -0
  136. package/dist/admin/hooks/useDocumentActions.mjs +586 -0
  137. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -0
  138. package/dist/admin/hooks/useDocumentContext.js +57 -0
  139. package/dist/admin/hooks/useDocumentContext.js.map +1 -0
  140. package/dist/admin/hooks/useDocumentContext.mjs +36 -0
  141. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -0
  142. package/dist/admin/hooks/useDocumentLayout.js +311 -0
  143. package/dist/admin/hooks/useDocumentLayout.js.map +1 -0
  144. package/dist/admin/hooks/useDocumentLayout.mjs +286 -0
  145. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -0
  146. package/dist/admin/hooks/useDragAndDrop.js +193 -0
  147. package/dist/admin/hooks/useDragAndDrop.js.map +1 -0
  148. package/dist/admin/hooks/useDragAndDrop.mjs +170 -0
  149. package/dist/admin/hooks/useDragAndDrop.mjs.map +1 -0
  150. package/dist/admin/hooks/useKeyboardDragAndDrop.js +94 -0
  151. package/dist/admin/hooks/useKeyboardDragAndDrop.js.map +1 -0
  152. package/dist/admin/hooks/useKeyboardDragAndDrop.mjs +73 -0
  153. package/dist/admin/hooks/useKeyboardDragAndDrop.mjs.map +1 -0
  154. package/dist/admin/hooks/useLazyComponents.js +61 -0
  155. package/dist/admin/hooks/useLazyComponents.js.map +1 -0
  156. package/dist/admin/hooks/useLazyComponents.mjs +59 -0
  157. package/dist/admin/hooks/useLazyComponents.mjs.map +1 -0
  158. package/dist/admin/hooks/useOnce.js +28 -0
  159. package/dist/admin/hooks/useOnce.js.map +1 -0
  160. package/dist/admin/hooks/useOnce.mjs +7 -0
  161. package/dist/admin/hooks/useOnce.mjs.map +1 -0
  162. package/dist/admin/hooks/usePrev.js +16 -0
  163. package/dist/admin/hooks/usePrev.js.map +1 -0
  164. package/dist/admin/hooks/usePrev.mjs +14 -0
  165. package/dist/admin/hooks/usePrev.mjs.map +1 -0
  166. package/dist/admin/index.js +163 -11
  167. package/dist/admin/index.js.map +1 -1
  168. package/dist/admin/index.mjs +150 -10
  169. package/dist/admin/index.mjs.map +1 -1
  170. package/dist/admin/layout.js +142 -0
  171. package/dist/admin/layout.js.map +1 -0
  172. package/dist/admin/layout.mjs +121 -0
  173. package/dist/admin/layout.mjs.map +1 -0
  174. package/dist/admin/modules/app.js +33 -0
  175. package/dist/admin/modules/app.js.map +1 -0
  176. package/dist/admin/modules/app.mjs +30 -0
  177. package/dist/admin/modules/app.mjs.map +1 -0
  178. package/dist/admin/modules/hooks.js +10 -0
  179. package/dist/admin/modules/hooks.js.map +1 -0
  180. package/dist/admin/modules/hooks.mjs +7 -0
  181. package/dist/admin/modules/hooks.mjs.map +1 -0
  182. package/dist/admin/modules/reducers.js +11 -0
  183. package/dist/admin/modules/reducers.js.map +1 -0
  184. package/dist/admin/modules/reducers.mjs +9 -0
  185. package/dist/admin/modules/reducers.mjs.map +1 -0
  186. package/dist/admin/pages/ComponentConfigurationPage.js +248 -0
  187. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -0
  188. package/dist/admin/pages/ComponentConfigurationPage.mjs +226 -0
  189. package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -0
  190. package/dist/admin/pages/EditConfigurationPage.js +164 -0
  191. package/dist/admin/pages/EditConfigurationPage.js.map +1 -0
  192. package/dist/admin/pages/EditConfigurationPage.mjs +142 -0
  193. package/dist/admin/pages/EditConfigurationPage.mjs.map +1 -0
  194. package/dist/admin/pages/EditView/EditViewPage.js +242 -0
  195. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -0
  196. package/dist/admin/pages/EditView/EditViewPage.mjs +238 -0
  197. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -0
  198. package/dist/admin/pages/EditView/components/DocumentActions.js +1159 -0
  199. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -0
  200. package/dist/admin/pages/EditView/components/DocumentActions.mjs +1135 -0
  201. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -0
  202. package/dist/admin/pages/EditView/components/DocumentStatus.js +34 -0
  203. package/dist/admin/pages/EditView/components/DocumentStatus.js.map +1 -0
  204. package/dist/admin/pages/EditView/components/DocumentStatus.mjs +32 -0
  205. package/dist/admin/pages/EditView/components/DocumentStatus.mjs.map +1 -0
  206. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js +120 -0
  207. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js.map +1 -0
  208. package/dist/admin/pages/EditView/components/EditorToolbarObserver.mjs +99 -0
  209. package/dist/admin/pages/EditView/components/EditorToolbarObserver.mjs.map +1 -0
  210. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +224 -0
  211. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -0
  212. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs +201 -0
  213. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs.map +1 -0
  214. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.js +165 -0
  215. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.js.map +1 -0
  216. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.mjs +163 -0
  217. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.mjs.map +1 -0
  218. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +230 -0
  219. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -0
  220. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs +209 -0
  221. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs.map +1 -0
  222. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +232 -0
  223. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -0
  224. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs +211 -0
  225. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs.map +1 -0
  226. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js +360 -0
  227. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js.map +1 -0
  228. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs +358 -0
  229. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs.map +1 -0
  230. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Paragraph.js +95 -0
  231. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Paragraph.js.map +1 -0
  232. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Paragraph.mjs +93 -0
  233. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Paragraph.mjs.map +1 -0
  234. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.js +49 -0
  235. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.js.map +1 -0
  236. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.mjs +47 -0
  237. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.mjs.map +1 -0
  238. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +532 -0
  239. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -0
  240. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +511 -0
  241. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -0
  242. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +217 -0
  243. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -0
  244. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +193 -0
  245. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -0
  246. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js +64 -0
  247. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -0
  248. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.mjs +43 -0
  249. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.mjs.map +1 -0
  250. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +621 -0
  251. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -0
  252. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +598 -0
  253. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -0
  254. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +89 -0
  255. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -0
  256. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +87 -0
  257. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -0
  258. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Modifiers.js +134 -0
  259. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Modifiers.js.map +1 -0
  260. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Modifiers.mjs +132 -0
  261. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Modifiers.mjs.map +1 -0
  262. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withImages.js +17 -0
  263. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withImages.js.map +1 -0
  264. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withImages.mjs +15 -0
  265. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withImages.mjs.map +1 -0
  266. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withLinks.js +75 -0
  267. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withLinks.js.map +1 -0
  268. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withLinks.mjs +73 -0
  269. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withLinks.mjs.map +1 -0
  270. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js +32 -0
  271. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js.map +1 -0
  272. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs +30 -0
  273. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs.map +1 -0
  274. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/constants.js +223 -0
  275. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/constants.js.map +1 -0
  276. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/constants.mjs +221 -0
  277. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/constants.mjs.map +1 -0
  278. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.js +48 -0
  279. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.js.map +1 -0
  280. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.mjs +45 -0
  281. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.mjs.map +1 -0
  282. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/enterKey.js +64 -0
  283. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/enterKey.js.map +1 -0
  284. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/enterKey.mjs +62 -0
  285. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/enterKey.mjs.map +1 -0
  286. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.js +84 -0
  287. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.js.map +1 -0
  288. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.mjs +80 -0
  289. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.mjs.map +1 -0
  290. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/types.js +18 -0
  291. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/types.js.map +1 -0
  292. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/types.mjs +13 -0
  293. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/types.mjs.map +1 -0
  294. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +59 -0
  295. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -0
  296. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +57 -0
  297. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -0
  298. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +106 -0
  299. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -0
  300. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +85 -0
  301. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -0
  302. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +70 -0
  303. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -0
  304. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +68 -0
  305. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -0
  306. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +416 -0
  307. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -0
  308. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +395 -0
  309. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -0
  310. package/dist/admin/pages/EditView/components/FormInputs/ComponentContext.js +21 -0
  311. package/dist/admin/pages/EditView/components/FormInputs/ComponentContext.js.map +1 -0
  312. package/dist/admin/pages/EditView/components/FormInputs/ComponentContext.mjs +18 -0
  313. package/dist/admin/pages/EditView/components/FormInputs/ComponentContext.mjs.map +1 -0
  314. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.js +58 -0
  315. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.js.map +1 -0
  316. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.mjs +56 -0
  317. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.mjs.map +1 -0
  318. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +103 -0
  319. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -0
  320. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +101 -0
  321. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -0
  322. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +56 -0
  323. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -0
  324. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +54 -0
  325. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -0
  326. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +326 -0
  327. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -0
  328. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +305 -0
  329. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -0
  330. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicZoneLabel.js +73 -0
  331. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicZoneLabel.js.map +1 -0
  332. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicZoneLabel.mjs +71 -0
  333. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicZoneLabel.mjs.map +1 -0
  334. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +252 -0
  335. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -0
  336. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +230 -0
  337. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -0
  338. package/dist/admin/pages/EditView/components/FormInputs/NotAllowed.js +38 -0
  339. package/dist/admin/pages/EditView/components/FormInputs/NotAllowed.js.map +1 -0
  340. package/dist/admin/pages/EditView/components/FormInputs/NotAllowed.mjs +36 -0
  341. package/dist/admin/pages/EditView/components/FormInputs/NotAllowed.mjs.map +1 -0
  342. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +621 -0
  343. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -0
  344. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +597 -0
  345. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -0
  346. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +926 -0
  347. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -0
  348. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +902 -0
  349. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -0
  350. package/dist/admin/pages/EditView/components/FormInputs/UID.js +294 -0
  351. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -0
  352. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +273 -0
  353. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -0
  354. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +463 -0
  355. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -0
  356. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +442 -0
  357. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -0
  358. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +114 -0
  359. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -0
  360. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +111 -0
  361. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -0
  362. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js +119 -0
  363. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js.map +1 -0
  364. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.mjs +98 -0
  365. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.mjs.map +1 -0
  366. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +209 -0
  367. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -0
  368. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs +188 -0
  369. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs.map +1 -0
  370. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.js +39 -0
  371. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.js.map +1 -0
  372. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.mjs +37 -0
  373. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.mjs.map +1 -0
  374. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +528 -0
  375. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -0
  376. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +526 -0
  377. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -0
  378. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.js +42 -0
  379. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.js.map +1 -0
  380. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.mjs +40 -0
  381. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.mjs.map +1 -0
  382. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js +84 -0
  383. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js.map +1 -0
  384. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.mjs +82 -0
  385. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.mjs.map +1 -0
  386. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js +45 -0
  387. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js.map +1 -0
  388. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.mjs +43 -0
  389. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.mjs.map +1 -0
  390. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.js +364 -0
  391. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.js.map +1 -0
  392. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.mjs +355 -0
  393. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.mjs.map +1 -0
  394. package/dist/admin/pages/EditView/components/FormLayout.js +102 -0
  395. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -0
  396. package/dist/admin/pages/EditView/components/FormLayout.mjs +97 -0
  397. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -0
  398. package/dist/admin/pages/EditView/components/Header.js +472 -0
  399. package/dist/admin/pages/EditView/components/Header.js.map +1 -0
  400. package/dist/admin/pages/EditView/components/Header.mjs +450 -0
  401. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -0
  402. package/dist/admin/pages/EditView/components/InputRenderer.js +249 -0
  403. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -0
  404. package/dist/admin/pages/EditView/components/InputRenderer.mjs +227 -0
  405. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -0
  406. package/dist/admin/pages/EditView/components/Panels.js +141 -0
  407. package/dist/admin/pages/EditView/components/Panels.js.map +1 -0
  408. package/dist/admin/pages/EditView/components/Panels.mjs +119 -0
  409. package/dist/admin/pages/EditView/components/Panels.mjs.map +1 -0
  410. package/dist/admin/pages/EditView/utils/data.js +135 -0
  411. package/dist/admin/pages/EditView/utils/data.js.map +1 -0
  412. package/dist/admin/pages/EditView/utils/data.mjs +129 -0
  413. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -0
  414. package/dist/admin/pages/EditView/utils/forms.js +32 -0
  415. package/dist/admin/pages/EditView/utils/forms.js.map +1 -0
  416. package/dist/admin/pages/EditView/utils/forms.mjs +30 -0
  417. package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -0
  418. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +178 -0
  419. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -0
  420. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +156 -0
  421. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -0
  422. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +200 -0
  423. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -0
  424. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +179 -0
  425. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -0
  426. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +158 -0
  427. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -0
  428. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +137 -0
  429. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -0
  430. package/dist/admin/pages/ListConfiguration/components/Header.js +45 -0
  431. package/dist/admin/pages/ListConfiguration/components/Header.js.map +1 -0
  432. package/dist/admin/pages/ListConfiguration/components/Header.mjs +43 -0
  433. package/dist/admin/pages/ListConfiguration/components/Header.mjs.map +1 -0
  434. package/dist/admin/pages/ListConfiguration/components/Settings.js +201 -0
  435. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -0
  436. package/dist/admin/pages/ListConfiguration/components/Settings.mjs +180 -0
  437. package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -0
  438. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +171 -0
  439. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -0
  440. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +150 -0
  441. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -0
  442. package/dist/admin/pages/ListView/ListViewPage.js +510 -0
  443. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -0
  444. package/dist/admin/pages/ListView/ListViewPage.mjs +488 -0
  445. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -0
  446. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js +88 -0
  447. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js.map +1 -0
  448. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs +86 -0
  449. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs.map +1 -0
  450. package/dist/admin/pages/ListView/components/BulkActions/Actions.js +233 -0
  451. package/dist/admin/pages/ListView/components/BulkActions/Actions.js.map +1 -0
  452. package/dist/admin/pages/ListView/components/BulkActions/Actions.mjs +210 -0
  453. package/dist/admin/pages/ListView/components/BulkActions/Actions.mjs.map +1 -0
  454. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +172 -0
  455. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -0
  456. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +150 -0
  457. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -0
  458. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +568 -0
  459. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -0
  460. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +546 -0
  461. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -0
  462. package/dist/admin/pages/ListView/components/Filters.js +243 -0
  463. package/dist/admin/pages/ListView/components/Filters.js.map +1 -0
  464. package/dist/admin/pages/ListView/components/Filters.mjs +222 -0
  465. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -0
  466. package/dist/admin/pages/ListView/components/TableActions.js +217 -0
  467. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -0
  468. package/dist/admin/pages/ListView/components/TableActions.mjs +195 -0
  469. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -0
  470. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +130 -0
  471. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -0
  472. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs +128 -0
  473. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs.map +1 -0
  474. package/dist/admin/pages/ListView/components/TableCells/CellValue.js +53 -0
  475. package/dist/admin/pages/ListView/components/TableCells/CellValue.js.map +1 -0
  476. package/dist/admin/pages/ListView/components/TableCells/CellValue.mjs +51 -0
  477. package/dist/admin/pages/ListView/components/TableCells/CellValue.mjs.map +1 -0
  478. package/dist/admin/pages/ListView/components/TableCells/Components.js +65 -0
  479. package/dist/admin/pages/ListView/components/TableCells/Components.js.map +1 -0
  480. package/dist/admin/pages/ListView/components/TableCells/Components.mjs +62 -0
  481. package/dist/admin/pages/ListView/components/TableCells/Components.mjs.map +1 -0
  482. package/dist/admin/pages/ListView/components/TableCells/Media.js +76 -0
  483. package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -0
  484. package/dist/admin/pages/ListView/components/TableCells/Media.mjs +73 -0
  485. package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -0
  486. package/dist/admin/pages/ListView/components/TableCells/Relations.js +128 -0
  487. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -0
  488. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs +106 -0
  489. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -0
  490. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js +154 -0
  491. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js.map +1 -0
  492. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs +152 -0
  493. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs.map +1 -0
  494. package/dist/admin/pages/NoContentTypePage.js +50 -0
  495. package/dist/admin/pages/NoContentTypePage.js.map +1 -0
  496. package/dist/admin/pages/NoContentTypePage.mjs +48 -0
  497. package/dist/admin/pages/NoContentTypePage.mjs.map +1 -0
  498. package/dist/admin/pages/NoPermissionsPage.js +26 -0
  499. package/dist/admin/pages/NoPermissionsPage.js.map +1 -0
  500. package/dist/admin/pages/NoPermissionsPage.mjs +24 -0
  501. package/dist/admin/pages/NoPermissionsPage.mjs.map +1 -0
  502. package/dist/admin/preview/components/PreviewHeader.js +261 -0
  503. package/dist/admin/preview/components/PreviewHeader.js.map +1 -0
  504. package/dist/admin/preview/components/PreviewHeader.mjs +259 -0
  505. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -0
  506. package/dist/admin/preview/components/PreviewSidePanel.js +91 -0
  507. package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -0
  508. package/dist/admin/preview/components/PreviewSidePanel.mjs +89 -0
  509. package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -0
  510. package/dist/admin/preview/index.js +15 -0
  511. package/dist/admin/preview/index.js.map +1 -0
  512. package/dist/admin/preview/index.mjs +13 -0
  513. package/dist/admin/preview/index.mjs.map +1 -0
  514. package/dist/admin/preview/pages/Preview.js +286 -0
  515. package/dist/admin/preview/pages/Preview.js.map +1 -0
  516. package/dist/admin/preview/pages/Preview.mjs +264 -0
  517. package/dist/admin/preview/pages/Preview.mjs.map +1 -0
  518. package/dist/admin/preview/routes.js +39 -0
  519. package/dist/admin/preview/routes.js.map +1 -0
  520. package/dist/admin/preview/routes.mjs +18 -0
  521. package/dist/admin/preview/routes.mjs.map +1 -0
  522. package/dist/admin/preview/services/preview.js +23 -0
  523. package/dist/admin/preview/services/preview.js.map +1 -0
  524. package/dist/admin/preview/services/preview.mjs +21 -0
  525. package/dist/admin/preview/services/preview.mjs.map +1 -0
  526. package/dist/admin/router.js +86 -0
  527. package/dist/admin/router.js.map +1 -0
  528. package/dist/admin/router.mjs +82 -0
  529. package/dist/admin/router.mjs.map +1 -0
  530. package/dist/admin/services/api.js +20 -0
  531. package/dist/admin/services/api.js.map +1 -0
  532. package/dist/admin/services/api.mjs +18 -0
  533. package/dist/admin/services/api.mjs.map +1 -0
  534. package/dist/admin/services/components.js +42 -0
  535. package/dist/admin/services/components.js.map +1 -0
  536. package/dist/admin/services/components.mjs +39 -0
  537. package/dist/admin/services/components.mjs.map +1 -0
  538. package/dist/admin/services/contentTypes.js +63 -0
  539. package/dist/admin/services/contentTypes.js.map +1 -0
  540. package/dist/admin/services/contentTypes.mjs +59 -0
  541. package/dist/admin/services/contentTypes.mjs.map +1 -0
  542. package/dist/admin/services/documents.js +390 -0
  543. package/dist/admin/services/documents.js.map +1 -0
  544. package/dist/admin/services/documents.mjs +373 -0
  545. package/dist/admin/services/documents.mjs.map +1 -0
  546. package/dist/admin/services/homepage.js +30 -0
  547. package/dist/admin/services/homepage.js.map +1 -0
  548. package/dist/admin/services/homepage.mjs +28 -0
  549. package/dist/admin/services/homepage.mjs.map +1 -0
  550. package/dist/admin/services/init.js +19 -0
  551. package/dist/admin/services/init.js.map +1 -0
  552. package/dist/admin/services/init.mjs +17 -0
  553. package/dist/admin/services/init.mjs.map +1 -0
  554. package/dist/admin/services/relations.js +144 -0
  555. package/dist/admin/services/relations.js.map +1 -0
  556. package/dist/admin/services/relations.mjs +141 -0
  557. package/dist/admin/services/relations.mjs.map +1 -0
  558. package/dist/admin/services/uid.js +54 -0
  559. package/dist/admin/services/uid.js.map +1 -0
  560. package/dist/admin/services/uid.mjs +50 -0
  561. package/dist/admin/services/uid.mjs.map +1 -0
  562. package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +6 -4
  563. package/dist/admin/src/components/InjectionZone.d.ts +7 -1
  564. package/dist/admin/src/components/Widgets.d.ts +3 -0
  565. package/dist/admin/src/content-manager.d.ts +6 -2
  566. package/dist/admin/src/exports.d.ts +2 -1
  567. package/dist/admin/src/features/DocumentRBAC.d.ts +4 -3
  568. package/dist/admin/src/history/index.d.ts +3 -0
  569. package/dist/admin/src/history/pages/History.d.ts +1 -1
  570. package/dist/admin/src/history/services/historyVersion.d.ts +2 -2
  571. package/dist/admin/src/hooks/useDocument.d.ts +52 -2
  572. package/dist/admin/src/hooks/useDocumentActions.d.ts +2 -1
  573. package/dist/admin/src/hooks/useDocumentContext.d.ts +30 -0
  574. package/dist/admin/src/index.d.ts +2 -0
  575. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
  576. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +4 -2
  577. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +3 -3
  578. package/dist/admin/src/pages/EditView/components/EditorToolbarObserver.d.ts +11 -0
  579. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +55 -0
  580. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
  581. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +5 -0
  582. package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -1
  583. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
  584. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +5 -2
  585. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +74 -0
  586. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +45 -0
  587. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  588. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +2 -2
  589. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.d.ts +1 -2
  590. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +4 -48
  591. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +33 -1
  592. package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
  593. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +7 -4
  594. package/dist/admin/src/pages/EditView/utils/data.d.ts +1 -0
  595. package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
  596. package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
  597. package/dist/admin/src/preview/index.d.ts +3 -0
  598. package/dist/admin/src/preview/pages/Preview.d.ts +14 -0
  599. package/dist/admin/src/preview/routes.d.ts +3 -0
  600. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  601. package/dist/admin/src/router.d.ts +1 -1
  602. package/dist/admin/src/services/api.d.ts +1 -1
  603. package/dist/admin/src/services/components.d.ts +2 -2
  604. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  605. package/dist/admin/src/services/documents.d.ts +19 -20
  606. package/dist/admin/src/services/homepage.d.ts +5 -0
  607. package/dist/admin/src/services/init.d.ts +1 -1
  608. package/dist/admin/src/services/relations.d.ts +2 -2
  609. package/dist/admin/src/services/uid.d.ts +3 -3
  610. package/dist/admin/src/utils/validation.d.ts +4 -1
  611. package/dist/admin/translations/ar.json.js +229 -0
  612. package/dist/admin/translations/ar.json.js.map +1 -0
  613. package/dist/admin/translations/ar.json.mjs +222 -0
  614. package/dist/admin/translations/ar.json.mjs.map +1 -0
  615. package/dist/admin/translations/ca.json.js +204 -0
  616. package/dist/admin/translations/ca.json.js.map +1 -0
  617. package/dist/admin/translations/ca.json.mjs +197 -0
  618. package/dist/admin/translations/ca.json.mjs.map +1 -0
  619. package/dist/admin/translations/cs.json.js +128 -0
  620. package/dist/admin/translations/cs.json.js.map +1 -0
  621. package/dist/admin/translations/cs.json.mjs +122 -0
  622. package/dist/admin/translations/cs.json.mjs.map +1 -0
  623. package/dist/admin/translations/de.json.js +202 -0
  624. package/dist/admin/translations/de.json.js.map +1 -0
  625. package/dist/admin/translations/de.json.mjs +195 -0
  626. package/dist/admin/translations/de.json.mjs.map +1 -0
  627. package/dist/admin/translations/en.json.js +322 -0
  628. package/dist/admin/translations/en.json.js.map +1 -0
  629. package/dist/admin/translations/en.json.mjs +315 -0
  630. package/dist/admin/translations/en.json.mjs.map +1 -0
  631. package/dist/admin/translations/es.json.js +199 -0
  632. package/dist/admin/translations/es.json.js.map +1 -0
  633. package/dist/admin/translations/es.json.mjs +192 -0
  634. package/dist/admin/translations/es.json.mjs.map +1 -0
  635. package/dist/admin/translations/eu.json.js +205 -0
  636. package/dist/admin/translations/eu.json.js.map +1 -0
  637. package/dist/admin/translations/eu.json.mjs +198 -0
  638. package/dist/admin/translations/eu.json.mjs.map +1 -0
  639. package/dist/admin/translations/fr.json.js +222 -0
  640. package/dist/admin/translations/fr.json.js.map +1 -0
  641. package/dist/admin/translations/fr.json.mjs +215 -0
  642. package/dist/admin/translations/fr.json.mjs.map +1 -0
  643. package/dist/admin/translations/gu.json.js +203 -0
  644. package/dist/admin/translations/gu.json.js.map +1 -0
  645. package/dist/admin/translations/gu.json.mjs +196 -0
  646. package/dist/admin/translations/gu.json.mjs.map +1 -0
  647. package/dist/admin/translations/hi.json.js +203 -0
  648. package/dist/admin/translations/hi.json.js.map +1 -0
  649. package/dist/admin/translations/hi.json.mjs +196 -0
  650. package/dist/admin/translations/hi.json.mjs.map +1 -0
  651. package/dist/admin/translations/hu.json.js +205 -0
  652. package/dist/admin/translations/hu.json.js.map +1 -0
  653. package/dist/admin/translations/hu.json.mjs +198 -0
  654. package/dist/admin/translations/hu.json.mjs.map +1 -0
  655. package/dist/admin/translations/id.json.js +163 -0
  656. package/dist/admin/translations/id.json.js.map +1 -0
  657. package/dist/admin/translations/id.json.mjs +156 -0
  658. package/dist/admin/translations/id.json.mjs.map +1 -0
  659. package/dist/admin/translations/it.json.js +165 -0
  660. package/dist/admin/translations/it.json.js.map +1 -0
  661. package/dist/admin/translations/it.json.mjs +158 -0
  662. package/dist/admin/translations/it.json.mjs.map +1 -0
  663. package/dist/admin/translations/ja.json.js +199 -0
  664. package/dist/admin/translations/ja.json.js.map +1 -0
  665. package/dist/admin/translations/ja.json.mjs +192 -0
  666. package/dist/admin/translations/ja.json.mjs.map +1 -0
  667. package/dist/admin/translations/ko.json.js +198 -0
  668. package/dist/admin/translations/ko.json.js.map +1 -0
  669. package/dist/admin/translations/ko.json.mjs +191 -0
  670. package/dist/admin/translations/ko.json.mjs.map +1 -0
  671. package/dist/admin/translations/ml.json.js +203 -0
  672. package/dist/admin/translations/ml.json.js.map +1 -0
  673. package/dist/admin/translations/ml.json.mjs +196 -0
  674. package/dist/admin/translations/ml.json.mjs.map +1 -0
  675. package/dist/admin/translations/ms.json.js +147 -0
  676. package/dist/admin/translations/ms.json.js.map +1 -0
  677. package/dist/admin/translations/ms.json.mjs +140 -0
  678. package/dist/admin/translations/ms.json.mjs.map +1 -0
  679. package/dist/admin/translations/nl.json.js +205 -0
  680. package/dist/admin/translations/nl.json.js.map +1 -0
  681. package/dist/admin/translations/nl.json.mjs +198 -0
  682. package/dist/admin/translations/nl.json.mjs.map +1 -0
  683. package/dist/admin/translations/pl.json.js +202 -0
  684. package/dist/admin/translations/pl.json.js.map +1 -0
  685. package/dist/admin/translations/pl.json.mjs +195 -0
  686. package/dist/admin/translations/pl.json.mjs.map +1 -0
  687. package/dist/admin/translations/pt-BR.json.js +204 -0
  688. package/dist/admin/translations/pt-BR.json.js.map +1 -0
  689. package/dist/admin/translations/pt-BR.json.mjs +197 -0
  690. package/dist/admin/translations/pt-BR.json.mjs.map +1 -0
  691. package/dist/admin/translations/pt.json.js +98 -0
  692. package/dist/admin/translations/pt.json.js.map +1 -0
  693. package/dist/admin/translations/pt.json.mjs +93 -0
  694. package/dist/admin/translations/pt.json.mjs.map +1 -0
  695. package/dist/admin/translations/ru.json.js +241 -0
  696. package/dist/admin/translations/ru.json.js.map +1 -0
  697. package/dist/admin/translations/ru.json.mjs +234 -0
  698. package/dist/admin/translations/ru.json.mjs.map +1 -0
  699. package/dist/admin/translations/sa.json.js +203 -0
  700. package/dist/admin/translations/sa.json.js.map +1 -0
  701. package/dist/admin/translations/sa.json.mjs +196 -0
  702. package/dist/admin/translations/sa.json.mjs.map +1 -0
  703. package/dist/admin/translations/sk.json.js +205 -0
  704. package/dist/admin/translations/sk.json.js.map +1 -0
  705. package/dist/admin/translations/sk.json.mjs +198 -0
  706. package/dist/admin/translations/sk.json.mjs.map +1 -0
  707. package/dist/admin/translations/sv.json.js +205 -0
  708. package/dist/admin/translations/sv.json.js.map +1 -0
  709. package/dist/admin/translations/sv.json.mjs +198 -0
  710. package/dist/admin/translations/sv.json.mjs.map +1 -0
  711. package/dist/admin/translations/th.json.js +151 -0
  712. package/dist/admin/translations/th.json.js.map +1 -0
  713. package/dist/admin/translations/th.json.mjs +144 -0
  714. package/dist/admin/translations/th.json.mjs.map +1 -0
  715. package/dist/admin/translations/tr.json.js +202 -0
  716. package/dist/admin/translations/tr.json.js.map +1 -0
  717. package/dist/admin/translations/tr.json.mjs +195 -0
  718. package/dist/admin/translations/tr.json.mjs.map +1 -0
  719. package/dist/admin/translations/uk.json.js +320 -0
  720. package/dist/admin/translations/uk.json.js.map +1 -0
  721. package/dist/admin/translations/uk.json.mjs +313 -0
  722. package/dist/admin/translations/uk.json.mjs.map +1 -0
  723. package/dist/admin/translations/vi.json.js +114 -0
  724. package/dist/admin/translations/vi.json.js.map +1 -0
  725. package/dist/admin/translations/vi.json.mjs +108 -0
  726. package/dist/admin/translations/vi.json.mjs.map +1 -0
  727. package/dist/admin/translations/zh-Hans.json.js +956 -0
  728. package/dist/admin/translations/zh-Hans.json.js.map +1 -0
  729. package/dist/admin/translations/zh-Hans.json.mjs +935 -0
  730. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -0
  731. package/dist/admin/translations/zh.json.js +212 -0
  732. package/dist/admin/translations/zh.json.js.map +1 -0
  733. package/dist/admin/translations/zh.json.mjs +205 -0
  734. package/dist/admin/translations/zh.json.mjs.map +1 -0
  735. package/dist/admin/utils/api.js +22 -0
  736. package/dist/admin/utils/api.js.map +1 -0
  737. package/dist/admin/utils/api.mjs +19 -0
  738. package/dist/admin/utils/api.mjs.map +1 -0
  739. package/dist/admin/utils/attributes.js +34 -0
  740. package/dist/admin/utils/attributes.js.map +1 -0
  741. package/dist/admin/utils/attributes.mjs +31 -0
  742. package/dist/admin/utils/attributes.mjs.map +1 -0
  743. package/dist/admin/utils/objects.js +78 -0
  744. package/dist/admin/utils/objects.js.map +1 -0
  745. package/dist/admin/utils/objects.mjs +73 -0
  746. package/dist/admin/utils/objects.mjs.map +1 -0
  747. package/dist/admin/utils/relations.js +19 -0
  748. package/dist/admin/utils/relations.js.map +1 -0
  749. package/dist/admin/utils/relations.mjs +17 -0
  750. package/dist/admin/utils/relations.mjs.map +1 -0
  751. package/dist/admin/utils/strings.js +6 -0
  752. package/dist/admin/utils/strings.js.map +1 -0
  753. package/dist/admin/utils/strings.mjs +4 -0
  754. package/dist/admin/utils/strings.mjs.map +1 -0
  755. package/dist/admin/utils/translations.js +13 -0
  756. package/dist/admin/utils/translations.js.map +1 -0
  757. package/dist/admin/utils/translations.mjs +10 -0
  758. package/dist/admin/utils/translations.mjs.map +1 -0
  759. package/dist/admin/utils/urls.js +8 -0
  760. package/dist/admin/utils/urls.js.map +1 -0
  761. package/dist/admin/utils/urls.mjs +6 -0
  762. package/dist/admin/utils/urls.mjs.map +1 -0
  763. package/dist/admin/utils/users.js +17 -0
  764. package/dist/admin/utils/users.js.map +1 -0
  765. package/dist/admin/utils/users.mjs +15 -0
  766. package/dist/admin/utils/users.mjs.map +1 -0
  767. package/dist/admin/utils/validation.js +290 -0
  768. package/dist/admin/utils/validation.js.map +1 -0
  769. package/dist/admin/utils/validation.mjs +269 -0
  770. package/dist/admin/utils/validation.mjs.map +1 -0
  771. package/dist/server/bootstrap.js +25 -0
  772. package/dist/server/bootstrap.js.map +1 -0
  773. package/dist/server/bootstrap.mjs +23 -0
  774. package/dist/server/bootstrap.mjs.map +1 -0
  775. package/dist/server/constants/index.js +9 -0
  776. package/dist/server/constants/index.js.map +1 -0
  777. package/dist/server/constants/index.mjs +7 -0
  778. package/dist/server/constants/index.mjs.map +1 -0
  779. package/dist/server/controllers/collection-types.js +647 -0
  780. package/dist/server/controllers/collection-types.js.map +1 -0
  781. package/dist/server/controllers/collection-types.mjs +645 -0
  782. package/dist/server/controllers/collection-types.mjs.map +1 -0
  783. package/dist/server/controllers/components.js +60 -0
  784. package/dist/server/controllers/components.js.map +1 -0
  785. package/dist/server/controllers/components.mjs +58 -0
  786. package/dist/server/controllers/components.mjs.map +1 -0
  787. package/dist/server/controllers/content-types.js +108 -0
  788. package/dist/server/controllers/content-types.js.map +1 -0
  789. package/dist/server/controllers/content-types.mjs +106 -0
  790. package/dist/server/controllers/content-types.mjs.map +1 -0
  791. package/dist/server/controllers/index.js +28 -0
  792. package/dist/server/controllers/index.js.map +1 -0
  793. package/dist/server/controllers/index.mjs +26 -0
  794. package/dist/server/controllers/index.mjs.map +1 -0
  795. package/dist/server/controllers/init.js +22 -0
  796. package/dist/server/controllers/init.js.map +1 -0
  797. package/dist/server/controllers/init.mjs +20 -0
  798. package/dist/server/controllers/init.mjs.map +1 -0
  799. package/dist/server/controllers/relations.js +432 -0
  800. package/dist/server/controllers/relations.js.map +1 -0
  801. package/dist/server/controllers/relations.mjs +430 -0
  802. package/dist/server/controllers/relations.mjs.map +1 -0
  803. package/dist/server/controllers/single-types.js +302 -0
  804. package/dist/server/controllers/single-types.js.map +1 -0
  805. package/dist/server/controllers/single-types.mjs +300 -0
  806. package/dist/server/controllers/single-types.mjs.map +1 -0
  807. package/dist/server/controllers/uid.js +48 -0
  808. package/dist/server/controllers/uid.js.map +1 -0
  809. package/dist/server/controllers/uid.mjs +46 -0
  810. package/dist/server/controllers/uid.mjs.map +1 -0
  811. package/dist/server/controllers/utils/clone.js +138 -0
  812. package/dist/server/controllers/utils/clone.js.map +1 -0
  813. package/dist/server/controllers/utils/clone.mjs +135 -0
  814. package/dist/server/controllers/utils/clone.mjs.map +1 -0
  815. package/dist/server/controllers/utils/metadata.js +26 -0
  816. package/dist/server/controllers/utils/metadata.js.map +1 -0
  817. package/dist/server/controllers/utils/metadata.mjs +24 -0
  818. package/dist/server/controllers/utils/metadata.mjs.map +1 -0
  819. package/dist/server/controllers/validation/dimensions.js +41 -0
  820. package/dist/server/controllers/validation/dimensions.js.map +1 -0
  821. package/dist/server/controllers/validation/dimensions.mjs +39 -0
  822. package/dist/server/controllers/validation/dimensions.mjs.map +1 -0
  823. package/dist/server/controllers/validation/index.js +56 -0
  824. package/dist/server/controllers/validation/index.js.map +1 -0
  825. package/dist/server/controllers/validation/index.mjs +50 -0
  826. package/dist/server/controllers/validation/index.mjs.map +1 -0
  827. package/dist/server/controllers/validation/model-configuration.js +81 -0
  828. package/dist/server/controllers/validation/model-configuration.js.map +1 -0
  829. package/dist/server/controllers/validation/model-configuration.mjs +79 -0
  830. package/dist/server/controllers/validation/model-configuration.mjs.map +1 -0
  831. package/dist/server/controllers/validation/relations.js +37 -0
  832. package/dist/server/controllers/validation/relations.js.map +1 -0
  833. package/dist/server/controllers/validation/relations.mjs +34 -0
  834. package/dist/server/controllers/validation/relations.mjs.map +1 -0
  835. package/dist/server/destroy.js +12 -0
  836. package/dist/server/destroy.js.map +1 -0
  837. package/dist/server/destroy.mjs +10 -0
  838. package/dist/server/destroy.mjs.map +1 -0
  839. package/dist/server/history/constants.js +16 -0
  840. package/dist/server/history/constants.js.map +1 -0
  841. package/dist/server/history/constants.mjs +13 -0
  842. package/dist/server/history/constants.mjs.map +1 -0
  843. package/dist/server/history/controllers/history-version.js +107 -0
  844. package/dist/server/history/controllers/history-version.js.map +1 -0
  845. package/dist/server/history/controllers/history-version.mjs +105 -0
  846. package/dist/server/history/controllers/history-version.mjs.map +1 -0
  847. package/dist/server/history/controllers/index.js +10 -0
  848. package/dist/server/history/controllers/index.js.map +1 -0
  849. package/dist/server/history/controllers/index.mjs +8 -0
  850. package/dist/server/history/controllers/index.mjs.map +1 -0
  851. package/dist/server/history/controllers/validation/history-version.js +31 -0
  852. package/dist/server/history/controllers/validation/history-version.js.map +1 -0
  853. package/dist/server/history/controllers/validation/history-version.mjs +10 -0
  854. package/dist/server/history/controllers/validation/history-version.mjs.map +1 -0
  855. package/dist/server/history/index.js +42 -0
  856. package/dist/server/history/index.js.map +1 -0
  857. package/dist/server/history/index.mjs +40 -0
  858. package/dist/server/history/index.mjs.map +1 -0
  859. package/dist/server/history/models/history-version.js +59 -0
  860. package/dist/server/history/models/history-version.js.map +1 -0
  861. package/dist/server/history/models/history-version.mjs +57 -0
  862. package/dist/server/history/models/history-version.mjs.map +1 -0
  863. package/dist/server/history/routes/history-version.js +36 -0
  864. package/dist/server/history/routes/history-version.js.map +1 -0
  865. package/dist/server/history/routes/history-version.mjs +34 -0
  866. package/dist/server/history/routes/history-version.mjs.map +1 -0
  867. package/dist/server/history/routes/index.js +13 -0
  868. package/dist/server/history/routes/index.js.map +1 -0
  869. package/dist/server/history/routes/index.mjs +11 -0
  870. package/dist/server/history/routes/index.mjs.map +1 -0
  871. package/dist/server/history/services/history.js +203 -0
  872. package/dist/server/history/services/history.js.map +1 -0
  873. package/dist/server/history/services/history.mjs +201 -0
  874. package/dist/server/history/services/history.mjs.map +1 -0
  875. package/dist/server/history/services/index.js +12 -0
  876. package/dist/server/history/services/index.js.map +1 -0
  877. package/dist/server/history/services/index.mjs +10 -0
  878. package/dist/server/history/services/index.mjs.map +1 -0
  879. package/dist/server/history/services/lifecycles.js +156 -0
  880. package/dist/server/history/services/lifecycles.js.map +1 -0
  881. package/dist/server/history/services/lifecycles.mjs +154 -0
  882. package/dist/server/history/services/lifecycles.mjs.map +1 -0
  883. package/dist/server/history/services/utils.js +281 -0
  884. package/dist/server/history/services/utils.js.map +1 -0
  885. package/dist/server/history/services/utils.mjs +279 -0
  886. package/dist/server/history/services/utils.mjs.map +1 -0
  887. package/dist/server/history/utils.js +9 -0
  888. package/dist/server/history/utils.js.map +1 -0
  889. package/dist/server/history/utils.mjs +7 -0
  890. package/dist/server/history/utils.mjs.map +1 -0
  891. package/dist/server/homepage/controllers/homepage.js +57 -0
  892. package/dist/server/homepage/controllers/homepage.js.map +1 -0
  893. package/dist/server/homepage/controllers/homepage.mjs +36 -0
  894. package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
  895. package/dist/server/homepage/controllers/index.js +10 -0
  896. package/dist/server/homepage/controllers/index.js.map +1 -0
  897. package/dist/server/homepage/controllers/index.mjs +8 -0
  898. package/dist/server/homepage/controllers/index.mjs.map +1 -0
  899. package/dist/server/homepage/index.js +14 -0
  900. package/dist/server/homepage/index.js.map +1 -0
  901. package/dist/server/homepage/index.mjs +12 -0
  902. package/dist/server/homepage/index.mjs.map +1 -0
  903. package/dist/server/homepage/routes/homepage.js +25 -0
  904. package/dist/server/homepage/routes/homepage.js.map +1 -0
  905. package/dist/server/homepage/routes/homepage.mjs +23 -0
  906. package/dist/server/homepage/routes/homepage.mjs.map +1 -0
  907. package/dist/server/homepage/routes/index.js +13 -0
  908. package/dist/server/homepage/routes/index.js.map +1 -0
  909. package/dist/server/homepage/routes/index.mjs +11 -0
  910. package/dist/server/homepage/routes/index.mjs.map +1 -0
  911. package/dist/server/homepage/services/homepage.js +157 -0
  912. package/dist/server/homepage/services/homepage.js.map +1 -0
  913. package/dist/server/homepage/services/homepage.mjs +155 -0
  914. package/dist/server/homepage/services/homepage.mjs.map +1 -0
  915. package/dist/server/homepage/services/index.js +10 -0
  916. package/dist/server/homepage/services/index.js.map +1 -0
  917. package/dist/server/homepage/services/index.mjs +8 -0
  918. package/dist/server/homepage/services/index.mjs.map +1 -0
  919. package/dist/server/index.js +22 -4365
  920. package/dist/server/index.js.map +1 -1
  921. package/dist/server/index.mjs +21 -4342
  922. package/dist/server/index.mjs.map +1 -1
  923. package/dist/server/middlewares/routing.js +40 -0
  924. package/dist/server/middlewares/routing.js.map +1 -0
  925. package/dist/server/middlewares/routing.mjs +38 -0
  926. package/dist/server/middlewares/routing.mjs.map +1 -0
  927. package/dist/server/policies/hasPermissions.js +24 -0
  928. package/dist/server/policies/hasPermissions.js.map +1 -0
  929. package/dist/server/policies/hasPermissions.mjs +22 -0
  930. package/dist/server/policies/hasPermissions.mjs.map +1 -0
  931. package/dist/server/policies/index.js +10 -0
  932. package/dist/server/policies/index.js.map +1 -0
  933. package/dist/server/policies/index.mjs +8 -0
  934. package/dist/server/policies/index.mjs.map +1 -0
  935. package/dist/server/preview/controllers/index.js +10 -0
  936. package/dist/server/preview/controllers/index.js.map +1 -0
  937. package/dist/server/preview/controllers/index.mjs +8 -0
  938. package/dist/server/preview/controllers/index.mjs.map +1 -0
  939. package/dist/server/preview/controllers/preview.js +34 -0
  940. package/dist/server/preview/controllers/preview.js.map +1 -0
  941. package/dist/server/preview/controllers/preview.mjs +32 -0
  942. package/dist/server/preview/controllers/preview.mjs.map +1 -0
  943. package/dist/server/preview/controllers/validation/preview.js +70 -0
  944. package/dist/server/preview/controllers/validation/preview.js.map +1 -0
  945. package/dist/server/preview/controllers/validation/preview.mjs +49 -0
  946. package/dist/server/preview/controllers/validation/preview.mjs.map +1 -0
  947. package/dist/server/preview/index.js +27 -0
  948. package/dist/server/preview/index.js.map +1 -0
  949. package/dist/server/preview/index.mjs +25 -0
  950. package/dist/server/preview/index.mjs.map +1 -0
  951. package/dist/server/preview/routes/index.js +13 -0
  952. package/dist/server/preview/routes/index.js.map +1 -0
  953. package/dist/server/preview/routes/index.mjs +11 -0
  954. package/dist/server/preview/routes/index.mjs.map +1 -0
  955. package/dist/server/preview/routes/preview.js +25 -0
  956. package/dist/server/preview/routes/preview.js.map +1 -0
  957. package/dist/server/preview/routes/preview.mjs +23 -0
  958. package/dist/server/preview/routes/preview.mjs.map +1 -0
  959. package/dist/server/preview/services/index.js +12 -0
  960. package/dist/server/preview/services/index.js.map +1 -0
  961. package/dist/server/preview/services/index.mjs +10 -0
  962. package/dist/server/preview/services/index.mjs.map +1 -0
  963. package/dist/server/preview/services/preview-config.js +91 -0
  964. package/dist/server/preview/services/preview-config.js.map +1 -0
  965. package/dist/server/preview/services/preview-config.mjs +89 -0
  966. package/dist/server/preview/services/preview-config.mjs.map +1 -0
  967. package/dist/server/preview/services/preview.js +26 -0
  968. package/dist/server/preview/services/preview.js.map +1 -0
  969. package/dist/server/preview/services/preview.mjs +24 -0
  970. package/dist/server/preview/services/preview.mjs.map +1 -0
  971. package/dist/server/preview/utils.js +9 -0
  972. package/dist/server/preview/utils.js.map +1 -0
  973. package/dist/server/preview/utils.mjs +7 -0
  974. package/dist/server/preview/utils.mjs.map +1 -0
  975. package/dist/server/register.js +16 -0
  976. package/dist/server/register.js.map +1 -0
  977. package/dist/server/register.mjs +14 -0
  978. package/dist/server/register.mjs.map +1 -0
  979. package/dist/server/routes/admin.js +599 -0
  980. package/dist/server/routes/admin.js.map +1 -0
  981. package/dist/server/routes/admin.mjs +597 -0
  982. package/dist/server/routes/admin.mjs.map +1 -0
  983. package/dist/server/routes/index.js +16 -0
  984. package/dist/server/routes/index.js.map +1 -0
  985. package/dist/server/routes/index.mjs +14 -0
  986. package/dist/server/routes/index.mjs.map +1 -0
  987. package/dist/server/services/components.js +73 -0
  988. package/dist/server/services/components.js.map +1 -0
  989. package/dist/server/services/components.mjs +71 -0
  990. package/dist/server/services/components.mjs.map +1 -0
  991. package/dist/server/services/configuration.js +58 -0
  992. package/dist/server/services/configuration.js.map +1 -0
  993. package/dist/server/services/configuration.mjs +56 -0
  994. package/dist/server/services/configuration.mjs.map +1 -0
  995. package/dist/server/services/content-types.js +60 -0
  996. package/dist/server/services/content-types.js.map +1 -0
  997. package/dist/server/services/content-types.mjs +58 -0
  998. package/dist/server/services/content-types.mjs.map +1 -0
  999. package/dist/server/services/data-mapper.js +66 -0
  1000. package/dist/server/services/data-mapper.js.map +1 -0
  1001. package/dist/server/services/data-mapper.mjs +64 -0
  1002. package/dist/server/services/data-mapper.mjs.map +1 -0
  1003. package/dist/server/services/document-manager.js +238 -0
  1004. package/dist/server/services/document-manager.js.map +1 -0
  1005. package/dist/server/services/document-manager.mjs +236 -0
  1006. package/dist/server/services/document-manager.mjs.map +1 -0
  1007. package/dist/server/services/document-metadata.js +237 -0
  1008. package/dist/server/services/document-metadata.js.map +1 -0
  1009. package/dist/server/services/document-metadata.mjs +235 -0
  1010. package/dist/server/services/document-metadata.mjs.map +1 -0
  1011. package/dist/server/services/field-sizes.js +90 -0
  1012. package/dist/server/services/field-sizes.js.map +1 -0
  1013. package/dist/server/services/field-sizes.mjs +88 -0
  1014. package/dist/server/services/field-sizes.mjs.map +1 -0
  1015. package/dist/server/services/index.js +36 -0
  1016. package/dist/server/services/index.js.map +1 -0
  1017. package/dist/server/services/index.mjs +34 -0
  1018. package/dist/server/services/index.mjs.map +1 -0
  1019. package/dist/server/services/metrics.js +35 -0
  1020. package/dist/server/services/metrics.js.map +1 -0
  1021. package/dist/server/services/metrics.mjs +33 -0
  1022. package/dist/server/services/metrics.mjs.map +1 -0
  1023. package/dist/server/services/permission-checker.js +112 -0
  1024. package/dist/server/services/permission-checker.js.map +1 -0
  1025. package/dist/server/services/permission-checker.mjs +110 -0
  1026. package/dist/server/services/permission-checker.mjs.map +1 -0
  1027. package/dist/server/services/permission.js +93 -0
  1028. package/dist/server/services/permission.js.map +1 -0
  1029. package/dist/server/services/permission.mjs +91 -0
  1030. package/dist/server/services/permission.mjs.map +1 -0
  1031. package/dist/server/services/populate-builder.js +75 -0
  1032. package/dist/server/services/populate-builder.js.map +1 -0
  1033. package/dist/server/services/populate-builder.mjs +73 -0
  1034. package/dist/server/services/populate-builder.mjs.map +1 -0
  1035. package/dist/server/services/uid.js +85 -0
  1036. package/dist/server/services/uid.js.map +1 -0
  1037. package/dist/server/services/uid.mjs +83 -0
  1038. package/dist/server/services/uid.mjs.map +1 -0
  1039. package/dist/server/services/utils/configuration/attributes.js +185 -0
  1040. package/dist/server/services/utils/configuration/attributes.js.map +1 -0
  1041. package/dist/server/services/utils/configuration/attributes.mjs +175 -0
  1042. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -0
  1043. package/dist/server/services/utils/configuration/index.js +37 -0
  1044. package/dist/server/services/utils/configuration/index.js.map +1 -0
  1045. package/dist/server/services/utils/configuration/index.mjs +34 -0
  1046. package/dist/server/services/utils/configuration/index.mjs.map +1 -0
  1047. package/dist/server/services/utils/configuration/layouts.js +120 -0
  1048. package/dist/server/services/utils/configuration/layouts.js.map +1 -0
  1049. package/dist/server/services/utils/configuration/layouts.mjs +117 -0
  1050. package/dist/server/services/utils/configuration/layouts.mjs.map +1 -0
  1051. package/dist/server/services/utils/configuration/metadatas.js +147 -0
  1052. package/dist/server/services/utils/configuration/metadatas.js.map +1 -0
  1053. package/dist/server/services/utils/configuration/metadatas.mjs +144 -0
  1054. package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -0
  1055. package/dist/server/services/utils/configuration/settings.js +66 -0
  1056. package/dist/server/services/utils/configuration/settings.js.map +1 -0
  1057. package/dist/server/services/utils/configuration/settings.mjs +62 -0
  1058. package/dist/server/services/utils/configuration/settings.mjs.map +1 -0
  1059. package/dist/server/services/utils/draft.js +51 -0
  1060. package/dist/server/services/utils/draft.js.map +1 -0
  1061. package/dist/server/services/utils/draft.mjs +49 -0
  1062. package/dist/server/services/utils/draft.mjs.map +1 -0
  1063. package/dist/server/services/utils/populate.js +289 -0
  1064. package/dist/server/services/utils/populate.js.map +1 -0
  1065. package/dist/server/services/utils/populate.mjs +283 -0
  1066. package/dist/server/services/utils/populate.mjs.map +1 -0
  1067. package/dist/server/services/utils/store.js +71 -0
  1068. package/dist/server/services/utils/store.js.map +1 -0
  1069. package/dist/server/services/utils/store.mjs +69 -0
  1070. package/dist/server/services/utils/store.mjs.map +1 -0
  1071. package/dist/server/src/bootstrap.d.ts.map +1 -1
  1072. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  1073. package/dist/server/src/controllers/index.d.ts.map +1 -1
  1074. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  1075. package/dist/server/src/controllers/uid.d.ts.map +1 -1
  1076. package/dist/server/src/controllers/utils/metadata.d.ts +17 -2
  1077. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  1078. package/dist/server/src/controllers/validation/dimensions.d.ts +4 -2
  1079. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  1080. package/dist/server/src/history/controllers/history-version.d.ts +1 -1
  1081. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  1082. package/dist/server/src/history/services/history.d.ts +3 -3
  1083. package/dist/server/src/history/services/history.d.ts.map +1 -1
  1084. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  1085. package/dist/server/src/history/services/utils.d.ts +8 -12
  1086. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  1087. package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
  1088. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
  1089. package/dist/server/src/homepage/controllers/index.d.ts +2 -0
  1090. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
  1091. package/dist/server/src/homepage/index.d.ts +16 -0
  1092. package/dist/server/src/homepage/index.d.ts.map +1 -0
  1093. package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
  1094. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
  1095. package/dist/server/src/homepage/routes/index.d.ts +8 -0
  1096. package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
  1097. package/dist/server/src/homepage/services/homepage.d.ts +11 -0
  1098. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
  1099. package/dist/server/src/homepage/services/index.d.ts +9 -0
  1100. package/dist/server/src/homepage/services/index.d.ts.map +1 -0
  1101. package/dist/server/src/index.d.ts +15 -6
  1102. package/dist/server/src/index.d.ts.map +1 -1
  1103. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  1104. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  1105. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  1106. package/dist/server/src/preview/controllers/preview.d.ts +13 -0
  1107. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  1108. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  1109. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  1110. package/dist/server/src/preview/index.d.ts +4 -0
  1111. package/dist/server/src/preview/index.d.ts.map +1 -0
  1112. package/dist/server/src/preview/routes/index.d.ts +8 -0
  1113. package/dist/server/src/preview/routes/index.d.ts.map +1 -0
  1114. package/dist/server/src/preview/routes/preview.d.ts +4 -0
  1115. package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
  1116. package/dist/server/src/preview/services/index.d.ts +16 -0
  1117. package/dist/server/src/preview/services/index.d.ts.map +1 -0
  1118. package/dist/server/src/preview/services/preview-config.d.ts +32 -0
  1119. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
  1120. package/dist/server/src/preview/services/preview.d.ts +12 -0
  1121. package/dist/server/src/preview/services/preview.d.ts.map +1 -0
  1122. package/dist/server/src/preview/utils.d.ts +19 -0
  1123. package/dist/server/src/preview/utils.d.ts.map +1 -0
  1124. package/dist/server/src/register.d.ts.map +1 -1
  1125. package/dist/server/src/routes/index.d.ts +1 -0
  1126. package/dist/server/src/routes/index.d.ts.map +1 -1
  1127. package/dist/server/src/services/data-mapper.d.ts +1 -0
  1128. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  1129. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  1130. package/dist/server/src/services/document-metadata.d.ts +12 -10
  1131. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  1132. package/dist/server/src/services/index.d.ts +14 -6
  1133. package/dist/server/src/services/index.d.ts.map +1 -1
  1134. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  1135. package/dist/server/src/services/utils/count.d.ts +1 -1
  1136. package/dist/server/src/services/utils/count.d.ts.map +1 -1
  1137. package/dist/server/src/services/utils/populate.d.ts +3 -3
  1138. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  1139. package/dist/server/src/utils/index.d.ts +2 -0
  1140. package/dist/server/src/utils/index.d.ts.map +1 -1
  1141. package/dist/server/utils/index.js +10 -0
  1142. package/dist/server/utils/index.js.map +1 -0
  1143. package/dist/server/utils/index.mjs +8 -0
  1144. package/dist/server/utils/index.mjs.map +1 -0
  1145. package/dist/server/validation/policies/hasPermissions.js +12 -0
  1146. package/dist/server/validation/policies/hasPermissions.js.map +1 -0
  1147. package/dist/server/validation/policies/hasPermissions.mjs +10 -0
  1148. package/dist/server/validation/policies/hasPermissions.mjs.map +1 -0
  1149. package/dist/shared/contracts/collection-types.d.ts +3 -2
  1150. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  1151. package/dist/shared/contracts/collection-types.js +3 -0
  1152. package/dist/shared/contracts/collection-types.js.map +1 -0
  1153. package/dist/shared/contracts/collection-types.mjs +2 -0
  1154. package/dist/shared/contracts/collection-types.mjs.map +1 -0
  1155. package/dist/shared/contracts/components.d.ts +0 -1
  1156. package/dist/shared/contracts/components.js +3 -0
  1157. package/dist/shared/contracts/components.js.map +1 -0
  1158. package/dist/shared/contracts/components.mjs +2 -0
  1159. package/dist/shared/contracts/components.mjs.map +1 -0
  1160. package/dist/shared/contracts/content-types.d.ts +0 -1
  1161. package/dist/shared/contracts/content-types.js +3 -0
  1162. package/dist/shared/contracts/content-types.js.map +1 -0
  1163. package/dist/shared/contracts/content-types.mjs +2 -0
  1164. package/dist/shared/contracts/content-types.mjs.map +1 -0
  1165. package/dist/shared/contracts/history-versions.d.ts +0 -1
  1166. package/dist/shared/contracts/history-versions.js +3 -0
  1167. package/dist/shared/contracts/history-versions.js.map +1 -0
  1168. package/dist/shared/contracts/history-versions.mjs +2 -0
  1169. package/dist/shared/contracts/history-versions.mjs.map +1 -0
  1170. package/dist/shared/contracts/homepage.d.ts +25 -0
  1171. package/dist/shared/contracts/homepage.d.ts.map +1 -0
  1172. package/dist/shared/contracts/index.d.ts +1 -1
  1173. package/dist/shared/contracts/index.d.ts.map +1 -1
  1174. package/dist/shared/contracts/index.js +26 -0
  1175. package/dist/shared/contracts/index.js.map +1 -0
  1176. package/dist/shared/contracts/index.mjs +21 -0
  1177. package/dist/shared/contracts/index.mjs.map +1 -0
  1178. package/dist/shared/contracts/init.d.ts +0 -1
  1179. package/dist/shared/contracts/init.js +3 -0
  1180. package/dist/shared/contracts/init.js.map +1 -0
  1181. package/dist/shared/contracts/init.mjs +2 -0
  1182. package/dist/shared/contracts/init.mjs.map +1 -0
  1183. package/dist/shared/contracts/preview.d.ts +26 -0
  1184. package/dist/shared/contracts/preview.d.ts.map +1 -0
  1185. package/dist/shared/contracts/preview.js +3 -0
  1186. package/dist/shared/contracts/preview.js.map +1 -0
  1187. package/dist/shared/contracts/preview.mjs +2 -0
  1188. package/dist/shared/contracts/preview.mjs.map +1 -0
  1189. package/dist/shared/contracts/relations.d.ts +1 -2
  1190. package/dist/shared/contracts/relations.d.ts.map +1 -1
  1191. package/dist/shared/contracts/relations.js +3 -0
  1192. package/dist/shared/contracts/relations.js.map +1 -0
  1193. package/dist/shared/contracts/relations.mjs +2 -0
  1194. package/dist/shared/contracts/relations.mjs.map +1 -0
  1195. package/dist/shared/contracts/review-workflows.d.ts +0 -1
  1196. package/dist/shared/contracts/review-workflows.js +3 -0
  1197. package/dist/shared/contracts/review-workflows.js.map +1 -0
  1198. package/dist/shared/contracts/review-workflows.mjs +2 -0
  1199. package/dist/shared/contracts/review-workflows.mjs.map +1 -0
  1200. package/dist/shared/contracts/single-types.d.ts +0 -1
  1201. package/dist/shared/contracts/single-types.js +3 -0
  1202. package/dist/shared/contracts/single-types.js.map +1 -0
  1203. package/dist/shared/contracts/single-types.mjs +2 -0
  1204. package/dist/shared/contracts/single-types.mjs.map +1 -0
  1205. package/dist/shared/contracts/uid.d.ts +0 -1
  1206. package/dist/shared/contracts/uid.js +3 -0
  1207. package/dist/shared/contracts/uid.js.map +1 -0
  1208. package/dist/shared/contracts/uid.mjs +2 -0
  1209. package/dist/shared/contracts/uid.mjs.map +1 -0
  1210. package/dist/shared/index.d.ts +0 -1
  1211. package/dist/shared/index.js +6 -41
  1212. package/dist/shared/index.js.map +1 -1
  1213. package/dist/shared/index.mjs +2 -42
  1214. package/dist/shared/index.mjs.map +1 -1
  1215. package/package.json +29 -22
  1216. package/dist/_chunks/CardDragPreview-C0QyJgRA.js +0 -69
  1217. package/dist/_chunks/CardDragPreview-C0QyJgRA.js.map +0 -1
  1218. package/dist/_chunks/CardDragPreview-DOxamsuj.mjs +0 -70
  1219. package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +0 -1
  1220. package/dist/_chunks/ComponentConfigurationPage-WRPUXGd6.js +0 -255
  1221. package/dist/_chunks/ComponentConfigurationPage-WRPUXGd6.js.map +0 -1
  1222. package/dist/_chunks/ComponentConfigurationPage-gdUj_t-O.mjs +0 -236
  1223. package/dist/_chunks/ComponentConfigurationPage-gdUj_t-O.mjs.map +0 -1
  1224. package/dist/_chunks/ComponentIcon-BXdiCGQp.js +0 -176
  1225. package/dist/_chunks/ComponentIcon-BXdiCGQp.js.map +0 -1
  1226. package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs +0 -157
  1227. package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +0 -1
  1228. package/dist/_chunks/EditConfigurationPage-BwuIPOJG.mjs +0 -132
  1229. package/dist/_chunks/EditConfigurationPage-BwuIPOJG.mjs.map +0 -1
  1230. package/dist/_chunks/EditConfigurationPage-C1vjMBgy.js +0 -151
  1231. package/dist/_chunks/EditConfigurationPage-C1vjMBgy.js.map +0 -1
  1232. package/dist/_chunks/EditViewPage-0MiFkXa8.mjs +0 -203
  1233. package/dist/_chunks/EditViewPage-0MiFkXa8.mjs.map +0 -1
  1234. package/dist/_chunks/EditViewPage-DbcGfyqK.js +0 -222
  1235. package/dist/_chunks/EditViewPage-DbcGfyqK.js.map +0 -1
  1236. package/dist/_chunks/Field-BDMSCcy5.mjs +0 -5199
  1237. package/dist/_chunks/Field-BDMSCcy5.mjs.map +0 -1
  1238. package/dist/_chunks/Field-BG1xu38N.js +0 -5231
  1239. package/dist/_chunks/Field-BG1xu38N.js.map +0 -1
  1240. package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs +0 -50
  1241. package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +0 -1
  1242. package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js +0 -49
  1243. package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +0 -1
  1244. package/dist/_chunks/Form-9BnFyUjy.js +0 -757
  1245. package/dist/_chunks/Form-9BnFyUjy.js.map +0 -1
  1246. package/dist/_chunks/Form-CPVWavB8.mjs +0 -736
  1247. package/dist/_chunks/Form-CPVWavB8.mjs.map +0 -1
  1248. package/dist/_chunks/History-BVpd8LP3.mjs +0 -1007
  1249. package/dist/_chunks/History-BVpd8LP3.mjs.map +0 -1
  1250. package/dist/_chunks/History-BWWxLt2Z.js +0 -1028
  1251. package/dist/_chunks/History-BWWxLt2Z.js.map +0 -1
  1252. package/dist/_chunks/ListConfigurationPage-6swzjdAZ.js +0 -640
  1253. package/dist/_chunks/ListConfigurationPage-6swzjdAZ.js.map +0 -1
  1254. package/dist/_chunks/ListConfigurationPage-DozVMKcR.mjs +0 -620
  1255. package/dist/_chunks/ListConfigurationPage-DozVMKcR.mjs.map +0 -1
  1256. package/dist/_chunks/ListViewPage-BlzfjS2Q.js +0 -834
  1257. package/dist/_chunks/ListViewPage-BlzfjS2Q.js.map +0 -1
  1258. package/dist/_chunks/ListViewPage-Ds0ulgfG.mjs +0 -810
  1259. package/dist/_chunks/ListViewPage-Ds0ulgfG.mjs.map +0 -1
  1260. package/dist/_chunks/NoContentTypePage-BH11kaKt.mjs +0 -51
  1261. package/dist/_chunks/NoContentTypePage-BH11kaKt.mjs.map +0 -1
  1262. package/dist/_chunks/NoContentTypePage-D2nCCWEl.js +0 -51
  1263. package/dist/_chunks/NoContentTypePage-D2nCCWEl.js.map +0 -1
  1264. package/dist/_chunks/NoPermissionsPage-BT2Tn0D_.mjs +0 -23
  1265. package/dist/_chunks/NoPermissionsPage-BT2Tn0D_.mjs.map +0 -1
  1266. package/dist/_chunks/NoPermissionsPage-DN_JlsU2.js +0 -23
  1267. package/dist/_chunks/NoPermissionsPage-DN_JlsU2.js.map +0 -1
  1268. package/dist/_chunks/Relations-CcgFTcWo.js +0 -714
  1269. package/dist/_chunks/Relations-CcgFTcWo.js.map +0 -1
  1270. package/dist/_chunks/Relations-Dnag3fhV.mjs +0 -694
  1271. package/dist/_chunks/Relations-Dnag3fhV.mjs.map +0 -1
  1272. package/dist/_chunks/ar-BUUWXIYu.js +0 -226
  1273. package/dist/_chunks/ar-BUUWXIYu.js.map +0 -1
  1274. package/dist/_chunks/ar-CCEVvqGG.mjs +0 -226
  1275. package/dist/_chunks/ar-CCEVvqGG.mjs.map +0 -1
  1276. package/dist/_chunks/ca-5U32ON2v.mjs +0 -201
  1277. package/dist/_chunks/ca-5U32ON2v.mjs.map +0 -1
  1278. package/dist/_chunks/ca-Cmk45QO6.js +0 -201
  1279. package/dist/_chunks/ca-Cmk45QO6.js.map +0 -1
  1280. package/dist/_chunks/cs-CM2aBUar.mjs +0 -125
  1281. package/dist/_chunks/cs-CM2aBUar.mjs.map +0 -1
  1282. package/dist/_chunks/cs-CkJy6B2v.js +0 -125
  1283. package/dist/_chunks/cs-CkJy6B2v.js.map +0 -1
  1284. package/dist/_chunks/de-C72KDNOl.mjs +0 -199
  1285. package/dist/_chunks/de-C72KDNOl.mjs.map +0 -1
  1286. package/dist/_chunks/de-CCEmbAah.js +0 -199
  1287. package/dist/_chunks/de-CCEmbAah.js.map +0 -1
  1288. package/dist/_chunks/en-Ux26r5pl.mjs +0 -291
  1289. package/dist/_chunks/en-Ux26r5pl.mjs.map +0 -1
  1290. package/dist/_chunks/en-fbKQxLGn.js +0 -291
  1291. package/dist/_chunks/en-fbKQxLGn.js.map +0 -1
  1292. package/dist/_chunks/es-CeXiYflN.mjs +0 -196
  1293. package/dist/_chunks/es-CeXiYflN.mjs.map +0 -1
  1294. package/dist/_chunks/es-EUonQTon.js +0 -196
  1295. package/dist/_chunks/es-EUonQTon.js.map +0 -1
  1296. package/dist/_chunks/eu-CdALomew.mjs +0 -202
  1297. package/dist/_chunks/eu-CdALomew.mjs.map +0 -1
  1298. package/dist/_chunks/eu-VDH-3ovk.js +0 -202
  1299. package/dist/_chunks/eu-VDH-3ovk.js.map +0 -1
  1300. package/dist/_chunks/fr-B7kGGg3E.js +0 -206
  1301. package/dist/_chunks/fr-B7kGGg3E.js.map +0 -1
  1302. package/dist/_chunks/fr-CD9VFbPM.mjs +0 -206
  1303. package/dist/_chunks/fr-CD9VFbPM.mjs.map +0 -1
  1304. package/dist/_chunks/gu-BRmF601H.js +0 -200
  1305. package/dist/_chunks/gu-BRmF601H.js.map +0 -1
  1306. package/dist/_chunks/gu-CNpaMDpH.mjs +0 -200
  1307. package/dist/_chunks/gu-CNpaMDpH.mjs.map +0 -1
  1308. package/dist/_chunks/hi-CCJBptSq.js +0 -200
  1309. package/dist/_chunks/hi-CCJBptSq.js.map +0 -1
  1310. package/dist/_chunks/hi-Dwvd04m3.mjs +0 -200
  1311. package/dist/_chunks/hi-Dwvd04m3.mjs.map +0 -1
  1312. package/dist/_chunks/hooks-BAaaKPS_.js +0 -7
  1313. package/dist/_chunks/hooks-BAaaKPS_.js.map +0 -1
  1314. package/dist/_chunks/hooks-E5u1mcgM.mjs +0 -8
  1315. package/dist/_chunks/hooks-E5u1mcgM.mjs.map +0 -1
  1316. package/dist/_chunks/hu-CeYvaaO0.mjs +0 -202
  1317. package/dist/_chunks/hu-CeYvaaO0.mjs.map +0 -1
  1318. package/dist/_chunks/hu-sNV_yLYy.js +0 -202
  1319. package/dist/_chunks/hu-sNV_yLYy.js.map +0 -1
  1320. package/dist/_chunks/id-B5Ser98A.js +0 -160
  1321. package/dist/_chunks/id-B5Ser98A.js.map +0 -1
  1322. package/dist/_chunks/id-BtwA9WJT.mjs +0 -160
  1323. package/dist/_chunks/id-BtwA9WJT.mjs.map +0 -1
  1324. package/dist/_chunks/index-CWpLBSt0.js +0 -3778
  1325. package/dist/_chunks/index-CWpLBSt0.js.map +0 -1
  1326. package/dist/_chunks/index-JNNNKUHs.mjs +0 -3759
  1327. package/dist/_chunks/index-JNNNKUHs.mjs.map +0 -1
  1328. package/dist/_chunks/it-BrVPqaf1.mjs +0 -162
  1329. package/dist/_chunks/it-BrVPqaf1.mjs.map +0 -1
  1330. package/dist/_chunks/it-DkBIs7vD.js +0 -162
  1331. package/dist/_chunks/it-DkBIs7vD.js.map +0 -1
  1332. package/dist/_chunks/ja-CcFe8diO.js +0 -196
  1333. package/dist/_chunks/ja-CcFe8diO.js.map +0 -1
  1334. package/dist/_chunks/ja-CtsUxOvk.mjs +0 -196
  1335. package/dist/_chunks/ja-CtsUxOvk.mjs.map +0 -1
  1336. package/dist/_chunks/ko-HVQRlfUI.mjs +0 -195
  1337. package/dist/_chunks/ko-HVQRlfUI.mjs.map +0 -1
  1338. package/dist/_chunks/ko-woFZPmLk.js +0 -195
  1339. package/dist/_chunks/ko-woFZPmLk.js.map +0 -1
  1340. package/dist/_chunks/layout--iHdZzRk.js +0 -476
  1341. package/dist/_chunks/layout--iHdZzRk.js.map +0 -1
  1342. package/dist/_chunks/layout-DC503LnF.mjs +0 -458
  1343. package/dist/_chunks/layout-DC503LnF.mjs.map +0 -1
  1344. package/dist/_chunks/ml-BihZwQit.mjs +0 -200
  1345. package/dist/_chunks/ml-BihZwQit.mjs.map +0 -1
  1346. package/dist/_chunks/ml-C2W8N8k1.js +0 -200
  1347. package/dist/_chunks/ml-C2W8N8k1.js.map +0 -1
  1348. package/dist/_chunks/ms-BuFotyP_.js +0 -144
  1349. package/dist/_chunks/ms-BuFotyP_.js.map +0 -1
  1350. package/dist/_chunks/ms-m_WjyWx7.mjs +0 -144
  1351. package/dist/_chunks/ms-m_WjyWx7.mjs.map +0 -1
  1352. package/dist/_chunks/nl-D4R9gHx5.mjs +0 -202
  1353. package/dist/_chunks/nl-D4R9gHx5.mjs.map +0 -1
  1354. package/dist/_chunks/nl-bbEOHChV.js +0 -202
  1355. package/dist/_chunks/nl-bbEOHChV.js.map +0 -1
  1356. package/dist/_chunks/objects-gigeqt7s.js +0 -49
  1357. package/dist/_chunks/objects-gigeqt7s.js.map +0 -1
  1358. package/dist/_chunks/objects-mKMAmfec.mjs +0 -47
  1359. package/dist/_chunks/objects-mKMAmfec.mjs.map +0 -1
  1360. package/dist/_chunks/pl-sbx9mSt_.mjs +0 -199
  1361. package/dist/_chunks/pl-sbx9mSt_.mjs.map +0 -1
  1362. package/dist/_chunks/pl-uzwG-hk7.js +0 -199
  1363. package/dist/_chunks/pl-uzwG-hk7.js.map +0 -1
  1364. package/dist/_chunks/pt-BR-BiOz37D9.js +0 -201
  1365. package/dist/_chunks/pt-BR-BiOz37D9.js.map +0 -1
  1366. package/dist/_chunks/pt-BR-C71iDxnh.mjs +0 -201
  1367. package/dist/_chunks/pt-BR-C71iDxnh.mjs.map +0 -1
  1368. package/dist/_chunks/pt-BsaFvS8-.mjs +0 -95
  1369. package/dist/_chunks/pt-BsaFvS8-.mjs.map +0 -1
  1370. package/dist/_chunks/pt-CeXQuq50.js +0 -95
  1371. package/dist/_chunks/pt-CeXQuq50.js.map +0 -1
  1372. package/dist/_chunks/relations-BbHizA5K.js +0 -134
  1373. package/dist/_chunks/relations-BbHizA5K.js.map +0 -1
  1374. package/dist/_chunks/relations-CTje5t-a.mjs +0 -135
  1375. package/dist/_chunks/relations-CTje5t-a.mjs.map +0 -1
  1376. package/dist/_chunks/ru-BE6A4Exp.mjs +0 -231
  1377. package/dist/_chunks/ru-BE6A4Exp.mjs.map +0 -1
  1378. package/dist/_chunks/ru-BT3ybNny.js +0 -231
  1379. package/dist/_chunks/ru-BT3ybNny.js.map +0 -1
  1380. package/dist/_chunks/sa-CcvkYInH.js +0 -200
  1381. package/dist/_chunks/sa-CcvkYInH.js.map +0 -1
  1382. package/dist/_chunks/sa-Dag0k-Z8.mjs +0 -200
  1383. package/dist/_chunks/sa-Dag0k-Z8.mjs.map +0 -1
  1384. package/dist/_chunks/sk-BFg-R8qJ.mjs +0 -202
  1385. package/dist/_chunks/sk-BFg-R8qJ.mjs.map +0 -1
  1386. package/dist/_chunks/sk-CvY09Xjv.js +0 -202
  1387. package/dist/_chunks/sk-CvY09Xjv.js.map +0 -1
  1388. package/dist/_chunks/sv-CUnfWGsh.mjs +0 -202
  1389. package/dist/_chunks/sv-CUnfWGsh.mjs.map +0 -1
  1390. package/dist/_chunks/sv-MYDuzgvT.js +0 -202
  1391. package/dist/_chunks/sv-MYDuzgvT.js.map +0 -1
  1392. package/dist/_chunks/th-BqbI8lIT.mjs +0 -148
  1393. package/dist/_chunks/th-BqbI8lIT.mjs.map +0 -1
  1394. package/dist/_chunks/th-D9_GfAjc.js +0 -148
  1395. package/dist/_chunks/th-D9_GfAjc.js.map +0 -1
  1396. package/dist/_chunks/tr-CgeK3wJM.mjs +0 -199
  1397. package/dist/_chunks/tr-CgeK3wJM.mjs.map +0 -1
  1398. package/dist/_chunks/tr-D9UH-O_R.js +0 -199
  1399. package/dist/_chunks/tr-D9UH-O_R.js.map +0 -1
  1400. package/dist/_chunks/uk-C8EiqJY7.js +0 -144
  1401. package/dist/_chunks/uk-C8EiqJY7.js.map +0 -1
  1402. package/dist/_chunks/uk-CR-zDhAY.mjs +0 -144
  1403. package/dist/_chunks/uk-CR-zDhAY.mjs.map +0 -1
  1404. package/dist/_chunks/useDragAndDrop-DdHgKsqq.mjs +0 -231
  1405. package/dist/_chunks/useDragAndDrop-DdHgKsqq.mjs.map +0 -1
  1406. package/dist/_chunks/useDragAndDrop-J0TUUbR6.js +0 -249
  1407. package/dist/_chunks/useDragAndDrop-J0TUUbR6.js.map +0 -1
  1408. package/dist/_chunks/usePrev-B9w_-eYc.js +0 -15
  1409. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  1410. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  1411. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
  1412. package/dist/_chunks/vi-CJlYDheJ.js +0 -111
  1413. package/dist/_chunks/vi-CJlYDheJ.js.map +0 -1
  1414. package/dist/_chunks/vi-DUXIk_fw.mjs +0 -111
  1415. package/dist/_chunks/vi-DUXIk_fw.mjs.map +0 -1
  1416. package/dist/_chunks/zh-BWZspA60.mjs +0 -209
  1417. package/dist/_chunks/zh-BWZspA60.mjs.map +0 -1
  1418. package/dist/_chunks/zh-CQQfszqR.js +0 -209
  1419. package/dist/_chunks/zh-CQQfszqR.js.map +0 -1
  1420. package/dist/_chunks/zh-Hans-9kOncHGw.js +0 -952
  1421. package/dist/_chunks/zh-Hans-9kOncHGw.js.map +0 -1
  1422. package/dist/_chunks/zh-Hans-BPQcRIyH.mjs +0 -952
  1423. package/dist/_chunks/zh-Hans-BPQcRIyH.mjs.map +0 -1
  1424. package/dist/admin/src/pages/EditView/components/FormInputs/Relations.d.ts +0 -18
  1425. package/strapi-server.js +0 -3
@@ -1,4343 +1,22 @@
1
- import strapiUtils, { validateYupSchema, errors, async, contentTypes as contentTypes$1, yup as yup$1, validateYupSchemaSync, policy, traverse, setCreatorFields, isOperatorOfType, relations as relations$1, traverseEntity, pagination } from "@strapi/utils";
2
- import { pick, omit, difference, intersection, pipe, propOr, isEqual, isEmpty, set, has, prop, assoc, mapValues, flow, uniq, uniqBy, concat, isNil as isNil$1, getOr, propEq, merge, groupBy, castArray } from "lodash/fp";
3
- import "@strapi/types";
4
- import * as yup from "yup";
5
- import { scheduleJob } from "node-schedule";
6
- import isNil from "lodash/isNil";
7
- import _, { intersection as intersection$1, difference as difference$1 } from "lodash";
8
- import qs from "qs";
9
- import slugify from "@sindresorhus/slugify";
10
- const getService$1 = (name) => {
11
- return strapi.plugin("content-manager").service(name);
12
- };
13
- function getService(strapi2, name) {
14
- return strapi2.service(`plugin::content-manager.${name}`);
15
- }
16
- const historyRestoreVersionSchema = yup.object().shape({
17
- contentType: yup.string().trim().required()
18
- }).required();
19
- const validateRestoreVersion = validateYupSchema(historyRestoreVersionSchema);
20
- const getValidPagination = ({ page, pageSize }) => {
21
- let pageNumber = 1;
22
- let pageSizeNumber = 20;
23
- if (page) {
24
- const parsedPage = parseInt(page, 10);
25
- pageNumber = parseInt(page, 10);
26
- if (!Number.isNaN(parsedPage) && parsedPage >= 1) {
27
- pageNumber = parsedPage;
28
- }
29
- }
30
- if (pageSize) {
31
- const parsedPageSize = parseInt(pageSize, 10);
32
- if (!Number.isNaN(parsedPageSize) && parsedPageSize >= 1 && parsedPageSize <= 100) {
33
- pageSizeNumber = parsedPageSize;
34
- }
35
- }
36
- return { page: pageNumber, pageSize: pageSizeNumber };
37
- };
38
- const createHistoryVersionController = ({ strapi: strapi2 }) => {
39
- return {
40
- async findMany(ctx) {
41
- const contentTypeUid = ctx.query.contentType;
42
- const isSingleType = strapi2.getModel(contentTypeUid)?.kind === "singleType";
43
- if (isSingleType && !contentTypeUid) {
44
- throw new errors.ForbiddenError("contentType is required");
45
- }
46
- if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {
47
- throw new errors.ForbiddenError("contentType and documentId are required");
48
- }
49
- const permissionChecker2 = getService$1("permission-checker").create({
50
- userAbility: ctx.state.userAbility,
51
- model: ctx.query.contentType
52
- });
53
- if (permissionChecker2.cannot.read()) {
54
- return ctx.forbidden();
55
- }
56
- const query = await permissionChecker2.sanitizeQuery(ctx.query);
57
- const { results, pagination: pagination2 } = await getService(strapi2, "history").findVersionsPage({
58
- query: {
59
- ...query,
60
- ...getValidPagination({ page: query.page, pageSize: query.pageSize })
61
- },
62
- state: { userAbility: ctx.state.userAbility }
63
- });
64
- const sanitizedResults = await async.map(
65
- results,
66
- async (version) => {
67
- return {
68
- ...version,
69
- data: await permissionChecker2.sanitizeOutput(version.data),
70
- createdBy: version.createdBy ? pick(["id", "firstname", "lastname", "username", "email"], version.createdBy) : void 0
71
- };
72
- }
73
- );
74
- return {
75
- data: sanitizedResults,
76
- meta: { pagination: pagination2 }
77
- };
78
- },
79
- async restoreVersion(ctx) {
80
- const request = ctx.request;
81
- await validateRestoreVersion(request.body, "contentType is required");
82
- const permissionChecker2 = getService$1("permission-checker").create({
83
- userAbility: ctx.state.userAbility,
84
- model: request.body.contentType
85
- });
86
- if (permissionChecker2.cannot.update()) {
87
- throw new errors.ForbiddenError();
88
- }
89
- const restoredDocument = await getService(strapi2, "history").restoreVersion(
90
- request.params.versionId
91
- );
92
- return {
93
- data: { documentId: restoredDocument.documentId }
94
- };
95
- }
96
- };
97
- };
98
- const controllers$1 = {
99
- "history-version": createHistoryVersionController
100
- /**
101
- * Casting is needed because the types aren't aware that Strapi supports
102
- * passing a controller factory as the value, instead of a controller object directly
103
- */
104
- };
105
- const HISTORY_VERSION_UID = "plugin::content-manager.history-version";
106
- const FIELDS_TO_IGNORE = [
107
- "createdAt",
108
- "updatedAt",
109
- "publishedAt",
110
- "createdBy",
111
- "updatedBy",
112
- "strapi_stage",
113
- "strapi_assignee"
114
- ];
115
- const DEFAULT_RETENTION_DAYS = 90;
116
- const createServiceUtils = ({ strapi: strapi2 }) => {
117
- const getSchemaAttributesDiff = (versionSchemaAttributes, contentTypeSchemaAttributes) => {
118
- const sanitizedContentTypeSchemaAttributes = omit(
119
- FIELDS_TO_IGNORE,
120
- contentTypeSchemaAttributes
121
- );
122
- const reduceDifferenceToAttributesObject = (diffKeys, source) => {
123
- return diffKeys.reduce(
124
- (previousAttributesObject, diffKey) => {
125
- previousAttributesObject[diffKey] = source[diffKey];
126
- return previousAttributesObject;
127
- },
128
- {}
129
- );
130
- };
131
- const versionSchemaKeys = Object.keys(versionSchemaAttributes);
132
- const contentTypeSchemaAttributesKeys = Object.keys(sanitizedContentTypeSchemaAttributes);
133
- const uniqueToContentType = difference(contentTypeSchemaAttributesKeys, versionSchemaKeys);
134
- const added = reduceDifferenceToAttributesObject(
135
- uniqueToContentType,
136
- sanitizedContentTypeSchemaAttributes
137
- );
138
- const uniqueToVersion = difference(versionSchemaKeys, contentTypeSchemaAttributesKeys);
139
- const removed = reduceDifferenceToAttributesObject(uniqueToVersion, versionSchemaAttributes);
140
- return { added, removed };
141
- };
142
- const getRelationRestoreValue = async (versionRelationData, attribute) => {
143
- if (Array.isArray(versionRelationData)) {
144
- if (versionRelationData.length === 0)
145
- return versionRelationData;
146
- const existingAndMissingRelations = await Promise.all(
147
- versionRelationData.map((relation) => {
148
- return strapi2.documents(attribute.target).findOne({
149
- documentId: relation.documentId,
150
- locale: relation.locale || void 0
151
- });
152
- })
153
- );
154
- return existingAndMissingRelations.filter(
155
- (relation) => relation !== null
156
- );
157
- }
158
- return strapi2.documents(attribute.target).findOne({
159
- documentId: versionRelationData.documentId,
160
- locale: versionRelationData.locale || void 0
161
- });
162
- };
163
- const getMediaRestoreValue = async (versionRelationData, attribute) => {
164
- if (attribute.multiple) {
165
- const existingAndMissingMedias = await Promise.all(
166
- // @ts-expect-error Fix the type definitions so this isn't any
167
- versionRelationData.map((media) => {
168
- return strapi2.db.query("plugin::upload.file").findOne({ where: { id: media.id } });
169
- })
170
- );
171
- return existingAndMissingMedias.filter((media) => media != null);
172
- }
173
- return strapi2.db.query("plugin::upload.file").findOne({ where: { id: versionRelationData.id } });
174
- };
175
- const localesService = strapi2.plugin("i18n")?.service("locales");
176
- const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
177
- const getLocaleDictionary = async () => {
178
- if (!localesService)
179
- return {};
180
- const locales = await localesService.find() || [];
181
- return locales.reduce(
182
- (acc, locale) => {
183
- acc[locale.code] = { name: locale.name, code: locale.code };
184
- return acc;
185
- },
186
- {}
187
- );
188
- };
189
- const getRetentionDays = () => {
190
- const featureConfig = strapi2.ee.features.get("cms-content-history");
191
- const licenseRetentionDays = typeof featureConfig === "object" && featureConfig?.options.retentionDays;
192
- const userRetentionDays = strapi2.config.get("admin.history.retentionDays");
193
- if (userRetentionDays && userRetentionDays < licenseRetentionDays) {
194
- return userRetentionDays;
195
- }
196
- return Math.min(licenseRetentionDays, DEFAULT_RETENTION_DAYS);
197
- };
198
- const getVersionStatus = async (contentTypeUid, document) => {
199
- const documentMetadataService = strapi2.plugin("content-manager").service("document-metadata");
200
- const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
201
- return documentMetadataService.getStatus(document, meta.availableStatus);
202
- };
203
- const getDeepPopulate2 = (uid2) => {
204
- const model = strapi2.getModel(uid2);
205
- const attributes = Object.entries(model.attributes);
206
- return attributes.reduce((acc, [attributeName, attribute]) => {
207
- switch (attribute.type) {
208
- case "relation": {
209
- const isVisible2 = contentTypes$1.isVisibleAttribute(model, attributeName);
210
- if (isVisible2) {
211
- acc[attributeName] = { fields: ["documentId", "locale", "publishedAt"] };
212
- }
213
- break;
214
- }
215
- case "media": {
216
- acc[attributeName] = { fields: ["id"] };
217
- break;
218
- }
219
- case "component": {
220
- const populate = getDeepPopulate2(attribute.component);
221
- acc[attributeName] = { populate };
222
- break;
223
- }
224
- case "dynamiczone": {
225
- const populatedComponents = (attribute.components || []).reduce(
226
- (acc2, componentUID) => {
227
- acc2[componentUID] = { populate: getDeepPopulate2(componentUID) };
228
- return acc2;
229
- },
230
- {}
231
- );
232
- acc[attributeName] = { on: populatedComponents };
233
- break;
234
- }
235
- }
236
- return acc;
237
- }, {});
238
- };
239
- const buildMediaResponse = async (values) => {
240
- return values.slice(0, 25).reduce(
241
- async (currentRelationDataPromise, entry) => {
242
- const currentRelationData = await currentRelationDataPromise;
243
- if (!entry) {
244
- return currentRelationData;
245
- }
246
- const relatedEntry = await strapi2.db.query("plugin::upload.file").findOne({ where: { id: entry.id } });
247
- if (relatedEntry) {
248
- currentRelationData.results.push(relatedEntry);
249
- } else {
250
- currentRelationData.meta.missingCount += 1;
251
- }
252
- return currentRelationData;
253
- },
254
- Promise.resolve({
255
- results: [],
256
- meta: { missingCount: 0 }
257
- })
258
- );
259
- };
260
- const buildRelationReponse = async (values, attributeSchema) => {
261
- return values.slice(0, 25).reduce(
262
- async (currentRelationDataPromise, entry) => {
263
- const currentRelationData = await currentRelationDataPromise;
264
- if (!entry) {
265
- return currentRelationData;
266
- }
267
- const relatedEntry = await strapi2.documents(attributeSchema.target).findOne({ documentId: entry.documentId, locale: entry.locale || void 0 });
268
- if (relatedEntry) {
269
- currentRelationData.results.push({
270
- ...relatedEntry,
271
- status: await getVersionStatus(attributeSchema.target, relatedEntry)
272
- });
273
- } else {
274
- currentRelationData.meta.missingCount += 1;
275
- }
276
- return currentRelationData;
277
- },
278
- Promise.resolve({
279
- results: [],
280
- meta: { missingCount: 0 }
281
- })
282
- );
283
- };
284
- return {
285
- getSchemaAttributesDiff,
286
- getRelationRestoreValue,
287
- getMediaRestoreValue,
288
- getDefaultLocale,
289
- getLocaleDictionary,
290
- getRetentionDays,
291
- getVersionStatus,
292
- getDeepPopulate: getDeepPopulate2,
293
- buildMediaResponse,
294
- buildRelationReponse
295
- };
296
- };
297
- const createHistoryService = ({ strapi: strapi2 }) => {
298
- const query = strapi2.db.query(HISTORY_VERSION_UID);
299
- const serviceUtils = createServiceUtils({ strapi: strapi2 });
300
- return {
301
- async createVersion(historyVersionData) {
302
- await query.create({
303
- data: {
304
- ...historyVersionData,
305
- createdAt: /* @__PURE__ */ new Date(),
306
- createdBy: strapi2.requestContext.get()?.state?.user.id
307
- }
308
- });
309
- },
310
- async findVersionsPage(params) {
311
- const locale = params.query.locale || await serviceUtils.getDefaultLocale();
312
- const [{ results, pagination: pagination2 }, localeDictionary] = await Promise.all([
313
- query.findPage({
314
- ...params.query,
315
- where: {
316
- $and: [
317
- { contentType: params.query.contentType },
318
- ...params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : [],
319
- ...locale ? [{ locale }] : []
320
- ]
321
- },
322
- populate: ["createdBy"],
323
- orderBy: [{ createdAt: "desc" }]
324
- }),
325
- serviceUtils.getLocaleDictionary()
326
- ]);
327
- const populateEntryRelations = async (entry) => {
328
- const entryWithRelations = await Object.entries(entry.schema).reduce(
329
- async (currentDataWithRelations, [attributeKey, attributeSchema]) => {
330
- const attributeValue = entry.data[attributeKey];
331
- const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
332
- if (attributeSchema.type === "media") {
333
- const permissionChecker2 = getService$1("permission-checker").create({
334
- userAbility: params.state.userAbility,
335
- model: "plugin::upload.file"
336
- });
337
- const response = await serviceUtils.buildMediaResponse(attributeValues);
338
- const sanitizedResults = await Promise.all(
339
- response.results.map((media) => permissionChecker2.sanitizeOutput(media))
340
- );
341
- return {
342
- ...await currentDataWithRelations,
343
- [attributeKey]: {
344
- results: sanitizedResults,
345
- meta: response.meta
346
- }
347
- };
348
- }
349
- if (attributeSchema.type === "relation" && attributeSchema.relation !== "morphToOne" && attributeSchema.relation !== "morphToMany") {
350
- if (attributeSchema.target === "admin::user") {
351
- const adminUsers = await Promise.all(
352
- attributeValues.map((userToPopulate) => {
353
- if (userToPopulate == null) {
354
- return null;
355
- }
356
- return strapi2.query("admin::user").findOne({ where: { id: userToPopulate.id } });
357
- })
358
- );
359
- return {
360
- ...await currentDataWithRelations,
361
- /**
362
- * Ideally we would return the same "{results: [], meta: {}}" shape, however,
363
- * when sanitizing the data as a whole in the controller before sending to the client,
364
- * the data for admin relation user is completely sanitized if we return an object here as opposed to an array.
365
- */
366
- [attributeKey]: adminUsers
367
- };
368
- }
369
- const permissionChecker2 = getService$1("permission-checker").create({
370
- userAbility: params.state.userAbility,
371
- model: attributeSchema.target
372
- });
373
- const response = await serviceUtils.buildRelationReponse(
374
- attributeValues,
375
- attributeSchema
376
- );
377
- const sanitizedResults = await Promise.all(
378
- response.results.map((media) => permissionChecker2.sanitizeOutput(media))
379
- );
380
- return {
381
- ...await currentDataWithRelations,
382
- [attributeKey]: {
383
- results: sanitizedResults,
384
- meta: response.meta
385
- }
386
- };
387
- }
388
- return currentDataWithRelations;
389
- },
390
- Promise.resolve(entry.data)
391
- );
392
- return entryWithRelations;
393
- };
394
- const formattedResults = await Promise.all(
395
- results.map(async (result) => {
396
- return {
397
- ...result,
398
- data: await populateEntryRelations(result),
399
- meta: {
400
- unknownAttributes: serviceUtils.getSchemaAttributesDiff(
401
- result.schema,
402
- strapi2.getModel(params.query.contentType).attributes
403
- )
404
- },
405
- locale: result.locale ? localeDictionary[result.locale] : null
406
- };
407
- })
408
- );
409
- return {
410
- results: formattedResults,
411
- pagination: pagination2
412
- };
413
- },
414
- async restoreVersion(versionId) {
415
- const version = await query.findOne({ where: { id: versionId } });
416
- const contentTypeSchemaAttributes = strapi2.getModel(version.contentType).attributes;
417
- const schemaDiff = serviceUtils.getSchemaAttributesDiff(
418
- version.schema,
419
- contentTypeSchemaAttributes
420
- );
421
- const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(
422
- (currentData, addedKey) => {
423
- currentData[addedKey] = null;
424
- return currentData;
425
- },
426
- // Clone to avoid mutating the original version data
427
- structuredClone(version.data)
428
- );
429
- const sanitizedSchemaAttributes = omit(
430
- FIELDS_TO_IGNORE,
431
- contentTypeSchemaAttributes
432
- );
433
- const reducer = async.reduce(Object.entries(sanitizedSchemaAttributes));
434
- const dataWithoutMissingRelations = await reducer(
435
- async (previousRelationAttributes, [name, attribute]) => {
436
- const versionRelationData = version.data[name];
437
- if (!versionRelationData) {
438
- return previousRelationAttributes;
439
- }
440
- if (attribute.type === "relation" && // TODO: handle polymorphic relations
441
- attribute.relation !== "morphToOne" && attribute.relation !== "morphToMany") {
442
- const data2 = await serviceUtils.getRelationRestoreValue(versionRelationData, attribute);
443
- previousRelationAttributes[name] = data2;
444
- }
445
- if (attribute.type === "media") {
446
- const data2 = await serviceUtils.getMediaRestoreValue(versionRelationData, attribute);
447
- previousRelationAttributes[name] = data2;
448
- }
449
- return previousRelationAttributes;
450
- },
451
- // Clone to avoid mutating the original version data
452
- structuredClone(dataWithoutAddedAttributes)
453
- );
454
- const data = omit(["id", ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);
455
- const restoredDocument = await strapi2.documents(version.contentType).update({
456
- documentId: version.relatedDocumentId,
457
- locale: version.locale,
458
- data
459
- });
460
- if (!restoredDocument) {
461
- throw new errors.ApplicationError("Failed to restore version");
462
- }
463
- return restoredDocument;
464
- }
465
- };
466
- };
467
- const createLifecyclesService = ({ strapi: strapi2 }) => {
468
- const state = {
469
- deleteExpiredJob: null,
470
- isInitialized: false
471
- };
472
- const query = strapi2.db.query(HISTORY_VERSION_UID);
473
- const historyService = getService(strapi2, "history");
474
- const serviceUtils = createServiceUtils({ strapi: strapi2 });
475
- return {
476
- async bootstrap() {
477
- if (state.isInitialized) {
478
- return;
479
- }
480
- strapi2.documents.use(async (context, next) => {
481
- if (!strapi2.requestContext.get()?.request.url.startsWith("/content-manager")) {
482
- return next();
483
- }
484
- if (context.action !== "create" && context.action !== "update" && context.action !== "clone" && context.action !== "publish" && context.action !== "unpublish" && context.action !== "discardDraft") {
485
- return next();
486
- }
487
- if (context.action === "update" && strapi2.requestContext.get()?.request.url.endsWith("/actions/publish")) {
488
- return next();
489
- }
490
- const contentTypeUid = context.contentType.uid;
491
- if (!contentTypeUid.startsWith("api::")) {
492
- return next();
493
- }
494
- const result = await next();
495
- const documentContext = {
496
- documentId: context.action === "create" || context.action === "clone" ? result.documentId : context.params.documentId,
497
- locale: context.params?.locale
498
- };
499
- const defaultLocale = await serviceUtils.getDefaultLocale();
500
- const locale = documentContext.locale || defaultLocale;
501
- if (Array.isArray(locale)) {
502
- strapi2.log.warn(
503
- "[Content manager history middleware]: An array of locales was provided, but only a single locale is supported for the findOne operation."
504
- );
505
- return next();
506
- }
507
- const document = await strapi2.documents(contentTypeUid).findOne({
508
- documentId: documentContext.documentId,
509
- locale,
510
- populate: serviceUtils.getDeepPopulate(contentTypeUid)
511
- });
512
- const status = await serviceUtils.getVersionStatus(contentTypeUid, document);
513
- const attributesSchema = strapi2.getModel(contentTypeUid).attributes;
514
- const componentsSchemas = Object.keys(
515
- attributesSchema
516
- ).reduce((currentComponentSchemas, key) => {
517
- const fieldSchema = attributesSchema[key];
518
- if (fieldSchema.type === "component") {
519
- const componentSchema = strapi2.getModel(fieldSchema.component).attributes;
520
- return {
521
- ...currentComponentSchemas,
522
- [fieldSchema.component]: componentSchema
523
- };
524
- }
525
- return currentComponentSchemas;
526
- }, {});
527
- await strapi2.db.transaction(async ({ onCommit }) => {
528
- onCommit(() => {
529
- historyService.createVersion({
530
- contentType: contentTypeUid,
531
- data: omit(FIELDS_TO_IGNORE, document),
532
- schema: omit(FIELDS_TO_IGNORE, attributesSchema),
533
- componentsSchemas,
534
- relatedDocumentId: documentContext.documentId,
535
- locale,
536
- status
537
- });
538
- });
539
- });
540
- return result;
541
- });
542
- state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
543
- const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
544
- const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
545
- query.deleteMany({
546
- where: {
547
- created_at: {
548
- $lt: expirationDate.toISOString()
549
- }
550
- }
551
- });
552
- });
553
- state.isInitialized = true;
554
- },
555
- async destroy() {
556
- if (state.deleteExpiredJob) {
557
- state.deleteExpiredJob.cancel();
558
- }
559
- }
560
- };
561
- };
562
- const services$1 = {
563
- history: createHistoryService,
564
- lifecycles: createLifecyclesService
565
- };
566
- const info = { pluginName: "content-manager", type: "admin" };
567
- const historyVersionRouter = {
568
- type: "admin",
569
- routes: [
570
- {
571
- method: "GET",
572
- info,
573
- path: "/history-versions",
574
- handler: "history-version.findMany",
575
- config: {
576
- policies: ["admin::isAuthenticatedAdmin"]
577
- }
578
- },
579
- {
580
- method: "PUT",
581
- info,
582
- path: "/history-versions/:versionId/restore",
583
- handler: "history-version.restoreVersion",
584
- config: {
585
- policies: ["admin::isAuthenticatedAdmin"]
586
- }
587
- }
588
- ]
589
- };
590
- const routes$1 = {
591
- "history-version": historyVersionRouter
592
- };
593
- const historyVersion = {
594
- uid: HISTORY_VERSION_UID,
595
- tableName: "strapi_history_versions",
596
- singularName: "history-version",
597
- attributes: {
598
- id: {
599
- type: "increments"
600
- },
601
- contentType: {
602
- type: "string",
603
- column: { notNullable: true }
604
- },
605
- relatedDocumentId: {
606
- type: "string",
607
- // TODO: notNullable should be true once history can record publish actions
608
- column: { notNullable: false }
609
- },
610
- locale: {
611
- type: "string"
612
- },
613
- status: {
614
- type: "enumeration",
615
- enum: ["draft", "published", "modified"]
616
- },
617
- data: {
618
- type: "json"
619
- },
620
- schema: {
621
- type: "json"
622
- },
623
- createdAt: {
624
- type: "datetime",
625
- default: () => /* @__PURE__ */ new Date()
626
- },
627
- // FIXME: joinTable should be optional
628
- // @ts-expect-error database model is not yet updated to support useJoinTable
629
- createdBy: {
630
- type: "relation",
631
- relation: "oneToOne",
632
- target: "admin::user",
633
- useJoinTable: false
634
- }
635
- }
636
- };
637
- const getFeature = () => {
638
- if (strapi.ee.features.isEnabled("cms-content-history")) {
639
- return {
640
- register({ strapi: strapi2 }) {
641
- strapi2.get("models").add(historyVersion);
642
- },
643
- bootstrap({ strapi: strapi2 }) {
644
- getService(strapi2, "lifecycles").bootstrap();
645
- },
646
- destroy({ strapi: strapi2 }) {
647
- getService(strapi2, "lifecycles").destroy();
648
- },
649
- controllers: controllers$1,
650
- services: services$1,
651
- routes: routes$1
652
- };
653
- }
654
- return {
655
- register({ strapi: strapi2 }) {
656
- strapi2.get("models").add(historyVersion);
657
- }
658
- };
659
- };
660
- const history = getFeature();
661
- const register = async ({ strapi: strapi2 }) => {
662
- await history.register?.({ strapi: strapi2 });
663
- };
664
- const ALLOWED_WEBHOOK_EVENTS = {
665
- ENTRY_PUBLISH: "entry.publish",
666
- ENTRY_UNPUBLISH: "entry.unpublish"
667
- };
668
- const bootstrap = async () => {
669
- Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
670
- strapi.get("webhookStore").addAllowedEvent(key, value);
671
- });
672
- getService$1("field-sizes").setCustomFieldInputSizes();
673
- await getService$1("components").syncConfigurations();
674
- await getService$1("content-types").syncConfigurations();
675
- await getService$1("permission").registerPermissions();
676
- await history.bootstrap?.({ strapi });
677
- };
678
- const destroy = async ({ strapi: strapi2 }) => {
679
- await history.destroy?.({ strapi: strapi2 });
680
- };
681
- const routing = async (ctx, next) => {
682
- const { model } = ctx.params;
683
- const ct = strapi.contentTypes[model];
684
- if (!ct) {
685
- return ctx.send({ error: "contentType.notFound" }, 404);
686
- }
687
- let controllers2;
688
- if (!ct.plugin || ct.plugin === "admin") {
689
- controllers2 = strapi.admin.controllers;
690
- } else {
691
- controllers2 = strapi.plugin(ct.plugin).controllers;
692
- }
693
- const { route } = ctx.state;
694
- if (typeof route.handler !== "string") {
695
- return next();
696
- }
697
- const [, action] = route.handler.split(".");
698
- let actionConfig;
699
- if (!ct.plugin || ct.plugin === "admin") {
700
- actionConfig = strapi.config.get(`admin.layout.${ct.modelName}.actions.${action}`);
701
- } else {
702
- actionConfig = strapi.plugin(ct.plugin).config(`layout.${ct.modelName}.actions.${action}`);
703
- }
704
- if (!isNil(actionConfig)) {
705
- const [controller, action2] = actionConfig.split(".");
706
- if (controller && action2) {
707
- return controllers2[controller.toLowerCase()][action2](ctx, next);
708
- }
709
- }
710
- await next();
711
- };
712
- const admin = {
713
- type: "admin",
714
- routes: [
715
- {
716
- method: "GET",
717
- path: "/init",
718
- handler: "init.getInitData",
719
- config: {
720
- policies: []
721
- }
722
- },
723
- {
724
- method: "GET",
725
- path: "/content-types",
726
- handler: "content-types.findContentTypes",
727
- config: {
728
- policies: []
729
- }
730
- },
731
- {
732
- method: "GET",
733
- path: "/content-types-settings",
734
- handler: "content-types.findContentTypesSettings",
735
- config: {
736
- policies: []
737
- }
738
- },
739
- {
740
- method: "GET",
741
- path: "/content-types/:uid/configuration",
742
- handler: "content-types.findContentTypeConfiguration",
743
- config: {
744
- policies: []
745
- }
746
- },
747
- {
748
- method: "PUT",
749
- path: "/content-types/:uid/configuration",
750
- handler: "content-types.updateContentTypeConfiguration",
751
- config: {
752
- policies: ["admin::isAuthenticatedAdmin"]
753
- }
754
- },
755
- {
756
- method: "GET",
757
- path: "/components",
758
- handler: "components.findComponents",
759
- config: {
760
- policies: []
761
- }
762
- },
763
- {
764
- method: "GET",
765
- path: "/components/:uid/configuration",
766
- handler: "components.findComponentConfiguration",
767
- config: {
768
- policies: []
769
- }
770
- },
771
- {
772
- method: "PUT",
773
- path: "/components/:uid/configuration",
774
- handler: "components.updateComponentConfiguration",
775
- config: {
776
- policies: []
777
- }
778
- },
779
- {
780
- method: "POST",
781
- path: "/uid/generate",
782
- handler: "uid.generateUID",
783
- config: {
784
- policies: []
785
- }
786
- },
787
- {
788
- method: "POST",
789
- path: "/uid/check-availability",
790
- handler: "uid.checkUIDAvailability",
791
- config: {
792
- policies: []
793
- }
794
- },
795
- {
796
- method: "GET",
797
- path: "/relations/:model/:targetField",
798
- handler: "relations.findAvailable",
799
- config: {
800
- policies: ["admin::isAuthenticatedAdmin"]
801
- }
802
- },
803
- {
804
- method: "GET",
805
- path: "/relations/:model/:id/:targetField",
806
- handler: "relations.findExisting",
807
- config: {
808
- policies: ["admin::isAuthenticatedAdmin"]
809
- }
810
- },
811
- {
812
- method: "GET",
813
- path: "/single-types/:model",
814
- handler: "single-types.find",
815
- config: {
816
- middlewares: [routing],
817
- policies: [
818
- "admin::isAuthenticatedAdmin",
819
- {
820
- name: "plugin::content-manager.hasPermissions",
821
- config: { actions: ["plugin::content-manager.explorer.read"] }
822
- }
823
- ]
824
- }
825
- },
826
- {
827
- method: "PUT",
828
- path: "/single-types/:model",
829
- handler: "single-types.createOrUpdate",
830
- config: {
831
- middlewares: [routing],
832
- policies: [
833
- "admin::isAuthenticatedAdmin",
834
- {
835
- name: "plugin::content-manager.hasPermissions",
836
- config: {
837
- actions: [
838
- "plugin::content-manager.explorer.create",
839
- "plugin::content-manager.explorer.update"
840
- ],
841
- hasAtLeastOne: true
842
- }
843
- }
844
- ]
845
- }
846
- },
847
- {
848
- method: "DELETE",
849
- path: "/single-types/:model",
850
- handler: "single-types.delete",
851
- config: {
852
- middlewares: [routing],
853
- policies: [
854
- "admin::isAuthenticatedAdmin",
855
- {
856
- name: "plugin::content-manager.hasPermissions",
857
- config: { actions: ["plugin::content-manager.explorer.delete"] }
858
- }
859
- ]
860
- }
861
- },
862
- {
863
- method: "POST",
864
- path: "/single-types/:model/actions/publish",
865
- handler: "single-types.publish",
866
- config: {
867
- middlewares: [routing],
868
- policies: [
869
- "admin::isAuthenticatedAdmin",
870
- {
871
- name: "plugin::content-manager.hasPermissions",
872
- config: { actions: ["plugin::content-manager.explorer.publish"] }
873
- }
874
- ]
875
- }
876
- },
877
- {
878
- method: "POST",
879
- path: "/single-types/:model/actions/unpublish",
880
- handler: "single-types.unpublish",
881
- config: {
882
- middlewares: [routing],
883
- policies: [
884
- "admin::isAuthenticatedAdmin",
885
- {
886
- name: "plugin::content-manager.hasPermissions",
887
- config: { actions: ["plugin::content-manager.explorer.publish"] }
888
- }
889
- ]
890
- }
891
- },
892
- {
893
- method: "POST",
894
- path: "/single-types/:model/actions/discard",
895
- handler: "single-types.discard",
896
- config: {
897
- middlewares: [routing],
898
- policies: [
899
- "admin::isAuthenticatedAdmin",
900
- {
901
- name: "plugin::content-manager.hasPermissions",
902
- config: { actions: ["plugin::content-manager.explorer.update"] }
903
- }
904
- ]
905
- }
906
- },
907
- {
908
- method: "GET",
909
- path: "/single-types/:model/actions/countDraftRelations",
910
- handler: "single-types.countDraftRelations",
911
- config: {
912
- middlewares: [routing],
913
- policies: [
914
- "admin::isAuthenticatedAdmin",
915
- {
916
- name: "plugin::content-manager.hasPermissions",
917
- config: { actions: ["plugin::content-manager.explorer.read"] }
918
- }
919
- ]
920
- }
921
- },
922
- {
923
- method: "GET",
924
- path: "/collection-types/:model",
925
- handler: "collection-types.find",
926
- config: {
927
- middlewares: [routing],
928
- policies: [
929
- "admin::isAuthenticatedAdmin",
930
- {
931
- name: "plugin::content-manager.hasPermissions",
932
- config: { actions: ["plugin::content-manager.explorer.read"] }
933
- }
934
- ]
935
- }
936
- },
937
- {
938
- method: "POST",
939
- path: "/collection-types/:model",
940
- handler: "collection-types.create",
941
- config: {
942
- middlewares: [routing],
943
- policies: [
944
- "admin::isAuthenticatedAdmin",
945
- {
946
- name: "plugin::content-manager.hasPermissions",
947
- config: { actions: ["plugin::content-manager.explorer.create"] }
948
- }
949
- ]
950
- }
951
- },
952
- {
953
- method: "POST",
954
- path: "/collection-types/:model/clone/:sourceId",
955
- handler: "collection-types.clone",
956
- config: {
957
- middlewares: [routing],
958
- policies: [
959
- "admin::isAuthenticatedAdmin",
960
- {
961
- name: "plugin::content-manager.hasPermissions",
962
- config: { actions: ["plugin::content-manager.explorer.create"] }
963
- }
964
- ]
965
- }
966
- },
967
- {
968
- method: "POST",
969
- path: "/collection-types/:model/auto-clone/:sourceId",
970
- handler: "collection-types.autoClone",
971
- config: {
972
- middlewares: [routing],
973
- policies: [
974
- "admin::isAuthenticatedAdmin",
975
- {
976
- name: "plugin::content-manager.hasPermissions",
977
- config: { actions: ["plugin::content-manager.explorer.create"] }
978
- }
979
- ]
980
- }
981
- },
982
- {
983
- method: "GET",
984
- path: "/collection-types/:model/:id",
985
- handler: "collection-types.findOne",
986
- config: {
987
- middlewares: [routing],
988
- policies: [
989
- "admin::isAuthenticatedAdmin",
990
- {
991
- name: "plugin::content-manager.hasPermissions",
992
- config: { actions: ["plugin::content-manager.explorer.read"] }
993
- }
994
- ]
995
- }
996
- },
997
- {
998
- method: "PUT",
999
- path: "/collection-types/:model/:id",
1000
- handler: "collection-types.update",
1001
- config: {
1002
- middlewares: [routing],
1003
- policies: [
1004
- "admin::isAuthenticatedAdmin",
1005
- {
1006
- name: "plugin::content-manager.hasPermissions",
1007
- config: { actions: ["plugin::content-manager.explorer.update"] }
1008
- }
1009
- ]
1010
- }
1011
- },
1012
- {
1013
- method: "DELETE",
1014
- path: "/collection-types/:model/:id",
1015
- handler: "collection-types.delete",
1016
- config: {
1017
- middlewares: [routing],
1018
- policies: [
1019
- "admin::isAuthenticatedAdmin",
1020
- {
1021
- name: "plugin::content-manager.hasPermissions",
1022
- config: { actions: ["plugin::content-manager.explorer.delete"] }
1023
- }
1024
- ]
1025
- }
1026
- },
1027
- {
1028
- method: "POST",
1029
- path: "/collection-types/:model/actions/publish",
1030
- handler: "collection-types.publish",
1031
- config: {
1032
- middlewares: [routing],
1033
- policies: [
1034
- "admin::isAuthenticatedAdmin",
1035
- {
1036
- name: "plugin::content-manager.hasPermissions",
1037
- config: { actions: ["plugin::content-manager.explorer.publish"] }
1038
- }
1039
- ]
1040
- }
1041
- },
1042
- {
1043
- method: "POST",
1044
- path: "/collection-types/:model/:id/actions/publish",
1045
- handler: "collection-types.publish",
1046
- config: {
1047
- middlewares: [routing],
1048
- policies: [
1049
- "admin::isAuthenticatedAdmin",
1050
- {
1051
- name: "plugin::content-manager.hasPermissions",
1052
- config: { actions: ["plugin::content-manager.explorer.publish"] }
1053
- }
1054
- ]
1055
- }
1056
- },
1057
- {
1058
- method: "POST",
1059
- path: "/collection-types/:model/:id/actions/unpublish",
1060
- handler: "collection-types.unpublish",
1061
- config: {
1062
- middlewares: [routing],
1063
- policies: [
1064
- "admin::isAuthenticatedAdmin",
1065
- {
1066
- name: "plugin::content-manager.hasPermissions",
1067
- config: { actions: ["plugin::content-manager.explorer.publish"] }
1068
- }
1069
- ]
1070
- }
1071
- },
1072
- {
1073
- method: "POST",
1074
- path: "/collection-types/:model/:id/actions/discard",
1075
- handler: "collection-types.discard",
1076
- config: {
1077
- middlewares: [routing],
1078
- policies: [
1079
- "admin::isAuthenticatedAdmin",
1080
- {
1081
- name: "plugin::content-manager.hasPermissions",
1082
- config: { actions: ["plugin::content-manager.explorer.update"] }
1083
- }
1084
- ]
1085
- }
1086
- },
1087
- {
1088
- method: "POST",
1089
- path: "/collection-types/:model/actions/bulkDelete",
1090
- handler: "collection-types.bulkDelete",
1091
- config: {
1092
- middlewares: [routing],
1093
- policies: [
1094
- "admin::isAuthenticatedAdmin",
1095
- {
1096
- name: "plugin::content-manager.hasPermissions",
1097
- config: { actions: ["plugin::content-manager.explorer.delete"] }
1098
- }
1099
- ]
1100
- }
1101
- },
1102
- {
1103
- method: "POST",
1104
- path: "/collection-types/:model/actions/bulkPublish",
1105
- handler: "collection-types.bulkPublish",
1106
- config: {
1107
- middlewares: [routing],
1108
- policies: [
1109
- "admin::isAuthenticatedAdmin",
1110
- {
1111
- name: "plugin::content-manager.hasPermissions",
1112
- config: { actions: ["plugin::content-manager.explorer.publish"] }
1113
- }
1114
- ]
1115
- }
1116
- },
1117
- {
1118
- method: "POST",
1119
- path: "/collection-types/:model/actions/bulkUnpublish",
1120
- handler: "collection-types.bulkUnpublish",
1121
- config: {
1122
- middlewares: [routing],
1123
- policies: [
1124
- "admin::isAuthenticatedAdmin",
1125
- {
1126
- name: "plugin::content-manager.hasPermissions",
1127
- config: { actions: ["plugin::content-manager.explorer.publish"] }
1128
- }
1129
- ]
1130
- }
1131
- },
1132
- {
1133
- method: "GET",
1134
- path: "/collection-types/:model/:id/actions/countDraftRelations",
1135
- handler: "collection-types.countDraftRelations",
1136
- config: {
1137
- middlewares: [routing],
1138
- policies: [
1139
- "admin::isAuthenticatedAdmin",
1140
- {
1141
- name: "plugin::content-manager.hasPermissions",
1142
- config: { actions: ["plugin::content-manager.explorer.read"] }
1143
- }
1144
- ]
1145
- }
1146
- },
1147
- {
1148
- method: "GET",
1149
- path: "/collection-types/:model/actions/countManyEntriesDraftRelations",
1150
- handler: "collection-types.countManyEntriesDraftRelations",
1151
- config: {
1152
- middlewares: [routing],
1153
- policies: [
1154
- "admin::isAuthenticatedAdmin",
1155
- {
1156
- name: "plugin::content-manager.hasPermissions",
1157
- config: { actions: ["plugin::content-manager.explorer.read"] }
1158
- }
1159
- ]
1160
- }
1161
- }
1162
- ]
1163
- };
1164
- const routes = {
1165
- admin,
1166
- ...history.routes ? history.routes : {}
1167
- };
1168
- const hasPermissionsSchema = yup$1.object({
1169
- actions: yup$1.array().of(yup$1.string()),
1170
- hasAtLeastOne: yup$1.boolean()
1171
- });
1172
- const validateHasPermissionsInput = validateYupSchemaSync(hasPermissionsSchema);
1173
- const { createPolicy } = policy;
1174
- const hasPermissions = createPolicy({
1175
- name: "plugin::content-manager.hasPermissions",
1176
- validator: validateHasPermissionsInput,
1177
- handler(ctx, config = {}) {
1178
- const { actions = [], hasAtLeastOne = false } = config;
1179
- const { userAbility } = ctx.state;
1180
- const { model } = ctx.params;
1181
- const isAuthorized = hasAtLeastOne ? actions.some((action) => userAbility.can(action, model)) : actions.every((action) => userAbility.can(action, model));
1182
- return isAuthorized;
1183
- }
1184
- });
1185
- const policies = {
1186
- hasPermissions
1187
- };
1188
- const { getNonVisibleAttributes, getWritableAttributes } = contentTypes$1;
1189
- const { PUBLISHED_AT_ATTRIBUTE: PUBLISHED_AT_ATTRIBUTE$3, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypes$1.constants;
1190
- const NON_SORTABLES = ["component", "json", "media", "richtext", "dynamiczone", "blocks"];
1191
- const SORTABLE_RELATIONS = ["oneToOne", "manyToOne"];
1192
- const NON_LISTABLES = ["json", "password", "richtext", "dynamiczone", "blocks"];
1193
- const LISTABLE_RELATIONS = ["oneToOne", "oneToMany", "manyToOne", "manyToMany"];
1194
- const isHidden = (schema, name) => {
1195
- if (!_.has(schema.attributes, name)) {
1196
- return false;
1197
- }
1198
- const isHidden2 = _.get(schema, ["config", "attributes", name, "hidden"], false);
1199
- if (isHidden2 === true) {
1200
- return true;
1201
- }
1202
- return false;
1203
- };
1204
- const isListable = (schema, name) => {
1205
- if (!_.has(schema.attributes, name)) {
1206
- return false;
1207
- }
1208
- if (isHidden(schema, name)) {
1209
- return false;
1210
- }
1211
- const attribute = schema.attributes[name];
1212
- if (NON_LISTABLES.includes(attribute.type)) {
1213
- return false;
1214
- }
1215
- if (isRelation$1(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {
1216
- return false;
1217
- }
1218
- return true;
1219
- };
1220
- const isSortable = (schema, name) => {
1221
- if (!_.has(schema.attributes, name)) {
1222
- return false;
1223
- }
1224
- if (schema.modelType === "component" && name === "id")
1225
- return false;
1226
- const attribute = schema.attributes[name];
1227
- if (NON_SORTABLES.includes(attribute.type)) {
1228
- return false;
1229
- }
1230
- if (isRelation$1(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {
1231
- return false;
1232
- }
1233
- return true;
1234
- };
1235
- const isSearchable = (schema, name) => {
1236
- return isSortable(schema, name);
1237
- };
1238
- const isVisible$1 = (schema, name) => {
1239
- if (!_.has(schema.attributes, name)) {
1240
- return false;
1241
- }
1242
- if (isHidden(schema, name)) {
1243
- return false;
1244
- }
1245
- if (isTimestamp(schema, name) || name === "id") {
1246
- return false;
1247
- }
1248
- if (isPublicationField(name)) {
1249
- return false;
1250
- }
1251
- if (isCreatorField(schema, name)) {
1252
- return false;
1253
- }
1254
- return true;
1255
- };
1256
- const isPublicationField = (name) => PUBLISHED_AT_ATTRIBUTE$3 === name;
1257
- const isTimestamp = (schema, name) => {
1258
- if (!_.has(schema.attributes, name)) {
1259
- return false;
1260
- }
1261
- const timestamps = contentTypes$1.getTimestamps(schema);
1262
- if (!timestamps || !Array.isArray(timestamps)) {
1263
- return false;
1264
- }
1265
- if (timestamps.includes(name)) {
1266
- return true;
1267
- }
1268
- };
1269
- const isCreatorField = (schema, name) => {
1270
- if (!_.has(schema.attributes, name)) {
1271
- return false;
1272
- }
1273
- const creatorFields = contentTypes$1.getCreatorFields(schema);
1274
- if (!creatorFields || !Array.isArray(creatorFields)) {
1275
- return false;
1276
- }
1277
- if (creatorFields.includes(name)) {
1278
- return true;
1279
- }
1280
- };
1281
- const isRelation$1 = (attribute) => attribute.type === "relation";
1282
- const hasRelationAttribute = (schema, name) => {
1283
- if (!_.has(schema.attributes, name)) {
1284
- return false;
1285
- }
1286
- if (isHidden(schema, name)) {
1287
- return false;
1288
- }
1289
- if (!isVisible$1(schema, name)) {
1290
- return false;
1291
- }
1292
- return isRelation$1(schema.attributes[name]);
1293
- };
1294
- const hasEditableAttribute = (schema, name) => {
1295
- if (!_.has(schema.attributes, name)) {
1296
- return false;
1297
- }
1298
- if (isHidden(schema, name)) {
1299
- return false;
1300
- }
1301
- if (!isVisible$1(schema, name)) {
1302
- return false;
1303
- }
1304
- return true;
1305
- };
1306
- const findFirstStringAttribute = (schema) => {
1307
- return Object.keys(schema.attributes || {}).find((key) => {
1308
- const { type } = schema.attributes[key];
1309
- return type === "string" && key !== "id";
1310
- });
1311
- };
1312
- const getDefaultMainField = (schema) => findFirstStringAttribute(schema) || "id";
1313
- const getSortableAttributes = (schema) => {
1314
- const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));
1315
- const model = strapi.getModel(schema.uid);
1316
- const nonVisibleWritableAttributes = intersection(
1317
- getNonVisibleAttributes(model),
1318
- getWritableAttributes(model)
1319
- );
1320
- return [
1321
- "id",
1322
- ...validAttributes,
1323
- ...nonVisibleWritableAttributes,
1324
- CREATED_BY_ATTRIBUTE,
1325
- UPDATED_BY_ATTRIBUTE
1326
- ];
1327
- };
1328
- const DEFAULT_SETTINGS = {
1329
- bulkable: true,
1330
- filterable: true,
1331
- searchable: true,
1332
- pageSize: 10
1333
- };
1334
- const settingsFields = [
1335
- "searchable",
1336
- "filterable",
1337
- "bulkable",
1338
- "pageSize",
1339
- "mainField",
1340
- "defaultSortBy",
1341
- "defaultSortOrder"
1342
- ];
1343
- const getModelSettings = pipe([propOr({}, "config.settings"), pick(settingsFields)]);
1344
- async function isValidDefaultSort(schema, value) {
1345
- const parsedValue = qs.parse(value);
1346
- const omitNonSortableAttributes = ({ schema: schema2, key }, { remove }) => {
1347
- const sortableAttributes = getSortableAttributes(schema2);
1348
- if (!sortableAttributes.includes(key)) {
1349
- remove(key);
1350
- }
1351
- };
1352
- const sanitizedValue = await traverse.traverseQuerySort(
1353
- omitNonSortableAttributes,
1354
- { schema, getModel: strapi.getModel.bind(strapi) },
1355
- parsedValue
1356
- );
1357
- return isEqual(parsedValue, sanitizedValue);
1358
- }
1359
- const createDefaultSettings = async (schema) => {
1360
- const defaultField = getDefaultMainField(schema);
1361
- return {
1362
- ...DEFAULT_SETTINGS,
1363
- mainField: defaultField,
1364
- defaultSortBy: defaultField,
1365
- defaultSortOrder: "ASC",
1366
- ...getModelSettings(schema)
1367
- };
1368
- };
1369
- const syncSettings = async (configuration, schema) => {
1370
- if (isEmpty(configuration.settings))
1371
- return createDefaultSettings(schema);
1372
- const defaultField = getDefaultMainField(schema);
1373
- const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};
1374
- return {
1375
- ...configuration.settings,
1376
- mainField: isSortable(schema, mainField) ? mainField : defaultField,
1377
- defaultSortBy: await isValidDefaultSort(schema, defaultSortBy) ? defaultSortBy : defaultField
1378
- };
1379
- };
1380
- const createModelConfigurationSchema = (schema, opts = {}) => yup$1.object().shape({
1381
- settings: createSettingsSchema(schema).default(null).nullable(),
1382
- metadatas: createMetadasSchema(schema).default(null).nullable(),
1383
- layouts: createLayoutsSchema(schema, opts).default(null).nullable(),
1384
- options: yup$1.object().optional()
1385
- }).noUnknown();
1386
- const createSettingsSchema = (schema) => {
1387
- const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));
1388
- return yup$1.object().shape({
1389
- bulkable: yup$1.boolean().required(),
1390
- filterable: yup$1.boolean().required(),
1391
- pageSize: yup$1.number().integer().min(10).max(100).required(),
1392
- searchable: yup$1.boolean().required(),
1393
- // should be reset when the type changes
1394
- mainField: yup$1.string().oneOf(validAttributes.concat("id")).default("id"),
1395
- // should be reset when the type changes
1396
- defaultSortBy: yup$1.string().test(
1397
- "is-valid-sort-attribute",
1398
- "${path} is not a valid sort attribute",
1399
- async (value) => isValidDefaultSort(schema, value)
1400
- ).default("id"),
1401
- defaultSortOrder: yup$1.string().oneOf(["ASC", "DESC"]).default("ASC")
1402
- }).noUnknown();
1403
- };
1404
- const createMetadasSchema = (schema) => {
1405
- return yup$1.object().shape(
1406
- Object.keys(schema.attributes).reduce((acc, key) => {
1407
- acc[key] = yup$1.object().shape({
1408
- edit: yup$1.object().shape({
1409
- label: yup$1.string(),
1410
- description: yup$1.string(),
1411
- placeholder: yup$1.string(),
1412
- editable: yup$1.boolean(),
1413
- visible: yup$1.boolean(),
1414
- mainField: yup$1.lazy((value) => {
1415
- if (!value) {
1416
- return yup$1.string();
1417
- }
1418
- const targetSchema = getService$1("content-types").findContentType(
1419
- schema.attributes[key].targetModel
1420
- );
1421
- if (!targetSchema) {
1422
- return yup$1.string();
1423
- }
1424
- const validAttributes = Object.keys(targetSchema.attributes).filter(
1425
- (key2) => isListable(targetSchema, key2)
1426
- );
1427
- return yup$1.string().oneOf(validAttributes.concat("id")).default("id");
1428
- })
1429
- }).noUnknown().required(),
1430
- list: yup$1.object().shape({
1431
- label: yup$1.string(),
1432
- searchable: yup$1.boolean(),
1433
- sortable: yup$1.boolean()
1434
- }).noUnknown().required()
1435
- }).noUnknown();
1436
- return acc;
1437
- }, {})
1438
- );
1439
- };
1440
- const createArrayTest = ({ allowUndefined = false } = {}) => ({
1441
- name: "isArray",
1442
- message: "${path} is required and must be an array",
1443
- test: (val) => allowUndefined === true && val === void 0 ? true : Array.isArray(val)
1444
- });
1445
- const createLayoutsSchema = (schema, opts = {}) => {
1446
- const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));
1447
- const editAttributes = Object.keys(schema.attributes).filter(
1448
- (key) => hasEditableAttribute(schema, key)
1449
- );
1450
- return yup$1.object().shape({
1451
- edit: yup$1.array().of(
1452
- yup$1.array().of(
1453
- yup$1.object().shape({
1454
- name: yup$1.string().oneOf(editAttributes).required(),
1455
- size: yup$1.number().integer().positive().required()
1456
- }).noUnknown()
1457
- )
1458
- ).test(createArrayTest(opts)),
1459
- list: yup$1.array().of(yup$1.string().oneOf(validAttributes)).test(createArrayTest(opts))
1460
- });
1461
- };
1462
- const { PaginationError, ValidationError } = errors;
1463
- const TYPES = ["singleType", "collectionType"];
1464
- const kindSchema = yup$1.string().oneOf(TYPES).nullable();
1465
- const bulkActionInputSchema = yup$1.object({
1466
- documentIds: yup$1.array().of(yup$1.strapiID()).min(1).required()
1467
- }).required();
1468
- const generateUIDInputSchema = yup$1.object({
1469
- contentTypeUID: yup$1.string().required(),
1470
- field: yup$1.string().required(),
1471
- data: yup$1.object().required()
1472
- });
1473
- const checkUIDAvailabilityInputSchema = yup$1.object({
1474
- contentTypeUID: yup$1.string().required(),
1475
- field: yup$1.string().required(),
1476
- value: yup$1.string().matches(/^[A-Za-z0-9-_.~]*$/).required()
1477
- });
1478
- const validateUIDField = (contentTypeUID, field) => {
1479
- const model = strapi.contentTypes[contentTypeUID];
1480
- if (!model) {
1481
- throw new ValidationError("ContentType not found");
1482
- }
1483
- if (!_.has(model, ["attributes", field]) || _.get(model, ["attributes", field, "type"]) !== "uid") {
1484
- throw new ValidationError(`${field} must be a valid \`uid\` attribute`);
1485
- }
1486
- };
1487
- const validateKind = validateYupSchema(kindSchema);
1488
- const validateBulkActionInput = validateYupSchema(bulkActionInputSchema);
1489
- const validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);
1490
- const validateCheckUIDAvailabilityInput = validateYupSchema(checkUIDAvailabilityInputSchema);
1491
- const { isVisibleAttribute: isVisibleAttribute$2 } = strapiUtils.contentTypes;
1492
- function checkRelation(model, attributeName, path) {
1493
- if (!isVisibleAttribute$2(model, attributeName)) {
1494
- return [];
1495
- }
1496
- const { relation, inversedBy, mappedBy } = model.attributes[attributeName];
1497
- if (["oneToOne", "oneToMany"].includes(relation) && [mappedBy, inversedBy].some((key) => key != null)) {
1498
- return [[[...path, attributeName], "relation"]];
1499
- }
1500
- return [];
1501
- }
1502
- const getProhibitedCloningFields = (uid2, pathPrefix = []) => {
1503
- const model = strapi.getModel(uid2);
1504
- const prohibitedFields = Object.keys(model.attributes).reduce(
1505
- (acc, attributeName) => {
1506
- const attribute = model.attributes[attributeName];
1507
- const attributePath = [...pathPrefix, attributeName];
1508
- switch (attribute.type) {
1509
- case "relation":
1510
- return [...acc, ...checkRelation(model, attributeName, pathPrefix)];
1511
- case "component":
1512
- return [...acc, ...getProhibitedCloningFields(attribute.component, attributePath)];
1513
- case "dynamiczone":
1514
- return [
1515
- ...acc,
1516
- ...(attribute.components || []).flatMap(
1517
- (componentUID) => getProhibitedCloningFields(componentUID, [
1518
- ...attributePath,
1519
- strapi.getModel(componentUID).info.displayName
1520
- ])
1521
- )
1522
- ];
1523
- case "uid":
1524
- return [...acc, [attributePath, "unique"]];
1525
- default:
1526
- if (attribute?.unique) {
1527
- return [...acc, [attributePath, "unique"]];
1528
- }
1529
- return acc;
1530
- }
1531
- },
1532
- []
1533
- );
1534
- return prohibitedFields;
1535
- };
1536
- const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []) => {
1537
- const model = strapi.getModel(uid2);
1538
- const canCreate = (path2) => permissionChecker2.can.create(null, path2);
1539
- return Object.keys(model.attributes).reduce((body2, attributeName) => {
1540
- const attribute = model.attributes[attributeName];
1541
- const attributePath = [...path, attributeName].join(".");
1542
- if (!isVisibleAttribute$2(model, attributeName)) {
1543
- return body2;
1544
- }
1545
- switch (attribute.type) {
1546
- case "relation": {
1547
- if (canCreate(attributePath))
1548
- return body2;
1549
- return set(attributePath, { set: [] }, body2);
1550
- }
1551
- case "component": {
1552
- return excludeNotCreatableFields(attribute.component, permissionChecker2)(body2, [
1553
- ...path,
1554
- attributeName
1555
- ]);
1556
- }
1557
- default: {
1558
- if (canCreate(attributePath))
1559
- return body2;
1560
- return set(attributePath, null, body2);
1561
- }
1562
- }
1563
- }, body);
1564
- };
1565
- const singleLocaleSchema = yup$1.string().nullable();
1566
- const multipleLocaleSchema = yup$1.lazy(
1567
- (value) => Array.isArray(value) ? yup$1.array().of(singleLocaleSchema.required()) : singleLocaleSchema
1568
- );
1569
- const statusSchema = yup$1.mixed().oneOf(["draft", "published"], "Invalid status");
1570
- const getDocumentLocaleAndStatus = async (request, opts = { allowMultipleLocales: false }) => {
1571
- const { allowMultipleLocales } = opts;
1572
- const { locale, status, ...rest } = request || {};
1573
- const schema = yup$1.object().shape({
1574
- locale: allowMultipleLocales ? multipleLocaleSchema : singleLocaleSchema,
1575
- status: statusSchema
1576
- });
1577
- try {
1578
- await validateYupSchema(schema, { strict: true, abortEarly: false })(request);
1579
- return { locale, status, ...rest };
1580
- } catch (error) {
1581
- throw new errors.ValidationError(`Validation error: ${error.message}`);
1582
- }
1583
- };
1584
- const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
1585
- const documentMetadata2 = getService$1("document-metadata");
1586
- const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
1587
- let {
1588
- meta: { availableLocales, availableStatus }
1589
- } = serviceOutput;
1590
- const metadataSanitizer = permissionChecker2.sanitizeOutput;
1591
- availableLocales = await async.map(
1592
- availableLocales,
1593
- async (localeDocument) => metadataSanitizer(localeDocument)
1594
- );
1595
- availableStatus = await async.map(
1596
- availableStatus,
1597
- async (statusDocument) => metadataSanitizer(statusDocument)
1598
- );
1599
- return {
1600
- ...serviceOutput,
1601
- meta: {
1602
- availableLocales,
1603
- availableStatus
1604
- }
1605
- };
1606
- };
1607
- const createDocument = async (ctx, opts) => {
1608
- const { userAbility, user } = ctx.state;
1609
- const { model } = ctx.params;
1610
- const { body } = ctx.request;
1611
- const documentManager2 = getService$1("document-manager");
1612
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1613
- if (permissionChecker2.cannot.create()) {
1614
- throw new errors.ForbiddenError();
1615
- }
1616
- const pickPermittedFields = permissionChecker2.sanitizeCreateInput;
1617
- const setCreator = setCreatorFields({ user });
1618
- const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
1619
- const sanitizedBody = await sanitizeFn(body);
1620
- const { locale, status = "draft" } = await getDocumentLocaleAndStatus(body);
1621
- return documentManager2.create(model, {
1622
- data: sanitizedBody,
1623
- locale,
1624
- status,
1625
- populate: opts?.populate
1626
- });
1627
- };
1628
- const updateDocument = async (ctx, opts) => {
1629
- const { userAbility, user } = ctx.state;
1630
- const { id, model } = ctx.params;
1631
- const { body } = ctx.request;
1632
- const documentManager2 = getService$1("document-manager");
1633
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1634
- if (permissionChecker2.cannot.update()) {
1635
- throw new errors.ForbiddenError();
1636
- }
1637
- const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
1638
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1639
- const { locale } = await getDocumentLocaleAndStatus(body);
1640
- const [documentVersion, documentExists] = await Promise.all([
1641
- documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
1642
- documentManager2.exists(model, id)
1643
- ]);
1644
- if (!documentExists) {
1645
- throw new errors.NotFoundError();
1646
- }
1647
- if (documentVersion) {
1648
- if (permissionChecker2.cannot.update(documentVersion)) {
1649
- throw new errors.ForbiddenError();
1650
- }
1651
- } else if (permissionChecker2.cannot.create()) {
1652
- throw new errors.ForbiddenError();
1653
- }
1654
- const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1655
- const setCreator = setCreatorFields({ user, isEdition: true });
1656
- const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
1657
- const sanitizedBody = await sanitizeFn(body);
1658
- return documentManager2.update(documentVersion?.documentId || id, model, {
1659
- data: sanitizedBody,
1660
- populate: opts?.populate,
1661
- locale
1662
- });
1663
- };
1664
- const collectionTypes = {
1665
- async find(ctx) {
1666
- const { userAbility } = ctx.state;
1667
- const { model } = ctx.params;
1668
- const { query } = ctx.request;
1669
- const documentMetadata2 = getService$1("document-metadata");
1670
- const documentManager2 = getService$1("document-manager");
1671
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1672
- if (permissionChecker2.cannot.read()) {
1673
- return ctx.forbidden();
1674
- }
1675
- const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
1676
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1677
- const { locale, status } = await getDocumentLocaleAndStatus(query);
1678
- const { results: documents, pagination: pagination2 } = await documentManager2.findPage(
1679
- { ...permissionQuery, populate, locale, status },
1680
- model
1681
- );
1682
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(
1683
- model,
1684
- documents
1685
- );
1686
- const setStatus = (document) => {
1687
- const availableStatuses = documentsAvailableStatus.filter(
1688
- (d) => d.documentId === document.documentId
1689
- );
1690
- document.status = documentMetadata2.getStatus(document, availableStatuses);
1691
- return document;
1692
- };
1693
- const results = await async.map(
1694
- documents,
1695
- async.pipe(permissionChecker2.sanitizeOutput, setStatus)
1696
- );
1697
- ctx.body = {
1698
- results,
1699
- pagination: pagination2
1700
- };
1701
- },
1702
- async findOne(ctx) {
1703
- const { userAbility } = ctx.state;
1704
- const { model, id } = ctx.params;
1705
- const documentManager2 = getService$1("document-manager");
1706
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1707
- if (permissionChecker2.cannot.read()) {
1708
- return ctx.forbidden();
1709
- }
1710
- const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
1711
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1712
- const { locale, status = "draft" } = await getDocumentLocaleAndStatus(ctx.query);
1713
- const version = await documentManager2.findOne(id, model, {
1714
- populate,
1715
- locale,
1716
- status
1717
- });
1718
- if (!version) {
1719
- const exists = await documentManager2.exists(model, id);
1720
- if (!exists) {
1721
- return ctx.notFound();
1722
- }
1723
- const { meta } = await formatDocumentWithMetadata(
1724
- permissionChecker2,
1725
- model,
1726
- // @ts-expect-error TODO: fix
1727
- { id, locale, publishedAt: null },
1728
- { availableLocales: true, availableStatus: false }
1729
- );
1730
- ctx.body = { data: {}, meta };
1731
- return;
1732
- }
1733
- if (permissionChecker2.cannot.read(version)) {
1734
- return ctx.forbidden();
1735
- }
1736
- const sanitizedDocument = await permissionChecker2.sanitizeOutput(version);
1737
- ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
1738
- },
1739
- async create(ctx) {
1740
- const { userAbility } = ctx.state;
1741
- const { model } = ctx.params;
1742
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1743
- const [totalEntries, document] = await Promise.all([
1744
- strapi.db.query(model).count(),
1745
- createDocument(ctx)
1746
- ]);
1747
- const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
1748
- ctx.status = 201;
1749
- ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument, {
1750
- // Empty metadata as it's not relevant for a new document
1751
- availableLocales: false,
1752
- availableStatus: false
1753
- });
1754
- if (totalEntries === 0) {
1755
- strapi.telemetry.send("didCreateFirstContentTypeEntry", {
1756
- eventProperties: { model }
1757
- });
1758
- }
1759
- },
1760
- async update(ctx) {
1761
- const { userAbility } = ctx.state;
1762
- const { model } = ctx.params;
1763
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1764
- const updatedVersion = await updateDocument(ctx);
1765
- const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
1766
- ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
1767
- },
1768
- async clone(ctx) {
1769
- const { userAbility, user } = ctx.state;
1770
- const { model, sourceId: id } = ctx.params;
1771
- const { body } = ctx.request;
1772
- const documentManager2 = getService$1("document-manager");
1773
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1774
- if (permissionChecker2.cannot.create()) {
1775
- return ctx.forbidden();
1776
- }
1777
- const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
1778
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1779
- const { locale } = await getDocumentLocaleAndStatus(body);
1780
- const document = await documentManager2.findOne(id, model, {
1781
- populate,
1782
- locale,
1783
- status: "draft"
1784
- });
1785
- if (!document) {
1786
- return ctx.notFound();
1787
- }
1788
- const pickPermittedFields = permissionChecker2.sanitizeCreateInput;
1789
- const setCreator = setCreatorFields({ user });
1790
- const excludeNotCreatable = excludeNotCreatableFields(model, permissionChecker2);
1791
- const sanitizeFn = async.pipe(pickPermittedFields, setCreator, excludeNotCreatable);
1792
- const sanitizedBody = await sanitizeFn(body);
1793
- const clonedDocument = await documentManager2.clone(document.documentId, sanitizedBody, model);
1794
- const sanitizedDocument = await permissionChecker2.sanitizeOutput(clonedDocument);
1795
- ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument, {
1796
- // Empty metadata as it's not relevant for a new document
1797
- availableLocales: false,
1798
- availableStatus: false
1799
- });
1800
- },
1801
- async autoClone(ctx) {
1802
- const { model } = ctx.params;
1803
- const prohibitedFields = getProhibitedCloningFields(model);
1804
- if (prohibitedFields.length > 0) {
1805
- return ctx.badRequest(
1806
- "Entity could not be cloned as it has unique and/or relational fields. Please edit those fields manually and save to complete the cloning.",
1807
- {
1808
- prohibitedFields
1809
- }
1810
- );
1811
- }
1812
- await this.clone(ctx);
1813
- },
1814
- async delete(ctx) {
1815
- const { userAbility } = ctx.state;
1816
- const { id, model } = ctx.params;
1817
- const documentManager2 = getService$1("document-manager");
1818
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1819
- if (permissionChecker2.cannot.delete()) {
1820
- return ctx.forbidden();
1821
- }
1822
- const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
1823
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1824
- const { locale } = await getDocumentLocaleAndStatus(ctx.query);
1825
- const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
1826
- if (documentLocales.length === 0) {
1827
- return ctx.notFound();
1828
- }
1829
- for (const document of documentLocales) {
1830
- if (permissionChecker2.cannot.delete(document)) {
1831
- return ctx.forbidden();
1832
- }
1833
- }
1834
- const result = await documentManager2.delete(id, model, { locale });
1835
- ctx.body = await permissionChecker2.sanitizeOutput(result);
1836
- },
1837
- /**
1838
- * Publish a document version.
1839
- * Supports creating/saving a document and publishing it in one request.
1840
- */
1841
- async publish(ctx) {
1842
- const { userAbility } = ctx.state;
1843
- const { id, model } = ctx.params;
1844
- const { body } = ctx.request;
1845
- const documentManager2 = getService$1("document-manager");
1846
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1847
- if (permissionChecker2.cannot.publish()) {
1848
- return ctx.forbidden();
1849
- }
1850
- const publishedDocument = await strapi.db.transaction(async () => {
1851
- const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1852
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1853
- const document = id ? await updateDocument(ctx, { populate }) : await createDocument(ctx, { populate });
1854
- if (permissionChecker2.cannot.publish(document)) {
1855
- throw new errors.ForbiddenError();
1856
- }
1857
- const { locale } = await getDocumentLocaleAndStatus(body);
1858
- const publishResult = await documentManager2.publish(document.documentId, model, {
1859
- locale
1860
- // TODO: Allow setting creator fields on publish
1861
- // data: setCreatorFields({ user, isEdition: true })({}),
1862
- });
1863
- if (!publishResult || publishResult.length === 0) {
1864
- throw new errors.NotFoundError("Document not found or already published.");
1865
- }
1866
- return publishResult[0];
1867
- });
1868
- const sanitizedDocument = await permissionChecker2.sanitizeOutput(publishedDocument);
1869
- ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
1870
- },
1871
- async bulkPublish(ctx) {
1872
- const { userAbility } = ctx.state;
1873
- const { model } = ctx.params;
1874
- const { body } = ctx.request;
1875
- const { documentIds } = body;
1876
- await validateBulkActionInput(body);
1877
- const documentManager2 = getService$1("document-manager");
1878
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1879
- if (permissionChecker2.cannot.publish()) {
1880
- return ctx.forbidden();
1881
- }
1882
- const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1883
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1884
- const { locale } = await getDocumentLocaleAndStatus(body, { allowMultipleLocales: true });
1885
- const entityPromises = documentIds.map(
1886
- (documentId) => documentManager2.findLocales(documentId, model, { populate, locale, isPublished: false })
1887
- );
1888
- const entities = (await Promise.all(entityPromises)).flat();
1889
- for (const entity of entities) {
1890
- if (!entity) {
1891
- return ctx.notFound();
1892
- }
1893
- if (permissionChecker2.cannot.publish(entity)) {
1894
- return ctx.forbidden();
1895
- }
1896
- }
1897
- const count = await documentManager2.publishMany(model, documentIds, locale);
1898
- ctx.body = { count };
1899
- },
1900
- async bulkUnpublish(ctx) {
1901
- const { userAbility } = ctx.state;
1902
- const { model } = ctx.params;
1903
- const { body } = ctx.request;
1904
- const { documentIds } = body;
1905
- await validateBulkActionInput(body);
1906
- const documentManager2 = getService$1("document-manager");
1907
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1908
- if (permissionChecker2.cannot.unpublish()) {
1909
- return ctx.forbidden();
1910
- }
1911
- const { locale } = await getDocumentLocaleAndStatus(body);
1912
- const entityPromises = documentIds.map(
1913
- (documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
1914
- );
1915
- const entities = (await Promise.all(entityPromises)).flat();
1916
- for (const entity of entities) {
1917
- if (!entity) {
1918
- return ctx.notFound();
1919
- }
1920
- if (permissionChecker2.cannot.publish(entity)) {
1921
- return ctx.forbidden();
1922
- }
1923
- }
1924
- const entitiesIds = entities.map((document) => document.documentId);
1925
- const { count } = await documentManager2.unpublishMany(entitiesIds, model, { locale });
1926
- ctx.body = { count };
1927
- },
1928
- async unpublish(ctx) {
1929
- const { userAbility } = ctx.state;
1930
- const { id, model } = ctx.params;
1931
- const {
1932
- body: { discardDraft, ...body }
1933
- } = ctx.request;
1934
- const documentManager2 = getService$1("document-manager");
1935
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1936
- if (permissionChecker2.cannot.unpublish()) {
1937
- return ctx.forbidden();
1938
- }
1939
- if (discardDraft && permissionChecker2.cannot.discard()) {
1940
- return ctx.forbidden();
1941
- }
1942
- const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
1943
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1944
- const { locale } = await getDocumentLocaleAndStatus(body);
1945
- const document = await documentManager2.findOne(id, model, {
1946
- populate,
1947
- locale,
1948
- status: "published"
1949
- });
1950
- if (!document) {
1951
- throw new errors.NotFoundError();
1952
- }
1953
- if (permissionChecker2.cannot.unpublish(document)) {
1954
- throw new errors.ForbiddenError();
1955
- }
1956
- if (discardDraft && permissionChecker2.cannot.discard(document)) {
1957
- throw new errors.ForbiddenError();
1958
- }
1959
- await strapi.db.transaction(async () => {
1960
- if (discardDraft) {
1961
- await documentManager2.discardDraft(document.documentId, model, { locale });
1962
- }
1963
- ctx.body = await async.pipe(
1964
- (document2) => documentManager2.unpublish(document2.documentId, model, { locale }),
1965
- permissionChecker2.sanitizeOutput,
1966
- (document2) => formatDocumentWithMetadata(permissionChecker2, model, document2)
1967
- )(document);
1968
- });
1969
- },
1970
- async discard(ctx) {
1971
- const { userAbility } = ctx.state;
1972
- const { id, model } = ctx.params;
1973
- const { body } = ctx.request;
1974
- const documentManager2 = getService$1("document-manager");
1975
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1976
- if (permissionChecker2.cannot.discard()) {
1977
- return ctx.forbidden();
1978
- }
1979
- const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
1980
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1981
- const { locale } = await getDocumentLocaleAndStatus(body);
1982
- const document = await documentManager2.findOne(id, model, {
1983
- populate,
1984
- locale,
1985
- status: "published"
1986
- });
1987
- if (!document) {
1988
- return ctx.notFound();
1989
- }
1990
- if (permissionChecker2.cannot.discard(document)) {
1991
- return ctx.forbidden();
1992
- }
1993
- ctx.body = await async.pipe(
1994
- (document2) => documentManager2.discardDraft(document2.documentId, model, { locale }),
1995
- permissionChecker2.sanitizeOutput,
1996
- (document2) => formatDocumentWithMetadata(permissionChecker2, model, document2)
1997
- )(document);
1998
- },
1999
- async bulkDelete(ctx) {
2000
- const { userAbility } = ctx.state;
2001
- const { model } = ctx.params;
2002
- const { query, body } = ctx.request;
2003
- const { documentIds } = body;
2004
- await validateBulkActionInput(body);
2005
- const documentManager2 = getService$1("document-manager");
2006
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2007
- if (permissionChecker2.cannot.delete()) {
2008
- return ctx.forbidden();
2009
- }
2010
- const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
2011
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2012
- const { locale } = await getDocumentLocaleAndStatus(body);
2013
- const documentLocales = await documentManager2.findLocales(documentIds, model, {
2014
- populate,
2015
- locale
2016
- });
2017
- if (documentLocales.length === 0) {
2018
- return ctx.notFound();
2019
- }
2020
- for (const document of documentLocales) {
2021
- if (permissionChecker2.cannot.delete(document)) {
2022
- return ctx.forbidden();
2023
- }
2024
- }
2025
- const localeDocumentsIds = documentLocales.map((document) => document.documentId);
2026
- const { count } = await documentManager2.deleteMany(localeDocumentsIds, model, { locale });
2027
- ctx.body = { count };
2028
- },
2029
- async countDraftRelations(ctx) {
2030
- const { userAbility } = ctx.state;
2031
- const { model, id } = ctx.params;
2032
- const documentManager2 = getService$1("document-manager");
2033
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2034
- if (permissionChecker2.cannot.read()) {
2035
- return ctx.forbidden();
2036
- }
2037
- const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2038
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2039
- const { locale, status = "draft" } = await getDocumentLocaleAndStatus(ctx.query);
2040
- const entity = await documentManager2.findOne(id, model, { populate, locale, status });
2041
- if (!entity) {
2042
- return ctx.notFound();
2043
- }
2044
- if (permissionChecker2.cannot.read(entity)) {
2045
- return ctx.forbidden();
2046
- }
2047
- const number = await documentManager2.countDraftRelations(id, model, locale);
2048
- return {
2049
- data: number
2050
- };
2051
- },
2052
- async countManyEntriesDraftRelations(ctx) {
2053
- const { userAbility } = ctx.state;
2054
- const ids = ctx.request.query.documentIds;
2055
- const locale = ctx.request.query.locale;
2056
- const { model } = ctx.params;
2057
- const documentManager2 = getService$1("document-manager");
2058
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2059
- if (permissionChecker2.cannot.read()) {
2060
- return ctx.forbidden();
2061
- }
2062
- const entities = await documentManager2.findMany(
2063
- {
2064
- filters: {
2065
- documentId: ids
2066
- },
2067
- locale
2068
- },
2069
- model
2070
- );
2071
- if (!entities) {
2072
- return ctx.notFound();
2073
- }
2074
- const number = await documentManager2.countManyEntriesDraftRelations(ids, model, locale);
2075
- return {
2076
- data: number
2077
- };
2078
- }
2079
- };
2080
- const components$1 = {
2081
- findComponents(ctx) {
2082
- const components2 = getService$1("components").findAllComponents();
2083
- const { toDto } = getService$1("data-mapper");
2084
- ctx.body = { data: components2.map(toDto) };
2085
- },
2086
- async findComponentConfiguration(ctx) {
2087
- const { uid: uid2 } = ctx.params;
2088
- const componentService = getService$1("components");
2089
- const component = componentService.findComponent(uid2);
2090
- if (!component) {
2091
- return ctx.notFound("component.notFound");
2092
- }
2093
- const configuration = await componentService.findConfiguration(component);
2094
- const componentsConfigurations = await componentService.findComponentsConfigurations(component);
2095
- ctx.body = {
2096
- data: {
2097
- component: configuration,
2098
- components: componentsConfigurations
2099
- }
2100
- };
2101
- },
2102
- async updateComponentConfiguration(ctx) {
2103
- const { uid: uid2 } = ctx.params;
2104
- const { body } = ctx.request;
2105
- const componentService = getService$1("components");
2106
- const component = componentService.findComponent(uid2);
2107
- if (!component) {
2108
- return ctx.notFound("component.notFound");
2109
- }
2110
- let input;
2111
- try {
2112
- input = await createModelConfigurationSchema(component).validate(body, {
2113
- abortEarly: false,
2114
- stripUnknown: true,
2115
- strict: true
2116
- });
2117
- } catch (error) {
2118
- return ctx.badRequest(null, {
2119
- name: "validationError",
2120
- errors: error.errors
2121
- });
2122
- }
2123
- const newConfiguration = await componentService.updateConfiguration(component, input);
2124
- ctx.body = { data: newConfiguration };
2125
- }
2126
- };
2127
- const hasEditMainField = has("edit.mainField");
2128
- const getEditMainField = prop("edit.mainField");
2129
- const assocListMainField = assoc("list.mainField");
2130
- const assocMainField = (metadata) => hasEditMainField(metadata) ? assocListMainField(getEditMainField(metadata), metadata) : metadata;
2131
- const contentTypes = {
2132
- async findContentTypes(ctx) {
2133
- const { kind } = ctx.query;
2134
- try {
2135
- await validateKind(kind);
2136
- } catch (error) {
2137
- return ctx.send({ error }, 400);
2138
- }
2139
- const contentTypes2 = getService$1("content-types").findContentTypesByKind(kind);
2140
- const { toDto } = getService$1("data-mapper");
2141
- ctx.body = { data: contentTypes2.map(toDto) };
2142
- },
2143
- async findContentTypesSettings(ctx) {
2144
- const { findAllContentTypes, findConfiguration } = getService$1("content-types");
2145
- const contentTypes2 = await findAllContentTypes();
2146
- const configurations = await Promise.all(
2147
- contentTypes2.map(async (contentType) => {
2148
- const { uid: uid2, settings } = await findConfiguration(contentType);
2149
- return { uid: uid2, settings };
2150
- })
2151
- );
2152
- ctx.body = {
2153
- data: configurations
2154
- };
2155
- },
2156
- async findContentTypeConfiguration(ctx) {
2157
- const { uid: uid2 } = ctx.params;
2158
- const contentTypeService = getService$1("content-types");
2159
- const contentType = await contentTypeService.findContentType(uid2);
2160
- if (!contentType) {
2161
- return ctx.notFound("contentType.notFound");
2162
- }
2163
- const configuration = await contentTypeService.findConfiguration(contentType);
2164
- const confWithUpdatedMetadata = {
2165
- ...configuration,
2166
- metadatas: mapValues(assocMainField, configuration.metadatas)
2167
- };
2168
- const components2 = await contentTypeService.findComponentsConfigurations(contentType);
2169
- ctx.body = {
2170
- data: {
2171
- contentType: confWithUpdatedMetadata,
2172
- components: components2
2173
- }
2174
- };
2175
- },
2176
- async updateContentTypeConfiguration(ctx) {
2177
- const { userAbility } = ctx.state;
2178
- const { uid: uid2 } = ctx.params;
2179
- const { body } = ctx.request;
2180
- const contentTypeService = getService$1("content-types");
2181
- const metricsService = getService$1("metrics");
2182
- const contentType = await contentTypeService.findContentType(uid2);
2183
- if (!contentType) {
2184
- return ctx.notFound("contentType.notFound");
2185
- }
2186
- if (!getService$1("permission").canConfigureContentType({ userAbility, contentType })) {
2187
- return ctx.forbidden();
2188
- }
2189
- let input;
2190
- try {
2191
- input = await createModelConfigurationSchema(contentType).validate(body, {
2192
- abortEarly: false,
2193
- stripUnknown: true,
2194
- strict: true
2195
- });
2196
- } catch (error) {
2197
- return ctx.badRequest(null, {
2198
- name: "validationError",
2199
- errors: error.errors
2200
- });
2201
- }
2202
- const newConfiguration = await contentTypeService.updateConfiguration(contentType, input);
2203
- await metricsService.sendDidConfigureListView(contentType, newConfiguration);
2204
- const confWithUpdatedMetadata = {
2205
- ...newConfiguration,
2206
- metadatas: mapValues(assocMainField, newConfiguration.metadatas)
2207
- };
2208
- const components2 = await contentTypeService.findComponentsConfigurations(contentType);
2209
- ctx.body = {
2210
- data: {
2211
- contentType: confWithUpdatedMetadata,
2212
- components: components2
2213
- }
2214
- };
2215
- }
2216
- };
2217
- const init = {
2218
- getInitData(ctx) {
2219
- const { toDto } = getService$1("data-mapper");
2220
- const { findAllComponents } = getService$1("components");
2221
- const { getAllFieldSizes } = getService$1("field-sizes");
2222
- const { findAllContentTypes } = getService$1("content-types");
2223
- ctx.body = {
2224
- data: {
2225
- fieldSizes: getAllFieldSizes(),
2226
- components: findAllComponents().map(toDto),
2227
- contentTypes: findAllContentTypes().map(toDto)
2228
- }
2229
- };
2230
- }
2231
- };
2232
- const validateFindAvailableSchema = yup$1.object().shape({
2233
- component: yup$1.string(),
2234
- id: yup$1.strapiID(),
2235
- _q: yup$1.string(),
2236
- idsToOmit: yup$1.array().of(yup$1.strapiID()),
2237
- idsToInclude: yup$1.array().of(yup$1.strapiID()),
2238
- page: yup$1.number().integer().min(1),
2239
- pageSize: yup$1.number().integer().min(1).max(100),
2240
- locale: yup$1.string().nullable(),
2241
- status: yup$1.string().oneOf(["published", "draft"]).nullable()
2242
- }).required();
2243
- const validateFindExistingSchema = yup$1.object().shape({
2244
- page: yup$1.number().integer().min(1),
2245
- pageSize: yup$1.number().integer().min(1).max(100),
2246
- locale: yup$1.string().nullable(),
2247
- status: yup$1.string().oneOf(["published", "draft"]).nullable()
2248
- }).required();
2249
- const validateFindAvailable = validateYupSchema(validateFindAvailableSchema, { strict: false });
2250
- const validateFindExisting = validateYupSchema(validateFindExistingSchema, { strict: false });
2251
- const { PUBLISHED_AT_ATTRIBUTE: PUBLISHED_AT_ATTRIBUTE$2, UPDATED_AT_ATTRIBUTE } = contentTypes$1.constants;
2252
- const addFiltersClause = (params, filtersClause) => {
2253
- params.filters = params.filters || {};
2254
- params.filters.$and = params.filters.$and || [];
2255
- params.filters.$and.push(filtersClause);
2256
- };
2257
- const sanitizeMainField = (model, mainField, userAbility) => {
2258
- const permissionChecker2 = getService$1("permission-checker").create({
2259
- userAbility,
2260
- model: model.uid
2261
- });
2262
- if (!isListable(model, mainField)) {
2263
- return "id";
2264
- }
2265
- if (permissionChecker2.cannot.read(null, mainField)) {
2266
- if (model.uid === "plugin::users-permissions.role") {
2267
- const userPermissionChecker = getService$1("permission-checker").create({
2268
- userAbility,
2269
- model: "plugin::users-permissions.user"
2270
- });
2271
- if (userPermissionChecker.can.read()) {
2272
- return "name";
2273
- }
2274
- }
2275
- return "id";
2276
- }
2277
- return mainField;
2278
- };
2279
- const addStatusToRelations = async (uid2, relations2) => {
2280
- if (!contentTypes$1.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2281
- return relations2;
2282
- }
2283
- const documentMetadata2 = getService$1("document-metadata");
2284
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
2285
- return relations2.map((relation) => {
2286
- const availableStatuses = documentsAvailableStatus.filter(
2287
- (availableDocument) => availableDocument.documentId === relation.documentId
2288
- );
2289
- return {
2290
- ...relation,
2291
- status: documentMetadata2.getStatus(relation, availableStatuses)
2292
- };
2293
- });
2294
- };
2295
- const getPublishedAtClause = (status, uid2) => {
2296
- const model = strapi.getModel(uid2);
2297
- if (!model || !contentTypes$1.hasDraftAndPublish(model)) {
2298
- return {};
2299
- }
2300
- return status === "published" ? { $notNull: true } : { $null: true };
2301
- };
2302
- const validateLocale = (sourceUid, targetUid, locale) => {
2303
- const sourceModel = strapi.getModel(sourceUid);
2304
- const targetModel = strapi.getModel(targetUid);
2305
- const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2306
- const isSourceLocalized = isLocalized(sourceModel);
2307
- const isTargetLocalized = isLocalized(targetModel);
2308
- let validatedLocale = locale;
2309
- if (!targetModel || !isTargetLocalized)
2310
- validatedLocale = void 0;
2311
- return {
2312
- locale: validatedLocale,
2313
- isSourceLocalized,
2314
- isTargetLocalized
2315
- };
2316
- };
2317
- const validateStatus = (sourceUid, status) => {
2318
- const sourceModel = strapi.getModel(sourceUid);
2319
- const isDP = contentTypes$1.hasDraftAndPublish;
2320
- const isSourceDP = isDP(sourceModel);
2321
- if (!isSourceDP)
2322
- return { status: void 0 };
2323
- switch (status) {
2324
- case "published":
2325
- return { status: "published" };
2326
- default:
2327
- return { status: "draft" };
2328
- }
2329
- };
2330
- const relations = {
2331
- async extractAndValidateRequestInfo(ctx, id) {
2332
- const { userAbility } = ctx.state;
2333
- const { model, targetField } = ctx.params;
2334
- const sourceSchema = strapi.getModel(model);
2335
- if (!sourceSchema) {
2336
- throw new errors.ValidationError(`The model ${model} doesn't exist`);
2337
- }
2338
- const attribute = sourceSchema.attributes[targetField];
2339
- if (!attribute || attribute.type !== "relation") {
2340
- throw new errors.ValidationError(
2341
- `The relational field ${targetField} doesn't exist on ${model}`
2342
- );
2343
- }
2344
- const sourceUid = model;
2345
- const targetUid = attribute.target;
2346
- const { locale, isSourceLocalized, isTargetLocalized } = validateLocale(
2347
- sourceUid,
2348
- targetUid,
2349
- ctx.request?.query?.locale
2350
- );
2351
- const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
2352
- const permissionChecker2 = getService$1("permission-checker").create({
2353
- userAbility,
2354
- model
2355
- });
2356
- const isComponent2 = sourceSchema.modelType === "component";
2357
- if (!isComponent2) {
2358
- if (permissionChecker2.cannot.read(null, targetField)) {
2359
- return ctx.forbidden();
2360
- }
2361
- }
2362
- let entryId = null;
2363
- if (id) {
2364
- const where = {};
2365
- if (!isComponent2) {
2366
- where.documentId = id;
2367
- if (status) {
2368
- where.publishedAt = getPublishedAtClause(status, sourceUid);
2369
- }
2370
- if (locale && isSourceLocalized) {
2371
- where.locale = locale;
2372
- }
2373
- } else {
2374
- where.id = id;
2375
- }
2376
- const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2377
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2378
- const currentEntity = await strapi.db.query(model).findOne({
2379
- where,
2380
- populate
2381
- });
2382
- if (!currentEntity) {
2383
- throw new errors.NotFoundError();
2384
- }
2385
- if (!isComponent2) {
2386
- if (permissionChecker2.cannot.read(currentEntity, targetField)) {
2387
- throw new errors.ForbiddenError();
2388
- }
2389
- }
2390
- entryId = currentEntity.id;
2391
- }
2392
- const modelConfig = isComponent2 ? await getService$1("components").findConfiguration(sourceSchema) : await getService$1("content-types").findConfiguration(sourceSchema);
2393
- const targetSchema = strapi.getModel(targetUid);
2394
- const mainField = flow(
2395
- prop(`metadatas.${targetField}.edit.mainField`),
2396
- (mainField2) => mainField2 || "id",
2397
- (mainField2) => sanitizeMainField(targetSchema, mainField2, userAbility)
2398
- )(modelConfig);
2399
- const fieldsToSelect = uniq([
2400
- mainField,
2401
- PUBLISHED_AT_ATTRIBUTE$2,
2402
- UPDATED_AT_ATTRIBUTE,
2403
- "documentId"
2404
- ]);
2405
- if (isTargetLocalized) {
2406
- fieldsToSelect.push("locale");
2407
- }
2408
- return {
2409
- entryId,
2410
- locale,
2411
- status,
2412
- attribute,
2413
- fieldsToSelect,
2414
- mainField,
2415
- source: { schema: sourceSchema },
2416
- target: { schema: targetSchema, isLocalized: isTargetLocalized },
2417
- sourceSchema,
2418
- targetSchema,
2419
- targetField
2420
- };
2421
- },
2422
- /**
2423
- * Used to find new relations to add in a relational field.
2424
- *
2425
- * Component and document relations are dealt a bit differently (they don't have a document_id).
2426
- */
2427
- async findAvailable(ctx) {
2428
- const { id } = ctx.request.query;
2429
- await validateFindAvailable(ctx.request.query);
2430
- const {
2431
- locale,
2432
- status,
2433
- targetField,
2434
- fieldsToSelect,
2435
- mainField,
2436
- source: {
2437
- schema: { uid: sourceUid, modelType: sourceModelType }
2438
- },
2439
- target: {
2440
- schema: { uid: targetUid },
2441
- isLocalized: isTargetLocalized
2442
- }
2443
- } = await this.extractAndValidateRequestInfo(ctx, id);
2444
- const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
2445
- const permissionChecker2 = getService$1("permission-checker").create({
2446
- userAbility: ctx.state.userAbility,
2447
- model: targetUid
2448
- });
2449
- const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
2450
- const queryParams = {
2451
- sort: mainField,
2452
- // cannot select other fields as the user may not have the permissions
2453
- fields: fieldsToSelect,
2454
- ...permissionQuery
2455
- };
2456
- addFiltersClause(queryParams, {
2457
- publishedAt: getPublishedAtClause(status, targetUid)
2458
- });
2459
- const filterByLocale = isTargetLocalized && locale;
2460
- if (filterByLocale) {
2461
- addFiltersClause(queryParams, { locale });
2462
- }
2463
- if (id) {
2464
- const subQuery = strapi.db.queryBuilder(sourceUid);
2465
- const alias = subQuery.getAlias();
2466
- const where = {
2467
- [`${alias}.id`]: { $notNull: true },
2468
- [`${alias}.document_id`]: { $notNull: true }
2469
- };
2470
- if (sourceModelType === "contentType") {
2471
- where.document_id = id;
2472
- } else {
2473
- where.id = id;
2474
- }
2475
- if (status) {
2476
- where[`${alias}.published_at`] = getPublishedAtClause(status, targetUid);
2477
- }
2478
- if (filterByLocale) {
2479
- where[`${alias}.locale`] = locale;
2480
- }
2481
- if ((idsToInclude?.length ?? 0) !== 0) {
2482
- where[`${alias}.id`].$notIn = idsToInclude;
2483
- }
2484
- const knexSubQuery = subQuery.where(where).join({ alias, targetField }).select(`${alias}.id`).getKnexQuery();
2485
- addFiltersClause(queryParams, {
2486
- id: { $notIn: knexSubQuery }
2487
- });
2488
- }
2489
- if (_q) {
2490
- const _filter = isOperatorOfType("where", query._filter) ? query._filter : "$containsi";
2491
- addFiltersClause(queryParams, { [mainField]: { [_filter]: _q } });
2492
- }
2493
- if (idsToOmit?.length > 0) {
2494
- addFiltersClause(queryParams, {
2495
- id: { $notIn: uniq(idsToOmit) }
2496
- });
2497
- }
2498
- const res = await strapi.db.query(targetUid).findPage(strapi.get("query-params").transform(targetUid, queryParams));
2499
- ctx.body = {
2500
- ...res,
2501
- results: await addStatusToRelations(targetUid, res.results)
2502
- };
2503
- },
2504
- async findExisting(ctx) {
2505
- const { userAbility } = ctx.state;
2506
- const { id } = ctx.params;
2507
- await validateFindExisting(ctx.request.query);
2508
- const {
2509
- entryId,
2510
- attribute,
2511
- targetField,
2512
- fieldsToSelect,
2513
- source: {
2514
- schema: { uid: sourceUid }
2515
- },
2516
- target: {
2517
- schema: { uid: targetUid }
2518
- }
2519
- } = await this.extractAndValidateRequestInfo(ctx, id);
2520
- const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2521
- const dbQuery = strapi.db.query(sourceUid);
2522
- const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
2523
- const res = await loadRelations({ id: entryId }, targetField, {
2524
- select: ["id", "documentId", "locale", "publishedAt"],
2525
- ordering: "desc",
2526
- page: ctx.request.query.page,
2527
- pageSize: ctx.request.query.pageSize
2528
- });
2529
- const loadedIds = res.results.map((item) => item.id);
2530
- addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
2531
- const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
2532
- ...strapi.get("query-params").transform(targetUid, permissionQuery),
2533
- ordering: "desc",
2534
- page: ctx.request.query.page,
2535
- pageSize: ctx.request.query.pageSize
2536
- });
2537
- const relationsUnion = uniqBy("id", concat(sanitizedRes.results, res.results));
2538
- ctx.body = {
2539
- pagination: res.pagination || {
2540
- page: 1,
2541
- pageCount: 1,
2542
- pageSize: 10,
2543
- total: relationsUnion.length
2544
- },
2545
- results: await addStatusToRelations(targetUid, relationsUnion)
2546
- };
2547
- }
2548
- };
2549
- const buildPopulateFromQuery = async (query, model) => {
2550
- return getService$1("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
2551
- };
2552
- const findDocument = async (query, uid2, opts = {}) => {
2553
- const documentManager2 = getService$1("document-manager");
2554
- const populate = await buildPopulateFromQuery(query, uid2);
2555
- return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
2556
- };
2557
- const createOrUpdateDocument = async (ctx, opts) => {
2558
- const { user, userAbility } = ctx.state;
2559
- const { model } = ctx.params;
2560
- const { body, query } = ctx.request;
2561
- const documentManager2 = getService$1("document-manager");
2562
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2563
- if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
2564
- throw new errors.ForbiddenError();
2565
- }
2566
- const sanitizedQuery = await permissionChecker2.sanitizedQuery.update(query);
2567
- const { locale } = await getDocumentLocaleAndStatus(body);
2568
- const [documentVersion, otherDocumentVersion] = await Promise.all([
2569
- findDocument(sanitizedQuery, model, { locale, status: "draft" }),
2570
- // Find the first document to check if it exists
2571
- strapi.db.query(model).findOne({ select: ["documentId"] })
2572
- ]);
2573
- const documentId = otherDocumentVersion?.documentId;
2574
- const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
2575
- const setCreator = documentVersion ? setCreatorFields({ user, isEdition: true }) : setCreatorFields({ user });
2576
- const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
2577
- if (documentVersion) {
2578
- if (permissionChecker2.cannot.update(documentVersion)) {
2579
- throw new errors.ForbiddenError();
2580
- }
2581
- } else if (permissionChecker2.cannot.create()) {
2582
- throw new errors.ForbiddenError();
2583
- }
2584
- const sanitizedBody = await sanitizeFn(body);
2585
- if (!documentId) {
2586
- return documentManager2.create(model, {
2587
- data: sanitizedBody,
2588
- ...sanitizedQuery,
2589
- locale
2590
- });
2591
- }
2592
- return documentManager2.update(documentId, model, {
2593
- data: sanitizedBody,
2594
- populate: opts?.populate,
2595
- locale
2596
- });
2597
- };
2598
- const singleTypes = {
2599
- async find(ctx) {
2600
- const { userAbility } = ctx.state;
2601
- const { model } = ctx.params;
2602
- const { query = {} } = ctx.request;
2603
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2604
- if (permissionChecker2.cannot.read()) {
2605
- return ctx.forbidden();
2606
- }
2607
- const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
2608
- const { locale, status } = await getDocumentLocaleAndStatus(query);
2609
- const version = await findDocument(permissionQuery, model, { locale, status });
2610
- if (!version) {
2611
- if (permissionChecker2.cannot.create()) {
2612
- return ctx.forbidden();
2613
- }
2614
- const document = await strapi.db.query(model).findOne({});
2615
- if (!document) {
2616
- return ctx.notFound();
2617
- }
2618
- const { meta } = await formatDocumentWithMetadata(
2619
- permissionChecker2,
2620
- model,
2621
- // @ts-expect-error - fix types
2622
- { id: document.documentId, locale, publishedAt: null },
2623
- { availableLocales: true, availableStatus: false }
2624
- );
2625
- ctx.body = { data: {}, meta };
2626
- return;
2627
- }
2628
- if (permissionChecker2.cannot.read(version)) {
2629
- return ctx.forbidden();
2630
- }
2631
- const sanitizedDocument = await permissionChecker2.sanitizeOutput(version);
2632
- ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
2633
- },
2634
- async createOrUpdate(ctx) {
2635
- const { userAbility } = ctx.state;
2636
- const { model } = ctx.params;
2637
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2638
- const document = await createOrUpdateDocument(ctx);
2639
- const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
2640
- ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
2641
- },
2642
- async delete(ctx) {
2643
- const { userAbility } = ctx.state;
2644
- const { model } = ctx.params;
2645
- const { query = {} } = ctx.request;
2646
- const documentManager2 = getService$1("document-manager");
2647
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2648
- if (permissionChecker2.cannot.delete()) {
2649
- return ctx.forbidden();
2650
- }
2651
- const sanitizedQuery = await permissionChecker2.sanitizedQuery.delete(query);
2652
- const populate = await buildPopulateFromQuery(sanitizedQuery, model);
2653
- const { locale } = await getDocumentLocaleAndStatus(query);
2654
- const documentLocales = await documentManager2.findLocales(void 0, model, {
2655
- populate,
2656
- locale
2657
- });
2658
- if (documentLocales.length === 0) {
2659
- return ctx.notFound();
2660
- }
2661
- for (const document of documentLocales) {
2662
- if (permissionChecker2.cannot.delete(document)) {
2663
- return ctx.forbidden();
2664
- }
2665
- }
2666
- const deletedEntity = await documentManager2.delete(documentLocales.at(0).documentId, model, {
2667
- locale
2668
- });
2669
- ctx.body = await permissionChecker2.sanitizeOutput(deletedEntity);
2670
- },
2671
- async publish(ctx) {
2672
- const { userAbility } = ctx.state;
2673
- const { model } = ctx.params;
2674
- const { query = {} } = ctx.request;
2675
- const documentManager2 = getService$1("document-manager");
2676
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2677
- if (permissionChecker2.cannot.publish()) {
2678
- return ctx.forbidden();
2679
- }
2680
- const publishedDocument = await strapi.db.transaction(async () => {
2681
- const sanitizedQuery = await permissionChecker2.sanitizedQuery.publish(query);
2682
- const populate = await buildPopulateFromQuery(sanitizedQuery, model);
2683
- const document = await createOrUpdateDocument(ctx, { populate });
2684
- if (!document) {
2685
- throw new errors.NotFoundError();
2686
- }
2687
- if (permissionChecker2.cannot.publish(document)) {
2688
- throw new errors.ForbiddenError();
2689
- }
2690
- const { locale } = await getDocumentLocaleAndStatus(document);
2691
- const publishResult = await documentManager2.publish(document.documentId, model, { locale });
2692
- return publishResult.at(0);
2693
- });
2694
- const sanitizedDocument = await permissionChecker2.sanitizeOutput(publishedDocument);
2695
- ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
2696
- },
2697
- async unpublish(ctx) {
2698
- const { userAbility } = ctx.state;
2699
- const { model } = ctx.params;
2700
- const {
2701
- body: { discardDraft, ...body },
2702
- query = {}
2703
- } = ctx.request;
2704
- const documentManager2 = getService$1("document-manager");
2705
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2706
- if (permissionChecker2.cannot.unpublish()) {
2707
- return ctx.forbidden();
2708
- }
2709
- if (discardDraft && permissionChecker2.cannot.discard()) {
2710
- return ctx.forbidden();
2711
- }
2712
- const sanitizedQuery = await permissionChecker2.sanitizedQuery.unpublish(query);
2713
- const { locale } = await getDocumentLocaleAndStatus(body);
2714
- const document = await findDocument(sanitizedQuery, model, { locale });
2715
- if (!document) {
2716
- return ctx.notFound();
2717
- }
2718
- if (permissionChecker2.cannot.unpublish(document)) {
2719
- return ctx.forbidden();
2720
- }
2721
- if (discardDraft && permissionChecker2.cannot.discard(document)) {
2722
- return ctx.forbidden();
2723
- }
2724
- await strapi.db.transaction(async () => {
2725
- if (discardDraft) {
2726
- await documentManager2.discardDraft(document.documentId, model, { locale });
2727
- }
2728
- ctx.body = await async.pipe(
2729
- (document2) => documentManager2.unpublish(document2.documentId, model, { locale }),
2730
- permissionChecker2.sanitizeOutput,
2731
- (document2) => formatDocumentWithMetadata(permissionChecker2, model, document2)
2732
- )(document);
2733
- });
2734
- },
2735
- async discard(ctx) {
2736
- const { userAbility } = ctx.state;
2737
- const { model } = ctx.params;
2738
- const { body, query = {} } = ctx.request;
2739
- const documentManager2 = getService$1("document-manager");
2740
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2741
- if (permissionChecker2.cannot.discard()) {
2742
- return ctx.forbidden();
2743
- }
2744
- const sanitizedQuery = await permissionChecker2.sanitizedQuery.discard(query);
2745
- const { locale } = await getDocumentLocaleAndStatus(body);
2746
- const document = await findDocument(sanitizedQuery, model, { locale, status: "published" });
2747
- if (!document) {
2748
- return ctx.notFound();
2749
- }
2750
- if (permissionChecker2.cannot.discard(document)) {
2751
- return ctx.forbidden();
2752
- }
2753
- ctx.body = await async.pipe(
2754
- (document2) => documentManager2.discardDraft(document2.documentId, model, { locale }),
2755
- permissionChecker2.sanitizeOutput,
2756
- (document2) => formatDocumentWithMetadata(permissionChecker2, model, document2)
2757
- )(document);
2758
- },
2759
- async countDraftRelations(ctx) {
2760
- const { userAbility } = ctx.state;
2761
- const { model } = ctx.params;
2762
- const { query } = ctx.request;
2763
- const documentManager2 = getService$1("document-manager");
2764
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2765
- const { locale } = await getDocumentLocaleAndStatus(query);
2766
- if (permissionChecker2.cannot.read()) {
2767
- return ctx.forbidden();
2768
- }
2769
- const document = await findDocument({}, model);
2770
- if (!document) {
2771
- return ctx.notFound();
2772
- }
2773
- if (permissionChecker2.cannot.read(document)) {
2774
- return ctx.forbidden();
2775
- }
2776
- const number = await documentManager2.countDraftRelations(document.documentId, model, locale);
2777
- return {
2778
- data: number
2779
- };
2780
- }
2781
- };
2782
- const uid$1 = {
2783
- async generateUID(ctx) {
2784
- const { contentTypeUID, field, data } = await validateGenerateUIDInput(ctx.request.body);
2785
- const { query = {} } = ctx.request;
2786
- const { locale } = await getDocumentLocaleAndStatus(query);
2787
- await validateUIDField(contentTypeUID, field);
2788
- const uidService = getService$1("uid");
2789
- ctx.body = {
2790
- data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
2791
- };
2792
- },
2793
- async checkUIDAvailability(ctx) {
2794
- const { contentTypeUID, field, value } = await validateCheckUIDAvailabilityInput(
2795
- ctx.request.body
2796
- );
2797
- const { query = {} } = ctx.request;
2798
- const { locale } = await getDocumentLocaleAndStatus(query);
2799
- await validateUIDField(contentTypeUID, field);
2800
- const uidService = getService$1("uid");
2801
- const isAvailable = await uidService.checkUIDAvailability({
2802
- contentTypeUID,
2803
- field,
2804
- value,
2805
- locale
2806
- });
2807
- ctx.body = {
2808
- isAvailable,
2809
- suggestion: !isAvailable ? await uidService.findUniqueUID({ contentTypeUID, field, value, locale }) : null
2810
- };
2811
- }
2812
- };
2813
- const controllers = {
2814
- "collection-types": collectionTypes,
2815
- components: components$1,
2816
- "content-types": contentTypes,
2817
- init,
2818
- relations,
2819
- "single-types": singleTypes,
2820
- uid: uid$1,
2821
- ...history.controllers ? history.controllers : {}
2822
- };
2823
- const keys = {
2824
- CONFIGURATION: "configuration"
2825
- };
2826
- const getStore = () => strapi.store({ type: "plugin", name: "content_manager" });
2827
- const EMPTY_CONFIG = {
2828
- settings: {},
2829
- metadatas: {},
2830
- layouts: {}
2831
- };
2832
- const configurationKey = (key) => `${keys.CONFIGURATION}_${key}`;
2833
- const getModelConfiguration = async (key) => {
2834
- const config = await getStore().get({ key: configurationKey(key) });
2835
- return _.merge({}, EMPTY_CONFIG, config);
2836
- };
2837
- const setModelConfiguration = async (key, value) => {
2838
- const storedConfig = await getStore().get({ key: configurationKey(key) }) || {};
2839
- const currentConfig = { ...storedConfig };
2840
- Object.keys(value).forEach((key2) => {
2841
- if (value[key2] !== null && value[key2] !== void 0) {
2842
- _.set(currentConfig, key2, value[key2]);
2843
- }
2844
- });
2845
- if (!_.isEqual(currentConfig, storedConfig)) {
2846
- return getStore().set({
2847
- key: configurationKey(key),
2848
- value: currentConfig
2849
- });
2850
- }
2851
- };
2852
- const deleteKey = (key) => {
2853
- return strapi.db.query("strapi::core-store").delete({ where: { key: `plugin_content_manager_configuration_${key}` } });
2854
- };
2855
- const findByKey = async (key) => {
2856
- const results = await strapi.db.query("strapi::core-store").findMany({
2857
- where: {
2858
- key: {
2859
- $startsWith: key
2860
- }
2861
- }
2862
- });
2863
- return results.map(({ value }) => JSON.parse(value));
2864
- };
2865
- const getAllConfigurations = () => findByKey("plugin_content_manager_configuration");
2866
- const storeUtils = {
2867
- getAllConfigurations,
2868
- findByKey,
2869
- getModelConfiguration,
2870
- setModelConfiguration,
2871
- deleteKey,
2872
- keys
2873
- };
2874
- function createDefaultMetadatas(schema) {
2875
- return {
2876
- ...Object.keys(schema.attributes).reduce((acc, name) => {
2877
- acc[name] = createDefaultMetadata(schema, name);
2878
- return acc;
2879
- }, {}),
2880
- id: {
2881
- edit: {},
2882
- list: {
2883
- label: "id",
2884
- searchable: true,
2885
- sortable: true
2886
- }
2887
- }
2888
- };
2889
- }
2890
- function createDefaultMetadata(schema, name) {
2891
- const edit = {
2892
- label: name,
2893
- description: "",
2894
- placeholder: "",
2895
- visible: isVisible$1(schema, name),
2896
- editable: true
2897
- };
2898
- const fieldAttributes = schema.attributes[name];
2899
- if (isRelation$1(fieldAttributes)) {
2900
- const { targetModel } = fieldAttributes;
2901
- const targetSchema = getTargetSchema(targetModel);
2902
- if (targetSchema) {
2903
- edit.mainField = getDefaultMainField(targetSchema);
2904
- }
2905
- }
2906
- _.assign(
2907
- edit,
2908
- _.pick(_.get(schema, ["config", "metadatas", name, "edit"], {}), [
2909
- "label",
2910
- "description",
2911
- "placeholder",
2912
- "visible",
2913
- "editable",
2914
- "mainField"
2915
- ])
2916
- );
2917
- const list = {
2918
- // @ts-expect-error we need to specify these properties
2919
- label: name,
2920
- // @ts-expect-error we need to specify these properties
2921
- searchable: isSearchable(schema, name),
2922
- // @ts-expect-error we need to specify these properties
2923
- sortable: isSortable(schema, name),
2924
- ..._.pick(_.get(schema, ["config", "metadatas", name, "list"], {}), [
2925
- "label",
2926
- "searchable",
2927
- "sortable"
2928
- ])
2929
- };
2930
- return { edit, list };
2931
- }
2932
- async function syncMetadatas(configuration, schema) {
2933
- if (_.isEmpty(configuration.metadatas)) {
2934
- return createDefaultMetadatas(schema);
2935
- }
2936
- const metasWithValidKeys = _.pick(configuration.metadatas, Object.keys(schema.attributes));
2937
- const metasWithDefaults = _.merge({}, createDefaultMetadatas(schema), metasWithValidKeys);
2938
- const updatedMetas = Object.keys(metasWithDefaults).reduce((acc, key) => {
2939
- const { edit, list } = metasWithDefaults[key];
2940
- const attr = schema.attributes[key];
2941
- const updatedMeta = { edit, list };
2942
- if (list.sortable && !isSortable(schema, key)) {
2943
- _.set(updatedMeta, ["list", "sortable"], false);
2944
- _.set(acc, [key], updatedMeta);
2945
- }
2946
- if (list.searchable && !isSearchable(schema, key)) {
2947
- _.set(updatedMeta, ["list", "searchable"], false);
2948
- _.set(acc, [key], updatedMeta);
2949
- }
2950
- if (!_.has(edit, "mainField"))
2951
- return acc;
2952
- if (!isRelation$1(attr)) {
2953
- _.set(updatedMeta, "edit", _.omit(edit, ["mainField"]));
2954
- _.set(acc, [key], updatedMeta);
2955
- return acc;
2956
- }
2957
- if (edit.mainField === "id")
2958
- return acc;
2959
- const targetSchema = getTargetSchema(attr.targetModel);
2960
- if (!targetSchema)
2961
- return acc;
2962
- if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {
2963
- _.set(updatedMeta, ["edit", "mainField"], getDefaultMainField(targetSchema));
2964
- _.set(acc, [key], updatedMeta);
2965
- return acc;
2966
- }
2967
- return acc;
2968
- }, {});
2969
- return _.assign(metasWithDefaults, updatedMetas);
2970
- }
2971
- const getTargetSchema = (targetModel) => {
2972
- return getService$1("content-types").findContentType(targetModel);
2973
- };
2974
- const DEFAULT_LIST_LENGTH = 4;
2975
- const MAX_ROW_SIZE = 12;
2976
- const isAllowedFieldSize = (type, size) => {
2977
- const { getFieldSize } = getService$1("field-sizes");
2978
- const fieldSize = getFieldSize(type);
2979
- if (!fieldSize.isResizable && size !== fieldSize.default) {
2980
- return false;
2981
- }
2982
- return size <= MAX_ROW_SIZE;
2983
- };
2984
- const getDefaultFieldSize = (attribute) => {
2985
- const { hasFieldSize, getFieldSize } = getService$1("field-sizes");
2986
- return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
2987
- };
2988
- async function createDefaultLayouts(schema) {
2989
- return {
2990
- // @ts-expect-error necessary to provide this default layout
2991
- list: createDefaultListLayout(schema),
2992
- // @ts-expect-error necessary to provide this default layout
2993
- edit: createDefaultEditLayout(schema),
2994
- ..._.pick(_.get(schema, ["config", "layouts"], {}), ["list", "edit"])
2995
- };
2996
- }
2997
- function createDefaultListLayout(schema) {
2998
- return Object.keys(schema.attributes).filter((name) => isListable(schema, name)).slice(0, DEFAULT_LIST_LENGTH);
2999
- }
3000
- const rowSize = (els) => els.reduce((sum, el) => sum + el.size, 0);
3001
- function createDefaultEditLayout(schema) {
3002
- const keys2 = Object.keys(schema.attributes).filter((name) => hasEditableAttribute(schema, name));
3003
- return appendToEditLayout([], keys2, schema);
3004
- }
3005
- function syncLayouts(configuration, schema) {
3006
- if (_.isEmpty(configuration.layouts))
3007
- return createDefaultLayouts(schema);
3008
- const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};
3009
- let cleanList = list.filter((attr) => isListable(schema, attr));
3010
- const cleanEditRelations = editRelations.filter(
3011
- (attr) => hasRelationAttribute(schema, attr)
3012
- );
3013
- const elementsToReAppend = [...cleanEditRelations];
3014
- let cleanEdit = [];
3015
- for (const row of edit) {
3016
- const newRow = [];
3017
- for (const el of row) {
3018
- if (!hasEditableAttribute(schema, el.name))
3019
- continue;
3020
- const { hasFieldSize } = getService$1("field-sizes");
3021
- const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
3022
- if (!isAllowedFieldSize(fieldType, el.size)) {
3023
- elementsToReAppend.push(el.name);
3024
- continue;
3025
- }
3026
- newRow.push(el);
3027
- }
3028
- if (newRow.length > 0) {
3029
- cleanEdit.push(newRow);
3030
- }
3031
- }
3032
- cleanEdit = appendToEditLayout(cleanEdit, elementsToReAppend, schema);
3033
- const newAttributes = _.difference(
3034
- Object.keys(schema.attributes),
3035
- Object.keys(configuration.metadatas)
3036
- );
3037
- if (cleanList.length < DEFAULT_LIST_LENGTH) {
3038
- cleanList = _.uniq(
3039
- cleanList.concat(newAttributes.filter((key) => isListable(schema, key))).slice(0, DEFAULT_LIST_LENGTH)
3040
- );
3041
- }
3042
- const newEditAttributes = newAttributes.filter((key) => hasEditableAttribute(schema, key));
3043
- cleanEdit = appendToEditLayout(cleanEdit, newEditAttributes, schema);
3044
- return {
3045
- list: cleanList.length > 0 ? cleanList : createDefaultListLayout(schema),
3046
- edit: cleanEdit.length > 0 ? cleanEdit : createDefaultEditLayout(schema)
3047
- };
3048
- }
3049
- const appendToEditLayout = (layout = [], keysToAppend, schema) => {
3050
- if (keysToAppend.length === 0)
3051
- return layout;
3052
- let currentRowIndex = Math.max(layout.length - 1, 0);
3053
- if (!layout[currentRowIndex]) {
3054
- layout[currentRowIndex] = [];
3055
- }
3056
- for (const key of keysToAppend) {
3057
- const attribute = schema.attributes[key];
3058
- const attributeSize = getDefaultFieldSize(attribute);
3059
- const currenRowSize = rowSize(layout[currentRowIndex]);
3060
- if (currenRowSize + attributeSize > MAX_ROW_SIZE) {
3061
- currentRowIndex += 1;
3062
- layout[currentRowIndex] = [];
3063
- }
3064
- layout[currentRowIndex].push({
3065
- name: key,
3066
- size: attributeSize
3067
- });
3068
- }
3069
- return layout;
3070
- };
3071
- async function validateCustomConfig(schema) {
3072
- try {
3073
- await createModelConfigurationSchema(schema, {
3074
- allowUndefined: true
3075
- }).validate(schema.config);
3076
- } catch (error) {
3077
- throw new Error(
3078
- `Invalid Model configuration for model ${schema.uid}. Verify your {{ modelName }}.config.js(on) file:
3079
- - ${error.message}
3080
- `
3081
- );
3082
- }
3083
- }
3084
- async function createDefaultConfiguration(schema) {
3085
- await validateCustomConfig(schema);
3086
- return {
3087
- settings: await createDefaultSettings(schema),
3088
- metadatas: await createDefaultMetadatas(schema),
3089
- layouts: await createDefaultLayouts(schema)
3090
- };
3091
- }
3092
- async function syncConfiguration(conf, schema) {
3093
- await validateCustomConfig(schema);
3094
- return {
3095
- settings: await syncSettings(conf, schema),
3096
- layouts: await syncLayouts(conf, schema),
3097
- metadatas: await syncMetadatas(conf, schema)
3098
- };
3099
- }
3100
- const createConfigurationService = ({
3101
- isComponent: isComponent2,
3102
- prefix,
3103
- storeUtils: storeUtils2,
3104
- getModels
3105
- }) => {
3106
- const uidToStoreKey = (uid2) => {
3107
- return `${prefix}::${uid2}`;
3108
- };
3109
- const getConfiguration = (uid2) => {
3110
- const storeKey = uidToStoreKey(uid2);
3111
- return storeUtils2.getModelConfiguration(storeKey);
3112
- };
3113
- const setConfiguration = (uid2, input) => {
3114
- const configuration = {
3115
- ...input,
3116
- uid: uid2,
3117
- isComponent: isComponent2 ?? void 0
3118
- };
3119
- const storeKey = uidToStoreKey(uid2);
3120
- return storeUtils2.setModelConfiguration(storeKey, configuration);
3121
- };
3122
- const deleteConfiguration = (uid2) => {
3123
- const storeKey = uidToStoreKey(uid2);
3124
- return storeUtils2.deleteKey(storeKey);
3125
- };
3126
- const syncConfigurations = async () => {
3127
- const models = getModels();
3128
- const configurations = await storeUtils2.findByKey(
3129
- `plugin_content_manager_configuration_${prefix}`
3130
- );
3131
- const updateConfiguration = async (uid2) => {
3132
- const conf = configurations.find((conf2) => conf2.uid === uid2);
3133
- return setConfiguration(uid2, await syncConfiguration(conf, models[uid2]));
3134
- };
3135
- const generateNewConfiguration = async (uid2) => {
3136
- return setConfiguration(uid2, await createDefaultConfiguration(models[uid2]));
3137
- };
3138
- const currentUIDS = Object.keys(models);
3139
- const DBUIDs = configurations.map(({ uid: uid2 }) => uid2);
3140
- const contentTypesToUpdate = intersection$1(currentUIDS, DBUIDs);
3141
- const contentTypesToAdd = difference$1(currentUIDS, DBUIDs);
3142
- const contentTypesToDelete = difference$1(DBUIDs, currentUIDS);
3143
- await Promise.all(contentTypesToDelete.map((uid2) => deleteConfiguration(uid2)));
3144
- await Promise.all(contentTypesToAdd.map((uid2) => generateNewConfiguration(uid2)));
3145
- await Promise.all(contentTypesToUpdate.map((uid2) => updateConfiguration(uid2)));
3146
- };
3147
- return {
3148
- getConfiguration,
3149
- setConfiguration,
3150
- deleteConfiguration,
3151
- syncConfigurations
3152
- };
3153
- };
3154
- const STORE_KEY_PREFIX = "components";
3155
- const configurationService$1 = createConfigurationService({
3156
- storeUtils,
3157
- isComponent: true,
3158
- prefix: STORE_KEY_PREFIX,
3159
- getModels() {
3160
- const { toContentManagerModel } = getService$1("data-mapper");
3161
- return mapValues(toContentManagerModel, strapi.components);
3162
- }
3163
- });
3164
- const components = ({ strapi: strapi2 }) => ({
3165
- findAllComponents() {
3166
- const { toContentManagerModel } = getService$1("data-mapper");
3167
- return Object.values(strapi2.components).map(toContentManagerModel);
3168
- },
3169
- findComponent(uid2) {
3170
- const { toContentManagerModel } = getService$1("data-mapper");
3171
- const component = strapi2.components[uid2];
3172
- return isNil$1(component) ? component : toContentManagerModel(component);
3173
- },
3174
- async findConfiguration(component) {
3175
- const configuration = await configurationService$1.getConfiguration(component.uid);
3176
- return {
3177
- uid: component.uid,
3178
- category: component.category,
3179
- ...configuration
3180
- };
3181
- },
3182
- async updateConfiguration(component, newConfiguration) {
3183
- await configurationService$1.setConfiguration(component.uid, newConfiguration);
3184
- return this.findConfiguration(component);
3185
- },
3186
- async findComponentsConfigurations(model) {
3187
- const componentsMap = {};
3188
- const getComponentConfigurations = async (uid2) => {
3189
- const component = this.findComponent(uid2);
3190
- if (has(uid2, componentsMap)) {
3191
- return;
3192
- }
3193
- const componentConfiguration = await this.findConfiguration(component);
3194
- const componentsConfigurations = await this.findComponentsConfigurations(component);
3195
- Object.assign(componentsMap, {
3196
- [uid2]: componentConfiguration,
3197
- ...componentsConfigurations
3198
- });
3199
- };
3200
- for (const key of Object.keys(model.attributes)) {
3201
- const attribute = model.attributes[key];
3202
- if (attribute.type === "component") {
3203
- await getComponentConfigurations(attribute.component);
3204
- }
3205
- if (attribute.type === "dynamiczone") {
3206
- for (const componentUid of attribute.components) {
3207
- await getComponentConfigurations(componentUid);
3208
- }
3209
- }
3210
- }
3211
- return componentsMap;
3212
- },
3213
- syncConfigurations() {
3214
- return configurationService$1.syncConfigurations();
3215
- }
3216
- });
3217
- const configurationService = createConfigurationService({
3218
- storeUtils,
3219
- prefix: "content_types",
3220
- getModels() {
3221
- const { toContentManagerModel } = getService$1("data-mapper");
3222
- return mapValues(toContentManagerModel, strapi.contentTypes);
3223
- }
3224
- });
3225
- const service = ({ strapi: strapi2 }) => ({
3226
- findAllContentTypes() {
3227
- const { toContentManagerModel } = getService$1("data-mapper");
3228
- return Object.values(strapi2.contentTypes).map(toContentManagerModel);
3229
- },
3230
- findContentType(uid2) {
3231
- const { toContentManagerModel } = getService$1("data-mapper");
3232
- const contentType = strapi2.contentTypes[uid2];
3233
- return isNil$1(contentType) ? contentType : toContentManagerModel(contentType);
3234
- },
3235
- findDisplayedContentTypes() {
3236
- return this.findAllContentTypes().filter(
3237
- // TODO
3238
- // @ts-expect-error should be resolved from data-mapper types
3239
- ({ isDisplayed }) => isDisplayed === true
3240
- );
3241
- },
3242
- findContentTypesByKind(kind) {
3243
- if (!kind) {
3244
- return this.findAllContentTypes();
3245
- }
3246
- return this.findAllContentTypes().filter(contentTypes$1.isKind(kind));
3247
- },
3248
- async findConfiguration(contentType) {
3249
- const configuration = await configurationService.getConfiguration(contentType.uid);
3250
- return {
3251
- uid: contentType.uid,
3252
- ...configuration
3253
- };
3254
- },
3255
- async updateConfiguration(contentType, newConfiguration) {
3256
- await configurationService.setConfiguration(contentType.uid, newConfiguration);
3257
- return this.findConfiguration(contentType);
3258
- },
3259
- findComponentsConfigurations(contentType) {
3260
- return getService$1("components").findComponentsConfigurations(contentType);
3261
- },
3262
- syncConfigurations() {
3263
- return configurationService.syncConfigurations();
3264
- }
3265
- });
3266
- const dtoFields = [
3267
- "uid",
3268
- "isDisplayed",
3269
- "apiID",
3270
- "kind",
3271
- "category",
3272
- "info",
3273
- "options",
3274
- "pluginOptions",
3275
- "attributes",
3276
- "pluginOptions"
3277
- ];
3278
- const dataMapper = () => ({
3279
- toContentManagerModel(contentType) {
3280
- return {
3281
- ...contentType,
3282
- apiID: contentType.modelName,
3283
- isDisplayed: isVisible(contentType),
3284
- attributes: {
3285
- id: {
3286
- type: "integer"
3287
- },
3288
- ...formatAttributes(contentType)
3289
- }
3290
- };
3291
- },
3292
- toDto: pick(dtoFields)
3293
- });
3294
- const formatAttributes = (contentType) => {
3295
- const { getVisibleAttributes, getTimestamps, getCreatorFields } = contentTypes$1;
3296
- return getVisibleAttributes(contentType).concat(getTimestamps(contentType)).concat(getCreatorFields(contentType)).reduce((acc, key) => {
3297
- const attribute = contentType.attributes[key];
3298
- if (attribute.type === "relation" && attribute.relation.toLowerCase().includes("morph")) {
3299
- return acc;
3300
- }
3301
- acc[key] = formatAttribute(key, attribute);
3302
- return acc;
3303
- }, {});
3304
- };
3305
- const formatAttribute = (key, attribute) => {
3306
- if (attribute.type === "relation") {
3307
- return toRelation(attribute);
3308
- }
3309
- return attribute;
3310
- };
3311
- const toRelation = (attribute) => {
3312
- return {
3313
- ...attribute,
3314
- type: "relation",
3315
- targetModel: "target" in attribute ? attribute.target : void 0,
3316
- relationType: attribute.relation
3317
- };
3318
- };
3319
- const isVisible = (model) => getOr(true, "pluginOptions.content-manager.visible", model) === true;
3320
- const { ApplicationError: ApplicationError$1 } = errors;
3321
- const needsFullSize = {
3322
- default: 12,
3323
- isResizable: false
3324
- };
3325
- const smallSize = {
3326
- default: 4,
3327
- isResizable: true
3328
- };
3329
- const defaultSize = {
3330
- default: 6,
3331
- isResizable: true
3332
- };
3333
- const fieldSizes = {
3334
- // Full row and not resizable
3335
- dynamiczone: needsFullSize,
3336
- component: needsFullSize,
3337
- json: needsFullSize,
3338
- richtext: needsFullSize,
3339
- blocks: needsFullSize,
3340
- // Small and resizable
3341
- checkbox: smallSize,
3342
- boolean: smallSize,
3343
- date: smallSize,
3344
- time: smallSize,
3345
- biginteger: smallSize,
3346
- decimal: smallSize,
3347
- float: smallSize,
3348
- integer: smallSize,
3349
- number: smallSize,
3350
- // Medium and resizable
3351
- datetime: defaultSize,
3352
- email: defaultSize,
3353
- enumeration: defaultSize,
3354
- media: defaultSize,
3355
- password: defaultSize,
3356
- relation: defaultSize,
3357
- string: defaultSize,
3358
- text: defaultSize,
3359
- timestamp: defaultSize,
3360
- uid: defaultSize
3361
- };
3362
- const createFieldSizesService = ({ strapi: strapi2 }) => {
3363
- const fieldSizesService = {
3364
- getAllFieldSizes() {
3365
- return fieldSizes;
3366
- },
3367
- hasFieldSize(type) {
3368
- return !!fieldSizes[type];
3369
- },
3370
- getFieldSize(type) {
3371
- if (!type) {
3372
- throw new ApplicationError$1("The type is required");
3373
- }
3374
- const fieldSize = fieldSizes[type];
3375
- if (!fieldSize) {
3376
- throw new ApplicationError$1(`Could not find field size for type ${type}`);
3377
- }
3378
- return fieldSize;
3379
- },
3380
- setFieldSize(type, size) {
3381
- if (!type) {
3382
- throw new ApplicationError$1("The type is required");
3383
- }
3384
- if (!size) {
3385
- throw new ApplicationError$1("The size is required");
3386
- }
3387
- fieldSizes[type] = size;
3388
- },
3389
- setCustomFieldInputSizes() {
3390
- const customFields = strapi2.get("custom-fields").getAll();
3391
- Object.entries(customFields).forEach(([uid2, customField]) => {
3392
- if (customField.inputSize) {
3393
- fieldSizesService.setFieldSize(uid2, customField.inputSize);
3394
- }
3395
- });
3396
- }
3397
- };
3398
- return fieldSizesService;
3399
- };
3400
- const { getRelationalFields } = relations$1;
3401
- const metrics = ({ strapi: strapi2 }) => {
3402
- const sendDidConfigureListView = async (contentType, configuration) => {
3403
- const displayedFields = prop("length", configuration.layouts.list);
3404
- const relationalFields = getRelationalFields(contentType);
3405
- const displayedRelationalFields = intersection(
3406
- relationalFields,
3407
- configuration.layouts.list
3408
- ).length;
3409
- const data = {
3410
- eventProperties: { containsRelationalFields: !!displayedRelationalFields }
3411
- };
3412
- if (data.eventProperties.containsRelationalFields) {
3413
- Object.assign(data.eventProperties, {
3414
- displayedFields,
3415
- displayedRelationalFields
3416
- });
3417
- }
3418
- try {
3419
- await strapi2.telemetry.send("didConfigureListView", data);
3420
- } catch (e) {
3421
- }
3422
- };
3423
- return {
3424
- sendDidConfigureListView
3425
- };
3426
- };
3427
- const ACTIONS = {
3428
- read: "plugin::content-manager.explorer.read",
3429
- create: "plugin::content-manager.explorer.create",
3430
- update: "plugin::content-manager.explorer.update",
3431
- delete: "plugin::content-manager.explorer.delete",
3432
- publish: "plugin::content-manager.explorer.publish",
3433
- unpublish: "plugin::content-manager.explorer.publish",
3434
- discard: "plugin::content-manager.explorer.update"
3435
- };
3436
- const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
3437
- const permissionsManager = strapi2.service("admin::permission").createPermissionsManager({
3438
- ability: userAbility,
3439
- model
3440
- });
3441
- const toSubject = (entity) => entity ? permissionsManager.toSubject(entity, model) : model;
3442
- const can = (action, entity, field) => {
3443
- return userAbility.can(action, toSubject(entity), field);
3444
- };
3445
- const cannot = (action, entity, field) => {
3446
- return userAbility.cannot(action, toSubject(entity), field);
3447
- };
3448
- const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
3449
- return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
3450
- };
3451
- const sanitizeQuery = (query, { action = ACTIONS.read } = {}) => {
3452
- return permissionsManager.sanitizeQuery(query, { subject: model, action });
3453
- };
3454
- const sanitizeInput = (action, data, entity) => {
3455
- return permissionsManager.sanitizeInput(data, {
3456
- subject: entity ? toSubject(entity) : model,
3457
- action
3458
- });
3459
- };
3460
- const validateQuery = (query, { action = ACTIONS.read } = {}) => {
3461
- return permissionsManager.validateQuery(query, { subject: model, action });
3462
- };
3463
- const validateInput = (action, data, entity) => {
3464
- return permissionsManager.validateInput(data, {
3465
- subject: entity ? toSubject(entity) : model,
3466
- action
3467
- });
3468
- };
3469
- const sanitizeCreateInput = (data) => sanitizeInput(ACTIONS.create, data);
3470
- const sanitizeUpdateInput = (entity) => (data) => sanitizeInput(ACTIONS.update, data, entity);
3471
- const buildPermissionQuery = (query, action = {}) => {
3472
- return permissionsManager.addPermissionsQueryTo(query, action);
3473
- };
3474
- const sanitizedQuery = (query, action = {}) => {
3475
- return async.pipe(
3476
- (q) => sanitizeQuery(q, action),
3477
- (q) => buildPermissionQuery(q, action)
3478
- )(query);
3479
- };
3480
- Object.keys(ACTIONS).forEach((action) => {
3481
- sanitizedQuery[action] = (query) => sanitizedQuery(query, ACTIONS[action]);
3482
- });
3483
- Object.keys(ACTIONS).forEach((action) => {
3484
- can[action] = (...args) => can(ACTIONS[action], ...args);
3485
- cannot[action] = (...args) => cannot(ACTIONS[action], ...args);
3486
- });
3487
- return {
3488
- // Permission utils
3489
- can,
3490
- // check if you have the permission
3491
- cannot,
3492
- // check if you don't have the permission
3493
- // Sanitizers
3494
- sanitizeOutput,
3495
- sanitizeQuery,
3496
- sanitizeCreateInput,
3497
- sanitizeUpdateInput,
3498
- // Validators
3499
- validateQuery,
3500
- validateInput,
3501
- // Queries Builder
3502
- sanitizedQuery
3503
- };
3504
- };
3505
- const permissionChecker = ({ strapi: strapi2 }) => ({
3506
- create: createPermissionChecker(strapi2)
3507
- });
3508
- const permission = ({ strapi: strapi2 }) => ({
3509
- canConfigureContentType({
3510
- userAbility,
3511
- contentType
3512
- }) {
3513
- const action = contentTypes$1.isSingleType(contentType) ? "plugin::content-manager.single-types.configure-view" : "plugin::content-manager.collection-types.configure-view";
3514
- return userAbility.can(action);
3515
- },
3516
- async registerPermissions() {
3517
- const displayedContentTypes = getService$1("content-types").findDisplayedContentTypes();
3518
- const contentTypesUids = displayedContentTypes.map(prop("uid"));
3519
- const actions = [
3520
- {
3521
- section: "contentTypes",
3522
- displayName: "Create",
3523
- uid: "explorer.create",
3524
- pluginName: "content-manager",
3525
- subjects: contentTypesUids,
3526
- options: {
3527
- applyToProperties: ["fields"]
3528
- }
3529
- },
3530
- {
3531
- section: "contentTypes",
3532
- displayName: "Read",
3533
- uid: "explorer.read",
3534
- pluginName: "content-manager",
3535
- subjects: contentTypesUids,
3536
- options: {
3537
- applyToProperties: ["fields"]
3538
- }
3539
- },
3540
- {
3541
- section: "contentTypes",
3542
- displayName: "Update",
3543
- uid: "explorer.update",
3544
- pluginName: "content-manager",
3545
- subjects: contentTypesUids,
3546
- options: {
3547
- applyToProperties: ["fields"]
3548
- }
3549
- },
3550
- {
3551
- section: "contentTypes",
3552
- displayName: "Delete",
3553
- uid: "explorer.delete",
3554
- pluginName: "content-manager",
3555
- subjects: contentTypesUids
3556
- },
3557
- {
3558
- section: "contentTypes",
3559
- displayName: "Publish",
3560
- uid: "explorer.publish",
3561
- pluginName: "content-manager",
3562
- subjects: contentTypesUids
3563
- },
3564
- {
3565
- section: "plugins",
3566
- displayName: "Configure view",
3567
- uid: "single-types.configure-view",
3568
- subCategory: "single types",
3569
- pluginName: "content-manager"
3570
- },
3571
- {
3572
- section: "plugins",
3573
- displayName: "Configure view",
3574
- uid: "collection-types.configure-view",
3575
- subCategory: "collection types",
3576
- pluginName: "content-manager"
3577
- },
3578
- {
3579
- section: "plugins",
3580
- displayName: "Configure Layout",
3581
- uid: "components.configure-layout",
3582
- subCategory: "components",
3583
- pluginName: "content-manager"
3584
- }
3585
- ];
3586
- await strapi2.service("admin::permission").actionProvider.registerMany(actions);
3587
- }
3588
- });
3589
- const { isVisibleAttribute: isVisibleAttribute$1, isScalarAttribute, getDoesAttributeRequireValidation } = strapiUtils.contentTypes;
3590
- const { isAnyToMany } = strapiUtils.relations;
3591
- const { PUBLISHED_AT_ATTRIBUTE: PUBLISHED_AT_ATTRIBUTE$1 } = strapiUtils.contentTypes.constants;
3592
- const isMorphToRelation = (attribute) => isRelation(attribute) && attribute.relation.includes("morphTo");
3593
- const isMedia = propEq("type", "media");
3594
- const isRelation = propEq("type", "relation");
3595
- const isComponent = propEq("type", "component");
3596
- const isDynamicZone = propEq("type", "dynamiczone");
3597
- function getPopulateForRelation(attribute, model, attributeName, { countMany, countOne, initialPopulate }) {
3598
- const isManyRelation = isAnyToMany(attribute);
3599
- if (initialPopulate) {
3600
- return initialPopulate;
3601
- }
3602
- if (!isVisibleAttribute$1(model, attributeName)) {
3603
- return true;
3604
- }
3605
- if (isManyRelation && countMany || !isManyRelation && countOne) {
3606
- return { count: true };
3607
- }
3608
- return true;
3609
- }
3610
- function getPopulateForDZ(attribute, options, level) {
3611
- const populatedComponents = (attribute.components || []).reduce(
3612
- (acc, componentUID) => ({
3613
- ...acc,
3614
- [componentUID]: {
3615
- populate: getDeepPopulate(componentUID, options, level + 1)
3616
- }
3617
- }),
3618
- {}
3619
- );
3620
- return { on: populatedComponents };
3621
- }
3622
- function getPopulateFor(attributeName, model, options, level) {
3623
- const attribute = model.attributes[attributeName];
3624
- switch (attribute.type) {
3625
- case "relation":
3626
- return {
3627
- [attributeName]: getPopulateForRelation(attribute, model, attributeName, options)
3628
- };
3629
- case "component":
3630
- return {
3631
- [attributeName]: {
3632
- populate: getDeepPopulate(attribute.component, options, level + 1)
3633
- }
3634
- };
3635
- case "media":
3636
- return {
3637
- [attributeName]: {
3638
- populate: {
3639
- folder: true
3640
- }
3641
- }
3642
- };
3643
- case "dynamiczone":
3644
- return {
3645
- [attributeName]: getPopulateForDZ(attribute, options, level)
3646
- };
3647
- default:
3648
- return {};
3649
- }
3650
- }
3651
- const getDeepPopulate = (uid2, {
3652
- initialPopulate = {},
3653
- countMany = false,
3654
- countOne = false,
3655
- maxLevel = Infinity
3656
- } = {}, level = 1) => {
3657
- if (level > maxLevel) {
3658
- return {};
3659
- }
3660
- const model = strapi.getModel(uid2);
3661
- return Object.keys(model.attributes).reduce(
3662
- (populateAcc, attributeName) => merge(
3663
- populateAcc,
3664
- getPopulateFor(
3665
- attributeName,
3666
- model,
3667
- {
3668
- // @ts-expect-error - improve types
3669
- initialPopulate: initialPopulate?.[attributeName],
3670
- countMany,
3671
- countOne,
3672
- maxLevel
3673
- },
3674
- level
3675
- )
3676
- ),
3677
- {}
3678
- );
3679
- };
3680
- const getValidatableFieldsPopulate = (uid2, {
3681
- initialPopulate = {},
3682
- countMany = false,
3683
- countOne = false,
3684
- maxLevel = Infinity
3685
- } = {}, level = 1) => {
3686
- if (level > maxLevel) {
3687
- return {};
3688
- }
3689
- const model = strapi.getModel(uid2);
3690
- return Object.entries(model.attributes).reduce((populateAcc, [attributeName, attribute]) => {
3691
- if (!getDoesAttributeRequireValidation(attribute)) {
3692
- return populateAcc;
3693
- }
3694
- if (isScalarAttribute(attribute)) {
3695
- return merge(populateAcc, {
3696
- [attributeName]: true
3697
- });
3698
- }
3699
- return merge(
3700
- populateAcc,
3701
- getPopulateFor(
3702
- attributeName,
3703
- model,
3704
- {
3705
- // @ts-expect-error - improve types
3706
- initialPopulate: initialPopulate?.[attributeName],
3707
- countMany,
3708
- countOne,
3709
- maxLevel
3710
- },
3711
- level
3712
- )
3713
- );
3714
- }, {});
3715
- };
3716
- const getDeepPopulateDraftCount = (uid2) => {
3717
- const model = strapi.getModel(uid2);
3718
- let hasRelations = false;
3719
- const populate = Object.keys(model.attributes).reduce((populateAcc, attributeName) => {
3720
- const attribute = model.attributes[attributeName];
3721
- switch (attribute.type) {
3722
- case "relation": {
3723
- if (isVisibleAttribute$1(model, attributeName)) {
3724
- populateAcc[attributeName] = {
3725
- count: true,
3726
- filters: { [PUBLISHED_AT_ATTRIBUTE$1]: { $null: true } }
3727
- };
3728
- hasRelations = true;
3729
- }
3730
- break;
3731
- }
3732
- case "component": {
3733
- const { populate: populate2, hasRelations: childHasRelations } = getDeepPopulateDraftCount(
3734
- attribute.component
3735
- );
3736
- if (childHasRelations) {
3737
- populateAcc[attributeName] = {
3738
- populate: populate2
3739
- };
3740
- hasRelations = true;
3741
- }
3742
- break;
3743
- }
3744
- case "dynamiczone": {
3745
- const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {
3746
- const { populate: componentPopulate, hasRelations: componentHasRelations } = getDeepPopulateDraftCount(componentUID);
3747
- if (componentHasRelations) {
3748
- hasRelations = true;
3749
- return { ...acc, [componentUID]: { populate: componentPopulate } };
3750
- }
3751
- return acc;
3752
- }, {});
3753
- if (!isEmpty(dzPopulateFragment)) {
3754
- populateAcc[attributeName] = { on: dzPopulateFragment };
3755
- }
3756
- break;
3757
- }
3758
- }
3759
- return populateAcc;
3760
- }, {});
3761
- return { populate, hasRelations };
3762
- };
3763
- const getQueryPopulate = async (uid2, query) => {
3764
- let populateQuery = {};
3765
- await strapiUtils.traverse.traverseQueryFilters(
3766
- /**
3767
- *
3768
- * @param {Object} param0
3769
- * @param {string} param0.key - Attribute name
3770
- * @param {Object} param0.attribute - Attribute definition
3771
- * @param {string} param0.path - Content Type path to the attribute
3772
- * @returns
3773
- */
3774
- ({ attribute, path }) => {
3775
- if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {
3776
- return;
3777
- }
3778
- if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {
3779
- const populatePath = path.attribute.replace(/\./g, ".populate.");
3780
- populateQuery = set(populatePath, {}, populateQuery);
3781
- }
3782
- },
3783
- { schema: strapi.getModel(uid2), getModel: strapi.getModel.bind(strapi) },
3784
- query
3785
- );
3786
- return populateQuery;
3787
- };
3788
- const buildDeepPopulate = (uid2) => {
3789
- return getService$1("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
3790
- };
3791
- const populateBuilder = (uid2) => {
3792
- let getInitialPopulate = async () => {
3793
- return void 0;
3794
- };
3795
- const deepPopulateOptions = {
3796
- countMany: false,
3797
- countOne: false,
3798
- maxLevel: -1
3799
- };
3800
- const builder = {
3801
- /**
3802
- * Populates all attribute fields present in a query.
3803
- * @param query - Strapi query object
3804
- */
3805
- populateFromQuery(query) {
3806
- getInitialPopulate = async () => getQueryPopulate(uid2, query);
3807
- return builder;
3808
- },
3809
- /**
3810
- * Populate relations as count.
3811
- * @param [options]
3812
- * @param [options.toMany] - Populate XtoMany relations as count if true.
3813
- * @param [options.toOne] - Populate XtoOne relations as count if true.
3814
- */
3815
- countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {
3816
- if (!isNil$1(toMany)) {
3817
- deepPopulateOptions.countMany = toMany;
3818
- }
3819
- if (!isNil$1(toOne)) {
3820
- deepPopulateOptions.countOne = toOne;
3821
- }
3822
- return builder;
3823
- },
3824
- /**
3825
- * Populate relations deeply, up to a certain level.
3826
- * @param [level=Infinity] - Max level of nested populate.
3827
- */
3828
- populateDeep(level = Infinity) {
3829
- deepPopulateOptions.maxLevel = level;
3830
- return builder;
3831
- },
3832
- /**
3833
- * Construct the populate object based on the builder options.
3834
- * @returns Populate object
3835
- */
3836
- async build() {
3837
- const initialPopulate = await getInitialPopulate();
3838
- if (deepPopulateOptions.maxLevel === -1) {
3839
- return initialPopulate;
3840
- }
3841
- return getDeepPopulate(uid2, { ...deepPopulateOptions, initialPopulate });
3842
- }
3843
- };
3844
- return builder;
3845
- };
3846
- const populateBuilder$1 = () => populateBuilder;
3847
- const uid = ({ strapi: strapi2 }) => ({
3848
- async generateUIDField({
3849
- contentTypeUID,
3850
- field,
3851
- data,
3852
- locale
3853
- }) {
3854
- const contentType = strapi2.contentTypes[contentTypeUID];
3855
- const { attributes } = contentType;
3856
- const {
3857
- targetField,
3858
- default: defaultValue,
3859
- options
3860
- } = attributes[field];
3861
- const targetValue = _.get(data, targetField);
3862
- if (!_.isEmpty(targetValue)) {
3863
- return this.findUniqueUID({
3864
- contentTypeUID,
3865
- field,
3866
- value: slugify(targetValue, options),
3867
- locale
3868
- });
3869
- }
3870
- return this.findUniqueUID({
3871
- contentTypeUID,
3872
- field,
3873
- value: slugify(
3874
- _.isFunction(defaultValue) ? defaultValue() : defaultValue || contentType.modelName,
3875
- options
3876
- ),
3877
- locale
3878
- });
3879
- },
3880
- async findUniqueUID({
3881
- contentTypeUID,
3882
- field,
3883
- value,
3884
- locale
3885
- }) {
3886
- const foundDocuments = await strapi2.documents(contentTypeUID).findMany({
3887
- filters: {
3888
- [field]: { $startsWith: value }
3889
- },
3890
- locale,
3891
- // TODO: Check UX. When modifying an entry, it only makes sense to check for collisions with other drafts
3892
- // However, when publishing this "available" UID might collide with another published entry
3893
- status: "draft"
3894
- });
3895
- if (!foundDocuments || foundDocuments.length === 0) {
3896
- return value;
3897
- }
3898
- let possibleCollisions;
3899
- if (!Array.isArray(foundDocuments)) {
3900
- possibleCollisions = [foundDocuments[field]];
3901
- } else {
3902
- possibleCollisions = foundDocuments.map((doc) => doc[field]);
3903
- }
3904
- if (!possibleCollisions.includes(value)) {
3905
- return value;
3906
- }
3907
- let i = 1;
3908
- let tmpUId = `${value}-${i}`;
3909
- while (possibleCollisions.includes(tmpUId)) {
3910
- i += 1;
3911
- tmpUId = `${value}-${i}`;
3912
- }
3913
- return tmpUId;
3914
- },
3915
- async checkUIDAvailability({
3916
- contentTypeUID,
3917
- field,
3918
- value,
3919
- locale
3920
- }) {
3921
- const documentCount = await strapi2.documents(contentTypeUID).count({
3922
- filters: {
3923
- [field]: value
3924
- },
3925
- locale,
3926
- // TODO: Check UX. When modifying an entry, it only makes sense to check for collisions with other drafts
3927
- // However, when publishing this "available" UID might collide with another published entry
3928
- status: "draft"
3929
- });
3930
- if (documentCount && documentCount > 0) {
3931
- return false;
3932
- }
3933
- return true;
3934
- }
3935
- });
3936
- const AVAILABLE_STATUS_FIELDS = [
3937
- "id",
3938
- "locale",
3939
- "updatedAt",
3940
- "createdAt",
3941
- "publishedAt",
3942
- "createdBy",
3943
- "updatedBy",
3944
- "status"
3945
- ];
3946
- const AVAILABLE_LOCALES_FIELDS = [
3947
- "id",
3948
- "locale",
3949
- "updatedAt",
3950
- "createdAt",
3951
- "status",
3952
- "publishedAt",
3953
- "documentId"
3954
- ];
3955
- const CONTENT_MANAGER_STATUS = {
3956
- PUBLISHED: "published",
3957
- DRAFT: "draft",
3958
- MODIFIED: "modified"
3959
- };
3960
- const getIsVersionLatestModification = (version, otherVersion) => {
3961
- if (!version || !version.updatedAt) {
3962
- return false;
3963
- }
3964
- const versionUpdatedAt = version?.updatedAt ? new Date(version.updatedAt).getTime() : 0;
3965
- const otherUpdatedAt = otherVersion?.updatedAt ? new Date(otherVersion.updatedAt).getTime() : 0;
3966
- return versionUpdatedAt > otherUpdatedAt;
3967
- };
3968
- const documentMetadata = ({ strapi: strapi2 }) => ({
3969
- /**
3970
- * Returns available locales of a document for the current status
3971
- */
3972
- async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
3973
- const versionsByLocale = groupBy("locale", allVersions);
3974
- delete versionsByLocale[version.locale];
3975
- const model = strapi2.getModel(uid2);
3976
- const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
3977
- const traversalFunction = async (localeVersion) => traverseEntity(
3978
- ({ key }, { remove }) => {
3979
- if (keysToKeep.includes(key)) {
3980
- return;
3981
- }
3982
- remove(key);
3983
- },
3984
- { schema: model, getModel: strapi2.getModel.bind(strapi2) },
3985
- // @ts-expect-error fix types DocumentVersion incompatible with Data
3986
- localeVersion
3987
- );
3988
- const mappingResult = await async.map(
3989
- Object.values(versionsByLocale),
3990
- async (localeVersions) => {
3991
- const mappedLocaleVersions = await async.map(
3992
- localeVersions,
3993
- traversalFunction
3994
- );
3995
- if (!contentTypes$1.hasDraftAndPublish(model)) {
3996
- return mappedLocaleVersions[0];
3997
- }
3998
- const draftVersion = mappedLocaleVersions.find((v) => v.publishedAt === null);
3999
- const otherVersions = mappedLocaleVersions.filter((v) => v.id !== draftVersion?.id);
4000
- if (!draftVersion) {
4001
- return;
4002
- }
4003
- return {
4004
- ...draftVersion,
4005
- status: this.getStatus(draftVersion, otherVersions)
4006
- };
4007
- }
4008
- );
4009
- return mappingResult.filter(Boolean);
4010
- },
4011
- /**
4012
- * Returns available status of a document for the current locale
4013
- */
4014
- getAvailableStatus(version, allVersions) {
4015
- const status = version.publishedAt !== null ? CONTENT_MANAGER_STATUS.DRAFT : CONTENT_MANAGER_STATUS.PUBLISHED;
4016
- const availableStatus = allVersions.find((v) => {
4017
- const matchLocale = v.locale === version.locale;
4018
- const matchStatus = status === "published" ? v.publishedAt !== null : v.publishedAt === null;
4019
- return matchLocale && matchStatus;
4020
- });
4021
- if (!availableStatus)
4022
- return availableStatus;
4023
- return pick(AVAILABLE_STATUS_FIELDS, availableStatus);
4024
- },
4025
- /**
4026
- * Get the available status of many documents, useful for batch operations
4027
- * @param uid
4028
- * @param documents
4029
- * @returns
4030
- */
4031
- async getManyAvailableStatus(uid2, documents) {
4032
- if (!documents.length)
4033
- return [];
4034
- const status = documents[0].publishedAt !== null ? "published" : "draft";
4035
- const locale = documents[0]?.locale;
4036
- const otherStatus = status === "published" ? "draft" : "published";
4037
- return strapi2.documents(uid2).findMany({
4038
- filters: {
4039
- documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) }
4040
- },
4041
- status: otherStatus,
4042
- locale,
4043
- fields: ["documentId", "locale", "updatedAt", "createdAt", "publishedAt"]
4044
- });
4045
- },
4046
- getStatus(version, otherDocumentStatuses) {
4047
- let draftVersion;
4048
- let publishedVersion;
4049
- if (version.publishedAt) {
4050
- publishedVersion = version;
4051
- } else {
4052
- draftVersion = version;
4053
- }
4054
- const otherVersion = otherDocumentStatuses?.at(0);
4055
- if (otherVersion?.publishedAt) {
4056
- publishedVersion = otherVersion;
4057
- } else if (otherVersion) {
4058
- draftVersion = otherVersion;
4059
- }
4060
- if (!draftVersion)
4061
- return CONTENT_MANAGER_STATUS.PUBLISHED;
4062
- if (!publishedVersion)
4063
- return CONTENT_MANAGER_STATUS.DRAFT;
4064
- const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);
4065
- return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;
4066
- },
4067
- // TODO is it necessary to return metadata on every page of the CM
4068
- // We could refactor this so the locales are only loaded when they're
4069
- // needed. e.g. in the bulk locale action modal.
4070
- async getMetadata(uid2, version, { availableLocales = true, availableStatus = true } = {}) {
4071
- const populate = getValidatableFieldsPopulate(uid2);
4072
- const versions = await strapi2.db.query(uid2).findMany({
4073
- where: { documentId: version.documentId },
4074
- populate: {
4075
- // Populate only fields that require validation for bulk locale actions
4076
- ...populate,
4077
- // NOTE: creator fields are selected in this way to avoid exposing sensitive data
4078
- createdBy: {
4079
- select: ["id", "firstname", "lastname", "email"]
4080
- },
4081
- updatedBy: {
4082
- select: ["id", "firstname", "lastname", "email"]
4083
- }
4084
- }
4085
- });
4086
- const availableLocalesResult = availableLocales ? await this.getAvailableLocales(uid2, version, versions, Object.keys(populate)) : [];
4087
- const availableStatusResult = availableStatus ? this.getAvailableStatus(version, versions) : null;
4088
- return {
4089
- availableLocales: availableLocalesResult,
4090
- availableStatus: availableStatusResult ? [availableStatusResult] : []
4091
- };
4092
- },
4093
- /**
4094
- * Returns associated metadata of a document:
4095
- * - Available locales of the document for the current status
4096
- * - Available status of the document for the current locale
4097
- */
4098
- async formatDocumentWithMetadata(uid2, document, opts = {}) {
4099
- if (!document) {
4100
- return document;
4101
- }
4102
- const hasDraftAndPublish = contentTypes$1.hasDraftAndPublish(strapi2.getModel(uid2));
4103
- if (!hasDraftAndPublish) {
4104
- opts.availableStatus = false;
4105
- }
4106
- const meta = await this.getMetadata(uid2, document, opts);
4107
- return {
4108
- data: {
4109
- ...document,
4110
- // Add status to the document only if draft and publish is enabled
4111
- status: hasDraftAndPublish ? this.getStatus(document, meta.availableStatus) : void 0
4112
- },
4113
- meta
4114
- };
4115
- }
4116
- });
4117
- const { isVisibleAttribute } = strapiUtils.contentTypes;
4118
- const sumDraftCounts = (entity, uid2) => {
4119
- const model = strapi.getModel(uid2);
4120
- return Object.keys(model.attributes).reduce((sum, attributeName) => {
4121
- const attribute = model.attributes[attributeName];
4122
- const value = entity[attributeName];
4123
- if (!value) {
4124
- return sum;
4125
- }
4126
- switch (attribute.type) {
4127
- case "relation": {
4128
- if (isVisibleAttribute(model, attributeName)) {
4129
- return sum + value.count;
4130
- }
4131
- return sum;
4132
- }
4133
- case "component": {
4134
- const compoSum = castArray(value).reduce((acc, componentValue) => {
4135
- return acc + sumDraftCounts(componentValue, attribute.component);
4136
- }, 0);
4137
- return sum + compoSum;
4138
- }
4139
- case "dynamiczone": {
4140
- const dzSum = value.reduce((acc, componentValue) => {
4141
- return acc + sumDraftCounts(componentValue, componentValue.__component);
4142
- }, 0);
4143
- return sum + dzSum;
4144
- }
4145
- default:
4146
- return sum;
4147
- }
4148
- }, 0);
4149
- };
4150
- const { ApplicationError } = errors;
4151
- const { PUBLISHED_AT_ATTRIBUTE } = contentTypes$1.constants;
4152
- const omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);
4153
- const omitIdField = omit("id");
4154
- const documentManager = ({ strapi: strapi2 }) => {
4155
- return {
4156
- async findOne(id, uid2, opts = {}) {
4157
- return strapi2.documents(uid2).findOne({ ...opts, documentId: id });
4158
- },
4159
- /**
4160
- * Find multiple (or all) locales for a document
4161
- */
4162
- async findLocales(id, uid2, opts) {
4163
- const where = {};
4164
- if (id) {
4165
- where.documentId = id;
4166
- }
4167
- if (Array.isArray(opts.locale)) {
4168
- where.locale = { $in: opts.locale };
4169
- } else if (opts.locale && opts.locale !== "*") {
4170
- where.locale = opts.locale;
4171
- }
4172
- if (typeof opts.isPublished === "boolean") {
4173
- where.publishedAt = { $notNull: opts.isPublished };
4174
- }
4175
- return strapi2.db.query(uid2).findMany({ populate: opts.populate, where });
4176
- },
4177
- async findMany(opts, uid2) {
4178
- const params = { ...opts, populate: getDeepPopulate(uid2) };
4179
- return strapi2.documents(uid2).findMany(params);
4180
- },
4181
- async findPage(opts, uid2) {
4182
- const params = pagination.withDefaultPagination(opts || {}, {
4183
- maxLimit: 1e3
4184
- });
4185
- const [documents, total = 0] = await Promise.all([
4186
- strapi2.documents(uid2).findMany(params),
4187
- strapi2.documents(uid2).count(params)
4188
- ]);
4189
- return {
4190
- results: documents,
4191
- pagination: pagination.transformPagedPaginationInfo(params, total)
4192
- };
4193
- },
4194
- async create(uid2, opts = {}) {
4195
- const populate = opts.populate ?? await buildDeepPopulate(uid2);
4196
- const params = { ...opts, status: "draft", populate };
4197
- return strapi2.documents(uid2).create(params);
4198
- },
4199
- async update(id, uid2, opts = {}) {
4200
- const publishData = pipe(omitPublishedAtField, omitIdField)(opts.data || {});
4201
- const populate = opts.populate ?? await buildDeepPopulate(uid2);
4202
- const params = { ...opts, data: publishData, populate, status: "draft" };
4203
- return strapi2.documents(uid2).update({ ...params, documentId: id });
4204
- },
4205
- async clone(id, body, uid2) {
4206
- const populate = await buildDeepPopulate(uid2);
4207
- const params = {
4208
- data: {
4209
- ...omitIdField(body),
4210
- [PUBLISHED_AT_ATTRIBUTE]: null
4211
- },
4212
- populate
4213
- };
4214
- return strapi2.documents(uid2).clone({ ...params, documentId: id }).then((result) => result?.entries.at(0));
4215
- },
4216
- /**
4217
- * Check if a document exists
4218
- */
4219
- async exists(uid2, id) {
4220
- if (id) {
4221
- const count2 = await strapi2.db.query(uid2).count({ where: { documentId: id } });
4222
- return count2 > 0;
4223
- }
4224
- const count = await strapi2.db.query(uid2).count();
4225
- return count > 0;
4226
- },
4227
- async delete(id, uid2, opts = {}) {
4228
- const populate = await buildDeepPopulate(uid2);
4229
- await strapi2.documents(uid2).delete({
4230
- ...opts,
4231
- documentId: id,
4232
- populate
4233
- });
4234
- return {};
4235
- },
4236
- // FIXME: handle relations
4237
- async deleteMany(documentIds, uid2, opts = {}) {
4238
- const deletedEntries = await strapi2.db.transaction(async () => {
4239
- return Promise.all(documentIds.map(async (id) => this.delete(id, uid2, opts)));
4240
- });
4241
- return { count: deletedEntries.length };
4242
- },
4243
- async publish(id, uid2, opts = {}) {
4244
- const populate = await buildDeepPopulate(uid2);
4245
- const params = { ...opts, populate };
4246
- return strapi2.documents(uid2).publish({ ...params, documentId: id }).then((result) => result?.entries);
4247
- },
4248
- async publishMany(uid2, documentIds, locale) {
4249
- return strapi2.db.transaction(async () => {
4250
- const results = await Promise.all(
4251
- documentIds.map((documentId) => this.publish(documentId, uid2, { locale }))
4252
- );
4253
- const publishedEntitiesCount = results.flat().filter(Boolean).length;
4254
- return publishedEntitiesCount;
4255
- });
4256
- },
4257
- async unpublishMany(documentIds, uid2, opts = {}) {
4258
- const unpublishedEntries = await strapi2.db.transaction(async () => {
4259
- return Promise.all(
4260
- documentIds.map(
4261
- (id) => strapi2.documents(uid2).unpublish({ ...opts, documentId: id }).then((result) => result?.entries)
4262
- )
4263
- );
4264
- });
4265
- const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;
4266
- return { count: unpublishedEntitiesCount };
4267
- },
4268
- async unpublish(id, uid2, opts = {}) {
4269
- const populate = await buildDeepPopulate(uid2);
4270
- const params = { ...opts, populate };
4271
- return strapi2.documents(uid2).unpublish({ ...params, documentId: id }).then((result) => result?.entries.at(0));
4272
- },
4273
- async discardDraft(id, uid2, opts = {}) {
4274
- const populate = await buildDeepPopulate(uid2);
4275
- const params = { ...opts, populate };
4276
- return strapi2.documents(uid2).discardDraft({ ...params, documentId: id }).then((result) => result?.entries.at(0));
4277
- },
4278
- async countDraftRelations(id, uid2, locale) {
4279
- const { populate, hasRelations } = getDeepPopulateDraftCount(uid2);
4280
- if (!hasRelations) {
4281
- return 0;
4282
- }
4283
- const document = await strapi2.documents(uid2).findOne({ documentId: id, populate, locale });
4284
- if (!document) {
4285
- throw new ApplicationError(
4286
- `Unable to count draft relations, document with id ${id} and locale ${locale} not found`
4287
- );
4288
- }
4289
- return sumDraftCounts(document, uid2);
4290
- },
4291
- async countManyEntriesDraftRelations(documentIds, uid2, locale) {
4292
- const { populate, hasRelations } = getDeepPopulateDraftCount(uid2);
4293
- if (!hasRelations) {
4294
- return 0;
4295
- }
4296
- let localeFilter = {};
4297
- if (locale) {
4298
- localeFilter = Array.isArray(locale) ? { locale: { $in: locale } } : { locale };
4299
- }
4300
- const entities = await strapi2.db.query(uid2).findMany({
4301
- populate,
4302
- where: {
4303
- documentId: { $in: documentIds },
4304
- ...localeFilter
4305
- }
4306
- });
4307
- const totalNumberDraftRelations = entities.reduce(
4308
- (count, entity) => sumDraftCounts(entity, uid2) + count,
4309
- 0
4310
- );
4311
- return totalNumberDraftRelations;
4312
- }
4313
- };
4314
- };
4315
- const services = {
4316
- components,
4317
- "content-types": service,
4318
- "data-mapper": dataMapper,
4319
- "document-metadata": documentMetadata,
4320
- "document-manager": documentManager,
4321
- "field-sizes": createFieldSizesService,
4322
- metrics,
4323
- "permission-checker": permissionChecker,
4324
- permission,
4325
- "populate-builder": populateBuilder$1,
4326
- uid,
4327
- ...history.services ? history.services : {}
4328
- };
4329
- const index = () => {
4330
- return {
4331
- register,
4332
- bootstrap,
4333
- destroy,
4334
- controllers,
4335
- routes,
4336
- policies,
4337
- services
4338
- };
4339
- };
4340
- export {
4341
- index as default
4342
- };
1
+ import register from './register.mjs';
2
+ import bootstrap from './bootstrap.mjs';
3
+ import destroy from './destroy.mjs';
4
+ import routes from './routes/index.mjs';
5
+ import policies from './policies/index.mjs';
6
+ import controllers from './controllers/index.mjs';
7
+ import services from './services/index.mjs';
8
+
9
+ var index = (()=>{
10
+ return {
11
+ register,
12
+ bootstrap,
13
+ destroy,
14
+ controllers,
15
+ routes,
16
+ policies,
17
+ services
18
+ };
19
+ });
20
+
21
+ export { index as default };
4343
22
  //# sourceMappingURL=index.mjs.map