@strapi/admin 5.56.0 → 5.58.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 (465) hide show
  1. package/dist/admin/admin/src/components/Filters.js +1 -1
  2. package/dist/admin/admin/src/components/Filters.js.map +1 -1
  3. package/dist/admin/admin/src/components/Filters.mjs +1 -1
  4. package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/FormInputs/Boolean.js +3 -2
  6. package/dist/admin/admin/src/components/FormInputs/Boolean.js.map +1 -1
  7. package/dist/admin/admin/src/components/FormInputs/Boolean.mjs +3 -2
  8. package/dist/admin/admin/src/components/FormInputs/Boolean.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/FormInputs/Enumeration.js +2 -2
  10. package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
  11. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +2 -2
  12. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/MediaLibraryBanner.js +38 -2
  14. package/dist/admin/admin/src/components/MediaLibraryBanner.js.map +1 -1
  15. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs +18 -2
  16. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/RelativeTime.js +9 -0
  18. package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
  19. package/dist/admin/admin/src/components/RelativeTime.mjs +10 -1
  20. package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/TopBanners.js +52 -0
  22. package/dist/admin/admin/src/components/TopBanners.js.map +1 -0
  23. package/dist/admin/admin/src/components/TopBanners.mjs +30 -0
  24. package/dist/admin/admin/src/components/TopBanners.mjs.map +1 -0
  25. package/dist/admin/admin/src/constants.js +14 -0
  26. package/dist/admin/admin/src/constants.js.map +1 -1
  27. package/dist/admin/admin/src/constants.mjs +14 -0
  28. package/dist/admin/admin/src/constants.mjs.map +1 -1
  29. package/dist/admin/admin/src/features/Tracking.js +28 -8
  30. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  31. package/dist/admin/admin/src/features/Tracking.mjs +29 -10
  32. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  33. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +4 -20
  34. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  35. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +4 -20
  36. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  37. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js +59 -0
  38. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js.map +1 -0
  39. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs +37 -0
  40. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs.map +1 -0
  41. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js +6 -12
  42. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js.map +1 -1
  43. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs +6 -12
  44. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs.map +1 -1
  45. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +10 -2
  46. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  47. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +10 -2
  48. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  49. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +6 -56
  50. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  51. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +6 -56
  52. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  53. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js +217 -0
  54. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js.map +1 -0
  55. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs +195 -0
  56. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs.map +1 -0
  57. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js +185 -0
  58. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js.map +1 -0
  59. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs +162 -0
  60. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs.map +1 -0
  61. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js +342 -0
  62. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js.map +1 -0
  63. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs +320 -0
  64. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs.map +1 -0
  65. package/dist/admin/admin/src/services/admin.js +11 -1
  66. package/dist/admin/admin/src/services/admin.js.map +1 -1
  67. package/dist/admin/admin/src/services/admin.mjs +11 -2
  68. package/dist/admin/admin/src/services/admin.mjs.map +1 -1
  69. package/dist/admin/admin/src/translations/en.json.js +76 -4
  70. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  71. package/dist/admin/admin/src/translations/en.json.mjs +76 -4
  72. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  73. package/dist/admin/admin/src/utils/browserStrapi.js +1 -1
  74. package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -1
  75. package/dist/admin/admin/src/utils/browserStrapi.mjs +1 -1
  76. package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -1
  77. package/dist/admin/admin/src/utils/getFetchClient.js +27 -3
  78. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  79. package/dist/admin/admin/src/utils/getFetchClient.mjs +26 -3
  80. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  81. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +52 -22
  82. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
  83. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +53 -23
  84. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
  85. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js +16 -29
  86. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
  87. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs +18 -31
  88. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
  89. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js +473 -0
  90. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js.map +1 -0
  91. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs +471 -0
  92. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs.map +1 -0
  93. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +8 -1
  94. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  95. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +8 -1
  96. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  97. package/dist/admin/index.js +1 -0
  98. package/dist/admin/index.js.map +1 -1
  99. package/dist/admin/index.mjs +1 -1
  100. package/dist/admin/shared/utils/get-project-type.js +49 -0
  101. package/dist/admin/shared/utils/get-project-type.js.map +1 -0
  102. package/dist/admin/shared/utils/get-project-type.mjs +46 -0
  103. package/dist/admin/shared/utils/get-project-type.mjs.map +1 -0
  104. package/dist/admin/src/components/MediaLibraryBanner.d.ts +10 -1
  105. package/dist/admin/src/components/TopBanners.d.ts +8 -0
  106. package/dist/admin/src/constants.d.ts +10 -0
  107. package/dist/admin/src/features/Tracking.d.ts +12 -1
  108. package/dist/admin/src/layouts/useAuthenticatedAccessTracking.d.ts +6 -0
  109. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.d.ts +1 -1
  110. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.d.ts +12 -0
  111. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.d.ts +14 -0
  112. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.d.ts +2 -0
  113. package/dist/admin/src/services/admin.d.ts +2 -2
  114. package/dist/admin/src/types/permissions.d.ts +1 -0
  115. package/dist/admin/src/utils/getFetchClient.d.ts +25 -0
  116. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +29 -0
  117. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.d.ts +6 -1
  118. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.d.ts +2 -0
  119. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +7 -0
  120. package/dist/ee/server/src/audit-logs/entitlements.d.ts +8 -0
  121. package/dist/ee/server/src/audit-logs/entitlements.d.ts.map +1 -0
  122. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +16 -0
  123. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  124. package/dist/ee/server/src/controllers/admin.d.ts +36 -10
  125. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  126. package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
  127. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts +8 -2
  128. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts.map +1 -1
  129. package/dist/ee/server/src/controllers/authentication.d.ts.map +1 -1
  130. package/dist/ee/server/src/controllers/index.d.ts +36 -10
  131. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  132. package/dist/ee/server/src/controllers/user.d.ts.map +1 -1
  133. package/dist/ee/server/src/index.d.ts +40 -11
  134. package/dist/ee/server/src/index.d.ts.map +1 -1
  135. package/dist/ee/server/src/services/index.d.ts +4 -1
  136. package/dist/ee/server/src/services/index.d.ts.map +1 -1
  137. package/dist/ee/server/src/services/metrics.d.ts.map +1 -1
  138. package/dist/ee/server/src/services/persist-tables.d.ts.map +1 -1
  139. package/dist/ee/server/src/services/seat-enforcement.d.ts +3 -1
  140. package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -1
  141. package/dist/server/ee/server/src/audit-logs/entitlements.js +25 -0
  142. package/dist/server/ee/server/src/audit-logs/entitlements.js.map +1 -0
  143. package/dist/server/ee/server/src/audit-logs/entitlements.mjs +23 -0
  144. package/dist/server/ee/server/src/audit-logs/entitlements.mjs.map +1 -0
  145. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +20 -8
  146. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  147. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +19 -9
  148. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  149. package/dist/server/ee/server/src/controllers/admin.js +79 -7
  150. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  151. package/dist/server/ee/server/src/controllers/admin.mjs +79 -7
  152. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  153. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +28 -10
  154. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
  155. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +28 -10
  156. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
  157. package/dist/server/ee/server/src/controllers/authentication-utils/utils.js +2 -2
  158. package/dist/server/ee/server/src/controllers/authentication-utils/utils.js.map +1 -1
  159. package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs +2 -2
  160. package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs.map +1 -1
  161. package/dist/server/ee/server/src/controllers/authentication.js +11 -11
  162. package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
  163. package/dist/server/ee/server/src/controllers/authentication.mjs +11 -11
  164. package/dist/server/ee/server/src/controllers/authentication.mjs.map +1 -1
  165. package/dist/server/ee/server/src/controllers/user.js +7 -8
  166. package/dist/server/ee/server/src/controllers/user.js.map +1 -1
  167. package/dist/server/ee/server/src/controllers/user.mjs +8 -9
  168. package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
  169. package/dist/server/ee/server/src/index.js +2 -0
  170. package/dist/server/ee/server/src/index.js.map +1 -1
  171. package/dist/server/ee/server/src/index.mjs +2 -0
  172. package/dist/server/ee/server/src/index.mjs.map +1 -1
  173. package/dist/server/ee/server/src/services/metrics.js +9 -7
  174. package/dist/server/ee/server/src/services/metrics.js.map +1 -1
  175. package/dist/server/ee/server/src/services/metrics.mjs +9 -7
  176. package/dist/server/ee/server/src/services/metrics.mjs.map +1 -1
  177. package/dist/server/ee/server/src/services/persist-tables.js +3 -4
  178. package/dist/server/ee/server/src/services/persist-tables.js.map +1 -1
  179. package/dist/server/ee/server/src/services/persist-tables.mjs +3 -4
  180. package/dist/server/ee/server/src/services/persist-tables.mjs.map +1 -1
  181. package/dist/server/ee/server/src/services/role.js +2 -2
  182. package/dist/server/ee/server/src/services/role.js.map +1 -1
  183. package/dist/server/ee/server/src/services/role.mjs +1 -1
  184. package/dist/server/ee/server/src/services/role.mjs.map +1 -1
  185. package/dist/server/ee/server/src/services/seat-enforcement.js +20 -20
  186. package/dist/server/ee/server/src/services/seat-enforcement.js.map +1 -1
  187. package/dist/server/ee/server/src/services/seat-enforcement.mjs +20 -20
  188. package/dist/server/ee/server/src/services/seat-enforcement.mjs.map +1 -1
  189. package/dist/server/ee/server/src/services/user.js +1 -2
  190. package/dist/server/ee/server/src/services/user.js.map +1 -1
  191. package/dist/server/ee/server/src/services/user.mjs +2 -3
  192. package/dist/server/ee/server/src/services/user.mjs.map +1 -1
  193. package/dist/server/ee/server/src/utils/sso-lock.js +2 -2
  194. package/dist/server/ee/server/src/utils/sso-lock.js.map +1 -1
  195. package/dist/server/ee/server/src/utils/sso-lock.mjs +1 -1
  196. package/dist/server/ee/server/src/utils/sso-lock.mjs.map +1 -1
  197. package/dist/server/server/src/audit-logs/admin-users.js +3 -3
  198. package/dist/server/server/src/audit-logs/admin-users.js.map +1 -1
  199. package/dist/server/server/src/audit-logs/admin-users.mjs +2 -2
  200. package/dist/server/server/src/audit-logs/admin-users.mjs.map +1 -1
  201. package/dist/server/server/src/audit-logs/auth.js +72 -0
  202. package/dist/server/server/src/audit-logs/auth.js.map +1 -0
  203. package/dist/server/server/src/audit-logs/auth.mjs +67 -0
  204. package/dist/server/server/src/audit-logs/auth.mjs.map +1 -0
  205. package/dist/server/server/src/audit-logs/tokens.js +3 -3
  206. package/dist/server/server/src/audit-logs/tokens.js.map +1 -1
  207. package/dist/server/server/src/audit-logs/tokens.mjs +2 -2
  208. package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -1
  209. package/dist/server/server/src/audit-logs/webhooks.js +2 -2
  210. package/dist/server/server/src/audit-logs/webhooks.js.map +1 -1
  211. package/dist/server/server/src/audit-logs/webhooks.mjs +1 -1
  212. package/dist/server/server/src/audit-logs/webhooks.mjs.map +1 -1
  213. package/dist/server/server/src/bootstrap.js +6 -4
  214. package/dist/server/server/src/bootstrap.js.map +1 -1
  215. package/dist/server/server/src/bootstrap.mjs +6 -4
  216. package/dist/server/server/src/bootstrap.mjs.map +1 -1
  217. package/dist/server/server/src/config/admin-actions.js +7 -0
  218. package/dist/server/server/src/config/admin-actions.js.map +1 -1
  219. package/dist/server/server/src/config/admin-actions.mjs +7 -0
  220. package/dist/server/server/src/config/admin-actions.mjs.map +1 -1
  221. package/dist/server/server/src/controllers/admin-token.js +8 -8
  222. package/dist/server/server/src/controllers/admin-token.js.map +1 -1
  223. package/dist/server/server/src/controllers/admin-token.mjs +4 -4
  224. package/dist/server/server/src/controllers/admin-token.mjs.map +1 -1
  225. package/dist/server/server/src/controllers/admin.js +9 -5
  226. package/dist/server/server/src/controllers/admin.js.map +1 -1
  227. package/dist/server/server/src/controllers/admin.mjs +8 -4
  228. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  229. package/dist/server/server/src/controllers/api-token.js +8 -8
  230. package/dist/server/server/src/controllers/api-token.js.map +1 -1
  231. package/dist/server/server/src/controllers/api-token.mjs +4 -4
  232. package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
  233. package/dist/server/server/src/controllers/authentication.js +34 -8
  234. package/dist/server/server/src/controllers/authentication.js.map +1 -1
  235. package/dist/server/server/src/controllers/authentication.mjs +34 -8
  236. package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
  237. package/dist/server/server/src/controllers/formatters/conditions.js +2 -2
  238. package/dist/server/server/src/controllers/formatters/conditions.js.map +1 -1
  239. package/dist/server/server/src/controllers/formatters/conditions.mjs +2 -2
  240. package/dist/server/server/src/controllers/formatters/conditions.mjs.map +1 -1
  241. package/dist/server/server/src/controllers/transfer/index.js +2 -2
  242. package/dist/server/server/src/controllers/transfer/index.js.map +1 -1
  243. package/dist/server/server/src/controllers/transfer/index.mjs +2 -2
  244. package/dist/server/server/src/controllers/transfer/index.mjs.map +1 -1
  245. package/dist/server/server/src/controllers/transfer/token.js +8 -8
  246. package/dist/server/server/src/controllers/transfer/token.js.map +1 -1
  247. package/dist/server/server/src/controllers/transfer/token.mjs +4 -4
  248. package/dist/server/server/src/controllers/transfer/token.mjs.map +1 -1
  249. package/dist/server/server/src/domain/action/index.js +18 -16
  250. package/dist/server/server/src/domain/action/index.js.map +1 -1
  251. package/dist/server/server/src/domain/action/index.mjs +16 -14
  252. package/dist/server/server/src/domain/action/index.mjs.map +1 -1
  253. package/dist/server/server/src/domain/action/provider.mjs +4 -4
  254. package/dist/server/server/src/domain/action/provider.mjs.map +1 -1
  255. package/dist/server/server/src/domain/condition/index.js +7 -4
  256. package/dist/server/server/src/domain/condition/index.js.map +1 -1
  257. package/dist/server/server/src/domain/condition/index.mjs +7 -4
  258. package/dist/server/server/src/domain/condition/index.mjs.map +1 -1
  259. package/dist/server/server/src/domain/permission/index.js +24 -15
  260. package/dist/server/server/src/domain/permission/index.js.map +1 -1
  261. package/dist/server/server/src/domain/permission/index.mjs +21 -12
  262. package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
  263. package/dist/server/server/src/middlewares/rateLimit.js +5 -5
  264. package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
  265. package/dist/server/server/src/middlewares/rateLimit.mjs +4 -4
  266. package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
  267. package/dist/server/server/src/register.js +10 -0
  268. package/dist/server/server/src/register.js.map +1 -1
  269. package/dist/server/server/src/register.mjs +10 -0
  270. package/dist/server/server/src/register.mjs.map +1 -1
  271. package/dist/server/server/src/routes/admin.js +18 -0
  272. package/dist/server/server/src/routes/admin.js.map +1 -1
  273. package/dist/server/server/src/routes/admin.mjs +18 -0
  274. package/dist/server/server/src/routes/admin.mjs.map +1 -1
  275. package/dist/server/server/src/services/action.js +1 -2
  276. package/dist/server/server/src/services/action.js.map +1 -1
  277. package/dist/server/server/src/services/action.mjs +1 -2
  278. package/dist/server/server/src/services/action.mjs.map +1 -1
  279. package/dist/server/server/src/services/api-token.js +61 -49
  280. package/dist/server/server/src/services/api-token.js.map +1 -1
  281. package/dist/server/server/src/services/api-token.mjs +53 -41
  282. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  283. package/dist/server/server/src/services/auth.js +4 -2
  284. package/dist/server/server/src/services/auth.js.map +1 -1
  285. package/dist/server/server/src/services/auth.mjs +4 -3
  286. package/dist/server/server/src/services/auth.mjs.map +1 -1
  287. package/dist/server/server/src/services/condition.js +2 -2
  288. package/dist/server/server/src/services/condition.js.map +1 -1
  289. package/dist/server/server/src/services/condition.mjs +1 -1
  290. package/dist/server/server/src/services/condition.mjs.map +1 -1
  291. package/dist/server/server/src/services/content-type.js +5 -4
  292. package/dist/server/server/src/services/content-type.js.map +1 -1
  293. package/dist/server/server/src/services/content-type.mjs +8 -7
  294. package/dist/server/server/src/services/content-type.mjs.map +1 -1
  295. package/dist/server/server/src/services/debug-dump.js +173 -0
  296. package/dist/server/server/src/services/debug-dump.js.map +1 -0
  297. package/dist/server/server/src/services/debug-dump.mjs +166 -0
  298. package/dist/server/server/src/services/debug-dump.mjs.map +1 -0
  299. package/dist/server/server/src/services/homepage.js +2 -1
  300. package/dist/server/server/src/services/homepage.js.map +1 -1
  301. package/dist/server/server/src/services/homepage.mjs +2 -1
  302. package/dist/server/server/src/services/homepage.mjs.map +1 -1
  303. package/dist/server/server/src/services/index.js +3 -1
  304. package/dist/server/server/src/services/index.js.map +1 -1
  305. package/dist/server/server/src/services/index.mjs +3 -1
  306. package/dist/server/server/src/services/index.mjs.map +1 -1
  307. package/dist/server/server/src/services/passport/local-strategy.js +2 -2
  308. package/dist/server/server/src/services/passport/local-strategy.js.map +1 -1
  309. package/dist/server/server/src/services/passport/local-strategy.mjs +1 -1
  310. package/dist/server/server/src/services/passport/local-strategy.mjs.map +1 -1
  311. package/dist/server/server/src/services/passport.js +1 -2
  312. package/dist/server/server/src/services/passport.js.map +1 -1
  313. package/dist/server/server/src/services/passport.mjs +1 -2
  314. package/dist/server/server/src/services/passport.mjs.map +1 -1
  315. package/dist/server/server/src/services/permission/engine.js +4 -4
  316. package/dist/server/server/src/services/permission/engine.js.map +1 -1
  317. package/dist/server/server/src/services/permission/engine.mjs +2 -2
  318. package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
  319. package/dist/server/server/src/services/permission/permissions-manager/index.js +2 -3
  320. package/dist/server/server/src/services/permission/permissions-manager/index.js.map +1 -1
  321. package/dist/server/server/src/services/permission/permissions-manager/index.mjs +1 -2
  322. package/dist/server/server/src/services/permission/permissions-manager/index.mjs.map +1 -1
  323. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js +6 -6
  324. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js.map +1 -1
  325. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs +4 -4
  326. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs.map +1 -1
  327. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js +47 -41
  328. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
  329. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs +44 -38
  330. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
  331. package/dist/server/server/src/services/permission/permissions-manager/validate.js +30 -26
  332. package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
  333. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs +28 -24
  334. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
  335. package/dist/server/server/src/services/permission/queries.js +9 -9
  336. package/dist/server/server/src/services/permission/queries.js.map +1 -1
  337. package/dist/server/server/src/services/permission/queries.mjs +9 -9
  338. package/dist/server/server/src/services/permission/queries.mjs.map +1 -1
  339. package/dist/server/server/src/services/permission/rename-fields.js +118 -0
  340. package/dist/server/server/src/services/permission/rename-fields.js.map +1 -0
  341. package/dist/server/server/src/services/permission/rename-fields.mjs +116 -0
  342. package/dist/server/server/src/services/permission/rename-fields.mjs.map +1 -0
  343. package/dist/server/server/src/services/permission/sections-builder/index.js +2 -2
  344. package/dist/server/server/src/services/permission/sections-builder/index.js.map +1 -1
  345. package/dist/server/server/src/services/permission/sections-builder/index.mjs +2 -2
  346. package/dist/server/server/src/services/permission/sections-builder/index.mjs.map +1 -1
  347. package/dist/server/server/src/services/permission/sections-builder/section.js +1 -2
  348. package/dist/server/server/src/services/permission/sections-builder/section.js.map +1 -1
  349. package/dist/server/server/src/services/permission/sections-builder/section.mjs +1 -2
  350. package/dist/server/server/src/services/permission/sections-builder/section.mjs.map +1 -1
  351. package/dist/server/server/src/services/permission/sections-builder/utils.js +6 -6
  352. package/dist/server/server/src/services/permission/sections-builder/utils.js.map +1 -1
  353. package/dist/server/server/src/services/permission/sections-builder/utils.mjs +4 -4
  354. package/dist/server/server/src/services/permission/sections-builder/utils.mjs.map +1 -1
  355. package/dist/server/server/src/services/role.js +20 -19
  356. package/dist/server/server/src/services/role.js.map +1 -1
  357. package/dist/server/server/src/services/role.mjs +20 -19
  358. package/dist/server/server/src/services/role.mjs.map +1 -1
  359. package/dist/server/server/src/services/transfer/token.js +20 -16
  360. package/dist/server/server/src/services/transfer/token.js.map +1 -1
  361. package/dist/server/server/src/services/transfer/token.mjs +14 -10
  362. package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
  363. package/dist/server/server/src/services/user.js +2 -3
  364. package/dist/server/server/src/services/user.js.map +1 -1
  365. package/dist/server/server/src/services/user.mjs +3 -4
  366. package/dist/server/server/src/services/user.mjs.map +1 -1
  367. package/dist/server/server/src/strategies/api-token-utils.js +2 -3
  368. package/dist/server/server/src/strategies/api-token-utils.js.map +1 -1
  369. package/dist/server/server/src/strategies/api-token-utils.mjs +2 -3
  370. package/dist/server/server/src/strategies/api-token-utils.mjs.map +1 -1
  371. package/dist/server/server/src/strategies/content-api-token.js +3 -3
  372. package/dist/server/server/src/strategies/content-api-token.js.map +1 -1
  373. package/dist/server/server/src/strategies/content-api-token.mjs +1 -1
  374. package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -1
  375. package/dist/server/server/src/strategies/data-transfer.js +4 -4
  376. package/dist/server/server/src/strategies/data-transfer.js.map +1 -1
  377. package/dist/server/server/src/strategies/data-transfer.mjs +3 -3
  378. package/dist/server/server/src/strategies/data-transfer.mjs.map +1 -1
  379. package/dist/server/server/src/utils/debug-dump/redact.js +197 -0
  380. package/dist/server/server/src/utils/debug-dump/redact.js.map +1 -0
  381. package/dist/server/server/src/utils/debug-dump/redact.mjs +194 -0
  382. package/dist/server/server/src/utils/debug-dump/redact.mjs.map +1 -0
  383. package/dist/server/server/src/validation/common-validators.js +9 -10
  384. package/dist/server/server/src/validation/common-validators.js.map +1 -1
  385. package/dist/server/server/src/validation/common-validators.mjs +13 -14
  386. package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
  387. package/dist/server/server/src/validation/user.js +1 -2
  388. package/dist/server/server/src/validation/user.js.map +1 -1
  389. package/dist/server/server/src/validation/user.mjs +1 -2
  390. package/dist/server/server/src/validation/user.mjs.map +1 -1
  391. package/dist/server/shared/utils/get-project-type.js +49 -0
  392. package/dist/server/shared/utils/get-project-type.js.map +1 -0
  393. package/dist/server/shared/utils/get-project-type.mjs +46 -0
  394. package/dist/server/shared/utils/get-project-type.mjs.map +1 -0
  395. package/dist/server/src/audit-logs/auth.d.ts +72 -0
  396. package/dist/server/src/audit-logs/auth.d.ts.map +1 -0
  397. package/dist/server/src/audit-logs/tokens.d.ts.map +1 -1
  398. package/dist/server/src/bootstrap.d.ts.map +1 -1
  399. package/dist/server/src/config/admin-actions.d.ts.map +1 -1
  400. package/dist/server/src/controllers/admin-token.d.ts.map +1 -1
  401. package/dist/server/src/controllers/admin.d.ts +3 -0
  402. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  403. package/dist/server/src/controllers/api-token.d.ts.map +1 -1
  404. package/dist/server/src/controllers/authentication.d.ts.map +1 -1
  405. package/dist/server/src/controllers/formatters/conditions.d.ts +1 -1
  406. package/dist/server/src/controllers/formatters/conditions.d.ts.map +1 -1
  407. package/dist/server/src/controllers/homepage.d.ts +1 -1
  408. package/dist/server/src/controllers/index.d.ts +4 -1
  409. package/dist/server/src/controllers/index.d.ts.map +1 -1
  410. package/dist/server/src/controllers/transfer/index.d.ts.map +1 -1
  411. package/dist/server/src/controllers/transfer/token.d.ts.map +1 -1
  412. package/dist/server/src/domain/action/index.d.ts +1 -0
  413. package/dist/server/src/domain/action/index.d.ts.map +1 -1
  414. package/dist/server/src/domain/condition/index.d.ts +2 -2
  415. package/dist/server/src/domain/condition/index.d.ts.map +1 -1
  416. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  417. package/dist/server/src/index.d.ts +11 -3
  418. package/dist/server/src/index.d.ts.map +1 -1
  419. package/dist/server/src/middlewares/index.d.ts.map +1 -1
  420. package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
  421. package/dist/server/src/register.d.ts.map +1 -1
  422. package/dist/server/src/routes/admin.d.ts.map +1 -1
  423. package/dist/server/src/services/action.d.ts.map +1 -1
  424. package/dist/server/src/services/api-token.d.ts.map +1 -1
  425. package/dist/server/src/services/auth.d.ts +6 -0
  426. package/dist/server/src/services/auth.d.ts.map +1 -1
  427. package/dist/server/src/services/condition.d.ts.map +1 -1
  428. package/dist/server/src/services/content-type.d.ts.map +1 -1
  429. package/dist/server/src/services/debug-dump.d.ts +9 -0
  430. package/dist/server/src/services/debug-dump.d.ts.map +1 -0
  431. package/dist/server/src/services/homepage.d.ts +1 -1
  432. package/dist/server/src/services/homepage.d.ts.map +1 -1
  433. package/dist/server/src/services/index.d.ts +7 -2
  434. package/dist/server/src/services/index.d.ts.map +1 -1
  435. package/dist/server/src/services/passport/local-strategy.d.ts.map +1 -1
  436. package/dist/server/src/services/passport.d.ts.map +1 -1
  437. package/dist/server/src/services/permission/engine.d.ts.map +1 -1
  438. package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -1
  439. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
  440. package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
  441. package/dist/server/src/services/permission/queries.d.ts.map +1 -1
  442. package/dist/server/src/services/permission/rename-fields.d.ts +21 -0
  443. package/dist/server/src/services/permission/rename-fields.d.ts.map +1 -0
  444. package/dist/server/src/services/permission/sections-builder/section.d.ts.map +1 -1
  445. package/dist/server/src/services/permission/sections-builder/utils.d.ts +1 -1
  446. package/dist/server/src/services/permission/sections-builder/utils.d.ts.map +1 -1
  447. package/dist/server/src/services/role.d.ts +1 -1
  448. package/dist/server/src/services/role.d.ts.map +1 -1
  449. package/dist/server/src/services/transfer/token.d.ts.map +1 -1
  450. package/dist/server/src/strategies/content-api-token.d.ts.map +1 -1
  451. package/dist/server/src/utils/debug-dump/redact.d.ts +8 -0
  452. package/dist/server/src/utils/debug-dump/redact.d.ts.map +1 -0
  453. package/dist/server/src/validation/user.d.ts.map +1 -1
  454. package/dist/shared/contracts/admin.d.ts +106 -0
  455. package/dist/shared/contracts/admin.d.ts.map +1 -1
  456. package/dist/shared/utils/__tests__/get-project-type.test.d.ts +1 -0
  457. package/dist/shared/utils/__tests__/get-project-type.test.d.ts.map +1 -0
  458. package/dist/shared/utils/get-project-type.d.ts +37 -0
  459. package/dist/shared/utils/get-project-type.d.ts.map +1 -0
  460. package/package.json +10 -10
  461. package/dist/admin/admin/src/utils/getProjectType.js +0 -22
  462. package/dist/admin/admin/src/utils/getProjectType.js.map +0 -1
  463. package/dist/admin/admin/src/utils/getProjectType.mjs +0 -20
  464. package/dist/admin/admin/src/utils/getProjectType.mjs.map +0 -1
  465. package/dist/admin/src/utils/getProjectType.d.ts +0 -16
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var pmap = require('p-map');
5
5
  var index = require('../../utils/index.js');
6
6
  var index$1 = require('../../domain/permission/index.js');
@@ -24,7 +24,7 @@ var pmap__default = /*#__PURE__*/_interopDefault(pmap);
24
24
  }
25
25
  });
26
26
  if (permissionsToDelete.length > 0) {
27
- await deleteByIds(permissionsToDelete.map(fp.prop('id')));
27
+ await deleteByIds(permissionsToDelete.map((permission)=>permission?.id));
28
28
  }
29
29
  };
30
30
  /**
@@ -105,13 +105,13 @@ const filterPermissionsToRemove = async (permissions)=>{
105
105
  const { applyToProperties } = options;
106
106
  const invalidProperties = await Promise.all((applyToProperties || []).map(async (property)=>{
107
107
  const applies = await actionProvider.appliesToProperty(property, permission.action, permission.subject);
108
- return applies && fp.isNil(index$1.default.getProperty(property, permission));
108
+ return applies && index$1.default.getProperty(property, permission) == null;
109
109
  }));
110
110
  const isRegisteredAction = actionProvider.has(permission.action);
111
- const hasInvalidProperties = fp.isArray(applyToProperties) && invalidProperties.every(fp.eq(true));
112
- const isInvalidSubject = fp.isArray(subjects) && !subjects.includes(permission.subject);
111
+ const hasInvalidProperties = Array.isArray(applyToProperties) && invalidProperties.every((result)=>result === true);
112
+ const isInvalidSubject = Array.isArray(subjects) && !subjects.includes(permission.subject);
113
113
  // On an api token permission, nil properties mean "everything", not "invalid"
114
- const hasApiToken = !fp.isNil(fp.prop('apiToken', permission));
114
+ const hasApiToken = _.get(permission, 'apiToken') != null;
115
115
  // If the permission has an invalid action, an invalid subject or invalid properties, then add it to the toBeRemoved collection
116
116
  if (!isRegisteredAction || isInvalidSubject || hasInvalidProperties && !hasApiToken) {
117
117
  permissionsToRemove.push(permission);
@@ -148,9 +148,9 @@ const filterPermissionsToRemove = async (permissions)=>{
148
148
  const remainingPermissions = permissions.filter((permission)=>!permissionsIdToRemove.includes(permission.id));
149
149
  const permissionsWithCleanFields = contentTypeService.cleanPermissionFields(remainingPermissions);
150
150
  // Update only the ones that need to be updated
151
- const permissionsNeedingToBeUpdated = fp.differenceWith((a, b)=>{
152
- return a.id === b.id && fp.xor(a.properties.fields, b.properties.fields).length === 0;
153
- }, permissionsWithCleanFields, remainingPermissions);
151
+ const permissionsNeedingToBeUpdated = _.differenceWith(permissionsWithCleanFields, remainingPermissions, (a, b)=>{
152
+ return a.id === b.id && _.xor(b.properties.fields, a.properties.fields).length === 0;
153
+ });
154
154
  const updatePromiseProvider = (permission)=>{
155
155
  return update({
156
156
  id: permission.id
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sources":["../../../../../../server/src/services/permission/queries.ts"],"sourcesContent":["import { isNil, isArray, prop, xor, eq, differenceWith } from 'lodash/fp';\nimport pmap from 'p-map';\nimport type { Data } from '@strapi/types';\nimport { getService } from '../../utils';\nimport permissionDomain, { CreatePermissionPayload } from '../../domain/permission';\nimport type { AdminUser, Permission } from '../../../../shared/contracts/shared';\nimport { Action } from '../../domain/action';\n\n/**\n * Delete permissions of roles in database\n * @param rolesIds ids of roles\n */\nexport const deleteByRolesIds = async (rolesIds: Data.ID[]): Promise<void> => {\n const permissionsToDelete = await strapi.db.query('admin::permission').findMany({\n select: ['id'],\n where: {\n role: { id: rolesIds },\n },\n });\n\n if (permissionsToDelete.length > 0) {\n await deleteByIds(permissionsToDelete.map(prop('id')));\n }\n};\n\n/**\n * Delete permissions\n * @param ids ids of permissions\n */\nexport const deleteByIds = async (ids: Data.ID[]): Promise<void> => {\n const result: unknown[] = [];\n for (const id of ids) {\n const queryResult = await strapi.db.query('admin::permission').delete({ where: { id } });\n result.push(queryResult);\n }\n strapi.eventHub.emit('permission.delete', { permissions: result });\n};\n\n/**\n * Create many permissions\n * @param permissions\n */\nexport const createMany = async (permissions: CreatePermissionPayload[]): Promise<Permission[]> => {\n const createdPermissions: CreatePermissionPayload[] = [];\n for (const permission of permissions) {\n const newPerm = await strapi.db.query('admin::permission').create({ data: permission });\n createdPermissions.push(newPerm);\n }\n\n const permissionsToReturn = permissionDomain.toPermission(createdPermissions);\n strapi.eventHub.emit('permission.create', { permissions: permissionsToReturn });\n\n return permissionsToReturn;\n};\n\n/**\n * Update a permission\n * @param params\n * @param attributes\n */\nconst update = async (params: unknown, attributes: Partial<Permission>) => {\n const updatedPermission = (await strapi.db\n .query('admin::permission')\n .update({ where: params, data: attributes })) as Permission;\n\n const permissionToReturn = permissionDomain.toPermission(updatedPermission);\n strapi.eventHub.emit('permission.update', { permissions: permissionToReturn });\n\n return permissionToReturn;\n};\n\n/**\n * Find assigned permissions in the database\n * @param params query params to find the permissions\n */\nexport const findMany = async (params = {}): Promise<Permission[]> => {\n const rawPermissions = await strapi.db.query('admin::permission').findMany(params);\n\n return permissionDomain.toPermission(rawPermissions);\n};\n\n/**\n * Find all permissions for a user\n * @param user - user\n */\nexport const findUserPermissions = async (user: AdminUser): Promise<Permission[]> => {\n return findMany({ where: { role: { users: { id: user.id } } } });\n};\n\nconst filterPermissionsToRemove = async (permissions: Permission[]) => {\n const { actionProvider } = getService('permission');\n\n const permissionsToRemove: Permission[] = [];\n\n for (const permission of permissions) {\n const { subjects, options = {} as Action['options'] } =\n (actionProvider.get(permission.action) as Action) || {};\n const { applyToProperties } = options;\n\n const invalidProperties = await Promise.all(\n (applyToProperties || []).map(async (property) => {\n const applies = await actionProvider.appliesToProperty(\n property,\n permission.action,\n permission.subject\n );\n\n return applies && isNil(permissionDomain.getProperty(property, permission));\n })\n );\n\n const isRegisteredAction = actionProvider.has(permission.action);\n const hasInvalidProperties = isArray(applyToProperties) && invalidProperties.every(eq(true));\n const isInvalidSubject = isArray(subjects) && !subjects.includes(permission.subject as string);\n // On an api token permission, nil properties mean \"everything\", not \"invalid\"\n const hasApiToken = !isNil(prop('apiToken', permission));\n\n // If the permission has an invalid action, an invalid subject or invalid properties, then add it to the toBeRemoved collection\n if (!isRegisteredAction || isInvalidSubject || (hasInvalidProperties && !hasApiToken)) {\n permissionsToRemove.push(permission);\n }\n }\n\n return permissionsToRemove;\n};\n\n/**\n * Removes permissions in database that don't exist anymore\n */\nexport const cleanPermissionsInDatabase = async (): Promise<void> => {\n const pageSize = 200;\n\n const contentTypeService = getService('content-type');\n\n const total = await strapi.db.query('admin::permission').count();\n const pageCount = Math.ceil(total / pageSize);\n\n for (let page = 0; page < pageCount; page += 1) {\n // 1. Find invalid permissions and collect their ID to delete them later\n const results = (await strapi.db.query('admin::permission').findMany({\n limit: pageSize,\n offset: page * pageSize,\n populate: ['role', 'apiToken'],\n })) as Permission[];\n\n const permissions = permissionDomain.toPermission(results);\n const permissionsToRemove = await filterPermissionsToRemove(permissions);\n\n // Also remove orphaned permissions (no role AND no apiToken)\n const orphanedPermissions = permissions.filter(\n (permission: any) => !permission.role && !permission.apiToken\n );\n\n const permissionsIdToRemove = Array.from(\n new Set([...permissionsToRemove, ...orphanedPermissions].map((p) => p.id))\n );\n\n // 2. Clean permissions' fields (add required ones, remove the non-existing ones)\n const remainingPermissions = permissions.filter(\n (permission: Permission) => !permissionsIdToRemove.includes(permission.id)\n );\n\n const permissionsWithCleanFields = contentTypeService.cleanPermissionFields(\n remainingPermissions\n ) as Permission[];\n\n // Update only the ones that need to be updated\n const permissionsNeedingToBeUpdated = differenceWith(\n (a: Permission, b: Permission) => {\n return a.id === b.id && xor(a.properties.fields, b.properties.fields).length === 0;\n },\n permissionsWithCleanFields,\n remainingPermissions\n );\n\n const updatePromiseProvider = (permission: Permission) => {\n return update({ id: permission.id }, permission);\n };\n\n // Execute all the queries, update the database\n await Promise.all([\n deleteByIds(permissionsIdToRemove),\n pmap(permissionsNeedingToBeUpdated, updatePromiseProvider, {\n concurrency: 100,\n stopOnError: true,\n }),\n ]);\n }\n};\n\nexport default {\n createMany,\n findMany,\n deleteByRolesIds,\n deleteByIds,\n findUserPermissions,\n cleanPermissionsInDatabase,\n};\n"],"names":["deleteByRolesIds","rolesIds","permissionsToDelete","strapi","db","query","findMany","select","where","role","id","length","deleteByIds","map","prop","ids","result","queryResult","delete","push","eventHub","emit","permissions","createMany","createdPermissions","permission","newPerm","create","data","permissionsToReturn","permissionDomain","toPermission","update","params","attributes","updatedPermission","permissionToReturn","rawPermissions","findUserPermissions","user","users","filterPermissionsToRemove","actionProvider","getService","permissionsToRemove","subjects","options","get","action","applyToProperties","invalidProperties","Promise","all","property","applies","appliesToProperty","subject","isNil","getProperty","isRegisteredAction","has","hasInvalidProperties","isArray","every","eq","isInvalidSubject","includes","hasApiToken","cleanPermissionsInDatabase","pageSize","contentTypeService","total","count","pageCount","Math","ceil","page","results","limit","offset","populate","orphanedPermissions","filter","apiToken","permissionsIdToRemove","Array","from","Set","p","remainingPermissions","permissionsWithCleanFields","cleanPermissionFields","permissionsNeedingToBeUpdated","differenceWith","a","b","xor","properties","fields","updatePromiseProvider","pmap","concurrency","stopOnError"],"mappings":"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"}
1
+ {"version":3,"file":"queries.js","sources":["../../../../../../server/src/services/permission/queries.ts"],"sourcesContent":["import { get, xor, differenceWith } from 'lodash';\n\nimport pmap from 'p-map';\nimport type { Data } from '@strapi/types';\nimport { getService } from '../../utils';\nimport permissionDomain, { CreatePermissionPayload } from '../../domain/permission';\nimport type { AdminUser, Permission } from '../../../../shared/contracts/shared';\nimport { Action } from '../../domain/action';\n\n/**\n * Delete permissions of roles in database\n * @param rolesIds ids of roles\n */\nexport const deleteByRolesIds = async (rolesIds: Data.ID[]): Promise<void> => {\n const permissionsToDelete = await strapi.db.query('admin::permission').findMany({\n select: ['id'],\n where: {\n role: { id: rolesIds },\n },\n });\n\n if (permissionsToDelete.length > 0) {\n await deleteByIds(permissionsToDelete.map((permission) => permission?.id));\n }\n};\n\n/**\n * Delete permissions\n * @param ids ids of permissions\n */\nexport const deleteByIds = async (ids: Data.ID[]): Promise<void> => {\n const result: unknown[] = [];\n for (const id of ids) {\n const queryResult = await strapi.db.query('admin::permission').delete({ where: { id } });\n result.push(queryResult);\n }\n strapi.eventHub.emit('permission.delete', { permissions: result });\n};\n\n/**\n * Create many permissions\n * @param permissions\n */\nexport const createMany = async (permissions: CreatePermissionPayload[]): Promise<Permission[]> => {\n const createdPermissions: CreatePermissionPayload[] = [];\n for (const permission of permissions) {\n const newPerm = await strapi.db.query('admin::permission').create({ data: permission });\n createdPermissions.push(newPerm);\n }\n\n const permissionsToReturn = permissionDomain.toPermission(createdPermissions);\n strapi.eventHub.emit('permission.create', { permissions: permissionsToReturn });\n\n return permissionsToReturn;\n};\n\n/**\n * Update a permission\n * @param params\n * @param attributes\n */\nconst update = async (params: unknown, attributes: Partial<Permission>) => {\n const updatedPermission = (await strapi.db\n .query('admin::permission')\n .update({ where: params, data: attributes })) as Permission;\n\n const permissionToReturn = permissionDomain.toPermission(updatedPermission);\n strapi.eventHub.emit('permission.update', { permissions: permissionToReturn });\n\n return permissionToReturn;\n};\n\n/**\n * Find assigned permissions in the database\n * @param params query params to find the permissions\n */\nexport const findMany = async (params = {}): Promise<Permission[]> => {\n const rawPermissions = await strapi.db.query('admin::permission').findMany(params);\n\n return permissionDomain.toPermission(rawPermissions);\n};\n\n/**\n * Find all permissions for a user\n * @param user - user\n */\nexport const findUserPermissions = async (user: AdminUser): Promise<Permission[]> => {\n return findMany({ where: { role: { users: { id: user.id } } } });\n};\n\nconst filterPermissionsToRemove = async (permissions: Permission[]) => {\n const { actionProvider } = getService('permission');\n\n const permissionsToRemove: Permission[] = [];\n\n for (const permission of permissions) {\n const { subjects, options = {} as Action['options'] } =\n (actionProvider.get(permission.action) as Action) || {};\n const { applyToProperties } = options;\n\n const invalidProperties = await Promise.all(\n (applyToProperties || []).map(async (property) => {\n const applies = await actionProvider.appliesToProperty(\n property,\n permission.action,\n permission.subject\n );\n\n return applies && permissionDomain.getProperty(property, permission) == null;\n })\n );\n\n const isRegisteredAction = actionProvider.has(permission.action);\n const hasInvalidProperties =\n Array.isArray(applyToProperties) && invalidProperties.every((result) => result === true);\n const isInvalidSubject =\n Array.isArray(subjects) && !subjects.includes(permission.subject as string);\n // On an api token permission, nil properties mean \"everything\", not \"invalid\"\n const hasApiToken = get(permission, 'apiToken') != null;\n\n // If the permission has an invalid action, an invalid subject or invalid properties, then add it to the toBeRemoved collection\n if (!isRegisteredAction || isInvalidSubject || (hasInvalidProperties && !hasApiToken)) {\n permissionsToRemove.push(permission);\n }\n }\n\n return permissionsToRemove;\n};\n\n/**\n * Removes permissions in database that don't exist anymore\n */\nexport const cleanPermissionsInDatabase = async (): Promise<void> => {\n const pageSize = 200;\n\n const contentTypeService = getService('content-type');\n\n const total = await strapi.db.query('admin::permission').count();\n const pageCount = Math.ceil(total / pageSize);\n\n for (let page = 0; page < pageCount; page += 1) {\n // 1. Find invalid permissions and collect their ID to delete them later\n const results = (await strapi.db.query('admin::permission').findMany({\n limit: pageSize,\n offset: page * pageSize,\n populate: ['role', 'apiToken'],\n })) as Permission[];\n\n const permissions = permissionDomain.toPermission(results);\n const permissionsToRemove = await filterPermissionsToRemove(permissions);\n\n // Also remove orphaned permissions (no role AND no apiToken)\n const orphanedPermissions = permissions.filter(\n (permission: any) => !permission.role && !permission.apiToken\n );\n\n const permissionsIdToRemove = Array.from(\n new Set([...permissionsToRemove, ...orphanedPermissions].map((p) => p.id))\n );\n\n // 2. Clean permissions' fields (add required ones, remove the non-existing ones)\n const remainingPermissions = permissions.filter(\n (permission: Permission) => !permissionsIdToRemove.includes(permission.id)\n );\n\n const permissionsWithCleanFields = contentTypeService.cleanPermissionFields(\n remainingPermissions\n ) as Permission[];\n\n // Update only the ones that need to be updated\n const permissionsNeedingToBeUpdated = differenceWith(\n permissionsWithCleanFields,\n remainingPermissions,\n (a: Permission, b: Permission) => {\n return a.id === b.id && xor(b.properties.fields, a.properties.fields).length === 0;\n }\n );\n\n const updatePromiseProvider = (permission: Permission) => {\n return update({ id: permission.id }, permission);\n };\n\n // Execute all the queries, update the database\n await Promise.all([\n deleteByIds(permissionsIdToRemove),\n pmap(permissionsNeedingToBeUpdated, updatePromiseProvider, {\n concurrency: 100,\n stopOnError: true,\n }),\n ]);\n }\n};\n\nexport default {\n createMany,\n findMany,\n deleteByRolesIds,\n deleteByIds,\n findUserPermissions,\n cleanPermissionsInDatabase,\n};\n"],"names":["deleteByRolesIds","rolesIds","permissionsToDelete","strapi","db","query","findMany","select","where","role","id","length","deleteByIds","map","permission","ids","result","queryResult","delete","push","eventHub","emit","permissions","createMany","createdPermissions","newPerm","create","data","permissionsToReturn","permissionDomain","toPermission","update","params","attributes","updatedPermission","permissionToReturn","rawPermissions","findUserPermissions","user","users","filterPermissionsToRemove","actionProvider","getService","permissionsToRemove","subjects","options","get","action","applyToProperties","invalidProperties","Promise","all","property","applies","appliesToProperty","subject","getProperty","isRegisteredAction","has","hasInvalidProperties","Array","isArray","every","isInvalidSubject","includes","hasApiToken","cleanPermissionsInDatabase","pageSize","contentTypeService","total","count","pageCount","Math","ceil","page","results","limit","offset","populate","orphanedPermissions","filter","apiToken","permissionsIdToRemove","from","Set","p","remainingPermissions","permissionsWithCleanFields","cleanPermissionFields","permissionsNeedingToBeUpdated","differenceWith","a","b","xor","properties","fields","updatePromiseProvider","pmap","concurrency","stopOnError"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { differenceWith, xor, prop, isNil, isArray, eq } from 'lodash/fp';
1
+ import { differenceWith, xor, get } from 'lodash';
2
2
  import pmap from 'p-map';
3
3
  import { getService } from '../../utils/index.mjs';
4
4
  import permissionDomain from '../../domain/permission/index.mjs';
@@ -18,7 +18,7 @@ import permissionDomain from '../../domain/permission/index.mjs';
18
18
  }
19
19
  });
20
20
  if (permissionsToDelete.length > 0) {
21
- await deleteByIds(permissionsToDelete.map(prop('id')));
21
+ await deleteByIds(permissionsToDelete.map((permission)=>permission?.id));
22
22
  }
23
23
  };
24
24
  /**
@@ -99,13 +99,13 @@ const filterPermissionsToRemove = async (permissions)=>{
99
99
  const { applyToProperties } = options;
100
100
  const invalidProperties = await Promise.all((applyToProperties || []).map(async (property)=>{
101
101
  const applies = await actionProvider.appliesToProperty(property, permission.action, permission.subject);
102
- return applies && isNil(permissionDomain.getProperty(property, permission));
102
+ return applies && permissionDomain.getProperty(property, permission) == null;
103
103
  }));
104
104
  const isRegisteredAction = actionProvider.has(permission.action);
105
- const hasInvalidProperties = isArray(applyToProperties) && invalidProperties.every(eq(true));
106
- const isInvalidSubject = isArray(subjects) && !subjects.includes(permission.subject);
105
+ const hasInvalidProperties = Array.isArray(applyToProperties) && invalidProperties.every((result)=>result === true);
106
+ const isInvalidSubject = Array.isArray(subjects) && !subjects.includes(permission.subject);
107
107
  // On an api token permission, nil properties mean "everything", not "invalid"
108
- const hasApiToken = !isNil(prop('apiToken', permission));
108
+ const hasApiToken = get(permission, 'apiToken') != null;
109
109
  // If the permission has an invalid action, an invalid subject or invalid properties, then add it to the toBeRemoved collection
110
110
  if (!isRegisteredAction || isInvalidSubject || hasInvalidProperties && !hasApiToken) {
111
111
  permissionsToRemove.push(permission);
@@ -142,9 +142,9 @@ const filterPermissionsToRemove = async (permissions)=>{
142
142
  const remainingPermissions = permissions.filter((permission)=>!permissionsIdToRemove.includes(permission.id));
143
143
  const permissionsWithCleanFields = contentTypeService.cleanPermissionFields(remainingPermissions);
144
144
  // Update only the ones that need to be updated
145
- const permissionsNeedingToBeUpdated = differenceWith((a, b)=>{
146
- return a.id === b.id && xor(a.properties.fields, b.properties.fields).length === 0;
147
- }, permissionsWithCleanFields, remainingPermissions);
145
+ const permissionsNeedingToBeUpdated = differenceWith(permissionsWithCleanFields, remainingPermissions, (a, b)=>{
146
+ return a.id === b.id && xor(b.properties.fields, a.properties.fields).length === 0;
147
+ });
148
148
  const updatePromiseProvider = (permission)=>{
149
149
  return update({
150
150
  id: permission.id
@@ -1 +1 @@
1
- {"version":3,"file":"queries.mjs","sources":["../../../../../../server/src/services/permission/queries.ts"],"sourcesContent":["import { isNil, isArray, prop, xor, eq, differenceWith } from 'lodash/fp';\nimport pmap from 'p-map';\nimport type { Data } from '@strapi/types';\nimport { getService } from '../../utils';\nimport permissionDomain, { CreatePermissionPayload } from '../../domain/permission';\nimport type { AdminUser, Permission } from '../../../../shared/contracts/shared';\nimport { Action } from '../../domain/action';\n\n/**\n * Delete permissions of roles in database\n * @param rolesIds ids of roles\n */\nexport const deleteByRolesIds = async (rolesIds: Data.ID[]): Promise<void> => {\n const permissionsToDelete = await strapi.db.query('admin::permission').findMany({\n select: ['id'],\n where: {\n role: { id: rolesIds },\n },\n });\n\n if (permissionsToDelete.length > 0) {\n await deleteByIds(permissionsToDelete.map(prop('id')));\n }\n};\n\n/**\n * Delete permissions\n * @param ids ids of permissions\n */\nexport const deleteByIds = async (ids: Data.ID[]): Promise<void> => {\n const result: unknown[] = [];\n for (const id of ids) {\n const queryResult = await strapi.db.query('admin::permission').delete({ where: { id } });\n result.push(queryResult);\n }\n strapi.eventHub.emit('permission.delete', { permissions: result });\n};\n\n/**\n * Create many permissions\n * @param permissions\n */\nexport const createMany = async (permissions: CreatePermissionPayload[]): Promise<Permission[]> => {\n const createdPermissions: CreatePermissionPayload[] = [];\n for (const permission of permissions) {\n const newPerm = await strapi.db.query('admin::permission').create({ data: permission });\n createdPermissions.push(newPerm);\n }\n\n const permissionsToReturn = permissionDomain.toPermission(createdPermissions);\n strapi.eventHub.emit('permission.create', { permissions: permissionsToReturn });\n\n return permissionsToReturn;\n};\n\n/**\n * Update a permission\n * @param params\n * @param attributes\n */\nconst update = async (params: unknown, attributes: Partial<Permission>) => {\n const updatedPermission = (await strapi.db\n .query('admin::permission')\n .update({ where: params, data: attributes })) as Permission;\n\n const permissionToReturn = permissionDomain.toPermission(updatedPermission);\n strapi.eventHub.emit('permission.update', { permissions: permissionToReturn });\n\n return permissionToReturn;\n};\n\n/**\n * Find assigned permissions in the database\n * @param params query params to find the permissions\n */\nexport const findMany = async (params = {}): Promise<Permission[]> => {\n const rawPermissions = await strapi.db.query('admin::permission').findMany(params);\n\n return permissionDomain.toPermission(rawPermissions);\n};\n\n/**\n * Find all permissions for a user\n * @param user - user\n */\nexport const findUserPermissions = async (user: AdminUser): Promise<Permission[]> => {\n return findMany({ where: { role: { users: { id: user.id } } } });\n};\n\nconst filterPermissionsToRemove = async (permissions: Permission[]) => {\n const { actionProvider } = getService('permission');\n\n const permissionsToRemove: Permission[] = [];\n\n for (const permission of permissions) {\n const { subjects, options = {} as Action['options'] } =\n (actionProvider.get(permission.action) as Action) || {};\n const { applyToProperties } = options;\n\n const invalidProperties = await Promise.all(\n (applyToProperties || []).map(async (property) => {\n const applies = await actionProvider.appliesToProperty(\n property,\n permission.action,\n permission.subject\n );\n\n return applies && isNil(permissionDomain.getProperty(property, permission));\n })\n );\n\n const isRegisteredAction = actionProvider.has(permission.action);\n const hasInvalidProperties = isArray(applyToProperties) && invalidProperties.every(eq(true));\n const isInvalidSubject = isArray(subjects) && !subjects.includes(permission.subject as string);\n // On an api token permission, nil properties mean \"everything\", not \"invalid\"\n const hasApiToken = !isNil(prop('apiToken', permission));\n\n // If the permission has an invalid action, an invalid subject or invalid properties, then add it to the toBeRemoved collection\n if (!isRegisteredAction || isInvalidSubject || (hasInvalidProperties && !hasApiToken)) {\n permissionsToRemove.push(permission);\n }\n }\n\n return permissionsToRemove;\n};\n\n/**\n * Removes permissions in database that don't exist anymore\n */\nexport const cleanPermissionsInDatabase = async (): Promise<void> => {\n const pageSize = 200;\n\n const contentTypeService = getService('content-type');\n\n const total = await strapi.db.query('admin::permission').count();\n const pageCount = Math.ceil(total / pageSize);\n\n for (let page = 0; page < pageCount; page += 1) {\n // 1. Find invalid permissions and collect their ID to delete them later\n const results = (await strapi.db.query('admin::permission').findMany({\n limit: pageSize,\n offset: page * pageSize,\n populate: ['role', 'apiToken'],\n })) as Permission[];\n\n const permissions = permissionDomain.toPermission(results);\n const permissionsToRemove = await filterPermissionsToRemove(permissions);\n\n // Also remove orphaned permissions (no role AND no apiToken)\n const orphanedPermissions = permissions.filter(\n (permission: any) => !permission.role && !permission.apiToken\n );\n\n const permissionsIdToRemove = Array.from(\n new Set([...permissionsToRemove, ...orphanedPermissions].map((p) => p.id))\n );\n\n // 2. Clean permissions' fields (add required ones, remove the non-existing ones)\n const remainingPermissions = permissions.filter(\n (permission: Permission) => !permissionsIdToRemove.includes(permission.id)\n );\n\n const permissionsWithCleanFields = contentTypeService.cleanPermissionFields(\n remainingPermissions\n ) as Permission[];\n\n // Update only the ones that need to be updated\n const permissionsNeedingToBeUpdated = differenceWith(\n (a: Permission, b: Permission) => {\n return a.id === b.id && xor(a.properties.fields, b.properties.fields).length === 0;\n },\n permissionsWithCleanFields,\n remainingPermissions\n );\n\n const updatePromiseProvider = (permission: Permission) => {\n return update({ id: permission.id }, permission);\n };\n\n // Execute all the queries, update the database\n await Promise.all([\n deleteByIds(permissionsIdToRemove),\n pmap(permissionsNeedingToBeUpdated, updatePromiseProvider, {\n concurrency: 100,\n stopOnError: true,\n }),\n ]);\n }\n};\n\nexport default {\n createMany,\n findMany,\n deleteByRolesIds,\n deleteByIds,\n findUserPermissions,\n cleanPermissionsInDatabase,\n};\n"],"names":["deleteByRolesIds","rolesIds","permissionsToDelete","strapi","db","query","findMany","select","where","role","id","length","deleteByIds","map","prop","ids","result","queryResult","delete","push","eventHub","emit","permissions","createMany","createdPermissions","permission","newPerm","create","data","permissionsToReturn","permissionDomain","toPermission","update","params","attributes","updatedPermission","permissionToReturn","rawPermissions","findUserPermissions","user","users","filterPermissionsToRemove","actionProvider","getService","permissionsToRemove","subjects","options","get","action","applyToProperties","invalidProperties","Promise","all","property","applies","appliesToProperty","subject","isNil","getProperty","isRegisteredAction","has","hasInvalidProperties","isArray","every","eq","isInvalidSubject","includes","hasApiToken","cleanPermissionsInDatabase","pageSize","contentTypeService","total","count","pageCount","Math","ceil","page","results","limit","offset","populate","orphanedPermissions","filter","apiToken","permissionsIdToRemove","Array","from","Set","p","remainingPermissions","permissionsWithCleanFields","cleanPermissionFields","permissionsNeedingToBeUpdated","differenceWith","a","b","xor","properties","fields","updatePromiseProvider","pmap","concurrency","stopOnError"],"mappings":"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"}
1
+ {"version":3,"file":"queries.mjs","sources":["../../../../../../server/src/services/permission/queries.ts"],"sourcesContent":["import { get, xor, differenceWith } from 'lodash';\n\nimport pmap from 'p-map';\nimport type { Data } from '@strapi/types';\nimport { getService } from '../../utils';\nimport permissionDomain, { CreatePermissionPayload } from '../../domain/permission';\nimport type { AdminUser, Permission } from '../../../../shared/contracts/shared';\nimport { Action } from '../../domain/action';\n\n/**\n * Delete permissions of roles in database\n * @param rolesIds ids of roles\n */\nexport const deleteByRolesIds = async (rolesIds: Data.ID[]): Promise<void> => {\n const permissionsToDelete = await strapi.db.query('admin::permission').findMany({\n select: ['id'],\n where: {\n role: { id: rolesIds },\n },\n });\n\n if (permissionsToDelete.length > 0) {\n await deleteByIds(permissionsToDelete.map((permission) => permission?.id));\n }\n};\n\n/**\n * Delete permissions\n * @param ids ids of permissions\n */\nexport const deleteByIds = async (ids: Data.ID[]): Promise<void> => {\n const result: unknown[] = [];\n for (const id of ids) {\n const queryResult = await strapi.db.query('admin::permission').delete({ where: { id } });\n result.push(queryResult);\n }\n strapi.eventHub.emit('permission.delete', { permissions: result });\n};\n\n/**\n * Create many permissions\n * @param permissions\n */\nexport const createMany = async (permissions: CreatePermissionPayload[]): Promise<Permission[]> => {\n const createdPermissions: CreatePermissionPayload[] = [];\n for (const permission of permissions) {\n const newPerm = await strapi.db.query('admin::permission').create({ data: permission });\n createdPermissions.push(newPerm);\n }\n\n const permissionsToReturn = permissionDomain.toPermission(createdPermissions);\n strapi.eventHub.emit('permission.create', { permissions: permissionsToReturn });\n\n return permissionsToReturn;\n};\n\n/**\n * Update a permission\n * @param params\n * @param attributes\n */\nconst update = async (params: unknown, attributes: Partial<Permission>) => {\n const updatedPermission = (await strapi.db\n .query('admin::permission')\n .update({ where: params, data: attributes })) as Permission;\n\n const permissionToReturn = permissionDomain.toPermission(updatedPermission);\n strapi.eventHub.emit('permission.update', { permissions: permissionToReturn });\n\n return permissionToReturn;\n};\n\n/**\n * Find assigned permissions in the database\n * @param params query params to find the permissions\n */\nexport const findMany = async (params = {}): Promise<Permission[]> => {\n const rawPermissions = await strapi.db.query('admin::permission').findMany(params);\n\n return permissionDomain.toPermission(rawPermissions);\n};\n\n/**\n * Find all permissions for a user\n * @param user - user\n */\nexport const findUserPermissions = async (user: AdminUser): Promise<Permission[]> => {\n return findMany({ where: { role: { users: { id: user.id } } } });\n};\n\nconst filterPermissionsToRemove = async (permissions: Permission[]) => {\n const { actionProvider } = getService('permission');\n\n const permissionsToRemove: Permission[] = [];\n\n for (const permission of permissions) {\n const { subjects, options = {} as Action['options'] } =\n (actionProvider.get(permission.action) as Action) || {};\n const { applyToProperties } = options;\n\n const invalidProperties = await Promise.all(\n (applyToProperties || []).map(async (property) => {\n const applies = await actionProvider.appliesToProperty(\n property,\n permission.action,\n permission.subject\n );\n\n return applies && permissionDomain.getProperty(property, permission) == null;\n })\n );\n\n const isRegisteredAction = actionProvider.has(permission.action);\n const hasInvalidProperties =\n Array.isArray(applyToProperties) && invalidProperties.every((result) => result === true);\n const isInvalidSubject =\n Array.isArray(subjects) && !subjects.includes(permission.subject as string);\n // On an api token permission, nil properties mean \"everything\", not \"invalid\"\n const hasApiToken = get(permission, 'apiToken') != null;\n\n // If the permission has an invalid action, an invalid subject or invalid properties, then add it to the toBeRemoved collection\n if (!isRegisteredAction || isInvalidSubject || (hasInvalidProperties && !hasApiToken)) {\n permissionsToRemove.push(permission);\n }\n }\n\n return permissionsToRemove;\n};\n\n/**\n * Removes permissions in database that don't exist anymore\n */\nexport const cleanPermissionsInDatabase = async (): Promise<void> => {\n const pageSize = 200;\n\n const contentTypeService = getService('content-type');\n\n const total = await strapi.db.query('admin::permission').count();\n const pageCount = Math.ceil(total / pageSize);\n\n for (let page = 0; page < pageCount; page += 1) {\n // 1. Find invalid permissions and collect their ID to delete them later\n const results = (await strapi.db.query('admin::permission').findMany({\n limit: pageSize,\n offset: page * pageSize,\n populate: ['role', 'apiToken'],\n })) as Permission[];\n\n const permissions = permissionDomain.toPermission(results);\n const permissionsToRemove = await filterPermissionsToRemove(permissions);\n\n // Also remove orphaned permissions (no role AND no apiToken)\n const orphanedPermissions = permissions.filter(\n (permission: any) => !permission.role && !permission.apiToken\n );\n\n const permissionsIdToRemove = Array.from(\n new Set([...permissionsToRemove, ...orphanedPermissions].map((p) => p.id))\n );\n\n // 2. Clean permissions' fields (add required ones, remove the non-existing ones)\n const remainingPermissions = permissions.filter(\n (permission: Permission) => !permissionsIdToRemove.includes(permission.id)\n );\n\n const permissionsWithCleanFields = contentTypeService.cleanPermissionFields(\n remainingPermissions\n ) as Permission[];\n\n // Update only the ones that need to be updated\n const permissionsNeedingToBeUpdated = differenceWith(\n permissionsWithCleanFields,\n remainingPermissions,\n (a: Permission, b: Permission) => {\n return a.id === b.id && xor(b.properties.fields, a.properties.fields).length === 0;\n }\n );\n\n const updatePromiseProvider = (permission: Permission) => {\n return update({ id: permission.id }, permission);\n };\n\n // Execute all the queries, update the database\n await Promise.all([\n deleteByIds(permissionsIdToRemove),\n pmap(permissionsNeedingToBeUpdated, updatePromiseProvider, {\n concurrency: 100,\n stopOnError: true,\n }),\n ]);\n }\n};\n\nexport default {\n createMany,\n findMany,\n deleteByRolesIds,\n deleteByIds,\n findUserPermissions,\n cleanPermissionsInDatabase,\n};\n"],"names":["deleteByRolesIds","rolesIds","permissionsToDelete","strapi","db","query","findMany","select","where","role","id","length","deleteByIds","map","permission","ids","result","queryResult","delete","push","eventHub","emit","permissions","createMany","createdPermissions","newPerm","create","data","permissionsToReturn","permissionDomain","toPermission","update","params","attributes","updatedPermission","permissionToReturn","rawPermissions","findUserPermissions","user","users","filterPermissionsToRemove","actionProvider","getService","permissionsToRemove","subjects","options","get","action","applyToProperties","invalidProperties","Promise","all","property","applies","appliesToProperty","subject","getProperty","isRegisteredAction","has","hasInvalidProperties","Array","isArray","every","isInvalidSubject","includes","hasApiToken","cleanPermissionsInDatabase","pageSize","contentTypeService","total","count","pageCount","Math","ceil","page","results","limit","offset","populate","orphanedPermissions","filter","apiToken","permissionsIdToRemove","from","Set","p","remainingPermissions","permissionsWithCleanFields","cleanPermissionFields","permissionsNeedingToBeUpdated","differenceWith","a","b","xor","properties","fields","updatePromiseProvider","pmap","concurrency","stopOnError"],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ 'use strict';
2
+
3
+ var _ = require('lodash');
4
+ var contentType = require('../content-type.js');
5
+
6
+ const PERMISSION_UID = 'admin::permission';
7
+ /**
8
+ * Carries attribute renames to the `properties.fields` of admin permissions
9
+ * (roles and admin API tokens).
10
+ *
11
+ * Runs from the generated rename migration, inside its transaction, before the
12
+ * admin bootstrap cleans permission fields against the new schema. Without it,
13
+ * the cleanup drops every renamed field from every role but the super admin.
14
+ *
15
+ * `strapi.contentTypes` / `strapi.components` already hold the new schema at
16
+ * that point, so every new field path is mapped back to the path it had before
17
+ * the renames, segment by segment (a component field path goes through its
18
+ * parent's component). This also composes a parent rename with a rename inside
19
+ * its component in the same save.
20
+ */ const createPermissionFieldRenamer = ({ strapi })=>{
21
+ const getOldPath = (subject, path, originsOf)=>{
22
+ let ownerUid = subject;
23
+ let owner = strapi.contentTypes[subject];
24
+ return path.split('.').map((segment)=>{
25
+ const origin = originsOf[ownerUid]?.[segment] ?? segment;
26
+ const attribute = owner?.attributes?.[segment];
27
+ if (attribute?.type === 'component' && attribute.component) {
28
+ ownerUid = attribute.component;
29
+ owner = strapi.components[attribute.component];
30
+ } else {
31
+ owner = undefined;
32
+ }
33
+ return origin;
34
+ }).join('.');
35
+ };
36
+ /**
37
+ * `old path -> new path` per subject, for the subjects with at least one
38
+ * renamed path.
39
+ */ const getRenamedPaths = (renames)=>{
40
+ // Per model: final name -> origin name.
41
+ const originsOf = {};
42
+ for (const [uid, mapping] of Object.entries(renames)){
43
+ originsOf[uid] = _.invert(mapping);
44
+ }
45
+ const renamedPaths = new Map();
46
+ for (const [subject, contentType$1] of Object.entries(strapi.contentTypes)){
47
+ const paths = contentType.getNestedFieldsWithIntermediate(contentType$1, {
48
+ components: strapi.components
49
+ });
50
+ const byOldPath = {};
51
+ for (const path of paths){
52
+ const oldPath = getOldPath(subject, path, originsOf);
53
+ if (oldPath !== path) {
54
+ byOldPath[oldPath] = path;
55
+ }
56
+ }
57
+ if (!_.isEmpty(byOldPath)) {
58
+ renamedPaths.set(subject, byOldPath);
59
+ }
60
+ }
61
+ return renamedPaths;
62
+ };
63
+ return async (trx, renames)=>{
64
+ if (_.isEmpty(renames)) {
65
+ return;
66
+ }
67
+ // Fresh database: the table is created by schema sync after the migrations.
68
+ const { tableName } = strapi.db.metadata.get(PERMISSION_UID);
69
+ if (!await strapi.db.getSchemaConnection(trx).hasTable(tableName)) {
70
+ return;
71
+ }
72
+ const renamedPaths = getRenamedPaths(renames);
73
+ if (renamedPaths.size === 0) {
74
+ return;
75
+ }
76
+ // Joins the migration transaction.
77
+ const permissions = await strapi.db.query(PERMISSION_UID).findMany({
78
+ select: [
79
+ 'id',
80
+ 'subject',
81
+ 'properties'
82
+ ],
83
+ where: {
84
+ subject: {
85
+ $in: [
86
+ ...renamedPaths.keys()
87
+ ]
88
+ }
89
+ }
90
+ });
91
+ for (const permission of permissions){
92
+ const fields = permission.properties?.fields;
93
+ const byOldPath = permission.subject ? renamedPaths.get(permission.subject) : undefined;
94
+ if (!Array.isArray(fields) || !byOldPath) {
95
+ continue;
96
+ }
97
+ // One pass over the old paths, so a swap is applied once.
98
+ const newFields = _.uniq(fields.map((field)=>byOldPath[field] ?? field));
99
+ if (_.xor(fields, newFields).length === 0) {
100
+ continue;
101
+ }
102
+ await strapi.db.query(PERMISSION_UID).update({
103
+ where: {
104
+ id: permission.id
105
+ },
106
+ data: {
107
+ properties: {
108
+ ...permission.properties,
109
+ fields: newFields
110
+ }
111
+ }
112
+ });
113
+ }
114
+ };
115
+ };
116
+
117
+ exports.createPermissionFieldRenamer = createPermissionFieldRenamer;
118
+ //# sourceMappingURL=rename-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-fields.js","sources":["../../../../../../server/src/services/permission/rename-fields.ts"],"sourcesContent":["import { invert, isEmpty, uniq, xor } from 'lodash';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { getNestedFieldsWithIntermediate } from '../content-type';\n\ntype AttributeRenameHandler = Parameters<\n Core.Strapi['db']['schema']['registerAttributeRenameHandler']\n>[0];\n\ntype AttributeRenames = Parameters<AttributeRenameHandler>[1];\n\ninterface PermissionRow {\n id: number | string;\n subject: string | null;\n properties?: { fields?: unknown } | null;\n}\n\nconst PERMISSION_UID = 'admin::permission';\n\n/**\n * Carries attribute renames to the `properties.fields` of admin permissions\n * (roles and admin API tokens).\n *\n * Runs from the generated rename migration, inside its transaction, before the\n * admin bootstrap cleans permission fields against the new schema. Without it,\n * the cleanup drops every renamed field from every role but the super admin.\n *\n * `strapi.contentTypes` / `strapi.components` already hold the new schema at\n * that point, so every new field path is mapped back to the path it had before\n * the renames, segment by segment (a component field path goes through its\n * parent's component). This also composes a parent rename with a rename inside\n * its component in the same save.\n */\nexport const createPermissionFieldRenamer = ({\n strapi,\n}: {\n strapi: Core.Strapi;\n}): AttributeRenameHandler => {\n const getOldPath = (\n subject: string,\n path: string,\n originsOf: Record<string, Record<string, string>>\n ): string => {\n let ownerUid = subject;\n let owner: Struct.Schema | undefined =\n strapi.contentTypes[subject as keyof typeof strapi.contentTypes];\n\n return path\n .split('.')\n .map((segment) => {\n const origin = originsOf[ownerUid]?.[segment] ?? segment;\n const attribute = owner?.attributes?.[segment] as\n | { type?: string; component?: string }\n | undefined;\n\n if (attribute?.type === 'component' && attribute.component) {\n ownerUid = attribute.component;\n owner = strapi.components[attribute.component as keyof typeof strapi.components];\n } else {\n owner = undefined;\n }\n\n return origin;\n })\n .join('.');\n };\n\n /**\n * `old path -> new path` per subject, for the subjects with at least one\n * renamed path.\n */\n const getRenamedPaths = (renames: AttributeRenames): Map<string, Record<string, string>> => {\n // Per model: final name -> origin name.\n const originsOf: Record<string, Record<string, string>> = {};\n for (const [uid, mapping] of Object.entries(renames)) {\n originsOf[uid] = invert(mapping);\n }\n\n const renamedPaths = new Map<string, Record<string, string>>();\n\n for (const [subject, contentType] of Object.entries(strapi.contentTypes)) {\n const paths = getNestedFieldsWithIntermediate(contentType as Struct.ContentTypeSchema, {\n components: strapi.components,\n });\n\n const byOldPath: Record<string, string> = {};\n for (const path of paths) {\n const oldPath = getOldPath(subject, path, originsOf);\n if (oldPath !== path) {\n byOldPath[oldPath] = path;\n }\n }\n\n if (!isEmpty(byOldPath)) {\n renamedPaths.set(subject, byOldPath);\n }\n }\n\n return renamedPaths;\n };\n\n return async (trx, renames) => {\n if (isEmpty(renames)) {\n return;\n }\n\n // Fresh database: the table is created by schema sync after the migrations.\n const { tableName } = strapi.db.metadata.get(PERMISSION_UID);\n if (!(await strapi.db.getSchemaConnection(trx).hasTable(tableName))) {\n return;\n }\n\n const renamedPaths = getRenamedPaths(renames);\n if (renamedPaths.size === 0) {\n return;\n }\n\n // Joins the migration transaction.\n const permissions = (await strapi.db.query(PERMISSION_UID).findMany({\n select: ['id', 'subject', 'properties'],\n where: { subject: { $in: [...renamedPaths.keys()] } },\n })) as PermissionRow[];\n\n for (const permission of permissions) {\n const fields = permission.properties?.fields;\n const byOldPath = permission.subject ? renamedPaths.get(permission.subject) : undefined;\n\n if (!Array.isArray(fields) || !byOldPath) {\n continue;\n }\n\n // One pass over the old paths, so a swap is applied once.\n const newFields = uniq(fields.map((field: string) => byOldPath[field] ?? field));\n\n if (xor(fields, newFields).length === 0) {\n continue;\n }\n\n await strapi.db.query(PERMISSION_UID).update({\n where: { id: permission.id },\n data: { properties: { ...permission.properties, fields: newFields } },\n });\n }\n };\n};\n"],"names":["PERMISSION_UID","createPermissionFieldRenamer","strapi","getOldPath","subject","path","originsOf","ownerUid","owner","contentTypes","split","map","segment","origin","attribute","attributes","type","component","components","undefined","join","getRenamedPaths","renames","uid","mapping","Object","entries","invert","renamedPaths","Map","contentType","paths","getNestedFieldsWithIntermediate","byOldPath","oldPath","isEmpty","set","trx","tableName","db","metadata","get","getSchemaConnection","hasTable","size","permissions","query","findMany","select","where","$in","keys","permission","fields","properties","Array","isArray","newFields","uniq","field","xor","length","update","id","data"],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import { isEmpty, uniq, xor, invert } from 'lodash';
2
+ import { getNestedFieldsWithIntermediate } from '../content-type.mjs';
3
+
4
+ const PERMISSION_UID = 'admin::permission';
5
+ /**
6
+ * Carries attribute renames to the `properties.fields` of admin permissions
7
+ * (roles and admin API tokens).
8
+ *
9
+ * Runs from the generated rename migration, inside its transaction, before the
10
+ * admin bootstrap cleans permission fields against the new schema. Without it,
11
+ * the cleanup drops every renamed field from every role but the super admin.
12
+ *
13
+ * `strapi.contentTypes` / `strapi.components` already hold the new schema at
14
+ * that point, so every new field path is mapped back to the path it had before
15
+ * the renames, segment by segment (a component field path goes through its
16
+ * parent's component). This also composes a parent rename with a rename inside
17
+ * its component in the same save.
18
+ */ const createPermissionFieldRenamer = ({ strapi })=>{
19
+ const getOldPath = (subject, path, originsOf)=>{
20
+ let ownerUid = subject;
21
+ let owner = strapi.contentTypes[subject];
22
+ return path.split('.').map((segment)=>{
23
+ const origin = originsOf[ownerUid]?.[segment] ?? segment;
24
+ const attribute = owner?.attributes?.[segment];
25
+ if (attribute?.type === 'component' && attribute.component) {
26
+ ownerUid = attribute.component;
27
+ owner = strapi.components[attribute.component];
28
+ } else {
29
+ owner = undefined;
30
+ }
31
+ return origin;
32
+ }).join('.');
33
+ };
34
+ /**
35
+ * `old path -> new path` per subject, for the subjects with at least one
36
+ * renamed path.
37
+ */ const getRenamedPaths = (renames)=>{
38
+ // Per model: final name -> origin name.
39
+ const originsOf = {};
40
+ for (const [uid, mapping] of Object.entries(renames)){
41
+ originsOf[uid] = invert(mapping);
42
+ }
43
+ const renamedPaths = new Map();
44
+ for (const [subject, contentType] of Object.entries(strapi.contentTypes)){
45
+ const paths = getNestedFieldsWithIntermediate(contentType, {
46
+ components: strapi.components
47
+ });
48
+ const byOldPath = {};
49
+ for (const path of paths){
50
+ const oldPath = getOldPath(subject, path, originsOf);
51
+ if (oldPath !== path) {
52
+ byOldPath[oldPath] = path;
53
+ }
54
+ }
55
+ if (!isEmpty(byOldPath)) {
56
+ renamedPaths.set(subject, byOldPath);
57
+ }
58
+ }
59
+ return renamedPaths;
60
+ };
61
+ return async (trx, renames)=>{
62
+ if (isEmpty(renames)) {
63
+ return;
64
+ }
65
+ // Fresh database: the table is created by schema sync after the migrations.
66
+ const { tableName } = strapi.db.metadata.get(PERMISSION_UID);
67
+ if (!await strapi.db.getSchemaConnection(trx).hasTable(tableName)) {
68
+ return;
69
+ }
70
+ const renamedPaths = getRenamedPaths(renames);
71
+ if (renamedPaths.size === 0) {
72
+ return;
73
+ }
74
+ // Joins the migration transaction.
75
+ const permissions = await strapi.db.query(PERMISSION_UID).findMany({
76
+ select: [
77
+ 'id',
78
+ 'subject',
79
+ 'properties'
80
+ ],
81
+ where: {
82
+ subject: {
83
+ $in: [
84
+ ...renamedPaths.keys()
85
+ ]
86
+ }
87
+ }
88
+ });
89
+ for (const permission of permissions){
90
+ const fields = permission.properties?.fields;
91
+ const byOldPath = permission.subject ? renamedPaths.get(permission.subject) : undefined;
92
+ if (!Array.isArray(fields) || !byOldPath) {
93
+ continue;
94
+ }
95
+ // One pass over the old paths, so a swap is applied once.
96
+ const newFields = uniq(fields.map((field)=>byOldPath[field] ?? field));
97
+ if (xor(fields, newFields).length === 0) {
98
+ continue;
99
+ }
100
+ await strapi.db.query(PERMISSION_UID).update({
101
+ where: {
102
+ id: permission.id
103
+ },
104
+ data: {
105
+ properties: {
106
+ ...permission.properties,
107
+ fields: newFields
108
+ }
109
+ }
110
+ });
111
+ }
112
+ };
113
+ };
114
+
115
+ export { createPermissionFieldRenamer };
116
+ //# sourceMappingURL=rename-fields.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-fields.mjs","sources":["../../../../../../server/src/services/permission/rename-fields.ts"],"sourcesContent":["import { invert, isEmpty, uniq, xor } from 'lodash';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { getNestedFieldsWithIntermediate } from '../content-type';\n\ntype AttributeRenameHandler = Parameters<\n Core.Strapi['db']['schema']['registerAttributeRenameHandler']\n>[0];\n\ntype AttributeRenames = Parameters<AttributeRenameHandler>[1];\n\ninterface PermissionRow {\n id: number | string;\n subject: string | null;\n properties?: { fields?: unknown } | null;\n}\n\nconst PERMISSION_UID = 'admin::permission';\n\n/**\n * Carries attribute renames to the `properties.fields` of admin permissions\n * (roles and admin API tokens).\n *\n * Runs from the generated rename migration, inside its transaction, before the\n * admin bootstrap cleans permission fields against the new schema. Without it,\n * the cleanup drops every renamed field from every role but the super admin.\n *\n * `strapi.contentTypes` / `strapi.components` already hold the new schema at\n * that point, so every new field path is mapped back to the path it had before\n * the renames, segment by segment (a component field path goes through its\n * parent's component). This also composes a parent rename with a rename inside\n * its component in the same save.\n */\nexport const createPermissionFieldRenamer = ({\n strapi,\n}: {\n strapi: Core.Strapi;\n}): AttributeRenameHandler => {\n const getOldPath = (\n subject: string,\n path: string,\n originsOf: Record<string, Record<string, string>>\n ): string => {\n let ownerUid = subject;\n let owner: Struct.Schema | undefined =\n strapi.contentTypes[subject as keyof typeof strapi.contentTypes];\n\n return path\n .split('.')\n .map((segment) => {\n const origin = originsOf[ownerUid]?.[segment] ?? segment;\n const attribute = owner?.attributes?.[segment] as\n | { type?: string; component?: string }\n | undefined;\n\n if (attribute?.type === 'component' && attribute.component) {\n ownerUid = attribute.component;\n owner = strapi.components[attribute.component as keyof typeof strapi.components];\n } else {\n owner = undefined;\n }\n\n return origin;\n })\n .join('.');\n };\n\n /**\n * `old path -> new path` per subject, for the subjects with at least one\n * renamed path.\n */\n const getRenamedPaths = (renames: AttributeRenames): Map<string, Record<string, string>> => {\n // Per model: final name -> origin name.\n const originsOf: Record<string, Record<string, string>> = {};\n for (const [uid, mapping] of Object.entries(renames)) {\n originsOf[uid] = invert(mapping);\n }\n\n const renamedPaths = new Map<string, Record<string, string>>();\n\n for (const [subject, contentType] of Object.entries(strapi.contentTypes)) {\n const paths = getNestedFieldsWithIntermediate(contentType as Struct.ContentTypeSchema, {\n components: strapi.components,\n });\n\n const byOldPath: Record<string, string> = {};\n for (const path of paths) {\n const oldPath = getOldPath(subject, path, originsOf);\n if (oldPath !== path) {\n byOldPath[oldPath] = path;\n }\n }\n\n if (!isEmpty(byOldPath)) {\n renamedPaths.set(subject, byOldPath);\n }\n }\n\n return renamedPaths;\n };\n\n return async (trx, renames) => {\n if (isEmpty(renames)) {\n return;\n }\n\n // Fresh database: the table is created by schema sync after the migrations.\n const { tableName } = strapi.db.metadata.get(PERMISSION_UID);\n if (!(await strapi.db.getSchemaConnection(trx).hasTable(tableName))) {\n return;\n }\n\n const renamedPaths = getRenamedPaths(renames);\n if (renamedPaths.size === 0) {\n return;\n }\n\n // Joins the migration transaction.\n const permissions = (await strapi.db.query(PERMISSION_UID).findMany({\n select: ['id', 'subject', 'properties'],\n where: { subject: { $in: [...renamedPaths.keys()] } },\n })) as PermissionRow[];\n\n for (const permission of permissions) {\n const fields = permission.properties?.fields;\n const byOldPath = permission.subject ? renamedPaths.get(permission.subject) : undefined;\n\n if (!Array.isArray(fields) || !byOldPath) {\n continue;\n }\n\n // One pass over the old paths, so a swap is applied once.\n const newFields = uniq(fields.map((field: string) => byOldPath[field] ?? field));\n\n if (xor(fields, newFields).length === 0) {\n continue;\n }\n\n await strapi.db.query(PERMISSION_UID).update({\n where: { id: permission.id },\n data: { properties: { ...permission.properties, fields: newFields } },\n });\n }\n };\n};\n"],"names":["PERMISSION_UID","createPermissionFieldRenamer","strapi","getOldPath","subject","path","originsOf","ownerUid","owner","contentTypes","split","map","segment","origin","attribute","attributes","type","component","components","undefined","join","getRenamedPaths","renames","uid","mapping","Object","entries","invert","renamedPaths","Map","contentType","paths","getNestedFieldsWithIntermediate","byOldPath","oldPath","isEmpty","set","trx","tableName","db","metadata","get","getSchemaConnection","hasTable","size","permissions","query","findMany","select","where","$in","keys","permission","fields","properties","Array","isArray","newFields","uniq","field","xor","length","update","id","data"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var builder = require('./builder.js');
5
5
  var handlers = require('./handlers.js');
6
6
 
7
- const sectionPropMatcher = fp.propEq('section');
7
+ const sectionPropMatcher = (section)=>_.matchesProperty('section', section);
8
8
  const createContentTypesInitialState = ()=>({
9
9
  actions: [],
10
10
  subjects: []
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../../server/src/services/permission/sections-builder/index.ts"],"sourcesContent":["import { propEq } from 'lodash/fp';\nimport createSectionBuilder from './builder';\nimport {\n subjectsHandlerFor,\n contentTypesBase,\n fieldsProperty,\n plugins as pluginsHandler,\n settings as settingsHandler,\n} from './handlers';\n\nconst sectionPropMatcher = propEq('section');\n\nconst createContentTypesInitialState = () => ({\n actions: [],\n subjects: [],\n});\n\nconst createDefaultSectionBuilder = () => {\n const builder = createSectionBuilder();\n\n builder.createSection('plugins', {\n initialStateFactory: () => [],\n handlers: [pluginsHandler],\n matchers: [sectionPropMatcher('plugins')],\n });\n\n builder.createSection('settings', {\n initialStateFactory: () => [],\n handlers: [settingsHandler],\n matchers: [sectionPropMatcher('settings')],\n });\n\n builder.createSection('singleTypes', {\n initialStateFactory: createContentTypesInitialState,\n handlers: [contentTypesBase, subjectsHandlerFor('singleType'), fieldsProperty],\n matchers: [sectionPropMatcher('contentTypes')],\n });\n\n builder.createSection('collectionTypes', {\n initialStateFactory: createContentTypesInitialState,\n handlers: [contentTypesBase, subjectsHandlerFor('collectionType'), fieldsProperty],\n matchers: [sectionPropMatcher('contentTypes')],\n });\n\n return builder;\n};\n\nexport default createDefaultSectionBuilder;\n"],"names":["sectionPropMatcher","propEq","createContentTypesInitialState","actions","subjects","createDefaultSectionBuilder","builder","createSectionBuilder","createSection","initialStateFactory","handlers","pluginsHandler","matchers","settingsHandler","contentTypesBase","subjectsHandlerFor","fieldsProperty"],"mappings":";;;;;;AAUA,MAAMA,qBAAqBC,SAAAA,CAAO,SAAA,CAAA;AAElC,MAAMC,8BAAAA,GAAiC,KAAO;AAC5CC,QAAAA,OAAAA,EAAS,EAAE;AACXC,QAAAA,QAAAA,EAAU;KACZ,CAAA;AAEA,MAAMC,2BAAAA,GAA8B,IAAA;AAClC,IAAA,MAAMC,SAAAA,GAAUC,OAAAA,EAAAA;IAEhBD,SAAAA,CAAQE,aAAa,CAAC,SAAA,EAAW;AAC/BC,QAAAA,mBAAAA,EAAqB,IAAM,EAAE;QAC7BC,QAAAA,EAAU;AAACC,YAAAA;AAAe,SAAA;QAC1BC,QAAAA,EAAU;YAACZ,kBAAAA,CAAmB,SAAA;AAAW;AAC3C,KAAA,CAAA;IAEAM,SAAAA,CAAQE,aAAa,CAAC,UAAA,EAAY;AAChCC,QAAAA,mBAAAA,EAAqB,IAAM,EAAE;QAC7BC,QAAAA,EAAU;AAACG,YAAAA;AAAgB,SAAA;QAC3BD,QAAAA,EAAU;YAACZ,kBAAAA,CAAmB,UAAA;AAAY;AAC5C,KAAA,CAAA;IAEAM,SAAAA,CAAQE,aAAa,CAAC,aAAA,EAAe;QACnCC,mBAAAA,EAAqBP,8BAAAA;QACrBQ,QAAAA,EAAU;AAACI,YAAAA,yBAAAA;YAAkBC,2BAAAA,CAAmB,YAAA,CAAA;AAAeC,YAAAA;AAAe,SAAA;QAC9EJ,QAAAA,EAAU;YAACZ,kBAAAA,CAAmB,cAAA;AAAgB;AAChD,KAAA,CAAA;IAEAM,SAAAA,CAAQE,aAAa,CAAC,iBAAA,EAAmB;QACvCC,mBAAAA,EAAqBP,8BAAAA;QACrBQ,QAAAA,EAAU;AAACI,YAAAA,yBAAAA;YAAkBC,2BAAAA,CAAmB,gBAAA,CAAA;AAAmBC,YAAAA;AAAe,SAAA;QAClFJ,QAAAA,EAAU;YAACZ,kBAAAA,CAAmB,cAAA;AAAgB;AAChD,KAAA,CAAA;IAEA,OAAOM,SAAAA;AACT;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../../server/src/services/permission/sections-builder/index.ts"],"sourcesContent":["import { matchesProperty } from 'lodash';\nimport createSectionBuilder from './builder';\nimport {\n subjectsHandlerFor,\n contentTypesBase,\n fieldsProperty,\n plugins as pluginsHandler,\n settings as settingsHandler,\n} from './handlers';\n\nconst sectionPropMatcher = (section: string) => matchesProperty('section', section);\n\nconst createContentTypesInitialState = () => ({\n actions: [],\n subjects: [],\n});\n\nconst createDefaultSectionBuilder = () => {\n const builder = createSectionBuilder();\n\n builder.createSection('plugins', {\n initialStateFactory: () => [],\n handlers: [pluginsHandler],\n matchers: [sectionPropMatcher('plugins')],\n });\n\n builder.createSection('settings', {\n initialStateFactory: () => [],\n handlers: [settingsHandler],\n matchers: [sectionPropMatcher('settings')],\n });\n\n builder.createSection('singleTypes', {\n initialStateFactory: createContentTypesInitialState,\n handlers: [contentTypesBase, subjectsHandlerFor('singleType'), fieldsProperty],\n matchers: [sectionPropMatcher('contentTypes')],\n });\n\n builder.createSection('collectionTypes', {\n initialStateFactory: createContentTypesInitialState,\n handlers: [contentTypesBase, subjectsHandlerFor('collectionType'), fieldsProperty],\n matchers: [sectionPropMatcher('contentTypes')],\n });\n\n return builder;\n};\n\nexport default createDefaultSectionBuilder;\n"],"names":["sectionPropMatcher","section","matchesProperty","createContentTypesInitialState","actions","subjects","createDefaultSectionBuilder","builder","createSectionBuilder","createSection","initialStateFactory","handlers","pluginsHandler","matchers","settingsHandler","contentTypesBase","subjectsHandlerFor","fieldsProperty"],"mappings":";;;;;;AAUA,MAAMA,kBAAAA,GAAqB,CAACC,OAAAA,GAAoBC,iBAAAA,CAAgB,SAAA,EAAWD,OAAAA,CAAAA;AAE3E,MAAME,8BAAAA,GAAiC,KAAO;AAC5CC,QAAAA,OAAAA,EAAS,EAAE;AACXC,QAAAA,QAAAA,EAAU;KACZ,CAAA;AAEA,MAAMC,2BAAAA,GAA8B,IAAA;AAClC,IAAA,MAAMC,SAAAA,GAAUC,OAAAA,EAAAA;IAEhBD,SAAAA,CAAQE,aAAa,CAAC,SAAA,EAAW;AAC/BC,QAAAA,mBAAAA,EAAqB,IAAM,EAAE;QAC7BC,QAAAA,EAAU;AAACC,YAAAA;AAAe,SAAA;QAC1BC,QAAAA,EAAU;YAACb,kBAAAA,CAAmB,SAAA;AAAW;AAC3C,KAAA,CAAA;IAEAO,SAAAA,CAAQE,aAAa,CAAC,UAAA,EAAY;AAChCC,QAAAA,mBAAAA,EAAqB,IAAM,EAAE;QAC7BC,QAAAA,EAAU;AAACG,YAAAA;AAAgB,SAAA;QAC3BD,QAAAA,EAAU;YAACb,kBAAAA,CAAmB,UAAA;AAAY;AAC5C,KAAA,CAAA;IAEAO,SAAAA,CAAQE,aAAa,CAAC,aAAA,EAAe;QACnCC,mBAAAA,EAAqBP,8BAAAA;QACrBQ,QAAAA,EAAU;AAACI,YAAAA,yBAAAA;YAAkBC,2BAAAA,CAAmB,YAAA,CAAA;AAAeC,YAAAA;AAAe,SAAA;QAC9EJ,QAAAA,EAAU;YAACb,kBAAAA,CAAmB,cAAA;AAAgB;AAChD,KAAA,CAAA;IAEAO,SAAAA,CAAQE,aAAa,CAAC,iBAAA,EAAmB;QACvCC,mBAAAA,EAAqBP,8BAAAA;QACrBQ,QAAAA,EAAU;AAACI,YAAAA,yBAAAA;YAAkBC,2BAAAA,CAAmB,gBAAA,CAAA;AAAmBC,YAAAA;AAAe,SAAA;QAClFJ,QAAAA,EAAU;YAACb,kBAAAA,CAAmB,cAAA;AAAgB;AAChD,KAAA,CAAA;IAEA,OAAOO,SAAAA;AACT;;;;"}
@@ -1,8 +1,8 @@
1
- import { propEq } from 'lodash/fp';
1
+ import { matchesProperty } from 'lodash';
2
2
  import createSectionBuilder from './builder.mjs';
3
3
  import { plugins, settings, contentTypesBase, fieldsProperty, subjectsHandlerFor } from './handlers.mjs';
4
4
 
5
- const sectionPropMatcher = propEq('section');
5
+ const sectionPropMatcher = (section)=>matchesProperty('section', section);
6
6
  const createContentTypesInitialState = ()=>({
7
7
  actions: [],
8
8
  subjects: []
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../../server/src/services/permission/sections-builder/index.ts"],"sourcesContent":["import { propEq } from 'lodash/fp';\nimport createSectionBuilder from './builder';\nimport {\n subjectsHandlerFor,\n contentTypesBase,\n fieldsProperty,\n plugins as pluginsHandler,\n settings as settingsHandler,\n} from './handlers';\n\nconst sectionPropMatcher = propEq('section');\n\nconst createContentTypesInitialState = () => ({\n actions: [],\n subjects: [],\n});\n\nconst createDefaultSectionBuilder = () => {\n const builder = createSectionBuilder();\n\n builder.createSection('plugins', {\n initialStateFactory: () => [],\n handlers: [pluginsHandler],\n matchers: [sectionPropMatcher('plugins')],\n });\n\n builder.createSection('settings', {\n initialStateFactory: () => [],\n handlers: [settingsHandler],\n matchers: [sectionPropMatcher('settings')],\n });\n\n builder.createSection('singleTypes', {\n initialStateFactory: createContentTypesInitialState,\n handlers: [contentTypesBase, subjectsHandlerFor('singleType'), fieldsProperty],\n matchers: [sectionPropMatcher('contentTypes')],\n });\n\n builder.createSection('collectionTypes', {\n initialStateFactory: createContentTypesInitialState,\n handlers: [contentTypesBase, subjectsHandlerFor('collectionType'), fieldsProperty],\n matchers: [sectionPropMatcher('contentTypes')],\n });\n\n return builder;\n};\n\nexport default createDefaultSectionBuilder;\n"],"names":["sectionPropMatcher","propEq","createContentTypesInitialState","actions","subjects","createDefaultSectionBuilder","builder","createSectionBuilder","createSection","initialStateFactory","handlers","pluginsHandler","matchers","settingsHandler","contentTypesBase","subjectsHandlerFor","fieldsProperty"],"mappings":";;;;AAUA,MAAMA,qBAAqBC,MAAAA,CAAO,SAAA,CAAA;AAElC,MAAMC,8BAAAA,GAAiC,KAAO;AAC5CC,QAAAA,OAAAA,EAAS,EAAE;AACXC,QAAAA,QAAAA,EAAU;KACZ,CAAA;AAEA,MAAMC,2BAAAA,GAA8B,IAAA;AAClC,IAAA,MAAMC,OAAAA,GAAUC,oBAAAA,EAAAA;IAEhBD,OAAAA,CAAQE,aAAa,CAAC,SAAA,EAAW;AAC/BC,QAAAA,mBAAAA,EAAqB,IAAM,EAAE;QAC7BC,QAAAA,EAAU;AAACC,YAAAA;AAAe,SAAA;QAC1BC,QAAAA,EAAU;YAACZ,kBAAAA,CAAmB,SAAA;AAAW;AAC3C,KAAA,CAAA;IAEAM,OAAAA,CAAQE,aAAa,CAAC,UAAA,EAAY;AAChCC,QAAAA,mBAAAA,EAAqB,IAAM,EAAE;QAC7BC,QAAAA,EAAU;AAACG,YAAAA;AAAgB,SAAA;QAC3BD,QAAAA,EAAU;YAACZ,kBAAAA,CAAmB,UAAA;AAAY;AAC5C,KAAA,CAAA;IAEAM,OAAAA,CAAQE,aAAa,CAAC,aAAA,EAAe;QACnCC,mBAAAA,EAAqBP,8BAAAA;QACrBQ,QAAAA,EAAU;AAACI,YAAAA,gBAAAA;YAAkBC,kBAAAA,CAAmB,YAAA,CAAA;AAAeC,YAAAA;AAAe,SAAA;QAC9EJ,QAAAA,EAAU;YAACZ,kBAAAA,CAAmB,cAAA;AAAgB;AAChD,KAAA,CAAA;IAEAM,OAAAA,CAAQE,aAAa,CAAC,iBAAA,EAAmB;QACvCC,mBAAAA,EAAqBP,8BAAAA;QACrBQ,QAAAA,EAAU;AAACI,YAAAA,gBAAAA;YAAkBC,kBAAAA,CAAmB,gBAAA,CAAA;AAAmBC,YAAAA;AAAe,SAAA;QAClFJ,QAAAA,EAAU;YAACZ,kBAAAA,CAAmB,cAAA;AAAgB;AAChD,KAAA,CAAA;IAEA,OAAOM,OAAAA;AACT;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../../server/src/services/permission/sections-builder/index.ts"],"sourcesContent":["import { matchesProperty } from 'lodash';\nimport createSectionBuilder from './builder';\nimport {\n subjectsHandlerFor,\n contentTypesBase,\n fieldsProperty,\n plugins as pluginsHandler,\n settings as settingsHandler,\n} from './handlers';\n\nconst sectionPropMatcher = (section: string) => matchesProperty('section', section);\n\nconst createContentTypesInitialState = () => ({\n actions: [],\n subjects: [],\n});\n\nconst createDefaultSectionBuilder = () => {\n const builder = createSectionBuilder();\n\n builder.createSection('plugins', {\n initialStateFactory: () => [],\n handlers: [pluginsHandler],\n matchers: [sectionPropMatcher('plugins')],\n });\n\n builder.createSection('settings', {\n initialStateFactory: () => [],\n handlers: [settingsHandler],\n matchers: [sectionPropMatcher('settings')],\n });\n\n builder.createSection('singleTypes', {\n initialStateFactory: createContentTypesInitialState,\n handlers: [contentTypesBase, subjectsHandlerFor('singleType'), fieldsProperty],\n matchers: [sectionPropMatcher('contentTypes')],\n });\n\n builder.createSection('collectionTypes', {\n initialStateFactory: createContentTypesInitialState,\n handlers: [contentTypesBase, subjectsHandlerFor('collectionType'), fieldsProperty],\n matchers: [sectionPropMatcher('contentTypes')],\n });\n\n return builder;\n};\n\nexport default createDefaultSectionBuilder;\n"],"names":["sectionPropMatcher","section","matchesProperty","createContentTypesInitialState","actions","subjects","createDefaultSectionBuilder","builder","createSectionBuilder","createSection","initialStateFactory","handlers","pluginsHandler","matchers","settingsHandler","contentTypesBase","subjectsHandlerFor","fieldsProperty"],"mappings":";;;;AAUA,MAAMA,kBAAAA,GAAqB,CAACC,OAAAA,GAAoBC,eAAAA,CAAgB,SAAA,EAAWD,OAAAA,CAAAA;AAE3E,MAAME,8BAAAA,GAAiC,KAAO;AAC5CC,QAAAA,OAAAA,EAAS,EAAE;AACXC,QAAAA,QAAAA,EAAU;KACZ,CAAA;AAEA,MAAMC,2BAAAA,GAA8B,IAAA;AAClC,IAAA,MAAMC,OAAAA,GAAUC,oBAAAA,EAAAA;IAEhBD,OAAAA,CAAQE,aAAa,CAAC,SAAA,EAAW;AAC/BC,QAAAA,mBAAAA,EAAqB,IAAM,EAAE;QAC7BC,QAAAA,EAAU;AAACC,YAAAA;AAAe,SAAA;QAC1BC,QAAAA,EAAU;YAACb,kBAAAA,CAAmB,SAAA;AAAW;AAC3C,KAAA,CAAA;IAEAO,OAAAA,CAAQE,aAAa,CAAC,UAAA,EAAY;AAChCC,QAAAA,mBAAAA,EAAqB,IAAM,EAAE;QAC7BC,QAAAA,EAAU;AAACG,YAAAA;AAAgB,SAAA;QAC3BD,QAAAA,EAAU;YAACb,kBAAAA,CAAmB,UAAA;AAAY;AAC5C,KAAA,CAAA;IAEAO,OAAAA,CAAQE,aAAa,CAAC,aAAA,EAAe;QACnCC,mBAAAA,EAAqBP,8BAAAA;QACrBQ,QAAAA,EAAU;AAACI,YAAAA,gBAAAA;YAAkBC,kBAAAA,CAAmB,YAAA,CAAA;AAAeC,YAAAA;AAAe,SAAA;QAC9EJ,QAAAA,EAAU;YAACb,kBAAAA,CAAmB,cAAA;AAAgB;AAChD,KAAA,CAAA;IAEAO,OAAAA,CAAQE,aAAa,CAAC,iBAAA,EAAmB;QACvCC,mBAAAA,EAAqBP,8BAAAA;QACrBQ,QAAAA,EAAU;AAACI,YAAAA,gBAAAA;YAAkBC,kBAAAA,CAAmB,gBAAA,CAAA;AAAmBC,YAAAA;AAAe,SAAA;QAClFJ,QAAAA,EAAU;YAACb,kBAAAA,CAAmB,cAAA;AAAgB;AAChD,KAAA,CAAA;IAEA,OAAOO,OAAAA;AACT;;;;"}
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
4
3
  var utils = require('@strapi/utils');
5
4
 
6
5
  const emptyObjectFactory = ()=>({});
@@ -23,7 +22,7 @@ const emptyObjectFactory = ()=>({});
23
22
  * If any of the registered matcher functions returns true, then the condition applies.
24
23
  */ async appliesToAction (action) {
25
24
  const results = await state.hooks.matchers.call(action);
26
- return results.some(fp.eq(true));
25
+ return results.some((result)=>result === true);
27
26
  },
28
27
  /**
29
28
  * Init, build and returns a section object based on the given actions