@strapi/content-manager 0.0.0-experimental.bffd3c1819cd08304e7d270e88b4973e9fcbc183 → 0.0.0-experimental.c23f51fc41b3ef5de081f427d07e87af93cdcb2c

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