@strapi/admin 5.0.0-beta.1 → 5.0.0-beta.10

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 (1112) hide show
  1. package/dist/admin/AdminSeatInfo-Bbq8UNek.mjs +92 -0
  2. package/dist/admin/AdminSeatInfo-Bbq8UNek.mjs.map +1 -0
  3. package/dist/admin/AdminSeatInfo-pe7_J25t.js +96 -0
  4. package/dist/admin/AdminSeatInfo-pe7_J25t.js.map +1 -0
  5. package/dist/admin/ApplicationInfoPage-S_AoXyUe.js +658 -0
  6. package/dist/admin/ApplicationInfoPage-S_AoXyUe.js.map +1 -0
  7. package/dist/admin/ApplicationInfoPage-bfXW7lrq.mjs +631 -0
  8. package/dist/admin/ApplicationInfoPage-bfXW7lrq.mjs.map +1 -0
  9. package/dist/admin/AuthResponse-BJbG4S2h.js +81 -0
  10. package/dist/admin/AuthResponse-BJbG4S2h.js.map +1 -0
  11. package/dist/admin/AuthResponse-CTQ0fh3I.mjs +57 -0
  12. package/dist/admin/AuthResponse-CTQ0fh3I.mjs.map +1 -0
  13. package/dist/admin/AuthenticatedLayout-lXbF2KKJ.mjs +1160 -0
  14. package/dist/admin/AuthenticatedLayout-lXbF2KKJ.mjs.map +1 -0
  15. package/dist/admin/AuthenticatedLayout-s7jnYVG9.js +1192 -0
  16. package/dist/admin/AuthenticatedLayout-s7jnYVG9.js.map +1 -0
  17. package/dist/admin/ContentBox-3MRTNw0X.js +43 -0
  18. package/dist/admin/ContentBox-3MRTNw0X.js.map +1 -0
  19. package/dist/admin/ContentBox-9LBDzws0.mjs +41 -0
  20. package/dist/admin/ContentBox-9LBDzws0.mjs.map +1 -0
  21. package/dist/admin/CreateActionEE-Yfp4hs7a.mjs +49 -0
  22. package/dist/admin/CreateActionEE-Yfp4hs7a.mjs.map +1 -0
  23. package/dist/admin/CreateActionEE-uqyKLxwI.js +76 -0
  24. package/dist/admin/CreateActionEE-uqyKLxwI.js.map +1 -0
  25. package/dist/admin/CreatePage-4gOQVUMq.mjs +13 -0
  26. package/dist/admin/CreatePage-4gOQVUMq.mjs.map +1 -0
  27. package/dist/admin/CreatePage-6pIItf4z.mjs +243 -0
  28. package/dist/admin/CreatePage-6pIItf4z.mjs.map +1 -0
  29. package/dist/admin/CreatePage-s23BIVXe.js +18 -0
  30. package/dist/admin/CreatePage-s23BIVXe.js.map +1 -0
  31. package/dist/admin/CreatePage-uWZ7dxp6.js +269 -0
  32. package/dist/admin/CreatePage-uWZ7dxp6.js.map +1 -0
  33. package/dist/admin/CreateView-3cLNRlgO.mjs +13 -0
  34. package/dist/admin/CreateView-3cLNRlgO.mjs.map +1 -0
  35. package/dist/admin/CreateView-DNHRcJsj.js +17 -0
  36. package/dist/admin/CreateView-DNHRcJsj.js.map +1 -0
  37. package/dist/admin/CreateView-JQYIo77z.js +17 -0
  38. package/dist/admin/CreateView-JQYIo77z.js.map +1 -0
  39. package/dist/admin/CreateView-aMz4KfSZ.mjs +13 -0
  40. package/dist/admin/CreateView-aMz4KfSZ.mjs.map +1 -0
  41. package/dist/admin/EditPage-24cGvUbV.js +297 -0
  42. package/dist/admin/EditPage-24cGvUbV.js.map +1 -0
  43. package/dist/admin/EditPage-JPZ7c-8x.mjs +737 -0
  44. package/dist/admin/EditPage-JPZ7c-8x.mjs.map +1 -0
  45. package/dist/admin/EditPage-Wpz4YmVY.js +351 -0
  46. package/dist/admin/EditPage-Wpz4YmVY.js.map +1 -0
  47. package/dist/admin/EditPage-tUvaZzFe.mjs +322 -0
  48. package/dist/admin/EditPage-tUvaZzFe.mjs.map +1 -0
  49. package/dist/admin/EditPage-tmpterlY.mjs +271 -0
  50. package/dist/admin/EditPage-tmpterlY.mjs.map +1 -0
  51. package/dist/admin/EditPage-wGJLuMsP.js +762 -0
  52. package/dist/admin/EditPage-wGJLuMsP.js.map +1 -0
  53. package/dist/admin/EditView-HjYkw6Y_.mjs +332 -0
  54. package/dist/admin/EditView-HjYkw6Y_.mjs.map +1 -0
  55. package/dist/admin/EditView-ul5nHrFh.js +358 -0
  56. package/dist/admin/EditView-ul5nHrFh.js.map +1 -0
  57. package/dist/admin/EditViewPage-bnTbQJ_O.mjs +817 -0
  58. package/dist/admin/EditViewPage-bnTbQJ_O.mjs.map +1 -0
  59. package/dist/admin/EditViewPage-c3DI4uzU.js +849 -0
  60. package/dist/admin/EditViewPage-c3DI4uzU.js.map +1 -0
  61. package/dist/admin/EventsTable-7--SHloR.js +36 -0
  62. package/dist/admin/EventsTable-7--SHloR.js.map +1 -0
  63. package/dist/admin/EventsTable-XUKqJdnX.mjs +32 -0
  64. package/dist/admin/EventsTable-XUKqJdnX.mjs.map +1 -0
  65. package/dist/admin/HomePage--Mskxb9Z.mjs +579 -0
  66. package/dist/admin/HomePage--Mskxb9Z.mjs.map +1 -0
  67. package/dist/admin/HomePage-Xrg1dR_D.js +604 -0
  68. package/dist/admin/HomePage-Xrg1dR_D.js.map +1 -0
  69. package/dist/admin/HomePage-fBY17m1h.js +15 -0
  70. package/dist/admin/HomePage-fBY17m1h.js.map +1 -0
  71. package/dist/admin/HomePage-ppJpMP9G.mjs +11 -0
  72. package/dist/admin/HomePage-ppJpMP9G.mjs.map +1 -0
  73. package/dist/admin/InstalledPluginsPage-EtnkMG0G.mjs +97 -0
  74. package/dist/admin/InstalledPluginsPage-EtnkMG0G.mjs.map +1 -0
  75. package/dist/admin/InstalledPluginsPage-alfcy8jO.js +122 -0
  76. package/dist/admin/InstalledPluginsPage-alfcy8jO.js.map +1 -0
  77. package/dist/admin/Layout-9EvJq4Gc.mjs +215 -0
  78. package/dist/admin/Layout-9EvJq4Gc.mjs.map +1 -0
  79. package/dist/admin/Layout-RKjEsOtu.js +242 -0
  80. package/dist/admin/Layout-RKjEsOtu.js.map +1 -0
  81. package/dist/admin/ListPage-21q8_YN7.mjs +487 -0
  82. package/dist/admin/ListPage-21q8_YN7.mjs.map +1 -0
  83. package/dist/admin/ListPage-CRyM6NXF.js +559 -0
  84. package/dist/admin/ListPage-CRyM6NXF.js.map +1 -0
  85. package/dist/admin/ListPage-D8Ih2axK.js +515 -0
  86. package/dist/admin/ListPage-D8Ih2axK.js.map +1 -0
  87. package/dist/admin/ListPage-MJlQ5gGq.js +293 -0
  88. package/dist/admin/ListPage-MJlQ5gGq.js.map +1 -0
  89. package/dist/admin/ListPage-TkJa9Qcz.js +335 -0
  90. package/dist/admin/ListPage-TkJa9Qcz.js.map +1 -0
  91. package/dist/admin/ListPage-Ur-kwyVv.mjs +531 -0
  92. package/dist/admin/ListPage-Ur-kwyVv.mjs.map +1 -0
  93. package/dist/admin/ListPage-Z0mmlysk.js +15 -0
  94. package/dist/admin/ListPage-Z0mmlysk.js.map +1 -0
  95. package/dist/admin/ListPage-gl3tUWS8.mjs +310 -0
  96. package/dist/admin/ListPage-gl3tUWS8.mjs.map +1 -0
  97. package/dist/admin/ListPage-nbTQdpBX.mjs +11 -0
  98. package/dist/admin/ListPage-nbTQdpBX.mjs.map +1 -0
  99. package/dist/admin/ListPage-xQbMtUpV.mjs +268 -0
  100. package/dist/admin/ListPage-xQbMtUpV.mjs.map +1 -0
  101. package/dist/admin/ListView-Drn22JZ1.mjs +200 -0
  102. package/dist/admin/ListView-Drn22JZ1.mjs.map +1 -0
  103. package/dist/admin/ListView-geMTlhDN.mjs +211 -0
  104. package/dist/admin/ListView-geMTlhDN.mjs.map +1 -0
  105. package/dist/admin/ListView-nRGxAwIh.js +237 -0
  106. package/dist/admin/ListView-nRGxAwIh.js.map +1 -0
  107. package/dist/admin/ListView-qAX3ZO28.js +226 -0
  108. package/dist/admin/ListView-qAX3ZO28.js.map +1 -0
  109. package/dist/admin/Login-Hn_q1QSn.js +35 -0
  110. package/dist/admin/Login-Hn_q1QSn.js.map +1 -0
  111. package/dist/admin/Login-ngKWBSD4.mjs +31 -0
  112. package/dist/admin/Login-ngKWBSD4.mjs.map +1 -0
  113. package/dist/admin/MagicLinkEE-B5NOEO47.js +31 -0
  114. package/dist/admin/MagicLinkEE-B5NOEO47.js.map +1 -0
  115. package/dist/admin/MagicLinkEE-JWmJRiBS.mjs +27 -0
  116. package/dist/admin/MagicLinkEE-JWmJRiBS.mjs.map +1 -0
  117. package/dist/admin/MarketplacePage-Pk9USes6.mjs +971 -0
  118. package/dist/admin/MarketplacePage-Pk9USes6.mjs.map +1 -0
  119. package/dist/admin/MarketplacePage-vQaaicxu.js +1001 -0
  120. package/dist/admin/MarketplacePage-vQaaicxu.js.map +1 -0
  121. package/dist/admin/Ornaments-jAwgQeK0.mjs +209 -0
  122. package/dist/admin/Ornaments-jAwgQeK0.mjs.map +1 -0
  123. package/dist/admin/Ornaments-sFPQPOtb.js +214 -0
  124. package/dist/admin/Ornaments-sFPQPOtb.js.map +1 -0
  125. package/dist/admin/Permissions-2GKZ2IjP.mjs +1986 -0
  126. package/dist/admin/Permissions-2GKZ2IjP.mjs.map +1 -0
  127. package/dist/admin/Permissions-GCSY8mIm.js +2022 -0
  128. package/dist/admin/Permissions-GCSY8mIm.js.map +1 -0
  129. package/dist/admin/PrivateRoute-KfrFibGN.js +22 -0
  130. package/dist/admin/PrivateRoute-KfrFibGN.js.map +1 -0
  131. package/dist/admin/PrivateRoute-xkGBbDbU.mjs +20 -0
  132. package/dist/admin/PrivateRoute-xkGBbDbU.mjs.map +1 -0
  133. package/dist/admin/ProfilePage-Q5UpeDjs.mjs +387 -0
  134. package/dist/admin/ProfilePage-Q5UpeDjs.mjs.map +1 -0
  135. package/dist/admin/ProfilePage-o028o7JD.js +415 -0
  136. package/dist/admin/ProfilePage-o028o7JD.js.map +1 -0
  137. package/dist/admin/PurchaseAuditLogs-Vur69JZB.js +53 -0
  138. package/dist/admin/PurchaseAuditLogs-Vur69JZB.js.map +1 -0
  139. package/dist/admin/PurchaseAuditLogs-tpXbhCx-.mjs +49 -0
  140. package/dist/admin/PurchaseAuditLogs-tpXbhCx-.mjs.map +1 -0
  141. package/dist/admin/PurchaseSingleSignOn-6VTPjJVO.mjs +52 -0
  142. package/dist/admin/PurchaseSingleSignOn-6VTPjJVO.mjs.map +1 -0
  143. package/dist/admin/PurchaseSingleSignOn-7NMcihzT.js +56 -0
  144. package/dist/admin/PurchaseSingleSignOn-7NMcihzT.js.map +1 -0
  145. package/dist/admin/SSOProviders-QBcyB9VI.js +60 -0
  146. package/dist/admin/SSOProviders-QBcyB9VI.js.map +1 -0
  147. package/dist/admin/SSOProviders-nMmBLr8g.mjs +58 -0
  148. package/dist/admin/SSOProviders-nMmBLr8g.mjs.map +1 -0
  149. package/dist/admin/SelectRoles-BtQp5Va-.mjs +111 -0
  150. package/dist/admin/SelectRoles-BtQp5Va-.mjs.map +1 -0
  151. package/dist/admin/SelectRoles-q8vaxqfL.js +115 -0
  152. package/dist/admin/SelectRoles-q8vaxqfL.js.map +1 -0
  153. package/dist/admin/SingleSignOnPage-X1OAuyhO.mjs +231 -0
  154. package/dist/admin/SingleSignOnPage-X1OAuyhO.mjs.map +1 -0
  155. package/dist/admin/SingleSignOnPage-_l9MyJvN.js +256 -0
  156. package/dist/admin/SingleSignOnPage-_l9MyJvN.js.map +1 -0
  157. package/dist/admin/Table-V5-qnRte.mjs +183 -0
  158. package/dist/admin/Table-V5-qnRte.mjs.map +1 -0
  159. package/dist/admin/Table-z6l5BFoH.js +205 -0
  160. package/dist/admin/Table-z6l5BFoH.js.map +1 -0
  161. package/dist/admin/TokenTypeSelect-2iXEz7zs.js +402 -0
  162. package/dist/admin/TokenTypeSelect-2iXEz7zs.js.map +1 -0
  163. package/dist/admin/TokenTypeSelect-crPtoLFc.mjs +374 -0
  164. package/dist/admin/TokenTypeSelect-crPtoLFc.mjs.map +1 -0
  165. package/dist/admin/UseCasePage-26Y6U1DU.js +155 -0
  166. package/dist/admin/UseCasePage-26Y6U1DU.js.map +1 -0
  167. package/dist/admin/UseCasePage-QsvlJAQD.mjs +129 -0
  168. package/dist/admin/UseCasePage-QsvlJAQD.mjs.map +1 -0
  169. package/dist/admin/admin-B6AW0Kov.mjs +318 -0
  170. package/dist/admin/admin-B6AW0Kov.mjs.map +1 -0
  171. package/dist/admin/admin-p0djr5G6.js +338 -0
  172. package/dist/admin/admin-p0djr5G6.js.map +1 -0
  173. package/dist/admin/apiTokens-YMUmHnrH.mjs +57 -0
  174. package/dist/admin/apiTokens-YMUmHnrH.mjs.map +1 -0
  175. package/dist/admin/apiTokens-YxfAnO7_.js +63 -0
  176. package/dist/admin/apiTokens-YxfAnO7_.js.map +1 -0
  177. package/dist/admin/ar-74XpZHjA.js +853 -0
  178. package/dist/admin/ar-74XpZHjA.js.map +1 -0
  179. package/dist/admin/ar-gTQs8p7A.mjs +832 -0
  180. package/dist/admin/ar-gTQs8p7A.mjs.map +1 -0
  181. package/dist/admin/ca-A-U5stlG.mjs +520 -0
  182. package/dist/admin/ca-A-U5stlG.mjs.map +1 -0
  183. package/dist/admin/ca-tfhzbe_0.js +538 -0
  184. package/dist/admin/ca-tfhzbe_0.js.map +1 -0
  185. package/dist/admin/constants-Maq_tQvu.js +55 -0
  186. package/dist/admin/constants-Maq_tQvu.js.map +1 -0
  187. package/dist/admin/constants-ThodPHfR.mjs +51 -0
  188. package/dist/admin/constants-ThodPHfR.mjs.map +1 -0
  189. package/dist/admin/cs-iYqoHUVt.mjs +166 -0
  190. package/dist/admin/cs-iYqoHUVt.mjs.map +1 -0
  191. package/dist/admin/cs-sS-228vY.js +179 -0
  192. package/dist/admin/cs-sS-228vY.js.map +1 -0
  193. package/dist/admin/de-og0YSnla.js +532 -0
  194. package/dist/admin/de-og0YSnla.js.map +1 -0
  195. package/dist/admin/de-uZBjRd6a.mjs +514 -0
  196. package/dist/admin/de-uZBjRd6a.mjs.map +1 -0
  197. package/dist/admin/dk-GtDhDxRc.js +452 -0
  198. package/dist/admin/dk-GtDhDxRc.js.map +1 -0
  199. package/dist/admin/dk-nXAO32DE.mjs +434 -0
  200. package/dist/admin/dk-nXAO32DE.mjs.map +1 -0
  201. package/dist/admin/ee.js +12 -0
  202. package/dist/admin/ee.js.map +1 -0
  203. package/dist/admin/ee.mjs +3 -0
  204. package/dist/admin/ee.mjs.map +1 -0
  205. package/dist/admin/en-GunF9CPV.mjs +786 -0
  206. package/dist/admin/en-GunF9CPV.mjs.map +1 -0
  207. package/dist/admin/en-Wdy8NEIO.js +807 -0
  208. package/dist/admin/en-Wdy8NEIO.js.map +1 -0
  209. package/dist/admin/es-TQtY4G8X.js +615 -0
  210. package/dist/admin/es-TQtY4G8X.js.map +1 -0
  211. package/dist/admin/es-i0dEHPPQ.mjs +595 -0
  212. package/dist/admin/es-i0dEHPPQ.mjs.map +1 -0
  213. package/dist/admin/eu-SRdPRyQu.js +645 -0
  214. package/dist/admin/eu-SRdPRyQu.js.map +1 -0
  215. package/dist/admin/eu-wFmYHERY.mjs +625 -0
  216. package/dist/admin/eu-wFmYHERY.mjs.map +1 -0
  217. package/dist/admin/fr-GW5-kEO9.js +571 -0
  218. package/dist/admin/fr-GW5-kEO9.js.map +1 -0
  219. package/dist/admin/fr-OI7VyC_k.mjs +550 -0
  220. package/dist/admin/fr-OI7VyC_k.mjs.map +1 -0
  221. package/dist/admin/gu-z6qqOLRh.js +438 -0
  222. package/dist/admin/gu-z6qqOLRh.js.map +1 -0
  223. package/dist/admin/gu-zSaMc-a6.mjs +429 -0
  224. package/dist/admin/gu-zSaMc-a6.mjs.map +1 -0
  225. package/dist/admin/he-CLdZZ_n1.js +329 -0
  226. package/dist/admin/he-CLdZZ_n1.js.map +1 -0
  227. package/dist/admin/he-YzAGShlQ.mjs +315 -0
  228. package/dist/admin/he-YzAGShlQ.mjs.map +1 -0
  229. package/dist/admin/hi-3pMoYe6q.js +537 -0
  230. package/dist/admin/hi-3pMoYe6q.js.map +1 -0
  231. package/dist/admin/hi-ZQ4t6UdY.mjs +519 -0
  232. package/dist/admin/hi-ZQ4t6UdY.mjs.map +1 -0
  233. package/dist/admin/hu-O1FJoY8c.mjs +625 -0
  234. package/dist/admin/hu-O1FJoY8c.mjs.map +1 -0
  235. package/dist/admin/hu-VxIqV1X0.js +645 -0
  236. package/dist/admin/hu-VxIqV1X0.js.map +1 -0
  237. package/dist/admin/id-Lb_0kPQU.mjs +290 -0
  238. package/dist/admin/id-Lb_0kPQU.mjs.map +1 -0
  239. package/dist/admin/id-cUUpuxZO.js +303 -0
  240. package/dist/admin/id-cUUpuxZO.js.map +1 -0
  241. package/dist/admin/index-Ncrnmg5a.js +5385 -0
  242. package/dist/admin/index-Ncrnmg5a.js.map +1 -0
  243. package/dist/admin/index-jwAq-BX-.mjs +5306 -0
  244. package/dist/admin/index-jwAq-BX-.mjs.map +1 -0
  245. package/dist/admin/index.js +33 -27
  246. package/dist/admin/index.js.map +1 -1
  247. package/dist/admin/index.mjs +3 -3
  248. package/dist/admin/it-136monzD.mjs +299 -0
  249. package/dist/admin/it-136monzD.mjs.map +1 -0
  250. package/dist/admin/it-m8H0rXTP.js +312 -0
  251. package/dist/admin/it-m8H0rXTP.js.map +1 -0
  252. package/dist/admin/ja-0-FUC0T4.mjs +434 -0
  253. package/dist/admin/ja-0-FUC0T4.mjs.map +1 -0
  254. package/dist/admin/ja-jhqUhh7F.js +452 -0
  255. package/dist/admin/ja-jhqUhh7F.js.map +1 -0
  256. package/dist/admin/ko-Fq49QS3z.js +451 -0
  257. package/dist/admin/ko-Fq49QS3z.js.map +1 -0
  258. package/dist/admin/ko-H3Y8GpnD.mjs +433 -0
  259. package/dist/admin/ko-H3Y8GpnD.mjs.map +1 -0
  260. package/dist/admin/ml-NPdcpJoN.mjs +519 -0
  261. package/dist/admin/ml-NPdcpJoN.mjs.map +1 -0
  262. package/dist/admin/ml-mLJM4sQP.js +537 -0
  263. package/dist/admin/ml-mLJM4sQP.js.map +1 -0
  264. package/dist/admin/ms-NDmpSkMY.js +213 -0
  265. package/dist/admin/ms-NDmpSkMY.js.map +1 -0
  266. package/dist/admin/ms-v9c434YI.mjs +200 -0
  267. package/dist/admin/ms-v9c434YI.mjs.map +1 -0
  268. package/dist/admin/nl-RREi1JAg.js +641 -0
  269. package/dist/admin/nl-RREi1JAg.js.map +1 -0
  270. package/dist/admin/nl-qHmOt3d1.mjs +621 -0
  271. package/dist/admin/nl-qHmOt3d1.mjs.map +1 -0
  272. package/dist/admin/no-2wT9Jd9n.js +313 -0
  273. package/dist/admin/no-2wT9Jd9n.js.map +1 -0
  274. package/dist/admin/no-XGZQN-Ji.mjs +300 -0
  275. package/dist/admin/no-XGZQN-Ji.mjs.map +1 -0
  276. package/dist/admin/pl-Id5YX-Pw.mjs +519 -0
  277. package/dist/admin/pl-Id5YX-Pw.mjs.map +1 -0
  278. package/dist/admin/pl-kU2npCRO.js +537 -0
  279. package/dist/admin/pl-kU2npCRO.js.map +1 -0
  280. package/dist/admin/pt-BR-0o0Gf-P8.mjs +588 -0
  281. package/dist/admin/pt-BR-0o0Gf-P8.mjs.map +1 -0
  282. package/dist/admin/pt-BR-R-dMJxPL.js +608 -0
  283. package/dist/admin/pt-BR-R-dMJxPL.js.map +1 -0
  284. package/dist/admin/pt-IygqsPYv.js +212 -0
  285. package/dist/admin/pt-IygqsPYv.js.map +1 -0
  286. package/dist/admin/pt-f52AXrxz.mjs +200 -0
  287. package/dist/admin/pt-f52AXrxz.mjs.map +1 -0
  288. package/dist/admin/rbac-A_QIXvpC.mjs +1174 -0
  289. package/dist/admin/rbac-A_QIXvpC.mjs.map +1 -0
  290. package/dist/admin/rbac-c6QPc6s7.js +1240 -0
  291. package/dist/admin/rbac-c6QPc6s7.js.map +1 -0
  292. package/dist/admin/ru-5TBoMH_2.js +766 -0
  293. package/dist/admin/ru-5TBoMH_2.js.map +1 -0
  294. package/dist/admin/ru-FpmG9SEf.mjs +745 -0
  295. package/dist/admin/ru-FpmG9SEf.mjs.map +1 -0
  296. package/dist/admin/sa-KUwV8aRB.mjs +519 -0
  297. package/dist/admin/sa-KUwV8aRB.mjs.map +1 -0
  298. package/dist/admin/sa-KmwTiEO5.js +537 -0
  299. package/dist/admin/sa-KmwTiEO5.js.map +1 -0
  300. package/dist/admin/selectors-s8oNaHXK.mjs +6 -0
  301. package/dist/admin/selectors-s8oNaHXK.mjs.map +1 -0
  302. package/dist/admin/selectors-yGCxM4Rk.js +8 -0
  303. package/dist/admin/selectors-yGCxM4Rk.js.map +1 -0
  304. package/dist/admin/sk-IV2uPmXo.js +503 -0
  305. package/dist/admin/sk-IV2uPmXo.js.map +1 -0
  306. package/dist/admin/sk-g_1C955P.mjs +483 -0
  307. package/dist/admin/sk-g_1C955P.mjs.map +1 -0
  308. package/dist/admin/src/StrapiApp.d.ts +14 -42
  309. package/dist/admin/src/components/ConfirmDialog.d.ts +17 -7
  310. package/dist/admin/src/components/Context.d.ts +6 -0
  311. package/dist/admin/src/components/Filters.d.ts +10 -9
  312. package/dist/admin/src/components/Form.d.ts +18 -4
  313. package/dist/admin/src/components/FormInputs/Boolean.d.ts +2 -2
  314. package/dist/admin/src/components/FormInputs/Checkbox.d.ts +2 -2
  315. package/dist/admin/src/components/FormInputs/Date.d.ts +2 -2
  316. package/dist/admin/src/components/FormInputs/DateTime.d.ts +2 -2
  317. package/dist/admin/src/components/FormInputs/Email.d.ts +2 -1
  318. package/dist/admin/src/components/FormInputs/Enumeration.d.ts +2 -1
  319. package/dist/admin/src/components/FormInputs/Json.d.ts +3 -4
  320. package/dist/admin/src/components/FormInputs/Number.d.ts +2 -2
  321. package/dist/admin/src/components/FormInputs/Password.d.ts +2 -1
  322. package/dist/admin/src/components/FormInputs/Renderer.d.ts +2 -8
  323. package/dist/admin/src/components/FormInputs/String.d.ts +2 -4
  324. package/dist/admin/src/components/FormInputs/Textarea.d.ts +2 -1
  325. package/dist/admin/src/components/FormInputs/Time.d.ts +2 -2
  326. package/dist/admin/src/components/FormInputs/types.d.ts +1 -0
  327. package/dist/admin/src/components/Layouts/ActionLayout.d.ts +7 -0
  328. package/dist/admin/src/components/Layouts/ContentLayout.d.ts +6 -0
  329. package/dist/admin/src/components/Layouts/GridLayout.d.ts +17 -0
  330. package/dist/admin/src/components/Layouts/HeaderLayout.d.ts +19 -0
  331. package/dist/admin/src/components/Layouts/Layout.d.ts +18 -0
  332. package/dist/admin/src/components/MainNav/MainNav.d.ts +3 -0
  333. package/dist/admin/src/components/MainNav/NavBrand.d.ts +1 -0
  334. package/dist/admin/src/components/MainNav/NavLink.d.ts +24 -0
  335. package/dist/admin/src/components/MainNav/NavUser.d.ts +7 -0
  336. package/dist/admin/src/components/PageHelpers.d.ts +5 -1
  337. package/dist/admin/src/components/Table.d.ts +1 -1
  338. package/dist/admin/src/constants.d.ts +2 -2
  339. package/dist/admin/src/core/apis/rbac.d.ts +24 -0
  340. package/dist/admin/src/core/store/configure.d.ts +4 -21
  341. package/dist/admin/src/core/store/hooks.d.ts +3 -24
  342. package/dist/admin/src/ee.d.ts +5 -0
  343. package/dist/admin/src/features/Auth.d.ts +14 -3
  344. package/dist/admin/src/features/BackButton.d.ts +1 -1
  345. package/dist/admin/src/features/StrapiApp.d.ts +3 -1
  346. package/dist/admin/src/features/Tracking.d.ts +1 -1
  347. package/dist/admin/src/hooks/useAPIErrorHandler.d.ts +2 -4
  348. package/dist/admin/src/hooks/useAdminRoles.d.ts +2 -2
  349. package/dist/admin/src/hooks/useContentTypes.d.ts +3 -3
  350. package/dist/admin/src/hooks/useFetchClient.d.ts +4 -10
  351. package/dist/admin/src/hooks/useFocusInputField.d.ts +2 -5
  352. package/dist/admin/src/hooks/useMenu.d.ts +1 -1
  353. package/dist/admin/src/hooks/useRBAC.d.ts +33 -1
  354. package/dist/admin/src/hooks/useSettingsMenu.d.ts +1 -1
  355. package/dist/admin/src/index.d.ts +18 -7
  356. package/dist/admin/src/layouts/UnauthenticatedLayout.d.ts +4 -1
  357. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -2
  358. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.d.ts +9 -0
  359. package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +6 -50
  360. package/dist/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.d.ts +1 -1
  361. package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.d.ts +4 -1
  362. package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.d.ts +1 -4
  363. package/dist/admin/src/pages/Settings/pages/Roles/components/HiddenAction.d.ts +2 -1
  364. package/dist/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.d.ts +2 -4
  365. package/dist/admin/src/pages/Settings/pages/Roles/components/RoleRow.d.ts +1 -1
  366. package/dist/admin/src/pages/Settings/pages/Roles/utils/constants.d.ts +3 -3
  367. package/dist/admin/src/pages/Settings/pages/Users/components/CreateActionCE.d.ts +2 -1
  368. package/dist/admin/src/pages/Settings/pages/Webhooks/components/Events.d.ts +2 -3
  369. package/dist/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.d.ts +2 -2
  370. package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
  371. package/dist/admin/src/selectors.d.ts +2 -16
  372. package/dist/admin/src/services/admin.d.ts +5 -5
  373. package/dist/admin/src/services/api.d.ts +11 -9
  374. package/dist/admin/src/services/apiTokens.d.ts +1 -1
  375. package/dist/admin/src/services/auth.d.ts +14 -12
  376. package/dist/admin/src/services/contentApi.d.ts +2 -2
  377. package/dist/admin/src/services/contentManager.d.ts +6 -2
  378. package/dist/admin/src/services/transferTokens.d.ts +2 -2
  379. package/dist/admin/src/services/users.d.ts +8 -8
  380. package/dist/admin/src/services/webhooks.d.ts +2 -2
  381. package/dist/admin/src/types/adminConfiguration.d.ts +90 -0
  382. package/dist/admin/src/utils/baseQuery.d.ts +10 -9
  383. package/dist/admin/src/utils/getFetchClient.d.ts +40 -10
  384. package/dist/admin/src/utils/normalizeAPIError.d.ts +2 -5
  385. package/dist/admin/src/utils/once.d.ts +1 -0
  386. package/dist/admin/src/utils/urls.d.ts +7 -1
  387. package/dist/admin/src/utils/users.d.ts +4 -4
  388. package/dist/admin/sv-Uv9nW9cN.js +640 -0
  389. package/dist/admin/sv-Uv9nW9cN.js.map +1 -0
  390. package/dist/admin/sv-lzyY1dsz.mjs +620 -0
  391. package/dist/admin/sv-lzyY1dsz.mjs.map +1 -0
  392. package/dist/admin/test.js +180 -2656
  393. package/dist/admin/test.js.map +1 -1
  394. package/dist/admin/test.mjs +176 -2652
  395. package/dist/admin/test.mjs.map +1 -1
  396. package/dist/admin/tests/mockData.d.ts +0 -1065
  397. package/dist/admin/tests/store.d.ts +0 -169
  398. package/dist/admin/tests/utils.d.ts +1 -177
  399. package/dist/admin/th-7LJ9Y8EL.mjs +284 -0
  400. package/dist/admin/th-7LJ9Y8EL.mjs.map +1 -0
  401. package/dist/admin/th-SXQwWjv6.js +297 -0
  402. package/dist/admin/th-SXQwWjv6.js.map +1 -0
  403. package/dist/admin/tr-09v-DLMg.mjs +581 -0
  404. package/dist/admin/tr-09v-DLMg.mjs.map +1 -0
  405. package/dist/admin/tr-RBQM-Vq5.js +601 -0
  406. package/dist/admin/tr-RBQM-Vq5.js.map +1 -0
  407. package/dist/admin/transferTokens-CNI0TFdA.mjs +69 -0
  408. package/dist/admin/transferTokens-CNI0TFdA.mjs.map +1 -0
  409. package/dist/admin/transferTokens-HcVXmOrq.js +76 -0
  410. package/dist/admin/transferTokens-HcVXmOrq.js.map +1 -0
  411. package/dist/admin/uk-38IblmOr.mjs +201 -0
  412. package/dist/admin/uk-38IblmOr.mjs.map +1 -0
  413. package/dist/admin/uk-5T4XFIKm.js +214 -0
  414. package/dist/admin/uk-5T4XFIKm.js.map +1 -0
  415. package/dist/admin/useAdminRoles-gMNUnVWO.mjs +28 -0
  416. package/dist/admin/useAdminRoles-gMNUnVWO.mjs.map +1 -0
  417. package/dist/admin/useAdminRoles-zEk0tBhE.js +50 -0
  418. package/dist/admin/useAdminRoles-zEk0tBhE.js.map +1 -0
  419. package/dist/admin/useEnterprise-DUs6BYlP.js +50 -0
  420. package/dist/admin/useEnterprise-DUs6BYlP.js.map +1 -0
  421. package/dist/admin/useEnterprise-jpsYZWzn.mjs +28 -0
  422. package/dist/admin/useEnterprise-jpsYZWzn.mjs.map +1 -0
  423. package/dist/admin/useLicenseLimitNotification-AUg5DyS9.mjs +80 -0
  424. package/dist/admin/useLicenseLimitNotification-AUg5DyS9.mjs.map +1 -0
  425. package/dist/admin/useLicenseLimitNotification-ItNGgex2.js +105 -0
  426. package/dist/admin/useLicenseLimitNotification-ItNGgex2.js.map +1 -0
  427. package/dist/admin/useLicenseLimits-FtmLXkwK.js +45 -0
  428. package/dist/admin/useLicenseLimits-FtmLXkwK.js.map +1 -0
  429. package/dist/admin/useLicenseLimits-Jy6E6qc2.mjs +23 -0
  430. package/dist/admin/useLicenseLimits-Jy6E6qc2.mjs.map +1 -0
  431. package/dist/admin/useWebhooks-bgdpL7W6.mjs +93 -0
  432. package/dist/admin/useWebhooks-bgdpL7W6.mjs.map +1 -0
  433. package/dist/admin/useWebhooks-opYGugiT.js +95 -0
  434. package/dist/admin/useWebhooks-opYGugiT.js.map +1 -0
  435. package/dist/admin/users-R5A0kUOV.js +33 -0
  436. package/dist/admin/users-R5A0kUOV.js.map +1 -0
  437. package/dist/admin/users-a4KTyEyc.mjs +30 -0
  438. package/dist/admin/users-a4KTyEyc.mjs.map +1 -0
  439. package/dist/admin/validation-F0JMLUkr.mjs +43 -0
  440. package/dist/admin/validation-F0JMLUkr.mjs.map +1 -0
  441. package/dist/admin/validation-cP2hBbZm.js +65 -0
  442. package/dist/admin/validation-cP2hBbZm.js.map +1 -0
  443. package/dist/admin/vi-mj-Smy3d.js +200 -0
  444. package/dist/admin/vi-mj-Smy3d.js.map +1 -0
  445. package/dist/admin/vi-ryNZtXtk.mjs +187 -0
  446. package/dist/admin/vi-ryNZtXtk.mjs.map +1 -0
  447. package/dist/admin/zh-6qF5HCOo.js +642 -0
  448. package/dist/admin/zh-6qF5HCOo.js.map +1 -0
  449. package/dist/admin/zh-Hans-HlxDUeVA.mjs +716 -0
  450. package/dist/admin/zh-Hans-HlxDUeVA.mjs.map +1 -0
  451. package/dist/admin/zh-Hans-eWSoi9-X.js +737 -0
  452. package/dist/admin/zh-Hans-eWSoi9-X.js.map +1 -0
  453. package/dist/admin/zh-WEteLuNm.mjs +622 -0
  454. package/dist/admin/zh-WEteLuNm.mjs.map +1 -0
  455. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +2 -2
  456. package/dist/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.d.ts +2 -1
  457. package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
  458. package/dist/ee/admin/src/utils/cookies.d.ts +2 -0
  459. package/dist/ee/server/index.js +1254 -3011
  460. package/dist/ee/server/index.js.map +1 -1
  461. package/dist/ee/server/index.mjs +1259 -3013
  462. package/dist/ee/server/index.mjs.map +1 -1
  463. package/dist/package.json.d.ts +33 -46
  464. package/dist/server/index.js +170 -146
  465. package/dist/server/index.js.map +1 -1
  466. package/dist/server/index.mjs +147 -140
  467. package/dist/server/index.mjs.map +1 -1
  468. package/dist/server/src/bootstrap.d.ts.map +1 -1
  469. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  470. package/dist/server/src/controllers/webhooks.d.ts.map +1 -1
  471. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  472. package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
  473. package/dist/server/src/register.d.ts.map +1 -1
  474. package/dist/server/src/routes/serve-admin-panel.d.ts.map +1 -1
  475. package/dist/server/src/services/index.d.ts +7 -2
  476. package/dist/server/src/services/index.d.ts.map +1 -1
  477. package/dist/server/src/services/metrics.d.ts +8 -6
  478. package/dist/server/src/services/metrics.d.ts.map +1 -1
  479. package/dist/server/src/services/passport.d.ts.map +1 -1
  480. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
  481. package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
  482. package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
  483. package/dist/server/src/services/transfer/token.d.ts.map +1 -1
  484. package/dist/server/src/validation/project-settings.d.ts +52 -6
  485. package/dist/server/src/validation/project-settings.d.ts.map +1 -1
  486. package/dist/shared/contracts/admin.d.ts +7 -1
  487. package/dist/shared/contracts/admin.d.ts.map +1 -1
  488. package/dist/shared/contracts/content-types.d.ts +5 -0
  489. package/dist/shared/contracts/content-types.d.ts.map +1 -0
  490. package/dist/shared/contracts/webhooks.d.ts +5 -5
  491. package/dist/shared/contracts/webhooks.d.ts.map +1 -1
  492. package/package.json +34 -47
  493. package/strapi-server.js +1 -0
  494. package/dist/admin/AdminSeatInfo-Gp4BFR1_.js +0 -105
  495. package/dist/admin/AdminSeatInfo-Gp4BFR1_.js.map +0 -1
  496. package/dist/admin/AdminSeatInfo-dDgFBcLY.mjs +0 -101
  497. package/dist/admin/AdminSeatInfo-dDgFBcLY.mjs.map +0 -1
  498. package/dist/admin/ApplicationInfoPage-GQLKLk5T.mjs +0 -670
  499. package/dist/admin/ApplicationInfoPage-GQLKLk5T.mjs.map +0 -1
  500. package/dist/admin/ApplicationInfoPage-e_sOqQMh.js +0 -698
  501. package/dist/admin/ApplicationInfoPage-e_sOqQMh.js.map +0 -1
  502. package/dist/admin/AuthResponse-gf-zZkxm.mjs +0 -43
  503. package/dist/admin/AuthResponse-gf-zZkxm.mjs.map +0 -1
  504. package/dist/admin/AuthResponse-l5QiAAK7.js +0 -70
  505. package/dist/admin/AuthResponse-l5QiAAK7.js.map +0 -1
  506. package/dist/admin/AuthenticatedLayout-3fYM18Xy.mjs +0 -1115
  507. package/dist/admin/AuthenticatedLayout-3fYM18Xy.mjs.map +0 -1
  508. package/dist/admin/AuthenticatedLayout-gGQYIisy.js +0 -1148
  509. package/dist/admin/AuthenticatedLayout-gGQYIisy.js.map +0 -1
  510. package/dist/admin/ComponentConfigurationPage-0kf7a5LK.mjs +0 -237
  511. package/dist/admin/ComponentConfigurationPage-0kf7a5LK.mjs.map +0 -1
  512. package/dist/admin/ComponentConfigurationPage-U7RcNJFs.js +0 -262
  513. package/dist/admin/ComponentConfigurationPage-U7RcNJFs.js.map +0 -1
  514. package/dist/admin/ComponentIcon-AkrHxAkm.mjs +0 -158
  515. package/dist/admin/ComponentIcon-AkrHxAkm.mjs.map +0 -1
  516. package/dist/admin/ComponentIcon-wcNWpdCz.js +0 -180
  517. package/dist/admin/ComponentIcon-wcNWpdCz.js.map +0 -1
  518. package/dist/admin/ContentBox-PbS25I_4.mjs +0 -40
  519. package/dist/admin/ContentBox-PbS25I_4.mjs.map +0 -1
  520. package/dist/admin/ContentBox-xqJCP2BC.js +0 -46
  521. package/dist/admin/ContentBox-xqJCP2BC.js.map +0 -1
  522. package/dist/admin/CreateActionEE-HO-FmNjw.js +0 -61
  523. package/dist/admin/CreateActionEE-HO-FmNjw.js.map +0 -1
  524. package/dist/admin/CreateActionEE-OscS6KZj.mjs +0 -53
  525. package/dist/admin/CreateActionEE-OscS6KZj.mjs.map +0 -1
  526. package/dist/admin/CreatePage-1a_Nb-RK.mjs +0 -248
  527. package/dist/admin/CreatePage-1a_Nb-RK.mjs.map +0 -1
  528. package/dist/admin/CreatePage-8rG8fSZv.mjs +0 -245
  529. package/dist/admin/CreatePage-8rG8fSZv.mjs.map +0 -1
  530. package/dist/admin/CreatePage-B0kLot_Q.js +0 -18
  531. package/dist/admin/CreatePage-B0kLot_Q.js.map +0 -1
  532. package/dist/admin/CreatePage-c92hDTE3.mjs +0 -13
  533. package/dist/admin/CreatePage-c92hDTE3.mjs.map +0 -1
  534. package/dist/admin/CreatePage-h9gJgINE.js +0 -274
  535. package/dist/admin/CreatePage-h9gJgINE.js.map +0 -1
  536. package/dist/admin/CreatePage-pN8WcSWM.js +0 -272
  537. package/dist/admin/CreatePage-pN8WcSWM.js.map +0 -1
  538. package/dist/admin/CreateView-Gd7sLphf.js +0 -17
  539. package/dist/admin/CreateView-Gd7sLphf.js.map +0 -1
  540. package/dist/admin/CreateView-PIPvgwa8.mjs +0 -13
  541. package/dist/admin/CreateView-PIPvgwa8.mjs.map +0 -1
  542. package/dist/admin/CreateView-kVD9MjAf.js +0 -17
  543. package/dist/admin/CreateView-kVD9MjAf.js.map +0 -1
  544. package/dist/admin/CreateView-nXkGgZTO.mjs +0 -13
  545. package/dist/admin/CreateView-nXkGgZTO.mjs.map +0 -1
  546. package/dist/admin/EditConfigurationPage-YAS-MAtE.js +0 -155
  547. package/dist/admin/EditConfigurationPage-YAS-MAtE.js.map +0 -1
  548. package/dist/admin/EditConfigurationPage-jugWslla.mjs +0 -130
  549. package/dist/admin/EditConfigurationPage-jugWslla.mjs.map +0 -1
  550. package/dist/admin/EditPage-6pGLGlrZ.mjs +0 -794
  551. package/dist/admin/EditPage-6pGLGlrZ.mjs.map +0 -1
  552. package/dist/admin/EditPage-I99-ASjb.mjs +0 -325
  553. package/dist/admin/EditPage-I99-ASjb.mjs.map +0 -1
  554. package/dist/admin/EditPage-NrM8ZRAf.mjs +0 -303
  555. package/dist/admin/EditPage-NrM8ZRAf.mjs.map +0 -1
  556. package/dist/admin/EditPage-ci9fcWte.js +0 -327
  557. package/dist/admin/EditPage-ci9fcWte.js.map +0 -1
  558. package/dist/admin/EditPage-fT6nuOwT.mjs +0 -260
  559. package/dist/admin/EditPage-fT6nuOwT.mjs.map +0 -1
  560. package/dist/admin/EditPage-hEDFGDcC.js +0 -822
  561. package/dist/admin/EditPage-hEDFGDcC.js.map +0 -1
  562. package/dist/admin/EditPage-m5HVhxC-.js +0 -286
  563. package/dist/admin/EditPage-m5HVhxC-.js.map +0 -1
  564. package/dist/admin/EditPage-um8Yysr-.js +0 -354
  565. package/dist/admin/EditPage-um8Yysr-.js.map +0 -1
  566. package/dist/admin/EditView-79rujo0b.mjs +0 -336
  567. package/dist/admin/EditView-79rujo0b.mjs.map +0 -1
  568. package/dist/admin/EditView-zEf-a-YM.js +0 -362
  569. package/dist/admin/EditView-zEf-a-YM.js.map +0 -1
  570. package/dist/admin/EditViewPage-BJdNfzBZ.mjs +0 -198
  571. package/dist/admin/EditViewPage-BJdNfzBZ.mjs.map +0 -1
  572. package/dist/admin/EditViewPage-Y67V7K7l.js +0 -226
  573. package/dist/admin/EditViewPage-Y67V7K7l.js.map +0 -1
  574. package/dist/admin/EditViewPage-iuq_KY3C.mjs +0 -846
  575. package/dist/admin/EditViewPage-iuq_KY3C.mjs.map +0 -1
  576. package/dist/admin/EditViewPage-vrE8FNb1.js +0 -879
  577. package/dist/admin/EditViewPage-vrE8FNb1.js.map +0 -1
  578. package/dist/admin/EventsTable-LOh2EX0N.mjs +0 -32
  579. package/dist/admin/EventsTable-LOh2EX0N.mjs.map +0 -1
  580. package/dist/admin/EventsTable-bm16Pj4a.js +0 -36
  581. package/dist/admin/EventsTable-bm16Pj4a.js.map +0 -1
  582. package/dist/admin/FieldTypeIcon-SCwhXPf6.mjs +0 -50
  583. package/dist/admin/FieldTypeIcon-SCwhXPf6.mjs.map +0 -1
  584. package/dist/admin/FieldTypeIcon-u9dTaLwb.js +0 -52
  585. package/dist/admin/FieldTypeIcon-u9dTaLwb.js.map +0 -1
  586. package/dist/admin/Filters-5FAHd62q.js +0 -511
  587. package/dist/admin/Filters-5FAHd62q.js.map +0 -1
  588. package/dist/admin/Filters-hYfcsahl.mjs +0 -489
  589. package/dist/admin/Filters-hYfcsahl.mjs.map +0 -1
  590. package/dist/admin/Form-7gccxUtH.mjs +0 -739
  591. package/dist/admin/Form-7gccxUtH.mjs.map +0 -1
  592. package/dist/admin/Form-m0qUJusG.js +0 -767
  593. package/dist/admin/Form-m0qUJusG.js.map +0 -1
  594. package/dist/admin/History-UVk6YZaL.js +0 -456
  595. package/dist/admin/History-UVk6YZaL.js.map +0 -1
  596. package/dist/admin/History-gNttF1-u.mjs +0 -430
  597. package/dist/admin/History-gNttF1-u.mjs.map +0 -1
  598. package/dist/admin/HomePage-2q7ngwX4.mjs +0 -11
  599. package/dist/admin/HomePage-2q7ngwX4.mjs.map +0 -1
  600. package/dist/admin/HomePage-_eHszm7N.mjs +0 -521
  601. package/dist/admin/HomePage-_eHszm7N.mjs.map +0 -1
  602. package/dist/admin/HomePage-jwm3AAzI.js +0 -530
  603. package/dist/admin/HomePage-jwm3AAzI.js.map +0 -1
  604. package/dist/admin/HomePage-ozwWqZdZ.js +0 -15
  605. package/dist/admin/HomePage-ozwWqZdZ.js.map +0 -1
  606. package/dist/admin/InputRenderer-tdeZayqM.js +0 -5345
  607. package/dist/admin/InputRenderer-tdeZayqM.js.map +0 -1
  608. package/dist/admin/InputRenderer-uXGu-VvL.mjs +0 -5304
  609. package/dist/admin/InputRenderer-uXGu-VvL.mjs.map +0 -1
  610. package/dist/admin/InstalledPluginsPage-rGp1BINi.mjs +0 -101
  611. package/dist/admin/InstalledPluginsPage-rGp1BINi.mjs.map +0 -1
  612. package/dist/admin/InstalledPluginsPage-relNbZiA.js +0 -126
  613. package/dist/admin/InstalledPluginsPage-relNbZiA.js.map +0 -1
  614. package/dist/admin/Layout-JSg7Wwnx.mjs +0 -89
  615. package/dist/admin/Layout-JSg7Wwnx.mjs.map +0 -1
  616. package/dist/admin/Layout-gqm-mRb2.mjs +0 -209
  617. package/dist/admin/Layout-gqm-mRb2.mjs.map +0 -1
  618. package/dist/admin/Layout-rp7YlCuF.js +0 -237
  619. package/dist/admin/Layout-rp7YlCuF.js.map +0 -1
  620. package/dist/admin/Layout-tPXv8ts4.js +0 -97
  621. package/dist/admin/Layout-tPXv8ts4.js.map +0 -1
  622. package/dist/admin/ListConfigurationPage-1JkDop6y.mjs +0 -651
  623. package/dist/admin/ListConfigurationPage-1JkDop6y.mjs.map +0 -1
  624. package/dist/admin/ListConfigurationPage-egv99PTx.js +0 -679
  625. package/dist/admin/ListConfigurationPage-egv99PTx.js.map +0 -1
  626. package/dist/admin/ListPage-5VIwPlnG.js +0 -520
  627. package/dist/admin/ListPage-5VIwPlnG.js.map +0 -1
  628. package/dist/admin/ListPage-85XB15gk.js +0 -305
  629. package/dist/admin/ListPage-85XB15gk.js.map +0 -1
  630. package/dist/admin/ListPage-NG7c9Zx-.js +0 -313
  631. package/dist/admin/ListPage-NG7c9Zx-.js.map +0 -1
  632. package/dist/admin/ListPage-Wf8HxliA.js +0 -15
  633. package/dist/admin/ListPage-Wf8HxliA.js.map +0 -1
  634. package/dist/admin/ListPage-Y0vGfxO1.mjs +0 -492
  635. package/dist/admin/ListPage-Y0vGfxO1.mjs.map +0 -1
  636. package/dist/admin/ListPage-_1MCPNWC.mjs +0 -11
  637. package/dist/admin/ListPage-_1MCPNWC.mjs.map +0 -1
  638. package/dist/admin/ListPage-bdblB4wE.mjs +0 -338
  639. package/dist/admin/ListPage-bdblB4wE.mjs.map +0 -1
  640. package/dist/admin/ListPage-d0uTS6lH.js +0 -363
  641. package/dist/admin/ListPage-d0uTS6lH.js.map +0 -1
  642. package/dist/admin/ListPage-e0975Wh-.js +0 -568
  643. package/dist/admin/ListPage-e0975Wh-.js.map +0 -1
  644. package/dist/admin/ListPage-eMKRFxzM.mjs +0 -288
  645. package/dist/admin/ListPage-eMKRFxzM.mjs.map +0 -1
  646. package/dist/admin/ListPage-tFqx6zb_.mjs +0 -540
  647. package/dist/admin/ListPage-tFqx6zb_.mjs.map +0 -1
  648. package/dist/admin/ListPage-v07yRAHk.mjs +0 -277
  649. package/dist/admin/ListPage-v07yRAHk.mjs.map +0 -1
  650. package/dist/admin/ListView-9shnR2xp.mjs +0 -212
  651. package/dist/admin/ListView-9shnR2xp.mjs.map +0 -1
  652. package/dist/admin/ListView-IaEe1_Uy.js +0 -238
  653. package/dist/admin/ListView-IaEe1_Uy.js.map +0 -1
  654. package/dist/admin/ListView-_EZZ571X.js +0 -228
  655. package/dist/admin/ListView-_EZZ571X.js.map +0 -1
  656. package/dist/admin/ListView-z9G1Eash.mjs +0 -202
  657. package/dist/admin/ListView-z9G1Eash.mjs.map +0 -1
  658. package/dist/admin/ListViewPage-FE12IpwT.mjs +0 -925
  659. package/dist/admin/ListViewPage-FE12IpwT.mjs.map +0 -1
  660. package/dist/admin/ListViewPage-u5WSF93L.js +0 -957
  661. package/dist/admin/ListViewPage-u5WSF93L.js.map +0 -1
  662. package/dist/admin/Login-9iKNSYCJ.mjs +0 -31
  663. package/dist/admin/Login-9iKNSYCJ.mjs.map +0 -1
  664. package/dist/admin/Login-ug0ICazL.js +0 -39
  665. package/dist/admin/Login-ug0ICazL.js.map +0 -1
  666. package/dist/admin/MagicLinkEE-3a4aj5bM.mjs +0 -27
  667. package/dist/admin/MagicLinkEE-3a4aj5bM.mjs.map +0 -1
  668. package/dist/admin/MagicLinkEE-TlpYCgSF.js +0 -31
  669. package/dist/admin/MagicLinkEE-TlpYCgSF.js.map +0 -1
  670. package/dist/admin/MarketplacePage-BBs4GMeX.mjs +0 -1014
  671. package/dist/admin/MarketplacePage-BBs4GMeX.mjs.map +0 -1
  672. package/dist/admin/MarketplacePage-GuZItQkJ.js +0 -1045
  673. package/dist/admin/MarketplacePage-GuZItQkJ.js.map +0 -1
  674. package/dist/admin/NoContentTypePage-MI-TNgDm.mjs +0 -50
  675. package/dist/admin/NoContentTypePage-MI-TNgDm.mjs.map +0 -1
  676. package/dist/admin/NoContentTypePage-WM9PSeKc.js +0 -54
  677. package/dist/admin/NoContentTypePage-WM9PSeKc.js.map +0 -1
  678. package/dist/admin/NoPermissionsPage-K6eIf5zl.mjs +0 -23
  679. package/dist/admin/NoPermissionsPage-K6eIf5zl.mjs.map +0 -1
  680. package/dist/admin/NoPermissionsPage-PP92ItBk.js +0 -27
  681. package/dist/admin/NoPermissionsPage-PP92ItBk.js.map +0 -1
  682. package/dist/admin/NotAllowed-9d8xvtvI.mjs +0 -36
  683. package/dist/admin/NotAllowed-9d8xvtvI.mjs.map +0 -1
  684. package/dist/admin/NotAllowed-FmDlK9I3.js +0 -42
  685. package/dist/admin/NotAllowed-FmDlK9I3.js.map +0 -1
  686. package/dist/admin/Ornaments-fHu7120M.js +0 -214
  687. package/dist/admin/Ornaments-fHu7120M.js.map +0 -1
  688. package/dist/admin/Ornaments-izqdN6fh.mjs +0 -209
  689. package/dist/admin/Ornaments-izqdN6fh.mjs.map +0 -1
  690. package/dist/admin/Permissions-jsl-R7bI.js +0 -2082
  691. package/dist/admin/Permissions-jsl-R7bI.js.map +0 -1
  692. package/dist/admin/Permissions-v99MLjbi.mjs +0 -2046
  693. package/dist/admin/Permissions-v99MLjbi.mjs.map +0 -1
  694. package/dist/admin/PrivateRoute-AFoVG5Bk.js +0 -22
  695. package/dist/admin/PrivateRoute-AFoVG5Bk.js.map +0 -1
  696. package/dist/admin/PrivateRoute-XiRz2oSq.mjs +0 -20
  697. package/dist/admin/PrivateRoute-XiRz2oSq.mjs.map +0 -1
  698. package/dist/admin/ProfilePage-HjJiMiTt.mjs +0 -391
  699. package/dist/admin/ProfilePage-HjJiMiTt.mjs.map +0 -1
  700. package/dist/admin/ProfilePage-wGM1mvXn.js +0 -419
  701. package/dist/admin/ProfilePage-wGM1mvXn.js.map +0 -1
  702. package/dist/admin/PurchaseAuditLogs-Rrl9r1j8.mjs +0 -48
  703. package/dist/admin/PurchaseAuditLogs-Rrl9r1j8.mjs.map +0 -1
  704. package/dist/admin/PurchaseAuditLogs-couRts7-.js +0 -52
  705. package/dist/admin/PurchaseAuditLogs-couRts7-.js.map +0 -1
  706. package/dist/admin/PurchaseReviewWorkflows--btlOW_J.mjs +0 -51
  707. package/dist/admin/PurchaseReviewWorkflows--btlOW_J.mjs.map +0 -1
  708. package/dist/admin/PurchaseReviewWorkflows-iyB5BJRO.js +0 -55
  709. package/dist/admin/PurchaseReviewWorkflows-iyB5BJRO.js.map +0 -1
  710. package/dist/admin/PurchaseSingleSignOn-L8l1HqSb.mjs +0 -51
  711. package/dist/admin/PurchaseSingleSignOn-L8l1HqSb.mjs.map +0 -1
  712. package/dist/admin/PurchaseSingleSignOn-oXrB5aDz.js +0 -55
  713. package/dist/admin/PurchaseSingleSignOn-oXrB5aDz.js.map +0 -1
  714. package/dist/admin/ReviewWorkflowsColumn-NUu47oVz.mjs +0 -34
  715. package/dist/admin/ReviewWorkflowsColumn-NUu47oVz.mjs.map +0 -1
  716. package/dist/admin/ReviewWorkflowsColumn-uIqJfjyd.js +0 -39
  717. package/dist/admin/ReviewWorkflowsColumn-uIqJfjyd.js.map +0 -1
  718. package/dist/admin/SSOProviders-JTam8pNP.js +0 -64
  719. package/dist/admin/SSOProviders-JTam8pNP.js.map +0 -1
  720. package/dist/admin/SSOProviders-f1OPn1AH.mjs +0 -58
  721. package/dist/admin/SSOProviders-f1OPn1AH.mjs.map +0 -1
  722. package/dist/admin/SelectRoles-5vr-vXOm.js +0 -114
  723. package/dist/admin/SelectRoles-5vr-vXOm.js.map +0 -1
  724. package/dist/admin/SelectRoles-ytHc3di2.mjs +0 -106
  725. package/dist/admin/SelectRoles-ytHc3di2.mjs.map +0 -1
  726. package/dist/admin/SingleSignOnPage-1Wqj_7y-.js +0 -263
  727. package/dist/admin/SingleSignOnPage-1Wqj_7y-.js.map +0 -1
  728. package/dist/admin/SingleSignOnPage-7oJES3UH.mjs +0 -238
  729. package/dist/admin/SingleSignOnPage-7oJES3UH.mjs.map +0 -1
  730. package/dist/admin/Table-LQhGojNx.mjs +0 -165
  731. package/dist/admin/Table-LQhGojNx.mjs.map +0 -1
  732. package/dist/admin/Table-M5UsBfFs.js +0 -190
  733. package/dist/admin/Table-M5UsBfFs.js.map +0 -1
  734. package/dist/admin/TokenTypeSelect-5o9mvFd7.mjs +0 -357
  735. package/dist/admin/TokenTypeSelect-5o9mvFd7.mjs.map +0 -1
  736. package/dist/admin/TokenTypeSelect-ZBDI26vJ.js +0 -385
  737. package/dist/admin/TokenTypeSelect-ZBDI26vJ.js.map +0 -1
  738. package/dist/admin/UseCasePage-e7rn-aW-.mjs +0 -146
  739. package/dist/admin/UseCasePage-e7rn-aW-.mjs.map +0 -1
  740. package/dist/admin/UseCasePage-q3u-xs7F.js +0 -175
  741. package/dist/admin/UseCasePage-q3u-xs7F.js.map +0 -1
  742. package/dist/admin/apiTokens-_gKUBKPQ.js +0 -62
  743. package/dist/admin/apiTokens-_gKUBKPQ.js.map +0 -1
  744. package/dist/admin/apiTokens-nD8zbNlc.mjs +0 -56
  745. package/dist/admin/apiTokens-nD8zbNlc.mjs.map +0 -1
  746. package/dist/admin/ar-i6ait0_Z.js +0 -939
  747. package/dist/admin/ar-i6ait0_Z.js.map +0 -1
  748. package/dist/admin/ar-lYsknZVT.mjs +0 -918
  749. package/dist/admin/ar-lYsknZVT.mjs.map +0 -1
  750. package/dist/admin/ca-1Cl4eOmr.js +0 -727
  751. package/dist/admin/ca-1Cl4eOmr.js.map +0 -1
  752. package/dist/admin/ca-ruPjUw52.mjs +0 -709
  753. package/dist/admin/ca-ruPjUw52.mjs.map +0 -1
  754. package/dist/admin/constants-6E1OwHx7.js +0 -197
  755. package/dist/admin/constants-6E1OwHx7.js.map +0 -1
  756. package/dist/admin/constants-AdKxCt0x.mjs +0 -52
  757. package/dist/admin/constants-AdKxCt0x.mjs.map +0 -1
  758. package/dist/admin/constants-D6NLEhwu.mjs +0 -172
  759. package/dist/admin/constants-D6NLEhwu.mjs.map +0 -1
  760. package/dist/admin/constants-DxpaZFhM.mjs +0 -10
  761. package/dist/admin/constants-DxpaZFhM.mjs.map +0 -1
  762. package/dist/admin/constants-ZZWbRAQT.js +0 -60
  763. package/dist/admin/constants-ZZWbRAQT.js.map +0 -1
  764. package/dist/admin/constants-wsN7Fj5H.js +0 -14
  765. package/dist/admin/constants-wsN7Fj5H.js.map +0 -1
  766. package/dist/admin/cs-MneRs5g8.js +0 -294
  767. package/dist/admin/cs-MneRs5g8.js.map +0 -1
  768. package/dist/admin/cs-cEW7Jgll.mjs +0 -281
  769. package/dist/admin/cs-cEW7Jgll.mjs.map +0 -1
  770. package/dist/admin/de-vPJQw5Tm.js +0 -719
  771. package/dist/admin/de-vPJQw5Tm.js.map +0 -1
  772. package/dist/admin/de-xZr3TXsT.mjs +0 -701
  773. package/dist/admin/de-xZr3TXsT.mjs.map +0 -1
  774. package/dist/admin/dk-_Fh6kypZ.js +0 -637
  775. package/dist/admin/dk-_Fh6kypZ.js.map +0 -1
  776. package/dist/admin/dk-nqK-ugFb.mjs +0 -619
  777. package/dist/admin/dk-nqK-ugFb.mjs.map +0 -1
  778. package/dist/admin/en-X84kQxpg.js +0 -1068
  779. package/dist/admin/en-X84kQxpg.js.map +0 -1
  780. package/dist/admin/en-qxG24n4z.mjs +0 -1047
  781. package/dist/admin/en-qxG24n4z.mjs.map +0 -1
  782. package/dist/admin/es-6dicYJQA.mjs +0 -779
  783. package/dist/admin/es-6dicYJQA.mjs.map +0 -1
  784. package/dist/admin/es-FC_8jlK7.js +0 -799
  785. package/dist/admin/es-FC_8jlK7.js.map +0 -1
  786. package/dist/admin/eu-Pzqod2VF.js +0 -835
  787. package/dist/admin/eu-Pzqod2VF.js.map +0 -1
  788. package/dist/admin/eu-l9nvfvQj.mjs +0 -815
  789. package/dist/admin/eu-l9nvfvQj.mjs.map +0 -1
  790. package/dist/admin/fr-8h2tzs3Z.js +0 -765
  791. package/dist/admin/fr-8h2tzs3Z.js.map +0 -1
  792. package/dist/admin/fr-97oVHDGZ.mjs +0 -744
  793. package/dist/admin/fr-97oVHDGZ.mjs.map +0 -1
  794. package/dist/admin/gu-YXP9LW1p.mjs +0 -617
  795. package/dist/admin/gu-YXP9LW1p.mjs.map +0 -1
  796. package/dist/admin/gu-fkXeW5oU.js +0 -626
  797. package/dist/admin/gu-fkXeW5oU.js.map +0 -1
  798. package/dist/admin/he-Rnd0orlz.mjs +0 -315
  799. package/dist/admin/he-Rnd0orlz.mjs.map +0 -1
  800. package/dist/admin/he-YNZzVWgP.js +0 -329
  801. package/dist/admin/he-YNZzVWgP.js.map +0 -1
  802. package/dist/admin/hi-42LJgJV1.mjs +0 -707
  803. package/dist/admin/hi-42LJgJV1.mjs.map +0 -1
  804. package/dist/admin/hi-ubgoUzQ0.js +0 -725
  805. package/dist/admin/hi-ubgoUzQ0.js.map +0 -1
  806. package/dist/admin/hu-oHJgjivB.js +0 -835
  807. package/dist/admin/hu-oHJgjivB.js.map +0 -1
  808. package/dist/admin/hu-xsansjmF.mjs +0 -815
  809. package/dist/admin/hu-xsansjmF.mjs.map +0 -1
  810. package/dist/admin/id-JurRr0gC.mjs +0 -438
  811. package/dist/admin/id-JurRr0gC.mjs.map +0 -1
  812. package/dist/admin/id-T2ge96wh.js +0 -451
  813. package/dist/admin/id-T2ge96wh.js.map +0 -1
  814. package/dist/admin/index-1NFAbkxM.mjs +0 -5927
  815. package/dist/admin/index-1NFAbkxM.mjs.map +0 -1
  816. package/dist/admin/index-mQQPK-ix.js +0 -6023
  817. package/dist/admin/index-mQQPK-ix.js.map +0 -1
  818. package/dist/admin/it-890_w-P3.mjs +0 -449
  819. package/dist/admin/it-890_w-P3.mjs.map +0 -1
  820. package/dist/admin/it-uWPMs24z.js +0 -462
  821. package/dist/admin/it-uWPMs24z.js.map +0 -1
  822. package/dist/admin/ja-F61alnK1.mjs +0 -618
  823. package/dist/admin/ja-F61alnK1.mjs.map +0 -1
  824. package/dist/admin/ja-pw-zE8MH.js +0 -636
  825. package/dist/admin/ja-pw-zE8MH.js.map +0 -1
  826. package/dist/admin/ko-DfQWK5T3.mjs +0 -616
  827. package/dist/admin/ko-DfQWK5T3.mjs.map +0 -1
  828. package/dist/admin/ko-XhK2FY3_.js +0 -634
  829. package/dist/admin/ko-XhK2FY3_.js.map +0 -1
  830. package/dist/admin/ml-EVaVYywL.mjs +0 -707
  831. package/dist/admin/ml-EVaVYywL.mjs.map +0 -1
  832. package/dist/admin/ml-hT2VI8JA.js +0 -725
  833. package/dist/admin/ml-hT2VI8JA.js.map +0 -1
  834. package/dist/admin/ms-CzgcVrsY.mjs +0 -332
  835. package/dist/admin/ms-CzgcVrsY.mjs.map +0 -1
  836. package/dist/admin/ms-DoMJCZ42.js +0 -345
  837. package/dist/admin/ms-DoMJCZ42.js.map +0 -1
  838. package/dist/admin/nl-LLi_sx9P.js +0 -831
  839. package/dist/admin/nl-LLi_sx9P.js.map +0 -1
  840. package/dist/admin/nl-XNqQYx_K.mjs +0 -811
  841. package/dist/admin/nl-XNqQYx_K.mjs.map +0 -1
  842. package/dist/admin/no-JwA1Lt4Y.mjs +0 -300
  843. package/dist/admin/no-JwA1Lt4Y.mjs.map +0 -1
  844. package/dist/admin/no-wmtVIVuz.js +0 -313
  845. package/dist/admin/no-wmtVIVuz.js.map +0 -1
  846. package/dist/admin/pl-05ncDTwZ.js +0 -724
  847. package/dist/admin/pl-05ncDTwZ.js.map +0 -1
  848. package/dist/admin/pl-euPz4n1g.mjs +0 -706
  849. package/dist/admin/pl-euPz4n1g.mjs.map +0 -1
  850. package/dist/admin/pt-BR-vpbGYSYw.mjs +0 -777
  851. package/dist/admin/pt-BR-vpbGYSYw.mjs.map +0 -1
  852. package/dist/admin/pt-BR-xA4J5pi2.js +0 -797
  853. package/dist/admin/pt-BR-xA4J5pi2.js.map +0 -1
  854. package/dist/admin/pt-RlnkaSdF.mjs +0 -287
  855. package/dist/admin/pt-RlnkaSdF.mjs.map +0 -1
  856. package/dist/admin/pt-yArB6nEx.js +0 -299
  857. package/dist/admin/pt-yArB6nEx.js.map +0 -1
  858. package/dist/admin/reducers-IQWvK_9L.mjs +0 -4617
  859. package/dist/admin/reducers-IQWvK_9L.mjs.map +0 -1
  860. package/dist/admin/reducers-wZUQqmNX.js +0 -4764
  861. package/dist/admin/reducers-wZUQqmNX.js.map +0 -1
  862. package/dist/admin/ru-4bDDGI3o.js +0 -996
  863. package/dist/admin/ru-4bDDGI3o.js.map +0 -1
  864. package/dist/admin/ru-tyoEF5X6.mjs +0 -975
  865. package/dist/admin/ru-tyoEF5X6.mjs.map +0 -1
  866. package/dist/admin/sa-OOEUNg5o.js +0 -725
  867. package/dist/admin/sa-OOEUNg5o.js.map +0 -1
  868. package/dist/admin/sa-s-WVHU-Y.mjs +0 -707
  869. package/dist/admin/sa-s-WVHU-Y.mjs.map +0 -1
  870. package/dist/admin/selectors-PTHjHMQi.js +0 -8
  871. package/dist/admin/selectors-PTHjHMQi.js.map +0 -1
  872. package/dist/admin/selectors-nn3C3YKE.mjs +0 -6
  873. package/dist/admin/selectors-nn3C3YKE.mjs.map +0 -1
  874. package/dist/admin/sk-1sQSF-r2.js +0 -693
  875. package/dist/admin/sk-1sQSF-r2.js.map +0 -1
  876. package/dist/admin/sk-5bIrjuCN.mjs +0 -673
  877. package/dist/admin/sk-5bIrjuCN.mjs.map +0 -1
  878. package/dist/admin/src/components/InjectionZone.d.ts +0 -59
  879. package/dist/admin/src/content-manager/components/ComponentIcon.d.ts +0 -8
  880. package/dist/admin/src/content-manager/components/ConfigurationForm/EditFieldForm.d.ts +0 -9
  881. package/dist/admin/src/content-manager/components/ConfigurationForm/Fields.d.ts +0 -21
  882. package/dist/admin/src/content-manager/components/ConfigurationForm/Form.d.ts +0 -32
  883. package/dist/admin/src/content-manager/components/DragPreviews/CardDragPreview.d.ts +0 -7
  884. package/dist/admin/src/content-manager/components/DragPreviews/ComponentDragPreview.d.ts +0 -6
  885. package/dist/admin/src/content-manager/components/DragPreviews/RelationDragPreview.d.ts +0 -11
  886. package/dist/admin/src/content-manager/components/FieldTypeIcon.d.ts +0 -9
  887. package/dist/admin/src/content-manager/components/LeftMenu.d.ts +0 -2
  888. package/dist/admin/src/content-manager/constants/attributes.d.ts +0 -14
  889. package/dist/admin/src/content-manager/constants/collections.d.ts +0 -3
  890. package/dist/admin/src/content-manager/constants/dragAndDrop.d.ts +0 -8
  891. package/dist/admin/src/content-manager/exports.d.ts +0 -10
  892. package/dist/admin/src/content-manager/features/DocumentRBAC.d.ts +0 -36
  893. package/dist/admin/src/content-manager/history/components/HistoryAction.d.ts +0 -3
  894. package/dist/admin/src/content-manager/history/components/VersionContent.d.ts +0 -2
  895. package/dist/admin/src/content-manager/history/components/VersionHeader.d.ts +0 -5
  896. package/dist/admin/src/content-manager/history/components/VersionsList.d.ts +0 -2
  897. package/dist/admin/src/content-manager/history/pages/History.d.ts +0 -25
  898. package/dist/admin/src/content-manager/history/routes.d.ts +0 -11
  899. package/dist/admin/src/content-manager/history/services/historyVersion.d.ts +0 -7
  900. package/dist/admin/src/content-manager/hooks/useContentManagerInitData.d.ts +0 -15
  901. package/dist/admin/src/content-manager/hooks/useContentTypeSchema.d.ts +0 -24
  902. package/dist/admin/src/content-manager/hooks/useDocument.d.ts +0 -89
  903. package/dist/admin/src/content-manager/hooks/useDocumentActions.d.ts +0 -102
  904. package/dist/admin/src/content-manager/hooks/useDocumentLayout.d.ts +0 -138
  905. package/dist/admin/src/content-manager/hooks/useDragAndDrop.d.ts +0 -51
  906. package/dist/admin/src/content-manager/hooks/useKeyboardDragAndDrop.d.ts +0 -14
  907. package/dist/admin/src/content-manager/hooks/useLazyComponents.d.ts +0 -13
  908. package/dist/admin/src/content-manager/hooks/useSyncRbac.d.ts +0 -15
  909. package/dist/admin/src/content-manager/layout.d.ts +0 -16
  910. package/dist/admin/src/content-manager/modules/rbac.d.ts +0 -14
  911. package/dist/admin/src/content-manager/modules/reducers.d.ts +0 -4
  912. package/dist/admin/src/content-manager/pages/ComponentConfigurationPage.d.ts +0 -3
  913. package/dist/admin/src/content-manager/pages/EditConfigurationPage.d.ts +0 -3
  914. package/dist/admin/src/content-manager/pages/EditView/EditViewPage.d.ts +0 -3
  915. package/dist/admin/src/content-manager/pages/EditView/components/DocumentActions.d.ts +0 -69
  916. package/dist/admin/src/content-manager/pages/EditView/components/DocumentStatus.d.ts +0 -16
  917. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +0 -3
  918. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.d.ts +0 -3
  919. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.d.ts +0 -3
  920. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.d.ts +0 -3
  921. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.d.ts +0 -3
  922. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Paragraph.d.ts +0 -3
  923. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.d.ts +0 -3
  924. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.d.ts +0 -6
  925. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +0 -61
  926. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.d.ts +0 -10
  927. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.d.ts +0 -10
  928. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +0 -10
  929. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Modifiers.d.ts +0 -16
  930. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withImages.d.ts +0 -11
  931. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withLinks.d.ts +0 -9
  932. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.d.ts +0 -8
  933. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.d.ts +0 -13
  934. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/enterKey.d.ts +0 -6
  935. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/links.d.ts +0 -10
  936. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/types.d.ts +0 -10
  937. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Initializer.d.ts +0 -9
  938. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Input.d.ts +0 -9
  939. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +0 -6
  940. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +0 -6
  941. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/ComponentContext.d.ts +0 -42
  942. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.d.ts +0 -11
  943. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentCard.d.ts +0 -9
  944. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +0 -17
  945. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +0 -9
  946. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +0 -14
  947. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/DynamicZoneLabel.d.ts +0 -12
  948. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +0 -13
  949. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/NotAllowed.d.ts +0 -7
  950. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Relations.d.ts +0 -26
  951. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/UID.d.ts +0 -9
  952. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/Editor.d.ts +0 -18
  953. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +0 -59
  954. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/Field.d.ts +0 -11
  955. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.d.ts +0 -5
  956. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +0 -7
  957. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.d.ts +0 -17
  958. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +0 -54
  959. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.d.ts +0 -5
  960. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.d.ts +0 -4
  961. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.d.ts +0 -16
  962. package/dist/admin/src/content-manager/pages/EditView/components/FormLayout.d.ts +0 -5
  963. package/dist/admin/src/content-manager/pages/EditView/components/Header.d.ts +0 -35
  964. package/dist/admin/src/content-manager/pages/EditView/components/InputRenderer.d.ts +0 -14
  965. package/dist/admin/src/content-manager/pages/EditView/components/Panels.d.ts +0 -10
  966. package/dist/admin/src/content-manager/pages/EditView/utils/data.d.ts +0 -20
  967. package/dist/admin/src/content-manager/pages/EditView/utils/forms.d.ts +0 -9
  968. package/dist/admin/src/content-manager/pages/ListConfiguration/ListConfigurationPage.d.ts +0 -10
  969. package/dist/admin/src/content-manager/pages/ListConfiguration/components/DraggableCard.d.ts +0 -12
  970. package/dist/admin/src/content-manager/pages/ListConfiguration/components/EditFieldForm.d.ts +0 -8
  971. package/dist/admin/src/content-manager/pages/ListConfiguration/components/Header.d.ts +0 -8
  972. package/dist/admin/src/content-manager/pages/ListConfiguration/components/Settings.d.ts +0 -5
  973. package/dist/admin/src/content-manager/pages/ListConfiguration/components/SortDisplayedFields.d.ts +0 -6
  974. package/dist/admin/src/content-manager/pages/ListView/ListViewPage.d.ts +0 -3
  975. package/dist/admin/src/content-manager/pages/ListView/components/AutoCloneFailureModal.d.ts +0 -8
  976. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/Actions.d.ts +0 -52
  977. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.d.ts +0 -15
  978. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/PublishAction.d.ts +0 -31
  979. package/dist/admin/src/content-manager/pages/ListView/components/Filters.d.ts +0 -8
  980. package/dist/admin/src/content-manager/pages/ListView/components/InjectionZoneList.d.ts +0 -7
  981. package/dist/admin/src/content-manager/pages/ListView/components/TableActions.d.ts +0 -8
  982. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/CellContent.d.ts +0 -9
  983. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/CellValue.d.ts +0 -8
  984. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Components.d.ts +0 -12
  985. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Media.d.ts +0 -23
  986. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Relations.d.ts +0 -12
  987. package/dist/admin/src/content-manager/pages/ListView/components/ViewSettingsMenu.d.ts +0 -10
  988. package/dist/admin/src/content-manager/pages/NoContentTypePage.d.ts +0 -2
  989. package/dist/admin/src/content-manager/pages/NoPermissionsPage.d.ts +0 -2
  990. package/dist/admin/src/content-manager/router.d.ts +0 -5
  991. package/dist/admin/src/content-manager/services/api.d.ts +0 -3
  992. package/dist/admin/src/content-manager/services/components.d.ts +0 -6
  993. package/dist/admin/src/content-manager/services/contentTypes.d.ts +0 -18
  994. package/dist/admin/src/content-manager/services/documents.d.ts +0 -94
  995. package/dist/admin/src/content-manager/services/init.d.ts +0 -10
  996. package/dist/admin/src/content-manager/services/relations.d.ts +0 -49
  997. package/dist/admin/src/content-manager/services/uid.d.ts +0 -32
  998. package/dist/admin/src/content-manager/utils/api.d.ts +0 -19
  999. package/dist/admin/src/content-manager/utils/attributes.d.ts +0 -19
  1000. package/dist/admin/src/content-manager/utils/relations.d.ts +0 -12
  1001. package/dist/admin/src/content-manager/utils/translations.d.ts +0 -2
  1002. package/dist/admin/src/content-manager/utils/validation.d.ts +0 -7
  1003. package/dist/admin/src/core/apis/content-manager.d.ts +0 -126
  1004. package/dist/admin/src/hooks/useInjectionZone.d.ts +0 -2
  1005. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollabsableContentType.d.ts +0 -11
  1006. package/dist/admin/src/pages/Settings/pages/PurchaseReviewWorkflows.d.ts +0 -2
  1007. package/dist/admin/src/utils/getYupInnerErrors.d.ts +0 -7
  1008. package/dist/admin/src/utils/hashAdminUserEmail.d.ts +0 -6
  1009. package/dist/admin/sv-JVgQU2PS.mjs +0 -810
  1010. package/dist/admin/sv-JVgQU2PS.mjs.map +0 -1
  1011. package/dist/admin/sv-d0rqYiHZ.js +0 -830
  1012. package/dist/admin/sv-d0rqYiHZ.js.map +0 -1
  1013. package/dist/admin/th-er8qvbeL.mjs +0 -420
  1014. package/dist/admin/th-er8qvbeL.mjs.map +0 -1
  1015. package/dist/admin/th-mqExIzdv.js +0 -433
  1016. package/dist/admin/th-mqExIzdv.js.map +0 -1
  1017. package/dist/admin/tr-aYPucbUC.js +0 -788
  1018. package/dist/admin/tr-aYPucbUC.js.map +0 -1
  1019. package/dist/admin/tr-b2vrBJ49.mjs +0 -768
  1020. package/dist/admin/tr-b2vrBJ49.mjs.map +0 -1
  1021. package/dist/admin/transferTokens-P5z1yVh2.js +0 -65
  1022. package/dist/admin/transferTokens-P5z1yVh2.js.map +0 -1
  1023. package/dist/admin/transferTokens-PlBVZdw3.mjs +0 -59
  1024. package/dist/admin/transferTokens-PlBVZdw3.mjs.map +0 -1
  1025. package/dist/admin/uk-1c7KIaI6.js +0 -346
  1026. package/dist/admin/uk-1c7KIaI6.js.map +0 -1
  1027. package/dist/admin/uk-RfkbT49M.mjs +0 -333
  1028. package/dist/admin/uk-RfkbT49M.mjs.map +0 -1
  1029. package/dist/admin/useAdminRoles-BG7b996L.mjs +0 -28
  1030. package/dist/admin/useAdminRoles-BG7b996L.mjs.map +0 -1
  1031. package/dist/admin/useAdminRoles-THWXour6.js +0 -50
  1032. package/dist/admin/useAdminRoles-THWXour6.js.map +0 -1
  1033. package/dist/admin/useContentTypes-PEGh0Cg-.mjs +0 -51
  1034. package/dist/admin/useContentTypes-PEGh0Cg-.mjs.map +0 -1
  1035. package/dist/admin/useContentTypes-RoSvxizj.js +0 -73
  1036. package/dist/admin/useContentTypes-RoSvxizj.js.map +0 -1
  1037. package/dist/admin/useDebounce-OnUygPz6.mjs +0 -17
  1038. package/dist/admin/useDebounce-OnUygPz6.mjs.map +0 -1
  1039. package/dist/admin/useDebounce-tz5EMJbt.js +0 -39
  1040. package/dist/admin/useDebounce-tz5EMJbt.js.map +0 -1
  1041. package/dist/admin/useDocumentLayout-4trWL6Jz.mjs +0 -732
  1042. package/dist/admin/useDocumentLayout-4trWL6Jz.mjs.map +0 -1
  1043. package/dist/admin/useDocumentLayout-V_N5dUwQ.js +0 -764
  1044. package/dist/admin/useDocumentLayout-V_N5dUwQ.js.map +0 -1
  1045. package/dist/admin/useLicenseLimitNotification-9DqSZuyc.mjs +0 -80
  1046. package/dist/admin/useLicenseLimitNotification-9DqSZuyc.mjs.map +0 -1
  1047. package/dist/admin/useLicenseLimitNotification-SiWQ5LGo.js +0 -105
  1048. package/dist/admin/useLicenseLimitNotification-SiWQ5LGo.js.map +0 -1
  1049. package/dist/admin/useReviewWorkflows-0ty4mwQd.js +0 -29
  1050. package/dist/admin/useReviewWorkflows-0ty4mwQd.js.map +0 -1
  1051. package/dist/admin/useReviewWorkflows-HwyFyit7.mjs +0 -27
  1052. package/dist/admin/useReviewWorkflows-HwyFyit7.mjs.map +0 -1
  1053. package/dist/admin/useSyncRbac-LNOzRXJ5.mjs +0 -45
  1054. package/dist/admin/useSyncRbac-LNOzRXJ5.mjs.map +0 -1
  1055. package/dist/admin/useSyncRbac-vkWgDJTE.js +0 -67
  1056. package/dist/admin/useSyncRbac-vkWgDJTE.js.map +0 -1
  1057. package/dist/admin/useWebhooks-DmGNXCdi.js +0 -93
  1058. package/dist/admin/useWebhooks-DmGNXCdi.js.map +0 -1
  1059. package/dist/admin/useWebhooks-dOVyaYlw.mjs +0 -91
  1060. package/dist/admin/useWebhooks-dOVyaYlw.mjs.map +0 -1
  1061. package/dist/admin/validateWorkflow-99y3bkNx.js +0 -1077
  1062. package/dist/admin/validateWorkflow-99y3bkNx.js.map +0 -1
  1063. package/dist/admin/validateWorkflow-ubLwZqCK.mjs +0 -1033
  1064. package/dist/admin/validateWorkflow-ubLwZqCK.mjs.map +0 -1
  1065. package/dist/admin/validation-cpJKCQz1.mjs +0 -43
  1066. package/dist/admin/validation-cpJKCQz1.mjs.map +0 -1
  1067. package/dist/admin/validation-lIVymZ0n.js +0 -65
  1068. package/dist/admin/validation-lIVymZ0n.js.map +0 -1
  1069. package/dist/admin/vi-Rg9es0FD.js +0 -301
  1070. package/dist/admin/vi-Rg9es0FD.js.map +0 -1
  1071. package/dist/admin/vi-pyngavdo.mjs +0 -288
  1072. package/dist/admin/vi-pyngavdo.mjs.map +0 -1
  1073. package/dist/admin/zh-Hans-Gbpdme1Q.mjs +0 -939
  1074. package/dist/admin/zh-Hans-Gbpdme1Q.mjs.map +0 -1
  1075. package/dist/admin/zh-Hans-SgnidiuG.js +0 -960
  1076. package/dist/admin/zh-Hans-SgnidiuG.js.map +0 -1
  1077. package/dist/admin/zh-ONWhjzCj.js +0 -839
  1078. package/dist/admin/zh-ONWhjzCj.js.map +0 -1
  1079. package/dist/admin/zh-fMjW2qMl.mjs +0 -819
  1080. package/dist/admin/zh-fMjW2qMl.mjs.map +0 -1
  1081. package/dist/ee/admin/src/content-manager/pages/EditView/components/AssigneeSelect.d.ts +0 -2
  1082. package/dist/ee/admin/src/content-manager/pages/EditView/components/ReviewWorkflowsPanel.d.ts +0 -3
  1083. package/dist/ee/admin/src/content-manager/pages/EditView/components/StageSelect.d.ts +0 -1
  1084. package/dist/ee/admin/src/content-manager/pages/EditView/components/constants.d.ts +0 -2
  1085. package/dist/ee/admin/src/content-manager/pages/ListSettingsView/constants.d.ts +0 -7
  1086. package/dist/ee/admin/src/content-manager/pages/ListView/components/AssigneeFilter.d.ts +0 -7
  1087. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsAssigneeEE.d.ts +0 -7
  1088. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsColumn.d.ts +0 -2
  1089. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsStageEE.d.ts +0 -7
  1090. package/dist/ee/admin/src/content-manager/pages/ListView/components/StageFilter.d.ts +0 -8
  1091. package/dist/ee/admin/src/content-manager/pages/ListView/constants.d.ts +0 -69
  1092. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/CreatePage.d.ts +0 -1
  1093. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/EditPage.d.ts +0 -1
  1094. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/ListPage.d.ts +0 -2
  1095. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/actions.d.ts +0 -86
  1096. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage.d.ts +0 -2
  1097. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Layout.d.ts +0 -12
  1098. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal.d.ts +0 -15
  1099. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stage.d.ts +0 -10
  1100. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/StageDragPreview.d.ts +0 -4
  1101. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stages.d.ts +0 -7
  1102. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/WorkflowAttributes.d.ts +0 -4
  1103. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/constants.d.ts +0 -20
  1104. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.d.ts +0 -15
  1105. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/reducer.d.ts +0 -38
  1106. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/selectors.d.ts +0 -62
  1107. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/colors.d.ts +0 -8
  1108. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/validateWorkflow.d.ts +0 -5
  1109. package/dist/ee/admin/src/services/reviewWorkflows.d.ts +0 -39
  1110. package/dist/shared/contracts/review-workflows.d.ts +0 -83
  1111. package/dist/shared/contracts/review-workflows.d.ts.map +0 -1
  1112. /package/dist/admin/src/{content-manager/hooks → hooks}/usePrev.d.ts +0 -0
@@ -1,17 +1,15 @@
1
1
  import { resolve, basename, join, extname } from "path";
2
2
  import fse from "fs-extra";
3
3
  import koaStatic from "koa-static";
4
- import "@strapi/types";
5
- import { isNil, castArray, pipe, pickBy, get, keys, differenceWith, isEqual, getOr, has, clamp, difference, set, merge, map, uniq, isEmpty, toLower, isFunction, toString, toNumber, assign, reverse, take, prop, drop, pick, isString, defaultsDeep, forEach, filter, cond, stubTrue, flow, size, mean, max, sum, defaultTo, mapValues, curry, includes, isArray, omit, isUndefined, update, property } from "lodash/fp";
6
- import { differenceInHours, parseISO, add } from "date-fns";
4
+ import { isNil, castArray, merge, map, uniq, difference, differenceWith, isEqual, isEmpty, toLower, isFunction, toString, pipe, toNumber, assign, reverse, take, prop, drop, pick, mapValues, curry, includes, isArray, set, omit, has, isUndefined } from "lodash/fp";
5
+ import { differenceInHours, parseISO } from "date-fns";
7
6
  import { errors, async, arrays, yup, validateYupSchema, env } from "@strapi/utils";
8
- import semver from "semver";
9
- import localProvider from "@strapi/provider-audit-logs-local";
10
- import { scheduleJob } from "node-schedule";
7
+ import "@strapi/types";
11
8
  import _ from "lodash";
12
9
  import { Strategy } from "passport-local";
13
10
  import passport$2 from "koa-passport";
14
11
  import compose from "koa-compose";
12
+ import { scheduleJob } from "node-schedule";
15
13
  const registerAdminPanelRoute = ({ strapi: strapi2 }) => {
16
14
  let buildDir = resolve(strapi2.dirs.dist.root, "build");
17
15
  if (!fse.pathExistsSync(buildDir)) {
@@ -94,9 +92,9 @@ const authenticate$2 = async (ctx) => {
94
92
  ability: userAbility
95
93
  };
96
94
  };
97
- const name$1 = "admin";
95
+ const name = "admin";
98
96
  const adminAuthStrategy = {
99
- name: name$1,
97
+ name,
100
98
  authenticate: authenticate$2
101
99
  };
102
100
  const DAY_IN_MS = 24 * 60 * 60 * 1e3;
@@ -217,7 +215,7 @@ const apiTokenAuthStrategy = {
217
215
  verify
218
216
  };
219
217
  const executeCERegister = ({ strapi: strapi2 }) => {
220
- const passportMiddleware = strapi2.admin?.services.passport.init();
218
+ const passportMiddleware = strapi2.service("admin::passport").init();
221
219
  strapi2.server.api("admin").use(passportMiddleware);
222
220
  strapi2.get("auth").register("admin", adminAuthStrategy);
223
221
  strapi2.get("auth").register("content-api", apiTokenAuthStrategy);
@@ -225,138 +223,354 @@ const executeCERegister = ({ strapi: strapi2 }) => {
225
223
  registerAdminPanelRoute({ strapi: strapi2 });
226
224
  }
227
225
  };
228
- async function migrateAuditLogsTable({ oldContentTypes, contentTypes }) {
229
- const oldName = oldContentTypes?.["admin::audit-log"]?.collectionName;
230
- const newName = contentTypes["admin::audit-log"]?.collectionName;
231
- const hasRenamedAuditLogsTable = oldName === "audit_logs" && newName === "strapi_audit_logs";
232
- if (!hasRenamedAuditLogsTable) {
233
- return;
234
- }
235
- const hasAuditLogsTable = await strapi.db.getSchemaConnection().hasTable("audit_logs");
236
- const hasLinkTable = await strapi.db.getSchemaConnection().hasTable("audit_logs_user_links");
237
- if (!hasAuditLogsTable || !hasLinkTable) {
238
- return;
239
- }
240
- const auditLogsColumnInfo = await strapi.db.connection("audit_logs").columnInfo();
241
- const linkColumnInfo = await strapi.db.connection("audit_logs_user_links").columnInfo();
242
- if (!auditLogsColumnInfo.action || !auditLogsColumnInfo.date || !auditLogsColumnInfo.payload || !linkColumnInfo.audit_log_id || !linkColumnInfo.user_id) {
243
- return;
226
+ const register = async ({ strapi: strapi2 }) => {
227
+ await executeCERegister({ strapi: strapi2 });
228
+ };
229
+ const actions$1 = [
230
+ {
231
+ uid: "marketplace.read",
232
+ displayName: "Access the marketplace",
233
+ pluginName: "admin",
234
+ section: "settings",
235
+ category: "plugins and marketplace",
236
+ subCategory: "marketplace"
237
+ },
238
+ {
239
+ uid: "webhooks.create",
240
+ displayName: "Create",
241
+ pluginName: "admin",
242
+ section: "settings",
243
+ category: "webhooks"
244
+ },
245
+ {
246
+ uid: "webhooks.read",
247
+ displayName: "Read",
248
+ pluginName: "admin",
249
+ section: "settings",
250
+ category: "webhooks"
251
+ },
252
+ {
253
+ uid: "webhooks.update",
254
+ displayName: "Update",
255
+ pluginName: "admin",
256
+ section: "settings",
257
+ category: "webhooks"
258
+ },
259
+ {
260
+ uid: "webhooks.delete",
261
+ displayName: "Delete",
262
+ pluginName: "admin",
263
+ section: "settings",
264
+ category: "webhooks"
265
+ },
266
+ {
267
+ uid: "users.create",
268
+ displayName: "Create (invite)",
269
+ pluginName: "admin",
270
+ section: "settings",
271
+ category: "users and roles",
272
+ subCategory: "users"
273
+ },
274
+ {
275
+ uid: "users.read",
276
+ displayName: "Read",
277
+ pluginName: "admin",
278
+ section: "settings",
279
+ category: "users and roles",
280
+ subCategory: "users"
281
+ },
282
+ {
283
+ uid: "users.update",
284
+ displayName: "Update",
285
+ pluginName: "admin",
286
+ section: "settings",
287
+ category: "users and roles",
288
+ subCategory: "users"
289
+ },
290
+ {
291
+ uid: "users.delete",
292
+ displayName: "Delete",
293
+ pluginName: "admin",
294
+ section: "settings",
295
+ category: "users and roles",
296
+ subCategory: "users"
297
+ },
298
+ {
299
+ uid: "roles.create",
300
+ displayName: "Create",
301
+ pluginName: "admin",
302
+ section: "settings",
303
+ category: "users and roles",
304
+ subCategory: "roles"
305
+ },
306
+ {
307
+ uid: "roles.read",
308
+ displayName: "Read",
309
+ pluginName: "admin",
310
+ section: "settings",
311
+ category: "users and roles",
312
+ subCategory: "roles"
313
+ },
314
+ {
315
+ uid: "roles.update",
316
+ displayName: "Update",
317
+ pluginName: "admin",
318
+ section: "settings",
319
+ category: "users and roles",
320
+ subCategory: "roles"
321
+ },
322
+ {
323
+ uid: "roles.delete",
324
+ displayName: "Delete",
325
+ pluginName: "admin",
326
+ section: "settings",
327
+ category: "users and roles",
328
+ subCategory: "roles"
329
+ },
330
+ {
331
+ uid: "api-tokens.access",
332
+ displayName: "Access the API tokens settings page",
333
+ pluginName: "admin",
334
+ section: "settings",
335
+ category: "api tokens",
336
+ subCategory: "api Tokens"
337
+ },
338
+ {
339
+ uid: "api-tokens.create",
340
+ displayName: "Create (generate)",
341
+ pluginName: "admin",
342
+ section: "settings",
343
+ category: "api tokens",
344
+ subCategory: "general"
345
+ },
346
+ {
347
+ uid: "api-tokens.read",
348
+ displayName: "Read",
349
+ pluginName: "admin",
350
+ section: "settings",
351
+ category: "api tokens",
352
+ subCategory: "general"
353
+ },
354
+ {
355
+ uid: "api-tokens.update",
356
+ displayName: "Update",
357
+ pluginName: "admin",
358
+ section: "settings",
359
+ category: "api tokens",
360
+ subCategory: "general"
361
+ },
362
+ {
363
+ uid: "api-tokens.regenerate",
364
+ displayName: "Regenerate",
365
+ pluginName: "admin",
366
+ section: "settings",
367
+ category: "api tokens",
368
+ subCategory: "general"
369
+ },
370
+ {
371
+ uid: "api-tokens.delete",
372
+ displayName: "Delete (revoke)",
373
+ pluginName: "admin",
374
+ section: "settings",
375
+ category: "api tokens",
376
+ subCategory: "general"
377
+ },
378
+ {
379
+ uid: "project-settings.update",
380
+ displayName: "Update the project level settings",
381
+ pluginName: "admin",
382
+ section: "settings",
383
+ category: "project"
384
+ },
385
+ {
386
+ uid: "project-settings.read",
387
+ displayName: "Read the project level settings",
388
+ pluginName: "admin",
389
+ section: "settings",
390
+ category: "project"
391
+ },
392
+ {
393
+ uid: "transfer.tokens.access",
394
+ displayName: "Access the transfer tokens settings page",
395
+ pluginName: "admin",
396
+ section: "settings",
397
+ category: "transfer tokens",
398
+ subCategory: "transfer tokens"
399
+ },
400
+ {
401
+ uid: "transfer.tokens.create",
402
+ displayName: "Create (generate)",
403
+ pluginName: "admin",
404
+ section: "settings",
405
+ category: "transfer tokens",
406
+ subCategory: "general"
407
+ },
408
+ {
409
+ uid: "transfer.tokens.read",
410
+ displayName: "Read",
411
+ pluginName: "admin",
412
+ section: "settings",
413
+ category: "transfer tokens",
414
+ subCategory: "general"
415
+ },
416
+ {
417
+ uid: "transfer.tokens.update",
418
+ displayName: "Update",
419
+ pluginName: "admin",
420
+ section: "settings",
421
+ category: "transfer tokens",
422
+ subCategory: "general"
423
+ },
424
+ {
425
+ uid: "transfer.tokens.regenerate",
426
+ displayName: "Regenerate",
427
+ pluginName: "admin",
428
+ section: "settings",
429
+ category: "transfer tokens",
430
+ subCategory: "general"
431
+ },
432
+ {
433
+ uid: "transfer.tokens.delete",
434
+ displayName: "Delete (revoke)",
435
+ pluginName: "admin",
436
+ section: "settings",
437
+ category: "transfer tokens",
438
+ subCategory: "general"
244
439
  }
245
- await strapi.db.getSchemaConnection().renameTable("audit_logs", "strapi_audit_logs");
246
- await strapi.db.getSchemaConnection().renameTable("audit_logs_user_links", "strapi_audit_logs_user_links");
247
- }
248
- const WORKFLOW_MODEL_UID = "admin::workflow";
249
- const STAGE_MODEL_UID = "admin::workflow-stage";
250
- const STAGE_TRANSITION_UID = "admin::review-workflows.stage.transition";
251
- const STAGE_DEFAULT_COLOR = "#4945FF";
252
- const ENTITY_STAGE_ATTRIBUTE = "strapi_stage";
253
- const ENTITY_ASSIGNEE_ATTRIBUTE = "strapi_assignee";
254
- const MAX_WORKFLOWS = 200;
255
- const MAX_STAGES_PER_WORKFLOW = 200;
256
- const ERRORS = {
257
- WORKFLOW_WITHOUT_STAGES: "A workflow must have at least one stage.",
258
- WORKFLOWS_LIMIT: "You’ve reached the limit of workflows in your plan. Delete a workflow or contact Sales to enable more workflows.",
259
- 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.",
260
- DUPLICATED_STAGE_NAME: "Stage names must be unique."
261
- };
262
- const WORKFLOW_POPULATE = {
263
- stages: {
264
- populate: {
265
- permissions: {
266
- fields: ["action", "actionParameters"],
267
- populate: {
268
- role: { fields: ["id", "name"] }
440
+ ];
441
+ const adminActions = {
442
+ actions: actions$1
443
+ };
444
+ const conditions = [
445
+ {
446
+ displayName: "Is creator",
447
+ name: "is-creator",
448
+ plugin: "admin",
449
+ handler: (user2) => ({ "createdBy.id": user2.id })
450
+ },
451
+ {
452
+ displayName: "Has same role as creator",
453
+ name: "has-same-role-as-creator",
454
+ plugin: "admin",
455
+ handler: (user2) => ({
456
+ "createdBy.roles": {
457
+ $elemMatch: {
458
+ id: {
459
+ $in: user2.roles.map((r) => r.id)
460
+ }
269
461
  }
270
462
  }
271
- }
463
+ })
272
464
  }
465
+ ];
466
+ const adminConditions = {
467
+ conditions
273
468
  };
274
- async function migrateReviewWorkflowStagesColor({ oldContentTypes, contentTypes }) {
275
- const hadColor = !!oldContentTypes?.["admin::workflow-stage"]?.attributes?.color;
276
- const hasColor = !!contentTypes?.["admin::workflow-stage"]?.attributes?.color;
277
- if (!hadColor && hasColor) {
278
- await strapi.db.query("admin::workflow-stage").updateMany({
279
- data: {
280
- color: STAGE_DEFAULT_COLOR
281
- }
282
- });
283
- }
284
- }
285
- const getService = (name2, { strapi: strapi2 } = { strapi: global.strapi }) => {
286
- return strapi2.service(`admin::${name2}`);
469
+ const defaultAdminAuthSettings = {
470
+ providers: {
471
+ autoRegister: false,
472
+ defaultRole: null,
473
+ ssoLockedRoles: null
474
+ }
287
475
  };
288
- async function migrateReviewWorkflowStagesRoles({ oldContentTypes, contentTypes }) {
289
- const stageUID = "admin::workflow-stage";
290
- const hadRolePermissions = !!oldContentTypes?.[stageUID]?.attributes?.permissions;
291
- const hasRolePermissions = !!contentTypes?.[stageUID]?.attributes?.permissions;
292
- if (!hadRolePermissions && hasRolePermissions) {
293
- const roleUID = "admin::role";
294
- strapi.log.info(
295
- `Migrating all existing review workflow stages to have RBAC permissions for all ${roleUID}.`
296
- );
297
- const stagePermissionsService = getService("stage-permissions");
298
- const stages2 = await strapi.db.query(stageUID).findMany();
299
- const roles2 = await strapi.db.query(roleUID).findMany();
300
- const groupedPermissions = {};
301
- roles2.map((role2) => role2.id).forEach((roleId) => {
302
- stages2.map((stage) => stage.id).forEach((stageId) => {
303
- if (!groupedPermissions[stageId]) {
304
- groupedPermissions[stageId] = [];
305
- }
306
- groupedPermissions[stageId].push({
307
- roleId,
308
- fromStage: stageId,
309
- action: STAGE_TRANSITION_UID
310
- });
311
- });
312
- });
313
- for (const [stageId, permissions] of Object.entries(groupedPermissions)) {
314
- const numericalStageId = Number(stageId);
315
- if (Number.isNaN(numericalStageId)) {
316
- strapi.log.warn(
317
- `Unable to apply ${roleUID} migration for ${stageUID} with id ${stageId}. The stage does not have a numerical id.`
318
- );
319
- continue;
476
+ const registerPermissionActions = async () => {
477
+ await getService$1("permission").actionProvider.registerMany(adminActions.actions);
478
+ };
479
+ const registerAdminConditions = async () => {
480
+ await getService$1("permission").conditionProvider.registerMany(adminConditions.conditions);
481
+ };
482
+ const registerModelHooks = () => {
483
+ const { sendDidChangeInterfaceLanguage } = getService$1("metrics");
484
+ strapi.db.lifecycles.subscribe({
485
+ models: ["admin::user"],
486
+ afterCreate: sendDidChangeInterfaceLanguage,
487
+ afterDelete: sendDidChangeInterfaceLanguage,
488
+ afterUpdate({ params }) {
489
+ if (params.data.preferedLanguage) {
490
+ sendDidChangeInterfaceLanguage();
320
491
  }
321
- const stagePermissions2 = await stagePermissionsService.registerMany(permissions);
322
- await strapi.db.query(STAGE_MODEL_UID).update({
323
- where: { id: numericalStageId },
324
- data: {
325
- permissions: stagePermissions2.flat().map((permission2) => permission2.id)
326
- }
327
- });
328
492
  }
493
+ });
494
+ };
495
+ const syncAuthSettings = async () => {
496
+ const adminStore = await strapi.store({ type: "core", name: "admin" });
497
+ const adminAuthSettings = await adminStore.get({ key: "auth" });
498
+ const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);
499
+ const roleExists = await getService$1("role").exists({
500
+ id: newAuthSettings.providers.defaultRole
501
+ });
502
+ if (!roleExists) {
503
+ newAuthSettings.providers.defaultRole = null;
329
504
  }
330
- }
331
- const name = "Default";
332
- const defaultWorkflow = {
333
- name
334
- };
335
- async function migrateReviewWorkflowName({ oldContentTypes, contentTypes }) {
336
- const hadName = !!oldContentTypes?.[WORKFLOW_MODEL_UID]?.attributes?.name;
337
- const hasName = !!contentTypes?.[WORKFLOW_MODEL_UID]?.attributes?.name;
338
- if (!hadName && hasName) {
339
- await strapi.db.query(WORKFLOW_MODEL_UID).updateMany({
340
- where: {
341
- name: { $null: true }
342
- },
343
- data: {
344
- name: defaultWorkflow.name
345
- }
346
- });
505
+ await adminStore.set({ key: "auth", value: newAuthSettings });
506
+ };
507
+ const syncAPITokensPermissions = async () => {
508
+ const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
509
+ const permissionsInDB = await async.pipe(
510
+ strapi.db.query("admin::api-token-permission").findMany,
511
+ map("action")
512
+ )();
513
+ const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));
514
+ if (unknownPermissions.length > 0) {
515
+ await strapi.db.query("admin::api-token-permission").deleteMany({ where: { action: { $in: unknownPermissions } } });
347
516
  }
348
- }
349
- async function migrateWorkflowsContentTypes({ oldContentTypes, contentTypes }) {
350
- const hadContentTypes = !!oldContentTypes?.[WORKFLOW_MODEL_UID]?.attributes?.contentTypes;
351
- const hasContentTypes = !!contentTypes?.[WORKFLOW_MODEL_UID]?.attributes?.contentTypes;
352
- if (!hadContentTypes && hasContentTypes) {
353
- await strapi.db.query(WORKFLOW_MODEL_UID).updateMany({ data: { contentTypes: [] } });
354
- const contentTypes2 = pipe([pickBy(get("options.reviewWorkflows")), keys])(oldContentTypes);
355
- if (contentTypes2.length) {
356
- await strapi.db.query(WORKFLOW_MODEL_UID).update({ where: { id: { $notNull: true } }, data: { contentTypes: contentTypes2 } });
517
+ };
518
+ const executeCEBootstrap = async ({ strapi: strapi2 }) => {
519
+ await registerAdminConditions();
520
+ await registerPermissionActions();
521
+ registerModelHooks();
522
+ const permissionService = getService$1("permission");
523
+ const userService = getService$1("user");
524
+ const roleService = getService$1("role");
525
+ const apiTokenService = getService$1("api-token");
526
+ const transferService = getService$1("transfer");
527
+ const tokenService = getService$1("token");
528
+ await roleService.createRolesIfNoneExist();
529
+ await roleService.resetSuperAdminPermissions();
530
+ await roleService.displayWarningIfNoSuperAdmin();
531
+ await permissionService.cleanPermissionsInDatabase();
532
+ await userService.displayWarningIfUsersDontHaveRole();
533
+ await syncAuthSettings();
534
+ await syncAPITokensPermissions();
535
+ await getService$1("metrics").sendUpdateProjectInformation(strapi2);
536
+ getService$1("metrics").startCron(strapi2);
537
+ apiTokenService.checkSaltIsDefined();
538
+ transferService.token.checkSaltIsDefined();
539
+ tokenService.checkSecretIsDefined();
540
+ };
541
+ const getService = (name2, { strapi: strapi2 } = { strapi: global.strapi }) => {
542
+ return strapi2.service(`admin::${name2}`);
543
+ };
544
+ const actions = {
545
+ sso: [
546
+ {
547
+ uid: "provider-login.read",
548
+ displayName: "Read",
549
+ pluginName: "admin",
550
+ section: "settings",
551
+ category: "single sign on",
552
+ subCategory: "options"
553
+ },
554
+ {
555
+ uid: "provider-login.update",
556
+ displayName: "Update",
557
+ pluginName: "admin",
558
+ section: "settings",
559
+ category: "single sign on",
560
+ subCategory: "options"
357
561
  }
358
- }
359
- }
562
+ ],
563
+ auditLogs: [
564
+ {
565
+ uid: "audit-logs.read",
566
+ displayName: "Read",
567
+ pluginName: "admin",
568
+ section: "settings",
569
+ category: "audit logs",
570
+ subCategory: "options"
571
+ }
572
+ ]
573
+ };
360
574
  const transformTableName = (table) => {
361
575
  if (typeof table === "string") {
362
576
  return { name: table };
@@ -393,1292 +607,213 @@ async function getPersistedTables({ strapi: strapi2 }) {
393
607
  });
394
608
  return (persistedTables || []).map(transformTableName);
395
609
  }
396
- async function setPersistedTables({ strapi: strapi2 }, tableNames) {
397
- await strapi2.store.set({
398
- type: "core",
399
- key: "persisted_tables",
400
- value: tableNames
401
- });
402
- }
403
610
  const persistTablesWithPrefix = async (tableNamePrefix) => {
404
611
  const tableNameRegex = new RegExp(`^${tableNamePrefix}.*`);
405
612
  const tableNames = await findTables({ strapi }, tableNameRegex);
406
613
  await addPersistTables({ strapi }, tableNames);
407
614
  };
408
- const removePersistedTablesWithSuffix = async (tableNameSuffix) => {
409
- const tableNameRegex = new RegExp(`.*${tableNameSuffix}$`);
410
- const persistedTables = await getPersistedTables({ strapi });
411
- const filteredPersistedTables = persistedTables.filter((table) => {
412
- return !tableNameRegex.test(table.name);
413
- });
414
- if (filteredPersistedTables.length === persistedTables.length) {
415
- return;
615
+ const bootstrap = async (args) => {
616
+ const { actionProvider } = getService("permission");
617
+ if (strapi.ee.features.isEnabled("sso")) {
618
+ await actionProvider.registerMany(actions.sso);
619
+ }
620
+ if (strapi.ee.features.isEnabled("audit-logs")) {
621
+ await persistTablesWithPrefix("strapi_audit_logs");
622
+ await actionProvider.registerMany(actions.auditLogs);
416
623
  }
417
- await setPersistedTables({ strapi }, filteredPersistedTables);
624
+ await getService("seat-enforcement").seatEnforcementWorkflow();
625
+ await executeCEBootstrap(args);
418
626
  };
419
- const persistTables = async (tables) => {
420
- await addPersistTables({ strapi }, tables);
627
+ const executeCEDestroy = async () => {
628
+ const { conditionProvider, actionProvider } = getService$1("permission");
629
+ await conditionProvider.clear();
630
+ await actionProvider.clear();
421
631
  };
422
- function checkVersionThreshold(startVersion, currentVersion, thresholdVersion) {
423
- return semver.gte(currentVersion, thresholdVersion) && semver.lt(startVersion, thresholdVersion);
424
- }
425
- async function migrateStageAttribute({ oldContentTypes, contentTypes }) {
426
- const getRWVersion = getOr("0.0.0", `${STAGE_MODEL_UID}.options.version`);
427
- const oldRWVersion = getRWVersion(oldContentTypes);
428
- const currentRWVersion = getRWVersion(contentTypes);
429
- const migrationNeeded = checkVersionThreshold(oldRWVersion, currentRWVersion, "1.1.0");
430
- if (migrationNeeded) {
431
- const oldAttributeTableName = "strapi_review_workflows_stage";
432
- const newAttributeTableName = "strapi_stage";
433
- const tables = await findTables({ strapi }, new RegExp(oldAttributeTableName));
434
- await async.map(tables, async (tableName) => {
435
- const newTableName = tableName.replace(oldAttributeTableName, newAttributeTableName);
436
- const alreadyHasNextTable = await strapi.db.connection.schema.hasTable(newTableName);
437
- if (alreadyHasNextTable) {
438
- const dataInTable = await strapi.db.connection(newTableName).select().limit(1);
439
- if (!dataInTable.length) {
440
- await strapi.db.connection.schema.dropTable(newTableName);
441
- }
442
- }
443
- try {
444
- await strapi.db.connection.schema.renameTable(tableName, newTableName);
445
- } catch (e) {
446
- strapi.log.warn(
447
- `An error occurred during the migration of ${tableName} table to ${newTableName}.
448
- If ${newTableName} already exists, migration can't be done automatically.`
449
- );
450
- strapi.log.warn(e.message);
451
- }
452
- });
632
+ const destroy = async ({ strapi: strapi2 }) => {
633
+ await executeCEDestroy();
634
+ };
635
+ const adminContentTypes = {};
636
+ const isSsoLocked = async (user2) => {
637
+ if (!strapi.ee.features.isEnabled("sso")) {
638
+ return false;
453
639
  }
454
- }
455
- const getVisibleContentTypesUID = pipe([
456
- // Pick only content-types visible in the content-manager and option is not false
457
- pickBy(
458
- (value) => getOr(true, "pluginOptions.content-manager.visible", value) && !getOr(false, "options.noStageAttribute", value)
459
- ),
460
- // Get UIDs
461
- keys
462
- ]);
463
- const hasStageAttribute = has(["attributes", ENTITY_STAGE_ATTRIBUTE]);
464
- const getWorkflowContentTypeFilter = ({ strapi: strapi2 }, contentType) => {
465
- if (strapi2.db.dialect.supportsOperator("$jsonSupersetOf")) {
466
- return { $jsonSupersetOf: JSON.stringify([contentType]) };
467
- }
468
- return { $contains: `"${contentType}"` };
469
- };
470
- const clampMaxWorkflows = clamp(1, MAX_WORKFLOWS);
471
- const clampMaxStagesPerWorkflow = clamp(1, MAX_STAGES_PER_WORKFLOW);
472
- async function migrateDeletedCTInWorkflows({ oldContentTypes, contentTypes }) {
473
- const deletedContentTypes = difference(keys(oldContentTypes), keys(contentTypes)) ?? [];
474
- if (deletedContentTypes.length) {
475
- await async.map(deletedContentTypes, async (deletedContentTypeUID) => {
476
- const workflow2 = await strapi.db.query(WORKFLOW_MODEL_UID).findOne({
477
- select: ["id", "contentTypes"],
478
- where: {
479
- contentTypes: getWorkflowContentTypeFilter({ strapi }, deletedContentTypeUID)
480
- }
481
- });
482
- if (workflow2) {
483
- await strapi.db.query(WORKFLOW_MODEL_UID).update({
484
- where: { id: workflow2.id },
485
- data: {
486
- contentTypes: workflow2.contentTypes.filter(
487
- (contentTypeUID) => contentTypeUID !== deletedContentTypeUID
488
- )
489
- }
490
- });
491
- }
492
- });
640
+ if (!user2) {
641
+ throw new Error("Missing user object");
493
642
  }
494
- }
495
- const DEFAULT_RETENTION_DAYS = 90;
496
- const defaultEvents = [
497
- "entry.create",
498
- "entry.update",
499
- "entry.delete",
500
- "entry.publish",
501
- "entry.unpublish",
502
- "media.create",
503
- "media.update",
504
- "media.delete",
505
- "media-folder.create",
506
- "media-folder.update",
507
- "media-folder.delete",
508
- "user.create",
509
- "user.update",
510
- "user.delete",
511
- "admin.auth.success",
512
- "admin.logout",
513
- "content-type.create",
514
- "content-type.update",
515
- "content-type.delete",
516
- "component.create",
517
- "component.update",
518
- "component.delete",
519
- "role.create",
520
- "role.update",
521
- "role.delete",
522
- "permission.create",
523
- "permission.update",
524
- "permission.delete"
525
- ];
526
- const getSanitizedUser = (user2) => {
527
- let displayName = user2.email;
528
- if (user2.username) {
529
- displayName = user2.username;
530
- } else if (user2.firstname && user2.lastname) {
531
- displayName = `${user2.firstname} ${user2.lastname}`;
643
+ const adminStore = await strapi.store({ type: "core", name: "admin" });
644
+ const { providers } = await adminStore.get({ key: "auth" });
645
+ const lockedRoles = providers.ssoLockedRoles ?? [];
646
+ if (isEmpty(lockedRoles)) {
647
+ return false;
532
648
  }
533
- return {
534
- id: user2.id,
535
- email: user2.email,
536
- displayName
537
- };
538
- };
539
- const getEventMap = (defaultEvents2) => {
540
- const getDefaultPayload = (...args) => args[0];
541
- return defaultEvents2.reduce((acc, event) => {
542
- acc[event] = getDefaultPayload;
543
- return acc;
544
- }, {});
649
+ const roles2 = (
650
+ // If the roles are pre-loaded for the given user, then use them
651
+ user2.roles ?? // Otherwise, try to load the role based on the given user ID
652
+ await strapi.db.query("admin::user").load(user2, "roles", { roles: { fields: ["id"] } }) ?? // If the query fails somehow, default to an empty array
653
+ []
654
+ );
655
+ const isLocked = lockedRoles.some(
656
+ (lockedId) => (
657
+ // lockedRoles will be a string to avoid issues with frontend and bigints
658
+ roles2.some((role2) => lockedId === role2.id.toString())
659
+ )
660
+ );
661
+ return isLocked;
545
662
  };
546
- const getRetentionDays = (strapi2) => {
547
- const licenseRetentionDays = strapi2.ee.features.get("audit-logs")?.options.retentionDays;
548
- const userRetentionDays = strapi2.config.get("admin.auditLogs.retentionDays");
549
- if (licenseRetentionDays == null) {
550
- return userRetentionDays ?? DEFAULT_RETENTION_DAYS;
551
- }
552
- if (userRetentionDays && userRetentionDays < licenseRetentionDays) {
553
- return userRetentionDays;
663
+ const { ApplicationError: ApplicationError$2 } = errors;
664
+ const forgotPassword = async ({ email: email2 } = {}) => {
665
+ const user2 = await strapi.db.query("admin::user").findOne({ where: { email: email2, isActive: true } });
666
+ if (!user2 || await isSsoLocked(user2)) {
667
+ return;
554
668
  }
555
- return licenseRetentionDays;
556
- };
557
- const createAuditLogsService = (strapi2) => {
558
- const state = {};
559
- const eventMap = getEventMap(defaultEvents);
560
- const processEvent = (name2, ...args) => {
561
- const requestState = strapi2.requestContext.get()?.state;
562
- const isUsingAdminAuth = requestState?.auth?.strategy.name === "admin";
563
- const user2 = requestState?.user;
564
- if (!isUsingAdminAuth || !user2) {
565
- return null;
566
- }
567
- const getPayload = eventMap[name2];
568
- if (!getPayload) {
569
- return null;
570
- }
571
- const ignoredUids = ["plugin::upload.file", "plugin::upload.folder"];
572
- if (ignoredUids.includes(args[0]?.uid)) {
573
- return null;
669
+ const resetPasswordToken = getService("token").createToken();
670
+ await getService("user").updateById(user2.id, { resetPasswordToken });
671
+ const url = `${strapi.config.get(
672
+ "admin.absoluteUrl"
673
+ )}/auth/reset-password?code=${resetPasswordToken}`;
674
+ return strapi.plugin("email").service("email").sendTemplatedEmail(
675
+ {
676
+ to: user2.email,
677
+ from: strapi.config.get("admin.forgotPassword.from"),
678
+ replyTo: strapi.config.get("admin.forgotPassword.replyTo")
679
+ },
680
+ strapi.config.get("admin.forgotPassword.emailTemplate"),
681
+ {
682
+ url,
683
+ user: _.pick(user2, ["email", "firstname", "lastname", "username"])
574
684
  }
575
- return {
576
- action: name2,
577
- date: (/* @__PURE__ */ new Date()).toISOString(),
578
- payload: getPayload(...args) || {},
579
- userId: user2.id
580
- };
581
- };
582
- async function handleEvent(name2, ...args) {
583
- const processedEvent = processEvent(name2, ...args);
584
- if (processedEvent) {
585
- await strapi2.db.transaction(({ onCommit }) => {
586
- onCommit(() => state.provider.saveEvent(processedEvent));
587
- });
685
+ ).catch((err) => {
686
+ strapi.log.error(err);
687
+ });
688
+ };
689
+ const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
690
+ const matchingUser = await strapi.db.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
691
+ if (!matchingUser || await isSsoLocked(matchingUser)) {
692
+ throw new ApplicationError$2();
693
+ }
694
+ return getService("user").updateById(matchingUser.id, {
695
+ password: password2,
696
+ resetPasswordToken: null
697
+ });
698
+ };
699
+ const auth = {
700
+ forgotPassword,
701
+ resetPassword
702
+ };
703
+ const createLocalStrategy = (strapi2, middleware) => {
704
+ return new Strategy(
705
+ {
706
+ usernameField: "email",
707
+ passwordField: "password",
708
+ session: false
709
+ },
710
+ (email2, password2, done) => {
711
+ return getService$1("auth").checkCredentials({ email: toLower(email2), password: password2 }).then(async ([error, user2, message]) => {
712
+ if (middleware) {
713
+ return middleware([error, user2, message], done);
714
+ }
715
+ return done(error, user2, message);
716
+ }).catch((error) => done(error));
588
717
  }
718
+ );
719
+ };
720
+ const authEventsMapper = {
721
+ onConnectionSuccess: "admin.auth.success",
722
+ onConnectionError: "admin.auth.error"
723
+ };
724
+ const valueIsFunctionType = ([, value]) => isFunction(value);
725
+ const keyIsValidEventName = ([key]) => {
726
+ return Object.keys(strapi.service("admin::passport").authEventsMapper).includes(key);
727
+ };
728
+ const getPassportStrategies$1 = () => [createLocalStrategy(strapi)];
729
+ const registerAuthEvents = () => {
730
+ const { events = {} } = strapi.config.get("admin.auth", {});
731
+ const { authEventsMapper: authEventsMapper2 } = strapi.service("admin::passport");
732
+ const eventList = Object.entries(events).filter(keyIsValidEventName).filter(valueIsFunctionType);
733
+ for (const [eventName, handler] of eventList) {
734
+ strapi.eventHub.on(authEventsMapper2[eventName], handler);
589
735
  }
590
- return {
591
- async register() {
592
- if (!state.eeEnableUnsubscribe) {
593
- state.eeEnableUnsubscribe = strapi2.eventHub.on("ee.enable", () => {
594
- this.destroy();
595
- this.register();
596
- });
597
- }
598
- if (!state.eeUpdateUnsubscribe) {
599
- state.eeUpdateUnsubscribe = strapi2.eventHub.on("ee.update", () => {
600
- this.destroy();
601
- this.register();
602
- });
603
- }
604
- state.eeDisableUnsubscribe = strapi2.eventHub.on("ee.disable", () => {
605
- this.destroy();
606
- });
607
- state.provider = await localProvider.register({ strapi: strapi2 });
608
- if (!strapi2.ee.features.isEnabled("audit-logs")) {
609
- return this;
736
+ };
737
+ const init = () => {
738
+ strapi.service("admin::passport").getPassportStrategies().forEach((strategy) => passport$2.use(strategy));
739
+ registerAuthEvents();
740
+ return passport$2.initialize();
741
+ };
742
+ const passport$1 = { init, getPassportStrategies: getPassportStrategies$1, authEventsMapper };
743
+ const createProviderRegistry = () => {
744
+ const registry = /* @__PURE__ */ new Map();
745
+ Object.assign(registry, {
746
+ register(provider) {
747
+ if (strapi.isLoaded) {
748
+ throw new Error(`You can't register new provider after the bootstrap`);
610
749
  }
611
- state.eventHubUnsubscribe = strapi2.eventHub.subscribe(handleEvent.bind(this));
612
- const retentionDays = getRetentionDays(strapi2);
613
- state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
614
- const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1e3);
615
- state.provider.deleteExpiredEvents(expirationDate);
616
- });
617
- return this;
750
+ this.set(provider.uid, provider);
618
751
  },
619
- async findMany(query) {
620
- const { results, pagination } = await state.provider.findMany(query);
621
- const sanitizedResults = results.map((result) => {
622
- const { user: user2, ...rest } = result;
623
- return {
624
- ...rest,
625
- user: user2 ? getSanitizedUser(user2) : null
626
- };
752
+ registerMany(providers) {
753
+ providers.forEach((provider) => {
754
+ this.register(provider);
627
755
  });
628
- return {
629
- results: sanitizedResults,
630
- pagination
631
- };
632
- },
633
- async findOne(id) {
634
- const result = await state.provider.findOne(id);
635
- if (!result) {
636
- return null;
637
- }
638
- const { user: user2, ...rest } = result;
639
- return {
640
- ...rest,
641
- user: user2 ? getSanitizedUser(user2) : null
642
- };
643
- },
644
- unsubscribe() {
645
- if (state.eeDisableUnsubscribe) {
646
- state.eeDisableUnsubscribe();
647
- }
648
- if (state.eventHubUnsubscribe) {
649
- state.eventHubUnsubscribe();
650
- }
651
- if (state.deleteExpiredJob) {
652
- state.deleteExpiredJob.cancel();
653
- }
654
- return this;
655
756
  },
656
- destroy() {
657
- return this.unsubscribe();
658
- }
659
- };
660
- };
661
- function contentTypeMiddleware(strapi2) {
662
- const moveReviewWorkflowOption = (ctx) => {
663
- const { reviewWorkflows: reviewWorkflows2, ...contentType } = ctx.request.body.contentType;
664
- if (typeof reviewWorkflows2 === "boolean") {
665
- ctx.request.body.contentType = set("options.reviewWorkflows", reviewWorkflows2, contentType);
666
- }
667
- };
668
- strapi2.server.router.use("/content-type-builder/content-types/:uid?", (ctx, next) => {
669
- if (ctx.method === "PUT" || ctx.method === "POST") {
670
- moveReviewWorkflowOption(ctx);
757
+ getAll() {
758
+ return Array.from(this.values());
671
759
  }
672
- return next();
673
760
  });
674
- }
675
- const reviewWorkflowsMiddlewares = {
676
- contentTypeMiddleware
761
+ return registry;
677
762
  };
678
- const register = async ({ strapi: strapi2 }) => {
679
- const auditLogsIsEnabled = strapi2.config.get("admin.auditLogs.enabled", true);
680
- if (auditLogsIsEnabled) {
681
- strapi2.hook("strapi::content-types.beforeSync").register(migrateAuditLogsTable);
682
- const auditLogsService = createAuditLogsService(strapi2);
683
- strapi2.add("audit-logs", auditLogsService);
684
- await auditLogsService.register();
685
- }
686
- if (strapi2.ee.features.isEnabled("review-workflows")) {
687
- strapi2.hook("strapi::content-types.beforeSync").register(migrateStageAttribute);
688
- strapi2.hook("strapi::content-types.afterSync").register(migrateReviewWorkflowStagesColor).register(migrateReviewWorkflowStagesRoles).register(migrateReviewWorkflowName).register(migrateWorkflowsContentTypes).register(migrateDeletedCTInWorkflows);
689
- const reviewWorkflowService = getService("review-workflows");
690
- reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi2);
691
- await reviewWorkflowService.register(strapi2.ee.features.get("review-workflows"));
763
+ const providerRegistry = createProviderRegistry();
764
+ const errorMessage = "SSO is disabled. Its functionnalities cannot be accessed.";
765
+ const getStrategyCallbackURL = (providerName) => {
766
+ if (!strapi.ee.features.isEnabled("sso")) {
767
+ throw new Error(errorMessage);
692
768
  }
693
- await executeCERegister({ strapi: strapi2 });
769
+ return `/admin/connect/${providerName}`;
694
770
  };
695
- const workflow = {
696
- schema: {
697
- collectionName: "strapi_workflows",
698
- info: {
699
- name: "Workflow",
700
- description: "",
701
- singularName: "workflow",
702
- pluralName: "workflows",
703
- displayName: "Workflow"
704
- },
705
- options: {},
706
- pluginOptions: {
707
- "content-manager": {
708
- visible: false
709
- },
710
- "content-type-builder": {
711
- visible: false
712
- }
713
- },
714
- attributes: {
715
- name: {
716
- type: "string",
717
- required: true,
718
- unique: true
719
- },
720
- stages: {
721
- type: "relation",
722
- target: "admin::workflow-stage",
723
- relation: "oneToMany",
724
- mappedBy: "workflow"
725
- },
726
- contentTypes: {
727
- type: "json",
728
- required: true,
729
- default: []
730
- }
731
- }
771
+ const syncProviderRegistryWithConfig = () => {
772
+ if (!strapi.ee.features.isEnabled("sso")) {
773
+ throw new Error(errorMessage);
732
774
  }
775
+ const { providers = [] } = strapi.config.get("admin.auth", {});
776
+ providerRegistry.registerMany(providers);
733
777
  };
734
- const workflowStage = {
735
- schema: {
736
- collectionName: "strapi_workflows_stages",
737
- info: {
738
- name: "Workflow Stage",
739
- description: "",
740
- singularName: "workflow-stage",
741
- pluralName: "workflow-stages",
742
- displayName: "Stages"
743
- },
744
- options: {
745
- version: "1.1.0"
746
- },
747
- pluginOptions: {
748
- "content-manager": {
749
- visible: false
750
- },
751
- "content-type-builder": {
752
- visible: false
753
- }
754
- },
755
- attributes: {
756
- name: {
757
- type: "string",
758
- configurable: false
759
- },
760
- color: {
761
- type: "string",
762
- configurable: false,
763
- default: STAGE_DEFAULT_COLOR
764
- },
765
- workflow: {
766
- type: "relation",
767
- target: "admin::workflow",
768
- relation: "manyToOne",
769
- inversedBy: "stages",
770
- configurable: false
771
- },
772
- permissions: {
773
- type: "relation",
774
- target: "admin::permission",
775
- relation: "manyToMany",
776
- configurable: false
777
- }
778
- }
778
+ const SSOAuthEventsMapper = {
779
+ onSSOAutoRegistration: "admin.auth.autoRegistration"
780
+ };
781
+ const sso$1 = {
782
+ providerRegistry,
783
+ getStrategyCallbackURL,
784
+ syncProviderRegistryWithConfig,
785
+ authEventsMapper: { ...passport$1.authEventsMapper, ...SSOAuthEventsMapper }
786
+ };
787
+ const { UnauthorizedError } = errors;
788
+ const localStrategyMiddleware = async ([error, user2, message], done) => {
789
+ if (user2 && !error && await isSsoLocked(user2)) {
790
+ return done(
791
+ new UnauthorizedError("Login not allowed, please contact your administrator", {
792
+ code: "LOGIN_NOT_ALLOWED"
793
+ }),
794
+ user2,
795
+ message
796
+ );
779
797
  }
798
+ return done(error, user2, message);
780
799
  };
781
- const index$3 = {
782
- workflow,
783
- "workflow-stage": workflowStage
784
- };
785
- const actions$1 = [
786
- {
787
- uid: "marketplace.read",
788
- displayName: "Access the marketplace",
789
- pluginName: "admin",
790
- section: "settings",
791
- category: "plugins and marketplace",
792
- subCategory: "marketplace"
793
- },
794
- {
795
- uid: "webhooks.create",
796
- displayName: "Create",
797
- pluginName: "admin",
798
- section: "settings",
799
- category: "webhooks"
800
- },
801
- {
802
- uid: "webhooks.read",
803
- displayName: "Read",
804
- pluginName: "admin",
805
- section: "settings",
806
- category: "webhooks"
807
- },
808
- {
809
- uid: "webhooks.update",
810
- displayName: "Update",
811
- pluginName: "admin",
812
- section: "settings",
813
- category: "webhooks"
814
- },
815
- {
816
- uid: "webhooks.delete",
817
- displayName: "Delete",
818
- pluginName: "admin",
819
- section: "settings",
820
- category: "webhooks"
821
- },
822
- {
823
- uid: "users.create",
824
- displayName: "Create (invite)",
825
- pluginName: "admin",
826
- section: "settings",
827
- category: "users and roles",
828
- subCategory: "users"
829
- },
830
- {
831
- uid: "users.read",
832
- displayName: "Read",
833
- pluginName: "admin",
834
- section: "settings",
835
- category: "users and roles",
836
- subCategory: "users"
837
- },
838
- {
839
- uid: "users.update",
840
- displayName: "Update",
841
- pluginName: "admin",
842
- section: "settings",
843
- category: "users and roles",
844
- subCategory: "users"
845
- },
846
- {
847
- uid: "users.delete",
848
- displayName: "Delete",
849
- pluginName: "admin",
850
- section: "settings",
851
- category: "users and roles",
852
- subCategory: "users"
853
- },
854
- {
855
- uid: "roles.create",
856
- displayName: "Create",
857
- pluginName: "admin",
858
- section: "settings",
859
- category: "users and roles",
860
- subCategory: "roles"
861
- },
862
- {
863
- uid: "roles.read",
864
- displayName: "Read",
865
- pluginName: "admin",
866
- section: "settings",
867
- category: "users and roles",
868
- subCategory: "roles"
869
- },
870
- {
871
- uid: "roles.update",
872
- displayName: "Update",
873
- pluginName: "admin",
874
- section: "settings",
875
- category: "users and roles",
876
- subCategory: "roles"
877
- },
878
- {
879
- uid: "roles.delete",
880
- displayName: "Delete",
881
- pluginName: "admin",
882
- section: "settings",
883
- category: "users and roles",
884
- subCategory: "roles"
885
- },
886
- {
887
- uid: "api-tokens.access",
888
- displayName: "Access the API tokens settings page",
889
- pluginName: "admin",
890
- section: "settings",
891
- category: "api tokens",
892
- subCategory: "api Tokens"
893
- },
894
- {
895
- uid: "api-tokens.create",
896
- displayName: "Create (generate)",
897
- pluginName: "admin",
898
- section: "settings",
899
- category: "api tokens",
900
- subCategory: "general"
901
- },
902
- {
903
- uid: "api-tokens.read",
904
- displayName: "Read",
905
- pluginName: "admin",
906
- section: "settings",
907
- category: "api tokens",
908
- subCategory: "general"
909
- },
910
- {
911
- uid: "api-tokens.update",
912
- displayName: "Update",
913
- pluginName: "admin",
914
- section: "settings",
915
- category: "api tokens",
916
- subCategory: "general"
917
- },
918
- {
919
- uid: "api-tokens.regenerate",
920
- displayName: "Regenerate",
921
- pluginName: "admin",
922
- section: "settings",
923
- category: "api tokens",
924
- subCategory: "general"
925
- },
926
- {
927
- uid: "api-tokens.delete",
928
- displayName: "Delete (revoke)",
929
- pluginName: "admin",
930
- section: "settings",
931
- category: "api tokens",
932
- subCategory: "general"
933
- },
934
- {
935
- uid: "project-settings.update",
936
- displayName: "Update the project level settings",
937
- pluginName: "admin",
938
- section: "settings",
939
- category: "project"
940
- },
941
- {
942
- uid: "project-settings.read",
943
- displayName: "Read the project level settings",
944
- pluginName: "admin",
945
- section: "settings",
946
- category: "project"
947
- },
948
- {
949
- uid: "transfer.tokens.access",
950
- displayName: "Access the transfer tokens settings page",
951
- pluginName: "admin",
952
- section: "settings",
953
- category: "transfer tokens",
954
- subCategory: "transfer tokens"
955
- },
956
- {
957
- uid: "transfer.tokens.create",
958
- displayName: "Create (generate)",
959
- pluginName: "admin",
960
- section: "settings",
961
- category: "transfer tokens",
962
- subCategory: "general"
963
- },
964
- {
965
- uid: "transfer.tokens.read",
966
- displayName: "Read",
967
- pluginName: "admin",
968
- section: "settings",
969
- category: "transfer tokens",
970
- subCategory: "general"
971
- },
972
- {
973
- uid: "transfer.tokens.update",
974
- displayName: "Update",
975
- pluginName: "admin",
976
- section: "settings",
977
- category: "transfer tokens",
978
- subCategory: "general"
979
- },
980
- {
981
- uid: "transfer.tokens.regenerate",
982
- displayName: "Regenerate",
983
- pluginName: "admin",
984
- section: "settings",
985
- category: "transfer tokens",
986
- subCategory: "general"
987
- },
988
- {
989
- uid: "transfer.tokens.delete",
990
- displayName: "Delete (revoke)",
991
- pluginName: "admin",
992
- section: "settings",
993
- category: "transfer tokens",
994
- subCategory: "general"
995
- }
996
- ];
997
- const adminActions = {
998
- actions: actions$1
999
- };
1000
- const conditions = [
1001
- {
1002
- displayName: "Is creator",
1003
- name: "is-creator",
1004
- plugin: "admin",
1005
- handler: (user2) => ({ "createdBy.id": user2.id })
1006
- },
1007
- {
1008
- displayName: "Has same role as creator",
1009
- name: "has-same-role-as-creator",
1010
- plugin: "admin",
1011
- handler: (user2) => ({
1012
- "createdBy.roles": {
1013
- $elemMatch: {
1014
- id: {
1015
- $in: user2.roles.map((r) => r.id)
1016
- }
1017
- }
1018
- }
1019
- })
1020
- }
1021
- ];
1022
- const adminConditions = {
1023
- conditions
1024
- };
1025
- const defaultAdminAuthSettings = {
1026
- providers: {
1027
- autoRegister: false,
1028
- defaultRole: null,
1029
- ssoLockedRoles: null
1030
- }
1031
- };
1032
- const registerPermissionActions = async () => {
1033
- await getService$1("permission").actionProvider.registerMany(adminActions.actions);
1034
- };
1035
- const registerAdminConditions = async () => {
1036
- await getService$1("permission").conditionProvider.registerMany(adminConditions.conditions);
1037
- };
1038
- const registerModelHooks = () => {
1039
- const { sendDidChangeInterfaceLanguage } = getService$1("metrics");
1040
- strapi.db.lifecycles.subscribe({
1041
- models: ["admin::user"],
1042
- afterCreate: sendDidChangeInterfaceLanguage,
1043
- afterDelete: sendDidChangeInterfaceLanguage,
1044
- afterUpdate({ params }) {
1045
- if (params.data.preferedLanguage) {
1046
- sendDidChangeInterfaceLanguage();
1047
- }
1048
- }
1049
- });
1050
- };
1051
- const syncAuthSettings = async () => {
1052
- const adminStore = await strapi.store({ type: "core", name: "admin" });
1053
- const adminAuthSettings = await adminStore.get({ key: "auth" });
1054
- const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);
1055
- const roleExists = await getService$1("role").exists({
1056
- id: newAuthSettings.providers.defaultRole
1057
- });
1058
- if (!roleExists) {
1059
- newAuthSettings.providers.defaultRole = null;
1060
- }
1061
- await adminStore.set({ key: "auth", value: newAuthSettings });
1062
- };
1063
- const syncAPITokensPermissions = async () => {
1064
- const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
1065
- const permissionsInDB = await async.pipe(
1066
- strapi.db.query("admin::api-token-permission").findMany,
1067
- map("action")
1068
- )();
1069
- const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));
1070
- if (unknownPermissions.length > 0) {
1071
- await strapi.db.query("admin::api-token-permission").deleteMany({ where: { action: { $in: unknownPermissions } } });
1072
- }
1073
- };
1074
- const executeCEBootstrap = async ({ strapi: strapi2 }) => {
1075
- await registerAdminConditions();
1076
- await registerPermissionActions();
1077
- registerModelHooks();
1078
- const permissionService = getService$1("permission");
1079
- const userService = getService$1("user");
1080
- const roleService = getService$1("role");
1081
- const apiTokenService = getService$1("api-token");
1082
- const transferService = getService$1("transfer");
1083
- const tokenService = getService$1("token");
1084
- await roleService.createRolesIfNoneExist();
1085
- await roleService.resetSuperAdminPermissions();
1086
- await roleService.displayWarningIfNoSuperAdmin();
1087
- await permissionService.cleanPermissionsInDatabase();
1088
- await userService.displayWarningIfUsersDontHaveRole();
1089
- await syncAuthSettings();
1090
- await syncAPITokensPermissions();
1091
- getService$1("metrics").sendUpdateProjectInformation(strapi2);
1092
- getService$1("metrics").startCron(strapi2);
1093
- apiTokenService.checkSaltIsDefined();
1094
- transferService.token.checkSaltIsDefined();
1095
- tokenService.checkSecretIsDefined();
1096
- };
1097
- const actions = {
1098
- sso: [
1099
- {
1100
- uid: "provider-login.read",
1101
- displayName: "Read",
1102
- pluginName: "admin",
1103
- section: "settings",
1104
- category: "single sign on",
1105
- subCategory: "options"
1106
- },
1107
- {
1108
- uid: "provider-login.update",
1109
- displayName: "Update",
1110
- pluginName: "admin",
1111
- section: "settings",
1112
- category: "single sign on",
1113
- subCategory: "options"
1114
- }
1115
- ],
1116
- auditLogs: [
1117
- {
1118
- uid: "audit-logs.read",
1119
- displayName: "Read",
1120
- pluginName: "admin",
1121
- section: "settings",
1122
- category: "audit logs",
1123
- subCategory: "options"
1124
- }
1125
- ],
1126
- reviewWorkflows: [
1127
- {
1128
- uid: "review-workflows.create",
1129
- displayName: "Create",
1130
- pluginName: "admin",
1131
- section: "settings",
1132
- category: "review workflows",
1133
- subCategory: "options"
1134
- },
1135
- {
1136
- uid: "review-workflows.read",
1137
- displayName: "Read",
1138
- pluginName: "admin",
1139
- section: "settings",
1140
- category: "review workflows",
1141
- subCategory: "options"
1142
- },
1143
- {
1144
- uid: "review-workflows.update",
1145
- displayName: "Update",
1146
- pluginName: "admin",
1147
- section: "settings",
1148
- category: "review workflows",
1149
- subCategory: "options"
1150
- },
1151
- {
1152
- uid: "review-workflows.delete",
1153
- displayName: "Delete",
1154
- pluginName: "admin",
1155
- section: "settings",
1156
- category: "review workflows",
1157
- subCategory: "options"
1158
- },
1159
- {
1160
- uid: "review-workflows.stage.transition",
1161
- displayName: "Change stage",
1162
- pluginName: "admin",
1163
- section: "internal"
1164
- }
1165
- ]
1166
- };
1167
- const bootstrap = async (args) => {
1168
- const { actionProvider } = getService("permission");
1169
- if (strapi.ee.features.isEnabled("sso")) {
1170
- await actionProvider.registerMany(actions.sso);
1171
- }
1172
- if (strapi.ee.features.isEnabled("audit-logs")) {
1173
- await persistTablesWithPrefix("strapi_audit_logs");
1174
- await actionProvider.registerMany(actions.auditLogs);
1175
- }
1176
- if (strapi.ee.features.isEnabled("review-workflows")) {
1177
- await persistTablesWithPrefix("strapi_workflows");
1178
- const { bootstrap: rwBootstrap } = getService("review-workflows");
1179
- await rwBootstrap();
1180
- await actionProvider.registerMany(actions.reviewWorkflows);
1181
- getService("review-workflows-decorator");
1182
- await getService("review-workflows-weekly-metrics").registerCron();
1183
- }
1184
- await getService("seat-enforcement").seatEnforcementWorkflow();
1185
- await executeCEBootstrap(args);
1186
- };
1187
- const executeCEDestroy = async () => {
1188
- const { conditionProvider, actionProvider } = getService$1("permission");
1189
- await conditionProvider.clear();
1190
- await actionProvider.clear();
1191
- };
1192
- const destroy = async ({ strapi: strapi2 }) => {
1193
- if (strapi2.ee.features.isEnabled("audit-logs")) {
1194
- strapi2.get("audit-logs").destroy();
1195
- }
1196
- await executeCEDestroy();
1197
- };
1198
- const enableFeatureMiddleware = (featureName) => (ctx, next) => {
1199
- if (strapi.ee.features.isEnabled(featureName)) {
1200
- return next();
1201
- }
1202
- ctx.status = 404;
1203
- };
1204
- const sso$1 = {
1205
- type: "admin",
1206
- routes: [
1207
- {
1208
- method: "GET",
1209
- path: "/providers",
1210
- handler: "authentication.getProviders",
1211
- config: {
1212
- middlewares: [enableFeatureMiddleware("sso")],
1213
- auth: false
1214
- }
1215
- },
1216
- {
1217
- method: "GET",
1218
- path: "/connect/:provider",
1219
- handler: "authentication.providerLogin",
1220
- config: {
1221
- middlewares: [enableFeatureMiddleware("sso")],
1222
- auth: false
1223
- }
1224
- },
1225
- {
1226
- method: "POST",
1227
- path: "/connect/:provider",
1228
- handler: "authentication.providerLogin",
1229
- config: {
1230
- middlewares: [enableFeatureMiddleware("sso")],
1231
- auth: false
1232
- }
1233
- },
1234
- {
1235
- method: "GET",
1236
- path: "/providers/options",
1237
- handler: "authentication.getProviderLoginOptions",
1238
- config: {
1239
- middlewares: [enableFeatureMiddleware("sso")],
1240
- policies: [
1241
- "admin::isAuthenticatedAdmin",
1242
- { name: "admin::hasPermissions", config: { actions: ["admin::provider-login.read"] } }
1243
- ]
1244
- }
1245
- },
1246
- {
1247
- method: "PUT",
1248
- path: "/providers/options",
1249
- handler: "authentication.updateProviderLoginOptions",
1250
- config: {
1251
- middlewares: [enableFeatureMiddleware("sso")],
1252
- policies: [
1253
- "admin::isAuthenticatedAdmin",
1254
- { name: "admin::hasPermissions", config: { actions: ["admin::provider-login.update"] } }
1255
- ]
1256
- }
1257
- },
1258
- {
1259
- method: "GET",
1260
- path: "/providers/isSSOLocked",
1261
- handler: "user.isSSOLocked",
1262
- config: {
1263
- middlewares: [enableFeatureMiddleware("sso")],
1264
- policies: ["admin::isAuthenticatedAdmin"]
1265
- }
1266
- }
1267
- ]
1268
- };
1269
- const licenseLimit = {
1270
- type: "admin",
1271
- routes: [
1272
- // License limit infos
1273
- {
1274
- method: "GET",
1275
- path: "/license-limit-information",
1276
- handler: "admin.licenseLimitInformation",
1277
- config: {
1278
- policies: [
1279
- "admin::isAuthenticatedAdmin",
1280
- {
1281
- name: "admin::hasPermissions",
1282
- config: {
1283
- actions: [
1284
- "admin::users.create",
1285
- "admin::users.read",
1286
- "admin::users.update",
1287
- "admin::users.delete"
1288
- ]
1289
- }
1290
- }
1291
- ]
1292
- }
1293
- }
1294
- ]
1295
- };
1296
- const auditLogs$1 = {
1297
- type: "admin",
1298
- routes: [
1299
- {
1300
- method: "GET",
1301
- path: "/audit-logs",
1302
- handler: "auditLogs.findMany",
1303
- config: {
1304
- middlewares: [enableFeatureMiddleware("audit-logs")],
1305
- policies: [
1306
- "admin::isAuthenticatedAdmin",
1307
- {
1308
- name: "admin::hasPermissions",
1309
- config: {
1310
- actions: ["admin::audit-logs.read"]
1311
- }
1312
- }
1313
- ]
1314
- }
1315
- },
1316
- {
1317
- method: "GET",
1318
- path: "/audit-logs/:id",
1319
- handler: "auditLogs.findOne",
1320
- config: {
1321
- middlewares: [enableFeatureMiddleware("audit-logs")],
1322
- policies: [
1323
- "admin::isAuthenticatedAdmin",
1324
- {
1325
- name: "admin::hasPermissions",
1326
- config: {
1327
- actions: ["admin::audit-logs.read"]
1328
- }
1329
- }
1330
- ]
1331
- }
1332
- }
1333
- ]
1334
- };
1335
- const reviewWorkflows$1 = {
1336
- type: "admin",
1337
- routes: [
1338
- // Review workflow
1339
- {
1340
- method: "POST",
1341
- path: "/review-workflows/workflows",
1342
- handler: "workflows.create",
1343
- config: {
1344
- middlewares: [enableFeatureMiddleware("review-workflows")],
1345
- policies: [
1346
- "admin::isAuthenticatedAdmin",
1347
- {
1348
- name: "admin::hasPermissions",
1349
- config: {
1350
- actions: ["admin::review-workflows.create"]
1351
- }
1352
- }
1353
- ]
1354
- }
1355
- },
1356
- {
1357
- method: "PUT",
1358
- path: "/review-workflows/workflows/:id",
1359
- handler: "workflows.update",
1360
- config: {
1361
- middlewares: [enableFeatureMiddleware("review-workflows")],
1362
- policies: [
1363
- "admin::isAuthenticatedAdmin",
1364
- {
1365
- name: "admin::hasPermissions",
1366
- config: {
1367
- actions: ["admin::review-workflows.update"]
1368
- }
1369
- }
1370
- ]
1371
- }
1372
- },
1373
- {
1374
- method: "DELETE",
1375
- path: "/review-workflows/workflows/:id",
1376
- handler: "workflows.delete",
1377
- config: {
1378
- middlewares: [enableFeatureMiddleware("review-workflows")],
1379
- policies: [
1380
- "admin::isAuthenticatedAdmin",
1381
- {
1382
- name: "admin::hasPermissions",
1383
- config: {
1384
- actions: ["admin::review-workflows.delete"]
1385
- }
1386
- }
1387
- ]
1388
- }
1389
- },
1390
- {
1391
- method: "GET",
1392
- path: "/review-workflows/workflows",
1393
- handler: "workflows.find",
1394
- config: {
1395
- middlewares: [enableFeatureMiddleware("review-workflows")],
1396
- policies: [
1397
- "admin::isAuthenticatedAdmin",
1398
- {
1399
- name: "admin::hasPermissions",
1400
- config: {
1401
- actions: ["admin::review-workflows.read"]
1402
- }
1403
- }
1404
- ]
1405
- }
1406
- },
1407
- {
1408
- method: "GET",
1409
- path: "/review-workflows/workflows/:id",
1410
- handler: "workflows.findById",
1411
- config: {
1412
- middlewares: [enableFeatureMiddleware("review-workflows")],
1413
- policies: [
1414
- "admin::isAuthenticatedAdmin",
1415
- {
1416
- name: "admin::hasPermissions",
1417
- config: {
1418
- actions: ["admin::review-workflows.read"]
1419
- }
1420
- }
1421
- ]
1422
- }
1423
- },
1424
- {
1425
- method: "GET",
1426
- path: "/review-workflows/workflows/:workflow_id/stages",
1427
- handler: "stages.find",
1428
- config: {
1429
- middlewares: [enableFeatureMiddleware("review-workflows")],
1430
- policies: [
1431
- "admin::isAuthenticatedAdmin",
1432
- {
1433
- name: "admin::hasPermissions",
1434
- config: {
1435
- actions: ["admin::review-workflows.read"]
1436
- }
1437
- }
1438
- ]
1439
- }
1440
- },
1441
- {
1442
- method: "GET",
1443
- path: "/review-workflows/workflows/:workflow_id/stages/:id",
1444
- handler: "stages.findById",
1445
- config: {
1446
- middlewares: [enableFeatureMiddleware("review-workflows")],
1447
- policies: [
1448
- "admin::isAuthenticatedAdmin",
1449
- {
1450
- name: "admin::hasPermissions",
1451
- config: {
1452
- actions: ["admin::review-workflows.read"]
1453
- }
1454
- }
1455
- ]
1456
- }
1457
- },
1458
- {
1459
- method: "PUT",
1460
- path: "/content-manager/(collection|single)-types/:model_uid/:id/stage",
1461
- handler: "stages.updateEntity",
1462
- config: {
1463
- middlewares: [enableFeatureMiddleware("review-workflows")],
1464
- policies: ["admin::isAuthenticatedAdmin"]
1465
- }
1466
- },
1467
- {
1468
- method: "GET",
1469
- path: "/content-manager/(collection|single)-types/:model_uid/:id/stages",
1470
- handler: "stages.listAvailableStages",
1471
- config: {
1472
- middlewares: [enableFeatureMiddleware("review-workflows")],
1473
- policies: ["admin::isAuthenticatedAdmin"]
1474
- }
1475
- },
1476
- {
1477
- method: "PUT",
1478
- path: "/content-manager/(collection|single)-types/:model_uid/:id/assignee",
1479
- handler: "assignees.updateEntity",
1480
- config: {
1481
- middlewares: [enableFeatureMiddleware("review-workflows")],
1482
- policies: [
1483
- "admin::isAuthenticatedAdmin",
1484
- {
1485
- name: "admin::hasPermissions",
1486
- config: {
1487
- actions: ["admin::users.read", "admin::review-workflows.read"]
1488
- }
1489
- }
1490
- ]
1491
- }
1492
- }
1493
- ]
1494
- };
1495
- const index$2 = {
1496
- sso: sso$1,
1497
- "license-limit": licenseLimit,
1498
- "audit-logs": auditLogs$1,
1499
- "review-workflows": reviewWorkflows$1
1500
- };
1501
- const isSsoLocked = async (user2) => {
1502
- if (!strapi.ee.features.isEnabled("sso")) {
1503
- return false;
1504
- }
1505
- if (!user2) {
1506
- throw new Error("Missing user object");
1507
- }
1508
- const adminStore = await strapi.store({ type: "core", name: "admin" });
1509
- const { providers } = await adminStore.get({ key: "auth" });
1510
- const lockedRoles = providers.ssoLockedRoles ?? [];
1511
- if (isEmpty(lockedRoles)) {
1512
- return false;
1513
- }
1514
- const roles2 = (
1515
- // If the roles are pre-loaded for the given user, then use them
1516
- user2.roles ?? // Otherwise, try to load the role based on the given user ID
1517
- await strapi.db.query("admin::user").load(user2, "roles", { roles: { fields: ["id"] } }) ?? // If the query fails somehow, default to an empty array
1518
- []
1519
- );
1520
- const isLocked = lockedRoles.some(
1521
- (lockedId) => (
1522
- // lockedRoles will be a string to avoid issues with frontend and bigints
1523
- roles2.some((role2) => lockedId === role2.id.toString())
1524
- )
1525
- );
1526
- return isLocked;
1527
- };
1528
- const { ApplicationError: ApplicationError$6 } = errors;
1529
- const forgotPassword = async ({ email: email2 } = {}) => {
1530
- const user2 = await strapi.db.query("admin::user").findOne({ where: { email: email2, isActive: true } });
1531
- if (!user2 || await isSsoLocked(user2)) {
1532
- return;
1533
- }
1534
- const resetPasswordToken = getService("token").createToken();
1535
- await getService("user").updateById(user2.id, { resetPasswordToken });
1536
- const url = `${strapi.config.get(
1537
- "admin.absoluteUrl"
1538
- )}/auth/reset-password?code=${resetPasswordToken}`;
1539
- return strapi.plugin("email").service("email").sendTemplatedEmail(
1540
- {
1541
- to: user2.email,
1542
- from: strapi.config.get("admin.forgotPassword.from"),
1543
- replyTo: strapi.config.get("admin.forgotPassword.replyTo")
1544
- },
1545
- strapi.config.get("admin.forgotPassword.emailTemplate"),
1546
- {
1547
- url,
1548
- user: _.pick(user2, ["email", "firstname", "lastname", "username"])
1549
- }
1550
- ).catch((err) => {
1551
- strapi.log.error(err);
1552
- });
1553
- };
1554
- const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
1555
- const matchingUser = await strapi.db.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
1556
- if (!matchingUser || await isSsoLocked(matchingUser)) {
1557
- throw new ApplicationError$6();
1558
- }
1559
- return getService("user").updateById(matchingUser.id, {
1560
- password: password2,
1561
- resetPasswordToken: null
1562
- });
1563
- };
1564
- const auth = {
1565
- forgotPassword,
1566
- resetPassword
1567
- };
1568
- const createLocalStrategy = (strapi2, middleware) => {
1569
- return new Strategy(
1570
- {
1571
- usernameField: "email",
1572
- passwordField: "password",
1573
- session: false
1574
- },
1575
- (email2, password2, done) => {
1576
- return getService$1("auth").checkCredentials({ email: toLower(email2), password: password2 }).then(async ([error, user2, message]) => {
1577
- if (middleware) {
1578
- return middleware([error, user2, message], done);
1579
- }
1580
- return done(error, user2, message);
1581
- }).catch((error) => done(error));
1582
- }
1583
- );
1584
- };
1585
- const authEventsMapper = {
1586
- onConnectionSuccess: "admin.auth.success",
1587
- onConnectionError: "admin.auth.error"
1588
- };
1589
- const valueIsFunctionType = ([, value]) => isFunction(value);
1590
- const keyIsValidEventName = ([key]) => {
1591
- return Object.keys(strapi.admin.services.passport.authEventsMapper).includes(key);
1592
- };
1593
- const getPassportStrategies$1 = () => [createLocalStrategy(strapi)];
1594
- const registerAuthEvents = () => {
1595
- const { events = {} } = strapi.config.get("admin.auth", {});
1596
- const { authEventsMapper: authEventsMapper2 } = strapi.admin.services.passport;
1597
- const eventList = Object.entries(events).filter(keyIsValidEventName).filter(valueIsFunctionType);
1598
- for (const [eventName, handler] of eventList) {
1599
- strapi.eventHub.on(authEventsMapper2[eventName], handler);
1600
- }
1601
- };
1602
- const init = () => {
1603
- strapi.admin.services.passport.getPassportStrategies().forEach((strategy) => passport$2.use(strategy));
1604
- registerAuthEvents();
1605
- return passport$2.initialize();
1606
- };
1607
- const passport$1 = { init, getPassportStrategies: getPassportStrategies$1, authEventsMapper };
1608
- const createProviderRegistry = () => {
1609
- const registry = /* @__PURE__ */ new Map();
1610
- Object.assign(registry, {
1611
- register(provider) {
1612
- if (strapi.isLoaded) {
1613
- throw new Error(`You can't register new provider after the bootstrap`);
1614
- }
1615
- this.set(provider.uid, provider);
1616
- },
1617
- registerMany(providers) {
1618
- providers.forEach((provider) => {
1619
- this.register(provider);
1620
- });
1621
- },
1622
- getAll() {
1623
- return Array.from(this.values());
1624
- }
1625
- });
1626
- return registry;
1627
- };
1628
- const providerRegistry = createProviderRegistry();
1629
- const errorMessage = "SSO is disabled. Its functionnalities cannot be accessed.";
1630
- const getStrategyCallbackURL = (providerName) => {
1631
- if (!strapi.ee.features.isEnabled("sso")) {
1632
- throw new Error(errorMessage);
1633
- }
1634
- return `/admin/connect/${providerName}`;
1635
- };
1636
- const syncProviderRegistryWithConfig = () => {
1637
- if (!strapi.ee.features.isEnabled("sso")) {
1638
- throw new Error(errorMessage);
1639
- }
1640
- const { providers = [] } = strapi.config.get("admin.auth", {});
1641
- providerRegistry.registerMany(providers);
1642
- };
1643
- const SSOAuthEventsMapper = {
1644
- onSSOAutoRegistration: "admin.auth.autoRegistration"
1645
- };
1646
- const sso = {
1647
- providerRegistry,
1648
- getStrategyCallbackURL,
1649
- syncProviderRegistryWithConfig,
1650
- authEventsMapper: { ...passport$1.authEventsMapper, ...SSOAuthEventsMapper }
1651
- };
1652
- const { UnauthorizedError } = errors;
1653
- const localStrategyMiddleware = async ([error, user2, message], done) => {
1654
- if (user2 && !error && await isSsoLocked(user2)) {
1655
- return done(
1656
- new UnauthorizedError("Login not allowed, please contact your administrator", {
1657
- code: "LOGIN_NOT_ALLOWED"
1658
- }),
1659
- user2,
1660
- message
1661
- );
1662
- }
1663
- return done(error, user2, message);
1664
- };
1665
- const getPassportStrategies = () => {
1666
- if (!strapi.ee.features.isEnabled("sso")) {
1667
- return [createLocalStrategy(strapi)];
1668
- }
1669
- const localStrategy = createLocalStrategy(strapi, localStrategyMiddleware);
1670
- if (!strapi.isLoaded) {
1671
- sso.syncProviderRegistryWithConfig();
1672
- }
1673
- const providers = sso.providerRegistry.getAll();
1674
- const strategies = providers.map((provider) => provider.createStrategy(strapi));
1675
- return [localStrategy, ...strategies];
800
+ const getPassportStrategies = () => {
801
+ if (!strapi.ee.features.isEnabled("sso")) {
802
+ return [createLocalStrategy(strapi)];
803
+ }
804
+ const localStrategy = createLocalStrategy(strapi, localStrategyMiddleware);
805
+ if (!strapi.isLoaded) {
806
+ sso$1.syncProviderRegistryWithConfig();
807
+ }
808
+ const providers = sso$1.providerRegistry.getAll();
809
+ const strategies = providers.map((provider) => provider.createStrategy(strapi));
810
+ return [localStrategy, ...strategies];
1676
811
  };
1677
812
  const passport = {
1678
813
  getPassportStrategies,
1679
- ...sso
814
+ ...sso$1
1680
815
  };
1681
- const { ApplicationError: ApplicationError$5 } = errors;
816
+ const { ApplicationError: ApplicationError$1 } = errors;
1682
817
  const ssoCheckRolesIdForDeletion = async (ids) => {
1683
818
  const adminStore = await strapi.store({ type: "core", name: "admin" });
1684
819
  const {
@@ -1686,7 +821,7 @@ const ssoCheckRolesIdForDeletion = async (ids) => {
1686
821
  } = await adminStore.get({ key: "auth" });
1687
822
  for (const roleId of ids) {
1688
823
  if (defaultRole && toString(defaultRole) === toString(roleId)) {
1689
- throw new ApplicationError$5(
824
+ throw new ApplicationError$1(
1690
825
  "This role is used as the default SSO role. Make sure to change this configuration before deleting the role"
1691
826
  );
1692
827
  }
@@ -1699,7 +834,7 @@ const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$2 } = constants;
1699
834
  const hasSuperAdminRole = (user2) => {
1700
835
  return user2.roles.filter((role2) => role2.code === SUPER_ADMIN_CODE$2).length > 0;
1701
836
  };
1702
- const { ValidationError: ValidationError$3 } = errors;
837
+ const { ValidationError: ValidationError$1 } = errors;
1703
838
  const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$1 } = constants;
1704
839
  const updateEEDisabledUsersList = async (id, input) => {
1705
840
  const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
@@ -1744,13 +879,13 @@ const updateById = async (id, attributes) => {
1744
879
  const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
1745
880
  const willRemoveSuperAdminRole = !arrays.includesString(attributes.roles, superAdminRole.id);
1746
881
  if (lastAdminUser && willRemoveSuperAdminRole) {
1747
- throw new ValidationError$3("You must have at least one user with super admin role.");
882
+ throw new ValidationError$1("You must have at least one user with super admin role.");
1748
883
  }
1749
884
  }
1750
885
  if (attributes.isActive === false) {
1751
886
  const lastAdminUser = await isLastSuperAdminUser(id);
1752
887
  if (lastAdminUser) {
1753
- throw new ValidationError$3("You must have at least one user with super admin role.");
888
+ throw new ValidationError$1("You must have at least one user with super admin role.");
1754
889
  }
1755
890
  }
1756
891
  if (_.has(attributes, "password")) {
@@ -1789,7 +924,7 @@ const deleteById = async (id) => {
1789
924
  if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE$1)) {
1790
925
  const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
1791
926
  if (superAdminRole.usersCount === 1) {
1792
- throw new ValidationError$3("You must have at least one user with super admin role.");
927
+ throw new ValidationError$1("You must have at least one user with super admin role.");
1793
928
  }
1794
929
  }
1795
930
  }
@@ -1807,7 +942,7 @@ const deleteByIds = async (ids) => {
1807
942
  }
1808
943
  });
1809
944
  if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {
1810
- throw new ValidationError$3("You must have at least one user with super admin role.");
945
+ throw new ValidationError$1("You must have at least one user with super admin role.");
1811
946
  }
1812
947
  const deletedUsers = [];
1813
948
  for (const id of ids) {
@@ -1850,7 +985,7 @@ const user$1 = {
1850
985
  updateById
1851
986
  };
1852
987
  const getSSOProvidersList = async () => {
1853
- const { providerRegistry: providerRegistry2 } = strapi.admin.services.passport;
988
+ const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
1854
989
  return providerRegistry2.getAll().map(({ uid }) => uid);
1855
990
  };
1856
991
  const sendUpdateProjectInformation = async (strapi2) => {
@@ -1867,7 +1002,7 @@ const sendUpdateProjectInformation = async (strapi2) => {
1867
1002
  if (strapi2.ee.features.isEnabled("cms-content-releases")) {
1868
1003
  const numberOfContentReleases = await strapi2.db.query("plugin::content-releases.release").count();
1869
1004
  const numberOfPublishedContentReleases = await strapi2.db.query("plugin::content-releases.release").count({
1870
- where: { $not: { releasedAt: null } }
1005
+ filters: { releasedAt: { $notNull: true } }
1871
1006
  });
1872
1007
  groupProperties = assign(groupProperties, {
1873
1008
  numberOfContentReleases,
@@ -1952,977 +1087,28 @@ const syncDisabledUserRecords = async () => {
1952
1087
  const seatEnforcementWorkflow = async () => {
1953
1088
  const adminSeats = strapi.ee.seats;
1954
1089
  if (isNil(adminSeats)) {
1955
- return;
1956
- }
1957
- await syncDisabledUserRecords();
1958
- const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
1959
- const adminSeatsLeft = adminSeats - currentActiveUserCount;
1960
- if (adminSeatsLeft > 0) {
1961
- await enableMaximumUserCount(adminSeatsLeft);
1962
- } else if (adminSeatsLeft < 0) {
1963
- await disableUsersAboveLicenseLimit(-adminSeatsLeft);
1964
- }
1965
- };
1966
- const seatEnforcement = {
1967
- seatEnforcementWorkflow,
1968
- getDisabledUserList
1969
- };
1970
- const workflowsContentTypesFactory = ({ strapi: strapi2 }) => {
1971
- const contentManagerContentTypeService = strapi2.plugin("content-manager").service("content-types");
1972
- const stagesService = getService("stages", { strapi: strapi2 });
1973
- const updateContentTypeConfig = async (uid, reviewWorkflowOption) => {
1974
- const modelConfig = await contentManagerContentTypeService.findConfiguration(uid);
1975
- await contentManagerContentTypeService.updateConfiguration(
1976
- { uid },
1977
- { options: merge(modelConfig.options, { reviewWorkflows: reviewWorkflowOption }) }
1978
- );
1979
- };
1980
- return {
1981
- /**
1982
- * Migrates entities stages. Used when a content type is assigned to a workflow.
1983
- * @param {*} options
1984
- * @param {Array<string>} options.srcContentTypes - The content types assigned to the previous workflow
1985
- * @param {Array<string>} options.destContentTypes - The content types assigned to the new workflow
1986
- * @param {Workflow.Stage} options.stageId - The new stage to assign the entities to
1987
- */
1988
- async migrate({ srcContentTypes = [], destContentTypes, stageId }) {
1989
- const workflowsService = getService("workflows", { strapi: strapi2 });
1990
- const { created, deleted } = diffContentTypes(srcContentTypes, destContentTypes);
1991
- await async.map(
1992
- created,
1993
- async (uid) => {
1994
- const srcWorkflows = await workflowsService._getAssignedWorkflows(uid, {});
1995
- if (srcWorkflows.length) {
1996
- await stagesService.updateEntitiesStage(uid, { toStageId: stageId });
1997
- await async.map(
1998
- srcWorkflows,
1999
- (srcWorkflow) => this.transferContentTypes(srcWorkflow, uid)
2000
- );
2001
- }
2002
- await updateContentTypeConfig(uid, true);
2003
- return stagesService.updateEntitiesStage(uid, {
2004
- fromStageId: null,
2005
- toStageId: stageId
2006
- });
2007
- },
2008
- // transferContentTypes can cause race conditions if called in parallel when updating the same workflow
2009
- { concurrency: 1 }
2010
- );
2011
- await async.map(deleted, async (uid) => {
2012
- await updateContentTypeConfig(uid, false);
2013
- await stagesService.deleteAllEntitiesStage(uid, {});
2014
- });
2015
- },
2016
- /**
2017
- * Filters the content types assigned to a workflow
2018
- * @param {Workflow} srcWorkflow - The workflow to transfer from
2019
- * @param {string} uid - The content type uid
2020
- */
2021
- async transferContentTypes(srcWorkflow, uid) {
2022
- await strapi2.db.query(WORKFLOW_MODEL_UID).update({
2023
- where: {
2024
- id: srcWorkflow.id
2025
- },
2026
- data: {
2027
- contentTypes: srcWorkflow.contentTypes.filter((contentType) => contentType !== uid)
2028
- }
2029
- });
2030
- }
2031
- };
2032
- };
2033
- const diffContentTypes = (srcContentTypes, destContentTypes) => {
2034
- const created = difference(destContentTypes, srcContentTypes);
2035
- const deleted = difference(srcContentTypes, destContentTypes);
2036
- return { created, deleted };
2037
- };
2038
- const { ApplicationError: ApplicationError$4 } = errors;
2039
- const processFilters = ({ strapi: strapi2 }, filters = {}) => {
2040
- const processedFilters = { ...filters };
2041
- if (isString(filters.contentTypes)) {
2042
- processedFilters.contentTypes = getWorkflowContentTypeFilter({ strapi: strapi2 }, filters.contentTypes);
2043
- }
2044
- return processedFilters;
2045
- };
2046
- const processPopulate = (populate) => {
2047
- if (!populate) {
2048
- return populate;
2049
- }
2050
- return WORKFLOW_POPULATE;
2051
- };
2052
- const workflows$1 = ({ strapi: strapi2 }) => {
2053
- const workflowsContentTypes = workflowsContentTypesFactory({ strapi: strapi2 });
2054
- const workflowsValidationService = getService("review-workflows-validation", { strapi: strapi2 });
2055
- const metrics2 = getService("review-workflows-metrics", { strapi: strapi2 });
2056
- return {
2057
- /**
2058
- * Returns all the workflows matching the user-defined filters.
2059
- * @param {object} opts - Options for the query.
2060
- * @param {object} opts.filters - Filters object.
2061
- * @returns {Promise<object[]>} - List of workflows that match the user's filters.
2062
- */
2063
- async find(opts = {}) {
2064
- const filters = processFilters({ strapi: strapi2 }, opts.filters);
2065
- const populate = processPopulate(opts.populate);
2066
- const query = strapi2.get("query-params").transform(WORKFLOW_MODEL_UID, {
2067
- ...opts,
2068
- filters,
2069
- populate
2070
- });
2071
- return strapi2.db.query(WORKFLOW_MODEL_UID).findMany(query);
2072
- },
2073
- /**
2074
- * Returns the workflow with the specified ID.
2075
- * @param {string} id - ID of the requested workflow.
2076
- * @param {object} opts - Options for the query.
2077
- * @returns {Promise<object>} - Workflow object matching the requested ID.
2078
- */
2079
- findById(id, opts = {}) {
2080
- const populate = processPopulate(opts.populate);
2081
- const query = strapi2.get("query-params").transform(WORKFLOW_MODEL_UID, { populate });
2082
- return strapi2.db.query(WORKFLOW_MODEL_UID).findOne({
2083
- ...query,
2084
- where: { id }
2085
- });
2086
- },
2087
- /**
2088
- * Creates a new workflow.
2089
- * @param {object} opts - Options for creating the new workflow.
2090
- * @returns {Promise<object>} - Workflow object that was just created.
2091
- * @throws {ValidationError} - If the workflow has no stages.
2092
- */
2093
- async create(opts) {
2094
- let createOpts = { ...opts, populate: WORKFLOW_POPULATE };
2095
- workflowsValidationService.validateWorkflowStages(opts.data.stages);
2096
- await workflowsValidationService.validateWorkflowCount(1);
2097
- return strapi2.db.transaction(async () => {
2098
- const stages2 = await getService("stages", { strapi: strapi2 }).createMany(opts.data.stages);
2099
- const mapIds = map(get("id"));
2100
- createOpts = set("data.stages", mapIds(stages2), createOpts);
2101
- if (opts.data.contentTypes) {
2102
- await workflowsContentTypes.migrate({
2103
- destContentTypes: opts.data.contentTypes,
2104
- stageId: stages2[0].id
2105
- });
2106
- }
2107
- metrics2.sendDidCreateWorkflow();
2108
- return strapi2.db.query(WORKFLOW_MODEL_UID).create(strapi2.get("query-params").transform(WORKFLOW_MODEL_UID, createOpts));
2109
- });
2110
- },
2111
- /**
2112
- * Updates an existing workflow.
2113
- * @param {object} workflow - The existing workflow to update.
2114
- * @param {object} opts - Options for updating the workflow.
2115
- * @returns {Promise<object>} - Workflow object that was just updated.
2116
- * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.
2117
- */
2118
- async update(workflow2, opts) {
2119
- const stageService = getService("stages", { strapi: strapi2 });
2120
- let updateOpts = { ...opts, populate: { ...WORKFLOW_POPULATE } };
2121
- let updatedStageIds;
2122
- await workflowsValidationService.validateWorkflowCount();
2123
- return strapi2.db.transaction(async () => {
2124
- if (opts.data.stages) {
2125
- workflowsValidationService.validateWorkflowStages(opts.data.stages);
2126
- opts.data.stages.forEach(
2127
- (stage) => this.assertStageBelongsToWorkflow(stage.id, workflow2)
2128
- );
2129
- updatedStageIds = await stageService.replaceStages(workflow2.stages, opts.data.stages, workflow2.contentTypes).then((stages2) => stages2.map((stage) => stage.id));
2130
- updateOpts = set("data.stages", updatedStageIds, updateOpts);
2131
- }
2132
- if (opts.data.contentTypes) {
2133
- await workflowsContentTypes.migrate({
2134
- srcContentTypes: workflow2.contentTypes,
2135
- destContentTypes: opts.data.contentTypes,
2136
- stageId: updatedStageIds ? updatedStageIds[0] : workflow2.stages[0].id
2137
- });
2138
- }
2139
- metrics2.sendDidEditWorkflow();
2140
- const query = strapi2.get("query-params").transform(WORKFLOW_MODEL_UID, updateOpts);
2141
- return strapi2.db.query(WORKFLOW_MODEL_UID).update({
2142
- ...query,
2143
- where: { id: workflow2.id }
2144
- });
2145
- });
2146
- },
2147
- /**
2148
- * Deletes an existing workflow.
2149
- * Also deletes all the workflow stages and migrate all assigned the content types.
2150
- * @param {*} workflow
2151
- * @param {*} opts
2152
- * @returns
2153
- */
2154
- async delete(workflow2, opts) {
2155
- const stageService = getService("stages", { strapi: strapi2 });
2156
- const workflowCount = await this.count();
2157
- if (workflowCount <= 1) {
2158
- throw new ApplicationError$4("Can not delete the last workflow");
2159
- }
2160
- return strapi2.db.transaction(async () => {
2161
- await stageService.deleteMany(workflow2.stages);
2162
- await workflowsContentTypes.migrate({
2163
- srcContentTypes: workflow2.contentTypes,
2164
- destContentTypes: []
2165
- });
2166
- const query = strapi2.get("query-params").transform(WORKFLOW_MODEL_UID, opts);
2167
- return strapi2.db.query(WORKFLOW_MODEL_UID).delete({
2168
- ...query,
2169
- where: { id: workflow2.id }
2170
- });
2171
- });
2172
- },
2173
- /**
2174
- * Returns the total count of workflows.
2175
- * @returns {Promise<number>} - Total count of workflows.
2176
- */
2177
- count() {
2178
- return strapi2.db.query(WORKFLOW_MODEL_UID).count();
2179
- },
2180
- /**
2181
- * Finds the assigned workflow for a given content type ID.
2182
- * @param {string} uid - Content type ID to find the assigned workflow for.
2183
- * @param {object} opts - Options for the query.
2184
- * @returns {Promise<object|null>} - Assigned workflow object if found, or null.
2185
- */
2186
- async getAssignedWorkflow(uid, opts = {}) {
2187
- const workflows2 = await this._getAssignedWorkflows(uid, opts);
2188
- return workflows2.length > 0 ? workflows2[0] : null;
2189
- },
2190
- /**
2191
- * Finds all the assigned workflows for a given content type ID.
2192
- * Normally, there should only be one workflow assigned to a content type.
2193
- * However, edge cases can occur where a content type is assigned to multiple workflows.
2194
- * @param {string} uid - Content type ID to find the assigned workflows for.
2195
- * @param {object} opts - Options for the query.
2196
- * @returns {Promise<object[]>} - List of assigned workflow objects.
2197
- */
2198
- async _getAssignedWorkflows(uid, opts = {}) {
2199
- return this.find({
2200
- ...opts,
2201
- filters: { contentTypes: getWorkflowContentTypeFilter({ strapi: strapi2 }, uid) }
2202
- });
2203
- },
2204
- /**
2205
- * Asserts that a content type has an assigned workflow.
2206
- * @param {string} uid - Content type ID to verify the assignment of.
2207
- * @returns {Promise<object>} - Workflow object associated with the content type ID.
2208
- * @throws {ApplicationError} - If no assigned workflow is found for the content type ID.
2209
- */
2210
- async assertContentTypeBelongsToWorkflow(uid) {
2211
- const workflow2 = await this.getAssignedWorkflow(uid, {
2212
- populate: "stages"
2213
- });
2214
- if (!workflow2) {
2215
- throw new ApplicationError$4(`Review workflows is not activated on Content Type ${uid}.`);
2216
- }
2217
- return workflow2;
2218
- },
2219
- /**
2220
- * Asserts that a stage belongs to a given workflow.
2221
- * @param {string} stageId - ID of stage to check.
2222
- * @param {object} workflow - Workflow object to check against.
2223
- * @returns
2224
- * @throws {ApplicationError} - If the stage does not belong to the specified workflow.
2225
- */
2226
- assertStageBelongsToWorkflow(stageId, workflow2) {
2227
- if (!stageId) {
2228
- return;
2229
- }
2230
- const belongs = workflow2.stages.some((stage) => stage.id === stageId);
2231
- if (!belongs) {
2232
- throw new ApplicationError$4(`Stage does not belong to workflow "${workflow2.name}"`);
2233
- }
2234
- }
2235
- };
2236
- };
2237
- const { ApplicationError: ApplicationError$3, ValidationError: ValidationError$2 } = errors;
2238
- const sanitizedStageFields = ["id", "name", "workflow", "color"];
2239
- const sanitizeStageFields = pick(sanitizedStageFields);
2240
- const stages$1 = ({ strapi: strapi2 }) => {
2241
- const metrics2 = getService("review-workflows-metrics", { strapi: strapi2 });
2242
- const stagePermissionsService = getService("stage-permissions", { strapi: strapi2 });
2243
- const workflowsValidationService = getService("review-workflows-validation", { strapi: strapi2 });
2244
- return {
2245
- find({ workflowId, populate }) {
2246
- return strapi2.db.query(STAGE_MODEL_UID).findMany({
2247
- where: { workflow: workflowId },
2248
- populate
2249
- });
2250
- },
2251
- findById(id, { populate } = {}) {
2252
- return strapi2.db.query(STAGE_MODEL_UID).findOne({
2253
- where: { id },
2254
- populate
2255
- });
2256
- },
2257
- async createMany(stagesList, { fields } = {}) {
2258
- const params = { select: fields ?? "*" };
2259
- const stages2 = await Promise.all(
2260
- stagesList.map(
2261
- (stage) => strapi2.db.query(STAGE_MODEL_UID).create({
2262
- data: sanitizeStageFields(stage),
2263
- ...params
2264
- })
2265
- )
2266
- );
2267
- await async.reduce(stagesList)(async (_2, stage, idx) => {
2268
- if (!stage.permissions || stage.permissions.length === 0) {
2269
- return;
2270
- }
2271
- const stagePermissions2 = stage.permissions;
2272
- const stageId = stages2[idx].id;
2273
- const permissions = await async.map(
2274
- stagePermissions2,
2275
- // Register each stage permission
2276
- (permission2) => stagePermissionsService.register({
2277
- roleId: permission2.role,
2278
- action: permission2.action,
2279
- fromStage: stageId
2280
- })
2281
- );
2282
- await strapi2.db.query(STAGE_MODEL_UID).update({
2283
- where: { id: stageId },
2284
- data: {
2285
- permissions: permissions.flat().map((p) => p.id)
2286
- }
2287
- });
2288
- }, []);
2289
- metrics2.sendDidCreateStage();
2290
- return stages2;
2291
- },
2292
- async update(srcStage, destStage) {
2293
- let stagePermissions2 = srcStage?.permissions ?? [];
2294
- const stageId = destStage.id;
2295
- if (destStage.permissions) {
2296
- await this.deleteStagePermissions([srcStage]);
2297
- const permissions = await async.map(
2298
- destStage.permissions,
2299
- (permission2) => stagePermissionsService.register({
2300
- roleId: permission2.role,
2301
- action: permission2.action,
2302
- fromStage: stageId
2303
- })
2304
- );
2305
- stagePermissions2 = permissions.flat().map((p) => p.id);
2306
- }
2307
- const stage = await strapi2.db.query(STAGE_MODEL_UID).update({
2308
- where: { id: stageId },
2309
- data: {
2310
- ...destStage,
2311
- permissions: stagePermissions2
2312
- }
2313
- });
2314
- metrics2.sendDidEditStage();
2315
- return stage;
2316
- },
2317
- async delete(stage) {
2318
- await this.deleteStagePermissions([stage]);
2319
- const deletedStage = await strapi2.db.query(STAGE_MODEL_UID).delete({
2320
- where: { id: stage.id }
2321
- });
2322
- metrics2.sendDidDeleteStage();
2323
- return deletedStage;
2324
- },
2325
- async deleteMany(stages2) {
2326
- await this.deleteStagePermissions(stages2);
2327
- return strapi2.db.query(STAGE_MODEL_UID).deleteMany({
2328
- where: { id: { $in: stages2.map((s) => s.id) } }
2329
- });
2330
- },
2331
- async deleteStagePermissions(stages2) {
2332
- const permissions = stages2.map((s) => s.permissions || []).flat();
2333
- await stagePermissionsService.unregister(permissions || []);
2334
- },
2335
- count({ workflowId } = {}) {
2336
- const opts = {};
2337
- if (workflowId) {
2338
- opts.where = {
2339
- workflow: workflowId
2340
- };
2341
- }
2342
- return strapi2.db.query(STAGE_MODEL_UID).count(opts);
2343
- },
2344
- async replaceStages(srcStages, destStages, contentTypesToMigrate = []) {
2345
- const { created, updated, deleted } = getDiffBetweenStages(srcStages, destStages);
2346
- assertAtLeastOneStageRemain(srcStages || [], { created, deleted });
2347
- return strapi2.db.transaction(async ({ trx }) => {
2348
- const createdStages = await this.createMany(created, { fields: ["id"] });
2349
- const createdStagesIds = map("id", createdStages);
2350
- await async.map(updated, (destStage) => {
2351
- const srcStage = srcStages.find((s) => s.id === destStage.id);
2352
- return this.update(srcStage, destStage);
2353
- });
2354
- await async.map(deleted, async (stage) => {
2355
- const nearestStage = findNearestMatchingStage(
2356
- [...srcStages, ...createdStages],
2357
- srcStages.findIndex((s) => s.id === stage.id),
2358
- (targetStage) => {
2359
- return !deleted.find((s) => s.id === targetStage.id);
2360
- }
2361
- );
2362
- await async.map(contentTypesToMigrate, (contentTypeUID) => {
2363
- this.updateEntitiesStage(contentTypeUID, {
2364
- fromStageId: stage.id,
2365
- toStageId: nearestStage.id,
2366
- trx
2367
- });
2368
- });
2369
- return this.delete(stage);
2370
- });
2371
- return destStages.map((stage) => ({
2372
- ...stage,
2373
- id: stage.id ?? createdStagesIds.shift()
2374
- }));
2375
- });
2376
- },
2377
- /**
2378
- * Update the stage of an entity
2379
- *
2380
- * @param {object} entityInfo
2381
- * @param {number} entityInfo.id - Entity id
2382
- * @param {string} entityInfo.modelUID - the content-type of the entity
2383
- * @param {number} stageId - The id of the stage to assign to the entity
2384
- */
2385
- async updateEntity(entityInfo, stageId) {
2386
- const stage = await this.findById(stageId);
2387
- await workflowsValidationService.validateWorkflowCount();
2388
- if (!stage) {
2389
- throw new ApplicationError$3(`Selected stage does not exist`);
2390
- }
2391
- const entity = await strapi2.db.query(entityInfo.modelUID).update({
2392
- where: {
2393
- id: entityInfo.id
2394
- },
2395
- data: { [ENTITY_STAGE_ATTRIBUTE]: stageId },
2396
- populate: [ENTITY_STAGE_ATTRIBUTE]
2397
- });
2398
- metrics2.sendDidChangeEntryStage();
2399
- return entity;
2400
- },
2401
- /**
2402
- * Updates entity stages of a content type:
2403
- * - If fromStageId is undefined, all entities with an existing stage will be assigned the new stage
2404
- * - If fromStageId is null, all entities without a stage will be assigned the new stage
2405
- * - If fromStageId is a number, all entities with that stage will be assigned the new stage
2406
- *
2407
- * For performance reasons we use knex queries directly.
2408
- *
2409
- * @param {string} contentTypeUID
2410
- * @param {number | undefined | null} fromStageId
2411
- * @param {number} toStageId
2412
- * @param {import('knex').Knex.Transaction} trx
2413
- * @returns
2414
- */
2415
- async updateEntitiesStage(contentTypeUID, { fromStageId, toStageId }) {
2416
- const { attributes, tableName } = strapi2.db.metadata.get(contentTypeUID);
2417
- const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;
2418
- const joinColumn = joinTable.joinColumn.name;
2419
- const invJoinColumn = joinTable.inverseJoinColumn.name;
2420
- await workflowsValidationService.validateWorkflowCount();
2421
- return strapi2.db.transaction(async ({ trx }) => {
2422
- if (fromStageId === void 0) {
2423
- return strapi2.db.getConnection().from(joinTable.name).update({ [invJoinColumn]: toStageId }).transacting(trx);
2424
- }
2425
- 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();
2426
- return strapi2.db.getConnection(joinTable.name).insert(
2427
- strapi2.db.connection.raw(
2428
- `(${joinColumn}, ${invJoinColumn}) ${selectStatement.sql}`,
2429
- selectStatement.bindings
2430
- )
2431
- ).transacting(trx);
2432
- });
2433
- },
2434
- /**
2435
- * Deletes all entity stages of a content type
2436
- * @param {string} contentTypeUID
2437
- * @returns
2438
- */
2439
- async deleteAllEntitiesStage(contentTypeUID) {
2440
- const { attributes } = strapi2.db.metadata.get(contentTypeUID);
2441
- const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;
2442
- return strapi2.db.transaction(
2443
- async ({ trx }) => strapi2.db.getConnection().from(joinTable.name).delete().transacting(trx)
2444
- );
2445
- }
2446
- };
2447
- };
2448
- function getDiffBetweenStages(sourceStages, comparisonStages) {
2449
- const result = comparisonStages.reduce(
2450
- // ...
2451
- (acc, stageToCompare) => {
2452
- const srcStage = sourceStages.find((stage) => stage.id === stageToCompare.id);
2453
- if (!srcStage) {
2454
- acc.created.push(stageToCompare);
2455
- } else if (!isEqual(
2456
- pick(["name", "color", "permissions"], srcStage),
2457
- pick(["name", "color", "permissions"], stageToCompare)
2458
- )) {
2459
- acc.updated.push(stageToCompare);
2460
- }
2461
- return acc;
2462
- },
2463
- { created: [], updated: [] }
2464
- );
2465
- result.deleted = sourceStages.filter(
2466
- (srcStage) => !comparisonStages.some((cmpStage) => cmpStage.id === srcStage.id)
2467
- );
2468
- return result;
2469
- }
2470
- function assertAtLeastOneStageRemain(workflowStages, diffStages) {
2471
- const remainingStagesCount = workflowStages.length - diffStages.deleted.length + diffStages.created.length;
2472
- if (remainingStagesCount < 1) {
2473
- throw new ValidationError$2(ERRORS.WORKFLOW_WITHOUT_STAGES);
2474
- }
2475
- }
2476
- function findNearestMatchingStage(stages2, startIndex, condition) {
2477
- for (let i = startIndex; i >= 0; i -= 1) {
2478
- if (condition(stages2[i])) {
2479
- return stages2[i];
2480
- }
2481
- }
2482
- const remainingArray = stages2.slice(startIndex + 1);
2483
- const nearestObject = remainingArray.filter(condition)[0];
2484
- return nearestObject;
2485
- }
2486
- const { ApplicationError: ApplicationError$2 } = errors;
2487
- const validActions = [STAGE_TRANSITION_UID];
2488
- const stagePermissions = ({ strapi: strapi2 }) => {
2489
- const roleService = getService("role");
2490
- const permissionService = getService("permission");
2491
- return {
2492
- async register({ roleId, action, fromStage }) {
2493
- if (!validActions.includes(action)) {
2494
- throw new ApplicationError$2(`Invalid action ${action}`);
2495
- }
2496
- const permissions = await roleService.addPermissions(roleId, [
2497
- {
2498
- action,
2499
- actionParameters: {
2500
- from: fromStage
2501
- }
2502
- }
2503
- ]);
2504
- return permissions;
2505
- },
2506
- async registerMany(permissions) {
2507
- return async.map(permissions, this.register);
2508
- },
2509
- async unregister(permissions) {
2510
- const permissionIds = permissions.map(prop("id"));
2511
- await permissionService.deleteByIds(permissionIds);
2512
- },
2513
- can(action, fromStage) {
2514
- const requestState = strapi2.requestContext.get()?.state;
2515
- if (!requestState) {
2516
- return false;
2517
- }
2518
- const userRoles = requestState.user?.roles;
2519
- if (userRoles?.some((role2) => role2.code === "strapi-super-admin")) {
2520
- return true;
2521
- }
2522
- return requestState.userAbility.can({
2523
- name: action,
2524
- params: { from: fromStage }
2525
- });
2526
- }
2527
- };
2528
- };
2529
- const { ApplicationError: ApplicationError$1 } = errors;
2530
- const assignees$1 = ({ strapi: strapi2 }) => {
2531
- const metrics2 = getService("review-workflows-metrics", { strapi: strapi2 });
2532
- return {
2533
- async findEntityAssigneeId(id, model) {
2534
- const entity = await strapi2.db.query(model).findOne({
2535
- where: { id },
2536
- populate: [ENTITY_ASSIGNEE_ATTRIBUTE],
2537
- select: []
2538
- });
2539
- return entity?.[ENTITY_ASSIGNEE_ATTRIBUTE]?.id ?? null;
2540
- },
2541
- /**
2542
- * Update the assignee of an entity
2543
- */
2544
- async updateEntityAssignee(id, model, assigneeId) {
2545
- if (isNil(assigneeId)) {
2546
- return this.deleteEntityAssignee(id, model);
2547
- }
2548
- const userExists = await getService("user", { strapi: strapi2 }).exists({ id: assigneeId });
2549
- if (!userExists) {
2550
- throw new ApplicationError$1(`Selected user does not exist`);
2551
- }
2552
- metrics2.sendDidEditAssignee(await this.findEntityAssigneeId(id, model), assigneeId);
2553
- return strapi2.db.query(model).update({
2554
- where: { id },
2555
- data: { [ENTITY_ASSIGNEE_ATTRIBUTE]: assigneeId },
2556
- populate: [ENTITY_ASSIGNEE_ATTRIBUTE],
2557
- select: []
2558
- });
2559
- },
2560
- async deleteEntityAssignee(id, model) {
2561
- metrics2.sendDidEditAssignee(await this.findEntityAssigneeId(id, model), null);
2562
- return strapi2.db.query(model).update({
2563
- where: { id },
2564
- data: { [ENTITY_ASSIGNEE_ATTRIBUTE]: null },
2565
- populate: [ENTITY_ASSIGNEE_ATTRIBUTE],
2566
- select: []
2567
- });
2568
- }
2569
- };
2570
- };
2571
- const defaultStages = [
2572
- {
2573
- name: "To do",
2574
- color: "#4945FF"
2575
- },
2576
- {
2577
- name: "Ready to review",
2578
- color: "#9736E8"
2579
- },
2580
- {
2581
- name: "In progress",
2582
- color: "#EE5E52"
2583
- },
2584
- {
2585
- name: "Reviewed",
2586
- color: "#328048"
2587
- }
2588
- ];
2589
- const WORKFLOW_UPDATE_STAGE = "review-workflows.updateEntryStage";
2590
- const webhookEvents = {
2591
- WORKFLOW_UPDATE_STAGE
2592
- };
2593
- const MAX_DB_TABLE_NAME_LEN = 63;
2594
- const MAX_JOIN_TABLE_NAME_SUFFIX = 1 + ENTITY_STAGE_ATTRIBUTE.length + "_links_inv_fk".length;
2595
- const MAX_CONTENT_TYPE_NAME_LEN = MAX_DB_TABLE_NAME_LEN - MAX_JOIN_TABLE_NAME_SUFFIX;
2596
- const DEFAULT_OPTIONS = {
2597
- numberOfWorkflows: MAX_WORKFLOWS,
2598
- stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW
2599
- };
2600
- async function initDefaultWorkflow({ workflowsService, stagesService }) {
2601
- const wfCount = await workflowsService.count();
2602
- const stagesCount = await stagesService.count();
2603
- if (wfCount === 0 && stagesCount === 0) {
2604
- const workflow2 = {
2605
- ...defaultWorkflow,
2606
- contentTypes: [],
2607
- stages: defaultStages
2608
- };
2609
- await workflowsService.create({ data: workflow2 });
2610
- }
2611
- }
2612
- const setRelation = (attributeName, target) => (contentType) => {
2613
- Object.assign(contentType.attributes, {
2614
- [attributeName]: {
2615
- writable: true,
2616
- private: false,
2617
- configurable: false,
2618
- visible: false,
2619
- useJoinTable: true,
2620
- // We want a join table to persist data when downgrading to CE
2621
- type: "relation",
2622
- relation: "oneToOne",
2623
- target
2624
- }
2625
- });
2626
- return contentType;
2627
- };
2628
- const setStageAttribute = setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID);
2629
- const setAssigneeAttribute = setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, "admin::user");
2630
- const setReviewWorkflowAttributes = (contentType) => {
2631
- setStageAttribute(contentType);
2632
- setAssigneeAttribute(contentType);
2633
- };
2634
- function extendReviewWorkflowContentTypes({ strapi: strapi2 }) {
2635
- const extendContentType = (contentTypeUID) => {
2636
- const assertContentTypeCompatibility = (contentType) => contentType.collectionName.length <= MAX_CONTENT_TYPE_NAME_LEN;
2637
- const incompatibleContentTypeAlert = (contentType) => {
2638
- strapi2.log.warn(
2639
- `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.`
2640
- );
2641
- return contentType;
2642
- };
2643
- const extendContentTypeIfCompatible = cond([
2644
- [assertContentTypeCompatibility, setReviewWorkflowAttributes],
2645
- [stubTrue, incompatibleContentTypeAlert]
2646
- ]);
2647
- strapi2.get("content-types").extend(contentTypeUID, extendContentTypeIfCompatible);
2648
- };
2649
- pipe([
2650
- getVisibleContentTypesUID,
2651
- // Iterate over UIDs to extend the content-type
2652
- forEach(extendContentType)
2653
- ])(strapi2.contentTypes);
2654
- }
2655
- function persistStagesJoinTables({ strapi: strapi2 }) {
2656
- return async ({ contentTypes }) => {
2657
- const getStageTableToPersist = (contentTypeUID) => {
2658
- const { attributes, tableName } = strapi2.db.metadata.get(contentTypeUID);
2659
- const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;
2660
- return { name: joinTableName, dependsOn: [{ name: tableName }] };
2661
- };
2662
- const joinTablesToPersist = pipe([
2663
- getVisibleContentTypesUID,
2664
- filter((uid) => hasStageAttribute(contentTypes[uid])),
2665
- map(getStageTableToPersist)
2666
- ])(contentTypes);
2667
- await removePersistedTablesWithSuffix("_strapi_stage_links");
2668
- await persistTables(joinTablesToPersist);
2669
- };
2670
- }
2671
- const registerWebhookEvents = async ({ strapi: strapi2 }) => Object.entries(webhookEvents).forEach(
2672
- ([eventKey, event]) => strapi2.webhookStore.addAllowedEvent(eventKey, event)
2673
- );
2674
- const reviewWorkflows = ({ strapi: strapi2 }) => {
2675
- const workflowsService = getService("workflows", { strapi: strapi2 });
2676
- const stagesService = getService("stages", { strapi: strapi2 });
2677
- const workflowsValidationService = getService("review-workflows-validation", { strapi: strapi2 });
2678
- return {
2679
- async bootstrap() {
2680
- await registerWebhookEvents({ strapi: strapi2 });
2681
- await initDefaultWorkflow({ workflowsService, stagesService, strapi: strapi2 });
2682
- },
2683
- async register({ options } = { options: {} }) {
2684
- extendReviewWorkflowContentTypes({ strapi: strapi2 });
2685
- strapi2.hook("strapi::content-types.afterSync").register(persistStagesJoinTables({ strapi: strapi2 }));
2686
- const reviewWorkflowsOptions = defaultsDeep(DEFAULT_OPTIONS, options);
2687
- workflowsValidationService.register(reviewWorkflowsOptions);
2688
- }
2689
- };
2690
- };
2691
- const { ValidationError: ValidationError$1 } = errors;
2692
- const reviewWorkflowsValidation = ({ strapi: strapi2 }) => {
2693
- return {
2694
- limits: {
2695
- numberOfWorkflows: MAX_WORKFLOWS,
2696
- stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW
2697
- },
2698
- register({ numberOfWorkflows, stagesPerWorkflow }) {
2699
- if (!Object.isFrozen(this.limits)) {
2700
- this.limits.numberOfWorkflows = clampMaxWorkflows(
2701
- numberOfWorkflows || this.limits.numberOfWorkflows
2702
- );
2703
- this.limits.stagesPerWorkflow = clampMaxStagesPerWorkflow(
2704
- stagesPerWorkflow || this.limits.stagesPerWorkflow
2705
- );
2706
- Object.freeze(this.limits);
2707
- }
2708
- },
2709
- /**
2710
- * Validates the stages of a workflow.
2711
- * @param {Array} stages - Array of stages to be validated.
2712
- * @throws {ValidationError} - If the workflow has no stages or exceeds the limit.
2713
- */
2714
- validateWorkflowStages(stages2) {
2715
- if (!stages2 || stages2.length === 0) {
2716
- throw new ValidationError$1(ERRORS.WORKFLOW_WITHOUT_STAGES);
2717
- }
2718
- if (stages2.length > this.limits.stagesPerWorkflow) {
2719
- throw new ValidationError$1(ERRORS.STAGES_LIMIT);
2720
- }
2721
- const stageNames = stages2.map((stage) => stage.name);
2722
- if (uniq(stageNames).length !== stageNames.length) {
2723
- throw new ValidationError$1(ERRORS.DUPLICATED_STAGE_NAME);
2724
- }
2725
- },
2726
- async validateWorkflowCountStages(workflowId, countAddedStages = 0) {
2727
- const stagesService = getService("stages", { strapi: strapi2 });
2728
- const countWorkflowStages = await stagesService.count({ workflowId });
2729
- if (countWorkflowStages + countAddedStages > this.limits.stagesPerWorkflow) {
2730
- throw new ValidationError$1(ERRORS.STAGES_LIMIT);
2731
- }
2732
- },
2733
- /**
2734
- * Validates the count of existing and added workflows.
2735
- * @param {number} [countAddedWorkflows=0] - The count of workflows to be added.
2736
- * @throws {ValidationError} - If the total count of workflows exceeds the limit.
2737
- * @returns {Promise<void>} - A Promise that resolves when the validation is completed.
2738
- */
2739
- async validateWorkflowCount(countAddedWorkflows = 0) {
2740
- const workflowsService = getService("workflows", { strapi: strapi2 });
2741
- const countWorkflows = await workflowsService.count();
2742
- if (countWorkflows + countAddedWorkflows > this.limits.numberOfWorkflows) {
2743
- throw new ValidationError$1(ERRORS.WORKFLOWS_LIMIT);
2744
- }
2745
- }
2746
- };
2747
- };
2748
- const getDataWithStage = async (workflow2, data) => {
2749
- if (!isNil(ENTITY_STAGE_ATTRIBUTE)) {
2750
- return { ...data, [ENTITY_STAGE_ATTRIBUTE]: workflow2.stages[0].id };
2751
- }
2752
- return data;
2753
- };
2754
- const getEntityStage = async (uid, id) => {
2755
- const entity = await strapi.db.query(uid).findOne({
2756
- where: { id },
2757
- populate: {
2758
- [ENTITY_STAGE_ATTRIBUTE]: {
2759
- populate: {
2760
- workflow: true
2761
- }
2762
- }
2763
- }
2764
- });
2765
- return entity?.[ENTITY_STAGE_ATTRIBUTE] ?? {};
2766
- };
2767
- const decorator = (service) => ({
2768
- async create(uid, opts = {}) {
2769
- const workflow2 = await getService("workflows").getAssignedWorkflow(uid, {
2770
- populate: "stages"
2771
- });
2772
- if (!workflow2) {
2773
- return service.create.call(this, uid, opts);
2774
- }
2775
- const data = await getDataWithStage(workflow2, opts.data);
2776
- return service.create.call(this, uid, { ...opts, data });
2777
- },
2778
- async update(uid, entityId, opts = {}) {
2779
- const data = { ...opts.data };
2780
- if (isNil(data[ENTITY_STAGE_ATTRIBUTE])) {
2781
- delete data[ENTITY_STAGE_ATTRIBUTE];
2782
- return service.update.call(this, uid, entityId, { ...opts, data });
2783
- }
2784
- const previousStage = await getEntityStage(uid, entityId);
2785
- const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data });
2786
- const updatedStage = updatedEntity[ENTITY_STAGE_ATTRIBUTE];
2787
- if (updatedStage && previousStage?.id && previousStage.id !== updatedStage.id) {
2788
- const model = strapi.getModel(uid);
2789
- strapi.eventHub.emit(WORKFLOW_UPDATE_STAGE, {
2790
- model: model.modelName,
2791
- uid: model.uid,
2792
- entity: {
2793
- id: entityId
2794
- },
2795
- workflow: {
2796
- id: previousStage.workflow.id,
2797
- stages: {
2798
- from: {
2799
- id: previousStage.id,
2800
- name: previousStage.name
2801
- },
2802
- to: {
2803
- id: updatedStage.id,
2804
- name: updatedStage.name
2805
- }
2806
- }
2807
- }
2808
- });
2809
- }
2810
- return updatedEntity;
2811
- }
2812
- });
2813
- const reviewWorkflowsDecorator = () => ({
2814
- decorator
2815
- });
2816
- const sendDidCreateStage = async () => {
2817
- strapi.telemetry.send("didCreateStage", {});
2818
- };
2819
- const sendDidEditStage = async () => {
2820
- strapi.telemetry.send("didEditStage", {});
2821
- };
2822
- const sendDidDeleteStage = async () => {
2823
- strapi.telemetry.send("didDeleteStage", {});
2824
- };
2825
- const sendDidChangeEntryStage = async () => {
2826
- strapi.telemetry.send("didChangeEntryStage", {});
2827
- };
2828
- const sendDidCreateWorkflow = async () => {
2829
- strapi.telemetry.send("didCreateWorkflow", {});
2830
- };
2831
- const sendDidEditWorkflow = async () => {
2832
- strapi.telemetry.send("didEditWorkflow", {});
2833
- };
2834
- const sendDidEditAssignee = async (fromId, toId) => {
2835
- strapi.telemetry.send("didEditAssignee", { from: fromId, to: toId });
2836
- };
2837
- const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes) => {
2838
- strapi.telemetry.send("didSendReviewWorkflowPropertiesOnceAWeek", {
2839
- groupProperties: {
2840
- numberOfActiveWorkflows,
2841
- avgStagesCount,
2842
- maxStagesCount,
2843
- activatedContentTypes
2844
- }
2845
- });
1090
+ return;
1091
+ }
1092
+ await syncDisabledUserRecords();
1093
+ const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
1094
+ const adminSeatsLeft = adminSeats - currentActiveUserCount;
1095
+ if (adminSeatsLeft > 0) {
1096
+ await enableMaximumUserCount(adminSeatsLeft);
1097
+ } else if (adminSeatsLeft < 0) {
1098
+ await disableUsersAboveLicenseLimit(-adminSeatsLeft);
1099
+ }
2846
1100
  };
2847
- const reviewWorkflowsMetrics = {
2848
- sendDidCreateStage,
2849
- sendDidEditStage,
2850
- sendDidDeleteStage,
2851
- sendDidChangeEntryStage,
2852
- sendDidCreateWorkflow,
2853
- sendDidEditWorkflow,
2854
- sendDidSendReviewWorkflowPropertiesOnceAWeek,
2855
- sendDidEditAssignee
2856
- };
2857
- const ONE_WEEK = 7 * 24 * 60 * 60 * 1e3;
2858
- const getWeeklyCronScheduleAt = (date) => `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;
2859
- const reviewWorkflowsWeeklyMetrics = ({ strapi: strapi2 }) => {
2860
- const metrics2 = getService("review-workflows-metrics", { strapi: strapi2 });
2861
- const workflowsService = getService("workflows", { strapi: strapi2 });
2862
- const getMetricsStoreValue = async () => {
2863
- const value = await strapi2.store.get({ type: "plugin", name: "ee", key: "metrics" });
2864
- return defaultTo({}, value);
2865
- };
2866
- const setMetricsStoreValue = (value) => strapi2.store.set({ type: "plugin", name: "ee", key: "metrics", value });
2867
- return {
2868
- async computeMetrics() {
2869
- const workflows2 = await workflowsService.find({ populate: "stages" });
2870
- const stagesCount = flow(
2871
- map("stages"),
2872
- // Number of stages per workflow
2873
- map(size)
2874
- )(workflows2);
2875
- const contentTypesCount = flow(
2876
- map("contentTypes"),
2877
- // Number of content types per workflow
2878
- map(size)
2879
- )(workflows2);
2880
- return {
2881
- numberOfActiveWorkflows: size(workflows2),
2882
- avgStagesCount: mean(stagesCount),
2883
- maxStagesCount: max(stagesCount),
2884
- activatedContentTypes: sum(contentTypesCount)
2885
- };
2886
- },
2887
- async sendMetrics() {
2888
- const computedMetrics = await this.computeMetrics();
2889
- metrics2.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
2890
- const metricsInfoStored = await getMetricsStoreValue();
2891
- await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: (/* @__PURE__ */ new Date()).getTime() });
2892
- },
2893
- async ensureWeeklyStoredCronSchedule() {
2894
- const metricsInfoStored = await getMetricsStoreValue();
2895
- const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;
2896
- const now = /* @__PURE__ */ new Date();
2897
- let weeklySchedule = currentSchedule;
2898
- if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {
2899
- weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 10 }));
2900
- await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });
2901
- }
2902
- return weeklySchedule;
2903
- },
2904
- async registerCron() {
2905
- const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();
2906
- strapi2.cron.add({ [weeklySchedule]: this.sendMetrics.bind(this) });
2907
- }
2908
- };
1101
+ const seatEnforcement = {
1102
+ seatEnforcementWorkflow,
1103
+ getDisabledUserList
2909
1104
  };
2910
- const index$1 = {
1105
+ const services = {
2911
1106
  auth,
2912
1107
  passport,
2913
1108
  role: role$1,
2914
1109
  user: user$1,
2915
1110
  metrics,
2916
- "seat-enforcement": seatEnforcement,
2917
- workflows: workflows$1,
2918
- stages: stages$1,
2919
- "stage-permissions": stagePermissions,
2920
- assignees: assignees$1,
2921
- "review-workflows": reviewWorkflows,
2922
- "review-workflows-validation": reviewWorkflowsValidation,
2923
- "review-workflows-decorator": reviewWorkflowsDecorator,
2924
- "review-workflows-metrics": reviewWorkflowsMetrics,
2925
- "review-workflows-weekly-metrics": reviewWorkflowsWeeklyMetrics
1111
+ "seat-enforcement": seatEnforcement
2926
1112
  };
2927
1113
  const providerOptionsUpdateSchema = yup.object().shape({
2928
1114
  autoRegister: yup.boolean().required(),
@@ -2932,14 +1118,14 @@ const providerOptionsUpdateSchema = yup.object().shape({
2932
1118
  if (roleId === null) {
2933
1119
  return true;
2934
1120
  }
2935
- return strapi.admin.services.role.exists({ id: roleId });
1121
+ return strapi.service("admin::role").exists({ id: roleId });
2936
1122
  }),
2937
1123
  ssoLockedRoles: yup.array().nullable().of(
2938
1124
  yup.strapiID().test(
2939
1125
  "is-valid-role",
2940
1126
  "You must submit a valid role for the SSO Locked roles",
2941
1127
  (roleId) => {
2942
- return strapi.admin.services.role.exists({ id: roleId });
1128
+ return strapi.service("admin::role").exists({ id: roleId });
2943
1129
  }
2944
1130
  )
2945
1131
  )
@@ -3054,7 +1240,7 @@ const providerAuthenticationFlow = compose([
3054
1240
  ]);
3055
1241
  const authentication = {
3056
1242
  async getProviders(ctx) {
3057
- const { providerRegistry: providerRegistry2 } = strapi.admin.services.passport;
1243
+ const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
3058
1244
  ctx.body = providerRegistry2.getAll().map(toProviderDTO);
3059
1245
  },
3060
1246
  async getProviderLoginOptions(ctx) {
@@ -3082,7 +1268,7 @@ const authentication = {
3082
1268
  const {
3083
1269
  params: { provider: providerName }
3084
1270
  } = ctx;
3085
- const { providerRegistry: providerRegistry2 } = strapi.admin.services.passport;
1271
+ const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
3086
1272
  if (!providerRegistry2.has(providerName)) {
3087
1273
  throw new ValidationError(`Invalid provider supplied: ${providerName}`);
3088
1274
  }
@@ -3099,9 +1285,9 @@ const rolesDeleteSchema = yup.object().shape({
3099
1285
  "Roles deletion checks have failed",
3100
1286
  async function rolesDeletionChecks(ids) {
3101
1287
  try {
3102
- await strapi.admin.services.role.checkRolesIdForDeletion(ids);
1288
+ await strapi.service("admin::role").checkRolesIdForDeletion(ids);
3103
1289
  if (strapi.ee.features.isEnabled("sso")) {
3104
- await strapi.admin.services.role.ssoCheckRolesIdForDeletion(ids);
1290
+ await strapi.service("admin::role").ssoCheckRolesIdForDeletion(ids);
3105
1291
  }
3106
1292
  } catch (e) {
3107
1293
  return this.createError({ path: "ids", message: e.message });
@@ -3115,9 +1301,9 @@ const roleDeleteSchema = yup.strapiID().required().test(
3115
1301
  "Role deletion checks have failed",
3116
1302
  async function noAdminSingleDelete(id) {
3117
1303
  try {
3118
- await strapi.admin.services.role.checkRolesIdForDeletion([id]);
1304
+ await strapi.service("admin::role").checkRolesIdForDeletion([id]);
3119
1305
  if (strapi.ee.features.isEnabled("sso")) {
3120
- await strapi.admin.services.role.ssoCheckRolesIdForDeletion([id]);
1306
+ await strapi.service("admin::role").ssoCheckRolesIdForDeletion([id]);
3121
1307
  }
3122
1308
  } catch (e) {
3123
1309
  return this.createError({ path: "id", message: e.message });
@@ -3200,8 +1386,8 @@ const assignOrOmitSubCategory = (action) => {
3200
1386
  const shouldHaveSubCategory = ["settings", "plugins"].includes(action.section);
3201
1387
  return shouldHaveSubCategory ? set("subCategory", action.subCategory || "general", action) : omit("subCategory", action);
3202
1388
  };
3203
- const appliesToProperty = curry((property2, action) => {
3204
- return pipe(prop("options.applyToProperties"), includes(property2))(action);
1389
+ const appliesToProperty = curry((property, action) => {
1390
+ return pipe(prop("options.applyToProperties"), includes(property))(action);
3205
1391
  });
3206
1392
  const appliesToSubject = curry((subject, action) => {
3207
1393
  return isArray(action.subjects) && includes(subject, action.subjects);
@@ -3243,689 +1429,749 @@ const checkFieldsAreCorrectlyNested = (fields) => {
3243
1429
  if (failed)
3244
1430
  break;
3245
1431
  }
3246
- return !failed;
1432
+ return !failed;
1433
+ };
1434
+ const checkFieldsDontHaveDuplicates = (fields) => {
1435
+ if (_.isNil(fields)) {
1436
+ return true;
1437
+ }
1438
+ if (!Array.isArray(fields)) {
1439
+ return false;
1440
+ }
1441
+ return _.uniq(fields).length === fields.length;
1442
+ };
1443
+ const getActionFromProvider = (actionId) => {
1444
+ return getService$1("permission").actionProvider.get(actionId);
1445
+ };
1446
+ const email = yup.string().email().lowercase();
1447
+ const firstname = yup.string().trim().min(1);
1448
+ const lastname = yup.string();
1449
+ const username = yup.string().min(1);
1450
+ const password = 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");
1451
+ const roles = yup.array(yup.strapiID()).min(1);
1452
+ const isAPluginName = yup.string().test("is-a-plugin-name", "is not a plugin name", function(value) {
1453
+ return [void 0, "admin", ...Object.keys(strapi.plugins)].includes(value) ? true : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });
1454
+ });
1455
+ const arrayOfConditionNames = yup.array().of(yup.string()).test("is-an-array-of-conditions", "is not a plugin name", function(value) {
1456
+ const ids = strapi.service("admin::permission").conditionProvider.keys();
1457
+ return _.isUndefined(value) || _.difference(value, ids).length === 0 ? true : this.createError({ path: this.path, message: `contains conditions that don't exist` });
1458
+ });
1459
+ const permissionsAreEquals = (a, b) => a.action === b.action && (a.subject === b.subject || _.isNil(a.subject) && _.isNil(b.subject));
1460
+ const checkNoDuplicatedPermissions = (permissions) => !Array.isArray(permissions) || permissions.every(
1461
+ (permA, i) => permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))
1462
+ );
1463
+ const checkNilFields = (action) => function(fields) {
1464
+ if (isNil(action)) {
1465
+ return true;
1466
+ }
1467
+ return actionDomain.appliesToProperty("fields", action) || isNil(fields);
1468
+ };
1469
+ const fieldsPropertyValidation = (action) => yup.array().of(yup.string()).nullable().test(
1470
+ "field-nested",
1471
+ "Fields format are incorrect (bad nesting).",
1472
+ checkFieldsAreCorrectlyNested
1473
+ ).test(
1474
+ "field-nested",
1475
+ "Fields format are incorrect (duplicates).",
1476
+ checkFieldsDontHaveDuplicates
1477
+ ).test(
1478
+ "fields-restriction",
1479
+ "The permission at ${path} must have fields set to null or undefined",
1480
+ // @ts-expect-error yup types
1481
+ checkNilFields(action)
1482
+ );
1483
+ const permission = yup.object().shape({
1484
+ action: yup.string().required().test("action-validity", "action is not an existing permission action", function(actionId) {
1485
+ if (isNil(actionId)) {
1486
+ return true;
1487
+ }
1488
+ return !!getActionFromProvider(actionId);
1489
+ }),
1490
+ actionParameters: yup.object().nullable(),
1491
+ subject: yup.string().nullable().test("subject-validity", "Invalid subject submitted", function(subject) {
1492
+ const action = getActionFromProvider(this.options.parent.action);
1493
+ if (!action) {
1494
+ return true;
1495
+ }
1496
+ if (isNil(action.subjects)) {
1497
+ return isNil(subject);
1498
+ }
1499
+ if (isArray(action.subjects)) {
1500
+ return action.subjects.includes(subject);
1501
+ }
1502
+ return false;
1503
+ }),
1504
+ properties: yup.object().test("properties-structure", "Invalid property set at ${path}", function(properties) {
1505
+ const action = getActionFromProvider(this.options.parent.action);
1506
+ const hasNoProperties = isEmpty(properties) || isNil(properties);
1507
+ if (!has("options.applyToProperties", action)) {
1508
+ return hasNoProperties;
1509
+ }
1510
+ if (hasNoProperties) {
1511
+ return true;
1512
+ }
1513
+ const { applyToProperties } = action.options;
1514
+ if (!isArray(applyToProperties)) {
1515
+ return false;
1516
+ }
1517
+ return Object.keys(properties).every((property) => applyToProperties.includes(property));
1518
+ }).test(
1519
+ "fields-property",
1520
+ "Invalid fields property at ${path}",
1521
+ async function(properties = {}) {
1522
+ const action = getActionFromProvider(this.options.parent.action);
1523
+ if (!action || !properties) {
1524
+ return true;
1525
+ }
1526
+ if (!actionDomain.appliesToProperty("fields", action)) {
1527
+ return true;
1528
+ }
1529
+ try {
1530
+ await fieldsPropertyValidation(action).validate(properties.fields, {
1531
+ strict: true,
1532
+ abortEarly: false
1533
+ });
1534
+ return true;
1535
+ } catch (e) {
1536
+ throw this.createError({
1537
+ message: e.message,
1538
+ path: `${this.path}.fields`
1539
+ });
1540
+ }
1541
+ }
1542
+ ),
1543
+ conditions: yup.array().of(yup.string())
1544
+ }).noUnknown();
1545
+ const updatePermissions = yup.object().shape({
1546
+ permissions: yup.array().required().of(permission).test(
1547
+ "duplicated-permissions",
1548
+ "Some permissions are duplicated (same action and subject)",
1549
+ checkNoDuplicatedPermissions
1550
+ )
1551
+ }).required().noUnknown();
1552
+ const validators = {
1553
+ email,
1554
+ firstname,
1555
+ lastname,
1556
+ username,
1557
+ password,
1558
+ roles,
1559
+ isAPluginName,
1560
+ arrayOfConditionNames,
1561
+ permission,
1562
+ updatePermissions
1563
+ };
1564
+ const userCreationSchema = yup.object().shape({
1565
+ email: validators.email.required(),
1566
+ firstname: validators.firstname.required(),
1567
+ lastname: validators.lastname,
1568
+ roles: validators.roles.min(1),
1569
+ preferedLanguage: yup.string().nullable()
1570
+ }).noUnknown();
1571
+ const profileUpdateSchema = yup.object().shape({
1572
+ email: validators.email.notNull(),
1573
+ firstname: validators.firstname.notNull(),
1574
+ lastname: validators.lastname.nullable(),
1575
+ username: validators.username.nullable(),
1576
+ password: validators.password.notNull(),
1577
+ currentPassword: yup.string().when(
1578
+ "password",
1579
+ (password2, schema) => !isUndefined(password2) ? schema.required() : schema
1580
+ ).notNull(),
1581
+ preferedLanguage: yup.string().nullable()
1582
+ }).noUnknown();
1583
+ const userUpdateSchema = yup.object().shape({
1584
+ email: validators.email.notNull(),
1585
+ firstname: validators.firstname.notNull(),
1586
+ lastname: validators.lastname.nullable(),
1587
+ username: validators.username.nullable(),
1588
+ password: validators.password.notNull(),
1589
+ isActive: yup.bool().notNull(),
1590
+ roles: validators.roles.min(1).notNull()
1591
+ }).noUnknown();
1592
+ const usersDeleteSchema = yup.object().shape({
1593
+ ids: yup.array().of(yup.strapiID()).min(1).required()
1594
+ }).noUnknown();
1595
+ validateYupSchema(userCreationSchema);
1596
+ validateYupSchema(profileUpdateSchema);
1597
+ const validateUserUpdateInput = validateYupSchema(userUpdateSchema);
1598
+ validateYupSchema(usersDeleteSchema);
1599
+ const schemas = {
1600
+ userCreationSchema,
1601
+ usersDeleteSchema,
1602
+ userUpdateSchema
1603
+ };
1604
+ const ssoUserCreationInputExtension = yup.object().shape({
1605
+ useSSORegistration: yup.boolean()
1606
+ }).noUnknown();
1607
+ const validateUserCreationInput = (data) => {
1608
+ let schema = schemas.userCreationSchema;
1609
+ if (strapi.ee.features.isEnabled("sso")) {
1610
+ schema = schema.concat(ssoUserCreationInputExtension);
1611
+ }
1612
+ return validateYupSchema(schema)(data);
1613
+ };
1614
+ const { ApplicationError, ForbiddenError } = errors;
1615
+ const pickUserCreationAttributes = pick(["firstname", "lastname", "email", "roles"]);
1616
+ const hasAdminSeatsAvaialble = async () => {
1617
+ if (!strapi.EE) {
1618
+ return true;
1619
+ }
1620
+ const permittedSeats = strapi.ee.seats;
1621
+ if (isNil(permittedSeats)) {
1622
+ return true;
1623
+ }
1624
+ const userCount = await strapi.service("admin::user").getCurrentActiveUserCount();
1625
+ if (userCount < permittedSeats) {
1626
+ return true;
1627
+ }
1628
+ };
1629
+ const user = {
1630
+ async create(ctx) {
1631
+ if (!await hasAdminSeatsAvaialble()) {
1632
+ throw new ForbiddenError("License seat limit reached. You cannot create a new user");
1633
+ }
1634
+ const { body } = ctx.request;
1635
+ const cleanData = { ...body, email: _.get(body, `email`, ``).toLowerCase() };
1636
+ await validateUserCreationInput(cleanData);
1637
+ const attributes = pickUserCreationAttributes(cleanData);
1638
+ const { useSSORegistration } = cleanData;
1639
+ const userAlreadyExists = await getService("user").exists({ email: attributes.email });
1640
+ if (userAlreadyExists) {
1641
+ throw new ApplicationError("Email already taken");
1642
+ }
1643
+ if (useSSORegistration) {
1644
+ Object.assign(attributes, { registrationToken: null, isActive: true });
1645
+ }
1646
+ const createdUser = await getService("user").create(attributes);
1647
+ const userInfo = getService("user").sanitizeUser(createdUser);
1648
+ Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
1649
+ ctx.created({ data: userInfo });
1650
+ },
1651
+ async update(ctx) {
1652
+ const { id } = ctx.params;
1653
+ const { body: input } = ctx.request;
1654
+ await validateUserUpdateInput(input);
1655
+ if (_.has(input, "email")) {
1656
+ const uniqueEmailCheck = await getService("user").exists({
1657
+ id: { $ne: id },
1658
+ email: input.email
1659
+ });
1660
+ if (uniqueEmailCheck) {
1661
+ throw new ApplicationError("A user with this email address already exists");
1662
+ }
1663
+ }
1664
+ const user2 = await getService("user").findOne(id, null);
1665
+ if (!await hasAdminSeatsAvaialble() && !user2.isActive && input.isActive) {
1666
+ throw new ForbiddenError("License seat limit reached. You cannot active this user");
1667
+ }
1668
+ const updatedUser = await getService("user").updateById(id, input);
1669
+ if (!updatedUser) {
1670
+ return ctx.notFound("User does not exist");
1671
+ }
1672
+ ctx.body = {
1673
+ data: getService("user").sanitizeUser(updatedUser)
1674
+ };
1675
+ },
1676
+ async isSSOLocked(ctx) {
1677
+ const { user: user2 } = ctx.state;
1678
+ const isSSOLocked = await isSsoLocked(user2);
1679
+ ctx.body = {
1680
+ data: {
1681
+ isSSOLocked
1682
+ }
1683
+ };
1684
+ }
3247
1685
  };
3248
- const checkFieldsDontHaveDuplicates = (fields) => {
3249
- if (_.isNil(fields)) {
3250
- return true;
3251
- }
3252
- if (!Array.isArray(fields)) {
3253
- return false;
1686
+ const admin = {
1687
+ // NOTE: Overrides CE admin controller
1688
+ async getProjectType() {
1689
+ const flags = strapi.config.get("admin.flags", {});
1690
+ try {
1691
+ return { data: { isEE: strapi.EE, features: strapi.ee.features.list(), flags } };
1692
+ } catch (err) {
1693
+ return { data: { isEE: false, features: [], flags } };
1694
+ }
1695
+ },
1696
+ async licenseLimitInformation() {
1697
+ const permittedSeats = strapi.ee.seats;
1698
+ let shouldNotify = false;
1699
+ let licenseLimitStatus = null;
1700
+ let enforcementUserCount;
1701
+ const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
1702
+ const eeDisabledUsers = await getService("seat-enforcement").getDisabledUserList();
1703
+ if (eeDisabledUsers) {
1704
+ enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;
1705
+ } else {
1706
+ enforcementUserCount = currentActiveUserCount;
1707
+ }
1708
+ if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {
1709
+ shouldNotify = true;
1710
+ licenseLimitStatus = "OVER_LIMIT";
1711
+ }
1712
+ if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {
1713
+ shouldNotify = true;
1714
+ licenseLimitStatus = "AT_LIMIT";
1715
+ }
1716
+ const data = {
1717
+ enforcementUserCount,
1718
+ currentActiveUserCount,
1719
+ permittedSeats,
1720
+ shouldNotify,
1721
+ shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
1722
+ licenseLimitStatus,
1723
+ isHostedOnStrapiCloud: env("STRAPI_HOSTING", null) === "strapi.cloud",
1724
+ features: strapi.ee.features.list() ?? []
1725
+ };
1726
+ return { data };
3254
1727
  }
3255
- return _.uniq(fields).length === fields.length;
3256
1728
  };
3257
- const getActionFromProvider = (actionId) => {
3258
- return getService$1("permission").actionProvider.get(actionId);
1729
+ const controllers = {
1730
+ authentication,
1731
+ role,
1732
+ user,
1733
+ admin
3259
1734
  };
3260
- const email = yup.string().email().lowercase();
3261
- const firstname = yup.string().trim().min(1);
3262
- const lastname = yup.string();
3263
- const username = yup.string().min(1);
3264
- const password = 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");
3265
- const roles = yup.array(yup.strapiID()).min(1);
3266
- const isAPluginName = yup.string().test("is-a-plugin-name", "is not a plugin name", function(value) {
3267
- return [void 0, "admin", ...Object.keys(strapi.plugins)].includes(value) ? true : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });
3268
- });
3269
- const arrayOfConditionNames = yup.array().of(yup.string()).test("is-an-array-of-conditions", "is not a plugin name", function(value) {
3270
- const ids = strapi.admin.services.permission.conditionProvider.keys();
3271
- return _.isUndefined(value) || _.difference(value, ids).length === 0 ? true : this.createError({ path: this.path, message: `contains conditions that don't exist` });
3272
- });
3273
- const permissionsAreEquals = (a, b) => a.action === b.action && (a.subject === b.subject || _.isNil(a.subject) && _.isNil(b.subject));
3274
- const checkNoDuplicatedPermissions = (permissions) => !Array.isArray(permissions) || permissions.every(
3275
- (permA, i) => permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))
3276
- );
3277
- const checkNilFields = (action) => function(fields) {
3278
- if (isNil(action)) {
3279
- return true;
1735
+ const enableFeatureMiddleware = (featureName) => (ctx, next) => {
1736
+ if (strapi.ee.features.isEnabled(featureName)) {
1737
+ return next();
3280
1738
  }
3281
- return actionDomain.appliesToProperty("fields", action) || isNil(fields);
1739
+ ctx.status = 404;
3282
1740
  };
3283
- const fieldsPropertyValidation = (action) => yup.array().of(yup.string()).nullable().test(
3284
- "field-nested",
3285
- "Fields format are incorrect (bad nesting).",
3286
- checkFieldsAreCorrectlyNested
3287
- ).test(
3288
- "field-nested",
3289
- "Fields format are incorrect (duplicates).",
3290
- checkFieldsDontHaveDuplicates
3291
- ).test(
3292
- "fields-restriction",
3293
- "The permission at ${path} must have fields set to null or undefined",
3294
- // @ts-expect-error yup types
3295
- checkNilFields(action)
3296
- );
3297
- const permission = yup.object().shape({
3298
- action: yup.string().required().test("action-validity", "action is not an existing permission action", function(actionId) {
3299
- if (isNil(actionId)) {
3300
- return true;
3301
- }
3302
- return !!getActionFromProvider(actionId);
3303
- }),
3304
- actionParameters: yup.object().nullable(),
3305
- subject: yup.string().nullable().test("subject-validity", "Invalid subject submitted", function(subject) {
3306
- const action = getActionFromProvider(this.options.parent.action);
3307
- if (!action) {
3308
- return true;
3309
- }
3310
- if (isNil(action.subjects)) {
3311
- return isNil(subject);
3312
- }
3313
- if (isArray(action.subjects)) {
3314
- return action.subjects.includes(subject);
3315
- }
3316
- return false;
3317
- }),
3318
- properties: yup.object().test("properties-structure", "Invalid property set at ${path}", function(properties) {
3319
- const action = getActionFromProvider(this.options.parent.action);
3320
- const hasNoProperties = isEmpty(properties) || isNil(properties);
3321
- if (!has("options.applyToProperties", action)) {
3322
- return hasNoProperties;
3323
- }
3324
- if (hasNoProperties) {
3325
- return true;
3326
- }
3327
- const { applyToProperties } = action.options;
3328
- if (!isArray(applyToProperties)) {
3329
- return false;
1741
+ const sso = {
1742
+ type: "admin",
1743
+ routes: [
1744
+ {
1745
+ method: "GET",
1746
+ path: "/providers",
1747
+ handler: "authentication.getProviders",
1748
+ config: {
1749
+ middlewares: [enableFeatureMiddleware("sso")],
1750
+ auth: false
1751
+ }
1752
+ },
1753
+ {
1754
+ method: "GET",
1755
+ path: "/connect/:provider",
1756
+ handler: "authentication.providerLogin",
1757
+ config: {
1758
+ middlewares: [enableFeatureMiddleware("sso")],
1759
+ auth: false
1760
+ }
1761
+ },
1762
+ {
1763
+ method: "POST",
1764
+ path: "/connect/:provider",
1765
+ handler: "authentication.providerLogin",
1766
+ config: {
1767
+ middlewares: [enableFeatureMiddleware("sso")],
1768
+ auth: false
1769
+ }
1770
+ },
1771
+ {
1772
+ method: "GET",
1773
+ path: "/providers/options",
1774
+ handler: "authentication.getProviderLoginOptions",
1775
+ config: {
1776
+ middlewares: [enableFeatureMiddleware("sso")],
1777
+ policies: [
1778
+ "admin::isAuthenticatedAdmin",
1779
+ { name: "admin::hasPermissions", config: { actions: ["admin::provider-login.read"] } }
1780
+ ]
1781
+ }
1782
+ },
1783
+ {
1784
+ method: "PUT",
1785
+ path: "/providers/options",
1786
+ handler: "authentication.updateProviderLoginOptions",
1787
+ config: {
1788
+ middlewares: [enableFeatureMiddleware("sso")],
1789
+ policies: [
1790
+ "admin::isAuthenticatedAdmin",
1791
+ { name: "admin::hasPermissions", config: { actions: ["admin::provider-login.update"] } }
1792
+ ]
1793
+ }
1794
+ },
1795
+ {
1796
+ method: "GET",
1797
+ path: "/providers/isSSOLocked",
1798
+ handler: "user.isSSOLocked",
1799
+ config: {
1800
+ middlewares: [enableFeatureMiddleware("sso")],
1801
+ policies: ["admin::isAuthenticatedAdmin"]
1802
+ }
3330
1803
  }
3331
- return Object.keys(properties).every((property2) => applyToProperties.includes(property2));
3332
- }).test(
3333
- "fields-property",
3334
- "Invalid fields property at ${path}",
3335
- async function(properties = {}) {
3336
- const action = getActionFromProvider(this.options.parent.action);
3337
- if (!action || !properties) {
3338
- return true;
1804
+ ]
1805
+ };
1806
+ const licenseLimit = {
1807
+ type: "admin",
1808
+ routes: [
1809
+ // License limit infos
1810
+ {
1811
+ method: "GET",
1812
+ path: "/license-limit-information",
1813
+ handler: "admin.licenseLimitInformation",
1814
+ config: {
1815
+ policies: [
1816
+ "admin::isAuthenticatedAdmin",
1817
+ {
1818
+ name: "admin::hasPermissions",
1819
+ config: {
1820
+ actions: [
1821
+ "admin::users.create",
1822
+ "admin::users.read",
1823
+ "admin::users.update",
1824
+ "admin::users.delete"
1825
+ ]
1826
+ }
1827
+ }
1828
+ ]
3339
1829
  }
3340
- if (!actionDomain.appliesToProperty("fields", action)) {
3341
- return true;
1830
+ }
1831
+ ]
1832
+ };
1833
+ const routes = {
1834
+ sso,
1835
+ "license-limit": licenseLimit
1836
+ };
1837
+ const auditLogsRoutes = {
1838
+ type: "admin",
1839
+ routes: [
1840
+ {
1841
+ method: "GET",
1842
+ path: "/audit-logs",
1843
+ handler: "audit-logs.findMany",
1844
+ config: {
1845
+ middlewares: [enableFeatureMiddleware("audit-logs")],
1846
+ policies: [
1847
+ "admin::isAuthenticatedAdmin",
1848
+ {
1849
+ name: "admin::hasPermissions",
1850
+ config: {
1851
+ actions: ["admin::audit-logs.read"]
1852
+ }
1853
+ }
1854
+ ]
3342
1855
  }
3343
- try {
3344
- await fieldsPropertyValidation(action).validate(properties.fields, {
3345
- strict: true,
3346
- abortEarly: false
3347
- });
3348
- return true;
3349
- } catch (e) {
3350
- throw this.createError({
3351
- message: e.message,
3352
- path: `${this.path}.fields`
3353
- });
1856
+ },
1857
+ {
1858
+ method: "GET",
1859
+ path: "/audit-logs/:id",
1860
+ handler: "audit-logs.findOne",
1861
+ config: {
1862
+ middlewares: [enableFeatureMiddleware("audit-logs")],
1863
+ policies: [
1864
+ "admin::isAuthenticatedAdmin",
1865
+ {
1866
+ name: "admin::hasPermissions",
1867
+ config: {
1868
+ actions: ["admin::audit-logs.read"]
1869
+ }
1870
+ }
1871
+ ]
3354
1872
  }
3355
1873
  }
3356
- ),
3357
- conditions: yup.array().of(yup.string())
3358
- }).noUnknown();
3359
- const updatePermissions = yup.object().shape({
3360
- permissions: yup.array().required().of(permission).test(
3361
- "duplicated-permissions",
3362
- "Some permissions are duplicated (same action and subject)",
3363
- checkNoDuplicatedPermissions
3364
- )
3365
- }).required().noUnknown();
3366
- const validators = {
3367
- email,
3368
- firstname,
3369
- lastname,
3370
- username,
3371
- password,
3372
- roles,
3373
- isAPluginName,
3374
- arrayOfConditionNames,
3375
- permission,
3376
- updatePermissions
3377
- };
3378
- const userCreationSchema = yup.object().shape({
3379
- email: validators.email.required(),
3380
- firstname: validators.firstname.required(),
3381
- lastname: validators.lastname,
3382
- roles: validators.roles.min(1),
3383
- preferedLanguage: yup.string().nullable()
3384
- }).noUnknown();
3385
- const profileUpdateSchema = yup.object().shape({
3386
- email: validators.email.notNull(),
3387
- firstname: validators.firstname.notNull(),
3388
- lastname: validators.lastname.nullable(),
3389
- username: validators.username.nullable(),
3390
- password: validators.password.notNull(),
3391
- currentPassword: yup.string().when(
3392
- "password",
3393
- (password2, schema) => !isUndefined(password2) ? schema.required() : schema
3394
- ).notNull(),
3395
- preferedLanguage: yup.string().nullable()
3396
- }).noUnknown();
3397
- const userUpdateSchema = yup.object().shape({
3398
- email: validators.email.notNull(),
3399
- firstname: validators.firstname.notNull(),
3400
- lastname: validators.lastname.nullable(),
3401
- username: validators.username.nullable(),
3402
- password: validators.password.notNull(),
3403
- isActive: yup.bool().notNull(),
3404
- roles: validators.roles.min(1).notNull()
3405
- }).noUnknown();
3406
- const usersDeleteSchema = yup.object().shape({
3407
- ids: yup.array().of(yup.strapiID()).min(1).required()
3408
- }).noUnknown();
3409
- validateYupSchema(userCreationSchema);
3410
- validateYupSchema(profileUpdateSchema);
3411
- const validateUserUpdateInput = validateYupSchema(userUpdateSchema);
3412
- validateYupSchema(usersDeleteSchema);
3413
- const schemas = {
3414
- userCreationSchema,
3415
- usersDeleteSchema,
3416
- userUpdateSchema
1874
+ ]
3417
1875
  };
3418
- const ssoUserCreationInputExtension = yup.object().shape({
3419
- useSSORegistration: yup.boolean()
3420
- }).noUnknown();
3421
- const validateUserCreationInput = (data) => {
3422
- let schema = schemas.userCreationSchema;
3423
- if (strapi.ee.features.isEnabled("sso")) {
3424
- schema = schema.concat(ssoUserCreationInputExtension);
1876
+ const ALLOWED_SORT_STRINGS = ["action:ASC", "action:DESC", "date:ASC", "date:DESC"];
1877
+ const validateFindManySchema = yup.object().shape({
1878
+ page: yup.number().integer().min(1),
1879
+ pageSize: yup.number().integer().min(1).max(100),
1880
+ sort: yup.mixed().oneOf(ALLOWED_SORT_STRINGS)
1881
+ }).required();
1882
+ const validateFindMany = validateYupSchema(validateFindManySchema, { strict: false });
1883
+ const auditLogsController = {
1884
+ async findMany(ctx) {
1885
+ const { query } = ctx.request;
1886
+ await validateFindMany(query);
1887
+ const auditLogs = strapi.get("audit-logs");
1888
+ const body = await auditLogs.findMany(query);
1889
+ ctx.body = body;
1890
+ },
1891
+ async findOne(ctx) {
1892
+ const { id } = ctx.params;
1893
+ const auditLogs = strapi.get("audit-logs");
1894
+ const body = await auditLogs.findOne(id);
1895
+ ctx.body = body;
1896
+ strapi.telemetry.send("didWatchAnAuditLog");
3425
1897
  }
3426
- return validateYupSchema(schema)(data);
3427
1898
  };
3428
- const { ApplicationError, ForbiddenError } = errors;
3429
- const pickUserCreationAttributes = pick(["firstname", "lastname", "email", "roles"]);
3430
- const hasAdminSeatsAvaialble = async () => {
3431
- if (!strapi.EE) {
3432
- return true;
3433
- }
3434
- const permittedSeats = strapi.ee.seats;
3435
- if (isNil(permittedSeats)) {
3436
- return true;
3437
- }
3438
- const userCount = await strapi.service("admin::user").getCurrentActiveUserCount();
3439
- if (userCount < permittedSeats) {
3440
- return true;
1899
+ const getSanitizedUser = (user2) => {
1900
+ let displayName = user2.email;
1901
+ if (user2.username) {
1902
+ displayName = user2.username;
1903
+ } else if (user2.firstname && user2.lastname) {
1904
+ displayName = `${user2.firstname} ${user2.lastname}`;
3441
1905
  }
1906
+ return {
1907
+ id: user2.id,
1908
+ email: user2.email,
1909
+ displayName
1910
+ };
3442
1911
  };
3443
- const user = {
3444
- async create(ctx) {
3445
- if (!await hasAdminSeatsAvaialble()) {
3446
- throw new ForbiddenError("License seat limit reached. You cannot create a new user");
3447
- }
3448
- const { body } = ctx.request;
3449
- const cleanData = { ...body, email: _.get(body, `email`, ``).toLowerCase() };
3450
- await validateUserCreationInput(cleanData);
3451
- const attributes = pickUserCreationAttributes(cleanData);
3452
- const { useSSORegistration } = cleanData;
3453
- const userAlreadyExists = await getService("user").exists({ email: attributes.email });
3454
- if (userAlreadyExists) {
3455
- throw new ApplicationError("Email already taken");
3456
- }
3457
- if (useSSORegistration) {
3458
- Object.assign(attributes, { registrationToken: null, isActive: true });
3459
- }
3460
- const createdUser = await getService("user").create(attributes);
3461
- const userInfo = getService("user").sanitizeUser(createdUser);
3462
- Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
3463
- ctx.created({ data: userInfo });
3464
- },
3465
- async update(ctx) {
3466
- const { id } = ctx.params;
3467
- const { body: input } = ctx.request;
3468
- await validateUserUpdateInput(input);
3469
- if (_.has(input, "email")) {
3470
- const uniqueEmailCheck = await getService("user").exists({
3471
- id: { $ne: id },
3472
- email: input.email
1912
+ const createAuditLogsService = (strapi2) => {
1913
+ return {
1914
+ async saveEvent(event) {
1915
+ const { userId, ...rest } = event;
1916
+ const auditLog2 = { ...rest, user: userId };
1917
+ await strapi2.db?.query("admin::audit-log").create({ data: auditLog2 });
1918
+ return this;
1919
+ },
1920
+ async findMany(query) {
1921
+ const { results, pagination } = await strapi2.db?.query("admin::audit-log").findPage({
1922
+ populate: ["user"],
1923
+ select: ["action", "date", "payload"],
1924
+ ...strapi2.get("query-params").transform("admin::audit-log", query)
3473
1925
  });
3474
- if (uniqueEmailCheck) {
3475
- throw new ApplicationError("A user with this email address already exists");
1926
+ const sanitizedResults = results.map((result) => {
1927
+ const { user: user2, ...rest } = result;
1928
+ return {
1929
+ ...rest,
1930
+ user: user2 ? getSanitizedUser(user2) : null
1931
+ };
1932
+ });
1933
+ return {
1934
+ results: sanitizedResults,
1935
+ pagination
1936
+ };
1937
+ },
1938
+ async findOne(id) {
1939
+ const result = await strapi2.db?.query("admin::audit-log").findOne({
1940
+ where: { id },
1941
+ populate: ["user"],
1942
+ select: ["action", "date", "payload"]
1943
+ });
1944
+ if (!result) {
1945
+ return null;
3476
1946
  }
1947
+ const { user: user2, ...rest } = result;
1948
+ return {
1949
+ ...rest,
1950
+ user: user2 ? getSanitizedUser(user2) : null
1951
+ };
1952
+ },
1953
+ deleteExpiredEvents(expirationDate) {
1954
+ return strapi2.db?.query("admin::audit-log").deleteMany({
1955
+ where: {
1956
+ date: {
1957
+ $lt: expirationDate.toISOString()
1958
+ }
1959
+ }
1960
+ });
3477
1961
  }
3478
- const user2 = await getService("user").findOne(id, null);
3479
- if (!await hasAdminSeatsAvaialble() && !user2.isActive && input.isActive) {
3480
- throw new ForbiddenError("License seat limit reached. You cannot active this user");
3481
- }
3482
- const updatedUser = await getService("user").updateById(id, input);
3483
- if (!updatedUser) {
3484
- return ctx.notFound("User does not exist");
3485
- }
3486
- ctx.body = {
3487
- data: getService("user").sanitizeUser(updatedUser)
3488
- };
3489
- },
3490
- async isSSOLocked(ctx) {
3491
- const { user: user2 } = ctx.state;
3492
- const isSSOLocked = await isSsoLocked(user2);
3493
- ctx.body = {
3494
- data: {
3495
- isSSOLocked
3496
- }
3497
- };
3498
- }
1962
+ };
1963
+ };
1964
+ const DEFAULT_RETENTION_DAYS = 90;
1965
+ const defaultEvents = [
1966
+ "entry.create",
1967
+ "entry.update",
1968
+ "entry.delete",
1969
+ "entry.publish",
1970
+ "entry.unpublish",
1971
+ "media.create",
1972
+ "media.update",
1973
+ "media.delete",
1974
+ "media-folder.create",
1975
+ "media-folder.update",
1976
+ "media-folder.delete",
1977
+ "user.create",
1978
+ "user.update",
1979
+ "user.delete",
1980
+ "admin.auth.success",
1981
+ "admin.logout",
1982
+ "content-type.create",
1983
+ "content-type.update",
1984
+ "content-type.delete",
1985
+ "component.create",
1986
+ "component.update",
1987
+ "component.delete",
1988
+ "role.create",
1989
+ "role.update",
1990
+ "role.delete",
1991
+ "permission.create",
1992
+ "permission.update",
1993
+ "permission.delete"
1994
+ ];
1995
+ const getEventMap = (defaultEvents2) => {
1996
+ const getDefaultPayload = (...args) => args[0];
1997
+ return defaultEvents2.reduce((acc, event) => {
1998
+ acc[event] = getDefaultPayload;
1999
+ return acc;
2000
+ }, {});
3499
2001
  };
3500
- const ALLOWED_SORT_STRINGS = ["action:ASC", "action:DESC", "date:ASC", "date:DESC"];
3501
- const validateFindManySchema = yup.object().shape({
3502
- page: yup.number().integer().min(1),
3503
- pageSize: yup.number().integer().min(1).max(100),
3504
- sort: yup.mixed().oneOf(ALLOWED_SORT_STRINGS)
3505
- }).required();
3506
- const validateFindMany = validateYupSchema(validateFindManySchema, { strict: false });
3507
- const auditLogs = {
3508
- async findMany(ctx) {
3509
- const { query } = ctx.request;
3510
- await validateFindMany(query);
3511
- const auditLogs2 = strapi.get("audit-logs");
3512
- const body = await auditLogs2.findMany(query);
3513
- ctx.body = body;
3514
- },
3515
- async findOne(ctx) {
3516
- const { id } = ctx.params;
3517
- const auditLogs2 = strapi.get("audit-logs");
3518
- const body = await auditLogs2.findOne(id);
3519
- ctx.body = body;
3520
- strapi.telemetry.send("didWatchAnAuditLog");
2002
+ const getRetentionDays = (strapi2) => {
2003
+ const featureConfig = strapi2.ee.features.get("audit-logs");
2004
+ const licenseRetentionDays = typeof featureConfig === "object" && featureConfig?.options.retentionDays;
2005
+ const userRetentionDays = strapi2.config.get("admin.auditLogs.retentionDays");
2006
+ if (licenseRetentionDays == null) {
2007
+ return userRetentionDays ?? DEFAULT_RETENTION_DAYS;
3521
2008
  }
3522
- };
3523
- const admin = {
3524
- // NOTE: Overrides CE admin controller
3525
- async getProjectType() {
3526
- const flags = strapi.config.get("admin.flags", {});
3527
- try {
3528
- return { data: { isEE: strapi.EE, features: strapi.ee.features.list(), flags } };
3529
- } catch (err) {
3530
- return { data: { isEE: false, features: [], flags } };
3531
- }
3532
- },
3533
- async licenseLimitInformation() {
3534
- const permittedSeats = strapi.ee.seats;
3535
- let shouldNotify = false;
3536
- let licenseLimitStatus = null;
3537
- let enforcementUserCount;
3538
- const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
3539
- const eeDisabledUsers = await getService("seat-enforcement").getDisabledUserList();
3540
- if (eeDisabledUsers) {
3541
- enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;
3542
- } else {
3543
- enforcementUserCount = currentActiveUserCount;
3544
- }
3545
- if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {
3546
- shouldNotify = true;
3547
- licenseLimitStatus = "OVER_LIMIT";
3548
- }
3549
- if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {
3550
- shouldNotify = true;
3551
- licenseLimitStatus = "AT_LIMIT";
3552
- }
3553
- const data = {
3554
- enforcementUserCount,
3555
- currentActiveUserCount,
3556
- permittedSeats,
3557
- shouldNotify,
3558
- shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
3559
- licenseLimitStatus,
3560
- isHostedOnStrapiCloud: env("STRAPI_HOSTING", null) === "strapi.cloud",
3561
- features: strapi.ee.features.list() ?? []
3562
- };
3563
- return { data };
2009
+ if (userRetentionDays && userRetentionDays < licenseRetentionDays) {
2010
+ return userRetentionDays;
3564
2011
  }
2012
+ return licenseRetentionDays;
3565
2013
  };
3566
- const stageObject = yup.object().shape({
3567
- id: yup.number().integer().min(1),
3568
- name: yup.string().max(255).required(),
3569
- color: yup.string().matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
3570
- // hex color
3571
- permissions: yup.array().of(
3572
- yup.object().shape({
3573
- role: yup.number().integer().min(1).required(),
3574
- action: yup.string().oneOf([STAGE_TRANSITION_UID]).required(),
3575
- actionParameters: yup.object().shape({
3576
- from: yup.number().integer().min(1).required(),
3577
- to: yup.number().integer().min(1)
3578
- })
3579
- })
3580
- )
3581
- });
3582
- const validateUpdateStageOnEntitySchema = yup.object().shape({
3583
- id: yup.number().integer().min(1).required()
3584
- }).required();
3585
- const validateContentTypes = yup.array().of(
3586
- // @ts-expect-error yup types
3587
- yup.string().test({
3588
- name: "content-type-exists",
3589
- message: (value) => `Content type ${value.originalValue} does not exist`,
3590
- test(uid) {
3591
- return strapi.getModel(uid);
2014
+ const createAuditLogsLifecycleService = (strapi2) => {
2015
+ const state = {};
2016
+ const auditLogsService = strapi2.get("audit-logs");
2017
+ const eventMap = getEventMap(defaultEvents);
2018
+ const processEvent = (name2, ...args) => {
2019
+ const requestState = strapi2.requestContext.get()?.state;
2020
+ const isUsingAdminAuth = requestState?.route.info.type === "admin";
2021
+ const user2 = requestState?.user;
2022
+ if (!isUsingAdminAuth || !user2) {
2023
+ return null;
3592
2024
  }
3593
- }).test({
3594
- name: "content-type-review-workflow-enabled",
3595
- message: (value) => `Content type ${value.originalValue} does not have review workflow enabled`,
3596
- test(uid) {
3597
- const model = strapi.getModel(uid);
3598
- return hasStageAttribute(model);
2025
+ const getPayload = eventMap[name2];
2026
+ if (!getPayload) {
2027
+ return null;
3599
2028
  }
3600
- })
3601
- );
3602
- const validateWorkflowCreateSchema = yup.object().shape({
3603
- name: yup.string().max(255).min(1, "Workflow name can not be empty").required(),
3604
- stages: 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"),
3605
- contentTypes: validateContentTypes
3606
- });
3607
- const validateWorkflowUpdateSchema = yup.object().shape({
3608
- name: yup.string().max(255).min(1, "Workflow name can not be empty"),
3609
- stages: 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"),
3610
- contentTypes: validateContentTypes
3611
- });
3612
- const validateUpdateAssigneeOnEntitySchema = yup.object().shape({
3613
- id: yup.number().integer().min(1).nullable()
3614
- }).required();
3615
- const validateWorkflowCreate = validateYupSchema(validateWorkflowCreateSchema);
3616
- const validateUpdateStageOnEntity = validateYupSchema(validateUpdateStageOnEntitySchema);
3617
- const validateUpdateAssigneeOnEntity = validateYupSchema(
3618
- validateUpdateAssigneeOnEntitySchema
3619
- );
3620
- const validateWorkflowUpdate = validateYupSchema(validateWorkflowUpdateSchema);
3621
- function getWorkflowsPermissionChecker({ strapi: strapi2 }, userAbility) {
3622
- return strapi2.plugin("content-manager").service("permission-checker").create({ userAbility, model: WORKFLOW_MODEL_UID });
3623
- }
3624
- function formatWorkflowToAdmin(workflow2) {
3625
- if (!workflow2)
3626
- return;
3627
- if (!workflow2.stages)
3628
- return workflow2;
3629
- const transformPermissions = map(update("role", property("id")));
3630
- const transformStages = map(update("permissions", transformPermissions));
3631
- return update("stages", transformStages, workflow2);
3632
- }
3633
- const workflows = {
3634
- /**
3635
- * Create a new workflow
3636
- * @param {import('koa').BaseContext} ctx - koa context
3637
- */
3638
- async create(ctx) {
3639
- const { body, query } = ctx.request;
3640
- const { sanitizeCreateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
3641
- { strapi },
3642
- ctx.state.userAbility
3643
- );
3644
- const { populate } = await sanitizedQuery.create(query);
3645
- const workflowBody = await validateWorkflowCreate(body.data);
3646
- const workflowService = getService("workflows");
3647
- const createdWorkflow = await workflowService.create({
3648
- data: await sanitizeCreateInput(workflowBody),
3649
- populate
3650
- }).then(formatWorkflowToAdmin);
3651
- ctx.body = {
3652
- data: await sanitizeOutput(createdWorkflow)
3653
- };
3654
- },
3655
- /**
3656
- * Update a workflow
3657
- * @param {import('koa').BaseContext} ctx - koa context
3658
- */
3659
- async update(ctx) {
3660
- const { id } = ctx.params;
3661
- const { body, query } = ctx.request;
3662
- const workflowService = getService("workflows");
3663
- const { sanitizeUpdateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
3664
- { strapi },
3665
- ctx.state.userAbility
3666
- );
3667
- const { populate } = await sanitizedQuery.update(query);
3668
- const workflowBody = await validateWorkflowUpdate(body.data);
3669
- const workflow2 = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });
3670
- if (!workflow2) {
3671
- return ctx.notFound();
2029
+ const ignoredUids = ["plugin::upload.file", "plugin::upload.folder"];
2030
+ if (ignoredUids.includes(args[0]?.uid)) {
2031
+ return null;
3672
2032
  }
3673
- const getPermittedFieldToUpdate = sanitizeUpdateInput(workflow2);
3674
- const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);
3675
- const updatedWorkflow = await workflowService.update(workflow2, {
3676
- data: dataToUpdate,
3677
- populate
3678
- }).then(formatWorkflowToAdmin);
3679
- ctx.body = {
3680
- data: await sanitizeOutput(updatedWorkflow)
2033
+ return {
2034
+ action: name2,
2035
+ date: (/* @__PURE__ */ new Date()).toISOString(),
2036
+ payload: getPayload(...args) || {},
2037
+ userId: user2.id
3681
2038
  };
3682
- },
3683
- /**
3684
- * Delete a workflow
3685
- * @param {import('koa').BaseContext} ctx - koa context
3686
- */
3687
- async delete(ctx) {
3688
- const { id } = ctx.params;
3689
- const { query } = ctx.request;
3690
- const workflowService = getService("workflows");
3691
- const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
3692
- { strapi },
3693
- ctx.state.userAbility
3694
- );
3695
- const { populate } = await sanitizedQuery.delete(query);
3696
- const workflow2 = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });
3697
- if (!workflow2) {
3698
- return ctx.notFound("Workflow doesn't exist");
2039
+ };
2040
+ const handleEvent = async (name2, ...args) => {
2041
+ const processedEvent = processEvent(name2, ...args);
2042
+ if (processedEvent) {
2043
+ await strapi2.db.transaction(({ onCommit }) => {
2044
+ onCommit(() => auditLogsService.saveEvent(processedEvent));
2045
+ });
3699
2046
  }
3700
- const deletedWorkflow = await workflowService.delete(workflow2, { populate }).then(formatWorkflowToAdmin);
3701
- ctx.body = {
3702
- data: await sanitizeOutput(deletedWorkflow)
3703
- };
3704
- },
3705
- /**
3706
- * List all workflows
3707
- * @param {import('koa').BaseContext} ctx - koa context
3708
- */
3709
- async find(ctx) {
3710
- const { query } = ctx.request;
3711
- const workflowService = getService("workflows");
3712
- const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
3713
- { strapi },
3714
- ctx.state.userAbility
3715
- );
3716
- const { populate, filters, sort } = await sanitizedQuery.read(query);
3717
- const [workflows2, workflowCount] = await Promise.all([
3718
- workflowService.find({ populate, filters, sort }).then(map(formatWorkflowToAdmin)),
3719
- workflowService.count()
3720
- ]);
3721
- ctx.body = {
3722
- data: await async.map(workflows2, sanitizeOutput),
3723
- meta: {
3724
- workflowCount
2047
+ };
2048
+ return {
2049
+ async register() {
2050
+ if (!state.eeEnableUnsubscribe) {
2051
+ state.eeEnableUnsubscribe = strapi2.eventHub.on("ee.enable", () => {
2052
+ this.destroy();
2053
+ this.register();
2054
+ });
3725
2055
  }
3726
- };
3727
- },
3728
- /**
3729
- * Get one workflow based on its id contained in request parameters
3730
- * Returns count of workflows in meta, used to prevent workflow edition when
3731
- * max workflow count is reached for the current plan
3732
- * @param {import('koa').BaseContext} ctx - koa context
3733
- */
3734
- async findById(ctx) {
3735
- const { id } = ctx.params;
3736
- const { query } = ctx.request;
3737
- const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
3738
- { strapi },
3739
- ctx.state.userAbility
3740
- );
3741
- const { populate } = await sanitizedQuery.read(query);
3742
- const workflowService = getService("workflows");
3743
- const [workflow2, workflowCount] = await Promise.all([
3744
- workflowService.findById(id, { populate }).then(formatWorkflowToAdmin),
3745
- workflowService.count()
3746
- ]);
3747
- ctx.body = {
3748
- data: await sanitizeOutput(workflow2),
3749
- meta: { workflowCount }
3750
- };
3751
- }
3752
- };
3753
- function sanitizeStage({ strapi: strapi2 }, userAbility) {
3754
- const permissionChecker = strapi2.plugin("content-manager").service("permission-checker").create({ userAbility, model: STAGE_MODEL_UID });
3755
- return (entity) => permissionChecker.sanitizeOutput(entity);
3756
- }
3757
- const stages = {
3758
- /**
3759
- * List all stages
3760
- * @param {import('koa').BaseContext} ctx - koa context
3761
- */
3762
- async find(ctx) {
3763
- const { workflow_id: workflowId } = ctx.params;
3764
- const { populate } = ctx.query;
3765
- const stagesService = getService("stages");
3766
- const sanitizer = sanitizeStage({ strapi }, ctx.state.userAbility);
3767
- const stages2 = await stagesService.find({
3768
- workflowId,
3769
- populate
3770
- });
3771
- ctx.body = {
3772
- data: await async.map(stages2, sanitizer)
3773
- };
3774
- },
3775
- /**
3776
- * Get one stage
3777
- * @param {import('koa').BaseContext} ctx - koa context
3778
- */
3779
- async findById(ctx) {
3780
- const { id, workflow_id: workflowId } = ctx.params;
3781
- const { populate } = ctx.query;
3782
- const stagesService = getService("stages");
3783
- const sanitizer = sanitizeStage({ strapi }, ctx.state.userAbility);
3784
- const stage = await stagesService.findById(id, {
3785
- workflowId,
3786
- populate
3787
- });
3788
- ctx.body = {
3789
- data: await sanitizer(stage)
3790
- };
3791
- },
3792
- /**
3793
- * Updates an entity's stage.
3794
- * @async
3795
- * @param {Object} ctx - The Koa context object.
3796
- * @param {Object} ctx.params - An object containing the parameters from the request URL.
3797
- * @param {string} ctx.params.model_uid - The model UID of the entity.
3798
- * @param {string} ctx.params.id - The ID of the entity to update.
3799
- * @param {Object} ctx.request.body.data - Optional data object containing the new stage ID for the entity.
3800
- * @param {string} ctx.request.body.data.id - The ID of the new stage for the entity.
3801
- * @throws {ApplicationError} If review workflows is not activated on the specified model UID.
3802
- * @throws {ValidationError} If the `data` object in the request body fails to pass validation.
3803
- * @returns {Promise<void>} A promise that resolves when the entity's stage has been updated.
3804
- */
3805
- async updateEntity(ctx) {
3806
- const stagesService = getService("stages");
3807
- const stagePermissions2 = getService("stage-permissions");
3808
- const workflowService = getService("workflows");
3809
- const { model_uid: modelUID, id } = ctx.params;
3810
- const { body } = ctx.request;
3811
- const { sanitizeOutput } = strapi.plugin("content-manager").service("permission-checker").create({ userAbility: ctx.state.userAbility, model: modelUID });
3812
- const entity = await strapi.db.query(modelUID).findOne({
3813
- where: { id },
3814
- populate: [ENTITY_STAGE_ATTRIBUTE]
3815
- });
3816
- if (!entity) {
3817
- ctx.throw(404, "Entity not found");
3818
- }
3819
- const canTransition = stagePermissions2.can(
3820
- STAGE_TRANSITION_UID,
3821
- entity[ENTITY_STAGE_ATTRIBUTE]?.id
3822
- );
3823
- if (!canTransition) {
3824
- ctx.throw(403, "Forbidden stage transition");
3825
- }
3826
- const { id: stageId } = await validateUpdateStageOnEntity(
3827
- { id: Number(body?.data?.id) },
3828
- "You should pass an id to the body of the put request."
3829
- );
3830
- const workflow2 = await workflowService.assertContentTypeBelongsToWorkflow(modelUID);
3831
- workflowService.assertStageBelongsToWorkflow(stageId, workflow2);
3832
- const updatedEntity = await stagesService.updateEntity({ id: entity.id, modelUID }, stageId);
3833
- ctx.body = { data: await sanitizeOutput(updatedEntity) };
3834
- },
3835
- /**
3836
- * List all the stages that are available for a user to transition an entity to.
3837
- * If the user has permission to change the current stage of the entity every other stage in the workflow is returned
3838
- * @async
3839
- * @param {*} ctx
3840
- * @param {string} ctx.params.model_uid - The model UID of the entity.
3841
- * @param {string} ctx.params.id - The ID of the entity.
3842
- * @throws {ApplicationError} If review workflows is not activated on the specified model UID.
3843
- */
3844
- async listAvailableStages(ctx) {
3845
- const stagePermissions2 = getService("stage-permissions");
3846
- const workflowService = getService("workflows");
3847
- const { model_uid: modelUID, id } = ctx.params;
3848
- if (strapi.plugin("content-manager").service("permission-checker").create({ userAbility: ctx.state.userAbility, model: modelUID }).cannot.read()) {
3849
- return ctx.forbidden();
3850
- }
3851
- const entity = await strapi.db.query(modelUID).findOne({
3852
- where: { id },
3853
- populate: [ENTITY_STAGE_ATTRIBUTE]
3854
- });
3855
- if (!entity) {
3856
- ctx.throw(404, "Entity not found");
2056
+ if (!state.eeUpdateUnsubscribe) {
2057
+ state.eeUpdateUnsubscribe = strapi2.eventHub.on("ee.update", () => {
2058
+ this.destroy();
2059
+ this.register();
2060
+ });
2061
+ }
2062
+ state.eeDisableUnsubscribe = strapi2.eventHub.on("ee.disable", () => {
2063
+ this.destroy();
2064
+ });
2065
+ if (!strapi2.ee.features.isEnabled("audit-logs")) {
2066
+ return this;
2067
+ }
2068
+ state.eventHubUnsubscribe = strapi2.eventHub.subscribe(handleEvent);
2069
+ const retentionDays = getRetentionDays(strapi2);
2070
+ state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
2071
+ const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1e3);
2072
+ auditLogsService.deleteExpiredEvents(expirationDate);
2073
+ });
2074
+ return this;
2075
+ },
2076
+ unsubscribe() {
2077
+ if (state.eeDisableUnsubscribe) {
2078
+ state.eeDisableUnsubscribe();
2079
+ }
2080
+ if (state.eventHubUnsubscribe) {
2081
+ state.eventHubUnsubscribe();
2082
+ }
2083
+ if (state.deleteExpiredJob) {
2084
+ state.deleteExpiredJob.cancel();
2085
+ }
2086
+ return this;
2087
+ },
2088
+ destroy() {
2089
+ return this.unsubscribe();
3857
2090
  }
3858
- const entityStageId = entity[ENTITY_STAGE_ATTRIBUTE]?.id;
3859
- const canTransition = stagePermissions2.can(STAGE_TRANSITION_UID, entityStageId);
3860
- const [workflowCount, { stages: workflowStages }] = await Promise.all([
3861
- workflowService.count(),
3862
- workflowService.getAssignedWorkflow(modelUID, {
3863
- populate: "stages"
3864
- })
3865
- ]);
3866
- const meta = {
3867
- stageCount: workflowStages.length,
3868
- workflowCount
3869
- };
3870
- if (!canTransition) {
3871
- ctx.body = {
3872
- data: [],
3873
- meta
3874
- };
3875
- return;
2091
+ };
2092
+ };
2093
+ const auditLog = {
2094
+ schema: {
2095
+ kind: "collectionType",
2096
+ collectionName: "strapi_audit_logs",
2097
+ info: {
2098
+ singularName: "audit-log",
2099
+ pluralName: "audit-logs",
2100
+ displayName: "Audit Log"
2101
+ },
2102
+ options: {
2103
+ timestamps: false
2104
+ },
2105
+ pluginOptions: {
2106
+ "content-manager": {
2107
+ visible: false
2108
+ },
2109
+ "content-type-builder": {
2110
+ visible: false
2111
+ }
2112
+ },
2113
+ attributes: {
2114
+ action: {
2115
+ type: "string",
2116
+ required: true
2117
+ },
2118
+ date: {
2119
+ type: "datetime",
2120
+ required: true
2121
+ },
2122
+ user: {
2123
+ type: "relation",
2124
+ relation: "oneToOne",
2125
+ target: "admin::user"
2126
+ },
2127
+ payload: {
2128
+ type: "json"
2129
+ }
3876
2130
  }
3877
- const data = workflowStages.filter((stage) => stage.id !== entityStageId);
3878
- ctx.body = {
3879
- data,
3880
- meta
3881
- };
3882
2131
  }
3883
2132
  };
3884
- const assignees = {
3885
- /**
3886
- * Updates an entity's assignee.
3887
- * @async
3888
- * @param {Object} ctx - The Koa context object.
3889
- * @param {Object} ctx.params - An object containing the parameters from the request URL.
3890
- * @param {string} ctx.params.model_uid - The model UID of the entity.
3891
- * @param {string} ctx.params.id - The ID of the entity to update.
3892
- * @param {Object} ctx.request.body.data - Optional data object containing the new assignee ID for the entity.
3893
- * @param {string} ctx.request.body.data.id - The ID of the new assignee for the entity.
3894
- * @throws {ApplicationError} If review workflows is not activated on the specified model UID.
3895
- * @throws {ValidationError} If the `data` object in the request body fails to pass validation.
3896
- * @returns {Promise<void>} A promise that resolves when the entity's assignee has been updated.
3897
- */
3898
- async updateEntity(ctx) {
3899
- const assigneeService = getService("assignees");
3900
- const workflowService = getService("workflows");
3901
- const { model_uid: model, id } = ctx.params;
3902
- const { sanitizeOutput } = strapi.plugin("content-manager").service("permission-checker").create({ userAbility: ctx.state.userAbility, model });
3903
- const { id: assigneeId } = await validateUpdateAssigneeOnEntity(
3904
- ctx.request?.body?.data,
3905
- "You should pass a valid id to the body of the put request."
3906
- );
3907
- await workflowService.assertContentTypeBelongsToWorkflow(model);
3908
- const entity = await assigneeService.updateEntityAssignee(id, model, assigneeId);
3909
- ctx.body = { data: await sanitizeOutput(entity) };
2133
+ const getAdminEE = () => {
2134
+ const eeAdmin = {
2135
+ register,
2136
+ bootstrap,
2137
+ destroy,
2138
+ contentTypes: {
2139
+ // Always register the audit-log content type to prevent data loss
2140
+ "audit-log": auditLog,
2141
+ ...adminContentTypes
2142
+ },
2143
+ services,
2144
+ controllers,
2145
+ routes
2146
+ };
2147
+ if (strapi.config.get("admin.auditLogs.enabled", true) && strapi.ee.features.isEnabled("audit-logs")) {
2148
+ return {
2149
+ ...eeAdmin,
2150
+ controllers: {
2151
+ ...eeAdmin.controllers,
2152
+ "audit-logs": auditLogsController
2153
+ },
2154
+ routes: {
2155
+ ...eeAdmin.routes,
2156
+ "audit-logs": auditLogsRoutes
2157
+ },
2158
+ async register({ strapi: strapi2 }) {
2159
+ await eeAdmin.register({ strapi: strapi2 });
2160
+ strapi2.add("audit-logs", createAuditLogsService(strapi2));
2161
+ const auditLogsLifecycle = createAuditLogsLifecycleService(strapi2);
2162
+ strapi2.add("audit-logs-lifecycle", auditLogsLifecycle);
2163
+ await auditLogsLifecycle.register();
2164
+ },
2165
+ async destroy({ strapi: strapi2 }) {
2166
+ strapi2.get("audit-logs-lifecycle").destroy();
2167
+ await eeAdmin.destroy({ strapi: strapi2 });
2168
+ }
2169
+ };
3910
2170
  }
2171
+ return eeAdmin;
3911
2172
  };
3912
- const index = {
3913
- authentication,
3914
- role,
3915
- user,
3916
- auditLogs,
3917
- admin,
3918
- workflows,
3919
- stages,
3920
- assignees
3921
- };
2173
+ const index = getAdminEE();
3922
2174
  export {
3923
- bootstrap,
3924
- index$3 as contentTypes,
3925
- index as controllers,
3926
- destroy,
3927
- register,
3928
- index$2 as routes,
3929
- index$1 as services
2175
+ index as default
3930
2176
  };
3931
2177
  //# sourceMappingURL=index.mjs.map