@strapi/admin 5.33.3 → 5.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/dist/admin/admin/src/components/GradientBadge.js +18 -2
  2. package/dist/admin/admin/src/components/GradientBadge.js.map +1 -1
  3. package/dist/admin/admin/src/components/GradientBadge.mjs +19 -3
  4. package/dist/admin/admin/src/components/GradientBadge.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/Layouts/ActionLayout.js +8 -1
  6. package/dist/admin/admin/src/components/Layouts/ActionLayout.js.map +1 -1
  7. package/dist/admin/admin/src/components/Layouts/ActionLayout.mjs +8 -1
  8. package/dist/admin/admin/src/components/Layouts/ActionLayout.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/Layouts/ContentLayout.js +4 -0
  10. package/dist/admin/admin/src/components/Layouts/ContentLayout.js.map +1 -1
  11. package/dist/admin/admin/src/components/Layouts/ContentLayout.mjs +4 -0
  12. package/dist/admin/admin/src/components/Layouts/ContentLayout.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/Layouts/HeaderLayout.js +80 -49
  14. package/dist/admin/admin/src/components/Layouts/HeaderLayout.js.map +1 -1
  15. package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs +81 -50
  16. package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/LeftMenu.js +3 -1
  18. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  19. package/dist/admin/admin/src/components/LeftMenu.mjs +3 -1
  20. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/MainNav/MainNavLinks.js +32 -30
  22. package/dist/admin/admin/src/components/MainNav/MainNavLinks.js.map +1 -1
  23. package/dist/admin/admin/src/components/MainNav/MainNavLinks.mjs +32 -30
  24. package/dist/admin/admin/src/components/MainNav/MainNavLinks.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/MainNav/NavBrand.js +38 -31
  26. package/dist/admin/admin/src/components/MainNav/NavBrand.js.map +1 -1
  27. package/dist/admin/admin/src/components/MainNav/NavBrand.mjs +38 -31
  28. package/dist/admin/admin/src/components/MainNav/NavBrand.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js +14 -3
  30. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js.map +1 -1
  31. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.mjs +15 -4
  32. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.mjs.map +1 -1
  33. package/dist/admin/admin/src/components/MainNav/NavLink.js +51 -4
  34. package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
  35. package/dist/admin/admin/src/components/MainNav/NavLink.mjs +52 -5
  36. package/dist/admin/admin/src/components/MainNav/NavLink.mjs.map +1 -1
  37. package/dist/admin/admin/src/components/NpsSurvey.js +1 -2
  38. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  39. package/dist/admin/admin/src/components/NpsSurvey.mjs +1 -2
  40. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  41. package/dist/admin/admin/src/components/SubNav.js +44 -18
  42. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  43. package/dist/admin/admin/src/components/SubNav.mjs +45 -19
  44. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  45. package/dist/admin/admin/src/constants/theme.js +3 -1
  46. package/dist/admin/admin/src/constants/theme.js.map +1 -1
  47. package/dist/admin/admin/src/constants/theme.mjs +3 -2
  48. package/dist/admin/admin/src/constants/theme.mjs.map +1 -1
  49. package/dist/admin/admin/src/core/apis/router.js.map +1 -1
  50. package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
  51. package/dist/admin/admin/src/features/Tracking.js +1 -2
  52. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  53. package/dist/admin/admin/src/features/Tracking.mjs +1 -2
  54. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  55. package/dist/admin/admin/src/hooks/useMenu.js +2 -1
  56. package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
  57. package/dist/admin/admin/src/hooks/useMenu.mjs +2 -1
  58. package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
  59. package/dist/admin/admin/src/pages/Auth/components/Register.js +2 -1
  60. package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
  61. package/dist/admin/admin/src/pages/Auth/components/Register.mjs +2 -1
  62. package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
  63. package/dist/admin/admin/src/pages/Home/HomePage.js +1 -0
  64. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  65. package/dist/admin/admin/src/pages/Home/HomePage.mjs +1 -0
  66. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  67. package/dist/admin/admin/src/pages/ProfilePage.js +1 -0
  68. package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
  69. package/dist/admin/admin/src/pages/ProfilePage.mjs +1 -0
  70. package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
  71. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +7 -2
  72. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  73. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +7 -2
  74. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  75. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +44 -26
  76. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
  77. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +45 -27
  78. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
  79. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +1 -0
  80. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
  81. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +1 -0
  82. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
  83. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +1 -0
  84. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  85. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +1 -0
  86. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  87. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +3 -0
  88. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
  89. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs +3 -0
  90. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs.map +1 -1
  91. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js +9 -11
  92. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js.map +1 -1
  93. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs +10 -12
  94. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs.map +1 -1
  95. package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js +1 -0
  96. package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js.map +1 -1
  97. package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.mjs +1 -0
  98. package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.mjs.map +1 -1
  99. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js +1 -0
  100. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js.map +1 -1
  101. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.mjs +1 -0
  102. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.mjs.map +1 -1
  103. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js +1 -0
  104. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js.map +1 -1
  105. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs +1 -0
  106. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs.map +1 -1
  107. package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.js +1 -0
  108. package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.js.map +1 -1
  109. package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.mjs +1 -0
  110. package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.mjs.map +1 -1
  111. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js +1 -0
  112. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js.map +1 -1
  113. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs +1 -0
  114. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs.map +1 -1
  115. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js +3 -0
  116. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js.map +1 -1
  117. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs +3 -0
  118. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs.map +1 -1
  119. package/dist/admin/admin/src/render.js +0 -1
  120. package/dist/admin/admin/src/render.js.map +1 -1
  121. package/dist/admin/admin/src/render.mjs +0 -1
  122. package/dist/admin/admin/src/render.mjs.map +1 -1
  123. package/dist/admin/admin/src/router.js +0 -9
  124. package/dist/admin/admin/src/router.js.map +1 -1
  125. package/dist/admin/admin/src/router.mjs +0 -9
  126. package/dist/admin/admin/src/router.mjs.map +1 -1
  127. package/dist/admin/admin/src/translations/ar.json.js +0 -42
  128. package/dist/admin/admin/src/translations/ar.json.js.map +1 -1
  129. package/dist/admin/admin/src/translations/ar.json.mjs +0 -42
  130. package/dist/admin/admin/src/translations/ar.json.mjs.map +1 -1
  131. package/dist/admin/admin/src/translations/ca.json.js +0 -21
  132. package/dist/admin/admin/src/translations/ca.json.js.map +1 -1
  133. package/dist/admin/admin/src/translations/ca.json.mjs +0 -21
  134. package/dist/admin/admin/src/translations/ca.json.mjs.map +1 -1
  135. package/dist/admin/admin/src/translations/de.json.js +422 -66
  136. package/dist/admin/admin/src/translations/de.json.js.map +1 -1
  137. package/dist/admin/admin/src/translations/de.json.mjs +419 -67
  138. package/dist/admin/admin/src/translations/de.json.mjs.map +1 -1
  139. package/dist/admin/admin/src/translations/dk.json.js +0 -6
  140. package/dist/admin/admin/src/translations/dk.json.js.map +1 -1
  141. package/dist/admin/admin/src/translations/dk.json.mjs +0 -6
  142. package/dist/admin/admin/src/translations/dk.json.mjs.map +1 -1
  143. package/dist/admin/admin/src/translations/en.json.js +0 -44
  144. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  145. package/dist/admin/admin/src/translations/en.json.mjs +0 -44
  146. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  147. package/dist/admin/admin/src/translations/es.json.js +0 -25
  148. package/dist/admin/admin/src/translations/es.json.js.map +1 -1
  149. package/dist/admin/admin/src/translations/es.json.mjs +0 -25
  150. package/dist/admin/admin/src/translations/es.json.mjs.map +1 -1
  151. package/dist/admin/admin/src/translations/eu.json.js +0 -43
  152. package/dist/admin/admin/src/translations/eu.json.js.map +1 -1
  153. package/dist/admin/admin/src/translations/eu.json.mjs +0 -43
  154. package/dist/admin/admin/src/translations/eu.json.mjs.map +1 -1
  155. package/dist/admin/admin/src/translations/fr.json.js +0 -6
  156. package/dist/admin/admin/src/translations/fr.json.js.map +1 -1
  157. package/dist/admin/admin/src/translations/fr.json.mjs +0 -6
  158. package/dist/admin/admin/src/translations/fr.json.mjs.map +1 -1
  159. package/dist/admin/admin/src/translations/gu.json.js +0 -21
  160. package/dist/admin/admin/src/translations/gu.json.js.map +1 -1
  161. package/dist/admin/admin/src/translations/gu.json.mjs +0 -21
  162. package/dist/admin/admin/src/translations/gu.json.mjs.map +1 -1
  163. package/dist/admin/admin/src/translations/hi.json.js +0 -21
  164. package/dist/admin/admin/src/translations/hi.json.js.map +1 -1
  165. package/dist/admin/admin/src/translations/hi.json.mjs +0 -21
  166. package/dist/admin/admin/src/translations/hi.json.mjs.map +1 -1
  167. package/dist/admin/admin/src/translations/hu.json.js +0 -43
  168. package/dist/admin/admin/src/translations/hu.json.js.map +1 -1
  169. package/dist/admin/admin/src/translations/hu.json.mjs +0 -43
  170. package/dist/admin/admin/src/translations/hu.json.mjs.map +1 -1
  171. package/dist/admin/admin/src/translations/it.json.js +613 -3
  172. package/dist/admin/admin/src/translations/it.json.js.map +1 -1
  173. package/dist/admin/admin/src/translations/it.json.mjs +605 -4
  174. package/dist/admin/admin/src/translations/it.json.mjs.map +1 -1
  175. package/dist/admin/admin/src/translations/ja.json.js +0 -6
  176. package/dist/admin/admin/src/translations/ja.json.js.map +1 -1
  177. package/dist/admin/admin/src/translations/ja.json.mjs +0 -6
  178. package/dist/admin/admin/src/translations/ja.json.mjs.map +1 -1
  179. package/dist/admin/admin/src/translations/ko.json.js +0 -6
  180. package/dist/admin/admin/src/translations/ko.json.js.map +1 -1
  181. package/dist/admin/admin/src/translations/ko.json.mjs +0 -6
  182. package/dist/admin/admin/src/translations/ko.json.mjs.map +1 -1
  183. package/dist/admin/admin/src/translations/ml.json.js +0 -21
  184. package/dist/admin/admin/src/translations/ml.json.js.map +1 -1
  185. package/dist/admin/admin/src/translations/ml.json.mjs +0 -21
  186. package/dist/admin/admin/src/translations/ml.json.mjs.map +1 -1
  187. package/dist/admin/admin/src/translations/nl.json.js +0 -39
  188. package/dist/admin/admin/src/translations/nl.json.js.map +1 -1
  189. package/dist/admin/admin/src/translations/nl.json.mjs +0 -39
  190. package/dist/admin/admin/src/translations/nl.json.mjs.map +1 -1
  191. package/dist/admin/admin/src/translations/pl.json.js +0 -21
  192. package/dist/admin/admin/src/translations/pl.json.js.map +1 -1
  193. package/dist/admin/admin/src/translations/pl.json.mjs +0 -21
  194. package/dist/admin/admin/src/translations/pl.json.mjs.map +1 -1
  195. package/dist/admin/admin/src/translations/pt-BR.json.js +0 -25
  196. package/dist/admin/admin/src/translations/pt-BR.json.js.map +1 -1
  197. package/dist/admin/admin/src/translations/pt-BR.json.mjs +0 -25
  198. package/dist/admin/admin/src/translations/pt-BR.json.mjs.map +1 -1
  199. package/dist/admin/admin/src/translations/ru.json.js +0 -44
  200. package/dist/admin/admin/src/translations/ru.json.js.map +1 -1
  201. package/dist/admin/admin/src/translations/ru.json.mjs +0 -44
  202. package/dist/admin/admin/src/translations/ru.json.mjs.map +1 -1
  203. package/dist/admin/admin/src/translations/sa.json.js +0 -21
  204. package/dist/admin/admin/src/translations/sa.json.js.map +1 -1
  205. package/dist/admin/admin/src/translations/sa.json.mjs +0 -21
  206. package/dist/admin/admin/src/translations/sa.json.mjs.map +1 -1
  207. package/dist/admin/admin/src/translations/sv.json.js +0 -39
  208. package/dist/admin/admin/src/translations/sv.json.js.map +1 -1
  209. package/dist/admin/admin/src/translations/sv.json.mjs +0 -39
  210. package/dist/admin/admin/src/translations/sv.json.mjs.map +1 -1
  211. package/dist/admin/admin/src/translations/tr.json.js +0 -39
  212. package/dist/admin/admin/src/translations/tr.json.js.map +1 -1
  213. package/dist/admin/admin/src/translations/tr.json.mjs +0 -39
  214. package/dist/admin/admin/src/translations/tr.json.mjs.map +1 -1
  215. package/dist/admin/admin/src/translations/uk.json.js +0 -44
  216. package/dist/admin/admin/src/translations/uk.json.js.map +1 -1
  217. package/dist/admin/admin/src/translations/uk.json.mjs +0 -44
  218. package/dist/admin/admin/src/translations/uk.json.mjs.map +1 -1
  219. package/dist/admin/admin/src/translations/vi.json.js +0 -44
  220. package/dist/admin/admin/src/translations/vi.json.js.map +1 -1
  221. package/dist/admin/admin/src/translations/vi.json.mjs +0 -44
  222. package/dist/admin/admin/src/translations/vi.json.mjs.map +1 -1
  223. package/dist/admin/admin/src/translations/zh-Hans.json.js +0 -44
  224. package/dist/admin/admin/src/translations/zh-Hans.json.js.map +1 -1
  225. package/dist/admin/admin/src/translations/zh-Hans.json.mjs +0 -44
  226. package/dist/admin/admin/src/translations/zh-Hans.json.mjs.map +1 -1
  227. package/dist/admin/admin/src/translations/zh.json.js +0 -39
  228. package/dist/admin/admin/src/translations/zh.json.js.map +1 -1
  229. package/dist/admin/admin/src/translations/zh.json.mjs +0 -39
  230. package/dist/admin/admin/src/translations/zh.json.mjs.map +1 -1
  231. package/dist/admin/admin/tests/mockData.js +0 -1413
  232. package/dist/admin/admin/tests/mockData.js.map +1 -1
  233. package/dist/admin/admin/tests/mockData.mjs +0 -1413
  234. package/dist/admin/admin/tests/mockData.mjs.map +1 -1
  235. package/dist/admin/admin/tests/server.js +0 -99
  236. package/dist/admin/admin/tests/server.js.map +1 -1
  237. package/dist/admin/admin/tests/server.mjs +0 -80
  238. package/dist/admin/admin/tests/server.mjs.map +1 -1
  239. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +1 -0
  240. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  241. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +1 -0
  242. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  243. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.js +2 -0
  244. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.js.map +1 -1
  245. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.mjs +2 -0
  246. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.mjs.map +1 -1
  247. package/dist/admin/src/components/MainNav/NavLink.d.ts +2 -1
  248. package/dist/admin/src/constants/theme.d.ts +3 -2
  249. package/dist/admin/src/core/apis/router.d.ts +1 -0
  250. package/dist/admin/src/features/Tracking.d.ts +1 -2
  251. package/dist/admin/src/hooks/useMenu.d.ts +1 -0
  252. package/dist/admin/src/services/admin.d.ts +0 -1
  253. package/dist/admin/tests/mockData.d.ts +0 -972
  254. package/dist/ee/server/src/controllers/admin.d.ts +0 -1
  255. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  256. package/dist/ee/server/src/controllers/index.d.ts +0 -1
  257. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  258. package/dist/ee/server/src/index.d.ts +0 -1
  259. package/dist/ee/server/src/index.d.ts.map +1 -1
  260. package/dist/server/ee/server/src/controllers/admin.js +0 -1
  261. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  262. package/dist/server/ee/server/src/controllers/admin.mjs +0 -1
  263. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  264. package/dist/server/server/src/controllers/admin.js +0 -2
  265. package/dist/server/server/src/controllers/admin.js.map +1 -1
  266. package/dist/server/server/src/controllers/admin.mjs +0 -2
  267. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  268. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js +53 -0
  269. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js.map +1 -0
  270. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs +51 -0
  271. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs.map +1 -0
  272. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js +7 -8
  273. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
  274. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs +10 -11
  275. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
  276. package/dist/server/server/src/services/permission/permissions-manager/validate.js +7 -8
  277. package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
  278. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs +10 -11
  279. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
  280. package/dist/server/src/controllers/admin.d.ts +0 -1
  281. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  282. package/dist/server/src/controllers/index.d.ts +0 -1
  283. package/dist/server/src/controllers/index.d.ts.map +1 -1
  284. package/dist/server/src/index.d.ts +0 -1
  285. package/dist/server/src/index.d.ts.map +1 -1
  286. package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts +21 -0
  287. package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -0
  288. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
  289. package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
  290. package/dist/shared/contracts/admin.d.ts +0 -1
  291. package/dist/shared/contracts/admin.d.ts.map +1 -1
  292. package/package.json +9 -9
  293. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.js +0 -339
  294. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.js.map +0 -1
  295. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.mjs +0 -317
  296. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.mjs.map +0 -1
  297. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.js +0 -329
  298. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.js.map +0 -1
  299. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.mjs +0 -308
  300. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.mjs.map +0 -1
  301. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.js +0 -121
  302. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.js.map +0 -1
  303. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.mjs +0 -119
  304. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.mjs.map +0 -1
  305. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesGrid.js +0 -93
  306. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesGrid.js.map +0 -1
  307. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesGrid.mjs +0 -91
  308. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesGrid.mjs.map +0 -1
  309. package/dist/admin/admin/src/pages/Marketplace/components/OfflineLayout.js +0 -81
  310. package/dist/admin/admin/src/pages/Marketplace/components/OfflineLayout.js.map +0 -1
  311. package/dist/admin/admin/src/pages/Marketplace/components/OfflineLayout.mjs +0 -79
  312. package/dist/admin/admin/src/pages/Marketplace/components/OfflineLayout.mjs.map +0 -1
  313. package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.js +0 -38
  314. package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.js.map +0 -1
  315. package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.mjs +0 -36
  316. package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.mjs.map +0 -1
  317. package/dist/admin/admin/src/pages/Marketplace/components/SortSelect.js +0 -85
  318. package/dist/admin/admin/src/pages/Marketplace/components/SortSelect.js.map +0 -1
  319. package/dist/admin/admin/src/pages/Marketplace/components/SortSelect.mjs +0 -83
  320. package/dist/admin/admin/src/pages/Marketplace/components/SortSelect.mjs.map +0 -1
  321. package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.js +0 -134
  322. package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.js.map +0 -1
  323. package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.mjs +0 -113
  324. package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.mjs.map +0 -1
  325. package/dist/admin/admin/src/pages/Marketplace/hooks/useNavigatorOnline.js +0 -44
  326. package/dist/admin/admin/src/pages/Marketplace/hooks/useNavigatorOnline.js.map +0 -1
  327. package/dist/admin/admin/src/pages/Marketplace/hooks/useNavigatorOnline.mjs +0 -23
  328. package/dist/admin/admin/src/pages/Marketplace/hooks/useNavigatorOnline.mjs.map +0 -1
  329. package/dist/admin/src/pages/Marketplace/MarketplacePage.d.ts +0 -19
  330. package/dist/admin/src/pages/Marketplace/components/NpmPackageCard.d.ts +0 -13
  331. package/dist/admin/src/pages/Marketplace/components/NpmPackagesFilters.d.ts +0 -13
  332. package/dist/admin/src/pages/Marketplace/components/NpmPackagesGrid.d.ts +0 -13
  333. package/dist/admin/src/pages/Marketplace/components/OfflineLayout.d.ts +0 -2
  334. package/dist/admin/src/pages/Marketplace/components/PageHeader.d.ts +0 -8
  335. package/dist/admin/src/pages/Marketplace/components/SortSelect.d.ts +0 -51
  336. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +0 -93
  337. package/dist/admin/src/pages/Marketplace/hooks/useNavigatorOnline.d.ts +0 -5
@@ -34,7 +34,6 @@ declare const _default: {
34
34
  shouldStopCreate: boolean;
35
35
  licenseLimitStatus: string | null;
36
36
  isHostedOnStrapiCloud: boolean;
37
- aiLicenseKey: string | undefined;
38
37
  type: string | null | undefined;
39
38
  isTrial: boolean;
40
39
  features: {
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/controllers/admin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBAoEE"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/controllers/admin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBAmEE"}
@@ -52,7 +52,6 @@ declare const _default: {
52
52
  shouldStopCreate: boolean;
53
53
  licenseLimitStatus: string | null;
54
54
  isHostedOnStrapiCloud: boolean;
55
- aiLicenseKey: string | undefined;
56
55
  type: string | null | undefined;
57
56
  isTrial: boolean;
58
57
  features: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/controllers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wBAKE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/controllers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wBAKE"}
@@ -63,7 +63,6 @@ declare const getAdminEE: () => {
63
63
  shouldStopCreate: boolean;
64
64
  licenseLimitStatus: string | null;
65
65
  isHostedOnStrapiCloud: boolean;
66
- aiLicenseKey: string | undefined;
67
66
  type: string | null | undefined;
68
67
  isTrial: boolean;
69
68
  features: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../ee/server/src/index.ts"],"names":[],"mappings":";AAcA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAiCe;QAAE,MAAM,EAAE,KAAK,MAAM,CAAA;KAAE;wBAmBxB;QAAE,MAAM,EAAE,KAAK,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOpD,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../ee/server/src/index.ts"],"names":[],"mappings":";AAcA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAiCe;QAAE,MAAM,EAAE,KAAK,MAAM,CAAA;KAAE;wBAmBxB;QAAE,MAAM,EAAE,KAAK,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOpD,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -66,7 +66,6 @@ var admin = {
66
66
  shouldStopCreate: fp.isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
67
67
  licenseLimitStatus,
68
68
  isHostedOnStrapiCloud: utils.env('STRAPI_HOSTING', null) === 'strapi.cloud',
69
- aiLicenseKey: utils.env('STRAPI_ADMIN_AI_LICENSE'),
70
69
  type: strapi.ee.type,
71
70
  isTrial: strapi.ee.isTrial,
72
71
  features: strapi.ee.features.list() ?? []
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\nimport { getService } from '../utils';\nimport path from 'path';\nimport fs from 'fs';\nimport crypto from 'crypto';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n const isAILicense = strapi.ee.features.isEnabled('cms-ai');\n const isAIConfigured = strapi.config.get('admin.ai', { enabled: isAILicense });\n\n try {\n return {\n data: {\n isEE: strapi.EE,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type,\n ai: {\n enabled: isAILicense && isAIConfigured.enabled,\n },\n },\n };\n } catch (err) {\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n aiLicenseKey: env('STRAPI_ADMIN_AI_LICENSE'),\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","isAILicense","ee","features","isEnabled","isAIConfigured","enabled","data","isEE","EE","isTrial","list","type","ai","err","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env","aiLicenseKey"],"mappings":"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"}
1
+ {"version":3,"file":"admin.js","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\nimport { getService } from '../utils';\nimport path from 'path';\nimport fs from 'fs';\nimport crypto from 'crypto';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n const isAILicense = strapi.ee.features.isEnabled('cms-ai');\n const isAIConfigured = strapi.config.get('admin.ai', { enabled: isAILicense });\n\n try {\n return {\n data: {\n isEE: strapi.EE,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type,\n ai: {\n enabled: isAILicense && isAIConfigured.enabled,\n },\n },\n };\n } catch (err) {\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","isAILicense","ee","features","isEnabled","isAIConfigured","enabled","data","isEE","EE","isTrial","list","type","ai","err","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":"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"}
@@ -64,7 +64,6 @@ var admin = {
64
64
  shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
65
65
  licenseLimitStatus,
66
66
  isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',
67
- aiLicenseKey: env('STRAPI_ADMIN_AI_LICENSE'),
68
67
  type: strapi.ee.type,
69
68
  isTrial: strapi.ee.isTrial,
70
69
  features: strapi.ee.features.list() ?? []
@@ -1 +1 @@
1
- {"version":3,"file":"admin.mjs","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\nimport { getService } from '../utils';\nimport path from 'path';\nimport fs from 'fs';\nimport crypto from 'crypto';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n const isAILicense = strapi.ee.features.isEnabled('cms-ai');\n const isAIConfigured = strapi.config.get('admin.ai', { enabled: isAILicense });\n\n try {\n return {\n data: {\n isEE: strapi.EE,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type,\n ai: {\n enabled: isAILicense && isAIConfigured.enabled,\n },\n },\n };\n } catch (err) {\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n aiLicenseKey: env('STRAPI_ADMIN_AI_LICENSE'),\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","isAILicense","ee","features","isEnabled","isAIConfigured","enabled","data","isEE","EE","isTrial","list","type","ai","err","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env","aiLicenseKey"],"mappings":"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"}
1
+ {"version":3,"file":"admin.mjs","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\nimport { getService } from '../utils';\nimport path from 'path';\nimport fs from 'fs';\nimport crypto from 'crypto';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n const isAILicense = strapi.ee.features.isEnabled('cms-ai');\n const isAIConfigured = strapi.config.get('admin.ai', { enabled: isAILicense });\n\n try {\n return {\n data: {\n isEE: strapi.EE,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type,\n ai: {\n enabled: isAILicense && isAIConfigured.enabled,\n },\n },\n };\n } catch (err) {\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","isAILicense","ee","features","isEnabled","isAIConfigured","enabled","data","isEE","EE","isTrial","list","type","ai","err","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":";;;;AAQA,YAAe;;IAEb,MAAMA,cAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,QAAQC,MAAOC,CAAAA,MAAM,CAACC,GAAG,CAAC,eAAe,EAAC,CAAA;AAChD,QAAA,MAAMC,cAAcH,MAAOI,CAAAA,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,QAAA,CAAA;AACjD,QAAA,MAAMC,iBAAiBP,MAAOC,CAAAA,MAAM,CAACC,GAAG,CAAC,UAAY,EAAA;YAAEM,OAASL,EAAAA;AAAY,SAAA,CAAA;QAE5E,IAAI;YACF,OAAO;gBACLM,IAAM,EAAA;AACJC,oBAAAA,IAAAA,EAAMV,OAAOW,EAAE;oBACfC,OAASZ,EAAAA,MAAAA,CAAOI,EAAE,CAACQ,OAAO;AAC1BP,oBAAAA,QAAAA,EAAUL,MAAOI,CAAAA,EAAE,CAACC,QAAQ,CAACQ,IAAI,EAAA;AACjCd,oBAAAA,KAAAA;oBACAe,IAAMd,EAAAA,MAAAA,CAAOI,EAAE,CAACU,IAAI;oBACpBC,EAAI,EAAA;wBACFP,OAASL,EAAAA,WAAAA,IAAeI,eAAeC;AACzC;AACF;AACF,aAAA;AACF,SAAA,CAAE,OAAOQ,GAAK,EAAA;YACZ,OAAO;gBAAEP,IAAM,EAAA;oBAAEC,IAAM,EAAA,KAAA;AAAOL,oBAAAA,QAAAA,EAAU,EAAE;AAAEN,oBAAAA,KAAAA;oBAAOgB,EAAI,EAAA;wBAAEP,OAAS,EAAA;AAAM;AAAE;AAAE,aAAA;AAC9E;AACF,KAAA;IAEA,MAAMS,uBAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,cAAiBlB,GAAAA,MAAAA,CAAOI,EAAE,CAACe,KAAK;AAEtC,QAAA,IAAIC,YAAe,GAAA,KAAA;AACnB,QAAA,IAAIC,kBAAqB,GAAA,IAAA;QACzB,IAAIC,oBAAAA;AAEJ,QAAA,MAAMC,sBAAyB,GAAA,MAAMC,UAAW,CAAA,MAAA,CAAA,CAAQC,yBAAyB,EAAA;AAEjF,QAAA,MAAMC,eAAkB,GAAA,MAAMF,UAAW,CAAA,kBAAA,CAAA,CAAoBG,mBAAmB,EAAA;AAEhF,QAAA,IAAID,eAAiB,EAAA;YACnBJ,oBAAuBC,GAAAA,sBAAAA,GAAyBG,gBAAgBE,MAAM;SACjE,MAAA;YACLN,oBAAuBC,GAAAA,sBAAAA;AACzB;AAEA,QAAA,IAAI,CAACM,KAAAA,CAAMX,cAAmBI,CAAAA,IAAAA,oBAAAA,GAAuBJ,cAAgB,EAAA;YACnEE,YAAe,GAAA,IAAA;YACfC,kBAAqB,GAAA,YAAA;AACvB;AAEA,QAAA,IAAI,CAACQ,KAAAA,CAAMX,cAAmBI,CAAAA,IAAAA,oBAAAA,KAAyBJ,cAAgB,EAAA;YACrEE,YAAe,GAAA,IAAA;YACfC,kBAAqB,GAAA,UAAA;AACvB;AAEA,QAAA,MAAMZ,IAAO,GAAA;AACXa,YAAAA,oBAAAA;AACAC,YAAAA,sBAAAA;AACAL,YAAAA,cAAAA;AACAE,YAAAA,YAAAA;YACAU,gBAAkBD,EAAAA,KAAAA,CAAMX,cAAkB,CAAA,GAAA,KAAA,GAAQK,sBAA0BL,IAAAA,cAAAA;AAC5EG,YAAAA,kBAAAA;YACAU,qBAAuBC,EAAAA,GAAAA,CAAI,kBAAkB,IAAU,CAAA,KAAA,cAAA;YACvDlB,IAAMd,EAAAA,MAAAA,CAAOI,EAAE,CAACU,IAAI;YACpBF,OAASZ,EAAAA,MAAAA,CAAOI,EAAE,CAACQ,OAAO;AAC1BP,YAAAA,QAAAA,EAAUL,OAAOI,EAAE,CAACC,QAAQ,CAACQ,IAAI,MAAM;AACzC,SAAA;QAEA,OAAO;AAAEJ,YAAAA;AAAK,SAAA;AAChB;AACF,CAAE;;;;"}
@@ -73,7 +73,6 @@ const { isUsingTypeScript } = tsUtils;
73
73
  const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);
74
74
  const useTypescriptOnAdmin = await isUsingTypeScript(path.join(strapi.dirs.app.root, 'src', 'admin'));
75
75
  const isHostedOnStrapiCloud = utils.env('STRAPI_HOSTING', null) === 'strapi.cloud';
76
- const aiLicenseKey = utils.env('STRAPI_ADMIN_AI_LICENSE', undefined);
77
76
  const numberOfAllContentTypes = _.size(strapi.contentTypes);
78
77
  const numberOfComponents = _.size(strapi.components);
79
78
  const getNumberOfDynamicZones = ()=>{
@@ -85,7 +84,6 @@ const { isUsingTypeScript } = tsUtils;
85
84
  useTypescriptOnServer,
86
85
  useTypescriptOnAdmin,
87
86
  isHostedOnStrapiCloud,
88
- aiLicenseKey,
89
87
  numberOfAllContentTypes,
90
88
  numberOfComponents,
91
89
  numberOfDynamicZones: getNumberOfDynamicZones()
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { map, values, sumBy, pipe, flatMap, propEq } from 'lodash/fp';\nimport _ from 'lodash';\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport tsUtils from '@strapi/typescript-utils';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n} from '../../../shared/contracts/admin';\n\nconst { isUsingTypeScript } = tsUtils;\n\n/**\n * A set of functions called \"actions\" for `Admin`\n */\nexport default {\n // TODO very temporary to check the switch ee/ce\n // When removing this we need to update the /admin/src/index.js file\n // whe,re we set the strapi.window.isEE value\n\n // NOTE: admin/ee/server overrides this controller, and adds the EE features\n // This returns an empty feature list for CE\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n },\n\n async init() {\n let uuid = strapi.config.get('uuid', false);\n const hasAdmin = await getService('user').exists();\n const { menuLogo, authLogo } = await getService('project-settings').getProjectSettings();\n // set to null if telemetryDisabled flag not avaialble in package.json\n const telemetryDisabled: boolean | null = strapi.config.get(\n 'packageJsonStrapi.telemetryDisabled',\n null\n );\n\n if (telemetryDisabled !== null && telemetryDisabled === true) {\n uuid = false;\n }\n\n return {\n data: {\n uuid,\n hasAdmin,\n menuLogo: menuLogo ? menuLogo.url : null,\n authLogo: authLogo ? authLogo.url : null,\n },\n } satisfies Init.Response;\n },\n\n async getProjectSettings() {\n return getService(\n 'project-settings'\n ).getProjectSettings() satisfies Promise<GetProjectSettings.Response>;\n },\n\n async updateProjectSettings(ctx: Context) {\n const {\n request: { files, body },\n } = ctx as { request: UpdateProjectSettings.Request };\n\n const projectSettingsService = getService('project-settings');\n\n await validateUpdateProjectSettings(body);\n await validateUpdateProjectSettingsFiles(files);\n\n const formatedFiles = await projectSettingsService.parseFilesData(files);\n await validateUpdateProjectSettingsImagesDimensions(formatedFiles);\n\n return projectSettingsService.updateProjectSettings({\n ...body,\n ...formatedFiles,\n }) satisfies Promise<UpdateProjectSettings.Response>;\n },\n\n async telemetryProperties(ctx: Context) {\n // If the telemetry is disabled, ignore the request and return early\n if (strapi.telemetry.isDisabled) {\n ctx.status = 204;\n return;\n }\n\n const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);\n const useTypescriptOnAdmin = await isUsingTypeScript(\n path.join(strapi.dirs.app.root, 'src', 'admin')\n );\n const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';\n const aiLicenseKey = env('STRAPI_ADMIN_AI_LICENSE', undefined);\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n // @ts-expect-error lodash types\n sumBy(propEq('type', 'dynamiczone'))\n )(strapi.contentTypes as any);\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n aiLicenseKey,\n numberOfAllContentTypes, // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n numberOfComponents,\n numberOfDynamicZones: getNumberOfDynamicZones(),\n },\n } satisfies TelemetryProperties.Response;\n },\n\n async information() {\n const currentEnvironment: string = strapi.config.get('environment');\n const autoReload = strapi.config.get('autoReload', false);\n const strapiVersion = strapi.config.get('info.strapi', null);\n const dependencies = strapi.config.get('info.dependencies', {});\n const projectId = strapi.config.get('uuid', null);\n const nodeVersion = process.version;\n const communityEdition = !strapi.EE;\n const useYarn: boolean = await exists(path.join(process.cwd(), 'yarn.lock'));\n\n return {\n data: {\n currentEnvironment,\n autoReload,\n strapiVersion,\n dependencies,\n projectId,\n nodeVersion,\n communityEdition,\n useYarn,\n },\n } satisfies Information.Response;\n },\n\n async plugins(ctx: Context) {\n const enabledPlugins = strapi.config.get('enabledPlugins') as any;\n\n // List of core plugins that are always enabled,\n // and so it's not necessary to display them in the plugins list\n const CORE_PLUGINS = [\n 'content-manager',\n 'content-type-builder',\n 'email',\n 'upload',\n 'i18n',\n 'content-releases',\n 'review-workflows',\n ];\n\n const plugins = Object.entries(enabledPlugins)\n .filter(([key]: any) => !CORE_PLUGINS.includes(key))\n .map(([key, plugin]: any) => ({\n name: plugin.info.name || key,\n displayName: plugin.info.displayName || plugin.info.name || key,\n description: plugin.info.description || '',\n packageName: plugin.info.packageName,\n }));\n\n ctx.send({ plugins }) satisfies Plugins.Response;\n },\n\n async licenseTrialTimeLeft() {\n const data = await strapi.ee.getTrialEndDate({\n strapi,\n });\n\n return data;\n },\n\n async getGuidedTourMeta(ctx: Context) {\n const isFirstSuperAdminUser = await getService('user').isFirstSuperAdminUser(ctx.state.user.id);\n\n return {\n data: {\n isFirstSuperAdminUser,\n schemas: strapi.contentTypes,\n },\n } satisfies GetGuidedTourMeta.Response;\n },\n};\n"],"names":["isUsingTypeScript","tsUtils","getProjectType","flags","strapi","config","get","data","isEE","features","ai","enabled","init","uuid","hasAdmin","getService","exists","menuLogo","authLogo","getProjectSettings","telemetryDisabled","url","updateProjectSettings","ctx","request","files","body","projectSettingsService","validateUpdateProjectSettings","validateUpdateProjectSettingsFiles","formatedFiles","parseFilesData","validateUpdateProjectSettingsImagesDimensions","telemetryProperties","telemetry","isDisabled","status","useTypescriptOnServer","dirs","app","root","useTypescriptOnAdmin","path","join","isHostedOnStrapiCloud","env","aiLicenseKey","undefined","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","pipe","map","flatMap","values","sumBy","propEq","numberOfDynamicZones","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","plugins","enabledPlugins","CORE_PLUGINS","Object","entries","filter","key","includes","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":"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"}
1
+ {"version":3,"file":"admin.js","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { map, values, sumBy, pipe, flatMap, propEq } from 'lodash/fp';\nimport _ from 'lodash';\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport tsUtils from '@strapi/typescript-utils';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n} from '../../../shared/contracts/admin';\n\nconst { isUsingTypeScript } = tsUtils;\n\n/**\n * A set of functions called \"actions\" for `Admin`\n */\nexport default {\n // TODO very temporary to check the switch ee/ce\n // When removing this we need to update the /admin/src/index.js file\n // whe,re we set the strapi.window.isEE value\n\n // NOTE: admin/ee/server overrides this controller, and adds the EE features\n // This returns an empty feature list for CE\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n },\n\n async init() {\n let uuid = strapi.config.get('uuid', false);\n const hasAdmin = await getService('user').exists();\n const { menuLogo, authLogo } = await getService('project-settings').getProjectSettings();\n // set to null if telemetryDisabled flag not avaialble in package.json\n const telemetryDisabled: boolean | null = strapi.config.get(\n 'packageJsonStrapi.telemetryDisabled',\n null\n );\n\n if (telemetryDisabled !== null && telemetryDisabled === true) {\n uuid = false;\n }\n\n return {\n data: {\n uuid,\n hasAdmin,\n menuLogo: menuLogo ? menuLogo.url : null,\n authLogo: authLogo ? authLogo.url : null,\n },\n } satisfies Init.Response;\n },\n\n async getProjectSettings() {\n return getService(\n 'project-settings'\n ).getProjectSettings() satisfies Promise<GetProjectSettings.Response>;\n },\n\n async updateProjectSettings(ctx: Context) {\n const {\n request: { files, body },\n } = ctx as { request: UpdateProjectSettings.Request };\n\n const projectSettingsService = getService('project-settings');\n\n await validateUpdateProjectSettings(body);\n await validateUpdateProjectSettingsFiles(files);\n\n const formatedFiles = await projectSettingsService.parseFilesData(files);\n await validateUpdateProjectSettingsImagesDimensions(formatedFiles);\n\n return projectSettingsService.updateProjectSettings({\n ...body,\n ...formatedFiles,\n }) satisfies Promise<UpdateProjectSettings.Response>;\n },\n\n async telemetryProperties(ctx: Context) {\n // If the telemetry is disabled, ignore the request and return early\n if (strapi.telemetry.isDisabled) {\n ctx.status = 204;\n return;\n }\n\n const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);\n const useTypescriptOnAdmin = await isUsingTypeScript(\n path.join(strapi.dirs.app.root, 'src', 'admin')\n );\n const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n // @ts-expect-error lodash types\n sumBy(propEq('type', 'dynamiczone'))\n )(strapi.contentTypes as any);\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n numberOfAllContentTypes, // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n numberOfComponents,\n numberOfDynamicZones: getNumberOfDynamicZones(),\n },\n } satisfies TelemetryProperties.Response;\n },\n\n async information() {\n const currentEnvironment: string = strapi.config.get('environment');\n const autoReload = strapi.config.get('autoReload', false);\n const strapiVersion = strapi.config.get('info.strapi', null);\n const dependencies = strapi.config.get('info.dependencies', {});\n const projectId = strapi.config.get('uuid', null);\n const nodeVersion = process.version;\n const communityEdition = !strapi.EE;\n const useYarn: boolean = await exists(path.join(process.cwd(), 'yarn.lock'));\n\n return {\n data: {\n currentEnvironment,\n autoReload,\n strapiVersion,\n dependencies,\n projectId,\n nodeVersion,\n communityEdition,\n useYarn,\n },\n } satisfies Information.Response;\n },\n\n async plugins(ctx: Context) {\n const enabledPlugins = strapi.config.get('enabledPlugins') as any;\n\n // List of core plugins that are always enabled,\n // and so it's not necessary to display them in the plugins list\n const CORE_PLUGINS = [\n 'content-manager',\n 'content-type-builder',\n 'email',\n 'upload',\n 'i18n',\n 'content-releases',\n 'review-workflows',\n ];\n\n const plugins = Object.entries(enabledPlugins)\n .filter(([key]: any) => !CORE_PLUGINS.includes(key))\n .map(([key, plugin]: any) => ({\n name: plugin.info.name || key,\n displayName: plugin.info.displayName || plugin.info.name || key,\n description: plugin.info.description || '',\n packageName: plugin.info.packageName,\n }));\n\n ctx.send({ plugins }) satisfies Plugins.Response;\n },\n\n async licenseTrialTimeLeft() {\n const data = await strapi.ee.getTrialEndDate({\n strapi,\n });\n\n return data;\n },\n\n async getGuidedTourMeta(ctx: Context) {\n const isFirstSuperAdminUser = await getService('user').isFirstSuperAdminUser(ctx.state.user.id);\n\n return {\n data: {\n isFirstSuperAdminUser,\n schemas: strapi.contentTypes,\n },\n } satisfies GetGuidedTourMeta.Response;\n },\n};\n"],"names":["isUsingTypeScript","tsUtils","getProjectType","flags","strapi","config","get","data","isEE","features","ai","enabled","init","uuid","hasAdmin","getService","exists","menuLogo","authLogo","getProjectSettings","telemetryDisabled","url","updateProjectSettings","ctx","request","files","body","projectSettingsService","validateUpdateProjectSettings","validateUpdateProjectSettingsFiles","formatedFiles","parseFilesData","validateUpdateProjectSettingsImagesDimensions","telemetryProperties","telemetry","isDisabled","status","useTypescriptOnServer","dirs","app","root","useTypescriptOnAdmin","path","join","isHostedOnStrapiCloud","env","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","pipe","map","flatMap","values","sumBy","propEq","numberOfDynamicZones","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","plugins","enabledPlugins","CORE_PLUGINS","Object","entries","filter","key","includes","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":"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"}
@@ -71,7 +71,6 @@ const { isUsingTypeScript } = tsUtils;
71
71
  const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);
72
72
  const useTypescriptOnAdmin = await isUsingTypeScript(path.join(strapi.dirs.app.root, 'src', 'admin'));
73
73
  const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';
74
- const aiLicenseKey = env('STRAPI_ADMIN_AI_LICENSE', undefined);
75
74
  const numberOfAllContentTypes = ___default.size(strapi.contentTypes);
76
75
  const numberOfComponents = ___default.size(strapi.components);
77
76
  const getNumberOfDynamicZones = ()=>{
@@ -83,7 +82,6 @@ const { isUsingTypeScript } = tsUtils;
83
82
  useTypescriptOnServer,
84
83
  useTypescriptOnAdmin,
85
84
  isHostedOnStrapiCloud,
86
- aiLicenseKey,
87
85
  numberOfAllContentTypes,
88
86
  numberOfComponents,
89
87
  numberOfDynamicZones: getNumberOfDynamicZones()
@@ -1 +1 @@
1
- {"version":3,"file":"admin.mjs","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { map, values, sumBy, pipe, flatMap, propEq } from 'lodash/fp';\nimport _ from 'lodash';\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport tsUtils from '@strapi/typescript-utils';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n} from '../../../shared/contracts/admin';\n\nconst { isUsingTypeScript } = tsUtils;\n\n/**\n * A set of functions called \"actions\" for `Admin`\n */\nexport default {\n // TODO very temporary to check the switch ee/ce\n // When removing this we need to update the /admin/src/index.js file\n // whe,re we set the strapi.window.isEE value\n\n // NOTE: admin/ee/server overrides this controller, and adds the EE features\n // This returns an empty feature list for CE\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n },\n\n async init() {\n let uuid = strapi.config.get('uuid', false);\n const hasAdmin = await getService('user').exists();\n const { menuLogo, authLogo } = await getService('project-settings').getProjectSettings();\n // set to null if telemetryDisabled flag not avaialble in package.json\n const telemetryDisabled: boolean | null = strapi.config.get(\n 'packageJsonStrapi.telemetryDisabled',\n null\n );\n\n if (telemetryDisabled !== null && telemetryDisabled === true) {\n uuid = false;\n }\n\n return {\n data: {\n uuid,\n hasAdmin,\n menuLogo: menuLogo ? menuLogo.url : null,\n authLogo: authLogo ? authLogo.url : null,\n },\n } satisfies Init.Response;\n },\n\n async getProjectSettings() {\n return getService(\n 'project-settings'\n ).getProjectSettings() satisfies Promise<GetProjectSettings.Response>;\n },\n\n async updateProjectSettings(ctx: Context) {\n const {\n request: { files, body },\n } = ctx as { request: UpdateProjectSettings.Request };\n\n const projectSettingsService = getService('project-settings');\n\n await validateUpdateProjectSettings(body);\n await validateUpdateProjectSettingsFiles(files);\n\n const formatedFiles = await projectSettingsService.parseFilesData(files);\n await validateUpdateProjectSettingsImagesDimensions(formatedFiles);\n\n return projectSettingsService.updateProjectSettings({\n ...body,\n ...formatedFiles,\n }) satisfies Promise<UpdateProjectSettings.Response>;\n },\n\n async telemetryProperties(ctx: Context) {\n // If the telemetry is disabled, ignore the request and return early\n if (strapi.telemetry.isDisabled) {\n ctx.status = 204;\n return;\n }\n\n const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);\n const useTypescriptOnAdmin = await isUsingTypeScript(\n path.join(strapi.dirs.app.root, 'src', 'admin')\n );\n const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';\n const aiLicenseKey = env('STRAPI_ADMIN_AI_LICENSE', undefined);\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n // @ts-expect-error lodash types\n sumBy(propEq('type', 'dynamiczone'))\n )(strapi.contentTypes as any);\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n aiLicenseKey,\n numberOfAllContentTypes, // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n numberOfComponents,\n numberOfDynamicZones: getNumberOfDynamicZones(),\n },\n } satisfies TelemetryProperties.Response;\n },\n\n async information() {\n const currentEnvironment: string = strapi.config.get('environment');\n const autoReload = strapi.config.get('autoReload', false);\n const strapiVersion = strapi.config.get('info.strapi', null);\n const dependencies = strapi.config.get('info.dependencies', {});\n const projectId = strapi.config.get('uuid', null);\n const nodeVersion = process.version;\n const communityEdition = !strapi.EE;\n const useYarn: boolean = await exists(path.join(process.cwd(), 'yarn.lock'));\n\n return {\n data: {\n currentEnvironment,\n autoReload,\n strapiVersion,\n dependencies,\n projectId,\n nodeVersion,\n communityEdition,\n useYarn,\n },\n } satisfies Information.Response;\n },\n\n async plugins(ctx: Context) {\n const enabledPlugins = strapi.config.get('enabledPlugins') as any;\n\n // List of core plugins that are always enabled,\n // and so it's not necessary to display them in the plugins list\n const CORE_PLUGINS = [\n 'content-manager',\n 'content-type-builder',\n 'email',\n 'upload',\n 'i18n',\n 'content-releases',\n 'review-workflows',\n ];\n\n const plugins = Object.entries(enabledPlugins)\n .filter(([key]: any) => !CORE_PLUGINS.includes(key))\n .map(([key, plugin]: any) => ({\n name: plugin.info.name || key,\n displayName: plugin.info.displayName || plugin.info.name || key,\n description: plugin.info.description || '',\n packageName: plugin.info.packageName,\n }));\n\n ctx.send({ plugins }) satisfies Plugins.Response;\n },\n\n async licenseTrialTimeLeft() {\n const data = await strapi.ee.getTrialEndDate({\n strapi,\n });\n\n return data;\n },\n\n async getGuidedTourMeta(ctx: Context) {\n const isFirstSuperAdminUser = await getService('user').isFirstSuperAdminUser(ctx.state.user.id);\n\n return {\n data: {\n isFirstSuperAdminUser,\n schemas: strapi.contentTypes,\n },\n } satisfies GetGuidedTourMeta.Response;\n },\n};\n"],"names":["isUsingTypeScript","tsUtils","getProjectType","flags","strapi","config","get","data","isEE","features","ai","enabled","init","uuid","hasAdmin","getService","exists","menuLogo","authLogo","getProjectSettings","telemetryDisabled","url","updateProjectSettings","ctx","request","files","body","projectSettingsService","validateUpdateProjectSettings","validateUpdateProjectSettingsFiles","formatedFiles","parseFilesData","validateUpdateProjectSettingsImagesDimensions","telemetryProperties","telemetry","isDisabled","status","useTypescriptOnServer","dirs","app","root","useTypescriptOnAdmin","path","join","isHostedOnStrapiCloud","env","aiLicenseKey","undefined","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","pipe","map","flatMap","values","sumBy","propEq","numberOfDynamicZones","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","plugins","enabledPlugins","CORE_PLUGINS","Object","entries","filter","key","includes","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":"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"}
1
+ {"version":3,"file":"admin.mjs","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { map, values, sumBy, pipe, flatMap, propEq } from 'lodash/fp';\nimport _ from 'lodash';\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport tsUtils from '@strapi/typescript-utils';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n} from '../../../shared/contracts/admin';\n\nconst { isUsingTypeScript } = tsUtils;\n\n/**\n * A set of functions called \"actions\" for `Admin`\n */\nexport default {\n // TODO very temporary to check the switch ee/ce\n // When removing this we need to update the /admin/src/index.js file\n // whe,re we set the strapi.window.isEE value\n\n // NOTE: admin/ee/server overrides this controller, and adds the EE features\n // This returns an empty feature list for CE\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n },\n\n async init() {\n let uuid = strapi.config.get('uuid', false);\n const hasAdmin = await getService('user').exists();\n const { menuLogo, authLogo } = await getService('project-settings').getProjectSettings();\n // set to null if telemetryDisabled flag not avaialble in package.json\n const telemetryDisabled: boolean | null = strapi.config.get(\n 'packageJsonStrapi.telemetryDisabled',\n null\n );\n\n if (telemetryDisabled !== null && telemetryDisabled === true) {\n uuid = false;\n }\n\n return {\n data: {\n uuid,\n hasAdmin,\n menuLogo: menuLogo ? menuLogo.url : null,\n authLogo: authLogo ? authLogo.url : null,\n },\n } satisfies Init.Response;\n },\n\n async getProjectSettings() {\n return getService(\n 'project-settings'\n ).getProjectSettings() satisfies Promise<GetProjectSettings.Response>;\n },\n\n async updateProjectSettings(ctx: Context) {\n const {\n request: { files, body },\n } = ctx as { request: UpdateProjectSettings.Request };\n\n const projectSettingsService = getService('project-settings');\n\n await validateUpdateProjectSettings(body);\n await validateUpdateProjectSettingsFiles(files);\n\n const formatedFiles = await projectSettingsService.parseFilesData(files);\n await validateUpdateProjectSettingsImagesDimensions(formatedFiles);\n\n return projectSettingsService.updateProjectSettings({\n ...body,\n ...formatedFiles,\n }) satisfies Promise<UpdateProjectSettings.Response>;\n },\n\n async telemetryProperties(ctx: Context) {\n // If the telemetry is disabled, ignore the request and return early\n if (strapi.telemetry.isDisabled) {\n ctx.status = 204;\n return;\n }\n\n const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);\n const useTypescriptOnAdmin = await isUsingTypeScript(\n path.join(strapi.dirs.app.root, 'src', 'admin')\n );\n const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n // @ts-expect-error lodash types\n sumBy(propEq('type', 'dynamiczone'))\n )(strapi.contentTypes as any);\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n numberOfAllContentTypes, // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n numberOfComponents,\n numberOfDynamicZones: getNumberOfDynamicZones(),\n },\n } satisfies TelemetryProperties.Response;\n },\n\n async information() {\n const currentEnvironment: string = strapi.config.get('environment');\n const autoReload = strapi.config.get('autoReload', false);\n const strapiVersion = strapi.config.get('info.strapi', null);\n const dependencies = strapi.config.get('info.dependencies', {});\n const projectId = strapi.config.get('uuid', null);\n const nodeVersion = process.version;\n const communityEdition = !strapi.EE;\n const useYarn: boolean = await exists(path.join(process.cwd(), 'yarn.lock'));\n\n return {\n data: {\n currentEnvironment,\n autoReload,\n strapiVersion,\n dependencies,\n projectId,\n nodeVersion,\n communityEdition,\n useYarn,\n },\n } satisfies Information.Response;\n },\n\n async plugins(ctx: Context) {\n const enabledPlugins = strapi.config.get('enabledPlugins') as any;\n\n // List of core plugins that are always enabled,\n // and so it's not necessary to display them in the plugins list\n const CORE_PLUGINS = [\n 'content-manager',\n 'content-type-builder',\n 'email',\n 'upload',\n 'i18n',\n 'content-releases',\n 'review-workflows',\n ];\n\n const plugins = Object.entries(enabledPlugins)\n .filter(([key]: any) => !CORE_PLUGINS.includes(key))\n .map(([key, plugin]: any) => ({\n name: plugin.info.name || key,\n displayName: plugin.info.displayName || plugin.info.name || key,\n description: plugin.info.description || '',\n packageName: plugin.info.packageName,\n }));\n\n ctx.send({ plugins }) satisfies Plugins.Response;\n },\n\n async licenseTrialTimeLeft() {\n const data = await strapi.ee.getTrialEndDate({\n strapi,\n });\n\n return data;\n },\n\n async getGuidedTourMeta(ctx: Context) {\n const isFirstSuperAdminUser = await getService('user').isFirstSuperAdminUser(ctx.state.user.id);\n\n return {\n data: {\n isFirstSuperAdminUser,\n schemas: strapi.contentTypes,\n },\n } satisfies GetGuidedTourMeta.Response;\n },\n};\n"],"names":["isUsingTypeScript","tsUtils","getProjectType","flags","strapi","config","get","data","isEE","features","ai","enabled","init","uuid","hasAdmin","getService","exists","menuLogo","authLogo","getProjectSettings","telemetryDisabled","url","updateProjectSettings","ctx","request","files","body","projectSettingsService","validateUpdateProjectSettings","validateUpdateProjectSettingsFiles","formatedFiles","parseFilesData","validateUpdateProjectSettingsImagesDimensions","telemetryProperties","telemetry","isDisabled","status","useTypescriptOnServer","dirs","app","root","useTypescriptOnAdmin","path","join","isHostedOnStrapiCloud","env","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","pipe","map","flatMap","values","sumBy","propEq","numberOfDynamicZones","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","plugins","enabledPlugins","CORE_PLUGINS","Object","entries","filter","key","includes","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ var ability = require('@casl/ability');
4
+ var extra = require('@casl/ability/extra');
5
+ var fp = require('lodash/fp');
6
+
7
+ /**
8
+ * Creates a cached permission fields calculator for a given CASL ability.
9
+ *
10
+ * The cache stores permission field calculations per action+subjectType combination.
11
+ * Results are only cached when rules have no entity-specific conditions, as those
12
+ * must be computed per entity.
13
+ *
14
+ * @param ability - The CASL ability instance to use for permission checks
15
+ * @returns Object with getPermissionFields function and cache
16
+ */ const createPermissionFieldsCache = (ability$1)=>{
17
+ const permissionCache = new Map();
18
+ const getPermissionFields = (actionOverride, subject)=>{
19
+ const subjectType = ability.detectSubjectType(subject);
20
+ const rules = ability$1.rulesFor(actionOverride, subjectType);
21
+ // Check if any rule has conditions that depend on entity data
22
+ // If so, we can't cache - must compute per entity
23
+ const hasEntityConditions = rules.some((rule)=>rule.conditions && !fp.isEmpty(rule.conditions));
24
+ // Return cached result if available and safe to use
25
+ const cacheKey = `${actionOverride}::${String(subjectType)}`;
26
+ if (!hasEntityConditions && permissionCache.has(cacheKey)) {
27
+ return permissionCache.get(cacheKey);
28
+ }
29
+ // Compute permission fields (expensive CASL operation)
30
+ const permittedFields = extra.permittedFieldsOf(ability$1, actionOverride, subject, {
31
+ fieldsFrom: (rule)=>rule.fields || []
32
+ });
33
+ const hasAtLeastOneRegistered = fp.some((fields)=>!fp.isNil(fields), fp.flatMap(fp.prop('fields'), rules));
34
+ const shouldIncludeAll = fp.isEmpty(permittedFields) && !hasAtLeastOneRegistered;
35
+ const result = {
36
+ permittedFields,
37
+ hasAtLeastOneRegistered,
38
+ shouldIncludeAll
39
+ };
40
+ // Cache for reuse if no entity-specific conditions
41
+ if (!hasEntityConditions) {
42
+ permissionCache.set(cacheKey, result);
43
+ }
44
+ return result;
45
+ };
46
+ return {
47
+ getPermissionFields,
48
+ clearCache: ()=>permissionCache.clear()
49
+ };
50
+ };
51
+
52
+ exports.createPermissionFieldsCache = createPermissionFieldsCache;
53
+ //# sourceMappingURL=permission-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-fields.js","sources":["../../../../../../../server/src/services/permission/permissions-manager/permission-fields.ts"],"sourcesContent":["import { detectSubjectType } from '@casl/ability';\nimport { permittedFieldsOf } from '@casl/ability/extra';\nimport { isEmpty, isNil, flatMap, some, prop } from 'lodash/fp';\n\nimport type { Ability } from '@casl/ability';\n\nexport interface PermissionFieldsResult {\n permittedFields: string[];\n hasAtLeastOneRegistered: boolean;\n shouldIncludeAll: boolean;\n}\n\n/**\n * Creates a cached permission fields calculator for a given CASL ability.\n *\n * The cache stores permission field calculations per action+subjectType combination.\n * Results are only cached when rules have no entity-specific conditions, as those\n * must be computed per entity.\n *\n * @param ability - The CASL ability instance to use for permission checks\n * @returns Object with getPermissionFields function and cache\n */\nexport const createPermissionFieldsCache = (ability: Ability) => {\n const permissionCache = new Map<string, PermissionFieldsResult>();\n\n const getPermissionFields = (actionOverride: string, subject: any): PermissionFieldsResult => {\n const subjectType = detectSubjectType(subject);\n const rules = ability.rulesFor(actionOverride, subjectType);\n\n // Check if any rule has conditions that depend on entity data\n // If so, we can't cache - must compute per entity\n const hasEntityConditions = rules.some(\n (rule: any) => rule.conditions && !isEmpty(rule.conditions)\n );\n\n // Return cached result if available and safe to use\n const cacheKey = `${actionOverride}::${String(subjectType)}`;\n if (!hasEntityConditions && permissionCache.has(cacheKey)) {\n return permissionCache.get(cacheKey)!;\n }\n\n // Compute permission fields (expensive CASL operation)\n const permittedFields = permittedFieldsOf(ability, actionOverride, subject, {\n fieldsFrom: (rule) => rule.fields || [],\n });\n\n const hasAtLeastOneRegistered = some(\n (fields) => !isNil(fields),\n flatMap(prop('fields'), rules)\n );\n const shouldIncludeAll = isEmpty(permittedFields) && !hasAtLeastOneRegistered;\n\n const result: PermissionFieldsResult = {\n permittedFields,\n hasAtLeastOneRegistered,\n shouldIncludeAll,\n };\n\n // Cache for reuse if no entity-specific conditions\n if (!hasEntityConditions) {\n permissionCache.set(cacheKey, result);\n }\n\n return result;\n };\n\n return {\n getPermissionFields,\n clearCache: () => permissionCache.clear(),\n };\n};\n"],"names":["createPermissionFieldsCache","ability","permissionCache","Map","getPermissionFields","actionOverride","subject","subjectType","detectSubjectType","rules","rulesFor","hasEntityConditions","some","rule","conditions","isEmpty","cacheKey","String","has","get","permittedFields","permittedFieldsOf","fieldsFrom","fields","hasAtLeastOneRegistered","isNil","flatMap","prop","shouldIncludeAll","result","set","clearCache","clear"],"mappings":";;;;;;AAYA;;;;;;;;;IAUaA,MAAAA,2BAAAA,GAA8B,CAACC,SAAAA,GAAAA;AAC1C,IAAA,MAAMC,kBAAkB,IAAIC,GAAAA,EAAAA;IAE5B,MAAMC,mBAAAA,GAAsB,CAACC,cAAwBC,EAAAA,OAAAA,GAAAA;AACnD,QAAA,MAAMC,cAAcC,yBAAkBF,CAAAA,OAAAA,CAAAA;AACtC,QAAA,MAAMG,KAAQR,GAAAA,SAAAA,CAAQS,QAAQ,CAACL,cAAgBE,EAAAA,WAAAA,CAAAA;;;AAI/C,QAAA,MAAMI,mBAAsBF,GAAAA,KAAAA,CAAMG,IAAI,CACpC,CAACC,IAAAA,GAAcA,IAAKC,CAAAA,UAAU,IAAI,CAACC,UAAQF,CAAAA,IAAAA,CAAKC,UAAU,CAAA,CAAA;;AAI5D,QAAA,MAAME,WAAW,CAAGX,EAAAA,cAAAA,CAAe,EAAE,EAAEY,OAAOV,WAAc,CAAA,CAAA,CAAA;AAC5D,QAAA,IAAI,CAACI,mBAAAA,IAAuBT,eAAgBgB,CAAAA,GAAG,CAACF,QAAW,CAAA,EAAA;YACzD,OAAOd,eAAAA,CAAgBiB,GAAG,CAACH,QAAAA,CAAAA;AAC7B;;AAGA,QAAA,MAAMI,eAAkBC,GAAAA,uBAAAA,CAAkBpB,SAASI,EAAAA,cAAAA,EAAgBC,OAAS,EAAA;AAC1EgB,YAAAA,UAAAA,EAAY,CAACT,IAAAA,GAASA,IAAKU,CAAAA,MAAM,IAAI;AACvC,SAAA,CAAA;QAEA,MAAMC,uBAAAA,GAA0BZ,QAC9B,CAACW,MAAAA,GAAW,CAACE,QAAMF,CAAAA,MAAAA,CAAAA,EACnBG,UAAQC,CAAAA,OAAAA,CAAK,QAAWlB,CAAAA,EAAAA,KAAAA,CAAAA,CAAAA;QAE1B,MAAMmB,gBAAAA,GAAmBb,UAAQK,CAAAA,eAAAA,CAAAA,IAAoB,CAACI,uBAAAA;AAEtD,QAAA,MAAMK,MAAiC,GAAA;AACrCT,YAAAA,eAAAA;AACAI,YAAAA,uBAAAA;AACAI,YAAAA;AACF,SAAA;;AAGA,QAAA,IAAI,CAACjB,mBAAqB,EAAA;YACxBT,eAAgB4B,CAAAA,GAAG,CAACd,QAAUa,EAAAA,MAAAA,CAAAA;AAChC;QAEA,OAAOA,MAAAA;AACT,KAAA;IAEA,OAAO;AACLzB,QAAAA,mBAAAA;QACA2B,UAAY,EAAA,IAAM7B,gBAAgB8B,KAAK;AACzC,KAAA;AACF;;;;"}
@@ -0,0 +1,51 @@
1
+ import { detectSubjectType } from '@casl/ability';
2
+ import { permittedFieldsOf } from '@casl/ability/extra';
3
+ import { isEmpty, some, isNil, flatMap, prop } from 'lodash/fp';
4
+
5
+ /**
6
+ * Creates a cached permission fields calculator for a given CASL ability.
7
+ *
8
+ * The cache stores permission field calculations per action+subjectType combination.
9
+ * Results are only cached when rules have no entity-specific conditions, as those
10
+ * must be computed per entity.
11
+ *
12
+ * @param ability - The CASL ability instance to use for permission checks
13
+ * @returns Object with getPermissionFields function and cache
14
+ */ const createPermissionFieldsCache = (ability)=>{
15
+ const permissionCache = new Map();
16
+ const getPermissionFields = (actionOverride, subject)=>{
17
+ const subjectType = detectSubjectType(subject);
18
+ const rules = ability.rulesFor(actionOverride, subjectType);
19
+ // Check if any rule has conditions that depend on entity data
20
+ // If so, we can't cache - must compute per entity
21
+ const hasEntityConditions = rules.some((rule)=>rule.conditions && !isEmpty(rule.conditions));
22
+ // Return cached result if available and safe to use
23
+ const cacheKey = `${actionOverride}::${String(subjectType)}`;
24
+ if (!hasEntityConditions && permissionCache.has(cacheKey)) {
25
+ return permissionCache.get(cacheKey);
26
+ }
27
+ // Compute permission fields (expensive CASL operation)
28
+ const permittedFields = permittedFieldsOf(ability, actionOverride, subject, {
29
+ fieldsFrom: (rule)=>rule.fields || []
30
+ });
31
+ const hasAtLeastOneRegistered = some((fields)=>!isNil(fields), flatMap(prop('fields'), rules));
32
+ const shouldIncludeAll = isEmpty(permittedFields) && !hasAtLeastOneRegistered;
33
+ const result = {
34
+ permittedFields,
35
+ hasAtLeastOneRegistered,
36
+ shouldIncludeAll
37
+ };
38
+ // Cache for reuse if no entity-specific conditions
39
+ if (!hasEntityConditions) {
40
+ permissionCache.set(cacheKey, result);
41
+ }
42
+ return result;
43
+ };
44
+ return {
45
+ getPermissionFields,
46
+ clearCache: ()=>permissionCache.clear()
47
+ };
48
+ };
49
+
50
+ export { createPermissionFieldsCache };
51
+ //# sourceMappingURL=permission-fields.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-fields.mjs","sources":["../../../../../../../server/src/services/permission/permissions-manager/permission-fields.ts"],"sourcesContent":["import { detectSubjectType } from '@casl/ability';\nimport { permittedFieldsOf } from '@casl/ability/extra';\nimport { isEmpty, isNil, flatMap, some, prop } from 'lodash/fp';\n\nimport type { Ability } from '@casl/ability';\n\nexport interface PermissionFieldsResult {\n permittedFields: string[];\n hasAtLeastOneRegistered: boolean;\n shouldIncludeAll: boolean;\n}\n\n/**\n * Creates a cached permission fields calculator for a given CASL ability.\n *\n * The cache stores permission field calculations per action+subjectType combination.\n * Results are only cached when rules have no entity-specific conditions, as those\n * must be computed per entity.\n *\n * @param ability - The CASL ability instance to use for permission checks\n * @returns Object with getPermissionFields function and cache\n */\nexport const createPermissionFieldsCache = (ability: Ability) => {\n const permissionCache = new Map<string, PermissionFieldsResult>();\n\n const getPermissionFields = (actionOverride: string, subject: any): PermissionFieldsResult => {\n const subjectType = detectSubjectType(subject);\n const rules = ability.rulesFor(actionOverride, subjectType);\n\n // Check if any rule has conditions that depend on entity data\n // If so, we can't cache - must compute per entity\n const hasEntityConditions = rules.some(\n (rule: any) => rule.conditions && !isEmpty(rule.conditions)\n );\n\n // Return cached result if available and safe to use\n const cacheKey = `${actionOverride}::${String(subjectType)}`;\n if (!hasEntityConditions && permissionCache.has(cacheKey)) {\n return permissionCache.get(cacheKey)!;\n }\n\n // Compute permission fields (expensive CASL operation)\n const permittedFields = permittedFieldsOf(ability, actionOverride, subject, {\n fieldsFrom: (rule) => rule.fields || [],\n });\n\n const hasAtLeastOneRegistered = some(\n (fields) => !isNil(fields),\n flatMap(prop('fields'), rules)\n );\n const shouldIncludeAll = isEmpty(permittedFields) && !hasAtLeastOneRegistered;\n\n const result: PermissionFieldsResult = {\n permittedFields,\n hasAtLeastOneRegistered,\n shouldIncludeAll,\n };\n\n // Cache for reuse if no entity-specific conditions\n if (!hasEntityConditions) {\n permissionCache.set(cacheKey, result);\n }\n\n return result;\n };\n\n return {\n getPermissionFields,\n clearCache: () => permissionCache.clear(),\n };\n};\n"],"names":["createPermissionFieldsCache","ability","permissionCache","Map","getPermissionFields","actionOverride","subject","subjectType","detectSubjectType","rules","rulesFor","hasEntityConditions","some","rule","conditions","isEmpty","cacheKey","String","has","get","permittedFields","permittedFieldsOf","fieldsFrom","fields","hasAtLeastOneRegistered","isNil","flatMap","prop","shouldIncludeAll","result","set","clearCache","clear"],"mappings":";;;;AAYA;;;;;;;;;IAUaA,MAAAA,2BAAAA,GAA8B,CAACC,OAAAA,GAAAA;AAC1C,IAAA,MAAMC,kBAAkB,IAAIC,GAAAA,EAAAA;IAE5B,MAAMC,mBAAAA,GAAsB,CAACC,cAAwBC,EAAAA,OAAAA,GAAAA;AACnD,QAAA,MAAMC,cAAcC,iBAAkBF,CAAAA,OAAAA,CAAAA;AACtC,QAAA,MAAMG,KAAQR,GAAAA,OAAAA,CAAQS,QAAQ,CAACL,cAAgBE,EAAAA,WAAAA,CAAAA;;;AAI/C,QAAA,MAAMI,mBAAsBF,GAAAA,KAAAA,CAAMG,IAAI,CACpC,CAACC,IAAAA,GAAcA,IAAKC,CAAAA,UAAU,IAAI,CAACC,OAAQF,CAAAA,IAAAA,CAAKC,UAAU,CAAA,CAAA;;AAI5D,QAAA,MAAME,WAAW,CAAGX,EAAAA,cAAAA,CAAe,EAAE,EAAEY,OAAOV,WAAc,CAAA,CAAA,CAAA;AAC5D,QAAA,IAAI,CAACI,mBAAAA,IAAuBT,eAAgBgB,CAAAA,GAAG,CAACF,QAAW,CAAA,EAAA;YACzD,OAAOd,eAAAA,CAAgBiB,GAAG,CAACH,QAAAA,CAAAA;AAC7B;;AAGA,QAAA,MAAMI,eAAkBC,GAAAA,iBAAAA,CAAkBpB,OAASI,EAAAA,cAAAA,EAAgBC,OAAS,EAAA;AAC1EgB,YAAAA,UAAAA,EAAY,CAACT,IAAAA,GAASA,IAAKU,CAAAA,MAAM,IAAI;AACvC,SAAA,CAAA;QAEA,MAAMC,uBAAAA,GAA0BZ,KAC9B,CAACW,MAAAA,GAAW,CAACE,KAAMF,CAAAA,MAAAA,CAAAA,EACnBG,OAAQC,CAAAA,IAAAA,CAAK,QAAWlB,CAAAA,EAAAA,KAAAA,CAAAA,CAAAA;QAE1B,MAAMmB,gBAAAA,GAAmBb,OAAQK,CAAAA,eAAAA,CAAAA,IAAoB,CAACI,uBAAAA;AAEtD,QAAA,MAAMK,MAAiC,GAAA;AACrCT,YAAAA,eAAAA;AACAI,YAAAA,uBAAAA;AACAI,YAAAA;AACF,SAAA;;AAGA,QAAA,IAAI,CAACjB,mBAAqB,EAAA;YACxBT,eAAgB4B,CAAAA,GAAG,CAACd,QAAUa,EAAAA,MAAAA,CAAAA;AAChC;QAEA,OAAOA,MAAAA;AACT,KAAA;IAEA,OAAO;AACLzB,QAAAA,mBAAAA;QACA2B,UAAY,EAAA,IAAM7B,gBAAgB8B,KAAK;AACzC,KAAA;AACF;;;;"}
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  var ability = require('@casl/ability');
4
- var extra = require('@casl/ability/extra');
5
4
  var fp = require('lodash/fp');
6
5
  var utils = require('@strapi/utils');
6
+ var permissionFields = require('./permission-fields.js');
7
7
  var user = require('../../../domain/user.js');
8
8
 
9
9
  const { visitors: { removePassword, expandWildcardPopulate } } = utils.sanitize;
@@ -19,9 +19,11 @@ const STATIC_FIELDS = [
19
19
  var createSanitizeHelpers = (({ action, ability: ability$1, model })=>{
20
20
  const schema = strapi.getModel(model);
21
21
  const { removeDisallowedFields } = utils.sanitize.visitors;
22
+ // Create request-scoped model cache to avoid redundant getModel() calls
23
+ const modelCache = utils.createModelCache(strapi.getModel.bind(strapi));
22
24
  const ctx = {
23
25
  schema,
24
- getModel: strapi.getModel.bind(strapi)
26
+ getModel: modelCache.getModel
25
27
  };
26
28
  const createSanitizeQuery = (options = {})=>{
27
29
  const { fields } = options;
@@ -87,6 +89,7 @@ var createSanitizeHelpers = (({ action, ability: ability$1, model })=>{
87
89
  omitCreatorRoles);
88
90
  };
89
91
  const wrapSanitize = (createSanitizeFunction)=>{
92
+ const { getPermissionFields } = permissionFields.createPermissionFieldsCache(ability$1);
90
93
  // TODO
91
94
  // @ts-expect-error define the correct return type
92
95
  const wrappedSanitize = async (data, options = {})=>{
@@ -94,15 +97,11 @@ var createSanitizeHelpers = (({ action, ability: ability$1, model })=>{
94
97
  return Promise.all(data.map((entity)=>wrappedSanitize(entity, options)));
95
98
  }
96
99
  const { subject, action: actionOverride } = getDefaultOptions(data, options);
97
- const permittedFields = extra.permittedFieldsOf(ability$1, actionOverride, subject, {
98
- fieldsFrom: (rule)=>rule.fields || []
99
- });
100
- const hasAtLeastOneRegistered = fp.some((fields)=>!fp.isNil(fields), fp.flatMap(fp.prop('fields'), ability$1.rulesFor(actionOverride, ability.detectSubjectType(subject))));
101
- const shouldIncludeAllFields = fp.isEmpty(permittedFields) && !hasAtLeastOneRegistered;
100
+ const { permittedFields, hasAtLeastOneRegistered, shouldIncludeAll } = getPermissionFields(actionOverride, subject);
102
101
  const sanitizeOptions = {
103
102
  ...options,
104
103
  fields: {
105
- shouldIncludeAll: shouldIncludeAllFields,
104
+ shouldIncludeAll,
106
105
  permitted: permittedFields,
107
106
  hasAtLeastOneRegistered
108
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.js","sources":["../../../../../../../server/src/services/permission/permissions-manager/sanitize.ts"],"sourcesContent":["import { subject as asSubject, detectSubjectType } from '@casl/ability';\nimport { permittedFieldsOf } from '@casl/ability/extra';\nimport {\n defaults,\n omit,\n isArray,\n isEmpty,\n isNil,\n flatMap,\n some,\n prop,\n uniq,\n intersection,\n pick,\n getOr,\n isObject,\n cloneDeep,\n} from 'lodash/fp';\n\nimport type { UID } from '@strapi/types';\n\nimport { contentTypes, traverseEntity, sanitize, async, traverse } from '@strapi/utils';\nimport { ADMIN_USER_ALLOWED_FIELDS } from '../../../domain/user';\n\nconst {\n visitors: { removePassword, expandWildcardPopulate },\n} = sanitize;\n\nconst {\n constants,\n isScalarAttribute,\n getNonVisibleAttributes,\n getNonWritableAttributes,\n getWritableAttributes,\n} = contentTypes;\nconst {\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = constants;\n\nconst COMPONENT_FIELDS = ['__component'];\nconst STATIC_FIELDS = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];\n\nexport default ({ action, ability, model }: any) => {\n const schema = strapi.getModel(model);\n\n const { removeDisallowedFields } = sanitize.visitors;\n\n const ctx = {\n schema,\n getModel: strapi.getModel.bind(strapi),\n };\n\n const createSanitizeQuery = (options = {} as any) => {\n const { fields } = options;\n\n // TODO: sanitize relations to admin users in all sanitizers\n const permittedFields = fields.shouldIncludeAll ? null : getQueryFields(fields.permitted);\n\n const sanitizeFilters = async.pipe(\n traverse.traverseQueryFilters(removeDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryFilters(omitDisallowedAdminUserFields, ctx),\n traverse.traverseQueryFilters(omitHiddenFields, ctx),\n traverse.traverseQueryFilters(removePassword, ctx),\n traverse.traverseQueryFilters(({ key, value }, { remove }) => {\n if (isObject(value) && isEmpty(value)) {\n remove(key);\n }\n }, ctx)\n );\n\n const sanitizeSort = async.pipe(\n traverse.traverseQuerySort(removeDisallowedFields(permittedFields), ctx),\n traverse.traverseQuerySort(omitDisallowedAdminUserFields, ctx),\n traverse.traverseQuerySort(omitHiddenFields, ctx),\n traverse.traverseQuerySort(removePassword, ctx),\n traverse.traverseQuerySort(({ key, attribute, value }, { remove }) => {\n if (!isScalarAttribute(attribute) && isEmpty(value)) {\n remove(key);\n }\n }, ctx)\n );\n\n const sanitizePopulate = async.pipe(\n traverse.traverseQueryPopulate(expandWildcardPopulate, ctx),\n traverse.traverseQueryPopulate(removeDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryPopulate(omitDisallowedAdminUserFields, ctx),\n traverse.traverseQueryPopulate(omitHiddenFields, ctx),\n traverse.traverseQueryPopulate(removePassword, ctx)\n );\n\n const sanitizeFields = async.pipe(\n traverse.traverseQueryFields(removeDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryFields(omitHiddenFields, ctx),\n traverse.traverseQueryFields(removePassword, ctx)\n );\n\n return async (query: any) => {\n const sanitizedQuery = cloneDeep(query);\n\n if (query.filters) {\n Object.assign(sanitizedQuery, { filters: await sanitizeFilters(query.filters) });\n }\n\n if (query.sort) {\n Object.assign(sanitizedQuery, { sort: await sanitizeSort(query.sort) });\n }\n\n if (query.populate) {\n Object.assign(sanitizedQuery, { populate: await sanitizePopulate(query.populate) });\n }\n\n if (query.fields) {\n Object.assign(sanitizedQuery, { fields: await sanitizeFields(query.fields) });\n }\n\n return sanitizedQuery;\n };\n };\n\n const createSanitizeOutput = (options = {} as any) => {\n const { fields } = options;\n\n const permittedFields = fields.shouldIncludeAll ? null : getOutputFields(fields.permitted);\n\n return async.pipe(\n // Remove fields hidden from the admin\n traverseEntity(omitHiddenFields, ctx),\n // Remove unallowed fields from admin::user relations\n traverseEntity(pickAllowedAdminUserFields, ctx),\n // Remove not allowed fields (RBAC)\n traverseEntity(removeDisallowedFields(permittedFields), ctx),\n // Remove all fields of type 'password'\n sanitize.sanitizers.sanitizePasswords({\n schema,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n })\n );\n };\n\n const createSanitizeInput = (options = {} as any) => {\n const { fields } = options;\n\n const permittedFields = fields.shouldIncludeAll ? null : getInputFields(fields.permitted);\n\n return async.pipe(\n // Remove fields hidden from the admin\n traverseEntity(omitHiddenFields, ctx),\n // Remove not allowed fields (RBAC)\n traverseEntity(removeDisallowedFields(permittedFields), ctx),\n // Remove roles from createdBy & updatedBy fields\n omitCreatorRoles\n );\n };\n\n const wrapSanitize = (createSanitizeFunction: any) => {\n // TODO\n // @ts-expect-error define the correct return type\n const wrappedSanitize = async (data: unknown, options = {} as any) => {\n if (isArray(data)) {\n return Promise.all(data.map((entity: unknown) => wrappedSanitize(entity, options)));\n }\n\n const { subject, action: actionOverride } = getDefaultOptions(data, options);\n\n const permittedFields = permittedFieldsOf(ability, actionOverride, subject, {\n fieldsFrom: (rule) => rule.fields || [],\n });\n\n const hasAtLeastOneRegistered = some(\n (fields) => !isNil(fields),\n flatMap(prop('fields'), ability.rulesFor(actionOverride, detectSubjectType(subject)))\n );\n const shouldIncludeAllFields = isEmpty(permittedFields) && !hasAtLeastOneRegistered;\n\n const sanitizeOptions = {\n ...options,\n fields: {\n shouldIncludeAll: shouldIncludeAllFields,\n permitted: permittedFields,\n hasAtLeastOneRegistered,\n },\n };\n\n const sanitizeFunction = createSanitizeFunction(sanitizeOptions);\n\n return sanitizeFunction(data);\n };\n\n return wrappedSanitize;\n };\n\n const getDefaultOptions = (data: any, options: unknown) => {\n return defaults({ subject: asSubject(model, data), action }, options);\n };\n\n /**\n * Omit creator fields' (createdBy & updatedBy) roles from the admin API responses\n */\n const omitCreatorRoles = omit([`${CREATED_BY_ATTRIBUTE}.roles`, `${UPDATED_BY_ATTRIBUTE}.roles`]);\n\n /**\n * Visitor used to remove hidden fields from the admin API responses\n */\n const omitHiddenFields = ({ key, schema }: any, { remove }: any) => {\n const isHidden = getOr(false, ['config', 'attributes', key, 'hidden'], schema);\n\n if (isHidden) {\n remove(key);\n }\n };\n\n /**\n * Visitor used to only select needed fields from the admin users entities & avoid leaking sensitive information\n */\n const pickAllowedAdminUserFields = ({ attribute, key, value }: any, { set }: any) => {\n const pickAllowedFields = pick(ADMIN_USER_ALLOWED_FIELDS);\n if (!attribute) {\n return;\n }\n\n if (attribute.type === 'relation' && attribute.target === 'admin::user' && value) {\n if (Array.isArray(value)) {\n set(key, value.map(pickAllowedFields));\n } else {\n set(key, pickAllowedFields(value));\n }\n }\n };\n\n /**\n * Visitor used to omit disallowed fields from the admin users entities & avoid leaking sensitive information\n */\n const omitDisallowedAdminUserFields = ({ key, attribute, schema }: any, { remove }: any) => {\n if (schema.uid === 'admin::user' && attribute && !ADMIN_USER_ALLOWED_FIELDS.includes(key)) {\n remove(key);\n }\n };\n\n const getInputFields = (fields = []) => {\n const nonVisibleAttributes = getNonVisibleAttributes(schema);\n const writableAttributes = getWritableAttributes(schema);\n\n const nonVisibleWritableAttributes = intersection(nonVisibleAttributes, writableAttributes);\n\n return uniq([...fields, ...COMPONENT_FIELDS, ...nonVisibleWritableAttributes]);\n };\n\n const getOutputFields = (fields = []) => {\n const nonWritableAttributes = getNonWritableAttributes(schema);\n const nonVisibleAttributes = getNonVisibleAttributes(schema);\n\n return uniq([\n ...fields,\n ...STATIC_FIELDS,\n ...COMPONENT_FIELDS,\n ...nonWritableAttributes,\n ...nonVisibleAttributes,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n ]);\n };\n\n const getQueryFields = (fields = []) => {\n const nonVisibleAttributes = getNonVisibleAttributes(schema);\n const writableAttributes = getWritableAttributes(schema);\n\n const nonVisibleWritableAttributes = intersection(nonVisibleAttributes, writableAttributes);\n\n return uniq([\n ...fields,\n ...STATIC_FIELDS,\n ...COMPONENT_FIELDS,\n ...nonVisibleWritableAttributes,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ]);\n };\n\n return {\n sanitizeOutput: wrapSanitize(createSanitizeOutput),\n sanitizeInput: wrapSanitize(createSanitizeInput),\n sanitizeQuery: wrapSanitize(createSanitizeQuery),\n };\n};\n"],"names":["visitors","removePassword","expandWildcardPopulate","sanitize","constants","isScalarAttribute","getNonVisibleAttributes","getNonWritableAttributes","getWritableAttributes","contentTypes","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","COMPONENT_FIELDS","STATIC_FIELDS","action","ability","model","schema","strapi","getModel","removeDisallowedFields","ctx","bind","createSanitizeQuery","options","fields","permittedFields","shouldIncludeAll","getQueryFields","permitted","sanitizeFilters","async","pipe","traverse","traverseQueryFilters","omitDisallowedAdminUserFields","omitHiddenFields","key","value","remove","isObject","isEmpty","sanitizeSort","traverseQuerySort","attribute","sanitizePopulate","traverseQueryPopulate","sanitizeFields","traverseQueryFields","query","sanitizedQuery","cloneDeep","filters","Object","assign","sort","populate","createSanitizeOutput","getOutputFields","traverseEntity","pickAllowedAdminUserFields","sanitizers","sanitizePasswords","uid","createSanitizeInput","getInputFields","omitCreatorRoles","wrapSanitize","createSanitizeFunction","wrappedSanitize","data","isArray","Promise","all","map","entity","subject","actionOverride","getDefaultOptions","permittedFieldsOf","fieldsFrom","rule","hasAtLeastOneRegistered","some","isNil","flatMap","prop","rulesFor","detectSubjectType","shouldIncludeAllFields","sanitizeOptions","sanitizeFunction","defaults","asSubject","omit","isHidden","getOr","set","pickAllowedFields","pick","ADMIN_USER_ALLOWED_FIELDS","type","target","Array","includes","nonVisibleAttributes","writableAttributes","nonVisibleWritableAttributes","intersection","uniq","nonWritableAttributes","sanitizeOutput","sanitizeInput","sanitizeQuery"],"mappings":"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"}
1
+ {"version":3,"file":"sanitize.js","sources":["../../../../../../../server/src/services/permission/permissions-manager/sanitize.ts"],"sourcesContent":["import { subject as asSubject } from '@casl/ability';\nimport {\n defaults,\n omit,\n isArray,\n isEmpty,\n uniq,\n intersection,\n pick,\n getOr,\n isObject,\n cloneDeep,\n} from 'lodash/fp';\n\nimport type { UID } from '@strapi/types';\n\nimport {\n contentTypes,\n traverseEntity,\n sanitize,\n async,\n traverse,\n createModelCache,\n} from '@strapi/utils';\nimport { createPermissionFieldsCache } from './permission-fields';\nimport { ADMIN_USER_ALLOWED_FIELDS } from '../../../domain/user';\n\nconst {\n visitors: { removePassword, expandWildcardPopulate },\n} = sanitize;\n\nconst {\n constants,\n isScalarAttribute,\n getNonVisibleAttributes,\n getNonWritableAttributes,\n getWritableAttributes,\n} = contentTypes;\nconst {\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = constants;\n\nconst COMPONENT_FIELDS = ['__component'];\nconst STATIC_FIELDS = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];\n\nexport default ({ action, ability, model }: any) => {\n const schema = strapi.getModel(model);\n\n const { removeDisallowedFields } = sanitize.visitors;\n\n // Create request-scoped model cache to avoid redundant getModel() calls\n const modelCache = createModelCache(strapi.getModel.bind(strapi));\n\n const ctx = {\n schema,\n getModel: modelCache.getModel,\n };\n\n const createSanitizeQuery = (options = {} as any) => {\n const { fields } = options;\n\n // TODO: sanitize relations to admin users in all sanitizers\n const permittedFields = fields.shouldIncludeAll ? null : getQueryFields(fields.permitted);\n\n const sanitizeFilters = async.pipe(\n traverse.traverseQueryFilters(removeDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryFilters(omitDisallowedAdminUserFields, ctx),\n traverse.traverseQueryFilters(omitHiddenFields, ctx),\n traverse.traverseQueryFilters(removePassword, ctx),\n traverse.traverseQueryFilters(({ key, value }, { remove }) => {\n if (isObject(value) && isEmpty(value)) {\n remove(key);\n }\n }, ctx)\n );\n\n const sanitizeSort = async.pipe(\n traverse.traverseQuerySort(removeDisallowedFields(permittedFields), ctx),\n traverse.traverseQuerySort(omitDisallowedAdminUserFields, ctx),\n traverse.traverseQuerySort(omitHiddenFields, ctx),\n traverse.traverseQuerySort(removePassword, ctx),\n traverse.traverseQuerySort(({ key, attribute, value }, { remove }) => {\n if (!isScalarAttribute(attribute) && isEmpty(value)) {\n remove(key);\n }\n }, ctx)\n );\n\n const sanitizePopulate = async.pipe(\n traverse.traverseQueryPopulate(expandWildcardPopulate, ctx),\n traverse.traverseQueryPopulate(removeDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryPopulate(omitDisallowedAdminUserFields, ctx),\n traverse.traverseQueryPopulate(omitHiddenFields, ctx),\n traverse.traverseQueryPopulate(removePassword, ctx)\n );\n\n const sanitizeFields = async.pipe(\n traverse.traverseQueryFields(removeDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryFields(omitHiddenFields, ctx),\n traverse.traverseQueryFields(removePassword, ctx)\n );\n\n return async (query: any) => {\n const sanitizedQuery = cloneDeep(query);\n\n if (query.filters) {\n Object.assign(sanitizedQuery, { filters: await sanitizeFilters(query.filters) });\n }\n\n if (query.sort) {\n Object.assign(sanitizedQuery, { sort: await sanitizeSort(query.sort) });\n }\n\n if (query.populate) {\n Object.assign(sanitizedQuery, { populate: await sanitizePopulate(query.populate) });\n }\n\n if (query.fields) {\n Object.assign(sanitizedQuery, { fields: await sanitizeFields(query.fields) });\n }\n\n return sanitizedQuery;\n };\n };\n\n const createSanitizeOutput = (options = {} as any) => {\n const { fields } = options;\n\n const permittedFields = fields.shouldIncludeAll ? null : getOutputFields(fields.permitted);\n\n return async.pipe(\n // Remove fields hidden from the admin\n traverseEntity(omitHiddenFields, ctx),\n // Remove unallowed fields from admin::user relations\n traverseEntity(pickAllowedAdminUserFields, ctx),\n // Remove not allowed fields (RBAC)\n traverseEntity(removeDisallowedFields(permittedFields), ctx),\n // Remove all fields of type 'password'\n sanitize.sanitizers.sanitizePasswords({\n schema,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n })\n );\n };\n\n const createSanitizeInput = (options = {} as any) => {\n const { fields } = options;\n\n const permittedFields = fields.shouldIncludeAll ? null : getInputFields(fields.permitted);\n\n return async.pipe(\n // Remove fields hidden from the admin\n traverseEntity(omitHiddenFields, ctx),\n // Remove not allowed fields (RBAC)\n traverseEntity(removeDisallowedFields(permittedFields), ctx),\n // Remove roles from createdBy & updatedBy fields\n omitCreatorRoles\n );\n };\n\n const wrapSanitize = (createSanitizeFunction: any) => {\n const { getPermissionFields } = createPermissionFieldsCache(ability);\n\n // TODO\n // @ts-expect-error define the correct return type\n const wrappedSanitize = async (data: unknown, options = {} as any) => {\n if (isArray(data)) {\n return Promise.all(data.map((entity: unknown) => wrappedSanitize(entity, options)));\n }\n\n const { subject, action: actionOverride } = getDefaultOptions(data, options);\n\n const { permittedFields, hasAtLeastOneRegistered, shouldIncludeAll } = getPermissionFields(\n actionOverride,\n subject\n );\n\n const sanitizeOptions = {\n ...options,\n fields: {\n shouldIncludeAll,\n permitted: permittedFields,\n hasAtLeastOneRegistered,\n },\n };\n\n const sanitizeFunction = createSanitizeFunction(sanitizeOptions);\n\n return sanitizeFunction(data);\n };\n\n return wrappedSanitize;\n };\n\n const getDefaultOptions = (data: any, options: unknown) => {\n return defaults({ subject: asSubject(model, data), action }, options);\n };\n\n /**\n * Omit creator fields' (createdBy & updatedBy) roles from the admin API responses\n */\n const omitCreatorRoles = omit([`${CREATED_BY_ATTRIBUTE}.roles`, `${UPDATED_BY_ATTRIBUTE}.roles`]);\n\n /**\n * Visitor used to remove hidden fields from the admin API responses\n */\n const omitHiddenFields = ({ key, schema }: any, { remove }: any) => {\n const isHidden = getOr(false, ['config', 'attributes', key, 'hidden'], schema);\n\n if (isHidden) {\n remove(key);\n }\n };\n\n /**\n * Visitor used to only select needed fields from the admin users entities & avoid leaking sensitive information\n */\n const pickAllowedAdminUserFields = ({ attribute, key, value }: any, { set }: any) => {\n const pickAllowedFields = pick(ADMIN_USER_ALLOWED_FIELDS);\n if (!attribute) {\n return;\n }\n\n if (attribute.type === 'relation' && attribute.target === 'admin::user' && value) {\n if (Array.isArray(value)) {\n set(key, value.map(pickAllowedFields));\n } else {\n set(key, pickAllowedFields(value));\n }\n }\n };\n\n /**\n * Visitor used to omit disallowed fields from the admin users entities & avoid leaking sensitive information\n */\n const omitDisallowedAdminUserFields = ({ key, attribute, schema }: any, { remove }: any) => {\n if (schema.uid === 'admin::user' && attribute && !ADMIN_USER_ALLOWED_FIELDS.includes(key)) {\n remove(key);\n }\n };\n\n const getInputFields = (fields = []) => {\n const nonVisibleAttributes = getNonVisibleAttributes(schema);\n const writableAttributes = getWritableAttributes(schema);\n\n const nonVisibleWritableAttributes = intersection(nonVisibleAttributes, writableAttributes);\n\n return uniq([...fields, ...COMPONENT_FIELDS, ...nonVisibleWritableAttributes]);\n };\n\n const getOutputFields = (fields = []) => {\n const nonWritableAttributes = getNonWritableAttributes(schema);\n const nonVisibleAttributes = getNonVisibleAttributes(schema);\n\n return uniq([\n ...fields,\n ...STATIC_FIELDS,\n ...COMPONENT_FIELDS,\n ...nonWritableAttributes,\n ...nonVisibleAttributes,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n ]);\n };\n\n const getQueryFields = (fields = []) => {\n const nonVisibleAttributes = getNonVisibleAttributes(schema);\n const writableAttributes = getWritableAttributes(schema);\n\n const nonVisibleWritableAttributes = intersection(nonVisibleAttributes, writableAttributes);\n\n return uniq([\n ...fields,\n ...STATIC_FIELDS,\n ...COMPONENT_FIELDS,\n ...nonVisibleWritableAttributes,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ]);\n };\n\n return {\n sanitizeOutput: wrapSanitize(createSanitizeOutput),\n sanitizeInput: wrapSanitize(createSanitizeInput),\n sanitizeQuery: wrapSanitize(createSanitizeQuery),\n };\n};\n"],"names":["visitors","removePassword","expandWildcardPopulate","sanitize","constants","isScalarAttribute","getNonVisibleAttributes","getNonWritableAttributes","getWritableAttributes","contentTypes","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","COMPONENT_FIELDS","STATIC_FIELDS","action","ability","model","schema","strapi","getModel","removeDisallowedFields","modelCache","createModelCache","bind","ctx","createSanitizeQuery","options","fields","permittedFields","shouldIncludeAll","getQueryFields","permitted","sanitizeFilters","async","pipe","traverse","traverseQueryFilters","omitDisallowedAdminUserFields","omitHiddenFields","key","value","remove","isObject","isEmpty","sanitizeSort","traverseQuerySort","attribute","sanitizePopulate","traverseQueryPopulate","sanitizeFields","traverseQueryFields","query","sanitizedQuery","cloneDeep","filters","Object","assign","sort","populate","createSanitizeOutput","getOutputFields","traverseEntity","pickAllowedAdminUserFields","sanitizers","sanitizePasswords","uid","createSanitizeInput","getInputFields","omitCreatorRoles","wrapSanitize","createSanitizeFunction","getPermissionFields","createPermissionFieldsCache","wrappedSanitize","data","isArray","Promise","all","map","entity","subject","actionOverride","getDefaultOptions","hasAtLeastOneRegistered","sanitizeOptions","sanitizeFunction","defaults","asSubject","omit","isHidden","getOr","set","pickAllowedFields","pick","ADMIN_USER_ALLOWED_FIELDS","type","target","Array","includes","nonVisibleAttributes","writableAttributes","nonVisibleWritableAttributes","intersection","uniq","nonWritableAttributes","sanitizeOutput","sanitizeInput","sanitizeQuery"],"mappings":"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"}