@strapi/admin 4.16.1 → 4.17.0

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 (1327) hide show
  1. package/dist/_chunks/AdminSeatInfo-6e7bbb97.mjs +164 -0
  2. package/dist/_chunks/AdminSeatInfo-6e7bbb97.mjs.map +1 -0
  3. package/dist/_chunks/AdminSeatInfo-a10d232f.js +164 -0
  4. package/dist/_chunks/AdminSeatInfo-a10d232f.js.map +1 -0
  5. package/dist/_chunks/AuthenticatedApp-47219c52.js +1477 -0
  6. package/dist/_chunks/AuthenticatedApp-47219c52.js.map +1 -0
  7. package/dist/_chunks/AuthenticatedApp-7d1fdf0c.mjs +1451 -0
  8. package/dist/_chunks/AuthenticatedApp-7d1fdf0c.mjs.map +1 -0
  9. package/dist/_chunks/CreateActionEE-42bd2b19.js +63 -0
  10. package/dist/_chunks/CreateActionEE-42bd2b19.js.map +1 -0
  11. package/dist/_chunks/CreateActionEE-eadd5955.mjs +60 -0
  12. package/dist/_chunks/CreateActionEE-eadd5955.mjs.map +1 -0
  13. package/dist/_chunks/CreatePage-17c8a6e4.mjs +325 -0
  14. package/dist/_chunks/CreatePage-17c8a6e4.mjs.map +1 -0
  15. package/dist/_chunks/CreatePage-32977ee7.mjs +289 -0
  16. package/dist/_chunks/CreatePage-32977ee7.mjs.map +1 -0
  17. package/dist/_chunks/CreatePage-3c0b9dd5.js +346 -0
  18. package/dist/_chunks/CreatePage-3c0b9dd5.js.map +1 -0
  19. package/dist/_chunks/CreatePage-4ba4bd0d.mjs +82 -0
  20. package/dist/_chunks/CreatePage-4ba4bd0d.mjs.map +1 -0
  21. package/dist/_chunks/CreatePage-d2a061b5.js +82 -0
  22. package/dist/_chunks/CreatePage-d2a061b5.js.map +1 -0
  23. package/dist/_chunks/CreatePage-eeb81776.js +312 -0
  24. package/dist/_chunks/CreatePage-eeb81776.js.map +1 -0
  25. package/dist/_chunks/CreateView-2bc998f1.mjs +85 -0
  26. package/dist/_chunks/CreateView-2bc998f1.mjs.map +1 -0
  27. package/dist/_chunks/CreateView-5a0b0eca.js +89 -0
  28. package/dist/_chunks/CreateView-5a0b0eca.js.map +1 -0
  29. package/dist/_chunks/CreateView-8b6412c9.mjs +89 -0
  30. package/dist/_chunks/CreateView-8b6412c9.mjs.map +1 -0
  31. package/dist/_chunks/CreateView-fc328787.js +85 -0
  32. package/dist/_chunks/CreateView-fc328787.js.map +1 -0
  33. package/dist/_chunks/EditPage-0b1a48f7.js +499 -0
  34. package/dist/_chunks/EditPage-0b1a48f7.js.map +1 -0
  35. package/dist/_chunks/EditPage-2b051ea8.mjs +475 -0
  36. package/dist/_chunks/EditPage-2b051ea8.mjs.map +1 -0
  37. package/dist/_chunks/EditPage-6d3fe437.mjs +305 -0
  38. package/dist/_chunks/EditPage-6d3fe437.mjs.map +1 -0
  39. package/dist/_chunks/EditPage-7b9355e4.mjs +775 -0
  40. package/dist/_chunks/EditPage-7b9355e4.mjs.map +1 -0
  41. package/dist/_chunks/EditPage-89052393.js +796 -0
  42. package/dist/_chunks/EditPage-89052393.js.map +1 -0
  43. package/dist/_chunks/EditPage-de127112.js +325 -0
  44. package/dist/_chunks/EditPage-de127112.js.map +1 -0
  45. package/dist/_chunks/EditPage-efc987d7.js +404 -0
  46. package/dist/_chunks/EditPage-efc987d7.js.map +1 -0
  47. package/dist/_chunks/EditPage-faee9ac1.mjs +383 -0
  48. package/dist/_chunks/EditPage-faee9ac1.mjs.map +1 -0
  49. package/dist/_chunks/EditView-0e4d7c80.mjs +432 -0
  50. package/dist/_chunks/EditView-0e4d7c80.mjs.map +1 -0
  51. package/dist/_chunks/EditView-e480d09f.js +452 -0
  52. package/dist/_chunks/EditView-e480d09f.js.map +1 -0
  53. package/dist/_chunks/EditViewPage-3e638ea4.mjs +883 -0
  54. package/dist/_chunks/EditViewPage-3e638ea4.mjs.map +1 -0
  55. package/dist/_chunks/EditViewPage-ef0292a9.js +910 -0
  56. package/dist/_chunks/EditViewPage-ef0292a9.js.map +1 -0
  57. package/dist/_chunks/EventsTable-21c9c326.mjs +91 -0
  58. package/dist/_chunks/EventsTable-21c9c326.mjs.map +1 -0
  59. package/dist/_chunks/EventsTable-c8ea750e.js +91 -0
  60. package/dist/_chunks/EventsTable-c8ea750e.js.map +1 -0
  61. package/dist/_chunks/Filters-4d67a6ca.js +61 -0
  62. package/dist/_chunks/Filters-4d67a6ca.js.map +1 -0
  63. package/dist/_chunks/Filters-8f3c8fcf.mjs +43 -0
  64. package/dist/_chunks/Filters-8f3c8fcf.mjs.map +1 -0
  65. package/dist/_chunks/HomePage-28c2fc09.mjs +84 -0
  66. package/dist/_chunks/HomePage-28c2fc09.mjs.map +1 -0
  67. package/dist/_chunks/HomePage-bfeba10a.mjs +577 -0
  68. package/dist/_chunks/HomePage-bfeba10a.mjs.map +1 -0
  69. package/dist/_chunks/HomePage-d9e5bcf6.js +598 -0
  70. package/dist/_chunks/HomePage-d9e5bcf6.js.map +1 -0
  71. package/dist/_chunks/HomePage-ef17de6c.js +84 -0
  72. package/dist/_chunks/HomePage-ef17de6c.js.map +1 -0
  73. package/dist/_chunks/InformationBoxEE-2d2b6c4a.js +398 -0
  74. package/dist/_chunks/InformationBoxEE-2d2b6c4a.js.map +1 -0
  75. package/dist/_chunks/InformationBoxEE-bd1d2894.mjs +379 -0
  76. package/dist/_chunks/InformationBoxEE-bd1d2894.mjs.map +1 -0
  77. package/dist/_chunks/InstalledPluginsPage-39a094a5.js +189 -0
  78. package/dist/_chunks/InstalledPluginsPage-39a094a5.js.map +1 -0
  79. package/dist/_chunks/InstalledPluginsPage-8e9b0b64.mjs +170 -0
  80. package/dist/_chunks/InstalledPluginsPage-8e9b0b64.mjs.map +1 -0
  81. package/dist/_chunks/Layout-caf718bb.mjs +87 -0
  82. package/dist/_chunks/Layout-caf718bb.mjs.map +1 -0
  83. package/dist/_chunks/Layout-cc5413b2.js +88 -0
  84. package/dist/_chunks/Layout-cc5413b2.js.map +1 -0
  85. package/dist/_chunks/LimitsModal-3327be54.js +75 -0
  86. package/dist/_chunks/LimitsModal-3327be54.js.map +1 -0
  87. package/dist/_chunks/LimitsModal-d438f513.mjs +74 -0
  88. package/dist/_chunks/LimitsModal-d438f513.mjs.map +1 -0
  89. package/dist/_chunks/ListPage-05df9b86.mjs +345 -0
  90. package/dist/_chunks/ListPage-05df9b86.mjs.map +1 -0
  91. package/dist/_chunks/ListPage-17fb477a.js +389 -0
  92. package/dist/_chunks/ListPage-17fb477a.js.map +1 -0
  93. package/dist/_chunks/ListPage-338d8ca5.js +719 -0
  94. package/dist/_chunks/ListPage-338d8ca5.js.map +1 -0
  95. package/dist/_chunks/ListPage-56d94335.js +351 -0
  96. package/dist/_chunks/ListPage-56d94335.js.map +1 -0
  97. package/dist/_chunks/ListPage-5e5ad2aa.js +366 -0
  98. package/dist/_chunks/ListPage-5e5ad2aa.js.map +1 -0
  99. package/dist/_chunks/ListPage-5ed3e9d2.mjs +85 -0
  100. package/dist/_chunks/ListPage-5ed3e9d2.mjs.map +1 -0
  101. package/dist/_chunks/ListPage-7d5baee5.mjs +348 -0
  102. package/dist/_chunks/ListPage-7d5baee5.mjs.map +1 -0
  103. package/dist/_chunks/ListPage-800398cd.mjs +698 -0
  104. package/dist/_chunks/ListPage-800398cd.mjs.map +1 -0
  105. package/dist/_chunks/ListPage-cc823a6a.js +583 -0
  106. package/dist/_chunks/ListPage-cc823a6a.js.map +1 -0
  107. package/dist/_chunks/ListPage-db17e758.js +85 -0
  108. package/dist/_chunks/ListPage-db17e758.js.map +1 -0
  109. package/dist/_chunks/ListPage-de4b7131.mjs +580 -0
  110. package/dist/_chunks/ListPage-de4b7131.mjs.map +1 -0
  111. package/dist/_chunks/ListPage-f43782c4.mjs +370 -0
  112. package/dist/_chunks/ListPage-f43782c4.mjs.map +1 -0
  113. package/dist/_chunks/ListView-521e309f.mjs +271 -0
  114. package/dist/_chunks/ListView-521e309f.mjs.map +1 -0
  115. package/dist/_chunks/ListView-80855396.js +331 -0
  116. package/dist/_chunks/ListView-80855396.js.map +1 -0
  117. package/dist/_chunks/ListView-a33ebe77.js +292 -0
  118. package/dist/_chunks/ListView-a33ebe77.js.map +1 -0
  119. package/dist/_chunks/ListView-b91a8da7.mjs +310 -0
  120. package/dist/_chunks/ListView-b91a8da7.mjs.map +1 -0
  121. package/dist/_chunks/Login-4eb1fb78.mjs +101 -0
  122. package/dist/_chunks/Login-4eb1fb78.mjs.map +1 -0
  123. package/dist/_chunks/Login-906ebde5.js +103 -0
  124. package/dist/_chunks/Login-906ebde5.js.map +1 -0
  125. package/dist/_chunks/MagicLinkEE-03128309.mjs +92 -0
  126. package/dist/_chunks/MagicLinkEE-03128309.mjs.map +1 -0
  127. package/dist/_chunks/MagicLinkEE-ab36ee0f.js +92 -0
  128. package/dist/_chunks/MagicLinkEE-ab36ee0f.js.map +1 -0
  129. package/dist/_chunks/MarketplacePage-62e70483.mjs +1046 -0
  130. package/dist/_chunks/MarketplacePage-62e70483.mjs.map +1 -0
  131. package/dist/_chunks/MarketplacePage-fe1f2c6e.js +1070 -0
  132. package/dist/_chunks/MarketplacePage-fe1f2c6e.js.map +1 -0
  133. package/dist/_chunks/ModalForm-7057f0f5.mjs +28 -0
  134. package/dist/_chunks/ModalForm-7057f0f5.mjs.map +1 -0
  135. package/dist/_chunks/ModalForm-715b963e.js +28 -0
  136. package/dist/_chunks/ModalForm-715b963e.js.map +1 -0
  137. package/dist/_chunks/ProfilePage-5359ee40.mjs +676 -0
  138. package/dist/_chunks/ProfilePage-5359ee40.mjs.map +1 -0
  139. package/dist/_chunks/ProfilePage-5bf5e2ed.js +699 -0
  140. package/dist/_chunks/ProfilePage-5bf5e2ed.js.map +1 -0
  141. package/dist/_chunks/PurchaseAuditLogs-a9c1457c.js +48 -0
  142. package/dist/_chunks/PurchaseAuditLogs-a9c1457c.js.map +1 -0
  143. package/dist/_chunks/PurchaseAuditLogs-e50bb68e.mjs +48 -0
  144. package/dist/_chunks/PurchaseAuditLogs-e50bb68e.mjs.map +1 -0
  145. package/dist/_chunks/PurchaseReviewWorkflows-72d34d9b.mjs +51 -0
  146. package/dist/_chunks/PurchaseReviewWorkflows-72d34d9b.mjs.map +1 -0
  147. package/dist/_chunks/PurchaseReviewWorkflows-afa3d8ae.js +51 -0
  148. package/dist/_chunks/PurchaseReviewWorkflows-afa3d8ae.js.map +1 -0
  149. package/dist/_chunks/PurchaseSingleSignOn-70c10e60.mjs +51 -0
  150. package/dist/_chunks/PurchaseSingleSignOn-70c10e60.mjs.map +1 -0
  151. package/dist/_chunks/PurchaseSingleSignOn-b84a4ad2.js +51 -0
  152. package/dist/_chunks/PurchaseSingleSignOn-b84a4ad2.js.map +1 -0
  153. package/dist/_chunks/ReviewWorkflowsColumn-65518684.mjs +99 -0
  154. package/dist/_chunks/ReviewWorkflowsColumn-65518684.mjs.map +1 -0
  155. package/dist/_chunks/ReviewWorkflowsColumn-b36965fe.js +99 -0
  156. package/dist/_chunks/ReviewWorkflowsColumn-b36965fe.js.map +1 -0
  157. package/dist/_chunks/SelectRoles-3d810b00.mjs +114 -0
  158. package/dist/_chunks/SelectRoles-3d810b00.mjs.map +1 -0
  159. package/dist/_chunks/SelectRoles-e83f2dee.js +115 -0
  160. package/dist/_chunks/SelectRoles-e83f2dee.js.map +1 -0
  161. package/dist/_chunks/SettingsPage-571f777c.mjs +1074 -0
  162. package/dist/_chunks/SettingsPage-571f777c.mjs.map +1 -0
  163. package/dist/_chunks/SettingsPage-a558ffda.js +1097 -0
  164. package/dist/_chunks/SettingsPage-a558ffda.js.map +1 -0
  165. package/dist/_chunks/SingleSignOnPage-19f2e16f.mjs +325 -0
  166. package/dist/_chunks/SingleSignOnPage-19f2e16f.mjs.map +1 -0
  167. package/dist/_chunks/SingleSignOnPage-b63f4c0f.js +344 -0
  168. package/dist/_chunks/SingleSignOnPage-b63f4c0f.js.map +1 -0
  169. package/dist/_chunks/Table-3f09118e.mjs +206 -0
  170. package/dist/_chunks/Table-3f09118e.mjs.map +1 -0
  171. package/dist/_chunks/Table-69c2c269.js +226 -0
  172. package/dist/_chunks/Table-69c2c269.js.map +1 -0
  173. package/dist/_chunks/TokenTypeSelect-3e46ae6e.mjs +374 -0
  174. package/dist/_chunks/TokenTypeSelect-3e46ae6e.mjs.map +1 -0
  175. package/dist/_chunks/TokenTypeSelect-c75581af.js +392 -0
  176. package/dist/_chunks/TokenTypeSelect-c75581af.js.map +1 -0
  177. package/dist/_chunks/build-5bfa2e99.js +68 -0
  178. package/dist/_chunks/build-5bfa2e99.js.map +1 -0
  179. package/dist/_chunks/build-81e67209.mjs +68 -0
  180. package/dist/_chunks/build-81e67209.mjs.map +1 -0
  181. package/dist/_chunks/colors-bda951e9.mjs +34 -0
  182. package/dist/_chunks/colors-bda951e9.mjs.map +1 -0
  183. package/dist/_chunks/colors-c17c9c3c.js +33 -0
  184. package/dist/_chunks/colors-c17c9c3c.js.map +1 -0
  185. package/dist/_chunks/constants-28fd3788.js +134 -0
  186. package/dist/_chunks/constants-28fd3788.js.map +1 -0
  187. package/dist/_chunks/constants-2a8f4e41.mjs.map +1 -1
  188. package/dist/_chunks/constants-40ffa931.js.map +1 -1
  189. package/dist/_chunks/constants-5345058d.js +121 -0
  190. package/dist/_chunks/constants-5345058d.js.map +1 -0
  191. package/dist/_chunks/constants-71ebbb75.mjs +242 -0
  192. package/dist/_chunks/constants-71ebbb75.mjs.map +1 -0
  193. package/dist/_chunks/constants-73ebce66.js +242 -0
  194. package/dist/_chunks/constants-73ebce66.js.map +1 -0
  195. package/dist/_chunks/constants-7e57b453.mjs +52 -0
  196. package/dist/_chunks/constants-7e57b453.mjs.map +1 -0
  197. package/dist/_chunks/constants-8092eeb5.mjs.map +1 -1
  198. package/dist/_chunks/constants-85da8cc4.js.map +1 -1
  199. package/dist/_chunks/constants-a92ce583.mjs.map +1 -1
  200. package/dist/_chunks/constants-b3c9cbbf.mjs +119 -0
  201. package/dist/_chunks/constants-b3c9cbbf.mjs.map +1 -0
  202. package/dist/_chunks/constants-d3dd8ed6.mjs.map +1 -1
  203. package/dist/_chunks/constants-d5d67ca8.js.map +1 -1
  204. package/dist/_chunks/constants-d80f19f3.js +52 -0
  205. package/dist/_chunks/constants-d80f19f3.js.map +1 -0
  206. package/dist/_chunks/constants-da2542a3.js.map +1 -1
  207. package/dist/_chunks/constants-e1d0f820.mjs +113 -0
  208. package/dist/_chunks/constants-e1d0f820.mjs.map +1 -0
  209. package/dist/_chunks/develop-ab3daae0.js +61 -0
  210. package/dist/_chunks/develop-ab3daae0.js.map +1 -0
  211. package/dist/_chunks/develop-b194ba9b.mjs +61 -0
  212. package/dist/_chunks/develop-b194ba9b.mjs.map +1 -0
  213. package/dist/_chunks/en-390fd1f1.mjs +1029 -0
  214. package/dist/_chunks/en-390fd1f1.mjs.map +1 -0
  215. package/dist/_chunks/en-f40febb9.js +1029 -0
  216. package/dist/_chunks/en-f40febb9.js.map +1 -0
  217. package/dist/_chunks/index-3f8cf4d5.js +18413 -0
  218. package/dist/_chunks/index-3f8cf4d5.js.map +1 -0
  219. package/dist/_chunks/index-95e8649d.mjs +18334 -0
  220. package/dist/_chunks/index-95e8649d.mjs.map +1 -0
  221. package/dist/_chunks/index-dfdaf309.mjs +1265 -0
  222. package/dist/_chunks/index-dfdaf309.mjs.map +1 -0
  223. package/dist/_chunks/index-ea5b8bc5.js +1336 -0
  224. package/dist/_chunks/index-ea5b8bc5.js.map +1 -0
  225. package/dist/_chunks/useAdminRolePermissions-122fa43a.js +2065 -0
  226. package/dist/_chunks/useAdminRolePermissions-122fa43a.js.map +1 -0
  227. package/dist/_chunks/useAdminRolePermissions-fccd0884.mjs +2036 -0
  228. package/dist/_chunks/useAdminRolePermissions-fccd0884.mjs.map +1 -0
  229. package/dist/_chunks/useAdminRoles-485a39e5.js +65 -0
  230. package/dist/_chunks/useAdminRoles-485a39e5.js.map +1 -0
  231. package/dist/_chunks/useAdminRoles-501e111a.mjs +47 -0
  232. package/dist/_chunks/useAdminRoles-501e111a.mjs.map +1 -0
  233. package/dist/_chunks/useLicenseLimitNotification-92085192.js +100 -0
  234. package/dist/_chunks/useLicenseLimitNotification-92085192.js.map +1 -0
  235. package/dist/_chunks/useLicenseLimitNotification-b59fb6f9.mjs +80 -0
  236. package/dist/_chunks/useLicenseLimitNotification-b59fb6f9.mjs.map +1 -0
  237. package/dist/_chunks/useLicenseLimits-497c0f5f.mjs +34 -0
  238. package/dist/_chunks/useLicenseLimits-497c0f5f.mjs.map +1 -0
  239. package/dist/_chunks/useLicenseLimits-e60a01b1.js +52 -0
  240. package/dist/_chunks/useLicenseLimits-e60a01b1.js.map +1 -0
  241. package/dist/_chunks/useReviewWorkflows-26f7e558.js +71 -0
  242. package/dist/_chunks/useReviewWorkflows-26f7e558.js.map +1 -0
  243. package/dist/_chunks/useReviewWorkflows-3e0bcb69.mjs +53 -0
  244. package/dist/_chunks/useReviewWorkflows-3e0bcb69.mjs.map +1 -0
  245. package/dist/_chunks/validateWorkflow-1f89db67.js +1078 -0
  246. package/dist/_chunks/validateWorkflow-1f89db67.js.map +1 -0
  247. package/dist/_chunks/validateWorkflow-8a63abd6.mjs +1055 -0
  248. package/dist/_chunks/validateWorkflow-8a63abd6.mjs.map +1 -0
  249. package/dist/_chunks/validation-2e4cec2b.mjs +16 -0
  250. package/dist/_chunks/validation-2e4cec2b.mjs.map +1 -0
  251. package/dist/_chunks/validation-fabd21cc.js +34 -0
  252. package/dist/_chunks/validation-fabd21cc.js.map +1 -0
  253. package/dist/admin/index.js +43 -4
  254. package/dist/admin/index.js.map +1 -1
  255. package/dist/admin/index.mjs +45 -6
  256. package/dist/admin/index.mjs.map +1 -1
  257. package/dist/admin/src/App.d.ts +7 -1
  258. package/dist/admin/src/StrapiApp.d.ts +5 -5
  259. package/dist/admin/src/components/DragLayer.d.ts +4 -1
  260. package/dist/admin/src/components/InjectionZone.d.ts +59 -0
  261. package/dist/admin/src/components/LanguageProvider.d.ts +3 -14
  262. package/dist/admin/src/components/Providers.d.ts +3 -5
  263. package/dist/admin/src/components/Theme.d.ts +7 -1
  264. package/dist/admin/src/constants.d.ts +1 -4
  265. package/dist/admin/src/content-manager/components/BlocksInput/Blocks/Code.d.ts +3 -0
  266. package/dist/admin/src/content-manager/components/BlocksInput/Blocks/Heading.d.ts +3 -0
  267. package/dist/admin/src/content-manager/components/BlocksInput/Blocks/Image.d.ts +3 -0
  268. package/dist/admin/src/content-manager/components/BlocksInput/Blocks/Link.d.ts +3 -0
  269. package/dist/admin/src/content-manager/components/BlocksInput/Blocks/List.d.ts +3 -0
  270. package/dist/admin/src/content-manager/components/BlocksInput/Blocks/Paragraph.d.ts +3 -0
  271. package/dist/admin/src/content-manager/components/BlocksInput/Blocks/Quote.d.ts +3 -0
  272. package/dist/admin/src/content-manager/components/BlocksInput/BlocksEditor.d.ts +36 -2
  273. package/dist/admin/src/content-manager/components/BlocksInput/BlocksInput.d.ts +2 -2
  274. package/dist/admin/src/content-manager/components/BlocksInput/BlocksToolbar.d.ts +9 -1
  275. package/dist/admin/src/content-manager/components/BlocksInput/EditorLayout.d.ts +10 -0
  276. package/dist/admin/src/content-manager/components/BlocksInput/Modifiers.d.ts +16 -0
  277. package/dist/admin/src/content-manager/components/BlocksInput/plugins/withImages.d.ts +11 -0
  278. package/dist/admin/src/content-manager/components/BlocksInput/plugins/withLinks.d.ts +1 -0
  279. package/dist/admin/src/content-manager/components/BlocksInput/utils/conversions.d.ts +13 -0
  280. package/dist/admin/src/content-manager/components/BlocksInput/utils/enterKey.d.ts +6 -0
  281. package/dist/admin/src/content-manager/components/BlocksInput/utils/types.d.ts +7 -3
  282. package/dist/admin/src/content-manager/components/ComponentIcon.d.ts +8 -0
  283. package/dist/admin/src/content-manager/components/ComponentInitializer.d.ts +10 -0
  284. package/dist/admin/src/content-manager/components/ContentTypeFormWrapper.d.ts +32 -0
  285. package/dist/admin/src/content-manager/components/DragPreviews/CardDragPreview.d.ts +7 -0
  286. package/dist/admin/src/content-manager/components/DragPreviews/ComponentDragPreview.d.ts +6 -0
  287. package/dist/admin/src/content-manager/components/DragPreviews/RelationDragPreview.d.ts +9 -0
  288. package/dist/admin/src/content-manager/components/DynamicZone/AddComponentButton.d.ts +11 -0
  289. package/dist/admin/src/content-manager/components/DynamicZone/ComponentCard.d.ts +9 -0
  290. package/dist/admin/src/content-manager/components/DynamicZone/ComponentCategory.d.ts +17 -0
  291. package/dist/admin/src/content-manager/components/DynamicZone/ComponentPicker.d.ts +9 -0
  292. package/dist/admin/src/content-manager/components/DynamicZone/DynamicComponent.d.ts +15 -0
  293. package/dist/admin/src/content-manager/components/DynamicZone/DynamicZoneLabel.d.ts +13 -0
  294. package/dist/admin/src/content-manager/components/DynamicZone/Field.d.ts +32 -0
  295. package/dist/admin/src/content-manager/components/EditViewDataManagerProvider/Provider.d.ts +18 -0
  296. package/dist/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.d.ts +150 -0
  297. package/dist/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.d.ts +6 -0
  298. package/dist/admin/src/content-manager/components/EditViewDataManagerProvider/utils/findAllAndReplace.d.ts +33 -0
  299. package/dist/admin/src/content-manager/components/EditViewDataManagerProvider/utils/getAPIInnerError.d.ts +6 -0
  300. package/dist/admin/src/content-manager/components/EditViewDataManagerProvider/utils/moveFields.d.ts +2 -0
  301. package/dist/admin/src/content-manager/components/FieldComponent.d.ts +16 -0
  302. package/dist/admin/src/content-manager/components/FieldTypeIcon.d.ts +32 -0
  303. package/dist/admin/src/content-manager/components/Hint.d.ts +9 -0
  304. package/dist/admin/src/content-manager/components/InputUID.d.ts +16 -0
  305. package/dist/admin/src/content-manager/components/Inputs.d.ts +11 -0
  306. package/dist/admin/src/content-manager/components/LeftMenu.d.ts +2 -0
  307. package/dist/admin/src/content-manager/components/NonRepeatableComponent.d.ts +9 -0
  308. package/dist/admin/src/content-manager/components/Relations/RelationInput.d.ts +62 -0
  309. package/dist/admin/src/content-manager/components/Relations/RelationInputDataManager.d.ts +26 -0
  310. package/dist/admin/src/content-manager/components/Relations/useRelation.d.ts +31 -0
  311. package/dist/admin/src/content-manager/components/Relations/utils/diffRelations.d.ts +2 -0
  312. package/dist/admin/src/content-manager/components/Relations/utils/getRelationLink.d.ts +2 -0
  313. package/dist/admin/src/content-manager/components/Relations/utils/normalizeRelations.d.ts +13 -0
  314. package/dist/admin/src/content-manager/components/Relations/utils/normalizeSearchResults.d.ts +149 -0
  315. package/dist/admin/src/content-manager/components/RepeatableComponent.d.ts +14 -0
  316. package/dist/admin/src/content-manager/components/Wysiwyg/Editor.d.ts +28 -0
  317. package/dist/admin/src/content-manager/components/Wysiwyg/EditorLayout.d.ts +59 -0
  318. package/dist/admin/src/content-manager/components/Wysiwyg/Field.d.ts +14 -0
  319. package/dist/admin/src/content-manager/components/Wysiwyg/PreviewWysiwyg.d.ts +5 -0
  320. package/dist/admin/src/content-manager/components/Wysiwyg/WysiwygFooter.d.ts +7 -0
  321. package/dist/admin/src/content-manager/components/Wysiwyg/WysiwygNav.d.ts +17 -0
  322. package/dist/admin/src/content-manager/components/Wysiwyg/WysiwygStyles.d.ts +54 -0
  323. package/dist/admin/src/content-manager/components/Wysiwyg/utils/continueList.d.ts +5 -0
  324. package/dist/admin/src/content-manager/components/Wysiwyg/utils/mdRenderer.d.ts +3 -0
  325. package/dist/admin/src/content-manager/components/Wysiwyg/utils/utils.d.ts +16 -0
  326. package/dist/admin/src/content-manager/constants/attributes.d.ts +2 -0
  327. package/dist/admin/src/content-manager/contexts/models.d.ts +5 -0
  328. package/dist/admin/src/content-manager/hooks/useContentManagerInitData.d.ts +29 -0
  329. package/dist/admin/src/content-manager/hooks/useContentTypeLayout.d.ts +6 -0
  330. package/dist/admin/src/content-manager/hooks/useDragAndDrop.d.ts +48 -0
  331. package/dist/admin/src/content-manager/hooks/useFindRedirectionLink.d.ts +2 -0
  332. package/dist/admin/src/content-manager/hooks/useKeyboardDragAndDrop.d.ts +14 -0
  333. package/dist/admin/src/content-manager/hooks/useLayouts.d.ts +10 -0
  334. package/dist/admin/src/content-manager/hooks/useLazyComponents.d.ts +13 -0
  335. package/dist/admin/src/content-manager/hooks/usePrev.d.ts +1 -0
  336. package/dist/admin/src/content-manager/hooks/useSyncRbac.d.ts +28 -0
  337. package/dist/admin/src/content-manager/pages/App.d.ts +47 -0
  338. package/dist/admin/src/content-manager/pages/CollectionTypePages.d.ts +12 -0
  339. package/dist/admin/src/content-manager/pages/ComponentSettingsView.d.ts +2 -0
  340. package/dist/admin/src/content-manager/pages/EditView/EditViewPage.d.ts +18 -0
  341. package/dist/admin/src/content-manager/pages/EditView/components/DeleteLink.d.ts +6 -0
  342. package/dist/admin/src/content-manager/pages/EditView/components/DraftAndPublishBadge.d.ts +2 -0
  343. package/dist/admin/src/content-manager/pages/EditView/components/Header.d.ts +7 -0
  344. package/dist/admin/src/content-manager/pages/EditView/components/Information.d.ts +10 -0
  345. package/dist/admin/src/content-manager/pages/EditView/components/InformationBoxCE.d.ts +2 -0
  346. package/dist/admin/src/content-manager/pages/EditViewLayoutManager.d.ts +26 -0
  347. package/dist/admin/src/content-manager/pages/ListView/ListViewPage.d.ts +25 -0
  348. package/dist/admin/src/content-manager/pages/ListView/components/AdminUsersFilter.d.ts +6 -0
  349. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/Buttons.d.ts +27 -0
  350. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.d.ts +15 -0
  351. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/SelectedEntriesModal.d.ts +30 -0
  352. package/dist/admin/src/content-manager/pages/ListView/components/DialogConfirmDelete.d.ts +9 -0
  353. package/dist/admin/src/content-manager/pages/ListView/components/Filter.d.ts +7 -0
  354. package/dist/admin/src/content-manager/pages/ListView/components/InjectionZoneList.d.ts +7 -0
  355. package/dist/admin/src/content-manager/pages/ListView/components/Table.d.ts +28 -0
  356. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/CellContent.d.ts +11 -0
  357. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/CellValue.d.ts +8 -0
  358. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Components.d.ts +12 -0
  359. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Media.d.ts +23 -0
  360. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Relations.d.ts +12 -0
  361. package/dist/admin/src/content-manager/pages/ListView/components/ViewSettingsMenu.d.ts +6 -0
  362. package/dist/admin/src/content-manager/pages/ListView/hooks/useAllowedAttributes.d.ts +3 -0
  363. package/dist/admin/src/content-manager/pages/ListViewLayoutManager.d.ts +75 -0
  364. package/dist/admin/src/content-manager/pages/NoContentTypePage.d.ts +2 -0
  365. package/dist/admin/src/content-manager/pages/NoPermissionsPage.d.ts +2 -0
  366. package/dist/admin/src/content-manager/sharedReducers/crud/actions.d.ts +63 -0
  367. package/dist/admin/src/content-manager/sharedReducers/crud/constants.d.ts +8 -0
  368. package/dist/admin/src/content-manager/sharedReducers/crud/reducer.d.ts +24 -0
  369. package/dist/admin/src/content-manager/utils/api.d.ts +14 -0
  370. package/dist/admin/src/content-manager/utils/arrayMoveItem.d.ts +2 -0
  371. package/dist/admin/src/content-manager/utils/attributes.d.ts +3 -0
  372. package/dist/admin/src/content-manager/utils/data.d.ts +5 -0
  373. package/dist/admin/src/content-manager/utils/dragAndDrop.d.ts +8 -0
  374. package/dist/admin/src/content-manager/utils/fields.d.ts +6 -0
  375. package/dist/admin/src/content-manager/utils/layouts.d.ts +96 -0
  376. package/dist/admin/src/content-manager/utils/paths.d.ts +7 -0
  377. package/dist/admin/src/content-manager/utils/permissions.d.ts +8 -0
  378. package/dist/admin/src/content-manager/utils/refs.d.ts +8 -0
  379. package/dist/admin/src/content-manager/utils/schemas.d.ts +22 -0
  380. package/dist/admin/src/content-manager/utils/translations.d.ts +2 -0
  381. package/dist/admin/src/content-manager/utils/users.d.ts +7 -0
  382. package/dist/admin/src/content-manager/utils/validation.d.ts +21 -0
  383. package/dist/admin/src/core/apis/CustomFields.d.ts +4 -4
  384. package/dist/admin/src/core/store/configure.d.ts +21 -16
  385. package/dist/admin/src/core/store/hooks.d.ts +18 -18
  386. package/dist/admin/src/core/utils/createHook.d.ts +3 -2
  387. package/dist/admin/src/features/Configuration.d.ts +54 -0
  388. package/dist/admin/src/hooks/useAdminRoles.d.ts +4 -3
  389. package/dist/admin/src/hooks/useAdminUsers.d.ts +6 -9
  390. package/dist/admin/src/hooks/useEnterprise.d.ts +1 -1
  391. package/dist/admin/src/hooks/useInjectionZone.d.ts +6 -0
  392. package/dist/admin/src/hooks/useOnce.d.ts +2 -0
  393. package/dist/admin/src/hooks/useSettingsMenu.d.ts +9 -4
  394. package/dist/admin/src/index.d.ts +1 -0
  395. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -2
  396. package/dist/admin/src/pages/Settings/SettingsPage.d.ts +4 -0
  397. package/dist/admin/src/pages/Settings/components/Filters.d.ts +5 -0
  398. package/dist/admin/src/pages/Settings/components/SettingsNav.d.ts +7 -0
  399. package/dist/admin/src/pages/Settings/components/Tokens/FormHead.d.ts +19 -0
  400. package/dist/admin/src/pages/Settings/components/Tokens/LifeSpanInput.d.ts +17 -0
  401. package/dist/admin/src/pages/Settings/components/Tokens/Table.d.ts +27 -0
  402. package/dist/admin/src/pages/Settings/components/Tokens/TokenBox.d.ts +6 -0
  403. package/dist/admin/src/pages/Settings/components/Tokens/TokenDescription.d.ts +8 -0
  404. package/dist/admin/src/pages/Settings/components/Tokens/TokenName.d.ts +8 -0
  405. package/dist/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.d.ts +14 -0
  406. package/dist/admin/src/pages/Settings/components/Tokens/constants.d.ts +2 -0
  407. package/dist/admin/src/pages/Settings/constants.d.ts +4 -0
  408. package/dist/admin/src/pages/Settings/pages/ApiTokens/CreateView.d.ts +1 -0
  409. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.d.ts +2 -0
  410. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/apiTokenPermissions.d.ts +36 -0
  411. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/ActionBoundRoutes.d.ts +1 -0
  412. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.d.ts +10 -0
  413. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollabsableContentType.d.ts +11 -0
  414. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/ContentTypesSection.d.ts +6 -0
  415. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.d.ts +20 -0
  416. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/LoadingView.d.ts +5 -0
  417. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/Permissions.d.ts +3 -0
  418. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/Regenerate.d.ts +6 -0
  419. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.d.ts +17 -0
  420. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.d.ts +40 -0
  421. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/getDateOfExpiration.d.ts +1 -0
  422. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.d.ts +17 -0
  423. package/dist/admin/src/pages/Settings/pages/ApiTokens/ListView.d.ts +2 -0
  424. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.d.ts +2 -0
  425. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.d.ts +14 -0
  426. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/utils/constants.d.ts +3 -0
  427. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/utils/files.d.ts +19 -0
  428. package/dist/admin/src/pages/Settings/pages/PurchaseAuditLogs.d.ts +2 -0
  429. package/dist/admin/src/pages/Settings/pages/PurchaseReviewWorkflows.d.ts +2 -0
  430. package/dist/admin/src/pages/Settings/pages/PurchaseSingleSignOn.d.ts +2 -0
  431. package/dist/admin/src/pages/Settings/pages/Roles/CreatePage.d.ts +7 -0
  432. package/dist/admin/src/pages/Settings/pages/Roles/EditPage.d.ts +8 -0
  433. package/dist/admin/src/pages/Settings/pages/Roles/ListPage.d.ts +3 -0
  434. package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +52 -0
  435. package/dist/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.d.ts +35 -0
  436. package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.d.ts +12 -0
  437. package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.d.ts +32 -0
  438. package/dist/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.d.ts +35 -0
  439. package/dist/admin/src/pages/Settings/pages/Roles/components/ContentTypes.d.ts +8 -0
  440. package/dist/admin/src/pages/Settings/pages/Roles/components/GlobalActions.d.ts +10 -0
  441. package/dist/admin/src/pages/Settings/pages/Roles/components/HiddenAction.d.ts +2 -0
  442. package/dist/admin/src/pages/Settings/pages/Roles/components/Permissions.d.ts +54 -0
  443. package/dist/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.d.ts +18 -0
  444. package/dist/admin/src/pages/Settings/pages/Roles/components/RequiredSign.d.ts +2 -0
  445. package/dist/admin/src/pages/Settings/pages/Roles/components/RoleForm.d.ts +12 -0
  446. package/dist/admin/src/pages/Settings/pages/Roles/components/RoleRow.d.ts +10 -0
  447. package/dist/admin/src/pages/Settings/pages/Roles/components/RowLabelWithCheckbox.d.ts +17 -0
  448. package/dist/admin/src/pages/Settings/pages/Roles/hooks/useAdminRolePermissions.d.ts +13 -0
  449. package/dist/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.d.ts +29 -0
  450. package/dist/admin/src/pages/Settings/pages/Roles/utils/constants.d.ts +3 -0
  451. package/dist/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.d.ts +3 -0
  452. package/dist/admin/src/pages/Settings/pages/Roles/utils/forms.d.ts +28 -0
  453. package/dist/admin/src/pages/Settings/pages/Roles/utils/getCheckboxState.d.ts +8 -0
  454. package/dist/admin/src/pages/Settings/pages/Roles/utils/layouts.d.ts +13 -0
  455. package/dist/admin/src/pages/Settings/pages/Roles/utils/permissions.d.ts +8 -0
  456. package/dist/admin/src/pages/Settings/pages/Roles/utils/removeConditionKeyFromData.d.ts +8 -0
  457. package/dist/admin/src/pages/Settings/pages/Roles/utils/updateConditionsToFalse.d.ts +5 -0
  458. package/dist/admin/src/pages/Settings/pages/Roles/utils/updateValues.d.ts +8 -0
  459. package/dist/admin/src/pages/Settings/pages/TransferTokens/CreateView.d.ts +1 -0
  460. package/dist/admin/src/pages/Settings/pages/TransferTokens/EditView.d.ts +7 -0
  461. package/dist/admin/src/pages/Settings/pages/TransferTokens/ListView.d.ts +3 -0
  462. package/dist/admin/src/pages/Settings/pages/Users/EditPage.d.ts +3 -0
  463. package/dist/admin/src/pages/Settings/pages/Users/ListPage.d.ts +22 -0
  464. package/dist/admin/src/pages/Settings/pages/Users/components/CreateActionCE.d.ts +6 -0
  465. package/dist/admin/src/pages/Settings/pages/Users/components/MagicLinkCE.d.ts +6 -0
  466. package/dist/admin/src/pages/Settings/pages/Users/components/MagicLinkWrapper.d.ts +7 -0
  467. package/dist/admin/src/pages/Settings/pages/Users/components/NewUserForm.d.ts +15 -0
  468. package/dist/admin/src/pages/Settings/pages/Users/components/SelectRoles.d.ts +8 -0
  469. package/dist/admin/src/pages/Settings/pages/Users/components/TableRows.d.ts +9 -0
  470. package/dist/admin/src/pages/Settings/pages/Users/utils/validation.d.ts +13 -0
  471. package/dist/admin/src/pages/Settings/pages/Webhooks/CreatePage.d.ts +3 -0
  472. package/dist/admin/src/pages/Settings/pages/Webhooks/EditPage.d.ts +3 -0
  473. package/dist/admin/src/pages/Settings/pages/Webhooks/ListPage.d.ts +3 -0
  474. package/dist/admin/src/pages/Settings/pages/Webhooks/components/Events.d.ts +32 -0
  475. package/dist/admin/src/pages/Settings/pages/Webhooks/components/EventsTable.d.ts +2 -0
  476. package/dist/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.d.ts +2 -0
  477. package/dist/admin/src/pages/Settings/pages/Webhooks/components/TriggerContainer.d.ts +13 -0
  478. package/dist/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.d.ts +22 -0
  479. package/dist/admin/src/pages/Settings/utils/forms.d.ts +3 -0
  480. package/dist/admin/src/reducer.d.ts +16 -18
  481. package/dist/admin/src/selectors.d.ts +18 -12
  482. package/dist/admin/src/types/form.d.ts +6 -0
  483. package/dist/admin/src/types/permissions.d.ts +17 -11
  484. package/dist/admin/src/utils/arrays.d.ts +23 -0
  485. package/dist/admin/src/utils/objects.d.ts +8 -0
  486. package/dist/admin/src/utils/strings.d.ts +2 -0
  487. package/dist/cli.js +1 -1
  488. package/dist/cli.mjs +1 -1
  489. package/dist/ee/admin/src/constants.d.ts +8 -0
  490. package/dist/ee/admin/src/content-manager/pages/EditView/components/AssigneeSelect.d.ts +2 -0
  491. package/dist/ee/admin/src/content-manager/pages/EditView/components/InformationBoxEE.d.ts +2 -0
  492. package/dist/ee/admin/src/content-manager/pages/EditView/components/StageSelect.d.ts +1 -0
  493. package/dist/ee/admin/src/content-manager/pages/EditView/components/constants.d.ts +2 -0
  494. package/dist/ee/admin/src/content-manager/pages/ListSettingsView/constants.d.ts +7 -0
  495. package/dist/ee/admin/src/content-manager/pages/ListView/components/AssigneeFilter.d.ts +6 -0
  496. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsAssigneeEE.d.ts +7 -0
  497. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsColumn.d.ts +2 -0
  498. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsStageEE.d.ts +7 -0
  499. package/dist/ee/admin/src/content-manager/pages/ListView/components/StageFilter.d.ts +7 -0
  500. package/dist/ee/admin/src/content-manager/pages/ListView/constants.d.ts +86 -0
  501. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +20 -0
  502. package/dist/ee/admin/src/pages/SettingsPage/constants.d.ts +2 -0
  503. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.d.ts +1 -0
  504. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.d.ts +2 -0
  505. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ComboboxFilter.d.ts +11 -0
  506. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.d.ts +6 -0
  507. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/PaginationFooter.d.ts +6 -0
  508. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/TableRows.d.ts +32 -0
  509. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.d.ts +12 -0
  510. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.d.ts +1 -0
  511. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/tests/utils/data.d.ts +56 -0
  512. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +31 -0
  513. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.d.ts +75 -0
  514. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/tableHeaders.d.ts +32 -0
  515. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/CreatePage.d.ts +1 -0
  516. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/EditPage.d.ts +1 -0
  517. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/ListPage.d.ts +2 -0
  518. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/actions.d.ts +86 -0
  519. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage.d.ts +8 -0
  520. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Layout.d.ts +16 -0
  521. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal.d.ts +15 -0
  522. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stage.d.ts +10 -0
  523. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/StageDragPreview.d.ts +4 -0
  524. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stages.d.ts +7 -0
  525. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/WorkflowAttributes.d.ts +4 -0
  526. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/constants.d.ts +20 -0
  527. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.d.ts +13 -0
  528. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflowsStages.d.ts +16 -0
  529. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/reducer.d.ts +38 -0
  530. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/selectors.d.ts +62 -0
  531. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/colors.d.ts +8 -0
  532. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/validateWorkflow.d.ts +5 -0
  533. package/dist/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.d.ts +2 -0
  534. package/dist/ee/admin/src/pages/SettingsPage/pages/Users/ListPage.d.ts +1 -0
  535. package/dist/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.d.ts +8 -0
  536. package/dist/ee/admin/src/pages/SettingsPage/pages/Users/components/MagicLinkEE.d.ts +2 -0
  537. package/dist/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.d.ts +15 -0
  538. package/dist/ee/admin/src/pages/SettingsPage/pages/Webhooks/components/EventsTable.d.ts +2 -0
  539. package/dist/ee/server/index.js +3866 -0
  540. package/dist/ee/server/index.js.map +1 -0
  541. package/dist/ee/server/index.mjs +3857 -0
  542. package/dist/ee/server/index.mjs.map +1 -0
  543. package/dist/server/index.js +5579 -0
  544. package/dist/server/index.js.map +1 -0
  545. package/dist/server/index.mjs +5562 -0
  546. package/dist/server/index.mjs.map +1 -0
  547. package/dist/server/src/bootstrap.d.ts +6 -0
  548. package/dist/server/src/bootstrap.d.ts.map +1 -0
  549. package/dist/server/src/config/admin-actions.d.ts +34 -0
  550. package/dist/server/src/config/admin-actions.d.ts.map +1 -0
  551. package/dist/server/src/config/admin-conditions.d.ts +47 -0
  552. package/dist/server/src/config/admin-conditions.d.ts.map +1 -0
  553. package/dist/server/src/config/email-templates/forgot-password.d.ts +7 -0
  554. package/dist/server/src/config/email-templates/forgot-password.d.ts.map +1 -0
  555. package/dist/server/src/config/index.d.ts +18 -0
  556. package/dist/server/src/config/index.d.ts.map +1 -0
  557. package/dist/server/src/config/settings.d.ts +8 -0
  558. package/dist/server/src/config/settings.d.ts.map +1 -0
  559. package/dist/server/src/content-types/Permission.d.ts +63 -0
  560. package/dist/server/src/content-types/Permission.d.ts.map +1 -0
  561. package/dist/server/src/content-types/Role.d.ts +58 -0
  562. package/dist/server/src/content-types/Role.d.ts.map +1 -0
  563. package/dist/server/src/content-types/User.d.ts +107 -0
  564. package/dist/server/src/content-types/User.d.ts.map +1 -0
  565. package/dist/server/src/content-types/api-token-permission.d.ts +36 -0
  566. package/dist/server/src/content-types/api-token-permission.d.ts.map +1 -0
  567. package/dist/server/src/content-types/api-token.d.ts +74 -0
  568. package/dist/server/src/content-types/api-token.d.ts.map +1 -0
  569. package/dist/server/src/content-types/index.d.ts +438 -0
  570. package/dist/server/src/content-types/index.d.ts.map +1 -0
  571. package/dist/server/src/content-types/transfer-token-permission.d.ts +36 -0
  572. package/dist/server/src/content-types/transfer-token-permission.d.ts.map +1 -0
  573. package/dist/server/src/content-types/transfer-token.d.ts +66 -0
  574. package/dist/server/src/content-types/transfer-token.d.ts.map +1 -0
  575. package/dist/server/src/controllers/admin.d.ts +55 -0
  576. package/dist/server/src/controllers/admin.d.ts.map +1 -0
  577. package/dist/server/src/controllers/api-token.d.ts +12 -0
  578. package/dist/server/src/controllers/api-token.d.ts.map +1 -0
  579. package/dist/server/src/controllers/authenticated-user.d.ts +8 -0
  580. package/dist/server/src/controllers/authenticated-user.d.ts.map +1 -0
  581. package/dist/server/src/controllers/authentication.d.ts +14 -0
  582. package/dist/server/src/controllers/authentication.d.ts.map +1 -0
  583. package/dist/server/src/controllers/content-api.d.ts +8 -0
  584. package/dist/server/src/controllers/content-api.d.ts.map +1 -0
  585. package/dist/server/src/controllers/formatters/conditions.d.ts +4 -0
  586. package/dist/server/src/controllers/formatters/conditions.d.ts.map +1 -0
  587. package/dist/server/src/controllers/formatters/format-actions-by-sections.d.ts +8 -0
  588. package/dist/server/src/controllers/formatters/format-actions-by-sections.d.ts.map +1 -0
  589. package/dist/server/src/controllers/formatters/index.d.ts +3 -0
  590. package/dist/server/src/controllers/formatters/index.d.ts.map +1 -0
  591. package/dist/server/src/controllers/index.d.ts +110 -0
  592. package/dist/server/src/controllers/index.d.ts.map +1 -0
  593. package/dist/server/src/controllers/permission.d.ts +15 -0
  594. package/dist/server/src/controllers/permission.d.ts.map +1 -0
  595. package/dist/server/src/controllers/role.d.ts +45 -0
  596. package/dist/server/src/controllers/role.d.ts.map +1 -0
  597. package/dist/server/src/controllers/transfer/index.d.ts +5 -0
  598. package/dist/server/src/controllers/transfer/index.d.ts.map +1 -0
  599. package/dist/server/src/controllers/transfer/runner.d.ts +9 -0
  600. package/dist/server/src/controllers/transfer/runner.d.ts.map +1 -0
  601. package/dist/server/src/controllers/transfer/token.d.ts +11 -0
  602. package/dist/server/src/controllers/transfer/token.d.ts.map +1 -0
  603. package/dist/server/src/controllers/user.d.ts +15 -0
  604. package/dist/server/src/controllers/user.d.ts.map +1 -0
  605. package/dist/server/src/controllers/webhooks.d.ts +12 -0
  606. package/dist/server/src/controllers/webhooks.d.ts.map +1 -0
  607. package/dist/server/src/destroy.d.ts +3 -0
  608. package/dist/server/src/destroy.d.ts.map +1 -0
  609. package/dist/server/src/domain/action/index.d.ts +34 -0
  610. package/dist/server/src/domain/action/index.d.ts.map +1 -0
  611. package/dist/server/src/domain/action/provider.d.ts +40 -0
  612. package/dist/server/src/domain/action/provider.d.ts.map +1 -0
  613. package/dist/server/src/domain/condition/index.d.ts +54 -0
  614. package/dist/server/src/domain/condition/index.d.ts.map +1 -0
  615. package/dist/server/src/domain/condition/provider.d.ts +31 -0
  616. package/dist/server/src/domain/condition/provider.d.ts.map +1 -0
  617. package/dist/server/src/domain/permission/index.d.ts +71 -0
  618. package/dist/server/src/domain/permission/index.d.ts.map +1 -0
  619. package/dist/server/src/domain/user.d.ts +26 -0
  620. package/dist/server/src/domain/user.d.ts.map +1 -0
  621. package/dist/server/src/index.d.ts +11 -0
  622. package/dist/server/src/index.d.ts.map +1 -0
  623. package/dist/server/src/middlewares/data-transfer.d.ts +4 -0
  624. package/dist/server/src/middlewares/data-transfer.d.ts.map +1 -0
  625. package/dist/server/src/middlewares/index.d.ts +11 -0
  626. package/dist/server/src/middlewares/index.d.ts.map +1 -0
  627. package/dist/server/src/middlewares/rateLimit.d.ts +7 -0
  628. package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -0
  629. package/dist/server/src/policies/hasPermissions.d.ts +7 -0
  630. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -0
  631. package/dist/server/src/policies/index.d.ts +15 -0
  632. package/dist/server/src/policies/index.d.ts.map +1 -0
  633. package/dist/server/src/policies/isAuthenticatedAdmin.d.ts +3 -0
  634. package/dist/server/src/policies/isAuthenticatedAdmin.d.ts.map +1 -0
  635. package/dist/server/src/policies/isTelemetryEnabled.d.ts +11 -0
  636. package/dist/server/src/policies/isTelemetryEnabled.d.ts.map +1 -0
  637. package/dist/server/src/register.d.ts +6 -0
  638. package/dist/server/src/register.d.ts.map +1 -0
  639. package/dist/server/src/routes/admin.d.ts +24 -0
  640. package/dist/server/src/routes/admin.d.ts.map +1 -0
  641. package/dist/server/src/routes/api-tokens.d.ts +15 -0
  642. package/dist/server/src/routes/api-tokens.d.ts.map +1 -0
  643. package/dist/server/src/routes/authentication.d.ts +30 -0
  644. package/dist/server/src/routes/authentication.d.ts.map +1 -0
  645. package/dist/server/src/routes/content-api.d.ts +10 -0
  646. package/dist/server/src/routes/content-api.d.ts.map +1 -0
  647. package/dist/server/src/routes/index.d.ts +60 -0
  648. package/dist/server/src/routes/index.d.ts.map +1 -0
  649. package/dist/server/src/routes/permissions.d.ts +10 -0
  650. package/dist/server/src/routes/permissions.d.ts.map +1 -0
  651. package/dist/server/src/routes/roles.d.ts +15 -0
  652. package/dist/server/src/routes/roles.d.ts.map +1 -0
  653. package/dist/server/src/routes/serve-admin-panel.d.ts +6 -0
  654. package/dist/server/src/routes/serve-admin-panel.d.ts.map +1 -0
  655. package/dist/server/src/routes/transfer.d.ts +49 -0
  656. package/dist/server/src/routes/transfer.d.ts.map +1 -0
  657. package/dist/server/src/routes/users.d.ts +15 -0
  658. package/dist/server/src/routes/users.d.ts.map +1 -0
  659. package/dist/server/src/routes/webhooks.d.ts +15 -0
  660. package/dist/server/src/routes/webhooks.d.ts.map +1 -0
  661. package/dist/server/src/services/action.d.ts +10 -0
  662. package/dist/server/src/services/action.d.ts.map +1 -0
  663. package/dist/server/src/services/api-token.d.ts +48 -0
  664. package/dist/server/src/services/api-token.d.ts.map +1 -0
  665. package/dist/server/src/services/auth.d.ts +21 -0
  666. package/dist/server/src/services/auth.d.ts.map +1 -0
  667. package/dist/server/src/services/condition.d.ts +3 -0
  668. package/dist/server/src/services/condition.d.ts.map +1 -0
  669. package/dist/server/src/services/constants.d.ts +34 -0
  670. package/dist/server/src/services/constants.d.ts.map +1 -0
  671. package/dist/server/src/services/content-type.d.ts +29 -0
  672. package/dist/server/src/services/content-type.d.ts.map +1 -0
  673. package/dist/server/src/services/index.d.ts +111 -0
  674. package/dist/server/src/services/index.d.ts.map +1 -0
  675. package/dist/server/src/services/metrics.d.ts +8 -0
  676. package/dist/server/src/services/metrics.d.ts.map +1 -0
  677. package/dist/server/src/services/passport/local-strategy.d.ts +5 -0
  678. package/dist/server/src/services/passport/local-strategy.d.ts.map +1 -0
  679. package/dist/server/src/services/passport.d.ts +12 -0
  680. package/dist/server/src/services/passport.d.ts.map +1 -0
  681. package/dist/server/src/services/permission/engine.d.ts +20 -0
  682. package/dist/server/src/services/permission/engine.d.ts.map +1 -0
  683. package/dist/server/src/services/permission/permissions-manager/index.d.ts +17 -0
  684. package/dist/server/src/services/permission/permissions-manager/index.d.ts.map +1 -0
  685. package/dist/server/src/services/permission/permissions-manager/query-builders.d.ts +4 -0
  686. package/dist/server/src/services/permission/permissions-manager/query-builders.d.ts.map +1 -0
  687. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts +7 -0
  688. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -0
  689. package/dist/server/src/services/permission/permissions-manager/validate.d.ts +6 -0
  690. package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -0
  691. package/dist/server/src/services/permission/queries.d.ts +43 -0
  692. package/dist/server/src/services/permission/queries.d.ts.map +1 -0
  693. package/dist/server/src/services/permission/sections-builder/builder.d.ts +38 -0
  694. package/dist/server/src/services/permission/sections-builder/builder.d.ts.map +1 -0
  695. package/dist/server/src/services/permission/sections-builder/handlers.d.ts +55 -0
  696. package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -0
  697. package/dist/server/src/services/permission/sections-builder/index.d.ts +9 -0
  698. package/dist/server/src/services/permission/sections-builder/index.d.ts.map +1 -0
  699. package/dist/server/src/services/permission/sections-builder/section.d.ts +38 -0
  700. package/dist/server/src/services/permission/sections-builder/section.d.ts.map +1 -0
  701. package/dist/server/src/services/permission/sections-builder/utils.d.ts +13 -0
  702. package/dist/server/src/services/permission/sections-builder/utils.d.ts.map +1 -0
  703. package/dist/server/src/services/permission.d.ts +68 -0
  704. package/dist/server/src/services/permission.d.ts.map +1 -0
  705. package/dist/server/src/services/project-settings.d.ts +27 -0
  706. package/dist/server/src/services/project-settings.d.ts.map +1 -0
  707. package/dist/server/src/services/role.d.ts +41 -0
  708. package/dist/server/src/services/role.d.ts.map +1 -0
  709. package/dist/server/src/services/token.d.ts +44 -0
  710. package/dist/server/src/services/token.d.ts.map +1 -0
  711. package/dist/server/src/services/transfer/index.d.ts +5 -0
  712. package/dist/server/src/services/transfer/index.d.ts.map +1 -0
  713. package/dist/server/src/services/transfer/permission.d.ts +8 -0
  714. package/dist/server/src/services/transfer/permission.d.ts.map +1 -0
  715. package/dist/server/src/services/transfer/token.d.ts +59 -0
  716. package/dist/server/src/services/transfer/token.d.ts.map +1 -0
  717. package/dist/server/src/services/transfer/utils.d.ts +14 -0
  718. package/dist/server/src/services/transfer/utils.d.ts.map +1 -0
  719. package/dist/server/src/services/user.d.ts +32 -0
  720. package/dist/server/src/services/user.d.ts.map +1 -0
  721. package/dist/server/src/strategies/admin.d.ts +27 -0
  722. package/dist/server/src/strategies/admin.d.ts.map +1 -0
  723. package/dist/server/src/strategies/api-token.d.ts +61 -0
  724. package/dist/server/src/strategies/api-token.d.ts.map +1 -0
  725. package/dist/server/src/strategies/data-transfer.d.ts +53 -0
  726. package/dist/server/src/strategies/data-transfer.d.ts.map +1 -0
  727. package/dist/server/src/strategies/index.d.ts +18 -0
  728. package/dist/server/src/strategies/index.d.ts.map +1 -0
  729. package/dist/server/src/validation/action-provider.d.ts +6 -0
  730. package/dist/server/src/validation/action-provider.d.ts.map +1 -0
  731. package/dist/server/src/validation/api-tokens.d.ts +8 -0
  732. package/dist/server/src/validation/api-tokens.d.ts.map +1 -0
  733. package/dist/server/src/validation/authentication/forgot-password.d.ts +3 -0
  734. package/dist/server/src/validation/authentication/forgot-password.d.ts.map +1 -0
  735. package/dist/server/src/validation/authentication/index.d.ts +6 -0
  736. package/dist/server/src/validation/authentication/index.d.ts.map +1 -0
  737. package/dist/server/src/validation/authentication/register.d.ts +10 -0
  738. package/dist/server/src/validation/authentication/register.d.ts.map +1 -0
  739. package/dist/server/src/validation/authentication/renew-token.d.ts +3 -0
  740. package/dist/server/src/validation/authentication/renew-token.d.ts.map +1 -0
  741. package/dist/server/src/validation/authentication/reset-password.d.ts +3 -0
  742. package/dist/server/src/validation/authentication/reset-password.d.ts.map +1 -0
  743. package/dist/server/src/validation/common-functions/check-fields-are-correctly-nested.d.ts +3 -0
  744. package/dist/server/src/validation/common-functions/check-fields-are-correctly-nested.d.ts.map +1 -0
  745. package/dist/server/src/validation/common-functions/check-fields-dont-have-duplicates.d.ts +3 -0
  746. package/dist/server/src/validation/common-functions/check-fields-dont-have-duplicates.d.ts.map +1 -0
  747. package/dist/server/src/validation/common-functions/index.d.ts +4 -0
  748. package/dist/server/src/validation/common-functions/index.d.ts.map +1 -0
  749. package/dist/server/src/validation/common-validators.d.ts +61 -0
  750. package/dist/server/src/validation/common-validators.d.ts.map +1 -0
  751. package/dist/server/src/validation/permission.d.ts +10 -0
  752. package/dist/server/src/validation/permission.d.ts.map +1 -0
  753. package/dist/server/src/validation/policies/hasPermissions.d.ts +6 -0
  754. package/dist/server/src/validation/policies/hasPermissions.d.ts.map +1 -0
  755. package/dist/server/src/validation/project-settings.d.ts +10 -0
  756. package/dist/server/src/validation/project-settings.d.ts.map +1 -0
  757. package/dist/server/src/validation/role.d.ts +12 -0
  758. package/dist/server/src/validation/role.d.ts.map +1 -0
  759. package/dist/server/src/validation/transfer/index.d.ts +2 -0
  760. package/dist/server/src/validation/transfer/index.d.ts.map +1 -0
  761. package/dist/server/src/validation/transfer/token.d.ts +8 -0
  762. package/dist/server/src/validation/transfer/token.d.ts.map +1 -0
  763. package/dist/server/src/validation/user.d.ts +119 -0
  764. package/dist/server/src/validation/user.d.ts.map +1 -0
  765. package/dist/shared/contracts/admin.d.ts +161 -0
  766. package/dist/shared/contracts/admin.d.ts.map +1 -0
  767. package/dist/shared/contracts/api-token.d.ts +95 -0
  768. package/dist/shared/contracts/api-token.d.ts.map +1 -0
  769. package/dist/shared/contracts/audit-logs.d.ts +42 -0
  770. package/dist/shared/contracts/audit-logs.d.ts.map +1 -0
  771. package/dist/shared/contracts/authentication.d.ts +6 -2
  772. package/dist/shared/contracts/authentication.d.ts.map +1 -0
  773. package/dist/shared/contracts/content-api/permissions.d.ts +24 -0
  774. package/dist/shared/contracts/content-api/permissions.d.ts.map +1 -0
  775. package/dist/shared/contracts/content-api/routes.d.ts +28 -0
  776. package/dist/shared/contracts/content-api/routes.d.ts.map +1 -0
  777. package/dist/shared/contracts/content-api.d.ts +31 -0
  778. package/dist/shared/contracts/content-api.d.ts.map +1 -0
  779. package/dist/shared/contracts/permissions.d.ts +79 -0
  780. package/dist/shared/contracts/permissions.d.ts.map +1 -0
  781. package/dist/shared/contracts/providers.d.ts +1 -0
  782. package/dist/shared/contracts/providers.d.ts.map +1 -0
  783. package/dist/shared/contracts/review-workflows.d.ts +80 -0
  784. package/dist/shared/contracts/review-workflows.d.ts.map +1 -0
  785. package/dist/shared/contracts/roles.d.ts +91 -5
  786. package/dist/shared/contracts/roles.d.ts.map +1 -0
  787. package/dist/shared/contracts/shared.d.ts +24 -9
  788. package/dist/shared/contracts/shared.d.ts.map +1 -0
  789. package/dist/shared/contracts/transfer.d.ts +142 -0
  790. package/dist/shared/contracts/transfer.d.ts.map +1 -0
  791. package/dist/shared/contracts/user.d.ts +77 -8
  792. package/dist/shared/contracts/user.d.ts.map +1 -0
  793. package/dist/shared/contracts/users.d.ts +7 -2
  794. package/dist/shared/contracts/users.d.ts.map +1 -0
  795. package/dist/shared/contracts/webhooks.d.ts +111 -0
  796. package/dist/shared/contracts/webhooks.d.ts.map +1 -0
  797. package/dist/shared/schema.d.ts +1 -0
  798. package/dist/shared/schema.d.ts.map +1 -0
  799. package/index.d.ts +1 -1
  800. package/package.json +33 -21
  801. package/strapi-server.js +3 -3
  802. package/dist/_chunks/AuthenticatedApp-722b2e84.mjs +0 -1450
  803. package/dist/_chunks/AuthenticatedApp-722b2e84.mjs.map +0 -1
  804. package/dist/_chunks/AuthenticatedApp-7e646400.js +0 -1476
  805. package/dist/_chunks/AuthenticatedApp-7e646400.js.map +0 -1
  806. package/dist/_chunks/DragLayer-bff96835.mjs +0 -44
  807. package/dist/_chunks/DragLayer-bff96835.mjs.map +0 -1
  808. package/dist/_chunks/DragLayer-f07eee6c.js +0 -43
  809. package/dist/_chunks/DragLayer-f07eee6c.js.map +0 -1
  810. package/dist/_chunks/HomePage-0e0dc215.js +0 -49
  811. package/dist/_chunks/HomePage-0e0dc215.js.map +0 -1
  812. package/dist/_chunks/HomePage-76bcd0cd.mjs +0 -542
  813. package/dist/_chunks/HomePage-76bcd0cd.mjs.map +0 -1
  814. package/dist/_chunks/HomePage-8c98b31f.mjs +0 -49
  815. package/dist/_chunks/HomePage-8c98b31f.mjs.map +0 -1
  816. package/dist/_chunks/HomePage-ef787733.js +0 -563
  817. package/dist/_chunks/HomePage-ef787733.js.map +0 -1
  818. package/dist/_chunks/InstalledPluginsPage-67b5f9c2.mjs +0 -134
  819. package/dist/_chunks/InstalledPluginsPage-67b5f9c2.mjs.map +0 -1
  820. package/dist/_chunks/InstalledPluginsPage-6f0897e8.js +0 -153
  821. package/dist/_chunks/InstalledPluginsPage-6f0897e8.js.map +0 -1
  822. package/dist/_chunks/Layout-4b3e434a.js +0 -92
  823. package/dist/_chunks/Layout-4b3e434a.js.map +0 -1
  824. package/dist/_chunks/Layout-72fa2ace.mjs +0 -90
  825. package/dist/_chunks/Layout-72fa2ace.mjs.map +0 -1
  826. package/dist/_chunks/LimitsModal-203482b8.js +0 -84
  827. package/dist/_chunks/LimitsModal-203482b8.js.map +0 -1
  828. package/dist/_chunks/LimitsModal-da04700e.mjs +0 -82
  829. package/dist/_chunks/LimitsModal-da04700e.mjs.map +0 -1
  830. package/dist/_chunks/Login-5b447dd2.js +0 -64
  831. package/dist/_chunks/Login-5b447dd2.js.map +0 -1
  832. package/dist/_chunks/Login-8ade15b8.mjs +0 -62
  833. package/dist/_chunks/Login-8ade15b8.mjs.map +0 -1
  834. package/dist/_chunks/MarketplacePage-1c954f9d.js +0 -1035
  835. package/dist/_chunks/MarketplacePage-1c954f9d.js.map +0 -1
  836. package/dist/_chunks/MarketplacePage-58fc8a9a.mjs +0 -1011
  837. package/dist/_chunks/MarketplacePage-58fc8a9a.mjs.map +0 -1
  838. package/dist/_chunks/ProfilePage-a2f0366d.mjs +0 -642
  839. package/dist/_chunks/ProfilePage-a2f0366d.mjs.map +0 -1
  840. package/dist/_chunks/ProfilePage-a68483d3.js +0 -665
  841. package/dist/_chunks/ProfilePage-a68483d3.js.map +0 -1
  842. package/dist/_chunks/SalesPage-4a0a68fb.js +0 -51
  843. package/dist/_chunks/SalesPage-4a0a68fb.js.map +0 -1
  844. package/dist/_chunks/SalesPage-56bf9463.mjs +0 -48
  845. package/dist/_chunks/SalesPage-56bf9463.mjs.map +0 -1
  846. package/dist/_chunks/SalesPage-66f9ea32.js +0 -51
  847. package/dist/_chunks/SalesPage-66f9ea32.js.map +0 -1
  848. package/dist/_chunks/SalesPage-d0cdc1a7.js +0 -48
  849. package/dist/_chunks/SalesPage-d0cdc1a7.js.map +0 -1
  850. package/dist/_chunks/SalesPage-f9597ae7.mjs +0 -51
  851. package/dist/_chunks/SalesPage-f9597ae7.mjs.map +0 -1
  852. package/dist/_chunks/SalesPage-fceedf48.mjs +0 -51
  853. package/dist/_chunks/SalesPage-fceedf48.mjs.map +0 -1
  854. package/dist/_chunks/build-1026ce7c.mjs +0 -68
  855. package/dist/_chunks/build-1026ce7c.mjs.map +0 -1
  856. package/dist/_chunks/build-d99bcc06.js +0 -68
  857. package/dist/_chunks/build-d99bcc06.js.map +0 -1
  858. package/dist/_chunks/colors-c24a54f0.js +0 -33
  859. package/dist/_chunks/colors-c24a54f0.js.map +0 -1
  860. package/dist/_chunks/colors-e7489dd4.mjs +0 -34
  861. package/dist/_chunks/colors-e7489dd4.mjs.map +0 -1
  862. package/dist/_chunks/constants-155022af.js +0 -85
  863. package/dist/_chunks/constants-155022af.js.map +0 -1
  864. package/dist/_chunks/constants-32d352b6.mjs +0 -85
  865. package/dist/_chunks/constants-32d352b6.mjs.map +0 -1
  866. package/dist/_chunks/constants-3967338c.js +0 -229
  867. package/dist/_chunks/constants-3967338c.js.map +0 -1
  868. package/dist/_chunks/constants-64899732.js +0 -30
  869. package/dist/_chunks/constants-64899732.js.map +0 -1
  870. package/dist/_chunks/constants-6bf1c3c2.mjs +0 -227
  871. package/dist/_chunks/constants-6bf1c3c2.mjs.map +0 -1
  872. package/dist/_chunks/constants-6ecddc43.mjs +0 -111
  873. package/dist/_chunks/constants-6ecddc43.mjs.map +0 -1
  874. package/dist/_chunks/constants-7596f6f3.js +0 -132
  875. package/dist/_chunks/constants-7596f6f3.js.map +0 -1
  876. package/dist/_chunks/constants-d097f266.js +0 -52
  877. package/dist/_chunks/constants-d097f266.js.map +0 -1
  878. package/dist/_chunks/constants-da1ff847.mjs +0 -52
  879. package/dist/_chunks/constants-da1ff847.mjs.map +0 -1
  880. package/dist/_chunks/constants-def33545.mjs +0 -30
  881. package/dist/_chunks/constants-def33545.mjs.map +0 -1
  882. package/dist/_chunks/constants-eb77e47a.js +0 -82
  883. package/dist/_chunks/constants-eb77e47a.js.map +0 -1
  884. package/dist/_chunks/constants-ecad1e20.mjs +0 -80
  885. package/dist/_chunks/constants-ecad1e20.mjs.map +0 -1
  886. package/dist/_chunks/develop-72394876.mjs +0 -61
  887. package/dist/_chunks/develop-72394876.mjs.map +0 -1
  888. package/dist/_chunks/develop-da585b1e.js +0 -61
  889. package/dist/_chunks/develop-da585b1e.js.map +0 -1
  890. package/dist/_chunks/edit-29bdf5d6.js +0 -50
  891. package/dist/_chunks/edit-29bdf5d6.js.map +0 -1
  892. package/dist/_chunks/edit-923cefa0.mjs +0 -32
  893. package/dist/_chunks/edit-923cefa0.mjs.map +0 -1
  894. package/dist/_chunks/en-0e9e9327.js +0 -1022
  895. package/dist/_chunks/en-0e9e9327.js.map +0 -1
  896. package/dist/_chunks/en-e728accb.mjs +0 -1022
  897. package/dist/_chunks/en-e728accb.mjs.map +0 -1
  898. package/dist/_chunks/index-061947f1.mjs +0 -1432
  899. package/dist/_chunks/index-061947f1.mjs.map +0 -1
  900. package/dist/_chunks/index-06e97c47.mjs +0 -359
  901. package/dist/_chunks/index-06e97c47.mjs.map +0 -1
  902. package/dist/_chunks/index-1482f542.js +0 -403
  903. package/dist/_chunks/index-1482f542.js.map +0 -1
  904. package/dist/_chunks/index-14887b9d.mjs +0 -338
  905. package/dist/_chunks/index-14887b9d.mjs.map +0 -1
  906. package/dist/_chunks/index-1502dedd.js +0 -51
  907. package/dist/_chunks/index-1502dedd.js.map +0 -1
  908. package/dist/_chunks/index-176cc121.mjs +0 -469
  909. package/dist/_chunks/index-176cc121.mjs.map +0 -1
  910. package/dist/_chunks/index-19bd1210.js +0 -697
  911. package/dist/_chunks/index-19bd1210.js.map +0 -1
  912. package/dist/_chunks/index-2064cfaf.js +0 -51
  913. package/dist/_chunks/index-2064cfaf.js.map +0 -1
  914. package/dist/_chunks/index-209cca35.mjs +0 -308
  915. package/dist/_chunks/index-209cca35.mjs.map +0 -1
  916. package/dist/_chunks/index-24c2627d.mjs +0 -826
  917. package/dist/_chunks/index-24c2627d.mjs.map +0 -1
  918. package/dist/_chunks/index-24d1e175.js +0 -129
  919. package/dist/_chunks/index-24d1e175.js.map +0 -1
  920. package/dist/_chunks/index-272d8fb9.js +0 -365
  921. package/dist/_chunks/index-272d8fb9.js.map +0 -1
  922. package/dist/_chunks/index-2cf8d1f6.mjs +0 -270
  923. package/dist/_chunks/index-2cf8d1f6.mjs.map +0 -1
  924. package/dist/_chunks/index-35c3f9f1.mjs +0 -51
  925. package/dist/_chunks/index-35c3f9f1.mjs.map +0 -1
  926. package/dist/_chunks/index-38115cde.js +0 -66
  927. package/dist/_chunks/index-38115cde.js.map +0 -1
  928. package/dist/_chunks/index-391891ba.mjs +0 -51
  929. package/dist/_chunks/index-391891ba.mjs.map +0 -1
  930. package/dist/_chunks/index-3939f07e.mjs +0 -55
  931. package/dist/_chunks/index-3939f07e.mjs.map +0 -1
  932. package/dist/_chunks/index-3aab6b0f.mjs +0 -676
  933. package/dist/_chunks/index-3aab6b0f.mjs.map +0 -1
  934. package/dist/_chunks/index-3c67c00b.mjs +0 -3374
  935. package/dist/_chunks/index-3c67c00b.mjs.map +0 -1
  936. package/dist/_chunks/index-48c35356.mjs +0 -314
  937. package/dist/_chunks/index-48c35356.mjs.map +0 -1
  938. package/dist/_chunks/index-49b7e6ff.mjs +0 -1266
  939. package/dist/_chunks/index-49b7e6ff.mjs.map +0 -1
  940. package/dist/_chunks/index-4a019067.js +0 -272
  941. package/dist/_chunks/index-4a019067.js.map +0 -1
  942. package/dist/_chunks/index-55155d83.mjs +0 -866
  943. package/dist/_chunks/index-55155d83.mjs.map +0 -1
  944. package/dist/_chunks/index-57f9a06f.js +0 -15401
  945. package/dist/_chunks/index-57f9a06f.js.map +0 -1
  946. package/dist/_chunks/index-61852c7a.mjs +0 -582
  947. package/dist/_chunks/index-61852c7a.mjs.map +0 -1
  948. package/dist/_chunks/index-6685e5a8.js +0 -266
  949. package/dist/_chunks/index-6685e5a8.js.map +0 -1
  950. package/dist/_chunks/index-6731bae9.js +0 -51
  951. package/dist/_chunks/index-6731bae9.js.map +0 -1
  952. package/dist/_chunks/index-674778e2.mjs +0 -383
  953. package/dist/_chunks/index-674778e2.mjs.map +0 -1
  954. package/dist/_chunks/index-6a8a1f1d.js +0 -311
  955. package/dist/_chunks/index-6a8a1f1d.js.map +0 -1
  956. package/dist/_chunks/index-707e89df.mjs +0 -60
  957. package/dist/_chunks/index-707e89df.mjs.map +0 -1
  958. package/dist/_chunks/index-724169b2.js +0 -125
  959. package/dist/_chunks/index-724169b2.js.map +0 -1
  960. package/dist/_chunks/index-73971882.js +0 -847
  961. package/dist/_chunks/index-73971882.js.map +0 -1
  962. package/dist/_chunks/index-74812118.mjs +0 -53
  963. package/dist/_chunks/index-74812118.mjs.map +0 -1
  964. package/dist/_chunks/index-78f4851e.js +0 -418
  965. package/dist/_chunks/index-78f4851e.js.map +0 -1
  966. package/dist/_chunks/index-7a797b0f.mjs +0 -47
  967. package/dist/_chunks/index-7a797b0f.mjs.map +0 -1
  968. package/dist/_chunks/index-7b174d49.js +0 -1456
  969. package/dist/_chunks/index-7b174d49.js.map +0 -1
  970. package/dist/_chunks/index-819443df.js +0 -51
  971. package/dist/_chunks/index-819443df.js.map +0 -1
  972. package/dist/_chunks/index-82fca9fd.mjs +0 -393
  973. package/dist/_chunks/index-82fca9fd.mjs.map +0 -1
  974. package/dist/_chunks/index-8609fab4.mjs +0 -15320
  975. package/dist/_chunks/index-8609fab4.mjs.map +0 -1
  976. package/dist/_chunks/index-86a4fbbf.mjs +0 -273
  977. package/dist/_chunks/index-86a4fbbf.mjs.map +0 -1
  978. package/dist/_chunks/index-88298941.js +0 -54
  979. package/dist/_chunks/index-88298941.js.map +0 -1
  980. package/dist/_chunks/index-8f8eaed6.js +0 -3404
  981. package/dist/_chunks/index-8f8eaed6.js.map +0 -1
  982. package/dist/_chunks/index-91726188.js +0 -62
  983. package/dist/_chunks/index-91726188.js.map +0 -1
  984. package/dist/_chunks/index-973c363e.mjs +0 -63
  985. package/dist/_chunks/index-973c363e.mjs.map +0 -1
  986. package/dist/_chunks/index-97c03ee2.mjs +0 -55
  987. package/dist/_chunks/index-97c03ee2.mjs.map +0 -1
  988. package/dist/_chunks/index-9b2501ca.mjs +0 -132
  989. package/dist/_chunks/index-9b2501ca.mjs.map +0 -1
  990. package/dist/_chunks/index-aad003e4.mjs +0 -399
  991. package/dist/_chunks/index-aad003e4.mjs.map +0 -1
  992. package/dist/_chunks/index-ad0512f0.js +0 -47
  993. package/dist/_chunks/index-ad0512f0.js.map +0 -1
  994. package/dist/_chunks/index-b247e702.js +0 -294
  995. package/dist/_chunks/index-b247e702.js.map +0 -1
  996. package/dist/_chunks/index-b3ad6e5f.js +0 -338
  997. package/dist/_chunks/index-b3ad6e5f.js.map +0 -1
  998. package/dist/_chunks/index-b5eec5e2.js +0 -418
  999. package/dist/_chunks/index-b5eec5e2.js.map +0 -1
  1000. package/dist/_chunks/index-b6b2a306.js +0 -585
  1001. package/dist/_chunks/index-b6b2a306.js.map +0 -1
  1002. package/dist/_chunks/index-be9a9d91.mjs +0 -244
  1003. package/dist/_chunks/index-be9a9d91.mjs.map +0 -1
  1004. package/dist/_chunks/index-c5fa9006.mjs +0 -127
  1005. package/dist/_chunks/index-c5fa9006.mjs.map +0 -1
  1006. package/dist/_chunks/index-c6c83bb3.js +0 -134
  1007. package/dist/_chunks/index-c6c83bb3.js.map +0 -1
  1008. package/dist/_chunks/index-c8b6afca.js +0 -47
  1009. package/dist/_chunks/index-c8b6afca.js.map +0 -1
  1010. package/dist/_chunks/index-caab4b20.js +0 -873
  1011. package/dist/_chunks/index-caab4b20.js.map +0 -1
  1012. package/dist/_chunks/index-cc38421b.mjs +0 -51
  1013. package/dist/_chunks/index-cc38421b.mjs.map +0 -1
  1014. package/dist/_chunks/index-cdcf1a78.js +0 -380
  1015. package/dist/_chunks/index-cdcf1a78.js.map +0 -1
  1016. package/dist/_chunks/index-cea88049.mjs +0 -47
  1017. package/dist/_chunks/index-cea88049.mjs.map +0 -1
  1018. package/dist/_chunks/index-ceacb143.js +0 -335
  1019. package/dist/_chunks/index-ceacb143.js.map +0 -1
  1020. package/dist/_chunks/index-d1219a93.mjs +0 -232
  1021. package/dist/_chunks/index-d1219a93.mjs.map +0 -1
  1022. package/dist/_chunks/index-d3e1fd86.js +0 -490
  1023. package/dist/_chunks/index-d3e1fd86.js.map +0 -1
  1024. package/dist/_chunks/index-d47fc57d.mjs +0 -51
  1025. package/dist/_chunks/index-d47fc57d.mjs.map +0 -1
  1026. package/dist/_chunks/index-d844fbda.mjs +0 -362
  1027. package/dist/_chunks/index-d844fbda.mjs.map +0 -1
  1028. package/dist/_chunks/index-d9aae905.js +0 -418
  1029. package/dist/_chunks/index-d9aae905.js.map +0 -1
  1030. package/dist/_chunks/index-dab453d2.js +0 -55
  1031. package/dist/_chunks/index-dab453d2.js.map +0 -1
  1032. package/dist/_chunks/index-dd897afb.mjs +0 -125
  1033. package/dist/_chunks/index-dd897afb.mjs.map +0 -1
  1034. package/dist/_chunks/index-eb67694f.mjs +0 -261
  1035. package/dist/_chunks/index-eb67694f.mjs.map +0 -1
  1036. package/dist/_chunks/index-ec2d87cb.js +0 -55
  1037. package/dist/_chunks/index-ec2d87cb.js.map +0 -1
  1038. package/dist/_chunks/index-ecfaf6c1.js +0 -253
  1039. package/dist/_chunks/index-ecfaf6c1.js.map +0 -1
  1040. package/dist/_chunks/index-fc700e52.js +0 -263
  1041. package/dist/_chunks/index-fc700e52.js.map +0 -1
  1042. package/dist/_chunks/index-ff4fb44c.mjs +0 -412
  1043. package/dist/_chunks/index-ff4fb44c.mjs.map +0 -1
  1044. package/dist/_chunks/index-ffd2f664.js +0 -1337
  1045. package/dist/_chunks/index-ffd2f664.js.map +0 -1
  1046. package/dist/_chunks/schema-336f4dd6.js +0 -514
  1047. package/dist/_chunks/schema-336f4dd6.js.map +0 -1
  1048. package/dist/_chunks/schema-60d9880c.mjs +0 -490
  1049. package/dist/_chunks/schema-60d9880c.mjs.map +0 -1
  1050. package/dist/_chunks/useAdminRolePermissions-603a2709.mjs +0 -2322
  1051. package/dist/_chunks/useAdminRolePermissions-603a2709.mjs.map +0 -1
  1052. package/dist/_chunks/useAdminRolePermissions-cb1a3ee2.js +0 -2337
  1053. package/dist/_chunks/useAdminRolePermissions-cb1a3ee2.js.map +0 -1
  1054. package/dist/_chunks/useAdminRoles-68d5d608.js +0 -62
  1055. package/dist/_chunks/useAdminRoles-68d5d608.js.map +0 -1
  1056. package/dist/_chunks/useAdminRoles-7ab5d521.mjs +0 -44
  1057. package/dist/_chunks/useAdminRoles-7ab5d521.mjs.map +0 -1
  1058. package/dist/_chunks/useAdminUsers-05d6b26a.js +0 -61
  1059. package/dist/_chunks/useAdminUsers-05d6b26a.js.map +0 -1
  1060. package/dist/_chunks/useAdminUsers-09f86a58.mjs +0 -43
  1061. package/dist/_chunks/useAdminUsers-09f86a58.mjs.map +0 -1
  1062. package/dist/_chunks/useDebounce-4712871e.js +0 -35
  1063. package/dist/_chunks/useDebounce-4712871e.js.map +0 -1
  1064. package/dist/_chunks/useDebounce-9364f340.mjs +0 -17
  1065. package/dist/_chunks/useDebounce-9364f340.mjs.map +0 -1
  1066. package/dist/_chunks/useLicenseLimitNotification-1fd756fa.mjs +0 -80
  1067. package/dist/_chunks/useLicenseLimitNotification-1fd756fa.mjs.map +0 -1
  1068. package/dist/_chunks/useLicenseLimitNotification-8a4d7fc1.js +0 -100
  1069. package/dist/_chunks/useLicenseLimitNotification-8a4d7fc1.js.map +0 -1
  1070. package/dist/_chunks/useLicenseLimits-13a102d3.mjs +0 -31
  1071. package/dist/_chunks/useLicenseLimits-13a102d3.mjs.map +0 -1
  1072. package/dist/_chunks/useLicenseLimits-81ef3cce.js +0 -49
  1073. package/dist/_chunks/useLicenseLimits-81ef3cce.js.map +0 -1
  1074. package/dist/_chunks/useReviewWorkflows-799e0305.js +0 -59
  1075. package/dist/_chunks/useReviewWorkflows-799e0305.js.map +0 -1
  1076. package/dist/_chunks/useReviewWorkflows-9e6b8986.mjs +0 -41
  1077. package/dist/_chunks/useReviewWorkflows-9e6b8986.mjs.map +0 -1
  1078. package/dist/_chunks/validateWorkflow-022b5005.mjs +0 -1101
  1079. package/dist/_chunks/validateWorkflow-022b5005.mjs.map +0 -1
  1080. package/dist/_chunks/validateWorkflow-7f76e43f.js +0 -1124
  1081. package/dist/_chunks/validateWorkflow-7f76e43f.js.map +0 -1
  1082. package/dist/admin/src/components/ConfigurationProvider.d.ts +0 -11
  1083. package/dist/admin/src/components/ThemeToggleProvider.d.ts +0 -12
  1084. package/dist/admin/src/content-manager/components/BlocksInput/hooks/useBlocksStore.d.ts +0 -32
  1085. package/dist/admin/src/content-manager/components/BlocksInput/hooks/useModifiersStore.d.ts +0 -20
  1086. package/dist/admin/src/content-manager/components/BlocksInput/tests/mock-schema.d.ts +0 -2
  1087. package/dist/admin/src/contexts/admin.d.ts +0 -14
  1088. package/dist/admin/src/contexts/apiTokenPermissions.d.ts +0 -36
  1089. package/dist/admin/src/contexts/configuration.d.ts +0 -27
  1090. package/dist/admin/src/contexts/themeToggle.d.ts +0 -22
  1091. package/dist/admin/src/hooks/__mocks__/useAdminUsers.d.ts +0 -2
  1092. package/dist/admin/src/hooks/__mocks__/useContentTypes.d.ts +0 -2
  1093. package/dist/admin/src/hooks/__mocks__/useSettingsMenu.d.ts +0 -2
  1094. package/dist/admin/src/pages/Marketplace/hooks/__mocks__/useNavigatorOnline.d.ts +0 -1
  1095. package/dist/admin/src/pages/SettingsPage/pages/Roles/EditPage/hooks/usePermissionsDataManager.d.ts +0 -24
  1096. package/dist/admin/src/pages/SettingsPage/pages/Roles/hooks/__mocks__/useAdminRolePermissions.d.ts +0 -2
  1097. package/dist/admin/src/pages/SettingsPage/pages/Roles/hooks/useAdminRolePermissions.d.ts +0 -11
  1098. package/dist/admin/src/pages/SettingsPage/utils/makeUniqueRoutes.d.ts +0 -6
  1099. package/dist/admin/src/shared/components/InjectionZone.d.ts +0 -53
  1100. package/dist/admin/src/shared/hooks/__mocks__/useInjectionZone.d.ts +0 -1
  1101. package/dist/admin/src/shared/hooks/useInjectionZone.d.ts +0 -2
  1102. package/ee/server/bootstrap.js +0 -41
  1103. package/ee/server/config/admin-actions.js +0 -72
  1104. package/ee/server/constants/default-stages.json +0 -18
  1105. package/ee/server/constants/default-workflow.json +0 -3
  1106. package/ee/server/constants/webhookEvents.js +0 -5
  1107. package/ee/server/constants/workflows.js +0 -33
  1108. package/ee/server/content-types/index.js +0 -9
  1109. package/ee/server/content-types/workflow/index.js +0 -41
  1110. package/ee/server/content-types/workflow-stage/index.js +0 -51
  1111. package/ee/server/controllers/__tests__/stages.test.js +0 -174
  1112. package/ee/server/controllers/admin.js +0 -50
  1113. package/ee/server/controllers/audit-logs.js +0 -24
  1114. package/ee/server/controllers/authentication/constants.js +0 -11
  1115. package/ee/server/controllers/authentication/index.js +0 -11
  1116. package/ee/server/controllers/authentication/middlewares.js +0 -117
  1117. package/ee/server/controllers/authentication/utils.js +0 -23
  1118. package/ee/server/controllers/authentication.js +0 -64
  1119. package/ee/server/controllers/index.js +0 -12
  1120. package/ee/server/controllers/role.js +0 -64
  1121. package/ee/server/controllers/user.js +0 -110
  1122. package/ee/server/controllers/workflows/assignees/index.js +0 -44
  1123. package/ee/server/controllers/workflows/index.js +0 -188
  1124. package/ee/server/controllers/workflows/stages/index.js +0 -189
  1125. package/ee/server/destroy.js +0 -12
  1126. package/ee/server/index.js +0 -11
  1127. package/ee/server/middlewares/__tests__/review-workflows.test.js +0 -40
  1128. package/ee/server/middlewares/review-workflows.js +0 -40
  1129. package/ee/server/migrations/audit-logs-table.js +0 -45
  1130. package/ee/server/migrations/review-workflows-content-types.js +0 -29
  1131. package/ee/server/migrations/review-workflows-deleted-ct-in-workflows.js +0 -39
  1132. package/ee/server/migrations/review-workflows-stage-attribute.js +0 -49
  1133. package/ee/server/migrations/review-workflows-stages-color.js +0 -20
  1134. package/ee/server/migrations/review-workflows-stages-roles.js +0 -68
  1135. package/ee/server/migrations/review-workflows-workflow-name.js +0 -28
  1136. package/ee/server/register.js +0 -40
  1137. package/ee/server/routes/audit-logs.js +0 -43
  1138. package/ee/server/routes/index.js +0 -8
  1139. package/ee/server/routes/license-limit.js +0 -29
  1140. package/ee/server/routes/review-workflows.js +0 -164
  1141. package/ee/server/routes/sso.js +0 -69
  1142. package/ee/server/routes/utils.js +0 -15
  1143. package/ee/server/services/__tests__/assignees.test.js +0 -76
  1144. package/ee/server/services/__tests__/audit-logs.test.js +0 -300
  1145. package/ee/server/services/__tests__/passport.test.js +0 -95
  1146. package/ee/server/services/__tests__/review-workflows-validation.test.js +0 -100
  1147. package/ee/server/services/__tests__/review-workflows.test.js +0 -163
  1148. package/ee/server/services/__tests__/sso.test.js +0 -117
  1149. package/ee/server/services/__tests__/stages.test.js +0 -275
  1150. package/ee/server/services/__tests__/workflows.test.js +0 -203
  1151. package/ee/server/services/audit-logs.js +0 -236
  1152. package/ee/server/services/auth.js +0 -75
  1153. package/ee/server/services/index.js +0 -18
  1154. package/ee/server/services/passport/provider-registry.js +0 -27
  1155. package/ee/server/services/passport/sso.js +0 -37
  1156. package/ee/server/services/passport.js +0 -46
  1157. package/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js +0 -211
  1158. package/ee/server/services/review-workflows/assignees.js +0 -54
  1159. package/ee/server/services/review-workflows/entity-service-decorator.js +0 -101
  1160. package/ee/server/services/review-workflows/metrics/__tests__/weekly-metrics.test.js +0 -65
  1161. package/ee/server/services/review-workflows/metrics/index.js +0 -56
  1162. package/ee/server/services/review-workflows/metrics/weekly-metrics.js +0 -76
  1163. package/ee/server/services/review-workflows/review-workflows.js +0 -133
  1164. package/ee/server/services/review-workflows/stage-permissions.js +0 -60
  1165. package/ee/server/services/review-workflows/stages.js +0 -384
  1166. package/ee/server/services/review-workflows/validation.js +0 -68
  1167. package/ee/server/services/review-workflows/workflows/__tests__/content-types.test.js +0 -146
  1168. package/ee/server/services/review-workflows/workflows/content-types.js +0 -89
  1169. package/ee/server/services/review-workflows/workflows/index.js +0 -237
  1170. package/ee/server/services/role.js +0 -24
  1171. package/ee/server/services/seat-enforcement.js +0 -114
  1172. package/ee/server/services/user.js +0 -234
  1173. package/ee/server/utils/__tests__/persisted-tables.test.js +0 -38
  1174. package/ee/server/utils/__tests__/sso-lock.test.js +0 -84
  1175. package/ee/server/utils/index.js +0 -8
  1176. package/ee/server/utils/persisted-tables.js +0 -139
  1177. package/ee/server/utils/review-workflows.js +0 -39
  1178. package/ee/server/utils/sso-lock.js +0 -42
  1179. package/ee/server/validation/audit-logs.js +0 -18
  1180. package/ee/server/validation/authentication.js +0 -36
  1181. package/ee/server/validation/review-workflows.js +0 -92
  1182. package/ee/server/validation/role.js +0 -68
  1183. package/ee/server/validation/user.js +0 -27
  1184. package/ee/strapi-server.js +0 -3
  1185. package/server/bootstrap.js +0 -101
  1186. package/server/config/admin-actions.js +0 -216
  1187. package/server/config/admin-conditions.js +0 -26
  1188. package/server/config/email-templates/forgot-password.js +0 -25
  1189. package/server/config/index.js +0 -9
  1190. package/server/config/settings.js +0 -9
  1191. package/server/content-types/Permission.js +0 -64
  1192. package/server/content-types/Role.js +0 -59
  1193. package/server/content-types/User.js +0 -112
  1194. package/server/content-types/api-token-permission.js +0 -36
  1195. package/server/content-types/api-token.js +0 -76
  1196. package/server/content-types/index.js +0 -11
  1197. package/server/content-types/transfer-token-permission.js +0 -36
  1198. package/server/content-types/transfer-token.js +0 -66
  1199. package/server/controllers/__tests__/admin.test.js +0 -106
  1200. package/server/controllers/__tests__/api-token.test.js +0 -496
  1201. package/server/controllers/__tests__/content-api.test.js +0 -173
  1202. package/server/controllers/__tests__/permission.test.js +0 -200
  1203. package/server/controllers/__tests__/role.test.js +0 -201
  1204. package/server/controllers/__tests__/transfer/token.test.js +0 -520
  1205. package/server/controllers/__tests__/user.test.js +0 -326
  1206. package/server/controllers/admin.js +0 -151
  1207. package/server/controllers/api-token.js +0 -135
  1208. package/server/controllers/authenticated-user.js +0 -52
  1209. package/server/controllers/authentication.js +0 -172
  1210. package/server/controllers/content-api.js +0 -15
  1211. package/server/controllers/formatters/conditions.js +0 -12
  1212. package/server/controllers/formatters/format-actions-by-sections.js +0 -40
  1213. package/server/controllers/formatters/index.js +0 -9
  1214. package/server/controllers/index.js +0 -14
  1215. package/server/controllers/permission.js +0 -45
  1216. package/server/controllers/role.js +0 -198
  1217. package/server/controllers/transfer/index.js +0 -13
  1218. package/server/controllers/transfer/runner.js +0 -28
  1219. package/server/controllers/transfer/token.js +0 -131
  1220. package/server/controllers/user.js +0 -141
  1221. package/server/controllers/webhooks.js +0 -132
  1222. package/server/destroy.js +0 -10
  1223. package/server/domain/action/__tests__/action-domain.test.js +0 -230
  1224. package/server/domain/action/__tests__/action-provider.test.js +0 -376
  1225. package/server/domain/action/index.js +0 -142
  1226. package/server/domain/action/provider.js +0 -83
  1227. package/server/domain/condition/__tests__/condition-domain.test.js +0 -122
  1228. package/server/domain/condition/__tests__/condition-provider.test.js +0 -156
  1229. package/server/domain/condition/index.js +0 -92
  1230. package/server/domain/condition/provider.js +0 -42
  1231. package/server/domain/permission/__tests__/permission-domain.test.js +0 -285
  1232. package/server/domain/permission/index.js +0 -156
  1233. package/server/domain/user.js +0 -28
  1234. package/server/index.js +0 -26
  1235. package/server/middlewares/data-transfer.js +0 -29
  1236. package/server/middlewares/index.js +0 -8
  1237. package/server/middlewares/rateLimit.js +0 -47
  1238. package/server/policies/hasPermissions.js +0 -38
  1239. package/server/policies/index.js +0 -7
  1240. package/server/policies/isAuthenticatedAdmin.js +0 -5
  1241. package/server/policies/isTelemetryEnabled.js +0 -16
  1242. package/server/register.js +0 -19
  1243. package/server/routes/admin.js +0 -71
  1244. package/server/routes/api-tokens.js +0 -70
  1245. package/server/routes/authentication.js +0 -57
  1246. package/server/routes/content-api.js +0 -20
  1247. package/server/routes/index.js +0 -28
  1248. package/server/routes/permissions.js +0 -20
  1249. package/server/routes/roles.js +0 -107
  1250. package/server/routes/serve-admin-panel.js +0 -71
  1251. package/server/routes/transfer.js +0 -102
  1252. package/server/routes/users.js +0 -88
  1253. package/server/routes/webhooks.js +0 -81
  1254. package/server/services/__tests__/action.test.js +0 -98
  1255. package/server/services/__tests__/api-token.test.js +0 -980
  1256. package/server/services/__tests__/auth.test.js +0 -319
  1257. package/server/services/__tests__/content-type.test.js +0 -405
  1258. package/server/services/__tests__/metrics.test.js +0 -65
  1259. package/server/services/__tests__/passport.test.js +0 -90
  1260. package/server/services/__tests__/permission.test.js +0 -177
  1261. package/server/services/__tests__/permissions-manager-sanitize.test.js +0 -117
  1262. package/server/services/__tests__/permissions-manager-validate.test.js +0 -119
  1263. package/server/services/__tests__/permissions-manager.test.js +0 -318
  1264. package/server/services/__tests__/permissions.section-builder.section.test.js +0 -136
  1265. package/server/services/__tests__/project-settings.test.js +0 -397
  1266. package/server/services/__tests__/role.test.js +0 -970
  1267. package/server/services/__tests__/token.test.js +0 -217
  1268. package/server/services/__tests__/transfer/token.test.js +0 -878
  1269. package/server/services/__tests__/user.test.js +0 -786
  1270. package/server/services/action.js +0 -35
  1271. package/server/services/api-token.js +0 -453
  1272. package/server/services/auth.js +0 -117
  1273. package/server/services/condition.js +0 -14
  1274. package/server/services/constants.js +0 -37
  1275. package/server/services/content-type.js +0 -208
  1276. package/server/services/index.js +0 -18
  1277. package/server/services/metrics.js +0 -44
  1278. package/server/services/passport/local-strategy.js +0 -28
  1279. package/server/services/passport.js +0 -45
  1280. package/server/services/permission/engine.js +0 -85
  1281. package/server/services/permission/permissions-manager/index.js +0 -53
  1282. package/server/services/permission/permissions-manager/query-builders.js +0 -72
  1283. package/server/services/permission/permissions-manager/sanitize.js +0 -286
  1284. package/server/services/permission/permissions-manager/validate.js +0 -218
  1285. package/server/services/permission/queries.js +0 -190
  1286. package/server/services/permission/sections-builder/builder.js +0 -84
  1287. package/server/services/permission/sections-builder/handlers.js +0 -156
  1288. package/server/services/permission/sections-builder/index.js +0 -50
  1289. package/server/services/permission/sections-builder/section.js +0 -71
  1290. package/server/services/permission/sections-builder/utils.js +0 -26
  1291. package/server/services/permission.js +0 -33
  1292. package/server/services/project-settings.js +0 -174
  1293. package/server/services/role.js +0 -471
  1294. package/server/services/token.js +0 -70
  1295. package/server/services/transfer/index.js +0 -7
  1296. package/server/services/transfer/permission.js +0 -22
  1297. package/server/services/transfer/token.js +0 -449
  1298. package/server/services/transfer/utils.js +0 -38
  1299. package/server/services/user.js +0 -363
  1300. package/server/strategies/__tests__/admin.test.js +0 -118
  1301. package/server/strategies/__tests__/api-token.test.js +0 -364
  1302. package/server/strategies/admin.js +0 -52
  1303. package/server/strategies/api-token.js +0 -140
  1304. package/server/strategies/data-transfer.js +0 -113
  1305. package/server/strategies/index.js +0 -26
  1306. package/server/utils/index.d.ts +0 -25
  1307. package/server/utils/index.js +0 -9
  1308. package/server/validation/__tests__/common-functions.test.js +0 -54
  1309. package/server/validation/action-provider.js +0 -67
  1310. package/server/validation/api-tokens.js +0 -32
  1311. package/server/validation/authentication/forgot-password.js +0 -14
  1312. package/server/validation/authentication/index.js +0 -19
  1313. package/server/validation/authentication/register.js +0 -45
  1314. package/server/validation/authentication/renew-token.js +0 -7
  1315. package/server/validation/authentication/reset-password.js +0 -15
  1316. package/server/validation/common-functions/check-fields-are-correctly-nested.js +0 -28
  1317. package/server/validation/common-functions/check-fields-dont-have-duplicates.js +0 -17
  1318. package/server/validation/common-functions/index.js +0 -9
  1319. package/server/validation/common-validators.js +0 -209
  1320. package/server/validation/permission.js +0 -53
  1321. package/server/validation/policies/hasPermissions.js +0 -27
  1322. package/server/validation/project-settings.js +0 -48
  1323. package/server/validation/role.js +0 -59
  1324. package/server/validation/transfer/index.js +0 -5
  1325. package/server/validation/transfer/token.js +0 -42
  1326. package/server/validation/user.js +0 -65
  1327. /package/dist/admin/src/pages/{SettingsPage → Settings}/hooks/useRegenerate.d.ts +0 -0
@@ -0,0 +1,3866 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const EE = require("@strapi/strapi/dist/utils/ee");
4
+ const path = require("path");
5
+ const fse = require("fs-extra");
6
+ const koaStatic = require("koa-static");
7
+ require("@strapi/types");
8
+ const fp = require("lodash/fp");
9
+ const dateFns = require("date-fns");
10
+ const utils$1 = require("@strapi/utils");
11
+ const semver = require("semver");
12
+ const localProvider = require("@strapi/provider-audit-logs-local");
13
+ const nodeSchedule = require("node-schedule");
14
+ const _ = require("lodash");
15
+ const passportLocal = require("passport-local");
16
+ const passport$2 = require("koa-passport");
17
+ require("koa-bodyparser");
18
+ const compose = require("koa-compose");
19
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
20
+ const EE__default = /* @__PURE__ */ _interopDefault(EE);
21
+ const fse__default = /* @__PURE__ */ _interopDefault(fse);
22
+ const koaStatic__default = /* @__PURE__ */ _interopDefault(koaStatic);
23
+ const semver__default = /* @__PURE__ */ _interopDefault(semver);
24
+ const localProvider__default = /* @__PURE__ */ _interopDefault(localProvider);
25
+ const ___default = /* @__PURE__ */ _interopDefault(_);
26
+ const passport__default = /* @__PURE__ */ _interopDefault(passport$2);
27
+ const compose__default = /* @__PURE__ */ _interopDefault(compose);
28
+ const registerAdminPanelRoute = ({ strapi: strapi2 }) => {
29
+ let buildDir = path.resolve(strapi2.dirs.dist.root, "build");
30
+ if (!fse__default.default.pathExistsSync(buildDir)) {
31
+ buildDir = path.resolve(__dirname, "../../build");
32
+ }
33
+ const serveAdminMiddleware = async (ctx, next) => {
34
+ await next();
35
+ if (ctx.method !== "HEAD" && ctx.method !== "GET") {
36
+ return;
37
+ }
38
+ if (ctx.body != null || ctx.status !== 404) {
39
+ return;
40
+ }
41
+ ctx.type = "html";
42
+ ctx.body = fse__default.default.createReadStream(path.join(buildDir, "index.html"));
43
+ };
44
+ strapi2.server.routes([
45
+ {
46
+ method: "GET",
47
+ path: `${strapi2.config.admin.path}/:path*`,
48
+ handler: [
49
+ serveAdminMiddleware,
50
+ serveStatic(buildDir, {
51
+ maxage: 31536e3,
52
+ defer: false,
53
+ index: "index.html",
54
+ setHeaders(res, path$1) {
55
+ const ext = path.extname(path$1);
56
+ if (ext !== ".html") {
57
+ res.setHeader("cache-control", "public, max-age=31536000, immutable");
58
+ }
59
+ }
60
+ })
61
+ ],
62
+ config: { auth: false }
63
+ }
64
+ ]);
65
+ };
66
+ const serveStatic = (filesDir, koaStaticOptions = {}) => {
67
+ const serve = koaStatic__default.default(filesDir, koaStaticOptions);
68
+ return async (ctx, next) => {
69
+ const prev = ctx.path;
70
+ const newPath = path.basename(ctx.path);
71
+ ctx.path = newPath;
72
+ await serve(ctx, async () => {
73
+ ctx.path = prev;
74
+ await next();
75
+ ctx.path = newPath;
76
+ });
77
+ ctx.path = prev;
78
+ };
79
+ };
80
+ const getService$1 = (name2) => {
81
+ return strapi.service(`admin::${name2}`);
82
+ };
83
+ const authenticate$2 = async (ctx) => {
84
+ const { authorization } = ctx.request.header;
85
+ if (!authorization) {
86
+ return { authenticated: false };
87
+ }
88
+ const parts = authorization.split(/\s+/);
89
+ if (parts[0].toLowerCase() !== "bearer" || parts.length !== 2) {
90
+ return { authenticated: false };
91
+ }
92
+ const token = parts[1];
93
+ const { payload, isValid } = getService$1("token").decodeJwtToken(token);
94
+ if (!isValid) {
95
+ return { authenticated: false };
96
+ }
97
+ const user2 = await strapi.query("admin::user").findOne({ where: { id: payload.id }, populate: ["roles"] });
98
+ if (!user2 || !(user2.isActive === true)) {
99
+ return { authenticated: false };
100
+ }
101
+ const userAbility = await getService$1("permission").engine.generateUserAbility(user2);
102
+ ctx.state.userAbility = userAbility;
103
+ ctx.state.user = user2;
104
+ return {
105
+ authenticated: true,
106
+ credentials: user2,
107
+ ability: userAbility
108
+ };
109
+ };
110
+ const name$1 = "admin";
111
+ const adminAuthStrategy = {
112
+ name: name$1,
113
+ authenticate: authenticate$2
114
+ };
115
+ const DAY_IN_MS = 24 * 60 * 60 * 1e3;
116
+ const constants = {
117
+ CONTENT_TYPE_SECTION: "contentTypes",
118
+ SUPER_ADMIN_CODE: "strapi-super-admin",
119
+ EDITOR_CODE: "strapi-editor",
120
+ AUTHOR_CODE: "strapi-author",
121
+ READ_ACTION: "plugin::content-manager.explorer.read",
122
+ CREATE_ACTION: "plugin::content-manager.explorer.create",
123
+ UPDATE_ACTION: "plugin::content-manager.explorer.update",
124
+ DELETE_ACTION: "plugin::content-manager.explorer.delete",
125
+ PUBLISH_ACTION: "plugin::content-manager.explorer.publish",
126
+ API_TOKEN_TYPE: {
127
+ READ_ONLY: "read-only",
128
+ FULL_ACCESS: "full-access",
129
+ CUSTOM: "custom"
130
+ },
131
+ // The front-end only displays these values
132
+ API_TOKEN_LIFESPANS: {
133
+ UNLIMITED: null,
134
+ DAYS_7: 7 * DAY_IN_MS,
135
+ DAYS_30: 30 * DAY_IN_MS,
136
+ DAYS_90: 90 * DAY_IN_MS
137
+ },
138
+ TRANSFER_TOKEN_TYPE: {
139
+ PUSH: "push",
140
+ PULL: "pull"
141
+ },
142
+ TRANSFER_TOKEN_LIFESPANS: {
143
+ UNLIMITED: null,
144
+ DAYS_7: 7 * DAY_IN_MS,
145
+ DAYS_30: 30 * DAY_IN_MS,
146
+ DAYS_90: 90 * DAY_IN_MS
147
+ }
148
+ };
149
+ const { UnauthorizedError: UnauthorizedError$1, ForbiddenError: ForbiddenError$1 } = utils$1.errors;
150
+ const isReadScope = (scope) => scope.endsWith("find") || scope.endsWith("findOne");
151
+ const extractToken = (ctx) => {
152
+ if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
153
+ const parts = ctx.request.header.authorization.split(/\s+/);
154
+ if (parts[0].toLowerCase() !== "bearer" || parts.length !== 2) {
155
+ return null;
156
+ }
157
+ return parts[1];
158
+ }
159
+ return null;
160
+ };
161
+ const authenticate$1 = async (ctx) => {
162
+ const apiTokenService = getService$1("api-token");
163
+ const token = extractToken(ctx);
164
+ if (!token) {
165
+ return { authenticated: false };
166
+ }
167
+ const apiToken = await apiTokenService.getBy({
168
+ accessKey: apiTokenService.hash(token)
169
+ });
170
+ if (!apiToken) {
171
+ return { authenticated: false };
172
+ }
173
+ const currentDate = /* @__PURE__ */ new Date();
174
+ if (!fp.isNil(apiToken.expiresAt)) {
175
+ const expirationDate = new Date(apiToken.expiresAt);
176
+ if (expirationDate < currentDate) {
177
+ return { authenticated: false, error: new UnauthorizedError$1("Token expired") };
178
+ }
179
+ }
180
+ const hoursSinceLastUsed = dateFns.differenceInHours(currentDate, dateFns.parseISO(apiToken.lastUsedAt));
181
+ if (hoursSinceLastUsed >= 1) {
182
+ await strapi.query("admin::api-token").update({
183
+ where: { id: apiToken.id },
184
+ data: { lastUsedAt: currentDate }
185
+ });
186
+ }
187
+ if (apiToken.type === constants.API_TOKEN_TYPE.CUSTOM) {
188
+ const ability = await strapi.contentAPI.permissions.engine.generateAbility(
189
+ apiToken.permissions.map((action) => ({ action }))
190
+ );
191
+ return { authenticated: true, ability, credentials: apiToken };
192
+ }
193
+ return { authenticated: true, credentials: apiToken };
194
+ };
195
+ const verify = (auth2, config) => {
196
+ const { credentials: apiToken, ability } = auth2;
197
+ if (!apiToken) {
198
+ throw new UnauthorizedError$1("Token not found");
199
+ }
200
+ const currentDate = /* @__PURE__ */ new Date();
201
+ if (!fp.isNil(apiToken.expiresAt)) {
202
+ const expirationDate = new Date(apiToken.expiresAt);
203
+ if (expirationDate < currentDate) {
204
+ throw new UnauthorizedError$1("Token expired");
205
+ }
206
+ }
207
+ if (apiToken.type === constants.API_TOKEN_TYPE.FULL_ACCESS) {
208
+ return;
209
+ }
210
+ if (apiToken.type === constants.API_TOKEN_TYPE.READ_ONLY) {
211
+ const scopes = fp.castArray(config.scope);
212
+ if (config.scope && scopes.every(isReadScope)) {
213
+ return;
214
+ }
215
+ } else if (apiToken.type === constants.API_TOKEN_TYPE.CUSTOM) {
216
+ if (!ability) {
217
+ throw new ForbiddenError$1();
218
+ }
219
+ const scopes = fp.castArray(config.scope);
220
+ const isAllowed = scopes.every((scope) => ability.can(scope));
221
+ if (isAllowed) {
222
+ return;
223
+ }
224
+ }
225
+ throw new ForbiddenError$1();
226
+ };
227
+ const apiTokenAuthStrategy = {
228
+ name: "api-token",
229
+ authenticate: authenticate$1,
230
+ verify
231
+ };
232
+ const executeCERegister = ({ strapi: strapi2 }) => {
233
+ const passportMiddleware = strapi2.admin?.services.passport.init();
234
+ strapi2.server.api("admin").use(passportMiddleware);
235
+ strapi2.container.get("auth").register("admin", adminAuthStrategy);
236
+ strapi2.container.get("auth").register("content-api", apiTokenAuthStrategy);
237
+ if (strapi2.config.serveAdminPanel) {
238
+ registerAdminPanelRoute({ strapi: strapi2 });
239
+ }
240
+ };
241
+ async function migrateAuditLogsTable({ oldContentTypes, contentTypes }) {
242
+ const oldName = oldContentTypes?.["admin::audit-log"]?.collectionName;
243
+ const newName = contentTypes["admin::audit-log"]?.collectionName;
244
+ const hasRenamedAuditLogsTable = oldName === "audit_logs" && newName === "strapi_audit_logs";
245
+ if (!hasRenamedAuditLogsTable) {
246
+ return;
247
+ }
248
+ const hasAuditLogsTable = await strapi.db.getSchemaConnection().hasTable("audit_logs");
249
+ const hasLinkTable = await strapi.db.getSchemaConnection().hasTable("audit_logs_user_links");
250
+ if (!hasAuditLogsTable || !hasLinkTable) {
251
+ return;
252
+ }
253
+ const auditLogsColumnInfo = await strapi.db.connection("audit_logs").columnInfo();
254
+ const linkColumnInfo = await strapi.db.connection("audit_logs_user_links").columnInfo();
255
+ if (!auditLogsColumnInfo.action || !auditLogsColumnInfo.date || !auditLogsColumnInfo.payload || !linkColumnInfo.audit_log_id || !linkColumnInfo.user_id) {
256
+ return;
257
+ }
258
+ await strapi.db.getSchemaConnection().renameTable("audit_logs", "strapi_audit_logs");
259
+ await strapi.db.getSchemaConnection().renameTable("audit_logs_user_links", "strapi_audit_logs_user_links");
260
+ }
261
+ const WORKFLOW_MODEL_UID = "admin::workflow";
262
+ const STAGE_MODEL_UID = "admin::workflow-stage";
263
+ const STAGE_TRANSITION_UID = "admin::review-workflows.stage.transition";
264
+ const STAGE_DEFAULT_COLOR = "#4945FF";
265
+ const ENTITY_STAGE_ATTRIBUTE = "strapi_stage";
266
+ const ENTITY_ASSIGNEE_ATTRIBUTE = "strapi_assignee";
267
+ const MAX_WORKFLOWS = 200;
268
+ const MAX_STAGES_PER_WORKFLOW = 200;
269
+ const ERRORS = {
270
+ WORKFLOW_WITHOUT_STAGES: "A workflow must have at least one stage.",
271
+ WORKFLOWS_LIMIT: "You’ve reached the limit of workflows in your plan. Delete a workflow or contact Sales to enable more workflows.",
272
+ STAGES_LIMIT: "You’ve reached the limit of stages for this workflow in your plan. Try deleting some stages or contact Sales to enable more stages.",
273
+ DUPLICATED_STAGE_NAME: "Stage names must be unique."
274
+ };
275
+ const WORKFLOW_POPULATE = {
276
+ stages: {
277
+ populate: {
278
+ permissions: {
279
+ fields: ["action", "actionParameters"],
280
+ populate: {
281
+ role: { fields: ["id", "name"] }
282
+ }
283
+ }
284
+ }
285
+ }
286
+ };
287
+ async function migrateReviewWorkflowStagesColor({ oldContentTypes, contentTypes }) {
288
+ const hadColor = !!oldContentTypes?.["admin::workflow-stage"]?.attributes?.color;
289
+ const hasColor = !!contentTypes?.["admin::workflow-stage"]?.attributes?.color;
290
+ if (!hadColor && hasColor) {
291
+ await strapi.query("admin::workflow-stage").updateMany({
292
+ data: {
293
+ color: STAGE_DEFAULT_COLOR
294
+ }
295
+ });
296
+ }
297
+ }
298
+ const getService = (name2, { strapi: strapi2 } = { strapi: global.strapi }) => {
299
+ return strapi2.service(`admin::${name2}`);
300
+ };
301
+ async function migrateReviewWorkflowStagesRoles({ oldContentTypes, contentTypes }) {
302
+ const stageUID = "admin::workflow-stage";
303
+ const hadRolePermissions = !!oldContentTypes?.[stageUID]?.attributes?.permissions;
304
+ const hasRolePermissions = !!contentTypes?.[stageUID]?.attributes?.permissions;
305
+ if (!hadRolePermissions && hasRolePermissions) {
306
+ const roleUID = "admin::role";
307
+ strapi.log.info(
308
+ `Migrating all existing review workflow stages to have RBAC permissions for all ${roleUID}.`
309
+ );
310
+ const stagePermissionsService = getService("stage-permissions");
311
+ const stages2 = await strapi.query(stageUID).findMany();
312
+ const roles2 = await strapi.query(roleUID).findMany();
313
+ const groupedPermissions = {};
314
+ roles2.map((role2) => role2.id).forEach((roleId) => {
315
+ stages2.map((stage) => stage.id).forEach((stageId) => {
316
+ if (!groupedPermissions[stageId]) {
317
+ groupedPermissions[stageId] = [];
318
+ }
319
+ groupedPermissions[stageId].push({
320
+ roleId,
321
+ fromStage: stageId,
322
+ action: STAGE_TRANSITION_UID
323
+ });
324
+ });
325
+ });
326
+ for (const [stageId, permissions] of Object.entries(groupedPermissions)) {
327
+ const numericalStageId = Number(stageId);
328
+ if (Number.isNaN(numericalStageId)) {
329
+ strapi.log.warn(
330
+ `Unable to apply ${roleUID} migration for ${stageUID} with id ${stageId}. The stage does not have a numerical id.`
331
+ );
332
+ continue;
333
+ }
334
+ const stagePermissions2 = await stagePermissionsService.registerMany(permissions);
335
+ await strapi.entityService.update(STAGE_MODEL_UID, numericalStageId, {
336
+ data: {
337
+ permissions: stagePermissions2.flat().map((permission2) => permission2.id)
338
+ }
339
+ });
340
+ }
341
+ }
342
+ }
343
+ const name = "Default";
344
+ const defaultWorkflow = {
345
+ name
346
+ };
347
+ async function migrateReviewWorkflowName({ oldContentTypes, contentTypes }) {
348
+ const hadName = !!oldContentTypes?.[WORKFLOW_MODEL_UID]?.attributes?.name;
349
+ const hasName = !!contentTypes?.[WORKFLOW_MODEL_UID]?.attributes?.name;
350
+ if (!hadName && hasName) {
351
+ await strapi.query(WORKFLOW_MODEL_UID).updateMany({
352
+ where: {
353
+ name: { $null: true }
354
+ },
355
+ data: {
356
+ name: defaultWorkflow.name
357
+ }
358
+ });
359
+ }
360
+ }
361
+ async function migrateWorkflowsContentTypes({ oldContentTypes, contentTypes }) {
362
+ const hadContentTypes = !!oldContentTypes?.[WORKFLOW_MODEL_UID]?.attributes?.contentTypes;
363
+ const hasContentTypes = !!contentTypes?.[WORKFLOW_MODEL_UID]?.attributes?.contentTypes;
364
+ if (!hadContentTypes && hasContentTypes) {
365
+ await strapi.query(WORKFLOW_MODEL_UID).updateMany({ data: { contentTypes: [] } });
366
+ const contentTypes2 = fp.pipe([fp.pickBy(fp.get("options.reviewWorkflows")), fp.keys])(oldContentTypes);
367
+ if (contentTypes2.length) {
368
+ await strapi.query(WORKFLOW_MODEL_UID).update({ where: { id: { $notNull: true } }, data: { contentTypes: contentTypes2 } });
369
+ }
370
+ }
371
+ }
372
+ const transformTableName = (table) => {
373
+ if (typeof table === "string") {
374
+ return { name: table };
375
+ }
376
+ return table;
377
+ };
378
+ async function findTables({ strapi: strapi2 }, regex) {
379
+ const tables = await strapi2.db.dialect.schemaInspector.getTables();
380
+ return tables.filter((tableName) => regex.test(tableName));
381
+ }
382
+ async function addPersistTables({ strapi: strapi2 }, tableNames) {
383
+ const persistedTables = await getPersistedTables({ strapi: strapi2 });
384
+ const tables = tableNames.map(transformTableName);
385
+ const notPersistedTableNames = fp.differenceWith(fp.isEqual, tables, persistedTables);
386
+ const tablesToPersist = fp.differenceWith(
387
+ (t1, t2) => t1.name === t2.name,
388
+ persistedTables,
389
+ notPersistedTableNames
390
+ );
391
+ if (!notPersistedTableNames.length) {
392
+ return;
393
+ }
394
+ tablesToPersist.push(...notPersistedTableNames);
395
+ await strapi2.store.set({
396
+ type: "core",
397
+ key: "persisted_tables",
398
+ value: tablesToPersist
399
+ });
400
+ }
401
+ async function getPersistedTables({ strapi: strapi2 }) {
402
+ const persistedTables = await strapi2.store.get({
403
+ type: "core",
404
+ key: "persisted_tables"
405
+ });
406
+ return (persistedTables || []).map(transformTableName);
407
+ }
408
+ async function setPersistedTables({ strapi: strapi2 }, tableNames) {
409
+ await strapi2.store.set({
410
+ type: "core",
411
+ key: "persisted_tables",
412
+ value: tableNames
413
+ });
414
+ }
415
+ const persistTablesWithPrefix = async (tableNamePrefix) => {
416
+ const tableNameRegex = new RegExp(`^${tableNamePrefix}.*`);
417
+ const tableNames = await findTables({ strapi }, tableNameRegex);
418
+ await addPersistTables({ strapi }, tableNames);
419
+ };
420
+ const removePersistedTablesWithSuffix = async (tableNameSuffix) => {
421
+ const tableNameRegex = new RegExp(`.*${tableNameSuffix}$`);
422
+ const persistedTables = await getPersistedTables({ strapi });
423
+ const filteredPersistedTables = persistedTables.filter((table) => {
424
+ return !tableNameRegex.test(table.name);
425
+ });
426
+ if (filteredPersistedTables.length === persistedTables.length) {
427
+ return;
428
+ }
429
+ await setPersistedTables({ strapi }, filteredPersistedTables);
430
+ };
431
+ const persistTables = async (tables) => {
432
+ await addPersistTables({ strapi }, tables);
433
+ };
434
+ function checkVersionThreshold(startVersion, currentVersion, thresholdVersion) {
435
+ return semver__default.default.gte(currentVersion, thresholdVersion) && semver__default.default.lt(startVersion, thresholdVersion);
436
+ }
437
+ async function migrateStageAttribute({ oldContentTypes, contentTypes }) {
438
+ const getRWVersion = fp.getOr("0.0.0", `${STAGE_MODEL_UID}.options.version`);
439
+ const oldRWVersion = getRWVersion(oldContentTypes);
440
+ const currentRWVersion = getRWVersion(contentTypes);
441
+ const migrationNeeded = checkVersionThreshold(oldRWVersion, currentRWVersion, "1.1.0");
442
+ if (migrationNeeded) {
443
+ const oldAttributeTableName = "strapi_review_workflows_stage";
444
+ const newAttributeTableName = "strapi_stage";
445
+ const tables = await findTables({ strapi }, new RegExp(oldAttributeTableName));
446
+ await utils$1.mapAsync(tables, async (tableName) => {
447
+ const newTableName = tableName.replace(oldAttributeTableName, newAttributeTableName);
448
+ const alreadyHasNextTable = await strapi.db.connection.schema.hasTable(newTableName);
449
+ if (alreadyHasNextTable) {
450
+ const dataInTable = await strapi.db.connection(newTableName).select().limit(1);
451
+ if (!dataInTable.length) {
452
+ await strapi.db.connection.schema.dropTable(newTableName);
453
+ }
454
+ }
455
+ try {
456
+ await strapi.db.connection.schema.renameTable(tableName, newTableName);
457
+ } catch (e) {
458
+ strapi.log.warn(
459
+ `An error occurred during the migration of ${tableName} table to ${newTableName}.
460
+ If ${newTableName} already exists, migration can't be done automatically.`
461
+ );
462
+ strapi.log.warn(e.message);
463
+ }
464
+ });
465
+ }
466
+ }
467
+ const getVisibleContentTypesUID = fp.pipe([
468
+ // Pick only content-types visible in the content-manager and option is not false
469
+ fp.pickBy(
470
+ (value) => fp.getOr(true, "pluginOptions.content-manager.visible", value) && !fp.getOr(false, "options.noStageAttribute", value)
471
+ ),
472
+ // Get UIDs
473
+ fp.keys
474
+ ]);
475
+ const hasStageAttribute = fp.has(["attributes", ENTITY_STAGE_ATTRIBUTE]);
476
+ const getWorkflowContentTypeFilter = ({ strapi: strapi2 }, contentType) => {
477
+ if (strapi2.db.dialect.supportsOperator("$jsonSupersetOf")) {
478
+ return { $jsonSupersetOf: JSON.stringify([contentType]) };
479
+ }
480
+ return { $contains: `"${contentType}"` };
481
+ };
482
+ const clampMaxWorkflows = fp.clamp(1, MAX_WORKFLOWS);
483
+ const clampMaxStagesPerWorkflow = fp.clamp(1, MAX_STAGES_PER_WORKFLOW);
484
+ async function migrateDeletedCTInWorkflows({ oldContentTypes, contentTypes }) {
485
+ const deletedContentTypes = fp.difference(fp.keys(oldContentTypes), fp.keys(contentTypes)) ?? [];
486
+ if (deletedContentTypes.length) {
487
+ await utils$1.mapAsync(deletedContentTypes, async (deletedContentTypeUID) => {
488
+ const workflow2 = await strapi.query(WORKFLOW_MODEL_UID).findOne({
489
+ select: ["id", "contentTypes"],
490
+ where: {
491
+ contentTypes: getWorkflowContentTypeFilter({ strapi }, deletedContentTypeUID)
492
+ }
493
+ });
494
+ if (workflow2) {
495
+ await strapi.query(WORKFLOW_MODEL_UID).update({
496
+ where: { id: workflow2.id },
497
+ data: {
498
+ contentTypes: workflow2.contentTypes.filter(
499
+ (contentTypeUID) => contentTypeUID !== deletedContentTypeUID
500
+ )
501
+ }
502
+ });
503
+ }
504
+ });
505
+ }
506
+ }
507
+ const DEFAULT_RETENTION_DAYS = 90;
508
+ const defaultEvents = [
509
+ "entry.create",
510
+ "entry.update",
511
+ "entry.delete",
512
+ "entry.publish",
513
+ "entry.unpublish",
514
+ "media.create",
515
+ "media.update",
516
+ "media.delete",
517
+ "media-folder.create",
518
+ "media-folder.update",
519
+ "media-folder.delete",
520
+ "user.create",
521
+ "user.update",
522
+ "user.delete",
523
+ "admin.auth.success",
524
+ "admin.logout",
525
+ "content-type.create",
526
+ "content-type.update",
527
+ "content-type.delete",
528
+ "component.create",
529
+ "component.update",
530
+ "component.delete",
531
+ "role.create",
532
+ "role.update",
533
+ "role.delete",
534
+ "permission.create",
535
+ "permission.update",
536
+ "permission.delete"
537
+ ];
538
+ const getSanitizedUser = (user2) => {
539
+ let displayName = user2.email;
540
+ if (user2.username) {
541
+ displayName = user2.username;
542
+ } else if (user2.firstname && user2.lastname) {
543
+ displayName = `${user2.firstname} ${user2.lastname}`;
544
+ }
545
+ return {
546
+ id: user2.id,
547
+ email: user2.email,
548
+ displayName
549
+ };
550
+ };
551
+ const getEventMap = (defaultEvents2) => {
552
+ const getDefaultPayload = (...args) => args[0];
553
+ return defaultEvents2.reduce((acc, event) => {
554
+ acc[event] = getDefaultPayload;
555
+ return acc;
556
+ }, {});
557
+ };
558
+ const getRetentionDays = (strapi2) => {
559
+ const licenseRetentionDays = EE__default.default.features.get("audit-logs")?.options.retentionDays;
560
+ const userRetentionDays = strapi2.config.get("admin.auditLogs.retentionDays");
561
+ if (licenseRetentionDays == null) {
562
+ return userRetentionDays ?? DEFAULT_RETENTION_DAYS;
563
+ }
564
+ if (userRetentionDays && userRetentionDays < licenseRetentionDays) {
565
+ return userRetentionDays;
566
+ }
567
+ return licenseRetentionDays;
568
+ };
569
+ const createAuditLogsService = (strapi2) => {
570
+ const state = {};
571
+ const eventMap = getEventMap(defaultEvents);
572
+ const processEvent = (name2, ...args) => {
573
+ const requestState = strapi2.requestContext.get()?.state;
574
+ const isUsingAdminAuth = requestState?.auth?.strategy.name === "admin";
575
+ const user2 = requestState?.user;
576
+ if (!isUsingAdminAuth || !user2) {
577
+ return null;
578
+ }
579
+ const getPayload = eventMap[name2];
580
+ if (!getPayload) {
581
+ return null;
582
+ }
583
+ const ignoredUids = ["plugin::upload.file", "plugin::upload.folder"];
584
+ if (ignoredUids.includes(args[0]?.uid)) {
585
+ return null;
586
+ }
587
+ return {
588
+ action: name2,
589
+ date: (/* @__PURE__ */ new Date()).toISOString(),
590
+ payload: getPayload(...args) || {},
591
+ userId: user2.id
592
+ };
593
+ };
594
+ async function handleEvent(name2, ...args) {
595
+ const processedEvent = processEvent(name2, ...args);
596
+ if (processedEvent) {
597
+ await strapi2.db.transaction(({ onCommit }) => {
598
+ onCommit(() => state.provider.saveEvent(processedEvent));
599
+ });
600
+ }
601
+ }
602
+ return {
603
+ async register() {
604
+ if (!state.eeEnableUnsubscribe) {
605
+ state.eeEnableUnsubscribe = strapi2.eventHub.on("ee.enable", () => {
606
+ this.destroy();
607
+ this.register();
608
+ });
609
+ }
610
+ if (!state.eeUpdateUnsubscribe) {
611
+ state.eeUpdateUnsubscribe = strapi2.eventHub.on("ee.update", () => {
612
+ this.destroy();
613
+ this.register();
614
+ });
615
+ }
616
+ state.eeDisableUnsubscribe = strapi2.eventHub.on("ee.disable", () => {
617
+ this.destroy();
618
+ });
619
+ state.provider = await localProvider__default.default.register({ strapi: strapi2 });
620
+ if (!EE__default.default.features.isEnabled("audit-logs")) {
621
+ return this;
622
+ }
623
+ state.eventHubUnsubscribe = strapi2.eventHub.subscribe(handleEvent.bind(this));
624
+ const retentionDays = getRetentionDays(strapi2);
625
+ state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
626
+ const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1e3);
627
+ state.provider.deleteExpiredEvents(expirationDate);
628
+ });
629
+ return this;
630
+ },
631
+ async findMany(query) {
632
+ const { results, pagination } = await state.provider.findMany(query);
633
+ const sanitizedResults = results.map((result) => {
634
+ const { user: user2, ...rest } = result;
635
+ return {
636
+ ...rest,
637
+ user: user2 ? getSanitizedUser(user2) : null
638
+ };
639
+ });
640
+ return {
641
+ results: sanitizedResults,
642
+ pagination
643
+ };
644
+ },
645
+ async findOne(id) {
646
+ const result = await state.provider.findOne(id);
647
+ if (!result) {
648
+ return null;
649
+ }
650
+ const { user: user2, ...rest } = result;
651
+ return {
652
+ ...rest,
653
+ user: user2 ? getSanitizedUser(user2) : null
654
+ };
655
+ },
656
+ unsubscribe() {
657
+ if (state.eeDisableUnsubscribe) {
658
+ state.eeDisableUnsubscribe();
659
+ }
660
+ if (state.eventHubUnsubscribe) {
661
+ state.eventHubUnsubscribe();
662
+ }
663
+ if (state.deleteExpiredJob) {
664
+ state.deleteExpiredJob.cancel();
665
+ }
666
+ return this;
667
+ },
668
+ destroy() {
669
+ return this.unsubscribe();
670
+ }
671
+ };
672
+ };
673
+ function contentTypeMiddleware(strapi2) {
674
+ const moveReviewWorkflowOption = (ctx) => {
675
+ const { reviewWorkflows: reviewWorkflows2, ...contentType } = ctx.request.body.contentType;
676
+ if (typeof reviewWorkflows2 === "boolean") {
677
+ ctx.request.body.contentType = fp.set("options.reviewWorkflows", reviewWorkflows2, contentType);
678
+ }
679
+ };
680
+ strapi2.server.router.use("/content-type-builder/content-types/:uid?", (ctx, next) => {
681
+ if (ctx.method === "PUT" || ctx.method === "POST") {
682
+ moveReviewWorkflowOption(ctx);
683
+ }
684
+ return next();
685
+ });
686
+ }
687
+ const reviewWorkflowsMiddlewares = {
688
+ contentTypeMiddleware
689
+ };
690
+ const register = async ({ strapi: strapi2 }) => {
691
+ const auditLogsIsEnabled = strapi2.config.get("admin.auditLogs.enabled", true);
692
+ if (auditLogsIsEnabled) {
693
+ strapi2.hook("strapi::content-types.beforeSync").register(migrateAuditLogsTable);
694
+ const auditLogsService = createAuditLogsService(strapi2);
695
+ strapi2.container.register("audit-logs", auditLogsService);
696
+ await auditLogsService.register();
697
+ }
698
+ if (EE__default.default.features.isEnabled("review-workflows")) {
699
+ strapi2.hook("strapi::content-types.beforeSync").register(migrateStageAttribute);
700
+ strapi2.hook("strapi::content-types.afterSync").register(migrateReviewWorkflowStagesColor).register(migrateReviewWorkflowStagesRoles).register(migrateReviewWorkflowName).register(migrateWorkflowsContentTypes).register(migrateDeletedCTInWorkflows);
701
+ const reviewWorkflowService = getService("review-workflows");
702
+ reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi2);
703
+ await reviewWorkflowService.register(EE__default.default.features.get("review-workflows"));
704
+ }
705
+ await executeCERegister({ strapi: strapi2 });
706
+ };
707
+ const workflow = {
708
+ schema: {
709
+ collectionName: "strapi_workflows",
710
+ info: {
711
+ name: "Workflow",
712
+ description: "",
713
+ singularName: "workflow",
714
+ pluralName: "workflows",
715
+ displayName: "Workflow"
716
+ },
717
+ options: {},
718
+ pluginOptions: {
719
+ "content-manager": {
720
+ visible: false
721
+ },
722
+ "content-type-builder": {
723
+ visible: false
724
+ }
725
+ },
726
+ attributes: {
727
+ name: {
728
+ type: "string",
729
+ required: true,
730
+ unique: true
731
+ },
732
+ stages: {
733
+ type: "relation",
734
+ target: "admin::workflow-stage",
735
+ relation: "oneToMany",
736
+ mappedBy: "workflow"
737
+ },
738
+ contentTypes: {
739
+ type: "json",
740
+ required: true,
741
+ default: []
742
+ }
743
+ }
744
+ }
745
+ };
746
+ const workflowStage = {
747
+ schema: {
748
+ collectionName: "strapi_workflows_stages",
749
+ info: {
750
+ name: "Workflow Stage",
751
+ description: "",
752
+ singularName: "workflow-stage",
753
+ pluralName: "workflow-stages",
754
+ displayName: "Stages"
755
+ },
756
+ options: {
757
+ version: "1.1.0"
758
+ },
759
+ pluginOptions: {
760
+ "content-manager": {
761
+ visible: false
762
+ },
763
+ "content-type-builder": {
764
+ visible: false
765
+ }
766
+ },
767
+ attributes: {
768
+ name: {
769
+ type: "string",
770
+ configurable: false
771
+ },
772
+ color: {
773
+ type: "string",
774
+ configurable: false,
775
+ default: STAGE_DEFAULT_COLOR
776
+ },
777
+ workflow: {
778
+ type: "relation",
779
+ target: "admin::workflow",
780
+ relation: "manyToOne",
781
+ inversedBy: "stages",
782
+ configurable: false
783
+ },
784
+ permissions: {
785
+ type: "relation",
786
+ target: "admin::permission",
787
+ relation: "manyToMany",
788
+ configurable: false
789
+ }
790
+ }
791
+ }
792
+ };
793
+ const index$3 = {
794
+ workflow,
795
+ "workflow-stage": workflowStage
796
+ };
797
+ const actions$1 = [
798
+ {
799
+ uid: "marketplace.read",
800
+ displayName: "Access the marketplace",
801
+ pluginName: "admin",
802
+ section: "settings",
803
+ category: "plugins and marketplace",
804
+ subCategory: "marketplace"
805
+ },
806
+ {
807
+ uid: "webhooks.create",
808
+ displayName: "Create",
809
+ pluginName: "admin",
810
+ section: "settings",
811
+ category: "webhooks"
812
+ },
813
+ {
814
+ uid: "webhooks.read",
815
+ displayName: "Read",
816
+ pluginName: "admin",
817
+ section: "settings",
818
+ category: "webhooks"
819
+ },
820
+ {
821
+ uid: "webhooks.update",
822
+ displayName: "Update",
823
+ pluginName: "admin",
824
+ section: "settings",
825
+ category: "webhooks"
826
+ },
827
+ {
828
+ uid: "webhooks.delete",
829
+ displayName: "Delete",
830
+ pluginName: "admin",
831
+ section: "settings",
832
+ category: "webhooks"
833
+ },
834
+ {
835
+ uid: "users.create",
836
+ displayName: "Create (invite)",
837
+ pluginName: "admin",
838
+ section: "settings",
839
+ category: "users and roles",
840
+ subCategory: "users"
841
+ },
842
+ {
843
+ uid: "users.read",
844
+ displayName: "Read",
845
+ pluginName: "admin",
846
+ section: "settings",
847
+ category: "users and roles",
848
+ subCategory: "users"
849
+ },
850
+ {
851
+ uid: "users.update",
852
+ displayName: "Update",
853
+ pluginName: "admin",
854
+ section: "settings",
855
+ category: "users and roles",
856
+ subCategory: "users"
857
+ },
858
+ {
859
+ uid: "users.delete",
860
+ displayName: "Delete",
861
+ pluginName: "admin",
862
+ section: "settings",
863
+ category: "users and roles",
864
+ subCategory: "users"
865
+ },
866
+ {
867
+ uid: "roles.create",
868
+ displayName: "Create",
869
+ pluginName: "admin",
870
+ section: "settings",
871
+ category: "users and roles",
872
+ subCategory: "roles"
873
+ },
874
+ {
875
+ uid: "roles.read",
876
+ displayName: "Read",
877
+ pluginName: "admin",
878
+ section: "settings",
879
+ category: "users and roles",
880
+ subCategory: "roles"
881
+ },
882
+ {
883
+ uid: "roles.update",
884
+ displayName: "Update",
885
+ pluginName: "admin",
886
+ section: "settings",
887
+ category: "users and roles",
888
+ subCategory: "roles"
889
+ },
890
+ {
891
+ uid: "roles.delete",
892
+ displayName: "Delete",
893
+ pluginName: "admin",
894
+ section: "settings",
895
+ category: "users and roles",
896
+ subCategory: "roles"
897
+ },
898
+ {
899
+ uid: "api-tokens.access",
900
+ displayName: "Access the API tokens settings page",
901
+ pluginName: "admin",
902
+ section: "settings",
903
+ category: "api tokens",
904
+ subCategory: "api Tokens"
905
+ },
906
+ {
907
+ uid: "api-tokens.create",
908
+ displayName: "Create (generate)",
909
+ pluginName: "admin",
910
+ section: "settings",
911
+ category: "api tokens",
912
+ subCategory: "general"
913
+ },
914
+ {
915
+ uid: "api-tokens.read",
916
+ displayName: "Read",
917
+ pluginName: "admin",
918
+ section: "settings",
919
+ category: "api tokens",
920
+ subCategory: "general"
921
+ },
922
+ {
923
+ uid: "api-tokens.update",
924
+ displayName: "Update",
925
+ pluginName: "admin",
926
+ section: "settings",
927
+ category: "api tokens",
928
+ subCategory: "general"
929
+ },
930
+ {
931
+ uid: "api-tokens.regenerate",
932
+ displayName: "Regenerate",
933
+ pluginName: "admin",
934
+ section: "settings",
935
+ category: "api tokens",
936
+ subCategory: "general"
937
+ },
938
+ {
939
+ uid: "api-tokens.delete",
940
+ displayName: "Delete (revoke)",
941
+ pluginName: "admin",
942
+ section: "settings",
943
+ category: "api tokens",
944
+ subCategory: "general"
945
+ },
946
+ {
947
+ uid: "project-settings.update",
948
+ displayName: "Update the project level settings",
949
+ pluginName: "admin",
950
+ section: "settings",
951
+ category: "project"
952
+ },
953
+ {
954
+ uid: "project-settings.read",
955
+ displayName: "Read the project level settings",
956
+ pluginName: "admin",
957
+ section: "settings",
958
+ category: "project"
959
+ },
960
+ {
961
+ uid: "transfer.tokens.access",
962
+ displayName: "Access the transfer tokens settings page",
963
+ pluginName: "admin",
964
+ section: "settings",
965
+ category: "transfer tokens",
966
+ subCategory: "transfer tokens"
967
+ },
968
+ {
969
+ uid: "transfer.tokens.create",
970
+ displayName: "Create (generate)",
971
+ pluginName: "admin",
972
+ section: "settings",
973
+ category: "transfer tokens",
974
+ subCategory: "general"
975
+ },
976
+ {
977
+ uid: "transfer.tokens.read",
978
+ displayName: "Read",
979
+ pluginName: "admin",
980
+ section: "settings",
981
+ category: "transfer tokens",
982
+ subCategory: "general"
983
+ },
984
+ {
985
+ uid: "transfer.tokens.update",
986
+ displayName: "Update",
987
+ pluginName: "admin",
988
+ section: "settings",
989
+ category: "transfer tokens",
990
+ subCategory: "general"
991
+ },
992
+ {
993
+ uid: "transfer.tokens.regenerate",
994
+ displayName: "Regenerate",
995
+ pluginName: "admin",
996
+ section: "settings",
997
+ category: "transfer tokens",
998
+ subCategory: "general"
999
+ },
1000
+ {
1001
+ uid: "transfer.tokens.delete",
1002
+ displayName: "Delete (revoke)",
1003
+ pluginName: "admin",
1004
+ section: "settings",
1005
+ category: "transfer tokens",
1006
+ subCategory: "general"
1007
+ }
1008
+ ];
1009
+ const adminActions = {
1010
+ actions: actions$1
1011
+ };
1012
+ const conditions = [
1013
+ {
1014
+ displayName: "Is creator",
1015
+ name: "is-creator",
1016
+ plugin: "admin",
1017
+ handler: (user2) => ({ "createdBy.id": user2.id })
1018
+ },
1019
+ {
1020
+ displayName: "Has same role as creator",
1021
+ name: "has-same-role-as-creator",
1022
+ plugin: "admin",
1023
+ handler: (user2) => ({
1024
+ "createdBy.roles": {
1025
+ $elemMatch: {
1026
+ id: {
1027
+ $in: user2.roles.map((r) => r.id)
1028
+ }
1029
+ }
1030
+ }
1031
+ })
1032
+ }
1033
+ ];
1034
+ const adminConditions = {
1035
+ conditions
1036
+ };
1037
+ const defaultAdminAuthSettings = {
1038
+ providers: {
1039
+ autoRegister: false,
1040
+ defaultRole: null,
1041
+ ssoLockedRoles: null
1042
+ }
1043
+ };
1044
+ const registerPermissionActions = async () => {
1045
+ await getService$1("permission").actionProvider.registerMany(adminActions.actions);
1046
+ };
1047
+ const registerAdminConditions = async () => {
1048
+ await getService$1("permission").conditionProvider.registerMany(adminConditions.conditions);
1049
+ };
1050
+ const registerModelHooks = () => {
1051
+ const { sendDidChangeInterfaceLanguage } = getService$1("metrics");
1052
+ strapi.db.lifecycles.subscribe({
1053
+ models: ["admin::user"],
1054
+ afterCreate: sendDidChangeInterfaceLanguage,
1055
+ afterDelete: sendDidChangeInterfaceLanguage,
1056
+ afterUpdate({ params }) {
1057
+ if (params.data.preferedLanguage) {
1058
+ sendDidChangeInterfaceLanguage();
1059
+ }
1060
+ }
1061
+ });
1062
+ };
1063
+ const syncAuthSettings = async () => {
1064
+ const adminStore = await strapi.store({ type: "core", name: "admin" });
1065
+ const adminAuthSettings = await adminStore.get({ key: "auth" });
1066
+ const newAuthSettings = fp.merge(defaultAdminAuthSettings, adminAuthSettings);
1067
+ const roleExists = await getService$1("role").exists({
1068
+ id: newAuthSettings.providers.defaultRole
1069
+ });
1070
+ if (!roleExists) {
1071
+ newAuthSettings.providers.defaultRole = null;
1072
+ }
1073
+ await adminStore.set({ key: "auth", value: newAuthSettings });
1074
+ };
1075
+ const syncAPITokensPermissions = async () => {
1076
+ const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
1077
+ const permissionsInDB = await utils$1.pipeAsync(
1078
+ strapi.query("admin::api-token-permission").findMany,
1079
+ // @ts-expect-error lodash types
1080
+ fp.map("action")
1081
+ )();
1082
+ const unknownPermissions = fp.uniq(fp.difference(permissionsInDB, validPermissions));
1083
+ if (unknownPermissions.length > 0) {
1084
+ await strapi.query("admin::api-token-permission").deleteMany({ where: { action: { $in: unknownPermissions } } });
1085
+ }
1086
+ };
1087
+ const executeCEBootstrap = async ({ strapi: strapi2 }) => {
1088
+ await registerAdminConditions();
1089
+ await registerPermissionActions();
1090
+ registerModelHooks();
1091
+ const permissionService = getService$1("permission");
1092
+ const userService = getService$1("user");
1093
+ const roleService = getService$1("role");
1094
+ const apiTokenService = getService$1("api-token");
1095
+ const transferService = getService$1("transfer");
1096
+ const tokenService = getService$1("token");
1097
+ await roleService.createRolesIfNoneExist();
1098
+ await roleService.resetSuperAdminPermissions();
1099
+ await roleService.displayWarningIfNoSuperAdmin();
1100
+ await permissionService.cleanPermissionsInDatabase();
1101
+ await userService.displayWarningIfUsersDontHaveRole();
1102
+ await syncAuthSettings();
1103
+ await syncAPITokensPermissions();
1104
+ getService$1("metrics").startCron(strapi2);
1105
+ apiTokenService.checkSaltIsDefined();
1106
+ transferService.token.checkSaltIsDefined();
1107
+ tokenService.checkSecretIsDefined();
1108
+ };
1109
+ const actions = {
1110
+ sso: [
1111
+ {
1112
+ uid: "provider-login.read",
1113
+ displayName: "Read",
1114
+ pluginName: "admin",
1115
+ section: "settings",
1116
+ category: "single sign on",
1117
+ subCategory: "options"
1118
+ },
1119
+ {
1120
+ uid: "provider-login.update",
1121
+ displayName: "Update",
1122
+ pluginName: "admin",
1123
+ section: "settings",
1124
+ category: "single sign on",
1125
+ subCategory: "options"
1126
+ }
1127
+ ],
1128
+ auditLogs: [
1129
+ {
1130
+ uid: "audit-logs.read",
1131
+ displayName: "Read",
1132
+ pluginName: "admin",
1133
+ section: "settings",
1134
+ category: "audit logs",
1135
+ subCategory: "options"
1136
+ }
1137
+ ],
1138
+ reviewWorkflows: [
1139
+ {
1140
+ uid: "review-workflows.create",
1141
+ displayName: "Create",
1142
+ pluginName: "admin",
1143
+ section: "settings",
1144
+ category: "review workflows",
1145
+ subCategory: "options"
1146
+ },
1147
+ {
1148
+ uid: "review-workflows.read",
1149
+ displayName: "Read",
1150
+ pluginName: "admin",
1151
+ section: "settings",
1152
+ category: "review workflows",
1153
+ subCategory: "options"
1154
+ },
1155
+ {
1156
+ uid: "review-workflows.update",
1157
+ displayName: "Update",
1158
+ pluginName: "admin",
1159
+ section: "settings",
1160
+ category: "review workflows",
1161
+ subCategory: "options"
1162
+ },
1163
+ {
1164
+ uid: "review-workflows.delete",
1165
+ displayName: "Delete",
1166
+ pluginName: "admin",
1167
+ section: "settings",
1168
+ category: "review workflows",
1169
+ subCategory: "options"
1170
+ },
1171
+ {
1172
+ uid: "review-workflows.stage.transition",
1173
+ displayName: "Change stage",
1174
+ pluginName: "admin",
1175
+ section: "internal"
1176
+ }
1177
+ ]
1178
+ };
1179
+ const bootstrap = async (args) => {
1180
+ const { actionProvider } = getService("permission");
1181
+ if (EE__default.default.features.isEnabled("sso")) {
1182
+ await actionProvider.registerMany(actions.sso);
1183
+ }
1184
+ if (EE__default.default.features.isEnabled("audit-logs")) {
1185
+ await persistTablesWithPrefix("strapi_audit_logs");
1186
+ await actionProvider.registerMany(actions.auditLogs);
1187
+ }
1188
+ if (EE__default.default.features.isEnabled("review-workflows")) {
1189
+ await persistTablesWithPrefix("strapi_workflows");
1190
+ const { bootstrap: rwBootstrap } = getService("review-workflows");
1191
+ await rwBootstrap();
1192
+ await actionProvider.registerMany(actions.reviewWorkflows);
1193
+ const { decorator: decorator2 } = getService("review-workflows-decorator");
1194
+ strapi.entityService.decorate(decorator2);
1195
+ await getService("review-workflows-weekly-metrics").registerCron();
1196
+ }
1197
+ await getService("seat-enforcement").seatEnforcementWorkflow();
1198
+ await executeCEBootstrap(args);
1199
+ };
1200
+ const executeCEDestroy = async () => {
1201
+ const { conditionProvider, actionProvider } = getService$1("permission");
1202
+ await conditionProvider.clear();
1203
+ await actionProvider.clear();
1204
+ };
1205
+ const destroy = async ({ strapi: strapi2 }) => {
1206
+ if (EE__default.default.features.isEnabled("audit-logs")) {
1207
+ strapi2.container.get("audit-logs").destroy();
1208
+ }
1209
+ await executeCEDestroy();
1210
+ };
1211
+ const enableFeatureMiddleware = (featureName) => (ctx, next) => {
1212
+ if (EE__default.default.features.isEnabled(featureName)) {
1213
+ return next();
1214
+ }
1215
+ ctx.status = 404;
1216
+ };
1217
+ const sso$1 = {
1218
+ type: "admin",
1219
+ routes: [
1220
+ {
1221
+ method: "GET",
1222
+ path: "/providers",
1223
+ handler: "authentication.getProviders",
1224
+ config: {
1225
+ middlewares: [enableFeatureMiddleware("sso")],
1226
+ auth: false
1227
+ }
1228
+ },
1229
+ {
1230
+ method: "GET",
1231
+ path: "/connect/:provider",
1232
+ handler: "authentication.providerLogin",
1233
+ config: {
1234
+ middlewares: [enableFeatureMiddleware("sso")],
1235
+ auth: false
1236
+ }
1237
+ },
1238
+ {
1239
+ method: "POST",
1240
+ path: "/connect/:provider",
1241
+ handler: "authentication.providerLogin",
1242
+ config: {
1243
+ middlewares: [enableFeatureMiddleware("sso")],
1244
+ auth: false
1245
+ }
1246
+ },
1247
+ {
1248
+ method: "GET",
1249
+ path: "/providers/options",
1250
+ handler: "authentication.getProviderLoginOptions",
1251
+ config: {
1252
+ middlewares: [enableFeatureMiddleware("sso")],
1253
+ policies: [
1254
+ "admin::isAuthenticatedAdmin",
1255
+ { name: "admin::hasPermissions", config: { actions: ["admin::provider-login.read"] } }
1256
+ ]
1257
+ }
1258
+ },
1259
+ {
1260
+ method: "PUT",
1261
+ path: "/providers/options",
1262
+ handler: "authentication.updateProviderLoginOptions",
1263
+ config: {
1264
+ middlewares: [enableFeatureMiddleware("sso")],
1265
+ policies: [
1266
+ "admin::isAuthenticatedAdmin",
1267
+ { name: "admin::hasPermissions", config: { actions: ["admin::provider-login.update"] } }
1268
+ ]
1269
+ }
1270
+ },
1271
+ {
1272
+ method: "GET",
1273
+ path: "/providers/isSSOLocked",
1274
+ handler: "user.isSSOLocked",
1275
+ config: {
1276
+ middlewares: [enableFeatureMiddleware("sso")],
1277
+ policies: ["admin::isAuthenticatedAdmin"]
1278
+ }
1279
+ }
1280
+ ]
1281
+ };
1282
+ const licenseLimit = {
1283
+ type: "admin",
1284
+ routes: [
1285
+ // License limit infos
1286
+ {
1287
+ method: "GET",
1288
+ path: "/license-limit-information",
1289
+ handler: "admin.licenseLimitInformation",
1290
+ config: {
1291
+ policies: [
1292
+ "admin::isAuthenticatedAdmin",
1293
+ {
1294
+ name: "admin::hasPermissions",
1295
+ config: {
1296
+ actions: [
1297
+ "admin::users.create",
1298
+ "admin::users.read",
1299
+ "admin::users.update",
1300
+ "admin::users.delete"
1301
+ ]
1302
+ }
1303
+ }
1304
+ ]
1305
+ }
1306
+ }
1307
+ ]
1308
+ };
1309
+ const auditLogs$1 = {
1310
+ type: "admin",
1311
+ routes: [
1312
+ {
1313
+ method: "GET",
1314
+ path: "/audit-logs",
1315
+ handler: "auditLogs.findMany",
1316
+ config: {
1317
+ middlewares: [enableFeatureMiddleware("audit-logs")],
1318
+ policies: [
1319
+ "admin::isAuthenticatedAdmin",
1320
+ {
1321
+ name: "admin::hasPermissions",
1322
+ config: {
1323
+ actions: ["admin::audit-logs.read"]
1324
+ }
1325
+ }
1326
+ ]
1327
+ }
1328
+ },
1329
+ {
1330
+ method: "GET",
1331
+ path: "/audit-logs/:id",
1332
+ handler: "auditLogs.findOne",
1333
+ config: {
1334
+ middlewares: [enableFeatureMiddleware("audit-logs")],
1335
+ policies: [
1336
+ "admin::isAuthenticatedAdmin",
1337
+ {
1338
+ name: "admin::hasPermissions",
1339
+ config: {
1340
+ actions: ["admin::audit-logs.read"]
1341
+ }
1342
+ }
1343
+ ]
1344
+ }
1345
+ }
1346
+ ]
1347
+ };
1348
+ const reviewWorkflows$1 = {
1349
+ type: "admin",
1350
+ routes: [
1351
+ // Review workflow
1352
+ {
1353
+ method: "POST",
1354
+ path: "/review-workflows/workflows",
1355
+ handler: "workflows.create",
1356
+ config: {
1357
+ middlewares: [enableFeatureMiddleware("review-workflows")],
1358
+ policies: [
1359
+ "admin::isAuthenticatedAdmin",
1360
+ {
1361
+ name: "admin::hasPermissions",
1362
+ config: {
1363
+ actions: ["admin::review-workflows.create"]
1364
+ }
1365
+ }
1366
+ ]
1367
+ }
1368
+ },
1369
+ {
1370
+ method: "PUT",
1371
+ path: "/review-workflows/workflows/:id",
1372
+ handler: "workflows.update",
1373
+ config: {
1374
+ middlewares: [enableFeatureMiddleware("review-workflows")],
1375
+ policies: [
1376
+ "admin::isAuthenticatedAdmin",
1377
+ {
1378
+ name: "admin::hasPermissions",
1379
+ config: {
1380
+ actions: ["admin::review-workflows.update"]
1381
+ }
1382
+ }
1383
+ ]
1384
+ }
1385
+ },
1386
+ {
1387
+ method: "DELETE",
1388
+ path: "/review-workflows/workflows/:id",
1389
+ handler: "workflows.delete",
1390
+ config: {
1391
+ middlewares: [enableFeatureMiddleware("review-workflows")],
1392
+ policies: [
1393
+ "admin::isAuthenticatedAdmin",
1394
+ {
1395
+ name: "admin::hasPermissions",
1396
+ config: {
1397
+ actions: ["admin::review-workflows.delete"]
1398
+ }
1399
+ }
1400
+ ]
1401
+ }
1402
+ },
1403
+ {
1404
+ method: "GET",
1405
+ path: "/review-workflows/workflows",
1406
+ handler: "workflows.find",
1407
+ config: {
1408
+ middlewares: [enableFeatureMiddleware("review-workflows")],
1409
+ policies: [
1410
+ "admin::isAuthenticatedAdmin",
1411
+ {
1412
+ name: "admin::hasPermissions",
1413
+ config: {
1414
+ actions: ["admin::review-workflows.read"]
1415
+ }
1416
+ }
1417
+ ]
1418
+ }
1419
+ },
1420
+ {
1421
+ method: "GET",
1422
+ path: "/review-workflows/workflows/:id",
1423
+ handler: "workflows.findById",
1424
+ config: {
1425
+ middlewares: [enableFeatureMiddleware("review-workflows")],
1426
+ policies: [
1427
+ "admin::isAuthenticatedAdmin",
1428
+ {
1429
+ name: "admin::hasPermissions",
1430
+ config: {
1431
+ actions: ["admin::review-workflows.read"]
1432
+ }
1433
+ }
1434
+ ]
1435
+ }
1436
+ },
1437
+ {
1438
+ method: "GET",
1439
+ path: "/review-workflows/workflows/:workflow_id/stages",
1440
+ handler: "stages.find",
1441
+ config: {
1442
+ middlewares: [enableFeatureMiddleware("review-workflows")],
1443
+ policies: [
1444
+ "admin::isAuthenticatedAdmin",
1445
+ {
1446
+ name: "admin::hasPermissions",
1447
+ config: {
1448
+ actions: ["admin::review-workflows.read"]
1449
+ }
1450
+ }
1451
+ ]
1452
+ }
1453
+ },
1454
+ {
1455
+ method: "GET",
1456
+ path: "/review-workflows/workflows/:workflow_id/stages/:id",
1457
+ handler: "stages.findById",
1458
+ config: {
1459
+ middlewares: [enableFeatureMiddleware("review-workflows")],
1460
+ policies: [
1461
+ "admin::isAuthenticatedAdmin",
1462
+ {
1463
+ name: "admin::hasPermissions",
1464
+ config: {
1465
+ actions: ["admin::review-workflows.read"]
1466
+ }
1467
+ }
1468
+ ]
1469
+ }
1470
+ },
1471
+ {
1472
+ method: "PUT",
1473
+ path: "/content-manager/(collection|single)-types/:model_uid/:id/stage",
1474
+ handler: "stages.updateEntity",
1475
+ config: {
1476
+ middlewares: [enableFeatureMiddleware("review-workflows")],
1477
+ policies: ["admin::isAuthenticatedAdmin"]
1478
+ }
1479
+ },
1480
+ {
1481
+ method: "GET",
1482
+ path: "/content-manager/(collection|single)-types/:model_uid/:id/stages",
1483
+ handler: "stages.listAvailableStages",
1484
+ config: {
1485
+ middlewares: [enableFeatureMiddleware("review-workflows")],
1486
+ policies: ["admin::isAuthenticatedAdmin"]
1487
+ }
1488
+ },
1489
+ {
1490
+ method: "PUT",
1491
+ path: "/content-manager/(collection|single)-types/:model_uid/:id/assignee",
1492
+ handler: "assignees.updateEntity",
1493
+ config: {
1494
+ middlewares: [enableFeatureMiddleware("review-workflows")],
1495
+ policies: [
1496
+ "admin::isAuthenticatedAdmin",
1497
+ {
1498
+ name: "admin::hasPermissions",
1499
+ config: {
1500
+ actions: ["admin::users.read", "admin::review-workflows.read"]
1501
+ }
1502
+ }
1503
+ ]
1504
+ }
1505
+ }
1506
+ ]
1507
+ };
1508
+ const index$2 = {
1509
+ sso: sso$1,
1510
+ "license-limit": licenseLimit,
1511
+ "audit-logs": auditLogs$1,
1512
+ "review-workflows": reviewWorkflows$1
1513
+ };
1514
+ const isSsoLocked = async (user2) => {
1515
+ if (!EE__default.default.features.isEnabled("sso")) {
1516
+ return false;
1517
+ }
1518
+ if (!user2) {
1519
+ throw new Error("Missing user object");
1520
+ }
1521
+ const adminStore = await strapi.store({ type: "core", name: "admin" });
1522
+ const { providers } = await adminStore.get({ key: "auth" });
1523
+ const lockedRoles = providers.ssoLockedRoles ?? [];
1524
+ if (fp.isEmpty(lockedRoles)) {
1525
+ return false;
1526
+ }
1527
+ const roles2 = (
1528
+ // If the roles are pre-loaded for the given user, then use them
1529
+ user2.roles ?? // Otherwise, try to load the role based on the given user ID
1530
+ await strapi.query("admin::user").load(user2, "roles", { roles: { fields: ["id"] } }) ?? // If the query fails somehow, default to an empty array
1531
+ []
1532
+ );
1533
+ const isLocked = lockedRoles.some(
1534
+ (lockedId) => (
1535
+ // lockedRoles will be a string to avoid issues with frontend and bigints
1536
+ roles2.some((role2) => lockedId === role2.id.toString())
1537
+ )
1538
+ );
1539
+ return isLocked;
1540
+ };
1541
+ const { ApplicationError: ApplicationError$6 } = utils$1.errors;
1542
+ const forgotPassword = async ({ email: email2 } = {}) => {
1543
+ const user2 = await strapi.query("admin::user").findOne({ where: { email: email2, isActive: true } });
1544
+ if (!user2 || await isSsoLocked(user2)) {
1545
+ return;
1546
+ }
1547
+ const resetPasswordToken = getService("token").createToken();
1548
+ await getService("user").updateById(user2.id, { resetPasswordToken });
1549
+ const url = `${utils$1.getAbsoluteAdminUrl(
1550
+ strapi.config
1551
+ )}/auth/reset-password?code=${resetPasswordToken}`;
1552
+ return strapi.plugin("email").service("email").sendTemplatedEmail(
1553
+ {
1554
+ to: user2.email,
1555
+ from: strapi.config.get("admin.forgotPassword.from"),
1556
+ replyTo: strapi.config.get("admin.forgotPassword.replyTo")
1557
+ },
1558
+ strapi.config.get("admin.forgotPassword.emailTemplate"),
1559
+ {
1560
+ url,
1561
+ user: ___default.default.pick(user2, ["email", "firstname", "lastname", "username"])
1562
+ }
1563
+ ).catch((err) => {
1564
+ strapi.log.error(err);
1565
+ });
1566
+ };
1567
+ const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
1568
+ const matchingUser = await strapi.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
1569
+ if (!matchingUser || await isSsoLocked(matchingUser)) {
1570
+ throw new ApplicationError$6();
1571
+ }
1572
+ return getService("user").updateById(matchingUser.id, {
1573
+ password: password2,
1574
+ resetPasswordToken: null
1575
+ });
1576
+ };
1577
+ const auth = {
1578
+ forgotPassword,
1579
+ resetPassword
1580
+ };
1581
+ const createLocalStrategy = (strapi2, middleware) => {
1582
+ return new passportLocal.Strategy(
1583
+ {
1584
+ usernameField: "email",
1585
+ passwordField: "password",
1586
+ session: false
1587
+ },
1588
+ (email2, password2, done) => {
1589
+ return getService$1("auth").checkCredentials({ email: fp.toLower(email2), password: password2 }).then(async ([error, user2, message]) => {
1590
+ if (middleware) {
1591
+ return middleware([error, user2, message], done);
1592
+ }
1593
+ return done(error, user2, message);
1594
+ }).catch((error) => done(error));
1595
+ }
1596
+ );
1597
+ };
1598
+ const authEventsMapper = {
1599
+ onConnectionSuccess: "admin.auth.success",
1600
+ onConnectionError: "admin.auth.error"
1601
+ };
1602
+ const valueIsFunctionType = ([, value]) => fp.isFunction(value);
1603
+ const keyIsValidEventName = ([key]) => {
1604
+ return Object.keys(strapi.admin.services.passport.authEventsMapper).includes(key);
1605
+ };
1606
+ const getPassportStrategies$1 = () => [createLocalStrategy(strapi)];
1607
+ const registerAuthEvents = () => {
1608
+ const { events = {} } = strapi.config.get("admin.auth", {});
1609
+ const { authEventsMapper: authEventsMapper2 } = strapi.admin.services.passport;
1610
+ const eventList = Object.entries(events).filter(keyIsValidEventName).filter(valueIsFunctionType);
1611
+ for (const [eventName, handler] of eventList) {
1612
+ strapi.eventHub.on(authEventsMapper2[eventName], handler);
1613
+ }
1614
+ };
1615
+ const init = () => {
1616
+ strapi.admin.services.passport.getPassportStrategies().forEach((strategy) => passport__default.default.use(strategy));
1617
+ registerAuthEvents();
1618
+ return passport__default.default.initialize();
1619
+ };
1620
+ const passport$1 = { init, getPassportStrategies: getPassportStrategies$1, authEventsMapper };
1621
+ const createProviderRegistry = () => {
1622
+ const registry = /* @__PURE__ */ new Map();
1623
+ Object.assign(registry, {
1624
+ register(provider) {
1625
+ if (strapi.isLoaded) {
1626
+ throw new Error(`You can't register new provider after the bootstrap`);
1627
+ }
1628
+ this.set(provider.uid, provider);
1629
+ },
1630
+ registerMany(providers) {
1631
+ providers.forEach((provider) => {
1632
+ this.register(provider);
1633
+ });
1634
+ },
1635
+ getAll() {
1636
+ return Array.from(this.values());
1637
+ }
1638
+ });
1639
+ return registry;
1640
+ };
1641
+ const providerRegistry = createProviderRegistry();
1642
+ const errorMessage = "SSO is disabled. Its functionnalities cannot be accessed.";
1643
+ const getStrategyCallbackURL = (providerName) => {
1644
+ if (!EE__default.default.features.isEnabled("sso")) {
1645
+ throw new Error(errorMessage);
1646
+ }
1647
+ return `/admin/connect/${providerName}`;
1648
+ };
1649
+ const syncProviderRegistryWithConfig = () => {
1650
+ if (!EE__default.default.features.isEnabled("sso")) {
1651
+ throw new Error(errorMessage);
1652
+ }
1653
+ const { providers = [] } = strapi.config.get("admin.auth", {});
1654
+ providerRegistry.registerMany(providers);
1655
+ };
1656
+ const SSOAuthEventsMapper = {
1657
+ onSSOAutoRegistration: "admin.auth.autoRegistration"
1658
+ };
1659
+ const sso = {
1660
+ providerRegistry,
1661
+ getStrategyCallbackURL,
1662
+ syncProviderRegistryWithConfig,
1663
+ authEventsMapper: { ...passport$1.authEventsMapper, ...SSOAuthEventsMapper }
1664
+ };
1665
+ const { UnauthorizedError } = utils$1.errors;
1666
+ const localStrategyMiddleware = async ([error, user2, message], done) => {
1667
+ if (user2 && !error && await isSsoLocked(user2)) {
1668
+ return done(
1669
+ new UnauthorizedError("Login not allowed, please contact your administrator", {
1670
+ code: "LOGIN_NOT_ALLOWED"
1671
+ }),
1672
+ user2,
1673
+ message
1674
+ );
1675
+ }
1676
+ return done(error, user2, message);
1677
+ };
1678
+ const getPassportStrategies = () => {
1679
+ if (!EE__default.default.features.isEnabled("sso")) {
1680
+ return [createLocalStrategy(strapi)];
1681
+ }
1682
+ const localStrategy = createLocalStrategy(strapi, localStrategyMiddleware);
1683
+ if (!strapi.isLoaded) {
1684
+ sso.syncProviderRegistryWithConfig();
1685
+ }
1686
+ const providers = sso.providerRegistry.getAll();
1687
+ const strategies = providers.map((provider) => provider.createStrategy(strapi));
1688
+ return [localStrategy, ...strategies];
1689
+ };
1690
+ const passport = {
1691
+ getPassportStrategies,
1692
+ ...sso
1693
+ };
1694
+ const { ApplicationError: ApplicationError$5 } = utils$1.errors;
1695
+ const ssoCheckRolesIdForDeletion = async (ids) => {
1696
+ const adminStore = await strapi.store({ type: "core", name: "admin" });
1697
+ const {
1698
+ providers: { defaultRole }
1699
+ } = await adminStore.get({ key: "auth" });
1700
+ for (const roleId of ids) {
1701
+ if (defaultRole && fp.toString(defaultRole) === fp.toString(roleId)) {
1702
+ throw new ApplicationError$5(
1703
+ "This role is used as the default SSO role. Make sure to change this configuration before deleting the role"
1704
+ );
1705
+ }
1706
+ }
1707
+ };
1708
+ const role$1 = {
1709
+ ssoCheckRolesIdForDeletion
1710
+ };
1711
+ const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$2 } = constants;
1712
+ const hasSuperAdminRole = (user2) => {
1713
+ return user2.roles.filter((role2) => role2.code === SUPER_ADMIN_CODE$2).length > 0;
1714
+ };
1715
+ const { ValidationError: ValidationError$3 } = utils$1.errors;
1716
+ const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$1 } = constants;
1717
+ const updateEEDisabledUsersList = async (id, input) => {
1718
+ const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
1719
+ if (!disabledUsers) {
1720
+ return;
1721
+ }
1722
+ const user2 = disabledUsers.find((user22) => user22.id === Number(id));
1723
+ if (!user2) {
1724
+ return;
1725
+ }
1726
+ if (user2.isActive !== input.isActive) {
1727
+ const newDisabledUsersList = disabledUsers.filter((user22) => user22.id !== Number(id));
1728
+ await strapi.store.set({
1729
+ type: "ee",
1730
+ key: "disabled_users",
1731
+ value: newDisabledUsersList
1732
+ });
1733
+ }
1734
+ };
1735
+ const castNumberArray = fp.pipe(fp.castArray, fp.map(fp.toNumber));
1736
+ const removeFromEEDisabledUsersList = async (ids) => {
1737
+ let idsToCheck;
1738
+ if (typeof ids === "object") {
1739
+ idsToCheck = castNumberArray(ids);
1740
+ } else {
1741
+ idsToCheck = [Number(ids)];
1742
+ }
1743
+ const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
1744
+ if (!disabledUsers) {
1745
+ return;
1746
+ }
1747
+ const newDisabledUsersList = disabledUsers.filter((user2) => !idsToCheck.includes(user2.id));
1748
+ await strapi.store.set({
1749
+ type: "ee",
1750
+ key: "disabled_users",
1751
+ value: newDisabledUsersList
1752
+ });
1753
+ };
1754
+ const updateById = async (id, attributes) => {
1755
+ if (___default.default.has(attributes, "roles")) {
1756
+ const lastAdminUser = await isLastSuperAdminUser(id);
1757
+ const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
1758
+ const willRemoveSuperAdminRole = !utils$1.stringIncludes(attributes.roles, superAdminRole.id);
1759
+ if (lastAdminUser && willRemoveSuperAdminRole) {
1760
+ throw new ValidationError$3("You must have at least one user with super admin role.");
1761
+ }
1762
+ }
1763
+ if (attributes.isActive === false) {
1764
+ const lastAdminUser = await isLastSuperAdminUser(id);
1765
+ if (lastAdminUser) {
1766
+ throw new ValidationError$3("You must have at least one user with super admin role.");
1767
+ }
1768
+ }
1769
+ if (___default.default.has(attributes, "password")) {
1770
+ const hashedPassword = await getService("auth").hashPassword(attributes.password);
1771
+ const updatedUser2 = await strapi.query("admin::user").update({
1772
+ where: { id },
1773
+ data: {
1774
+ ...attributes,
1775
+ password: hashedPassword
1776
+ },
1777
+ populate: ["roles"]
1778
+ });
1779
+ strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser2) });
1780
+ return updatedUser2;
1781
+ }
1782
+ const updatedUser = await strapi.query("admin::user").update({
1783
+ where: { id },
1784
+ data: attributes,
1785
+ populate: ["roles"]
1786
+ });
1787
+ await updateEEDisabledUsersList(id, attributes);
1788
+ if (updatedUser) {
1789
+ strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser) });
1790
+ }
1791
+ return updatedUser;
1792
+ };
1793
+ const deleteById = async (id) => {
1794
+ const userToDelete = await strapi.query("admin::user").findOne({
1795
+ where: { id },
1796
+ populate: ["roles"]
1797
+ });
1798
+ if (!userToDelete) {
1799
+ return null;
1800
+ }
1801
+ if (userToDelete) {
1802
+ if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE$1)) {
1803
+ const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
1804
+ if (superAdminRole.usersCount === 1) {
1805
+ throw new ValidationError$3("You must have at least one user with super admin role.");
1806
+ }
1807
+ }
1808
+ }
1809
+ const deletedUser = await strapi.query("admin::user").delete({ where: { id }, populate: ["roles"] });
1810
+ await removeFromEEDisabledUsersList(id);
1811
+ strapi.eventHub.emit("user.delete", { user: sanitizeUser(deletedUser) });
1812
+ return deletedUser;
1813
+ };
1814
+ const deleteByIds = async (ids) => {
1815
+ const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
1816
+ const nbOfSuperAdminToDelete = await strapi.query("admin::user").count({
1817
+ where: {
1818
+ id: ids,
1819
+ roles: { id: superAdminRole.id }
1820
+ }
1821
+ });
1822
+ if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {
1823
+ throw new ValidationError$3("You must have at least one user with super admin role.");
1824
+ }
1825
+ const deletedUsers = [];
1826
+ for (const id of ids) {
1827
+ const deletedUser = await strapi.query("admin::user").delete({
1828
+ where: { id },
1829
+ populate: ["roles"]
1830
+ });
1831
+ deletedUsers.push(deletedUser);
1832
+ }
1833
+ await removeFromEEDisabledUsersList(ids);
1834
+ strapi.eventHub.emit("user.delete", {
1835
+ users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser))
1836
+ });
1837
+ return deletedUsers;
1838
+ };
1839
+ const sanitizeUserRoles = (role2) => ___default.default.pick(role2, ["id", "name", "description", "code"]);
1840
+ const isLastSuperAdminUser = async (userId) => {
1841
+ const user2 = await findOne(userId);
1842
+ const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
1843
+ return superAdminRole.usersCount === 1 && hasSuperAdminRole(user2);
1844
+ };
1845
+ const sanitizeUser = (user2) => {
1846
+ return {
1847
+ ...___default.default.omit(user2, ["password", "resetPasswordToken", "registrationToken", "roles"]),
1848
+ roles: user2.roles && user2.roles.map(sanitizeUserRoles)
1849
+ };
1850
+ };
1851
+ const findOne = async (id, populate = ["roles"]) => {
1852
+ return strapi.entityService.findOne("admin::user", id, { populate });
1853
+ };
1854
+ const getCurrentActiveUserCount = async () => {
1855
+ return strapi.db.query("admin::user").count({ where: { isActive: true } });
1856
+ };
1857
+ const user$1 = {
1858
+ updateEEDisabledUsersList,
1859
+ removeFromEEDisabledUsersList,
1860
+ getCurrentActiveUserCount,
1861
+ deleteByIds,
1862
+ deleteById,
1863
+ updateById
1864
+ };
1865
+ const { SUPER_ADMIN_CODE } = constants;
1866
+ const getDisabledUserList = async () => {
1867
+ return strapi.store.get({ type: "ee", key: "disabled_users" });
1868
+ };
1869
+ const enableMaximumUserCount = async (numberOfUsersToEnable) => {
1870
+ const disabledUsers = await getDisabledUserList();
1871
+ const orderedDisabledUsers = fp.reverse(disabledUsers);
1872
+ const usersToEnable = fp.take(numberOfUsersToEnable, orderedDisabledUsers);
1873
+ await strapi.db.query("admin::user").updateMany({
1874
+ where: { id: fp.map(fp.prop("id"), usersToEnable) },
1875
+ data: { isActive: true }
1876
+ });
1877
+ const remainingDisabledUsers = fp.drop(numberOfUsersToEnable, orderedDisabledUsers);
1878
+ await strapi.store.set({
1879
+ type: "ee",
1880
+ key: "disabled_users",
1881
+ value: remainingDisabledUsers
1882
+ });
1883
+ };
1884
+ const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable) => {
1885
+ const currentlyDisabledUsers = await getDisabledUserList() ?? [];
1886
+ const usersToDisable = [];
1887
+ const nonSuperAdminUsersToDisable = await strapi.db.query("admin::user").findMany({
1888
+ where: {
1889
+ isActive: true,
1890
+ roles: {
1891
+ code: { $ne: SUPER_ADMIN_CODE }
1892
+ }
1893
+ },
1894
+ orderBy: { createdAt: "DESC" },
1895
+ limit: numberOfUsersToDisable
1896
+ });
1897
+ usersToDisable.push(...nonSuperAdminUsersToDisable);
1898
+ if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {
1899
+ const superAdminUsersToDisable = await strapi.db.query("admin::user").findMany({
1900
+ where: {
1901
+ isActive: true,
1902
+ roles: { code: SUPER_ADMIN_CODE }
1903
+ },
1904
+ orderBy: { createdAt: "DESC" },
1905
+ limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length
1906
+ });
1907
+ usersToDisable.push(...superAdminUsersToDisable);
1908
+ }
1909
+ await strapi.db.query("admin::user").updateMany({
1910
+ where: { id: fp.map(fp.prop("id"), usersToDisable) },
1911
+ data: { isActive: false }
1912
+ });
1913
+ await strapi.store.set({
1914
+ type: "ee",
1915
+ key: "disabled_users",
1916
+ value: currentlyDisabledUsers.concat(fp.map(fp.pick(["id", "isActive"]), usersToDisable))
1917
+ });
1918
+ };
1919
+ const syncDisabledUserRecords = async () => {
1920
+ const disabledUsers = await strapi.store.get({ type: "ee", key: "disabled_users" });
1921
+ if (!disabledUsers) {
1922
+ return;
1923
+ }
1924
+ await strapi.db.query("admin::user").updateMany({
1925
+ where: { id: fp.map(fp.prop("id"), disabledUsers) },
1926
+ data: { isActive: false }
1927
+ });
1928
+ };
1929
+ const seatEnforcementWorkflow = async () => {
1930
+ const adminSeats = EE__default.default.seats;
1931
+ if (fp.isNil(adminSeats)) {
1932
+ return;
1933
+ }
1934
+ await syncDisabledUserRecords();
1935
+ const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
1936
+ const adminSeatsLeft = adminSeats - currentActiveUserCount;
1937
+ if (adminSeatsLeft > 0) {
1938
+ await enableMaximumUserCount(adminSeatsLeft);
1939
+ } else if (adminSeatsLeft < 0) {
1940
+ await disableUsersAboveLicenseLimit(-adminSeatsLeft);
1941
+ }
1942
+ };
1943
+ const seatEnforcement = {
1944
+ seatEnforcementWorkflow,
1945
+ getDisabledUserList
1946
+ };
1947
+ const workflowsContentTypesFactory = ({ strapi: strapi2 }) => {
1948
+ const contentManagerContentTypeService = strapi2.plugin("content-manager").service("content-types");
1949
+ const stagesService = getService("stages", { strapi: strapi2 });
1950
+ const updateContentTypeConfig = async (uid, reviewWorkflowOption) => {
1951
+ const modelConfig = await contentManagerContentTypeService.findConfiguration(uid);
1952
+ await contentManagerContentTypeService.updateConfiguration(
1953
+ { uid },
1954
+ { options: fp.merge(modelConfig.options, { reviewWorkflows: reviewWorkflowOption }) }
1955
+ );
1956
+ };
1957
+ return {
1958
+ /**
1959
+ * Migrates entities stages. Used when a content type is assigned to a workflow.
1960
+ * @param {*} options
1961
+ * @param {Array<string>} options.srcContentTypes - The content types assigned to the previous workflow
1962
+ * @param {Array<string>} options.destContentTypes - The content types assigned to the new workflow
1963
+ * @param {Workflow.Stage} options.stageId - The new stage to assign the entities to
1964
+ */
1965
+ async migrate({ srcContentTypes = [], destContentTypes, stageId }) {
1966
+ const workflowsService = getService("workflows", { strapi: strapi2 });
1967
+ const { created, deleted } = diffContentTypes(srcContentTypes, destContentTypes);
1968
+ await utils$1.mapAsync(
1969
+ created,
1970
+ async (uid) => {
1971
+ const srcWorkflows = await workflowsService._getAssignedWorkflows(uid, {});
1972
+ if (srcWorkflows.length) {
1973
+ await stagesService.updateEntitiesStage(uid, { toStageId: stageId });
1974
+ await utils$1.mapAsync(
1975
+ srcWorkflows,
1976
+ (srcWorkflow) => this.transferContentTypes(srcWorkflow, uid)
1977
+ );
1978
+ }
1979
+ await updateContentTypeConfig(uid, true);
1980
+ return stagesService.updateEntitiesStage(uid, {
1981
+ fromStageId: null,
1982
+ toStageId: stageId
1983
+ });
1984
+ },
1985
+ // transferContentTypes can cause race conditions if called in parallel when updating the same workflow
1986
+ { concurrency: 1 }
1987
+ );
1988
+ await utils$1.mapAsync(deleted, async (uid) => {
1989
+ await updateContentTypeConfig(uid, false);
1990
+ await stagesService.deleteAllEntitiesStage(uid, {});
1991
+ });
1992
+ },
1993
+ /**
1994
+ * Filters the content types assigned to a workflow
1995
+ * @param {Workflow} srcWorkflow - The workflow to transfer from
1996
+ * @param {string} uid - The content type uid
1997
+ */
1998
+ async transferContentTypes(srcWorkflow, uid) {
1999
+ await strapi2.entityService.update(WORKFLOW_MODEL_UID, srcWorkflow.id, {
2000
+ data: {
2001
+ contentTypes: srcWorkflow.contentTypes.filter((contentType) => contentType !== uid)
2002
+ }
2003
+ });
2004
+ }
2005
+ };
2006
+ };
2007
+ const diffContentTypes = (srcContentTypes, destContentTypes) => {
2008
+ const created = fp.difference(destContentTypes, srcContentTypes);
2009
+ const deleted = fp.difference(srcContentTypes, destContentTypes);
2010
+ return { created, deleted };
2011
+ };
2012
+ const { ApplicationError: ApplicationError$4 } = utils$1.errors;
2013
+ const processFilters = ({ strapi: strapi2 }, filters = {}) => {
2014
+ const processedFilters = { ...filters };
2015
+ if (fp.isString(filters.contentTypes)) {
2016
+ processedFilters.contentTypes = getWorkflowContentTypeFilter({ strapi: strapi2 }, filters.contentTypes);
2017
+ }
2018
+ return processedFilters;
2019
+ };
2020
+ const processPopulate = (populate) => {
2021
+ if (!populate) {
2022
+ return populate;
2023
+ }
2024
+ return WORKFLOW_POPULATE;
2025
+ };
2026
+ const workflows$1 = ({ strapi: strapi2 }) => {
2027
+ const workflowsContentTypes = workflowsContentTypesFactory({ strapi: strapi2 });
2028
+ const workflowsValidationService = getService("review-workflows-validation", { strapi: strapi2 });
2029
+ const metrics = getService("review-workflows-metrics", { strapi: strapi2 });
2030
+ return {
2031
+ /**
2032
+ * Returns all the workflows matching the user-defined filters.
2033
+ * @param {object} opts - Options for the query.
2034
+ * @param {object} opts.filters - Filters object.
2035
+ * @returns {Promise<object[]>} - List of workflows that match the user's filters.
2036
+ */
2037
+ async find(opts = {}) {
2038
+ const filters = processFilters({ strapi: strapi2 }, opts.filters);
2039
+ const populate = processPopulate(opts.populate);
2040
+ return strapi2.entityService.findMany(WORKFLOW_MODEL_UID, { ...opts, filters, populate });
2041
+ },
2042
+ /**
2043
+ * Returns the workflow with the specified ID.
2044
+ * @param {string} id - ID of the requested workflow.
2045
+ * @param {object} opts - Options for the query.
2046
+ * @returns {Promise<object>} - Workflow object matching the requested ID.
2047
+ */
2048
+ findById(id, opts) {
2049
+ const populate = processPopulate(opts.populate);
2050
+ return strapi2.entityService.findOne(WORKFLOW_MODEL_UID, id, { ...opts, populate });
2051
+ },
2052
+ /**
2053
+ * Creates a new workflow.
2054
+ * @param {object} opts - Options for creating the new workflow.
2055
+ * @returns {Promise<object>} - Workflow object that was just created.
2056
+ * @throws {ValidationError} - If the workflow has no stages.
2057
+ */
2058
+ async create(opts) {
2059
+ let createOpts = { ...opts, populate: WORKFLOW_POPULATE };
2060
+ workflowsValidationService.validateWorkflowStages(opts.data.stages);
2061
+ await workflowsValidationService.validateWorkflowCount(1);
2062
+ return strapi2.db.transaction(async () => {
2063
+ const stages2 = await getService("stages", { strapi: strapi2 }).createMany(opts.data.stages);
2064
+ const mapIds = fp.map(fp.get("id"));
2065
+ createOpts = fp.set("data.stages", mapIds(stages2), createOpts);
2066
+ if (opts.data.contentTypes) {
2067
+ await workflowsContentTypes.migrate({
2068
+ destContentTypes: opts.data.contentTypes,
2069
+ stageId: stages2[0].id
2070
+ });
2071
+ }
2072
+ metrics.sendDidCreateWorkflow();
2073
+ return strapi2.entityService.create(WORKFLOW_MODEL_UID, createOpts);
2074
+ });
2075
+ },
2076
+ /**
2077
+ * Updates an existing workflow.
2078
+ * @param {object} workflow - The existing workflow to update.
2079
+ * @param {object} opts - Options for updating the workflow.
2080
+ * @returns {Promise<object>} - Workflow object that was just updated.
2081
+ * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.
2082
+ */
2083
+ async update(workflow2, opts) {
2084
+ const stageService = getService("stages", { strapi: strapi2 });
2085
+ let updateOpts = { ...opts, populate: { ...WORKFLOW_POPULATE } };
2086
+ let updatedStageIds;
2087
+ await workflowsValidationService.validateWorkflowCount();
2088
+ return strapi2.db.transaction(async () => {
2089
+ if (opts.data.stages) {
2090
+ workflowsValidationService.validateWorkflowStages(opts.data.stages);
2091
+ opts.data.stages.forEach(
2092
+ (stage) => this.assertStageBelongsToWorkflow(stage.id, workflow2)
2093
+ );
2094
+ updatedStageIds = await stageService.replaceStages(workflow2.stages, opts.data.stages, workflow2.contentTypes).then((stages2) => stages2.map((stage) => stage.id));
2095
+ updateOpts = fp.set("data.stages", updatedStageIds, updateOpts);
2096
+ }
2097
+ if (opts.data.contentTypes) {
2098
+ await workflowsContentTypes.migrate({
2099
+ srcContentTypes: workflow2.contentTypes,
2100
+ destContentTypes: opts.data.contentTypes,
2101
+ stageId: updatedStageIds ? updatedStageIds[0] : workflow2.stages[0].id
2102
+ });
2103
+ }
2104
+ metrics.sendDidEditWorkflow();
2105
+ return strapi2.entityService.update(WORKFLOW_MODEL_UID, workflow2.id, updateOpts);
2106
+ });
2107
+ },
2108
+ /**
2109
+ * Deletes an existing workflow.
2110
+ * Also deletes all the workflow stages and migrate all assigned the content types.
2111
+ * @param {*} workflow
2112
+ * @param {*} opts
2113
+ * @returns
2114
+ */
2115
+ async delete(workflow2, opts) {
2116
+ const stageService = getService("stages", { strapi: strapi2 });
2117
+ const workflowCount = await this.count();
2118
+ if (workflowCount <= 1) {
2119
+ throw new ApplicationError$4("Can not delete the last workflow");
2120
+ }
2121
+ return strapi2.db.transaction(async () => {
2122
+ await stageService.deleteMany(workflow2.stages);
2123
+ await workflowsContentTypes.migrate({
2124
+ srcContentTypes: workflow2.contentTypes,
2125
+ destContentTypes: []
2126
+ });
2127
+ return strapi2.entityService.delete(WORKFLOW_MODEL_UID, workflow2.id, opts);
2128
+ });
2129
+ },
2130
+ /**
2131
+ * Returns the total count of workflows.
2132
+ * @returns {Promise<number>} - Total count of workflows.
2133
+ */
2134
+ count() {
2135
+ return strapi2.entityService.count(WORKFLOW_MODEL_UID);
2136
+ },
2137
+ /**
2138
+ * Finds the assigned workflow for a given content type ID.
2139
+ * @param {string} uid - Content type ID to find the assigned workflow for.
2140
+ * @param {object} opts - Options for the query.
2141
+ * @returns {Promise<object|null>} - Assigned workflow object if found, or null.
2142
+ */
2143
+ async getAssignedWorkflow(uid, opts = {}) {
2144
+ const workflows2 = await this._getAssignedWorkflows(uid, opts);
2145
+ return workflows2.length > 0 ? workflows2[0] : null;
2146
+ },
2147
+ /**
2148
+ * Finds all the assigned workflows for a given content type ID.
2149
+ * Normally, there should only be one workflow assigned to a content type.
2150
+ * However, edge cases can occur where a content type is assigned to multiple workflows.
2151
+ * @param {string} uid - Content type ID to find the assigned workflows for.
2152
+ * @param {object} opts - Options for the query.
2153
+ * @returns {Promise<object[]>} - List of assigned workflow objects.
2154
+ */
2155
+ async _getAssignedWorkflows(uid, opts = {}) {
2156
+ return this.find({
2157
+ ...opts,
2158
+ filters: { contentTypes: getWorkflowContentTypeFilter({ strapi: strapi2 }, uid) }
2159
+ });
2160
+ },
2161
+ /**
2162
+ * Asserts that a content type has an assigned workflow.
2163
+ * @param {string} uid - Content type ID to verify the assignment of.
2164
+ * @returns {Promise<object>} - Workflow object associated with the content type ID.
2165
+ * @throws {ApplicationError} - If no assigned workflow is found for the content type ID.
2166
+ */
2167
+ async assertContentTypeBelongsToWorkflow(uid) {
2168
+ const workflow2 = await this.getAssignedWorkflow(uid, {
2169
+ populate: "stages"
2170
+ });
2171
+ if (!workflow2) {
2172
+ throw new ApplicationError$4(`Review workflows is not activated on Content Type ${uid}.`);
2173
+ }
2174
+ return workflow2;
2175
+ },
2176
+ /**
2177
+ * Asserts that a stage belongs to a given workflow.
2178
+ * @param {string} stageId - ID of stage to check.
2179
+ * @param {object} workflow - Workflow object to check against.
2180
+ * @returns
2181
+ * @throws {ApplicationError} - If the stage does not belong to the specified workflow.
2182
+ */
2183
+ assertStageBelongsToWorkflow(stageId, workflow2) {
2184
+ if (!stageId) {
2185
+ return;
2186
+ }
2187
+ const belongs = workflow2.stages.some((stage) => stage.id === stageId);
2188
+ if (!belongs) {
2189
+ throw new ApplicationError$4(`Stage does not belong to workflow "${workflow2.name}"`);
2190
+ }
2191
+ }
2192
+ };
2193
+ };
2194
+ const { ApplicationError: ApplicationError$3, ValidationError: ValidationError$2 } = utils$1.errors;
2195
+ const sanitizedStageFields = ["id", "name", "workflow", "color"];
2196
+ const sanitizeStageFields = fp.pick(sanitizedStageFields);
2197
+ const stages$1 = ({ strapi: strapi2 }) => {
2198
+ const metrics = getService("review-workflows-metrics", { strapi: strapi2 });
2199
+ const stagePermissionsService = getService("stage-permissions", { strapi: strapi2 });
2200
+ const workflowsValidationService = getService("review-workflows-validation", { strapi: strapi2 });
2201
+ return {
2202
+ find({ workflowId, populate }) {
2203
+ const params = {
2204
+ filters: { workflow: workflowId },
2205
+ populate
2206
+ };
2207
+ return strapi2.entityService.findMany(STAGE_MODEL_UID, params);
2208
+ },
2209
+ findById(id, { populate } = {}) {
2210
+ const params = {
2211
+ populate
2212
+ };
2213
+ return strapi2.entityService.findOne(STAGE_MODEL_UID, id, params);
2214
+ },
2215
+ async createMany(stagesList, { fields } = {}) {
2216
+ const params = { select: fields ?? "*" };
2217
+ const stages2 = await Promise.all(
2218
+ stagesList.map(
2219
+ (stage) => strapi2.entityService.create(STAGE_MODEL_UID, {
2220
+ data: sanitizeStageFields(stage),
2221
+ ...params
2222
+ })
2223
+ )
2224
+ );
2225
+ await utils$1.reduceAsync(stagesList)(async (_2, stage, idx) => {
2226
+ if (!stage.permissions || stage.permissions.length === 0) {
2227
+ return;
2228
+ }
2229
+ const stagePermissions2 = stage.permissions;
2230
+ const stageId = stages2[idx].id;
2231
+ const permissions = await utils$1.mapAsync(
2232
+ stagePermissions2,
2233
+ // Register each stage permission
2234
+ (permission2) => stagePermissionsService.register({
2235
+ roleId: permission2.role,
2236
+ action: permission2.action,
2237
+ fromStage: stageId
2238
+ })
2239
+ );
2240
+ await strapi2.entityService.update(STAGE_MODEL_UID, stageId, {
2241
+ data: {
2242
+ permissions: permissions.flat().map((p) => p.id)
2243
+ }
2244
+ });
2245
+ }, []);
2246
+ metrics.sendDidCreateStage();
2247
+ return stages2;
2248
+ },
2249
+ async update(srcStage, destStage) {
2250
+ let stagePermissions2 = srcStage?.permissions ?? [];
2251
+ const stageId = destStage.id;
2252
+ if (destStage.permissions) {
2253
+ await this.deleteStagePermissions([srcStage]);
2254
+ const permissions = await utils$1.mapAsync(
2255
+ destStage.permissions,
2256
+ (permission2) => stagePermissionsService.register({
2257
+ roleId: permission2.role,
2258
+ action: permission2.action,
2259
+ fromStage: stageId
2260
+ })
2261
+ );
2262
+ stagePermissions2 = permissions.flat().map((p) => p.id);
2263
+ }
2264
+ const stage = await strapi2.entityService.update(STAGE_MODEL_UID, stageId, {
2265
+ data: {
2266
+ ...destStage,
2267
+ permissions: stagePermissions2
2268
+ }
2269
+ });
2270
+ metrics.sendDidEditStage();
2271
+ return stage;
2272
+ },
2273
+ async delete(stage) {
2274
+ await this.deleteStagePermissions([stage]);
2275
+ const deletedStage = await strapi2.entityService.delete(STAGE_MODEL_UID, stage.id);
2276
+ metrics.sendDidDeleteStage();
2277
+ return deletedStage;
2278
+ },
2279
+ async deleteMany(stages2) {
2280
+ await this.deleteStagePermissions(stages2);
2281
+ return strapi2.entityService.deleteMany(STAGE_MODEL_UID, {
2282
+ filters: { id: { $in: stages2.map((s) => s.id) } }
2283
+ });
2284
+ },
2285
+ async deleteStagePermissions(stages2) {
2286
+ const permissions = stages2.map((s) => s.permissions || []).flat();
2287
+ await stagePermissionsService.unregister(permissions || []);
2288
+ },
2289
+ count({ workflowId } = {}) {
2290
+ const opts = {};
2291
+ if (workflowId) {
2292
+ opts.where = {
2293
+ workflow: workflowId
2294
+ };
2295
+ }
2296
+ return strapi2.entityService.count(STAGE_MODEL_UID, opts);
2297
+ },
2298
+ async replaceStages(srcStages, destStages, contentTypesToMigrate = []) {
2299
+ const { created, updated, deleted } = getDiffBetweenStages(srcStages, destStages);
2300
+ assertAtLeastOneStageRemain(srcStages || [], { created, deleted });
2301
+ return strapi2.db.transaction(async ({ trx }) => {
2302
+ const createdStages = await this.createMany(created, { fields: ["id"] });
2303
+ const createdStagesIds = fp.map("id", createdStages);
2304
+ await utils$1.mapAsync(updated, (destStage) => {
2305
+ const srcStage = srcStages.find((s) => s.id === destStage.id);
2306
+ return this.update(srcStage, destStage);
2307
+ });
2308
+ await utils$1.mapAsync(deleted, async (stage) => {
2309
+ const nearestStage = findNearestMatchingStage(
2310
+ [...srcStages, ...createdStages],
2311
+ srcStages.findIndex((s) => s.id === stage.id),
2312
+ (targetStage) => {
2313
+ return !deleted.find((s) => s.id === targetStage.id);
2314
+ }
2315
+ );
2316
+ await utils$1.mapAsync(contentTypesToMigrate, (contentTypeUID) => {
2317
+ this.updateEntitiesStage(contentTypeUID, {
2318
+ fromStageId: stage.id,
2319
+ toStageId: nearestStage.id,
2320
+ trx
2321
+ });
2322
+ });
2323
+ return this.delete(stage);
2324
+ });
2325
+ return destStages.map((stage) => ({
2326
+ ...stage,
2327
+ id: stage.id ?? createdStagesIds.shift()
2328
+ }));
2329
+ });
2330
+ },
2331
+ /**
2332
+ * Update the stage of an entity
2333
+ *
2334
+ * @param {object} entityInfo
2335
+ * @param {number} entityInfo.id - Entity id
2336
+ * @param {string} entityInfo.modelUID - the content-type of the entity
2337
+ * @param {number} stageId - The id of the stage to assign to the entity
2338
+ */
2339
+ async updateEntity(entityInfo, stageId) {
2340
+ const stage = await this.findById(stageId);
2341
+ await workflowsValidationService.validateWorkflowCount();
2342
+ if (!stage) {
2343
+ throw new ApplicationError$3(`Selected stage does not exist`);
2344
+ }
2345
+ const entity = await strapi2.entityService.update(entityInfo.modelUID, entityInfo.id, {
2346
+ // @ts-expect-error - entity service can not receive any type of attribute
2347
+ data: { [ENTITY_STAGE_ATTRIBUTE]: stageId },
2348
+ populate: [ENTITY_STAGE_ATTRIBUTE]
2349
+ });
2350
+ metrics.sendDidChangeEntryStage();
2351
+ return entity;
2352
+ },
2353
+ /**
2354
+ * Updates entity stages of a content type:
2355
+ * - If fromStageId is undefined, all entities with an existing stage will be assigned the new stage
2356
+ * - If fromStageId is null, all entities without a stage will be assigned the new stage
2357
+ * - If fromStageId is a number, all entities with that stage will be assigned the new stage
2358
+ *
2359
+ * For performance reasons we use knex queries directly.
2360
+ *
2361
+ * @param {string} contentTypeUID
2362
+ * @param {number | undefined | null} fromStageId
2363
+ * @param {number} toStageId
2364
+ * @param {import('knex').Knex.Transaction} trx
2365
+ * @returns
2366
+ */
2367
+ async updateEntitiesStage(contentTypeUID, { fromStageId, toStageId }) {
2368
+ const { attributes, tableName } = strapi2.db.metadata.get(contentTypeUID);
2369
+ const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;
2370
+ const joinColumn = joinTable.joinColumn.name;
2371
+ const invJoinColumn = joinTable.inverseJoinColumn.name;
2372
+ await workflowsValidationService.validateWorkflowCount();
2373
+ return strapi2.db.transaction(async ({ trx }) => {
2374
+ if (fromStageId === void 0) {
2375
+ return strapi2.db.getConnection().from(joinTable.name).update({ [invJoinColumn]: toStageId }).transacting(trx);
2376
+ }
2377
+ const selectStatement = strapi2.db.getConnection().select({ [joinColumn]: "t1.id", [invJoinColumn]: toStageId }).from(`${tableName} as t1`).leftJoin(`${joinTable.name} as t2`, `t1.id`, `t2.${joinColumn}`).where(`t2.${invJoinColumn}`, fromStageId).toSQL();
2378
+ return strapi2.db.getConnection(joinTable.name).insert(
2379
+ strapi2.db.connection.raw(
2380
+ `(${joinColumn}, ${invJoinColumn}) ${selectStatement.sql}`,
2381
+ selectStatement.bindings
2382
+ )
2383
+ ).transacting(trx);
2384
+ });
2385
+ },
2386
+ /**
2387
+ * Deletes all entity stages of a content type
2388
+ * @param {string} contentTypeUID
2389
+ * @returns
2390
+ */
2391
+ async deleteAllEntitiesStage(contentTypeUID) {
2392
+ const { attributes } = strapi2.db.metadata.get(contentTypeUID);
2393
+ const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;
2394
+ return strapi2.db.transaction(
2395
+ async ({ trx }) => strapi2.db.getConnection().from(joinTable.name).delete().transacting(trx)
2396
+ );
2397
+ }
2398
+ };
2399
+ };
2400
+ function getDiffBetweenStages(sourceStages, comparisonStages) {
2401
+ const result = comparisonStages.reduce(
2402
+ // ...
2403
+ (acc, stageToCompare) => {
2404
+ const srcStage = sourceStages.find((stage) => stage.id === stageToCompare.id);
2405
+ if (!srcStage) {
2406
+ acc.created.push(stageToCompare);
2407
+ } else if (!fp.isEqual(
2408
+ fp.pick(["name", "color", "permissions"], srcStage),
2409
+ fp.pick(["name", "color", "permissions"], stageToCompare)
2410
+ )) {
2411
+ acc.updated.push(stageToCompare);
2412
+ }
2413
+ return acc;
2414
+ },
2415
+ { created: [], updated: [] }
2416
+ );
2417
+ result.deleted = sourceStages.filter(
2418
+ (srcStage) => !comparisonStages.some((cmpStage) => cmpStage.id === srcStage.id)
2419
+ );
2420
+ return result;
2421
+ }
2422
+ function assertAtLeastOneStageRemain(workflowStages, diffStages) {
2423
+ const remainingStagesCount = workflowStages.length - diffStages.deleted.length + diffStages.created.length;
2424
+ if (remainingStagesCount < 1) {
2425
+ throw new ValidationError$2(ERRORS.WORKFLOW_WITHOUT_STAGES);
2426
+ }
2427
+ }
2428
+ function findNearestMatchingStage(stages2, startIndex, condition) {
2429
+ for (let i = startIndex; i >= 0; i -= 1) {
2430
+ if (condition(stages2[i])) {
2431
+ return stages2[i];
2432
+ }
2433
+ }
2434
+ const remainingArray = stages2.slice(startIndex + 1);
2435
+ const nearestObject = remainingArray.filter(condition)[0];
2436
+ return nearestObject;
2437
+ }
2438
+ const { ApplicationError: ApplicationError$2 } = utils$1.errors;
2439
+ const validActions = [STAGE_TRANSITION_UID];
2440
+ const stagePermissions = ({ strapi: strapi2 }) => {
2441
+ const roleService = getService("role");
2442
+ const permissionService = getService("permission");
2443
+ return {
2444
+ async register({ roleId, action, fromStage }) {
2445
+ if (!validActions.includes(action)) {
2446
+ throw new ApplicationError$2(`Invalid action ${action}`);
2447
+ }
2448
+ const permissions = await roleService.addPermissions(roleId, [
2449
+ {
2450
+ action,
2451
+ actionParameters: {
2452
+ from: fromStage
2453
+ }
2454
+ }
2455
+ ]);
2456
+ return permissions;
2457
+ },
2458
+ async registerMany(permissions) {
2459
+ return utils$1.mapAsync(permissions, this.register);
2460
+ },
2461
+ async unregister(permissions) {
2462
+ const permissionIds = permissions.map(fp.prop("id"));
2463
+ await permissionService.deleteByIds(permissionIds);
2464
+ },
2465
+ can(action, fromStage) {
2466
+ const requestState = strapi2.requestContext.get()?.state;
2467
+ if (!requestState) {
2468
+ return false;
2469
+ }
2470
+ const userRoles = requestState.user?.roles;
2471
+ if (userRoles?.some((role2) => role2.code === "strapi-super-admin")) {
2472
+ return true;
2473
+ }
2474
+ return requestState.userAbility.can({
2475
+ name: action,
2476
+ params: { from: fromStage }
2477
+ });
2478
+ }
2479
+ };
2480
+ };
2481
+ const { ApplicationError: ApplicationError$1 } = utils$1.errors;
2482
+ const assignees$1 = ({ strapi: strapi2 }) => {
2483
+ const metrics = getService("review-workflows-metrics", { strapi: strapi2 });
2484
+ return {
2485
+ async findEntityAssigneeId(id, model) {
2486
+ const entity = await strapi2.entityService.findOne(model, id, {
2487
+ populate: [ENTITY_ASSIGNEE_ATTRIBUTE],
2488
+ fields: []
2489
+ });
2490
+ return entity?.[ENTITY_ASSIGNEE_ATTRIBUTE]?.id ?? null;
2491
+ },
2492
+ /**
2493
+ * Update the assignee of an entity
2494
+ */
2495
+ async updateEntityAssignee(id, model, assigneeId) {
2496
+ if (fp.isNil(assigneeId)) {
2497
+ return this.deleteEntityAssignee(id, model);
2498
+ }
2499
+ const userExists = await getService("user", { strapi: strapi2 }).exists({ id: assigneeId });
2500
+ if (!userExists) {
2501
+ throw new ApplicationError$1(`Selected user does not exist`);
2502
+ }
2503
+ metrics.sendDidEditAssignee(await this.findEntityAssigneeId(id, model), assigneeId);
2504
+ return strapi2.entityService.update(model, id, {
2505
+ // @ts-expect-error check entity service types
2506
+ data: { [ENTITY_ASSIGNEE_ATTRIBUTE]: assigneeId },
2507
+ populate: [ENTITY_ASSIGNEE_ATTRIBUTE],
2508
+ fields: []
2509
+ });
2510
+ },
2511
+ async deleteEntityAssignee(id, model) {
2512
+ metrics.sendDidEditAssignee(await this.findEntityAssigneeId(id, model), null);
2513
+ return strapi2.entityService.update(model, id, {
2514
+ // @ts-expect-error check entity service types
2515
+ data: { [ENTITY_ASSIGNEE_ATTRIBUTE]: null },
2516
+ populate: [ENTITY_ASSIGNEE_ATTRIBUTE],
2517
+ fields: []
2518
+ });
2519
+ }
2520
+ };
2521
+ };
2522
+ const defaultStages = [
2523
+ {
2524
+ name: "To do",
2525
+ color: "#4945FF"
2526
+ },
2527
+ {
2528
+ name: "Ready to review",
2529
+ color: "#9736E8"
2530
+ },
2531
+ {
2532
+ name: "In progress",
2533
+ color: "#EE5E52"
2534
+ },
2535
+ {
2536
+ name: "Reviewed",
2537
+ color: "#328048"
2538
+ }
2539
+ ];
2540
+ const WORKFLOW_UPDATE_STAGE = "review-workflows.updateEntryStage";
2541
+ const webhookEvents = {
2542
+ WORKFLOW_UPDATE_STAGE
2543
+ };
2544
+ const MAX_DB_TABLE_NAME_LEN = 63;
2545
+ const MAX_JOIN_TABLE_NAME_SUFFIX = 1 + ENTITY_STAGE_ATTRIBUTE.length + "_links_inv_fk".length;
2546
+ const MAX_CONTENT_TYPE_NAME_LEN = MAX_DB_TABLE_NAME_LEN - MAX_JOIN_TABLE_NAME_SUFFIX;
2547
+ const DEFAULT_OPTIONS = {
2548
+ numberOfWorkflows: MAX_WORKFLOWS,
2549
+ stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW
2550
+ };
2551
+ async function initDefaultWorkflow({ workflowsService, stagesService }) {
2552
+ const wfCount = await workflowsService.count();
2553
+ const stagesCount = await stagesService.count();
2554
+ if (wfCount === 0 && stagesCount === 0) {
2555
+ const workflow2 = {
2556
+ ...defaultWorkflow,
2557
+ stages: defaultStages
2558
+ };
2559
+ await workflowsService.create({ data: workflow2 });
2560
+ }
2561
+ }
2562
+ function extendReviewWorkflowContentTypes({ strapi: strapi2 }) {
2563
+ const extendContentType = (contentTypeUID) => {
2564
+ const assertContentTypeCompatibility = (contentType) => contentType.collectionName.length <= MAX_CONTENT_TYPE_NAME_LEN;
2565
+ const incompatibleContentTypeAlert = (contentType) => {
2566
+ strapi2.log.warn(
2567
+ `Review Workflow cannot be activated for the content type with the name '${contentType.info.displayName}' because the name exceeds the maximum length of ${MAX_CONTENT_TYPE_NAME_LEN} characters.`
2568
+ );
2569
+ return contentType;
2570
+ };
2571
+ const setRelation = (path2, target) => fp.set(path2, {
2572
+ writable: true,
2573
+ private: false,
2574
+ configurable: false,
2575
+ visible: false,
2576
+ useJoinTable: true,
2577
+ // We want a join table to persist data when downgrading to CE
2578
+ type: "relation",
2579
+ relation: "oneToOne",
2580
+ target
2581
+ });
2582
+ const setReviewWorkflowAttributes = fp.pipe([
2583
+ setRelation(`attributes.${ENTITY_STAGE_ATTRIBUTE}`, STAGE_MODEL_UID),
2584
+ setRelation(`attributes.${ENTITY_ASSIGNEE_ATTRIBUTE}`, "admin::user")
2585
+ ]);
2586
+ const extendContentTypeIfCompatible = fp.cond([
2587
+ [assertContentTypeCompatibility, setReviewWorkflowAttributes],
2588
+ [fp.stubTrue, incompatibleContentTypeAlert]
2589
+ ]);
2590
+ strapi2.container.get("content-types").extend(contentTypeUID, extendContentTypeIfCompatible);
2591
+ };
2592
+ fp.pipe([
2593
+ getVisibleContentTypesUID,
2594
+ // Iterate over UIDs to extend the content-type
2595
+ fp.forEach(extendContentType)
2596
+ ])(strapi2.contentTypes);
2597
+ }
2598
+ function persistStagesJoinTables({ strapi: strapi2 }) {
2599
+ return async ({ contentTypes }) => {
2600
+ const getStageTableToPersist = (contentTypeUID) => {
2601
+ const { attributes, tableName } = strapi2.db.metadata.get(contentTypeUID);
2602
+ const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;
2603
+ return { name: joinTableName, dependsOn: [{ name: tableName }] };
2604
+ };
2605
+ const joinTablesToPersist = fp.pipe([
2606
+ getVisibleContentTypesUID,
2607
+ fp.filter((uid) => hasStageAttribute(contentTypes[uid])),
2608
+ fp.map(getStageTableToPersist)
2609
+ ])(contentTypes);
2610
+ await removePersistedTablesWithSuffix("_strapi_stage_links");
2611
+ await persistTables(joinTablesToPersist);
2612
+ };
2613
+ }
2614
+ const registerWebhookEvents = async ({ strapi: strapi2 }) => Object.entries(webhookEvents).forEach(
2615
+ ([eventKey, event]) => strapi2.webhookStore.addAllowedEvent(eventKey, event)
2616
+ );
2617
+ const reviewWorkflows = ({ strapi: strapi2 }) => {
2618
+ const workflowsService = getService("workflows", { strapi: strapi2 });
2619
+ const stagesService = getService("stages", { strapi: strapi2 });
2620
+ const workflowsValidationService = getService("review-workflows-validation", { strapi: strapi2 });
2621
+ return {
2622
+ async bootstrap() {
2623
+ await registerWebhookEvents({ strapi: strapi2 });
2624
+ await initDefaultWorkflow({ workflowsService, stagesService, strapi: strapi2 });
2625
+ },
2626
+ async register({ options } = { options: {} }) {
2627
+ extendReviewWorkflowContentTypes({ strapi: strapi2 });
2628
+ strapi2.hook("strapi::content-types.afterSync").register(persistStagesJoinTables({ strapi: strapi2 }));
2629
+ const reviewWorkflowsOptions = fp.defaultsDeep(DEFAULT_OPTIONS, options);
2630
+ workflowsValidationService.register(reviewWorkflowsOptions);
2631
+ }
2632
+ };
2633
+ };
2634
+ const { ValidationError: ValidationError$1 } = utils$1.errors;
2635
+ const reviewWorkflowsValidation = ({ strapi: strapi2 }) => {
2636
+ return {
2637
+ limits: {
2638
+ numberOfWorkflows: MAX_WORKFLOWS,
2639
+ stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW
2640
+ },
2641
+ register({ numberOfWorkflows, stagesPerWorkflow }) {
2642
+ if (!Object.isFrozen(this.limits)) {
2643
+ this.limits.numberOfWorkflows = clampMaxWorkflows(
2644
+ numberOfWorkflows || this.limits.numberOfWorkflows
2645
+ );
2646
+ this.limits.stagesPerWorkflow = clampMaxStagesPerWorkflow(
2647
+ stagesPerWorkflow || this.limits.stagesPerWorkflow
2648
+ );
2649
+ Object.freeze(this.limits);
2650
+ }
2651
+ },
2652
+ /**
2653
+ * Validates the stages of a workflow.
2654
+ * @param {Array} stages - Array of stages to be validated.
2655
+ * @throws {ValidationError} - If the workflow has no stages or exceeds the limit.
2656
+ */
2657
+ validateWorkflowStages(stages2) {
2658
+ if (!stages2 || stages2.length === 0) {
2659
+ throw new ValidationError$1(ERRORS.WORKFLOW_WITHOUT_STAGES);
2660
+ }
2661
+ if (stages2.length > this.limits.stagesPerWorkflow) {
2662
+ throw new ValidationError$1(ERRORS.STAGES_LIMIT);
2663
+ }
2664
+ const stageNames = stages2.map((stage) => stage.name);
2665
+ if (fp.uniq(stageNames).length !== stageNames.length) {
2666
+ throw new ValidationError$1(ERRORS.DUPLICATED_STAGE_NAME);
2667
+ }
2668
+ },
2669
+ async validateWorkflowCountStages(workflowId, countAddedStages = 0) {
2670
+ const stagesService = getService("stages", { strapi: strapi2 });
2671
+ const countWorkflowStages = await stagesService.count({ workflowId });
2672
+ if (countWorkflowStages + countAddedStages > this.limits.stagesPerWorkflow) {
2673
+ throw new ValidationError$1(ERRORS.STAGES_LIMIT);
2674
+ }
2675
+ },
2676
+ /**
2677
+ * Validates the count of existing and added workflows.
2678
+ * @param {number} [countAddedWorkflows=0] - The count of workflows to be added.
2679
+ * @throws {ValidationError} - If the total count of workflows exceeds the limit.
2680
+ * @returns {Promise<void>} - A Promise that resolves when the validation is completed.
2681
+ */
2682
+ async validateWorkflowCount(countAddedWorkflows = 0) {
2683
+ const workflowsService = getService("workflows", { strapi: strapi2 });
2684
+ const countWorkflows = await workflowsService.count();
2685
+ if (countWorkflows + countAddedWorkflows > this.limits.numberOfWorkflows) {
2686
+ throw new ValidationError$1(ERRORS.WORKFLOWS_LIMIT);
2687
+ }
2688
+ }
2689
+ };
2690
+ };
2691
+ const getDataWithStage = async (workflow2, data) => {
2692
+ if (!fp.isNil(ENTITY_STAGE_ATTRIBUTE)) {
2693
+ return { ...data, [ENTITY_STAGE_ATTRIBUTE]: workflow2.stages[0].id };
2694
+ }
2695
+ return data;
2696
+ };
2697
+ const getEntityStage = async (uid, id) => {
2698
+ const entity = await strapi.entityService.findOne(uid, id, {
2699
+ populate: {
2700
+ [ENTITY_STAGE_ATTRIBUTE]: {
2701
+ populate: {
2702
+ workflow: true
2703
+ }
2704
+ }
2705
+ }
2706
+ });
2707
+ return entity?.[ENTITY_STAGE_ATTRIBUTE] ?? {};
2708
+ };
2709
+ const decorator = (service) => ({
2710
+ async create(uid, opts = {}) {
2711
+ const workflow2 = await getService("workflows").getAssignedWorkflow(uid, {
2712
+ populate: "stages"
2713
+ });
2714
+ if (!workflow2) {
2715
+ return service.create.call(this, uid, opts);
2716
+ }
2717
+ const data = await getDataWithStage(workflow2, opts.data);
2718
+ return service.create.call(this, uid, { ...opts, data });
2719
+ },
2720
+ async update(uid, entityId, opts = {}) {
2721
+ const data = { ...opts.data };
2722
+ if (fp.isNil(data[ENTITY_STAGE_ATTRIBUTE])) {
2723
+ delete data[ENTITY_STAGE_ATTRIBUTE];
2724
+ return service.update.call(this, uid, entityId, { ...opts, data });
2725
+ }
2726
+ const previousStage = await getEntityStage(uid, entityId);
2727
+ const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data });
2728
+ const updatedStage = updatedEntity[ENTITY_STAGE_ATTRIBUTE];
2729
+ if (updatedStage && previousStage?.id && previousStage.id !== updatedStage.id) {
2730
+ const model = strapi.getModel(uid);
2731
+ strapi.eventHub.emit(WORKFLOW_UPDATE_STAGE, {
2732
+ model: model.modelName,
2733
+ uid: model.uid,
2734
+ entity: {
2735
+ id: entityId
2736
+ },
2737
+ workflow: {
2738
+ id: previousStage.workflow.id,
2739
+ stages: {
2740
+ from: {
2741
+ id: previousStage.id,
2742
+ name: previousStage.name
2743
+ },
2744
+ to: {
2745
+ id: updatedStage.id,
2746
+ name: updatedStage.name
2747
+ }
2748
+ }
2749
+ }
2750
+ });
2751
+ }
2752
+ return updatedEntity;
2753
+ }
2754
+ });
2755
+ const reviewWorkflowsDecorator = () => ({
2756
+ decorator
2757
+ });
2758
+ const sendDidCreateStage = async () => {
2759
+ strapi.telemetry.send("didCreateStage", {});
2760
+ };
2761
+ const sendDidEditStage = async () => {
2762
+ strapi.telemetry.send("didEditStage", {});
2763
+ };
2764
+ const sendDidDeleteStage = async () => {
2765
+ strapi.telemetry.send("didDeleteStage", {});
2766
+ };
2767
+ const sendDidChangeEntryStage = async () => {
2768
+ strapi.telemetry.send("didChangeEntryStage", {});
2769
+ };
2770
+ const sendDidCreateWorkflow = async () => {
2771
+ strapi.telemetry.send("didCreateWorkflow", {});
2772
+ };
2773
+ const sendDidEditWorkflow = async () => {
2774
+ strapi.telemetry.send("didEditWorkflow", {});
2775
+ };
2776
+ const sendDidEditAssignee = async (fromId, toId) => {
2777
+ strapi.telemetry.send("didEditAssignee", { from: fromId, to: toId });
2778
+ };
2779
+ const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes) => {
2780
+ strapi.telemetry.send("didSendReviewWorkflowPropertiesOnceAWeek", {
2781
+ groupProperties: {
2782
+ numberOfActiveWorkflows,
2783
+ avgStagesCount,
2784
+ maxStagesCount,
2785
+ activatedContentTypes
2786
+ }
2787
+ });
2788
+ };
2789
+ const reviewWorkflowsMetrics = {
2790
+ sendDidCreateStage,
2791
+ sendDidEditStage,
2792
+ sendDidDeleteStage,
2793
+ sendDidChangeEntryStage,
2794
+ sendDidCreateWorkflow,
2795
+ sendDidEditWorkflow,
2796
+ sendDidSendReviewWorkflowPropertiesOnceAWeek,
2797
+ sendDidEditAssignee
2798
+ };
2799
+ const ONE_WEEK = 7 * 24 * 60 * 60 * 1e3;
2800
+ const getWeeklyCronScheduleAt = (date) => `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;
2801
+ const getMetricsStoreValue = async () => {
2802
+ const value = await strapi.store.get({ type: "plugin", name: "ee", key: "metrics" });
2803
+ return fp.defaultTo({}, value);
2804
+ };
2805
+ const setMetricsStoreValue = (value) => strapi.store.set({ type: "plugin", name: "ee", key: "metrics", value });
2806
+ const reviewWorkflowsWeeklyMetrics = ({ strapi: strapi2 }) => {
2807
+ const metrics = getService("review-workflows-metrics", { strapi: strapi2 });
2808
+ const workflowsService = getService("workflows", { strapi: strapi2 });
2809
+ return {
2810
+ async computeMetrics() {
2811
+ const workflows2 = await workflowsService.find({ populate: "stages" });
2812
+ const stagesCount = fp.flow(
2813
+ fp.map("stages"),
2814
+ // Number of stages per workflow
2815
+ fp.map(fp.size)
2816
+ )(workflows2);
2817
+ const contentTypesCount = fp.flow(
2818
+ fp.map("contentTypes"),
2819
+ // Number of content types per workflow
2820
+ fp.map(fp.size)
2821
+ )(workflows2);
2822
+ return {
2823
+ numberOfActiveWorkflows: fp.size(workflows2),
2824
+ avgStagesCount: fp.mean(stagesCount),
2825
+ maxStagesCount: fp.max(stagesCount),
2826
+ activatedContentTypes: fp.sum(contentTypesCount)
2827
+ };
2828
+ },
2829
+ async sendMetrics() {
2830
+ const computedMetrics = await this.computeMetrics();
2831
+ metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
2832
+ const metricsInfoStored = await getMetricsStoreValue();
2833
+ await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: (/* @__PURE__ */ new Date()).getTime() });
2834
+ },
2835
+ async ensureWeeklyStoredCronSchedule() {
2836
+ const metricsInfoStored = await getMetricsStoreValue();
2837
+ const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;
2838
+ const now = /* @__PURE__ */ new Date();
2839
+ let weeklySchedule = currentSchedule;
2840
+ if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {
2841
+ weeklySchedule = getWeeklyCronScheduleAt(dateFns.add(now, { seconds: 10 }));
2842
+ await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });
2843
+ }
2844
+ return weeklySchedule;
2845
+ },
2846
+ async registerCron() {
2847
+ const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();
2848
+ strapi2.cron.add({ [weeklySchedule]: this.sendMetrics.bind(this) });
2849
+ }
2850
+ };
2851
+ };
2852
+ const index$1 = {
2853
+ auth,
2854
+ passport,
2855
+ role: role$1,
2856
+ user: user$1,
2857
+ "seat-enforcement": seatEnforcement,
2858
+ workflows: workflows$1,
2859
+ stages: stages$1,
2860
+ "stage-permissions": stagePermissions,
2861
+ assignees: assignees$1,
2862
+ "review-workflows": reviewWorkflows,
2863
+ "review-workflows-validation": reviewWorkflowsValidation,
2864
+ "review-workflows-decorator": reviewWorkflowsDecorator,
2865
+ "review-workflows-metrics": reviewWorkflowsMetrics,
2866
+ "review-workflows-weekly-metrics": reviewWorkflowsWeeklyMetrics
2867
+ };
2868
+ const providerOptionsUpdateSchema = utils$1.yup.object().shape({
2869
+ autoRegister: utils$1.yup.boolean().required(),
2870
+ defaultRole: utils$1.yup.strapiID().when("autoRegister", (value, initSchema) => {
2871
+ return value ? initSchema.required() : initSchema.nullable();
2872
+ }).test("is-valid-role", "You must submit a valid default role", (roleId) => {
2873
+ if (roleId === null) {
2874
+ return true;
2875
+ }
2876
+ return strapi.admin.services.role.exists({ id: roleId });
2877
+ }),
2878
+ ssoLockedRoles: utils$1.yup.array().nullable().of(
2879
+ utils$1.yup.strapiID().test(
2880
+ "is-valid-role",
2881
+ "You must submit a valid role for the SSO Locked roles",
2882
+ (roleId) => {
2883
+ return strapi.admin.services.role.exists({ id: roleId });
2884
+ }
2885
+ )
2886
+ )
2887
+ });
2888
+ const validateProviderOptionsUpdate = utils$1.validateYupSchema(providerOptionsUpdateSchema);
2889
+ const PROVIDER_REDIRECT_BASE = "/auth/login";
2890
+ const PROVIDER_REDIRECT_SUCCESS = `${PROVIDER_REDIRECT_BASE}/success`;
2891
+ const PROVIDER_REDIRECT_ERROR = `${PROVIDER_REDIRECT_BASE}/error`;
2892
+ const PROVIDER_URLS_MAP = {
2893
+ success: PROVIDER_REDIRECT_SUCCESS,
2894
+ error: PROVIDER_REDIRECT_ERROR
2895
+ };
2896
+ const getAdminStore = async () => strapi.store({ type: "core", name: "admin" });
2897
+ const getPrefixedRedirectUrls = () => {
2898
+ const { url: adminUrl } = strapi.config.get("admin");
2899
+ const prefixUrl = (url) => `${adminUrl || "/admin"}${url}`;
2900
+ return fp.mapValues(prefixUrl, PROVIDER_URLS_MAP);
2901
+ };
2902
+ const utils = {
2903
+ getAdminStore,
2904
+ getPrefixedRedirectUrls
2905
+ };
2906
+ const defaultConnectionError = () => new Error("Invalid connection payload");
2907
+ const authenticate = async (ctx, next) => {
2908
+ const {
2909
+ params: { provider }
2910
+ } = ctx;
2911
+ const redirectUrls = utils.getPrefixedRedirectUrls();
2912
+ return passport__default.default.authenticate(provider, null, async (error, profile) => {
2913
+ if (error || !profile || !profile.email) {
2914
+ if (error) {
2915
+ strapi.log.error(error);
2916
+ }
2917
+ strapi.eventHub.emit("admin.auth.error", {
2918
+ error: error || defaultConnectionError(),
2919
+ provider
2920
+ });
2921
+ return ctx.redirect(redirectUrls.error);
2922
+ }
2923
+ const user2 = await getService("user").findOneByEmail(profile.email);
2924
+ const scenario = user2 ? existingUserScenario : nonExistingUserScenario;
2925
+ return scenario(ctx, next)(user2 || profile, provider);
2926
+ })(ctx, next);
2927
+ };
2928
+ const existingUserScenario = (ctx, next) => async (user2, provider) => {
2929
+ const redirectUrls = utils.getPrefixedRedirectUrls();
2930
+ if (!user2.isActive) {
2931
+ strapi.eventHub.emit("admin.auth.error", {
2932
+ error: new Error(`Deactivated user tried to login (${user2.id})`),
2933
+ provider
2934
+ });
2935
+ return ctx.redirect(redirectUrls.error);
2936
+ }
2937
+ ctx.state.user = user2;
2938
+ return next();
2939
+ };
2940
+ const nonExistingUserScenario = (ctx, next) => async (profile, provider) => {
2941
+ const { email: email2, firstname: firstname2, lastname: lastname2, username: username2 } = profile;
2942
+ const redirectUrls = utils.getPrefixedRedirectUrls();
2943
+ const adminStore = await utils.getAdminStore();
2944
+ const { providers } = await adminStore.get({ key: "auth" });
2945
+ const isMissingRegisterFields = !username2 && (!firstname2 || !lastname2);
2946
+ if (!providers.autoRegister || !providers.defaultRole || isMissingRegisterFields) {
2947
+ strapi.eventHub.emit("admin.auth.error", { error: defaultConnectionError(), provider });
2948
+ return ctx.redirect(redirectUrls.error);
2949
+ }
2950
+ const defaultRole = await getService("role").findOne({ id: providers.defaultRole });
2951
+ if (!defaultRole) {
2952
+ strapi.eventHub.emit("admin.auth.error", { error: defaultConnectionError(), provider });
2953
+ return ctx.redirect(redirectUrls.error);
2954
+ }
2955
+ ctx.state.user = await getService("user").create({
2956
+ email: email2,
2957
+ username: username2,
2958
+ firstname: firstname2,
2959
+ lastname: lastname2,
2960
+ roles: [defaultRole.id],
2961
+ isActive: true,
2962
+ registrationToken: null
2963
+ });
2964
+ strapi.eventHub.emit("admin.auth.autoRegistration", {
2965
+ user: ctx.state.user,
2966
+ provider
2967
+ });
2968
+ return next();
2969
+ };
2970
+ const redirectWithAuth = (ctx) => {
2971
+ const {
2972
+ params: { provider }
2973
+ } = ctx;
2974
+ const redirectUrls = utils.getPrefixedRedirectUrls();
2975
+ const domain = strapi.config.get("admin.auth.domain");
2976
+ const { user: user2 } = ctx.state;
2977
+ const jwt = getService("token").createJwtToken(user2);
2978
+ const isProduction = strapi.config.get("environment") === "production";
2979
+ const cookiesOptions = { httpOnly: false, secure: isProduction, overwrite: true, domain };
2980
+ const sanitizedUser = getService("user").sanitizeUser(user2);
2981
+ strapi.eventHub.emit("admin.auth.success", { user: sanitizedUser, provider });
2982
+ ctx.cookies.set("jwtToken", jwt, cookiesOptions);
2983
+ ctx.redirect(redirectUrls.success);
2984
+ };
2985
+ const middlewares = {
2986
+ authenticate,
2987
+ redirectWithAuth
2988
+ };
2989
+ const toProviderDTO = fp.pick(["uid", "displayName", "icon"]);
2990
+ const toProviderLoginOptionsDTO = fp.pick(["autoRegister", "defaultRole", "ssoLockedRoles"]);
2991
+ const { ValidationError } = utils$1.errors;
2992
+ const providerAuthenticationFlow = compose__default.default([
2993
+ middlewares.authenticate,
2994
+ middlewares.redirectWithAuth
2995
+ ]);
2996
+ const authentication = {
2997
+ async getProviders(ctx) {
2998
+ const { providerRegistry: providerRegistry2 } = strapi.admin.services.passport;
2999
+ ctx.body = providerRegistry2.getAll().map(toProviderDTO);
3000
+ },
3001
+ async getProviderLoginOptions(ctx) {
3002
+ const adminStore = await utils.getAdminStore();
3003
+ const { providers: providersOptions } = await adminStore.get({ key: "auth" });
3004
+ ctx.body = {
3005
+ data: toProviderLoginOptionsDTO(providersOptions)
3006
+ };
3007
+ },
3008
+ async updateProviderLoginOptions(ctx) {
3009
+ const {
3010
+ request: { body }
3011
+ } = ctx;
3012
+ await validateProviderOptionsUpdate(body);
3013
+ const adminStore = await utils.getAdminStore();
3014
+ const currentAuthOptions = await adminStore.get({ key: "auth" });
3015
+ const newAuthOptions = { ...currentAuthOptions, providers: body };
3016
+ await adminStore.set({ key: "auth", value: newAuthOptions });
3017
+ ctx.body = {
3018
+ data: toProviderLoginOptionsDTO(newAuthOptions.providers)
3019
+ };
3020
+ },
3021
+ providerLogin(ctx, next) {
3022
+ const {
3023
+ params: { provider: providerName }
3024
+ } = ctx;
3025
+ const { providerRegistry: providerRegistry2 } = strapi.admin.services.passport;
3026
+ if (!providerRegistry2.has(providerName)) {
3027
+ throw new ValidationError(`Invalid provider supplied: ${providerName}`);
3028
+ }
3029
+ return providerAuthenticationFlow(ctx, next);
3030
+ }
3031
+ };
3032
+ const roleCreateSchema = utils$1.yup.object().shape({
3033
+ name: utils$1.yup.string().min(1).required(),
3034
+ description: utils$1.yup.string().nullable()
3035
+ }).noUnknown();
3036
+ const rolesDeleteSchema = utils$1.yup.object().shape({
3037
+ ids: utils$1.yup.array().of(utils$1.yup.strapiID()).min(1).required().test(
3038
+ "roles-deletion-checks",
3039
+ "Roles deletion checks have failed",
3040
+ async function rolesDeletionChecks(ids) {
3041
+ try {
3042
+ await strapi.admin.services.role.checkRolesIdForDeletion(ids);
3043
+ if (EE__default.default.features.isEnabled("sso")) {
3044
+ await strapi.admin.services.role.ssoCheckRolesIdForDeletion(ids);
3045
+ }
3046
+ } catch (e) {
3047
+ return this.createError({ path: "ids", message: e.message });
3048
+ }
3049
+ return true;
3050
+ }
3051
+ )
3052
+ }).noUnknown();
3053
+ const roleDeleteSchema = utils$1.yup.strapiID().required().test(
3054
+ "no-admin-single-delete",
3055
+ "Role deletion checks have failed",
3056
+ async function noAdminSingleDelete(id) {
3057
+ try {
3058
+ await strapi.admin.services.role.checkRolesIdForDeletion([id]);
3059
+ if (EE__default.default.features.isEnabled("sso")) {
3060
+ await strapi.admin.services.role.ssoCheckRolesIdForDeletion([id]);
3061
+ }
3062
+ } catch (e) {
3063
+ return this.createError({ path: "id", message: e.message });
3064
+ }
3065
+ return true;
3066
+ }
3067
+ );
3068
+ const validateRoleCreateInput = utils$1.validateYupSchema(roleCreateSchema);
3069
+ const validateRolesDeleteInput = utils$1.validateYupSchema(rolesDeleteSchema);
3070
+ const validateRoleDeleteInput = utils$1.validateYupSchema(roleDeleteSchema);
3071
+ const role = {
3072
+ /**
3073
+ * Create a new role
3074
+ * @param {KoaContext} ctx - koa context
3075
+ */
3076
+ async create(ctx) {
3077
+ await validateRoleCreateInput(ctx.request.body);
3078
+ const roleService = getService("role");
3079
+ const role2 = await roleService.create(ctx.request.body);
3080
+ const sanitizedRole = roleService.sanitizeRole(role2);
3081
+ ctx.created({ data: sanitizedRole });
3082
+ },
3083
+ /**
3084
+ * Delete a role
3085
+ * @param {KoaContext} ctx - koa context
3086
+ */
3087
+ async deleteOne(ctx) {
3088
+ const { id } = ctx.params;
3089
+ await validateRoleDeleteInput(id);
3090
+ const roleService = getService("role");
3091
+ const roles2 = await roleService.deleteByIds([id]);
3092
+ const sanitizedRole = roles2.map((role2) => roleService.sanitizeRole(role2))[0] || null;
3093
+ return ctx.deleted({
3094
+ data: sanitizedRole
3095
+ });
3096
+ },
3097
+ /**
3098
+ * delete several roles
3099
+ * @param {KoaContext} ctx - koa context
3100
+ */
3101
+ async deleteMany(ctx) {
3102
+ const { body } = ctx.request;
3103
+ await validateRolesDeleteInput(body);
3104
+ const roleService = getService("role");
3105
+ const roles2 = await roleService.deleteByIds(body.ids);
3106
+ const sanitizedRoles = roles2.map(roleService.sanitizeRole);
3107
+ return ctx.deleted({
3108
+ data: sanitizedRoles
3109
+ });
3110
+ }
3111
+ };
3112
+ const getDefaultActionAttributes = () => ({
3113
+ options: {
3114
+ applyToProperties: null
3115
+ }
3116
+ });
3117
+ const actionFields = [
3118
+ "section",
3119
+ "displayName",
3120
+ "category",
3121
+ "subCategory",
3122
+ "pluginName",
3123
+ "subjects",
3124
+ "options",
3125
+ "actionId"
3126
+ ];
3127
+ const sanitizeActionAttributes = fp.pick(actionFields);
3128
+ const computeActionId = (attributes) => {
3129
+ const { pluginName, uid } = attributes;
3130
+ if (!pluginName) {
3131
+ return `api::${uid}`;
3132
+ }
3133
+ if (pluginName === "admin") {
3134
+ return `admin::${uid}`;
3135
+ }
3136
+ return `plugin::${pluginName}.${uid}`;
3137
+ };
3138
+ const assignActionId = (attrs) => fp.set("actionId", computeActionId(attrs), attrs);
3139
+ const assignOrOmitSubCategory = (action) => {
3140
+ const shouldHaveSubCategory = ["settings", "plugins"].includes(action.section);
3141
+ return shouldHaveSubCategory ? fp.set("subCategory", action.subCategory || "general", action) : fp.omit("subCategory", action);
3142
+ };
3143
+ const appliesToProperty = fp.curry((property, action) => {
3144
+ return fp.pipe(fp.prop("options.applyToProperties"), fp.includes(property))(action);
3145
+ });
3146
+ const appliesToSubject = fp.curry((subject, action) => {
3147
+ return fp.isArray(action.subjects) && fp.includes(subject, action.subjects);
3148
+ });
3149
+ const create = fp.pipe(
3150
+ // Create and assign an action identifier to the action
3151
+ // (need to be done before the sanitizeActionAttributes since we need the uid here)
3152
+ assignActionId,
3153
+ // Add or remove the sub category field based on the pluginName attribute
3154
+ assignOrOmitSubCategory,
3155
+ // Remove unwanted attributes from the payload
3156
+ sanitizeActionAttributes,
3157
+ // Complete the action creation by adding default values for some attributes
3158
+ fp.merge(getDefaultActionAttributes())
3159
+ );
3160
+ const actionDomain = {
3161
+ actionFields,
3162
+ appliesToProperty,
3163
+ appliesToSubject,
3164
+ assignActionId,
3165
+ assignOrOmitSubCategory,
3166
+ create,
3167
+ computeActionId,
3168
+ getDefaultActionAttributes,
3169
+ sanitizeActionAttributes
3170
+ };
3171
+ const checkFieldsAreCorrectlyNested = (fields) => {
3172
+ if (___default.default.isNil(fields)) {
3173
+ return true;
3174
+ }
3175
+ if (!Array.isArray(fields)) {
3176
+ return false;
3177
+ }
3178
+ let failed = false;
3179
+ for (let indexA = 0; indexA < fields.length; indexA += 1) {
3180
+ failed = fields.slice(indexA + 1).some(
3181
+ (fieldB) => fieldB.startsWith(`${fields[indexA]}.`) || fields[indexA].startsWith(`${fieldB}.`)
3182
+ );
3183
+ if (failed)
3184
+ break;
3185
+ }
3186
+ return !failed;
3187
+ };
3188
+ const checkFieldsDontHaveDuplicates = (fields) => {
3189
+ if (___default.default.isNil(fields)) {
3190
+ return true;
3191
+ }
3192
+ if (!Array.isArray(fields)) {
3193
+ return false;
3194
+ }
3195
+ return ___default.default.uniq(fields).length === fields.length;
3196
+ };
3197
+ const getActionFromProvider = (actionId) => {
3198
+ return getService$1("permission").actionProvider.get(actionId);
3199
+ };
3200
+ const email = utils$1.yup.string().email().lowercase();
3201
+ const firstname = utils$1.yup.string().trim().min(1);
3202
+ const lastname = utils$1.yup.string();
3203
+ const username = utils$1.yup.string().min(1);
3204
+ const password = utils$1.yup.string().min(8).matches(/[a-z]/, "${path} must contain at least one lowercase character").matches(/[A-Z]/, "${path} must contain at least one uppercase character").matches(/\d/, "${path} must contain at least one number");
3205
+ const roles = utils$1.yup.array(utils$1.yup.strapiID()).min(1);
3206
+ const isAPluginName = utils$1.yup.string().test("is-a-plugin-name", "is not a plugin name", function(value) {
3207
+ return [void 0, "admin", ...Object.keys(strapi.plugins)].includes(value) ? true : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });
3208
+ });
3209
+ const arrayOfConditionNames = utils$1.yup.array().of(utils$1.yup.string()).test("is-an-array-of-conditions", "is not a plugin name", function(value) {
3210
+ const ids = strapi.admin.services.permission.conditionProvider.keys();
3211
+ return ___default.default.isUndefined(value) || ___default.default.difference(value, ids).length === 0 ? true : this.createError({ path: this.path, message: `contains conditions that don't exist` });
3212
+ });
3213
+ const permissionsAreEquals = (a, b) => a.action === b.action && (a.subject === b.subject || ___default.default.isNil(a.subject) && ___default.default.isNil(b.subject));
3214
+ const checkNoDuplicatedPermissions = (permissions) => !Array.isArray(permissions) || permissions.every(
3215
+ (permA, i) => permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))
3216
+ );
3217
+ const checkNilFields = (action) => function(fields) {
3218
+ if (fp.isNil(action)) {
3219
+ return true;
3220
+ }
3221
+ return actionDomain.appliesToProperty("fields", action) || fp.isNil(fields);
3222
+ };
3223
+ const fieldsPropertyValidation = (action) => utils$1.yup.array().of(utils$1.yup.string()).nullable().test(
3224
+ "field-nested",
3225
+ "Fields format are incorrect (bad nesting).",
3226
+ checkFieldsAreCorrectlyNested
3227
+ ).test(
3228
+ "field-nested",
3229
+ "Fields format are incorrect (duplicates).",
3230
+ checkFieldsDontHaveDuplicates
3231
+ ).test(
3232
+ "fields-restriction",
3233
+ "The permission at ${path} must have fields set to null or undefined",
3234
+ // @ts-expect-error yup types
3235
+ checkNilFields(action)
3236
+ );
3237
+ const permission = utils$1.yup.object().shape({
3238
+ action: utils$1.yup.string().required().test("action-validity", "action is not an existing permission action", function(actionId) {
3239
+ if (fp.isNil(actionId)) {
3240
+ return true;
3241
+ }
3242
+ return !!getActionFromProvider(actionId);
3243
+ }),
3244
+ actionParameters: utils$1.yup.object().nullable(),
3245
+ subject: utils$1.yup.string().nullable().test("subject-validity", "Invalid subject submitted", function(subject) {
3246
+ const action = getActionFromProvider(this.options.parent.action);
3247
+ if (!action) {
3248
+ return true;
3249
+ }
3250
+ if (fp.isNil(action.subjects)) {
3251
+ return fp.isNil(subject);
3252
+ }
3253
+ if (fp.isArray(action.subjects)) {
3254
+ return action.subjects.includes(subject);
3255
+ }
3256
+ return false;
3257
+ }),
3258
+ properties: utils$1.yup.object().test("properties-structure", "Invalid property set at ${path}", function(properties) {
3259
+ const action = getActionFromProvider(this.options.parent.action);
3260
+ const hasNoProperties = fp.isEmpty(properties) || fp.isNil(properties);
3261
+ if (!fp.has("options.applyToProperties", action)) {
3262
+ return hasNoProperties;
3263
+ }
3264
+ if (hasNoProperties) {
3265
+ return true;
3266
+ }
3267
+ const { applyToProperties } = action.options;
3268
+ if (!fp.isArray(applyToProperties)) {
3269
+ return false;
3270
+ }
3271
+ return Object.keys(properties).every((property) => applyToProperties.includes(property));
3272
+ }).test(
3273
+ "fields-property",
3274
+ "Invalid fields property at ${path}",
3275
+ async function(properties = {}) {
3276
+ const action = getActionFromProvider(this.options.parent.action);
3277
+ if (!action || !properties) {
3278
+ return true;
3279
+ }
3280
+ if (!actionDomain.appliesToProperty("fields", action)) {
3281
+ return true;
3282
+ }
3283
+ try {
3284
+ await fieldsPropertyValidation(action).validate(properties.fields, {
3285
+ strict: true,
3286
+ abortEarly: false
3287
+ });
3288
+ return true;
3289
+ } catch (e) {
3290
+ throw this.createError({
3291
+ message: e.message,
3292
+ path: `${this.path}.fields`
3293
+ });
3294
+ }
3295
+ }
3296
+ ),
3297
+ conditions: utils$1.yup.array().of(utils$1.yup.string())
3298
+ }).noUnknown();
3299
+ const updatePermissions = utils$1.yup.object().shape({
3300
+ permissions: utils$1.yup.array().required().of(permission).test(
3301
+ "duplicated-permissions",
3302
+ "Some permissions are duplicated (same action and subject)",
3303
+ checkNoDuplicatedPermissions
3304
+ )
3305
+ }).required().noUnknown();
3306
+ const validators = {
3307
+ email,
3308
+ firstname,
3309
+ lastname,
3310
+ username,
3311
+ password,
3312
+ roles,
3313
+ isAPluginName,
3314
+ arrayOfConditionNames,
3315
+ permission,
3316
+ updatePermissions
3317
+ };
3318
+ const userCreationSchema = utils$1.yup.object().shape({
3319
+ email: validators.email.required(),
3320
+ firstname: validators.firstname.required(),
3321
+ lastname: validators.lastname,
3322
+ roles: validators.roles.min(1),
3323
+ preferedLanguage: utils$1.yup.string().nullable()
3324
+ }).noUnknown();
3325
+ const profileUpdateSchema = utils$1.yup.object().shape({
3326
+ email: validators.email.notNull(),
3327
+ firstname: validators.firstname.notNull(),
3328
+ lastname: validators.lastname.nullable(),
3329
+ username: validators.username.nullable(),
3330
+ password: validators.password.notNull(),
3331
+ currentPassword: utils$1.yup.string().when(
3332
+ "password",
3333
+ (password2, schema) => !fp.isUndefined(password2) ? schema.required() : schema
3334
+ ).notNull(),
3335
+ preferedLanguage: utils$1.yup.string().nullable()
3336
+ }).noUnknown();
3337
+ const userUpdateSchema = utils$1.yup.object().shape({
3338
+ email: validators.email.notNull(),
3339
+ firstname: validators.firstname.notNull(),
3340
+ lastname: validators.lastname.nullable(),
3341
+ username: validators.username.nullable(),
3342
+ password: validators.password.notNull(),
3343
+ isActive: utils$1.yup.bool().notNull(),
3344
+ roles: validators.roles.min(1).notNull()
3345
+ }).noUnknown();
3346
+ const usersDeleteSchema = utils$1.yup.object().shape({
3347
+ ids: utils$1.yup.array().of(utils$1.yup.strapiID()).min(1).required()
3348
+ }).noUnknown();
3349
+ utils$1.validateYupSchema(userCreationSchema);
3350
+ utils$1.validateYupSchema(profileUpdateSchema);
3351
+ const validateUserUpdateInput = utils$1.validateYupSchema(userUpdateSchema);
3352
+ utils$1.validateYupSchema(usersDeleteSchema);
3353
+ const schemas = {
3354
+ userCreationSchema,
3355
+ usersDeleteSchema,
3356
+ userUpdateSchema
3357
+ };
3358
+ const ssoUserCreationInputExtension = utils$1.yup.object().shape({
3359
+ useSSORegistration: utils$1.yup.boolean()
3360
+ }).noUnknown();
3361
+ const validateUserCreationInput = (data) => {
3362
+ let schema = schemas.userCreationSchema;
3363
+ if (EE__default.default.features.isEnabled("sso")) {
3364
+ schema = schema.concat(ssoUserCreationInputExtension);
3365
+ }
3366
+ return utils$1.validateYupSchema(schema)(data);
3367
+ };
3368
+ const { ApplicationError, ForbiddenError } = utils$1.errors;
3369
+ const pickUserCreationAttributes = fp.pick(["firstname", "lastname", "email", "roles"]);
3370
+ const hasAdminSeatsAvaialble = async () => {
3371
+ if (!strapi.EE) {
3372
+ return true;
3373
+ }
3374
+ const permittedSeats = EE__default.default.seats;
3375
+ if (fp.isNil(permittedSeats)) {
3376
+ return true;
3377
+ }
3378
+ const userCount = await strapi.service("admin::user").getCurrentActiveUserCount();
3379
+ if (userCount < permittedSeats) {
3380
+ return true;
3381
+ }
3382
+ };
3383
+ const user = {
3384
+ async create(ctx) {
3385
+ if (!await hasAdminSeatsAvaialble()) {
3386
+ throw new ForbiddenError("License seat limit reached. You cannot create a new user");
3387
+ }
3388
+ const { body } = ctx.request;
3389
+ const cleanData = { ...body, email: ___default.default.get(body, `email`, ``).toLowerCase() };
3390
+ await validateUserCreationInput(cleanData);
3391
+ const attributes = pickUserCreationAttributes(cleanData);
3392
+ const { useSSORegistration } = cleanData;
3393
+ const userAlreadyExists = await getService("user").exists({ email: attributes.email });
3394
+ if (userAlreadyExists) {
3395
+ throw new ApplicationError("Email already taken");
3396
+ }
3397
+ if (useSSORegistration) {
3398
+ Object.assign(attributes, { registrationToken: null, isActive: true });
3399
+ }
3400
+ const createdUser = await getService("user").create(attributes);
3401
+ const userInfo = getService("user").sanitizeUser(createdUser);
3402
+ Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
3403
+ ctx.created({ data: userInfo });
3404
+ },
3405
+ async update(ctx) {
3406
+ const { id } = ctx.params;
3407
+ const { body: input } = ctx.request;
3408
+ await validateUserUpdateInput(input);
3409
+ if (___default.default.has(input, "email")) {
3410
+ const uniqueEmailCheck = await getService("user").exists({
3411
+ id: { $ne: id },
3412
+ email: input.email
3413
+ });
3414
+ if (uniqueEmailCheck) {
3415
+ throw new ApplicationError("A user with this email address already exists");
3416
+ }
3417
+ }
3418
+ const user2 = await getService("user").findOne(id, null);
3419
+ if (!await hasAdminSeatsAvaialble() && !user2.isActive && input.isActive) {
3420
+ throw new ForbiddenError("License seat limit reached. You cannot active this user");
3421
+ }
3422
+ const updatedUser = await getService("user").updateById(id, input);
3423
+ if (!updatedUser) {
3424
+ return ctx.notFound("User does not exist");
3425
+ }
3426
+ ctx.body = {
3427
+ data: getService("user").sanitizeUser(updatedUser)
3428
+ };
3429
+ },
3430
+ async isSSOLocked(ctx) {
3431
+ const { user: user2 } = ctx.state;
3432
+ const isSSOLocked = await isSsoLocked(user2);
3433
+ ctx.body = {
3434
+ data: {
3435
+ isSSOLocked
3436
+ }
3437
+ };
3438
+ }
3439
+ };
3440
+ const ALLOWED_SORT_STRINGS = ["action:ASC", "action:DESC", "date:ASC", "date:DESC"];
3441
+ const validateFindManySchema = utils$1.yup.object().shape({
3442
+ page: utils$1.yup.number().integer().min(1),
3443
+ pageSize: utils$1.yup.number().integer().min(1).max(100),
3444
+ sort: utils$1.yup.mixed().oneOf(ALLOWED_SORT_STRINGS)
3445
+ }).required();
3446
+ const validateFindMany = utils$1.validateYupSchema(validateFindManySchema, { strict: false });
3447
+ const auditLogs = {
3448
+ async findMany(ctx) {
3449
+ const { query } = ctx.request;
3450
+ await validateFindMany(query);
3451
+ const auditLogs2 = strapi.container.get("audit-logs");
3452
+ const body = await auditLogs2.findMany(query);
3453
+ ctx.body = body;
3454
+ },
3455
+ async findOne(ctx) {
3456
+ const { id } = ctx.params;
3457
+ const auditLogs2 = strapi.container.get("audit-logs");
3458
+ const body = await auditLogs2.findOne(id);
3459
+ ctx.body = body;
3460
+ }
3461
+ };
3462
+ const admin = {
3463
+ // NOTE: Overrides CE admin controller
3464
+ async getProjectType() {
3465
+ const flags = strapi.config.get("admin.flags", {});
3466
+ try {
3467
+ return { data: { isEE: strapi.EE, features: EE__default.default.features.list(), flags } };
3468
+ } catch (err) {
3469
+ return { data: { isEE: false, features: [], flags } };
3470
+ }
3471
+ },
3472
+ async licenseLimitInformation() {
3473
+ const permittedSeats = EE__default.default.seats;
3474
+ let shouldNotify = false;
3475
+ let licenseLimitStatus = null;
3476
+ let enforcementUserCount;
3477
+ const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
3478
+ const eeDisabledUsers = await getService("seat-enforcement").getDisabledUserList();
3479
+ if (eeDisabledUsers) {
3480
+ enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;
3481
+ } else {
3482
+ enforcementUserCount = currentActiveUserCount;
3483
+ }
3484
+ if (!fp.isNil(permittedSeats) && enforcementUserCount > permittedSeats) {
3485
+ shouldNotify = true;
3486
+ licenseLimitStatus = "OVER_LIMIT";
3487
+ }
3488
+ if (!fp.isNil(permittedSeats) && enforcementUserCount === permittedSeats) {
3489
+ shouldNotify = true;
3490
+ licenseLimitStatus = "AT_LIMIT";
3491
+ }
3492
+ const data = {
3493
+ enforcementUserCount,
3494
+ currentActiveUserCount,
3495
+ permittedSeats,
3496
+ shouldNotify,
3497
+ shouldStopCreate: fp.isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
3498
+ licenseLimitStatus,
3499
+ isHostedOnStrapiCloud: utils$1.env("STRAPI_HOSTING", null) === "strapi.cloud",
3500
+ features: EE__default.default.features.list() ?? []
3501
+ };
3502
+ return { data };
3503
+ }
3504
+ };
3505
+ const stageObject = utils$1.yup.object().shape({
3506
+ id: utils$1.yup.number().integer().min(1),
3507
+ name: utils$1.yup.string().max(255).required(),
3508
+ color: utils$1.yup.string().matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
3509
+ // hex color
3510
+ permissions: utils$1.yup.array().of(
3511
+ utils$1.yup.object().shape({
3512
+ role: utils$1.yup.number().integer().min(1).required(),
3513
+ action: utils$1.yup.string().oneOf([STAGE_TRANSITION_UID]).required(),
3514
+ actionParameters: utils$1.yup.object().shape({
3515
+ from: utils$1.yup.number().integer().min(1).required(),
3516
+ to: utils$1.yup.number().integer().min(1)
3517
+ })
3518
+ })
3519
+ )
3520
+ });
3521
+ const validateUpdateStageOnEntitySchema = utils$1.yup.object().shape({
3522
+ id: utils$1.yup.number().integer().min(1).required()
3523
+ }).required();
3524
+ const validateContentTypes = utils$1.yup.array().of(
3525
+ // @ts-expect-error yup types
3526
+ utils$1.yup.string().test({
3527
+ name: "content-type-exists",
3528
+ message: (value) => `Content type ${value.originalValue} does not exist`,
3529
+ test(uid) {
3530
+ return strapi.getModel(uid);
3531
+ }
3532
+ }).test({
3533
+ name: "content-type-review-workflow-enabled",
3534
+ message: (value) => `Content type ${value.originalValue} does not have review workflow enabled`,
3535
+ test(uid) {
3536
+ const model = strapi.getModel(uid);
3537
+ return hasStageAttribute(model);
3538
+ }
3539
+ })
3540
+ );
3541
+ const validateWorkflowCreateSchema = utils$1.yup.object().shape({
3542
+ name: utils$1.yup.string().max(255).min(1, "Workflow name can not be empty").required(),
3543
+ stages: utils$1.yup.array().of(stageObject).uniqueProperty("name", "Stage name must be unique").min(1, "Can not create a workflow without stages").max(200, "Can not have more than 200 stages").required("Can not create a workflow without stages"),
3544
+ contentTypes: validateContentTypes
3545
+ });
3546
+ const validateWorkflowUpdateSchema = utils$1.yup.object().shape({
3547
+ name: utils$1.yup.string().max(255).min(1, "Workflow name can not be empty"),
3548
+ stages: utils$1.yup.array().of(stageObject).uniqueProperty("name", "Stage name must be unique").min(1, "Can not update a workflow without stages").max(200, "Can not have more than 200 stages"),
3549
+ contentTypes: validateContentTypes
3550
+ });
3551
+ const validateUpdateAssigneeOnEntitySchema = utils$1.yup.object().shape({
3552
+ id: utils$1.yup.number().integer().min(1).nullable()
3553
+ }).required();
3554
+ const validateWorkflowCreate = utils$1.validateYupSchema(validateWorkflowCreateSchema);
3555
+ const validateUpdateStageOnEntity = utils$1.validateYupSchema(validateUpdateStageOnEntitySchema);
3556
+ const validateUpdateAssigneeOnEntity = utils$1.validateYupSchema(
3557
+ validateUpdateAssigneeOnEntitySchema
3558
+ );
3559
+ const validateWorkflowUpdate = utils$1.validateYupSchema(validateWorkflowUpdateSchema);
3560
+ function getWorkflowsPermissionChecker({ strapi: strapi2 }, userAbility) {
3561
+ return strapi2.plugin("content-manager").service("permission-checker").create({ userAbility, model: WORKFLOW_MODEL_UID });
3562
+ }
3563
+ function formatWorkflowToAdmin(workflow2) {
3564
+ if (!workflow2)
3565
+ return;
3566
+ if (!workflow2.stages)
3567
+ return workflow2;
3568
+ const transformPermissions = fp.map(fp.update("role", fp.property("id")));
3569
+ const transformStages = fp.map(fp.update("permissions", transformPermissions));
3570
+ return fp.update("stages", transformStages, workflow2);
3571
+ }
3572
+ const workflows = {
3573
+ /**
3574
+ * Create a new workflow
3575
+ * @param {import('koa').BaseContext} ctx - koa context
3576
+ */
3577
+ async create(ctx) {
3578
+ const { body, query } = ctx.request;
3579
+ const { sanitizeCreateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
3580
+ { strapi },
3581
+ ctx.state.userAbility
3582
+ );
3583
+ const { populate } = await sanitizedQuery.create(query);
3584
+ const workflowBody = await validateWorkflowCreate(body.data);
3585
+ const workflowService = getService("workflows");
3586
+ const createdWorkflow = await workflowService.create({
3587
+ data: await sanitizeCreateInput(workflowBody),
3588
+ populate
3589
+ }).then(formatWorkflowToAdmin);
3590
+ ctx.body = {
3591
+ data: await sanitizeOutput(createdWorkflow)
3592
+ };
3593
+ },
3594
+ /**
3595
+ * Update a workflow
3596
+ * @param {import('koa').BaseContext} ctx - koa context
3597
+ */
3598
+ async update(ctx) {
3599
+ const { id } = ctx.params;
3600
+ const { body, query } = ctx.request;
3601
+ const workflowService = getService("workflows");
3602
+ const { sanitizeUpdateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
3603
+ { strapi },
3604
+ ctx.state.userAbility
3605
+ );
3606
+ const { populate } = await sanitizedQuery.update(query);
3607
+ const workflowBody = await validateWorkflowUpdate(body.data);
3608
+ const workflow2 = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });
3609
+ if (!workflow2) {
3610
+ return ctx.notFound();
3611
+ }
3612
+ const getPermittedFieldToUpdate = sanitizeUpdateInput(workflow2);
3613
+ const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);
3614
+ const updatedWorkflow = await workflowService.update(workflow2, {
3615
+ data: dataToUpdate,
3616
+ populate
3617
+ }).then(formatWorkflowToAdmin);
3618
+ ctx.body = {
3619
+ data: await sanitizeOutput(updatedWorkflow)
3620
+ };
3621
+ },
3622
+ /**
3623
+ * Delete a workflow
3624
+ * @param {import('koa').BaseContext} ctx - koa context
3625
+ */
3626
+ async delete(ctx) {
3627
+ const { id } = ctx.params;
3628
+ const { query } = ctx.request;
3629
+ const workflowService = getService("workflows");
3630
+ const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
3631
+ { strapi },
3632
+ ctx.state.userAbility
3633
+ );
3634
+ const { populate } = await sanitizedQuery.delete(query);
3635
+ const workflow2 = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });
3636
+ if (!workflow2) {
3637
+ return ctx.notFound("Workflow doesn't exist");
3638
+ }
3639
+ const deletedWorkflow = await workflowService.delete(workflow2, { populate }).then(formatWorkflowToAdmin);
3640
+ ctx.body = {
3641
+ data: await sanitizeOutput(deletedWorkflow)
3642
+ };
3643
+ },
3644
+ /**
3645
+ * List all workflows
3646
+ * @param {import('koa').BaseContext} ctx - koa context
3647
+ */
3648
+ async find(ctx) {
3649
+ const { query } = ctx.request;
3650
+ const workflowService = getService("workflows");
3651
+ const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
3652
+ { strapi },
3653
+ ctx.state.userAbility
3654
+ );
3655
+ const { populate, filters, sort } = await sanitizedQuery.read(query);
3656
+ const [workflows2, workflowCount] = await Promise.all([
3657
+ workflowService.find({ populate, filters, sort }).then(fp.map(formatWorkflowToAdmin)),
3658
+ workflowService.count()
3659
+ ]);
3660
+ ctx.body = {
3661
+ data: await utils$1.mapAsync(workflows2, sanitizeOutput),
3662
+ meta: {
3663
+ workflowCount
3664
+ }
3665
+ };
3666
+ },
3667
+ /**
3668
+ * Get one workflow based on its id contained in request parameters
3669
+ * Returns count of workflows in meta, used to prevent workflow edition when
3670
+ * max workflow count is reached for the current plan
3671
+ * @param {import('koa').BaseContext} ctx - koa context
3672
+ */
3673
+ async findById(ctx) {
3674
+ const { id } = ctx.params;
3675
+ const { query } = ctx.request;
3676
+ const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
3677
+ { strapi },
3678
+ ctx.state.userAbility
3679
+ );
3680
+ const { populate } = await sanitizedQuery.read(query);
3681
+ const workflowService = getService("workflows");
3682
+ const [workflow2, workflowCount] = await Promise.all([
3683
+ workflowService.findById(id, { populate }).then(formatWorkflowToAdmin),
3684
+ workflowService.count()
3685
+ ]);
3686
+ ctx.body = {
3687
+ data: await sanitizeOutput(workflow2),
3688
+ meta: { workflowCount }
3689
+ };
3690
+ }
3691
+ };
3692
+ function sanitizeStage({ strapi: strapi2 }, userAbility) {
3693
+ const permissionChecker = strapi2.plugin("content-manager").service("permission-checker").create({ userAbility, model: STAGE_MODEL_UID });
3694
+ return (entity) => permissionChecker.sanitizeOutput(entity);
3695
+ }
3696
+ const stages = {
3697
+ /**
3698
+ * List all stages
3699
+ * @param {import('koa').BaseContext} ctx - koa context
3700
+ */
3701
+ async find(ctx) {
3702
+ const { workflow_id: workflowId } = ctx.params;
3703
+ const { populate } = ctx.query;
3704
+ const stagesService = getService("stages");
3705
+ const sanitizer = sanitizeStage({ strapi }, ctx.state.userAbility);
3706
+ const stages2 = await stagesService.find({
3707
+ workflowId,
3708
+ populate
3709
+ });
3710
+ ctx.body = {
3711
+ data: await utils$1.mapAsync(stages2, sanitizer)
3712
+ };
3713
+ },
3714
+ /**
3715
+ * Get one stage
3716
+ * @param {import('koa').BaseContext} ctx - koa context
3717
+ */
3718
+ async findById(ctx) {
3719
+ const { id, workflow_id: workflowId } = ctx.params;
3720
+ const { populate } = ctx.query;
3721
+ const stagesService = getService("stages");
3722
+ const sanitizer = sanitizeStage({ strapi }, ctx.state.userAbility);
3723
+ const stage = await stagesService.findById(id, {
3724
+ workflowId,
3725
+ populate
3726
+ });
3727
+ ctx.body = {
3728
+ data: await sanitizer(stage)
3729
+ };
3730
+ },
3731
+ /**
3732
+ * Updates an entity's stage.
3733
+ * @async
3734
+ * @param {Object} ctx - The Koa context object.
3735
+ * @param {Object} ctx.params - An object containing the parameters from the request URL.
3736
+ * @param {string} ctx.params.model_uid - The model UID of the entity.
3737
+ * @param {string} ctx.params.id - The ID of the entity to update.
3738
+ * @param {Object} ctx.request.body.data - Optional data object containing the new stage ID for the entity.
3739
+ * @param {string} ctx.request.body.data.id - The ID of the new stage for the entity.
3740
+ * @throws {ApplicationError} If review workflows is not activated on the specified model UID.
3741
+ * @throws {ValidationError} If the `data` object in the request body fails to pass validation.
3742
+ * @returns {Promise<void>} A promise that resolves when the entity's stage has been updated.
3743
+ */
3744
+ async updateEntity(ctx) {
3745
+ const stagesService = getService("stages");
3746
+ const stagePermissions2 = getService("stage-permissions");
3747
+ const workflowService = getService("workflows");
3748
+ const { model_uid: modelUID, id } = ctx.params;
3749
+ const { body } = ctx.request;
3750
+ const { sanitizeOutput } = strapi.plugin("content-manager").service("permission-checker").create({ userAbility: ctx.state.userAbility, model: modelUID });
3751
+ const entity = await strapi.entityService.findOne(modelUID, Number(id), {
3752
+ populate: [ENTITY_STAGE_ATTRIBUTE]
3753
+ });
3754
+ if (!entity) {
3755
+ ctx.throw(404, "Entity not found");
3756
+ }
3757
+ const canTransition = stagePermissions2.can(
3758
+ STAGE_TRANSITION_UID,
3759
+ entity[ENTITY_STAGE_ATTRIBUTE]?.id
3760
+ );
3761
+ if (!canTransition) {
3762
+ ctx.throw(403, "Forbidden stage transition");
3763
+ }
3764
+ const { id: stageId } = await validateUpdateStageOnEntity(
3765
+ { id: Number(body?.data?.id) },
3766
+ "You should pass an id to the body of the put request."
3767
+ );
3768
+ const workflow2 = await workflowService.assertContentTypeBelongsToWorkflow(modelUID);
3769
+ workflowService.assertStageBelongsToWorkflow(stageId, workflow2);
3770
+ const updatedEntity = await stagesService.updateEntity({ id: entity.id, modelUID }, stageId);
3771
+ ctx.body = { data: await sanitizeOutput(updatedEntity) };
3772
+ },
3773
+ /**
3774
+ * List all the stages that are available for a user to transition an entity to.
3775
+ * If the user has permission to change the current stage of the entity every other stage in the workflow is returned
3776
+ * @async
3777
+ * @param {*} ctx
3778
+ * @param {string} ctx.params.model_uid - The model UID of the entity.
3779
+ * @param {string} ctx.params.id - The ID of the entity.
3780
+ * @throws {ApplicationError} If review workflows is not activated on the specified model UID.
3781
+ */
3782
+ async listAvailableStages(ctx) {
3783
+ const stagePermissions2 = getService("stage-permissions");
3784
+ const workflowService = getService("workflows");
3785
+ const { model_uid: modelUID, id } = ctx.params;
3786
+ if (strapi.plugin("content-manager").service("permission-checker").create({ userAbility: ctx.state.userAbility, model: modelUID }).cannot.read()) {
3787
+ return ctx.forbidden();
3788
+ }
3789
+ const entity = await strapi.entityService.findOne(modelUID, Number(id), {
3790
+ populate: [ENTITY_STAGE_ATTRIBUTE]
3791
+ });
3792
+ if (!entity) {
3793
+ ctx.throw(404, "Entity not found");
3794
+ }
3795
+ const entityStageId = entity[ENTITY_STAGE_ATTRIBUTE]?.id;
3796
+ const canTransition = stagePermissions2.can(STAGE_TRANSITION_UID, entityStageId);
3797
+ const [workflowCount, { stages: workflowStages }] = await Promise.all([
3798
+ workflowService.count(),
3799
+ workflowService.getAssignedWorkflow(modelUID, {
3800
+ populate: "stages"
3801
+ })
3802
+ ]);
3803
+ const meta = {
3804
+ stageCount: workflowStages.length,
3805
+ workflowCount
3806
+ };
3807
+ if (!canTransition) {
3808
+ ctx.body = {
3809
+ data: [],
3810
+ meta
3811
+ };
3812
+ return;
3813
+ }
3814
+ const data = workflowStages.filter((stage) => stage.id !== entityStageId);
3815
+ ctx.body = {
3816
+ data,
3817
+ meta
3818
+ };
3819
+ }
3820
+ };
3821
+ const assignees = {
3822
+ /**
3823
+ * Updates an entity's assignee.
3824
+ * @async
3825
+ * @param {Object} ctx - The Koa context object.
3826
+ * @param {Object} ctx.params - An object containing the parameters from the request URL.
3827
+ * @param {string} ctx.params.model_uid - The model UID of the entity.
3828
+ * @param {string} ctx.params.id - The ID of the entity to update.
3829
+ * @param {Object} ctx.request.body.data - Optional data object containing the new assignee ID for the entity.
3830
+ * @param {string} ctx.request.body.data.id - The ID of the new assignee for the entity.
3831
+ * @throws {ApplicationError} If review workflows is not activated on the specified model UID.
3832
+ * @throws {ValidationError} If the `data` object in the request body fails to pass validation.
3833
+ * @returns {Promise<void>} A promise that resolves when the entity's assignee has been updated.
3834
+ */
3835
+ async updateEntity(ctx) {
3836
+ const assigneeService = getService("assignees");
3837
+ const workflowService = getService("workflows");
3838
+ const { model_uid: model, id } = ctx.params;
3839
+ const { sanitizeOutput } = strapi.plugin("content-manager").service("permission-checker").create({ userAbility: ctx.state.userAbility, model });
3840
+ const { id: assigneeId } = await validateUpdateAssigneeOnEntity(
3841
+ ctx.request?.body?.data,
3842
+ "You should pass a valid id to the body of the put request."
3843
+ );
3844
+ await workflowService.assertContentTypeBelongsToWorkflow(model);
3845
+ const entity = await assigneeService.updateEntityAssignee(id, model, assigneeId);
3846
+ ctx.body = { data: await sanitizeOutput(entity) };
3847
+ }
3848
+ };
3849
+ const index = {
3850
+ authentication,
3851
+ role,
3852
+ user,
3853
+ auditLogs,
3854
+ admin,
3855
+ workflows,
3856
+ stages,
3857
+ assignees
3858
+ };
3859
+ exports.bootstrap = bootstrap;
3860
+ exports.contentTypes = index$3;
3861
+ exports.controllers = index;
3862
+ exports.destroy = destroy;
3863
+ exports.register = register;
3864
+ exports.routes = index$2;
3865
+ exports.services = index$1;
3866
+ //# sourceMappingURL=index.js.map