@strapi/admin 5.56.0 → 5.57.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 (311) 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/Enumeration.js +2 -2
  6. package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
  7. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +2 -2
  8. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/MediaLibraryBanner.js +38 -2
  10. package/dist/admin/admin/src/components/MediaLibraryBanner.js.map +1 -1
  11. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs +18 -2
  12. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/RelativeTime.js +9 -0
  14. package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
  15. package/dist/admin/admin/src/components/RelativeTime.mjs +10 -1
  16. package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/TopBanners.js +52 -0
  18. package/dist/admin/admin/src/components/TopBanners.js.map +1 -0
  19. package/dist/admin/admin/src/components/TopBanners.mjs +30 -0
  20. package/dist/admin/admin/src/components/TopBanners.mjs.map +1 -0
  21. package/dist/admin/admin/src/features/Tracking.js +28 -8
  22. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  23. package/dist/admin/admin/src/features/Tracking.mjs +29 -10
  24. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  25. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +4 -20
  26. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  27. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +4 -20
  28. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  29. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js +59 -0
  30. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js.map +1 -0
  31. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs +37 -0
  32. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs.map +1 -0
  33. package/dist/admin/admin/src/translations/en.json.js +5 -0
  34. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  35. package/dist/admin/admin/src/translations/en.json.mjs +5 -0
  36. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  37. package/dist/admin/admin/src/utils/getFetchClient.js +3 -3
  38. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  39. package/dist/admin/admin/src/utils/getFetchClient.mjs +2 -2
  40. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  41. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +6 -1
  42. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  43. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +6 -1
  44. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  45. package/dist/admin/src/components/MediaLibraryBanner.d.ts +10 -1
  46. package/dist/admin/src/components/TopBanners.d.ts +8 -0
  47. package/dist/admin/src/features/Tracking.d.ts +12 -1
  48. package/dist/admin/src/layouts/useAuthenticatedAccessTracking.d.ts +6 -0
  49. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +5 -0
  50. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  51. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts +8 -2
  52. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts.map +1 -1
  53. package/dist/ee/server/src/controllers/authentication.d.ts.map +1 -1
  54. package/dist/ee/server/src/controllers/user.d.ts.map +1 -1
  55. package/dist/ee/server/src/index.d.ts +4 -1
  56. package/dist/ee/server/src/index.d.ts.map +1 -1
  57. package/dist/ee/server/src/services/index.d.ts +4 -1
  58. package/dist/ee/server/src/services/index.d.ts.map +1 -1
  59. package/dist/ee/server/src/services/metrics.d.ts.map +1 -1
  60. package/dist/ee/server/src/services/persist-tables.d.ts.map +1 -1
  61. package/dist/ee/server/src/services/seat-enforcement.d.ts +3 -1
  62. package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -1
  63. package/dist/server/ee/server/src/controllers/admin.js +3 -4
  64. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  65. package/dist/server/ee/server/src/controllers/admin.mjs +3 -4
  66. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  67. package/dist/server/ee/server/src/controllers/authentication-utils/utils.js +2 -2
  68. package/dist/server/ee/server/src/controllers/authentication-utils/utils.js.map +1 -1
  69. package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs +2 -2
  70. package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs.map +1 -1
  71. package/dist/server/ee/server/src/controllers/authentication.js +11 -11
  72. package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
  73. package/dist/server/ee/server/src/controllers/authentication.mjs +11 -11
  74. package/dist/server/ee/server/src/controllers/authentication.mjs.map +1 -1
  75. package/dist/server/ee/server/src/controllers/user.js +7 -8
  76. package/dist/server/ee/server/src/controllers/user.js.map +1 -1
  77. package/dist/server/ee/server/src/controllers/user.mjs +8 -9
  78. package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
  79. package/dist/server/ee/server/src/services/metrics.js +9 -7
  80. package/dist/server/ee/server/src/services/metrics.js.map +1 -1
  81. package/dist/server/ee/server/src/services/metrics.mjs +9 -7
  82. package/dist/server/ee/server/src/services/metrics.mjs.map +1 -1
  83. package/dist/server/ee/server/src/services/persist-tables.js +3 -4
  84. package/dist/server/ee/server/src/services/persist-tables.js.map +1 -1
  85. package/dist/server/ee/server/src/services/persist-tables.mjs +3 -4
  86. package/dist/server/ee/server/src/services/persist-tables.mjs.map +1 -1
  87. package/dist/server/ee/server/src/services/role.js +2 -2
  88. package/dist/server/ee/server/src/services/role.js.map +1 -1
  89. package/dist/server/ee/server/src/services/role.mjs +1 -1
  90. package/dist/server/ee/server/src/services/role.mjs.map +1 -1
  91. package/dist/server/ee/server/src/services/seat-enforcement.js +20 -20
  92. package/dist/server/ee/server/src/services/seat-enforcement.js.map +1 -1
  93. package/dist/server/ee/server/src/services/seat-enforcement.mjs +20 -20
  94. package/dist/server/ee/server/src/services/seat-enforcement.mjs.map +1 -1
  95. package/dist/server/ee/server/src/services/user.js +1 -2
  96. package/dist/server/ee/server/src/services/user.js.map +1 -1
  97. package/dist/server/ee/server/src/services/user.mjs +2 -3
  98. package/dist/server/ee/server/src/services/user.mjs.map +1 -1
  99. package/dist/server/ee/server/src/utils/sso-lock.js +2 -2
  100. package/dist/server/ee/server/src/utils/sso-lock.js.map +1 -1
  101. package/dist/server/ee/server/src/utils/sso-lock.mjs +1 -1
  102. package/dist/server/ee/server/src/utils/sso-lock.mjs.map +1 -1
  103. package/dist/server/server/src/audit-logs/admin-users.js +3 -3
  104. package/dist/server/server/src/audit-logs/admin-users.js.map +1 -1
  105. package/dist/server/server/src/audit-logs/admin-users.mjs +2 -2
  106. package/dist/server/server/src/audit-logs/admin-users.mjs.map +1 -1
  107. package/dist/server/server/src/audit-logs/tokens.js +3 -3
  108. package/dist/server/server/src/audit-logs/tokens.js.map +1 -1
  109. package/dist/server/server/src/audit-logs/tokens.mjs +2 -2
  110. package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -1
  111. package/dist/server/server/src/audit-logs/webhooks.js +2 -2
  112. package/dist/server/server/src/audit-logs/webhooks.js.map +1 -1
  113. package/dist/server/server/src/audit-logs/webhooks.mjs +1 -1
  114. package/dist/server/server/src/audit-logs/webhooks.mjs.map +1 -1
  115. package/dist/server/server/src/bootstrap.js +6 -4
  116. package/dist/server/server/src/bootstrap.js.map +1 -1
  117. package/dist/server/server/src/bootstrap.mjs +6 -4
  118. package/dist/server/server/src/bootstrap.mjs.map +1 -1
  119. package/dist/server/server/src/controllers/admin-token.js +8 -8
  120. package/dist/server/server/src/controllers/admin-token.js.map +1 -1
  121. package/dist/server/server/src/controllers/admin-token.mjs +4 -4
  122. package/dist/server/server/src/controllers/admin-token.mjs.map +1 -1
  123. package/dist/server/server/src/controllers/admin.js +3 -5
  124. package/dist/server/server/src/controllers/admin.js.map +1 -1
  125. package/dist/server/server/src/controllers/admin.mjs +2 -4
  126. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  127. package/dist/server/server/src/controllers/api-token.js +8 -8
  128. package/dist/server/server/src/controllers/api-token.js.map +1 -1
  129. package/dist/server/server/src/controllers/api-token.mjs +4 -4
  130. package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
  131. package/dist/server/server/src/controllers/formatters/conditions.js +2 -2
  132. package/dist/server/server/src/controllers/formatters/conditions.js.map +1 -1
  133. package/dist/server/server/src/controllers/formatters/conditions.mjs +2 -2
  134. package/dist/server/server/src/controllers/formatters/conditions.mjs.map +1 -1
  135. package/dist/server/server/src/controllers/transfer/index.js +2 -2
  136. package/dist/server/server/src/controllers/transfer/index.js.map +1 -1
  137. package/dist/server/server/src/controllers/transfer/index.mjs +2 -2
  138. package/dist/server/server/src/controllers/transfer/index.mjs.map +1 -1
  139. package/dist/server/server/src/controllers/transfer/token.js +8 -8
  140. package/dist/server/server/src/controllers/transfer/token.js.map +1 -1
  141. package/dist/server/server/src/controllers/transfer/token.mjs +4 -4
  142. package/dist/server/server/src/controllers/transfer/token.mjs.map +1 -1
  143. package/dist/server/server/src/domain/action/index.js +18 -16
  144. package/dist/server/server/src/domain/action/index.js.map +1 -1
  145. package/dist/server/server/src/domain/action/index.mjs +16 -14
  146. package/dist/server/server/src/domain/action/index.mjs.map +1 -1
  147. package/dist/server/server/src/domain/action/provider.mjs +4 -4
  148. package/dist/server/server/src/domain/action/provider.mjs.map +1 -1
  149. package/dist/server/server/src/domain/condition/index.js +7 -4
  150. package/dist/server/server/src/domain/condition/index.js.map +1 -1
  151. package/dist/server/server/src/domain/condition/index.mjs +7 -4
  152. package/dist/server/server/src/domain/condition/index.mjs.map +1 -1
  153. package/dist/server/server/src/domain/permission/index.js +24 -15
  154. package/dist/server/server/src/domain/permission/index.js.map +1 -1
  155. package/dist/server/server/src/domain/permission/index.mjs +21 -12
  156. package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
  157. package/dist/server/server/src/middlewares/rateLimit.js +5 -5
  158. package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
  159. package/dist/server/server/src/middlewares/rateLimit.mjs +4 -4
  160. package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
  161. package/dist/server/server/src/register.js +6 -0
  162. package/dist/server/server/src/register.js.map +1 -1
  163. package/dist/server/server/src/register.mjs +6 -0
  164. package/dist/server/server/src/register.mjs.map +1 -1
  165. package/dist/server/server/src/services/action.js +1 -2
  166. package/dist/server/server/src/services/action.js.map +1 -1
  167. package/dist/server/server/src/services/action.mjs +1 -2
  168. package/dist/server/server/src/services/action.mjs.map +1 -1
  169. package/dist/server/server/src/services/api-token.js +61 -49
  170. package/dist/server/server/src/services/api-token.js.map +1 -1
  171. package/dist/server/server/src/services/api-token.mjs +53 -41
  172. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  173. package/dist/server/server/src/services/condition.js +2 -2
  174. package/dist/server/server/src/services/condition.js.map +1 -1
  175. package/dist/server/server/src/services/condition.mjs +1 -1
  176. package/dist/server/server/src/services/condition.mjs.map +1 -1
  177. package/dist/server/server/src/services/content-type.js +5 -4
  178. package/dist/server/server/src/services/content-type.js.map +1 -1
  179. package/dist/server/server/src/services/content-type.mjs +8 -7
  180. package/dist/server/server/src/services/content-type.mjs.map +1 -1
  181. package/dist/server/server/src/services/homepage.js +2 -1
  182. package/dist/server/server/src/services/homepage.js.map +1 -1
  183. package/dist/server/server/src/services/homepage.mjs +2 -1
  184. package/dist/server/server/src/services/homepage.mjs.map +1 -1
  185. package/dist/server/server/src/services/passport/local-strategy.js +2 -2
  186. package/dist/server/server/src/services/passport/local-strategy.js.map +1 -1
  187. package/dist/server/server/src/services/passport/local-strategy.mjs +1 -1
  188. package/dist/server/server/src/services/passport/local-strategy.mjs.map +1 -1
  189. package/dist/server/server/src/services/passport.js +1 -2
  190. package/dist/server/server/src/services/passport.js.map +1 -1
  191. package/dist/server/server/src/services/passport.mjs +1 -2
  192. package/dist/server/server/src/services/passport.mjs.map +1 -1
  193. package/dist/server/server/src/services/permission/engine.js +4 -4
  194. package/dist/server/server/src/services/permission/engine.js.map +1 -1
  195. package/dist/server/server/src/services/permission/engine.mjs +2 -2
  196. package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
  197. package/dist/server/server/src/services/permission/permissions-manager/index.js +2 -3
  198. package/dist/server/server/src/services/permission/permissions-manager/index.js.map +1 -1
  199. package/dist/server/server/src/services/permission/permissions-manager/index.mjs +1 -2
  200. package/dist/server/server/src/services/permission/permissions-manager/index.mjs.map +1 -1
  201. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js +6 -6
  202. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js.map +1 -1
  203. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs +4 -4
  204. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs.map +1 -1
  205. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js +47 -41
  206. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
  207. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs +44 -38
  208. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
  209. package/dist/server/server/src/services/permission/permissions-manager/validate.js +30 -26
  210. package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
  211. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs +28 -24
  212. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
  213. package/dist/server/server/src/services/permission/queries.js +9 -9
  214. package/dist/server/server/src/services/permission/queries.js.map +1 -1
  215. package/dist/server/server/src/services/permission/queries.mjs +9 -9
  216. package/dist/server/server/src/services/permission/queries.mjs.map +1 -1
  217. package/dist/server/server/src/services/permission/rename-fields.js +118 -0
  218. package/dist/server/server/src/services/permission/rename-fields.js.map +1 -0
  219. package/dist/server/server/src/services/permission/rename-fields.mjs +116 -0
  220. package/dist/server/server/src/services/permission/rename-fields.mjs.map +1 -0
  221. package/dist/server/server/src/services/permission/sections-builder/index.js +2 -2
  222. package/dist/server/server/src/services/permission/sections-builder/index.js.map +1 -1
  223. package/dist/server/server/src/services/permission/sections-builder/index.mjs +2 -2
  224. package/dist/server/server/src/services/permission/sections-builder/index.mjs.map +1 -1
  225. package/dist/server/server/src/services/permission/sections-builder/section.js +1 -2
  226. package/dist/server/server/src/services/permission/sections-builder/section.js.map +1 -1
  227. package/dist/server/server/src/services/permission/sections-builder/section.mjs +1 -2
  228. package/dist/server/server/src/services/permission/sections-builder/section.mjs.map +1 -1
  229. package/dist/server/server/src/services/permission/sections-builder/utils.js +6 -6
  230. package/dist/server/server/src/services/permission/sections-builder/utils.js.map +1 -1
  231. package/dist/server/server/src/services/permission/sections-builder/utils.mjs +4 -4
  232. package/dist/server/server/src/services/permission/sections-builder/utils.mjs.map +1 -1
  233. package/dist/server/server/src/services/role.js +20 -19
  234. package/dist/server/server/src/services/role.js.map +1 -1
  235. package/dist/server/server/src/services/role.mjs +20 -19
  236. package/dist/server/server/src/services/role.mjs.map +1 -1
  237. package/dist/server/server/src/services/transfer/token.js +20 -16
  238. package/dist/server/server/src/services/transfer/token.js.map +1 -1
  239. package/dist/server/server/src/services/transfer/token.mjs +14 -10
  240. package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
  241. package/dist/server/server/src/services/user.js +2 -3
  242. package/dist/server/server/src/services/user.js.map +1 -1
  243. package/dist/server/server/src/services/user.mjs +3 -4
  244. package/dist/server/server/src/services/user.mjs.map +1 -1
  245. package/dist/server/server/src/strategies/api-token-utils.js +2 -3
  246. package/dist/server/server/src/strategies/api-token-utils.js.map +1 -1
  247. package/dist/server/server/src/strategies/api-token-utils.mjs +2 -3
  248. package/dist/server/server/src/strategies/api-token-utils.mjs.map +1 -1
  249. package/dist/server/server/src/strategies/content-api-token.js +3 -3
  250. package/dist/server/server/src/strategies/content-api-token.js.map +1 -1
  251. package/dist/server/server/src/strategies/content-api-token.mjs +1 -1
  252. package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -1
  253. package/dist/server/server/src/strategies/data-transfer.js +4 -4
  254. package/dist/server/server/src/strategies/data-transfer.js.map +1 -1
  255. package/dist/server/server/src/strategies/data-transfer.mjs +3 -3
  256. package/dist/server/server/src/strategies/data-transfer.mjs.map +1 -1
  257. package/dist/server/server/src/validation/common-validators.js +9 -10
  258. package/dist/server/server/src/validation/common-validators.js.map +1 -1
  259. package/dist/server/server/src/validation/common-validators.mjs +13 -14
  260. package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
  261. package/dist/server/server/src/validation/user.js +1 -2
  262. package/dist/server/server/src/validation/user.js.map +1 -1
  263. package/dist/server/server/src/validation/user.mjs +1 -2
  264. package/dist/server/server/src/validation/user.mjs.map +1 -1
  265. package/dist/server/src/audit-logs/tokens.d.ts.map +1 -1
  266. package/dist/server/src/bootstrap.d.ts.map +1 -1
  267. package/dist/server/src/controllers/admin-token.d.ts.map +1 -1
  268. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  269. package/dist/server/src/controllers/api-token.d.ts.map +1 -1
  270. package/dist/server/src/controllers/formatters/conditions.d.ts +1 -1
  271. package/dist/server/src/controllers/formatters/conditions.d.ts.map +1 -1
  272. package/dist/server/src/controllers/homepage.d.ts +1 -1
  273. package/dist/server/src/controllers/index.d.ts +1 -1
  274. package/dist/server/src/controllers/transfer/index.d.ts.map +1 -1
  275. package/dist/server/src/controllers/transfer/token.d.ts.map +1 -1
  276. package/dist/server/src/domain/action/index.d.ts +1 -0
  277. package/dist/server/src/domain/action/index.d.ts.map +1 -1
  278. package/dist/server/src/domain/condition/index.d.ts +2 -2
  279. package/dist/server/src/domain/condition/index.d.ts.map +1 -1
  280. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  281. package/dist/server/src/index.d.ts +3 -3
  282. package/dist/server/src/index.d.ts.map +1 -1
  283. package/dist/server/src/middlewares/index.d.ts.map +1 -1
  284. package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
  285. package/dist/server/src/register.d.ts.map +1 -1
  286. package/dist/server/src/services/action.d.ts.map +1 -1
  287. package/dist/server/src/services/api-token.d.ts.map +1 -1
  288. package/dist/server/src/services/condition.d.ts.map +1 -1
  289. package/dist/server/src/services/content-type.d.ts.map +1 -1
  290. package/dist/server/src/services/homepage.d.ts +1 -1
  291. package/dist/server/src/services/homepage.d.ts.map +1 -1
  292. package/dist/server/src/services/index.d.ts +2 -2
  293. package/dist/server/src/services/index.d.ts.map +1 -1
  294. package/dist/server/src/services/passport/local-strategy.d.ts.map +1 -1
  295. package/dist/server/src/services/passport.d.ts.map +1 -1
  296. package/dist/server/src/services/permission/engine.d.ts.map +1 -1
  297. package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -1
  298. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
  299. package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
  300. package/dist/server/src/services/permission/queries.d.ts.map +1 -1
  301. package/dist/server/src/services/permission/rename-fields.d.ts +21 -0
  302. package/dist/server/src/services/permission/rename-fields.d.ts.map +1 -0
  303. package/dist/server/src/services/permission/sections-builder/section.d.ts.map +1 -1
  304. package/dist/server/src/services/permission/sections-builder/utils.d.ts +1 -1
  305. package/dist/server/src/services/permission/sections-builder/utils.d.ts.map +1 -1
  306. package/dist/server/src/services/role.d.ts +1 -1
  307. package/dist/server/src/services/role.d.ts.map +1 -1
  308. package/dist/server/src/services/transfer/token.d.ts.map +1 -1
  309. package/dist/server/src/strategies/content-api-token.d.ts.map +1 -1
  310. package/dist/server/src/validation/user.d.ts.map +1 -1
  311. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"content-type.js","sources":["../../../../../server/src/services/content-type.ts"],"sourcesContent":["import _ from 'lodash';\nimport { uniq, startsWith } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Modules, Struct } from '@strapi/types';\nimport { getService } from '../utils';\nimport actionDomain from '../domain/action';\nimport permissionDomain from '../domain/permission';\n\ninterface FieldOptions {\n prefix?: string; // prefix to add to the path\n nestingLevel?: number; // level of nesting to achieve\n requiredOnly?: boolean; // only returns required nestedFields\n existingFields?: string[]; // fields that are already selected, meaning that some sub-fields may be required\n restrictedSubjects?: string[]; // subjectsId to ignore\n components?: {\n // components where components attributes can be found\n [key: string]: any;\n };\n}\n\n/**\n * Creates an array of paths to the fields and nested fields, without path nodes\n */\nconst getNestedFields = (\n model: Struct.ContentTypeSchema,\n {\n prefix = '',\n nestingLevel = 15,\n components = {},\n requiredOnly = false,\n existingFields = [],\n }: FieldOptions\n): string[] => {\n if (nestingLevel === 0) {\n return prefix ? [prefix] : [];\n }\n\n const nonAuthorizableFields = contentTypesUtils.getNonVisibleAttributes(model);\n\n return _.reduce(\n model.attributes,\n (fields: any, attr: any, key: any) => {\n if (nonAuthorizableFields.includes(key)) return fields;\n\n const fieldPath = prefix ? `${prefix}.${key}` : key;\n const shouldBeIncluded = !requiredOnly || attr.required === true;\n const insideExistingFields = existingFields && existingFields.some(startsWith(fieldPath));\n\n if (attr.type === 'component') {\n if (shouldBeIncluded || insideExistingFields) {\n const compoFields = getNestedFields(components[attr.component], {\n nestingLevel: nestingLevel - 1,\n prefix: fieldPath,\n components,\n requiredOnly,\n existingFields,\n });\n\n if (compoFields.length === 0 && shouldBeIncluded) {\n return fields.concat(fieldPath);\n }\n\n return fields.concat(compoFields);\n }\n return fields;\n }\n\n if (shouldBeIncluded) {\n return fields.concat(fieldPath);\n }\n\n return fields;\n },\n []\n );\n};\n\n/**\n * Creates an array of paths to the fields and nested fields, with path nodes\n */\nconst getNestedFieldsWithIntermediate = (\n model: Struct.ContentTypeSchema,\n { prefix = '', nestingLevel = 15, components = {} }: FieldOptions\n): string[] => {\n if (nestingLevel === 0) {\n return [];\n }\n\n const nonAuthorizableFields = contentTypesUtils.getNonVisibleAttributes(model);\n\n return _.reduce(\n model.attributes,\n (fields: any, attr: any, key: any) => {\n if (nonAuthorizableFields.includes(key)) return fields;\n\n const fieldPath = prefix ? `${prefix}.${key}` : key;\n fields.push(fieldPath);\n\n if (attr.type === 'component') {\n const compoFields = getNestedFieldsWithIntermediate(components[attr.component], {\n nestingLevel: nestingLevel - 1,\n prefix: fieldPath,\n components,\n });\n\n fields.push(...compoFields);\n }\n\n return fields;\n },\n []\n );\n};\n\n/**\n * Creates an array of permissions with the \"properties.fields\" attribute filled\n */\nconst getPermissionsWithNestedFields = (\n actions: any[],\n { nestingLevel, restrictedSubjects = [] }: FieldOptions = {}\n): Modules.Permissions.PermissionRule[] => {\n return actions.reduce((permissions, action) => {\n const validSubjects = action.subjects.filter(\n (subject: any) => !restrictedSubjects.includes(subject)\n );\n\n // Create a Permission for each subject (content-type uid) within the action\n for (const subject of validSubjects) {\n const fields = actionDomain.appliesToProperty('fields', action)\n ? getNestedFields(strapi.contentTypes[subject], {\n components: strapi.components,\n nestingLevel,\n })\n : undefined;\n\n const permission = permissionDomain.create({\n action: action.actionId,\n subject,\n properties: { fields },\n });\n\n permissions.push(permission);\n }\n\n return permissions;\n }, []);\n};\n\n/**\n * Cleans permissions' fields (add required ones, remove the non-existing ones)\n */\nconst cleanPermissionFields = (\n permissions: Modules.Permissions.PermissionRule[]\n): Modules.Permissions.PermissionRule[] => {\n const { actionProvider } = getService('permission');\n const nestedFieldsCache = new Map<string, string[]>();\n\n return permissions.map((permission: any) => {\n const {\n action: actionId,\n subject,\n properties: { fields },\n } = permission;\n\n const action = actionProvider.get(actionId) as any;\n\n // todo see if it's possible to check property on action + subject (async)\n if (!actionDomain.appliesToProperty('fields', action)) {\n return permissionDomain.deleteProperty('fields', permission);\n }\n\n if (!subject || !strapi.contentTypes[subject]) {\n return permission;\n }\n\n let possibleFields = nestedFieldsCache.get(subject);\n if (!possibleFields) {\n possibleFields = getNestedFieldsWithIntermediate(strapi.contentTypes[subject], {\n components: strapi.components,\n });\n nestedFieldsCache.set(subject, possibleFields);\n }\n\n const currentFields: string[] = fields || [];\n\n const validUserFields: string[] = uniq(\n possibleFields.filter((pf) =>\n currentFields.some((cf) => pf === cf || startsWith(`${cf}.`, pf))\n )\n );\n\n // A field is considered \"not nested\" if no other valid user field starts with this field's path followed by a dot.\n // This helps to remove redundant parent paths when a more specific child path is already included.\n // For example, if 'component.title' is present, 'component' would be filtered out by this condition.\n const isNotNestedField = (field: string) =>\n !validUserFields.some(\n (validUserField: string) =>\n validUserField !== field && startsWith(`${field}.`, validUserField)\n );\n\n // Filter out fields that are parent paths of other included fields.\n const newFields = validUserFields.filter(isNotNestedField);\n\n return permissionDomain.setProperty('fields', newFields, permission);\n }, []);\n};\n\nexport {\n getNestedFields,\n getPermissionsWithNestedFields,\n cleanPermissionFields,\n getNestedFieldsWithIntermediate,\n};\n"],"names":["getNestedFields","model","prefix","nestingLevel","components","requiredOnly","existingFields","nonAuthorizableFields","contentTypesUtils","getNonVisibleAttributes","_","reduce","attributes","fields","attr","key","includes","fieldPath","shouldBeIncluded","required","insideExistingFields","some","startsWith","type","compoFields","component","length","concat","getNestedFieldsWithIntermediate","push","getPermissionsWithNestedFields","actions","restrictedSubjects","permissions","action","validSubjects","subjects","filter","subject","actionDomain","appliesToProperty","strapi","contentTypes","undefined","permission","permissionDomain","create","actionId","properties","cleanPermissionFields","actionProvider","getService","nestedFieldsCache","Map","map","get","deleteProperty","possibleFields","set","currentFields","validUserFields","uniq","pf","cf","isNotNestedField","field","validUserField","newFields","setProperty"],"mappings":"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"}
1
+ {"version":3,"file":"content-type.js","sources":["../../../../../server/src/services/content-type.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Modules, Struct } from '@strapi/types';\nimport { getService } from '../utils';\nimport actionDomain from '../domain/action';\nimport permissionDomain from '../domain/permission';\n\ninterface FieldOptions {\n prefix?: string; // prefix to add to the path\n nestingLevel?: number; // level of nesting to achieve\n requiredOnly?: boolean; // only returns required nestedFields\n existingFields?: string[]; // fields that are already selected, meaning that some sub-fields may be required\n restrictedSubjects?: string[]; // subjectsId to ignore\n components?: {\n // components where components attributes can be found\n [key: string]: any;\n };\n}\n\n/**\n * Creates an array of paths to the fields and nested fields, without path nodes\n */\nconst getNestedFields = (\n model: Struct.ContentTypeSchema,\n {\n prefix = '',\n nestingLevel = 15,\n components = {},\n requiredOnly = false,\n existingFields = [],\n }: FieldOptions\n): string[] => {\n if (nestingLevel === 0) {\n return prefix ? [prefix] : [];\n }\n\n const nonAuthorizableFields = contentTypesUtils.getNonVisibleAttributes(model);\n\n return _.reduce(\n model.attributes,\n (fields: any, attr: any, key: any) => {\n if (nonAuthorizableFields.includes(key)) return fields;\n\n const fieldPath = prefix ? `${prefix}.${key}` : key;\n const shouldBeIncluded = !requiredOnly || attr.required === true;\n const insideExistingFields =\n existingFields && existingFields.some((field) => field.startsWith(fieldPath));\n\n if (attr.type === 'component') {\n if (shouldBeIncluded || insideExistingFields) {\n const compoFields = getNestedFields(components[attr.component], {\n nestingLevel: nestingLevel - 1,\n prefix: fieldPath,\n components,\n requiredOnly,\n existingFields,\n });\n\n if (compoFields.length === 0 && shouldBeIncluded) {\n return fields.concat(fieldPath);\n }\n\n return fields.concat(compoFields);\n }\n return fields;\n }\n\n if (shouldBeIncluded) {\n return fields.concat(fieldPath);\n }\n\n return fields;\n },\n []\n );\n};\n\n/**\n * Creates an array of paths to the fields and nested fields, with path nodes\n */\nconst getNestedFieldsWithIntermediate = (\n model: Struct.ContentTypeSchema,\n { prefix = '', nestingLevel = 15, components = {} }: FieldOptions\n): string[] => {\n if (nestingLevel === 0) {\n return [];\n }\n\n const nonAuthorizableFields = contentTypesUtils.getNonVisibleAttributes(model);\n\n return _.reduce(\n model.attributes,\n (fields: any, attr: any, key: any) => {\n if (nonAuthorizableFields.includes(key)) return fields;\n\n const fieldPath = prefix ? `${prefix}.${key}` : key;\n fields.push(fieldPath);\n\n if (attr.type === 'component') {\n const compoFields = getNestedFieldsWithIntermediate(components[attr.component], {\n nestingLevel: nestingLevel - 1,\n prefix: fieldPath,\n components,\n });\n\n fields.push(...compoFields);\n }\n\n return fields;\n },\n []\n );\n};\n\n/**\n * Creates an array of permissions with the \"properties.fields\" attribute filled\n */\nconst getPermissionsWithNestedFields = (\n actions: any[],\n { nestingLevel, restrictedSubjects = [] }: FieldOptions = {}\n): Modules.Permissions.PermissionRule[] => {\n return actions.reduce((permissions, action) => {\n const validSubjects = action.subjects.filter(\n (subject: any) => !restrictedSubjects.includes(subject)\n );\n\n // Create a Permission for each subject (content-type uid) within the action\n for (const subject of validSubjects) {\n const fields = actionDomain.appliesToProperty('fields', action)\n ? getNestedFields(strapi.contentTypes[subject], {\n components: strapi.components,\n nestingLevel,\n })\n : undefined;\n\n const permission = permissionDomain.create({\n action: action.actionId,\n subject,\n properties: { fields },\n });\n\n permissions.push(permission);\n }\n\n return permissions;\n }, []);\n};\n\n/**\n * Cleans permissions' fields (add required ones, remove the non-existing ones)\n */\nconst cleanPermissionFields = (\n permissions: Modules.Permissions.PermissionRule[]\n): Modules.Permissions.PermissionRule[] => {\n const { actionProvider } = getService('permission');\n const nestedFieldsCache = new Map<string, string[]>();\n\n return permissions.map((permission: any) => {\n const {\n action: actionId,\n subject,\n properties: { fields },\n } = permission;\n\n const action = actionProvider.get(actionId) as any;\n\n // todo see if it's possible to check property on action + subject (async)\n if (!actionDomain.appliesToProperty('fields', action)) {\n return permissionDomain.deleteProperty('fields', permission);\n }\n\n if (!subject || !strapi.contentTypes[subject]) {\n return permission;\n }\n\n let possibleFields = nestedFieldsCache.get(subject);\n if (!possibleFields) {\n possibleFields = getNestedFieldsWithIntermediate(strapi.contentTypes[subject], {\n components: strapi.components,\n });\n nestedFieldsCache.set(subject, possibleFields);\n }\n\n const currentFields: string[] = fields || [];\n\n const validUserFields: string[] = [\n ...new Set(\n possibleFields.filter((pf) =>\n currentFields.some((cf) => pf === cf || pf.startsWith(`${cf}.`))\n )\n ),\n ];\n\n // A field is considered \"not nested\" if no other valid user field starts with this field's path followed by a dot.\n // This helps to remove redundant parent paths when a more specific child path is already included.\n // For example, if 'component.title' is present, 'component' would be filtered out by this condition.\n const isNotNestedField = (field: string) =>\n !validUserFields.some(\n (validUserField: string) =>\n validUserField !== field && validUserField.startsWith(`${field}.`)\n );\n\n // Filter out fields that are parent paths of other included fields.\n const newFields = validUserFields.filter(isNotNestedField);\n\n return permissionDomain.setProperty('fields', newFields, permission);\n }, []);\n};\n\nexport {\n getNestedFields,\n getPermissionsWithNestedFields,\n cleanPermissionFields,\n getNestedFieldsWithIntermediate,\n};\n"],"names":["getNestedFields","model","prefix","nestingLevel","components","requiredOnly","existingFields","nonAuthorizableFields","contentTypesUtils","getNonVisibleAttributes","_","reduce","attributes","fields","attr","key","includes","fieldPath","shouldBeIncluded","required","insideExistingFields","some","field","startsWith","type","compoFields","component","length","concat","getNestedFieldsWithIntermediate","push","getPermissionsWithNestedFields","actions","restrictedSubjects","permissions","action","validSubjects","subjects","filter","subject","actionDomain","appliesToProperty","strapi","contentTypes","undefined","permission","permissionDomain","create","actionId","properties","cleanPermissionFields","actionProvider","getService","nestedFieldsCache","Map","map","get","deleteProperty","possibleFields","set","currentFields","validUserFields","Set","pf","cf","isNotNestedField","validUserField","newFields","setProperty"],"mappings":";;;;;;;;;;;;AAoBA;;IAGA,MAAMA,kBAAkB,CACtBC,KAAAA,EACA,EACEC,MAAAA,GAAS,EAAE,EACXC,YAAAA,GAAe,EAAE,EACjBC,UAAAA,GAAa,EAAE,EACfC,YAAAA,GAAe,KAAK,EACpBC,cAAAA,GAAiB,EAAE,EACN,GAAA;AAEf,IAAA,IAAIH,iBAAiB,CAAA,EAAG;AACtB,QAAA,OAAOD,MAAAA,GAAS;AAACA,YAAAA;AAAO,SAAA,GAAG,EAAE;AAC/B,IAAA;IAEA,MAAMK,qBAAAA,GAAwBC,kBAAAA,CAAkBC,uBAAuB,CAACR,KAAAA,CAAAA;IAExE,OAAOS,kBAAAA,CAAEC,MAAM,CACbV,KAAAA,CAAMW,UAAU,EAChB,CAACC,QAAaC,IAAAA,EAAWC,GAAAA,GAAAA;AACvB,QAAA,IAAIR,qBAAAA,CAAsBS,QAAQ,CAACD,GAAAA,CAAAA,EAAM,OAAOF,MAAAA;AAEhD,QAAA,MAAMI,YAAYf,MAAAA,GAAS,CAAA,EAAGA,OAAO,CAAC,EAAEa,KAAK,GAAGA,GAAAA;AAChD,QAAA,MAAMG,gBAAAA,GAAmB,CAACb,YAAAA,IAAgBS,IAAAA,CAAKK,QAAQ,KAAK,IAAA;QAC5D,MAAMC,oBAAAA,GACJd,kBAAkBA,cAAAA,CAAee,IAAI,CAAC,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,UAAU,CAACN,SAAAA,CAAAA,CAAAA;QAEpE,IAAIH,IAAAA,CAAKU,IAAI,KAAK,WAAA,EAAa;AAC7B,YAAA,IAAIN,oBAAoBE,oBAAAA,EAAsB;AAC5C,gBAAA,MAAMK,cAAczB,eAAAA,CAAgBI,UAAU,CAACU,IAAAA,CAAKY,SAAS,CAAC,EAAE;AAC9DvB,oBAAAA,YAAAA,EAAcA,YAAAA,GAAe,CAAA;oBAC7BD,MAAAA,EAAQe,SAAAA;AACRb,oBAAAA,UAAAA;AACAC,oBAAAA,YAAAA;AACAC,oBAAAA;AACF,iBAAA,CAAA;AAEA,gBAAA,IAAImB,WAAAA,CAAYE,MAAM,KAAK,CAAA,IAAKT,gBAAAA,EAAkB;oBAChD,OAAOL,MAAAA,CAAOe,MAAM,CAACX,SAAAA,CAAAA;AACvB,gBAAA;gBAEA,OAAOJ,MAAAA,CAAOe,MAAM,CAACH,WAAAA,CAAAA;AACvB,YAAA;YACA,OAAOZ,MAAAA;AACT,QAAA;AAEA,QAAA,IAAIK,gBAAAA,EAAkB;YACpB,OAAOL,MAAAA,CAAOe,MAAM,CAACX,SAAAA,CAAAA;AACvB,QAAA;QAEA,OAAOJ,MAAAA;AACT,IAAA,CAAA,EACA,EAAE,CAAA;AAEN;AAEA;;AAEC,IACD,MAAMgB,+BAAAA,GAAkC,CACtC5B,KAAAA,EACA,EAAEC,MAAAA,GAAS,EAAE,EAAEC,YAAAA,GAAe,EAAE,EAAEC,UAAAA,GAAa,EAAE,EAAgB,GAAA;AAEjE,IAAA,IAAID,iBAAiB,CAAA,EAAG;AACtB,QAAA,OAAO,EAAE;AACX,IAAA;IAEA,MAAMI,qBAAAA,GAAwBC,kBAAAA,CAAkBC,uBAAuB,CAACR,KAAAA,CAAAA;IAExE,OAAOS,kBAAAA,CAAEC,MAAM,CACbV,KAAAA,CAAMW,UAAU,EAChB,CAACC,QAAaC,IAAAA,EAAWC,GAAAA,GAAAA;AACvB,QAAA,IAAIR,qBAAAA,CAAsBS,QAAQ,CAACD,GAAAA,CAAAA,EAAM,OAAOF,MAAAA;AAEhD,QAAA,MAAMI,YAAYf,MAAAA,GAAS,CAAA,EAAGA,OAAO,CAAC,EAAEa,KAAK,GAAGA,GAAAA;AAChDF,QAAAA,MAAAA,CAAOiB,IAAI,CAACb,SAAAA,CAAAA;QAEZ,IAAIH,IAAAA,CAAKU,IAAI,KAAK,WAAA,EAAa;AAC7B,YAAA,MAAMC,cAAcI,+BAAAA,CAAgCzB,UAAU,CAACU,IAAAA,CAAKY,SAAS,CAAC,EAAE;AAC9EvB,gBAAAA,YAAAA,EAAcA,YAAAA,GAAe,CAAA;gBAC7BD,MAAAA,EAAQe,SAAAA;AACRb,gBAAAA;AACF,aAAA,CAAA;AAEAS,YAAAA,MAAAA,CAAOiB,IAAI,CAAA,GAAIL,WAAAA,CAAAA;AACjB,QAAA;QAEA,OAAOZ,MAAAA;AACT,IAAA,CAAA,EACA,EAAE,CAAA;AAEN;AAEA;;AAEC,IACD,MAAMkB,8BAAAA,GAAiC,CACrCC,OAAAA,EACA,EAAE7B,YAAY,EAAE8B,kBAAAA,GAAqB,EAAE,EAAgB,GAAG,EAAE,GAAA;AAE5D,IAAA,OAAOD,OAAAA,CAAQrB,MAAM,CAAC,CAACuB,WAAAA,EAAaC,MAAAA,GAAAA;QAClC,MAAMC,aAAAA,GAAgBD,MAAAA,CAAOE,QAAQ,CAACC,MAAM,CAC1C,CAACC,OAAAA,GAAiB,CAACN,kBAAAA,CAAmBjB,QAAQ,CAACuB,OAAAA,CAAAA,CAAAA;;QAIjD,KAAK,MAAMA,WAAWH,aAAAA,CAAe;YACnC,MAAMvB,MAAAA,GAAS2B,OAAAA,CAAaC,iBAAiB,CAAC,QAAA,EAAUN,MAAAA,CAAAA,GACpDnC,eAAAA,CAAgB0C,MAAAA,CAAOC,YAAY,CAACJ,OAAAA,CAAQ,EAAE;AAC5CnC,gBAAAA,UAAAA,EAAYsC,OAAOtC,UAAU;AAC7BD,gBAAAA;aACF,CAAA,GACAyC,SAAAA;YAEJ,MAAMC,UAAAA,GAAaC,eAAAA,CAAiBC,MAAM,CAAC;AACzCZ,gBAAAA,MAAAA,EAAQA,OAAOa,QAAQ;AACvBT,gBAAAA,OAAAA;gBACAU,UAAAA,EAAY;AAAEpC,oBAAAA;AAAO;AACvB,aAAA,CAAA;AAEAqB,YAAAA,WAAAA,CAAYJ,IAAI,CAACe,UAAAA,CAAAA;AACnB,QAAA;QAEA,OAAOX,WAAAA;AACT,IAAA,CAAA,EAAG,EAAE,CAAA;AACP;AAEA;;IAGA,MAAMgB,wBAAwB,CAC5BhB,WAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEiB,cAAc,EAAE,GAAGC,gBAAAA,CAAW,YAAA,CAAA;AACtC,IAAA,MAAMC,oBAAoB,IAAIC,GAAAA,EAAAA;IAE9B,OAAOpB,WAAAA,CAAYqB,GAAG,CAAC,CAACV,UAAAA,GAAAA;QACtB,MAAM,EACJV,MAAAA,EAAQa,QAAQ,EAChBT,OAAO,EACPU,UAAAA,EAAY,EAAEpC,MAAM,EAAE,EACvB,GAAGgC,UAAAA;QAEJ,MAAMV,MAAAA,GAASgB,cAAAA,CAAeK,GAAG,CAACR,QAAAA,CAAAA;;AAGlC,QAAA,IAAI,CAACR,OAAAA,CAAaC,iBAAiB,CAAC,UAAUN,MAAAA,CAAAA,EAAS;YACrD,OAAOW,eAAAA,CAAiBW,cAAc,CAAC,QAAA,EAAUZ,UAAAA,CAAAA;AACnD,QAAA;AAEA,QAAA,IAAI,CAACN,OAAAA,IAAW,CAACG,OAAOC,YAAY,CAACJ,QAAQ,EAAE;YAC7C,OAAOM,UAAAA;AACT,QAAA;QAEA,IAAIa,cAAAA,GAAiBL,iBAAAA,CAAkBG,GAAG,CAACjB,OAAAA,CAAAA;AAC3C,QAAA,IAAI,CAACmB,cAAAA,EAAgB;AACnBA,YAAAA,cAAAA,GAAiB7B,+BAAAA,CAAgCa,MAAAA,CAAOC,YAAY,CAACJ,QAAQ,EAAE;AAC7EnC,gBAAAA,UAAAA,EAAYsC,OAAOtC;AACrB,aAAA,CAAA;YACAiD,iBAAAA,CAAkBM,GAAG,CAACpB,OAAAA,EAASmB,cAAAA,CAAAA;AACjC,QAAA;QAEA,MAAME,aAAAA,GAA0B/C,UAAU,EAAE;AAE5C,QAAA,MAAMgD,eAAAA,GAA4B;AAC7B,YAAA,GAAA,IAAIC,IACLJ,cAAAA,CAAepB,MAAM,CAAC,CAACyB,EAAAA,GACrBH,cAAcvC,IAAI,CAAC,CAAC2C,EAAAA,GAAOD,EAAAA,KAAOC,MAAMD,EAAAA,CAAGxC,UAAU,CAAC,CAAA,EAAGyC,EAAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA;AAGnE,SAAA;;;;AAKD,QAAA,MAAMC,mBAAmB,CAAC3C,KAAAA,GACxB,CAACuC,eAAAA,CAAgBxC,IAAI,CACnB,CAAC6C,cAAAA,GACCA,cAAAA,KAAmB5C,SAAS4C,cAAAA,CAAe3C,UAAU,CAAC,CAAA,EAAGD,KAAAA,CAAM,CAAC,CAAC,CAAA,CAAA;;QAIvE,MAAM6C,SAAAA,GAAYN,eAAAA,CAAgBvB,MAAM,CAAC2B,gBAAAA,CAAAA;AAEzC,QAAA,OAAOnB,eAAAA,CAAiBsB,WAAW,CAAC,QAAA,EAAUD,SAAAA,EAAWtB,UAAAA,CAAAA;AAC3D,IAAA,CAAA,EAAG,EAAE,CAAA;AACP;;;;;;;"}
@@ -1,8 +1,7 @@
1
1
  import ___default from 'lodash';
2
- import { uniq, startsWith } from 'lodash/fp';
3
2
  import { contentTypes } from '@strapi/utils';
4
3
  import { getService } from '../utils/index.mjs';
5
- import actionDomain from '../domain/action/index.mjs';
4
+ import domain from '../domain/action/index.mjs';
6
5
  import permissionDomain from '../domain/permission/index.mjs';
7
6
 
8
7
  /**
@@ -18,7 +17,7 @@ import permissionDomain from '../domain/permission/index.mjs';
18
17
  if (nonAuthorizableFields.includes(key)) return fields;
19
18
  const fieldPath = prefix ? `${prefix}.${key}` : key;
20
19
  const shouldBeIncluded = !requiredOnly || attr.required === true;
21
- const insideExistingFields = existingFields && existingFields.some(startsWith(fieldPath));
20
+ const insideExistingFields = existingFields && existingFields.some((field)=>field.startsWith(fieldPath));
22
21
  if (attr.type === 'component') {
23
22
  if (shouldBeIncluded || insideExistingFields) {
24
23
  const compoFields = getNestedFields(components[attr.component], {
@@ -70,7 +69,7 @@ import permissionDomain from '../domain/permission/index.mjs';
70
69
  const validSubjects = action.subjects.filter((subject)=>!restrictedSubjects.includes(subject));
71
70
  // Create a Permission for each subject (content-type uid) within the action
72
71
  for (const subject of validSubjects){
73
- const fields = actionDomain.appliesToProperty('fields', action) ? getNestedFields(strapi.contentTypes[subject], {
72
+ const fields = domain.appliesToProperty('fields', action) ? getNestedFields(strapi.contentTypes[subject], {
74
73
  components: strapi.components,
75
74
  nestingLevel
76
75
  }) : undefined;
@@ -95,7 +94,7 @@ import permissionDomain from '../domain/permission/index.mjs';
95
94
  const { action: actionId, subject, properties: { fields } } = permission;
96
95
  const action = actionProvider.get(actionId);
97
96
  // todo see if it's possible to check property on action + subject (async)
98
- if (!actionDomain.appliesToProperty('fields', action)) {
97
+ if (!domain.appliesToProperty('fields', action)) {
99
98
  return permissionDomain.deleteProperty('fields', permission);
100
99
  }
101
100
  if (!subject || !strapi.contentTypes[subject]) {
@@ -109,11 +108,13 @@ import permissionDomain from '../domain/permission/index.mjs';
109
108
  nestedFieldsCache.set(subject, possibleFields);
110
109
  }
111
110
  const currentFields = fields || [];
112
- const validUserFields = uniq(possibleFields.filter((pf)=>currentFields.some((cf)=>pf === cf || startsWith(`${cf}.`, pf))));
111
+ const validUserFields = [
112
+ ...new Set(possibleFields.filter((pf)=>currentFields.some((cf)=>pf === cf || pf.startsWith(`${cf}.`))))
113
+ ];
113
114
  // A field is considered "not nested" if no other valid user field starts with this field's path followed by a dot.
114
115
  // This helps to remove redundant parent paths when a more specific child path is already included.
115
116
  // For example, if 'component.title' is present, 'component' would be filtered out by this condition.
116
- const isNotNestedField = (field)=>!validUserFields.some((validUserField)=>validUserField !== field && startsWith(`${field}.`, validUserField));
117
+ const isNotNestedField = (field)=>!validUserFields.some((validUserField)=>validUserField !== field && validUserField.startsWith(`${field}.`));
117
118
  // Filter out fields that are parent paths of other included fields.
118
119
  const newFields = validUserFields.filter(isNotNestedField);
119
120
  return permissionDomain.setProperty('fields', newFields, permission);
@@ -1 +1 @@
1
- {"version":3,"file":"content-type.mjs","sources":["../../../../../server/src/services/content-type.ts"],"sourcesContent":["import _ from 'lodash';\nimport { uniq, startsWith } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Modules, Struct } from '@strapi/types';\nimport { getService } from '../utils';\nimport actionDomain from '../domain/action';\nimport permissionDomain from '../domain/permission';\n\ninterface FieldOptions {\n prefix?: string; // prefix to add to the path\n nestingLevel?: number; // level of nesting to achieve\n requiredOnly?: boolean; // only returns required nestedFields\n existingFields?: string[]; // fields that are already selected, meaning that some sub-fields may be required\n restrictedSubjects?: string[]; // subjectsId to ignore\n components?: {\n // components where components attributes can be found\n [key: string]: any;\n };\n}\n\n/**\n * Creates an array of paths to the fields and nested fields, without path nodes\n */\nconst getNestedFields = (\n model: Struct.ContentTypeSchema,\n {\n prefix = '',\n nestingLevel = 15,\n components = {},\n requiredOnly = false,\n existingFields = [],\n }: FieldOptions\n): string[] => {\n if (nestingLevel === 0) {\n return prefix ? [prefix] : [];\n }\n\n const nonAuthorizableFields = contentTypesUtils.getNonVisibleAttributes(model);\n\n return _.reduce(\n model.attributes,\n (fields: any, attr: any, key: any) => {\n if (nonAuthorizableFields.includes(key)) return fields;\n\n const fieldPath = prefix ? `${prefix}.${key}` : key;\n const shouldBeIncluded = !requiredOnly || attr.required === true;\n const insideExistingFields = existingFields && existingFields.some(startsWith(fieldPath));\n\n if (attr.type === 'component') {\n if (shouldBeIncluded || insideExistingFields) {\n const compoFields = getNestedFields(components[attr.component], {\n nestingLevel: nestingLevel - 1,\n prefix: fieldPath,\n components,\n requiredOnly,\n existingFields,\n });\n\n if (compoFields.length === 0 && shouldBeIncluded) {\n return fields.concat(fieldPath);\n }\n\n return fields.concat(compoFields);\n }\n return fields;\n }\n\n if (shouldBeIncluded) {\n return fields.concat(fieldPath);\n }\n\n return fields;\n },\n []\n );\n};\n\n/**\n * Creates an array of paths to the fields and nested fields, with path nodes\n */\nconst getNestedFieldsWithIntermediate = (\n model: Struct.ContentTypeSchema,\n { prefix = '', nestingLevel = 15, components = {} }: FieldOptions\n): string[] => {\n if (nestingLevel === 0) {\n return [];\n }\n\n const nonAuthorizableFields = contentTypesUtils.getNonVisibleAttributes(model);\n\n return _.reduce(\n model.attributes,\n (fields: any, attr: any, key: any) => {\n if (nonAuthorizableFields.includes(key)) return fields;\n\n const fieldPath = prefix ? `${prefix}.${key}` : key;\n fields.push(fieldPath);\n\n if (attr.type === 'component') {\n const compoFields = getNestedFieldsWithIntermediate(components[attr.component], {\n nestingLevel: nestingLevel - 1,\n prefix: fieldPath,\n components,\n });\n\n fields.push(...compoFields);\n }\n\n return fields;\n },\n []\n );\n};\n\n/**\n * Creates an array of permissions with the \"properties.fields\" attribute filled\n */\nconst getPermissionsWithNestedFields = (\n actions: any[],\n { nestingLevel, restrictedSubjects = [] }: FieldOptions = {}\n): Modules.Permissions.PermissionRule[] => {\n return actions.reduce((permissions, action) => {\n const validSubjects = action.subjects.filter(\n (subject: any) => !restrictedSubjects.includes(subject)\n );\n\n // Create a Permission for each subject (content-type uid) within the action\n for (const subject of validSubjects) {\n const fields = actionDomain.appliesToProperty('fields', action)\n ? getNestedFields(strapi.contentTypes[subject], {\n components: strapi.components,\n nestingLevel,\n })\n : undefined;\n\n const permission = permissionDomain.create({\n action: action.actionId,\n subject,\n properties: { fields },\n });\n\n permissions.push(permission);\n }\n\n return permissions;\n }, []);\n};\n\n/**\n * Cleans permissions' fields (add required ones, remove the non-existing ones)\n */\nconst cleanPermissionFields = (\n permissions: Modules.Permissions.PermissionRule[]\n): Modules.Permissions.PermissionRule[] => {\n const { actionProvider } = getService('permission');\n const nestedFieldsCache = new Map<string, string[]>();\n\n return permissions.map((permission: any) => {\n const {\n action: actionId,\n subject,\n properties: { fields },\n } = permission;\n\n const action = actionProvider.get(actionId) as any;\n\n // todo see if it's possible to check property on action + subject (async)\n if (!actionDomain.appliesToProperty('fields', action)) {\n return permissionDomain.deleteProperty('fields', permission);\n }\n\n if (!subject || !strapi.contentTypes[subject]) {\n return permission;\n }\n\n let possibleFields = nestedFieldsCache.get(subject);\n if (!possibleFields) {\n possibleFields = getNestedFieldsWithIntermediate(strapi.contentTypes[subject], {\n components: strapi.components,\n });\n nestedFieldsCache.set(subject, possibleFields);\n }\n\n const currentFields: string[] = fields || [];\n\n const validUserFields: string[] = uniq(\n possibleFields.filter((pf) =>\n currentFields.some((cf) => pf === cf || startsWith(`${cf}.`, pf))\n )\n );\n\n // A field is considered \"not nested\" if no other valid user field starts with this field's path followed by a dot.\n // This helps to remove redundant parent paths when a more specific child path is already included.\n // For example, if 'component.title' is present, 'component' would be filtered out by this condition.\n const isNotNestedField = (field: string) =>\n !validUserFields.some(\n (validUserField: string) =>\n validUserField !== field && startsWith(`${field}.`, validUserField)\n );\n\n // Filter out fields that are parent paths of other included fields.\n const newFields = validUserFields.filter(isNotNestedField);\n\n return permissionDomain.setProperty('fields', newFields, permission);\n }, []);\n};\n\nexport {\n getNestedFields,\n getPermissionsWithNestedFields,\n cleanPermissionFields,\n getNestedFieldsWithIntermediate,\n};\n"],"names":["getNestedFields","model","prefix","nestingLevel","components","requiredOnly","existingFields","nonAuthorizableFields","contentTypesUtils","getNonVisibleAttributes","_","reduce","attributes","fields","attr","key","includes","fieldPath","shouldBeIncluded","required","insideExistingFields","some","startsWith","type","compoFields","component","length","concat","getNestedFieldsWithIntermediate","push","getPermissionsWithNestedFields","actions","restrictedSubjects","permissions","action","validSubjects","subjects","filter","subject","actionDomain","appliesToProperty","strapi","contentTypes","undefined","permission","permissionDomain","create","actionId","properties","cleanPermissionFields","actionProvider","getService","nestedFieldsCache","Map","map","get","deleteProperty","possibleFields","set","currentFields","validUserFields","uniq","pf","cf","isNotNestedField","field","validUserField","newFields","setProperty"],"mappings":"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"}
1
+ {"version":3,"file":"content-type.mjs","sources":["../../../../../server/src/services/content-type.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Modules, Struct } from '@strapi/types';\nimport { getService } from '../utils';\nimport actionDomain from '../domain/action';\nimport permissionDomain from '../domain/permission';\n\ninterface FieldOptions {\n prefix?: string; // prefix to add to the path\n nestingLevel?: number; // level of nesting to achieve\n requiredOnly?: boolean; // only returns required nestedFields\n existingFields?: string[]; // fields that are already selected, meaning that some sub-fields may be required\n restrictedSubjects?: string[]; // subjectsId to ignore\n components?: {\n // components where components attributes can be found\n [key: string]: any;\n };\n}\n\n/**\n * Creates an array of paths to the fields and nested fields, without path nodes\n */\nconst getNestedFields = (\n model: Struct.ContentTypeSchema,\n {\n prefix = '',\n nestingLevel = 15,\n components = {},\n requiredOnly = false,\n existingFields = [],\n }: FieldOptions\n): string[] => {\n if (nestingLevel === 0) {\n return prefix ? [prefix] : [];\n }\n\n const nonAuthorizableFields = contentTypesUtils.getNonVisibleAttributes(model);\n\n return _.reduce(\n model.attributes,\n (fields: any, attr: any, key: any) => {\n if (nonAuthorizableFields.includes(key)) return fields;\n\n const fieldPath = prefix ? `${prefix}.${key}` : key;\n const shouldBeIncluded = !requiredOnly || attr.required === true;\n const insideExistingFields =\n existingFields && existingFields.some((field) => field.startsWith(fieldPath));\n\n if (attr.type === 'component') {\n if (shouldBeIncluded || insideExistingFields) {\n const compoFields = getNestedFields(components[attr.component], {\n nestingLevel: nestingLevel - 1,\n prefix: fieldPath,\n components,\n requiredOnly,\n existingFields,\n });\n\n if (compoFields.length === 0 && shouldBeIncluded) {\n return fields.concat(fieldPath);\n }\n\n return fields.concat(compoFields);\n }\n return fields;\n }\n\n if (shouldBeIncluded) {\n return fields.concat(fieldPath);\n }\n\n return fields;\n },\n []\n );\n};\n\n/**\n * Creates an array of paths to the fields and nested fields, with path nodes\n */\nconst getNestedFieldsWithIntermediate = (\n model: Struct.ContentTypeSchema,\n { prefix = '', nestingLevel = 15, components = {} }: FieldOptions\n): string[] => {\n if (nestingLevel === 0) {\n return [];\n }\n\n const nonAuthorizableFields = contentTypesUtils.getNonVisibleAttributes(model);\n\n return _.reduce(\n model.attributes,\n (fields: any, attr: any, key: any) => {\n if (nonAuthorizableFields.includes(key)) return fields;\n\n const fieldPath = prefix ? `${prefix}.${key}` : key;\n fields.push(fieldPath);\n\n if (attr.type === 'component') {\n const compoFields = getNestedFieldsWithIntermediate(components[attr.component], {\n nestingLevel: nestingLevel - 1,\n prefix: fieldPath,\n components,\n });\n\n fields.push(...compoFields);\n }\n\n return fields;\n },\n []\n );\n};\n\n/**\n * Creates an array of permissions with the \"properties.fields\" attribute filled\n */\nconst getPermissionsWithNestedFields = (\n actions: any[],\n { nestingLevel, restrictedSubjects = [] }: FieldOptions = {}\n): Modules.Permissions.PermissionRule[] => {\n return actions.reduce((permissions, action) => {\n const validSubjects = action.subjects.filter(\n (subject: any) => !restrictedSubjects.includes(subject)\n );\n\n // Create a Permission for each subject (content-type uid) within the action\n for (const subject of validSubjects) {\n const fields = actionDomain.appliesToProperty('fields', action)\n ? getNestedFields(strapi.contentTypes[subject], {\n components: strapi.components,\n nestingLevel,\n })\n : undefined;\n\n const permission = permissionDomain.create({\n action: action.actionId,\n subject,\n properties: { fields },\n });\n\n permissions.push(permission);\n }\n\n return permissions;\n }, []);\n};\n\n/**\n * Cleans permissions' fields (add required ones, remove the non-existing ones)\n */\nconst cleanPermissionFields = (\n permissions: Modules.Permissions.PermissionRule[]\n): Modules.Permissions.PermissionRule[] => {\n const { actionProvider } = getService('permission');\n const nestedFieldsCache = new Map<string, string[]>();\n\n return permissions.map((permission: any) => {\n const {\n action: actionId,\n subject,\n properties: { fields },\n } = permission;\n\n const action = actionProvider.get(actionId) as any;\n\n // todo see if it's possible to check property on action + subject (async)\n if (!actionDomain.appliesToProperty('fields', action)) {\n return permissionDomain.deleteProperty('fields', permission);\n }\n\n if (!subject || !strapi.contentTypes[subject]) {\n return permission;\n }\n\n let possibleFields = nestedFieldsCache.get(subject);\n if (!possibleFields) {\n possibleFields = getNestedFieldsWithIntermediate(strapi.contentTypes[subject], {\n components: strapi.components,\n });\n nestedFieldsCache.set(subject, possibleFields);\n }\n\n const currentFields: string[] = fields || [];\n\n const validUserFields: string[] = [\n ...new Set(\n possibleFields.filter((pf) =>\n currentFields.some((cf) => pf === cf || pf.startsWith(`${cf}.`))\n )\n ),\n ];\n\n // A field is considered \"not nested\" if no other valid user field starts with this field's path followed by a dot.\n // This helps to remove redundant parent paths when a more specific child path is already included.\n // For example, if 'component.title' is present, 'component' would be filtered out by this condition.\n const isNotNestedField = (field: string) =>\n !validUserFields.some(\n (validUserField: string) =>\n validUserField !== field && validUserField.startsWith(`${field}.`)\n );\n\n // Filter out fields that are parent paths of other included fields.\n const newFields = validUserFields.filter(isNotNestedField);\n\n return permissionDomain.setProperty('fields', newFields, permission);\n }, []);\n};\n\nexport {\n getNestedFields,\n getPermissionsWithNestedFields,\n cleanPermissionFields,\n getNestedFieldsWithIntermediate,\n};\n"],"names":["getNestedFields","model","prefix","nestingLevel","components","requiredOnly","existingFields","nonAuthorizableFields","contentTypesUtils","getNonVisibleAttributes","_","reduce","attributes","fields","attr","key","includes","fieldPath","shouldBeIncluded","required","insideExistingFields","some","field","startsWith","type","compoFields","component","length","concat","getNestedFieldsWithIntermediate","push","getPermissionsWithNestedFields","actions","restrictedSubjects","permissions","action","validSubjects","subjects","filter","subject","actionDomain","appliesToProperty","strapi","contentTypes","undefined","permission","permissionDomain","create","actionId","properties","cleanPermissionFields","actionProvider","getService","nestedFieldsCache","Map","map","get","deleteProperty","possibleFields","set","currentFields","validUserFields","Set","pf","cf","isNotNestedField","validUserField","newFields","setProperty"],"mappings":"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"}
@@ -17,7 +17,8 @@ const homepageService = ({ strapi })=>{
17
17
  });
18
18
  const countApiTokens = await index.getService('api-token-admin').countAll();
19
19
  const countAdmins = await index.getService('user').count();
20
- const countLocales = await strapi.plugin('i18n')?.service('locales')?.count() ?? null;
20
+ // null tells the homepage no localization plugin is installed, unlike 0 locales
21
+ const countLocales = strapi.localization.isEnabled() === true ? (await strapi.localization.getLocales()).length : null;
21
22
  const countsAssets = await strapi.db.query('plugin::upload.file').count();
22
23
  const countWebhooks = await strapi.db.query('strapi::webhook').count();
23
24
  const componentCategories = new Set(Object.values(strapi.components).map((component)=>component.category));
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.js","sources":["../../../../../server/src/services/homepage.ts"],"sourcesContent":["import { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n HomepageLayout,\n HomepageLayoutSchema,\n HomepageLayoutWrite,\n HomepageLayoutWriteSchema,\n} from '../controllers/validation/schema';\n\nconst DEFAULT_WIDTH = 6 as const;\nconst keyFor = (userId: number) => `homepage-layout:${userId}`;\n\nconst isContentTypeVisible = (model: any) =>\n model?.pluginOptions?.['content-type-builder']?.visible !== false;\n\nexport const homepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const adminStore = strapi.store({ type: 'core', name: 'admin' });\n const getKeyStatistics = async () => {\n const contentTypes = Object.entries(strapi.contentTypes).filter(([, contentType]) => {\n return isContentTypeVisible(contentType);\n });\n\n const countApiTokens = await getService('api-token-admin').countAll();\n const countAdmins = await getService('user').count();\n const countLocales = (await strapi.plugin('i18n')?.service('locales')?.count()) ?? null;\n const countsAssets = await strapi.db.query('plugin::upload.file').count();\n const countWebhooks = await strapi.db.query('strapi::webhook').count();\n\n const componentCategories = new Set(\n Object.values(strapi.components).map((component) => component.category)\n );\n const components = Array.from(componentCategories);\n\n return {\n assets: countsAssets,\n contentTypes: contentTypes.length,\n components: components.length,\n locales: countLocales,\n admins: countAdmins,\n webhooks: countWebhooks,\n apiTokens: countApiTokens,\n };\n };\n\n const getHomepageLayout = async (userId: number): Promise<HomepageLayout | null> => {\n const key = keyFor(userId);\n const value = await adminStore.get({ key });\n if (!value) {\n // nothing saved yet\n return null;\n }\n\n return HomepageLayoutSchema.parse(value);\n };\n\n const updateHomepageLayout = async (userId: number, input: unknown): Promise<HomepageLayout> => {\n const write: HomepageLayoutWrite = HomepageLayoutWriteSchema.parse(input);\n\n const key = keyFor(userId);\n\n const currentRaw = await adminStore.get({ key });\n const current: HomepageLayout | null = currentRaw\n ? HomepageLayoutSchema.parse(currentRaw)\n : null;\n\n const widgetsNext = write.widgets ?? current?.widgets ?? [];\n\n // Normalize widths (fill defaults where missing)\n const normalizedWidgets = widgetsNext.map((w) => {\n const prev = current?.widgets.find((cw) => cw.uid === w.uid);\n return {\n uid: w.uid,\n width: w.width ?? prev?.width ?? DEFAULT_WIDTH,\n };\n });\n\n const next: HomepageLayout = {\n version: write.version ?? 1,\n widgets: normalizedWidgets,\n updatedAt: write.updatedAt ?? new Date().toISOString(),\n };\n\n await adminStore.set({ key, value: next });\n return next;\n };\n return {\n getKeyStatistics,\n getHomepageLayout,\n updateHomepageLayout,\n };\n};\n"],"names":["DEFAULT_WIDTH","keyFor","userId","isContentTypeVisible","model","pluginOptions","visible","homepageService","strapi","adminStore","store","type","name","getKeyStatistics","contentTypes","Object","entries","filter","contentType","countApiTokens","getService","countAll","countAdmins","count","countLocales","plugin","service","countsAssets","db","query","countWebhooks","componentCategories","Set","values","components","map","component","category","Array","from","assets","length","locales","admins","webhooks","apiTokens","getHomepageLayout","key","value","get","HomepageLayoutSchema","parse","updateHomepageLayout","input","write","HomepageLayoutWriteSchema","currentRaw","current","widgetsNext","widgets","normalizedWidgets","w","prev","find","cw","uid","width","next","version","updatedAt","Date","toISOString","set"],"mappings":";;;;;AASA,MAAMA,aAAAA,GAAgB,CAAA;AACtB,MAAMC,SAAS,CAACC,MAAAA,GAAmB,CAAC,gBAAgB,EAAEA,MAAAA,CAAAA,CAAQ;AAE9D,MAAMC,oBAAAA,GAAuB,CAACC,KAAAA,GAC5BA,KAAAA,EAAOC,gBAAgB,sBAAA,CAAuB,EAAEC,OAAAA,KAAY,KAAA;AAEvD,MAAMC,eAAAA,GAAkB,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjE,MAAMC,UAAAA,GAAaD,MAAAA,CAAOE,KAAK,CAAC;QAAEC,IAAAA,EAAM,MAAA;QAAQC,IAAAA,EAAM;AAAQ,KAAA,CAAA;AAC9D,IAAA,MAAMC,gBAAAA,GAAmB,UAAA;QACvB,MAAMC,YAAAA,GAAeC,MAAAA,CAAOC,OAAO,CAACR,MAAAA,CAAOM,YAAY,CAAA,CAAEG,MAAM,CAAC,CAAC,GAAGC,WAAAA,CAAY,GAAA;AAC9E,YAAA,OAAOf,oBAAAA,CAAqBe,WAAAA,CAAAA;AAC9B,QAAA,CAAA,CAAA;AAEA,QAAA,MAAMC,cAAAA,GAAiB,MAAMC,gBAAAA,CAAW,iBAAA,CAAA,CAAmBC,QAAQ,EAAA;AACnE,QAAA,MAAMC,WAAAA,GAAc,MAAMF,gBAAAA,CAAW,MAAA,CAAA,CAAQG,KAAK,EAAA;QAClD,MAAMC,YAAAA,GAAe,MAAOhB,MAAAA,CAAOiB,MAAM,CAAC,MAAA,CAAA,EAASC,OAAAA,CAAQ,SAAA,CAAA,EAAYH,KAAAA,EAAAA,IAAY,IAAA;QACnF,MAAMI,YAAAA,GAAe,MAAMnB,MAAAA,CAAOoB,EAAE,CAACC,KAAK,CAAC,uBAAuBN,KAAK,EAAA;QACvE,MAAMO,aAAAA,GAAgB,MAAMtB,MAAAA,CAAOoB,EAAE,CAACC,KAAK,CAAC,mBAAmBN,KAAK,EAAA;AAEpE,QAAA,MAAMQ,mBAAAA,GAAsB,IAAIC,GAAAA,CAC9BjB,MAAAA,CAAOkB,MAAM,CAACzB,MAAAA,CAAO0B,UAAU,CAAA,CAAEC,GAAG,CAAC,CAACC,SAAAA,GAAcA,UAAUC,QAAQ,CAAA,CAAA;QAExE,MAAMH,UAAAA,GAAaI,KAAAA,CAAMC,IAAI,CAACR,mBAAAA,CAAAA;QAE9B,OAAO;YACLS,MAAAA,EAAQb,YAAAA;AACRb,YAAAA,YAAAA,EAAcA,aAAa2B,MAAM;AACjCP,YAAAA,UAAAA,EAAYA,WAAWO,MAAM;YAC7BC,OAAAA,EAASlB,YAAAA;YACTmB,MAAAA,EAAQrB,WAAAA;YACRsB,QAAAA,EAAUd,aAAAA;YACVe,SAAAA,EAAW1B;AACb,SAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM2B,oBAAoB,OAAO5C,MAAAA,GAAAA;AAC/B,QAAA,MAAM6C,MAAM9C,MAAAA,CAAOC,MAAAA,CAAAA;AACnB,QAAA,MAAM8C,KAAAA,GAAQ,MAAMvC,UAAAA,CAAWwC,GAAG,CAAC;AAAEF,YAAAA;AAAI,SAAA,CAAA;AACzC,QAAA,IAAI,CAACC,KAAAA,EAAO;;YAEV,OAAO,IAAA;AACT,QAAA;QAEA,OAAOE,2BAAAA,CAAqBC,KAAK,CAACH,KAAAA,CAAAA;AACpC,IAAA,CAAA;IAEA,MAAMI,oBAAAA,GAAuB,OAAOlD,MAAAA,EAAgBmD,KAAAA,GAAAA;QAClD,MAAMC,KAAAA,GAA6BC,gCAAAA,CAA0BJ,KAAK,CAACE,KAAAA,CAAAA;AAEnE,QAAA,MAAMN,MAAM9C,MAAAA,CAAOC,MAAAA,CAAAA;AAEnB,QAAA,MAAMsD,UAAAA,GAAa,MAAM/C,UAAAA,CAAWwC,GAAG,CAAC;AAAEF,YAAAA;AAAI,SAAA,CAAA;AAC9C,QAAA,MAAMU,OAAAA,GAAiCD,UAAAA,GACnCN,2BAAAA,CAAqBC,KAAK,CAACK,UAAAA,CAAAA,GAC3B,IAAA;AAEJ,QAAA,MAAME,cAAcJ,KAAAA,CAAMK,OAAO,IAAIF,OAAAA,EAASE,WAAW,EAAE;;AAG3D,QAAA,MAAMC,iBAAAA,GAAoBF,WAAAA,CAAYvB,GAAG,CAAC,CAAC0B,CAAAA,GAAAA;YACzC,MAAMC,IAAAA,GAAOL,OAAAA,EAASE,OAAAA,CAAQI,IAAAA,CAAK,CAACC,KAAOA,EAAAA,CAAGC,GAAG,KAAKJ,CAAAA,CAAEI,GAAG,CAAA;YAC3D,OAAO;AACLA,gBAAAA,GAAAA,EAAKJ,EAAEI,GAAG;AACVC,gBAAAA,KAAAA,EAAOL,CAAAA,CAAEK,KAAK,IAAIJ,IAAAA,EAAMI,KAAAA,IAASlE;AACnC,aAAA;AACF,QAAA,CAAA,CAAA;AAEA,QAAA,MAAMmE,IAAAA,GAAuB;YAC3BC,OAAAA,EAASd,KAAAA,CAAMc,OAAO,IAAI,CAAA;YAC1BT,OAAAA,EAASC,iBAAAA;AACTS,YAAAA,SAAAA,EAAWf,KAAAA,CAAMe,SAAS,IAAI,IAAIC,OAAOC,WAAW;AACtD,SAAA;QAEA,MAAM9D,UAAAA,CAAW+D,GAAG,CAAC;AAAEzB,YAAAA,GAAAA;YAAKC,KAAAA,EAAOmB;AAAK,SAAA,CAAA;QACxC,OAAOA,IAAAA;AACT,IAAA,CAAA;IACA,OAAO;AACLtD,QAAAA,gBAAAA;AACAiC,QAAAA,iBAAAA;AACAM,QAAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"homepage.js","sources":["../../../../../server/src/services/homepage.ts"],"sourcesContent":["import { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n HomepageLayout,\n HomepageLayoutSchema,\n HomepageLayoutWrite,\n HomepageLayoutWriteSchema,\n} from '../controllers/validation/schema';\n\nconst DEFAULT_WIDTH = 6 as const;\nconst keyFor = (userId: number) => `homepage-layout:${userId}`;\n\nconst isContentTypeVisible = (model: any) =>\n model?.pluginOptions?.['content-type-builder']?.visible !== false;\n\nexport const homepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const adminStore = strapi.store({ type: 'core', name: 'admin' });\n const getKeyStatistics = async () => {\n const contentTypes = Object.entries(strapi.contentTypes).filter(([, contentType]) => {\n return isContentTypeVisible(contentType);\n });\n\n const countApiTokens = await getService('api-token-admin').countAll();\n const countAdmins = await getService('user').count();\n // null tells the homepage no localization plugin is installed, unlike 0 locales\n const countLocales =\n strapi.localization.isEnabled() === true\n ? (await strapi.localization.getLocales()).length\n : null;\n const countsAssets = await strapi.db.query('plugin::upload.file').count();\n const countWebhooks = await strapi.db.query('strapi::webhook').count();\n\n const componentCategories = new Set(\n Object.values(strapi.components).map((component) => component.category)\n );\n const components = Array.from(componentCategories);\n\n return {\n assets: countsAssets,\n contentTypes: contentTypes.length,\n components: components.length,\n locales: countLocales,\n admins: countAdmins,\n webhooks: countWebhooks,\n apiTokens: countApiTokens,\n };\n };\n\n const getHomepageLayout = async (userId: number): Promise<HomepageLayout | null> => {\n const key = keyFor(userId);\n const value = await adminStore.get({ key });\n if (!value) {\n // nothing saved yet\n return null;\n }\n\n return HomepageLayoutSchema.parse(value);\n };\n\n const updateHomepageLayout = async (userId: number, input: unknown): Promise<HomepageLayout> => {\n const write: HomepageLayoutWrite = HomepageLayoutWriteSchema.parse(input);\n\n const key = keyFor(userId);\n\n const currentRaw = await adminStore.get({ key });\n const current: HomepageLayout | null = currentRaw\n ? HomepageLayoutSchema.parse(currentRaw)\n : null;\n\n const widgetsNext = write.widgets ?? current?.widgets ?? [];\n\n // Normalize widths (fill defaults where missing)\n const normalizedWidgets = widgetsNext.map((w) => {\n const prev = current?.widgets.find((cw) => cw.uid === w.uid);\n return {\n uid: w.uid,\n width: w.width ?? prev?.width ?? DEFAULT_WIDTH,\n };\n });\n\n const next: HomepageLayout = {\n version: write.version ?? 1,\n widgets: normalizedWidgets,\n updatedAt: write.updatedAt ?? new Date().toISOString(),\n };\n\n await adminStore.set({ key, value: next });\n return next;\n };\n return {\n getKeyStatistics,\n getHomepageLayout,\n updateHomepageLayout,\n };\n};\n"],"names":["DEFAULT_WIDTH","keyFor","userId","isContentTypeVisible","model","pluginOptions","visible","homepageService","strapi","adminStore","store","type","name","getKeyStatistics","contentTypes","Object","entries","filter","contentType","countApiTokens","getService","countAll","countAdmins","count","countLocales","localization","isEnabled","getLocales","length","countsAssets","db","query","countWebhooks","componentCategories","Set","values","components","map","component","category","Array","from","assets","locales","admins","webhooks","apiTokens","getHomepageLayout","key","value","get","HomepageLayoutSchema","parse","updateHomepageLayout","input","write","HomepageLayoutWriteSchema","currentRaw","current","widgetsNext","widgets","normalizedWidgets","w","prev","find","cw","uid","width","next","version","updatedAt","Date","toISOString","set"],"mappings":";;;;;AASA,MAAMA,aAAAA,GAAgB,CAAA;AACtB,MAAMC,SAAS,CAACC,MAAAA,GAAmB,CAAC,gBAAgB,EAAEA,MAAAA,CAAAA,CAAQ;AAE9D,MAAMC,oBAAAA,GAAuB,CAACC,KAAAA,GAC5BA,KAAAA,EAAOC,gBAAgB,sBAAA,CAAuB,EAAEC,OAAAA,KAAY,KAAA;AAEvD,MAAMC,eAAAA,GAAkB,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjE,MAAMC,UAAAA,GAAaD,MAAAA,CAAOE,KAAK,CAAC;QAAEC,IAAAA,EAAM,MAAA;QAAQC,IAAAA,EAAM;AAAQ,KAAA,CAAA;AAC9D,IAAA,MAAMC,gBAAAA,GAAmB,UAAA;QACvB,MAAMC,YAAAA,GAAeC,MAAAA,CAAOC,OAAO,CAACR,MAAAA,CAAOM,YAAY,CAAA,CAAEG,MAAM,CAAC,CAAC,GAAGC,WAAAA,CAAY,GAAA;AAC9E,YAAA,OAAOf,oBAAAA,CAAqBe,WAAAA,CAAAA;AAC9B,QAAA,CAAA,CAAA;AAEA,QAAA,MAAMC,cAAAA,GAAiB,MAAMC,gBAAAA,CAAW,iBAAA,CAAA,CAAmBC,QAAQ,EAAA;AACnE,QAAA,MAAMC,WAAAA,GAAc,MAAMF,gBAAAA,CAAW,MAAA,CAAA,CAAQG,KAAK,EAAA;;AAElD,QAAA,MAAMC,eACJhB,MAAAA,CAAOiB,YAAY,CAACC,SAAS,OAAO,IAAA,GAC/B,CAAA,MAAMlB,OAAOiB,YAAY,CAACE,UAAU,EAAC,EAAGC,MAAM,GAC/C,IAAA;QACN,MAAMC,YAAAA,GAAe,MAAMrB,MAAAA,CAAOsB,EAAE,CAACC,KAAK,CAAC,uBAAuBR,KAAK,EAAA;QACvE,MAAMS,aAAAA,GAAgB,MAAMxB,MAAAA,CAAOsB,EAAE,CAACC,KAAK,CAAC,mBAAmBR,KAAK,EAAA;AAEpE,QAAA,MAAMU,mBAAAA,GAAsB,IAAIC,GAAAA,CAC9BnB,MAAAA,CAAOoB,MAAM,CAAC3B,MAAAA,CAAO4B,UAAU,CAAA,CAAEC,GAAG,CAAC,CAACC,SAAAA,GAAcA,UAAUC,QAAQ,CAAA,CAAA;QAExE,MAAMH,UAAAA,GAAaI,KAAAA,CAAMC,IAAI,CAACR,mBAAAA,CAAAA;QAE9B,OAAO;YACLS,MAAAA,EAAQb,YAAAA;AACRf,YAAAA,YAAAA,EAAcA,aAAac,MAAM;AACjCQ,YAAAA,UAAAA,EAAYA,WAAWR,MAAM;YAC7Be,OAAAA,EAASnB,YAAAA;YACToB,MAAAA,EAAQtB,WAAAA;YACRuB,QAAAA,EAAUb,aAAAA;YACVc,SAAAA,EAAW3B;AACb,SAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM4B,oBAAoB,OAAO7C,MAAAA,GAAAA;AAC/B,QAAA,MAAM8C,MAAM/C,MAAAA,CAAOC,MAAAA,CAAAA;AACnB,QAAA,MAAM+C,KAAAA,GAAQ,MAAMxC,UAAAA,CAAWyC,GAAG,CAAC;AAAEF,YAAAA;AAAI,SAAA,CAAA;AACzC,QAAA,IAAI,CAACC,KAAAA,EAAO;;YAEV,OAAO,IAAA;AACT,QAAA;QAEA,OAAOE,2BAAAA,CAAqBC,KAAK,CAACH,KAAAA,CAAAA;AACpC,IAAA,CAAA;IAEA,MAAMI,oBAAAA,GAAuB,OAAOnD,MAAAA,EAAgBoD,KAAAA,GAAAA;QAClD,MAAMC,KAAAA,GAA6BC,gCAAAA,CAA0BJ,KAAK,CAACE,KAAAA,CAAAA;AAEnE,QAAA,MAAMN,MAAM/C,MAAAA,CAAOC,MAAAA,CAAAA;AAEnB,QAAA,MAAMuD,UAAAA,GAAa,MAAMhD,UAAAA,CAAWyC,GAAG,CAAC;AAAEF,YAAAA;AAAI,SAAA,CAAA;AAC9C,QAAA,MAAMU,OAAAA,GAAiCD,UAAAA,GACnCN,2BAAAA,CAAqBC,KAAK,CAACK,UAAAA,CAAAA,GAC3B,IAAA;AAEJ,QAAA,MAAME,cAAcJ,KAAAA,CAAMK,OAAO,IAAIF,OAAAA,EAASE,WAAW,EAAE;;AAG3D,QAAA,MAAMC,iBAAAA,GAAoBF,WAAAA,CAAYtB,GAAG,CAAC,CAACyB,CAAAA,GAAAA;YACzC,MAAMC,IAAAA,GAAOL,OAAAA,EAASE,OAAAA,CAAQI,IAAAA,CAAK,CAACC,KAAOA,EAAAA,CAAGC,GAAG,KAAKJ,CAAAA,CAAEI,GAAG,CAAA;YAC3D,OAAO;AACLA,gBAAAA,GAAAA,EAAKJ,EAAEI,GAAG;AACVC,gBAAAA,KAAAA,EAAOL,CAAAA,CAAEK,KAAK,IAAIJ,IAAAA,EAAMI,KAAAA,IAASnE;AACnC,aAAA;AACF,QAAA,CAAA,CAAA;AAEA,QAAA,MAAMoE,IAAAA,GAAuB;YAC3BC,OAAAA,EAASd,KAAAA,CAAMc,OAAO,IAAI,CAAA;YAC1BT,OAAAA,EAASC,iBAAAA;AACTS,YAAAA,SAAAA,EAAWf,KAAAA,CAAMe,SAAS,IAAI,IAAIC,OAAOC,WAAW;AACtD,SAAA;QAEA,MAAM/D,UAAAA,CAAWgE,GAAG,CAAC;AAAEzB,YAAAA,GAAAA;YAAKC,KAAAA,EAAOmB;AAAK,SAAA,CAAA;QACxC,OAAOA,IAAAA;AACT,IAAA,CAAA;IACA,OAAO;AACLvD,QAAAA,gBAAAA;AACAkC,QAAAA,iBAAAA;AACAM,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -15,7 +15,8 @@ const homepageService = ({ strapi })=>{
15
15
  });
16
16
  const countApiTokens = await getService('api-token-admin').countAll();
17
17
  const countAdmins = await getService('user').count();
18
- const countLocales = await strapi.plugin('i18n')?.service('locales')?.count() ?? null;
18
+ // null tells the homepage no localization plugin is installed, unlike 0 locales
19
+ const countLocales = strapi.localization.isEnabled() === true ? (await strapi.localization.getLocales()).length : null;
19
20
  const countsAssets = await strapi.db.query('plugin::upload.file').count();
20
21
  const countWebhooks = await strapi.db.query('strapi::webhook').count();
21
22
  const componentCategories = new Set(Object.values(strapi.components).map((component)=>component.category));
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.mjs","sources":["../../../../../server/src/services/homepage.ts"],"sourcesContent":["import { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n HomepageLayout,\n HomepageLayoutSchema,\n HomepageLayoutWrite,\n HomepageLayoutWriteSchema,\n} from '../controllers/validation/schema';\n\nconst DEFAULT_WIDTH = 6 as const;\nconst keyFor = (userId: number) => `homepage-layout:${userId}`;\n\nconst isContentTypeVisible = (model: any) =>\n model?.pluginOptions?.['content-type-builder']?.visible !== false;\n\nexport const homepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const adminStore = strapi.store({ type: 'core', name: 'admin' });\n const getKeyStatistics = async () => {\n const contentTypes = Object.entries(strapi.contentTypes).filter(([, contentType]) => {\n return isContentTypeVisible(contentType);\n });\n\n const countApiTokens = await getService('api-token-admin').countAll();\n const countAdmins = await getService('user').count();\n const countLocales = (await strapi.plugin('i18n')?.service('locales')?.count()) ?? null;\n const countsAssets = await strapi.db.query('plugin::upload.file').count();\n const countWebhooks = await strapi.db.query('strapi::webhook').count();\n\n const componentCategories = new Set(\n Object.values(strapi.components).map((component) => component.category)\n );\n const components = Array.from(componentCategories);\n\n return {\n assets: countsAssets,\n contentTypes: contentTypes.length,\n components: components.length,\n locales: countLocales,\n admins: countAdmins,\n webhooks: countWebhooks,\n apiTokens: countApiTokens,\n };\n };\n\n const getHomepageLayout = async (userId: number): Promise<HomepageLayout | null> => {\n const key = keyFor(userId);\n const value = await adminStore.get({ key });\n if (!value) {\n // nothing saved yet\n return null;\n }\n\n return HomepageLayoutSchema.parse(value);\n };\n\n const updateHomepageLayout = async (userId: number, input: unknown): Promise<HomepageLayout> => {\n const write: HomepageLayoutWrite = HomepageLayoutWriteSchema.parse(input);\n\n const key = keyFor(userId);\n\n const currentRaw = await adminStore.get({ key });\n const current: HomepageLayout | null = currentRaw\n ? HomepageLayoutSchema.parse(currentRaw)\n : null;\n\n const widgetsNext = write.widgets ?? current?.widgets ?? [];\n\n // Normalize widths (fill defaults where missing)\n const normalizedWidgets = widgetsNext.map((w) => {\n const prev = current?.widgets.find((cw) => cw.uid === w.uid);\n return {\n uid: w.uid,\n width: w.width ?? prev?.width ?? DEFAULT_WIDTH,\n };\n });\n\n const next: HomepageLayout = {\n version: write.version ?? 1,\n widgets: normalizedWidgets,\n updatedAt: write.updatedAt ?? new Date().toISOString(),\n };\n\n await adminStore.set({ key, value: next });\n return next;\n };\n return {\n getKeyStatistics,\n getHomepageLayout,\n updateHomepageLayout,\n };\n};\n"],"names":["DEFAULT_WIDTH","keyFor","userId","isContentTypeVisible","model","pluginOptions","visible","homepageService","strapi","adminStore","store","type","name","getKeyStatistics","contentTypes","Object","entries","filter","contentType","countApiTokens","getService","countAll","countAdmins","count","countLocales","plugin","service","countsAssets","db","query","countWebhooks","componentCategories","Set","values","components","map","component","category","Array","from","assets","length","locales","admins","webhooks","apiTokens","getHomepageLayout","key","value","get","HomepageLayoutSchema","parse","updateHomepageLayout","input","write","HomepageLayoutWriteSchema","currentRaw","current","widgetsNext","widgets","normalizedWidgets","w","prev","find","cw","uid","width","next","version","updatedAt","Date","toISOString","set"],"mappings":"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"}
1
+ {"version":3,"file":"homepage.mjs","sources":["../../../../../server/src/services/homepage.ts"],"sourcesContent":["import { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n HomepageLayout,\n HomepageLayoutSchema,\n HomepageLayoutWrite,\n HomepageLayoutWriteSchema,\n} from '../controllers/validation/schema';\n\nconst DEFAULT_WIDTH = 6 as const;\nconst keyFor = (userId: number) => `homepage-layout:${userId}`;\n\nconst isContentTypeVisible = (model: any) =>\n model?.pluginOptions?.['content-type-builder']?.visible !== false;\n\nexport const homepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const adminStore = strapi.store({ type: 'core', name: 'admin' });\n const getKeyStatistics = async () => {\n const contentTypes = Object.entries(strapi.contentTypes).filter(([, contentType]) => {\n return isContentTypeVisible(contentType);\n });\n\n const countApiTokens = await getService('api-token-admin').countAll();\n const countAdmins = await getService('user').count();\n // null tells the homepage no localization plugin is installed, unlike 0 locales\n const countLocales =\n strapi.localization.isEnabled() === true\n ? (await strapi.localization.getLocales()).length\n : null;\n const countsAssets = await strapi.db.query('plugin::upload.file').count();\n const countWebhooks = await strapi.db.query('strapi::webhook').count();\n\n const componentCategories = new Set(\n Object.values(strapi.components).map((component) => component.category)\n );\n const components = Array.from(componentCategories);\n\n return {\n assets: countsAssets,\n contentTypes: contentTypes.length,\n components: components.length,\n locales: countLocales,\n admins: countAdmins,\n webhooks: countWebhooks,\n apiTokens: countApiTokens,\n };\n };\n\n const getHomepageLayout = async (userId: number): Promise<HomepageLayout | null> => {\n const key = keyFor(userId);\n const value = await adminStore.get({ key });\n if (!value) {\n // nothing saved yet\n return null;\n }\n\n return HomepageLayoutSchema.parse(value);\n };\n\n const updateHomepageLayout = async (userId: number, input: unknown): Promise<HomepageLayout> => {\n const write: HomepageLayoutWrite = HomepageLayoutWriteSchema.parse(input);\n\n const key = keyFor(userId);\n\n const currentRaw = await adminStore.get({ key });\n const current: HomepageLayout | null = currentRaw\n ? HomepageLayoutSchema.parse(currentRaw)\n : null;\n\n const widgetsNext = write.widgets ?? current?.widgets ?? [];\n\n // Normalize widths (fill defaults where missing)\n const normalizedWidgets = widgetsNext.map((w) => {\n const prev = current?.widgets.find((cw) => cw.uid === w.uid);\n return {\n uid: w.uid,\n width: w.width ?? prev?.width ?? DEFAULT_WIDTH,\n };\n });\n\n const next: HomepageLayout = {\n version: write.version ?? 1,\n widgets: normalizedWidgets,\n updatedAt: write.updatedAt ?? new Date().toISOString(),\n };\n\n await adminStore.set({ key, value: next });\n return next;\n };\n return {\n getKeyStatistics,\n getHomepageLayout,\n updateHomepageLayout,\n };\n};\n"],"names":["DEFAULT_WIDTH","keyFor","userId","isContentTypeVisible","model","pluginOptions","visible","homepageService","strapi","adminStore","store","type","name","getKeyStatistics","contentTypes","Object","entries","filter","contentType","countApiTokens","getService","countAll","countAdmins","count","countLocales","localization","isEnabled","getLocales","length","countsAssets","db","query","countWebhooks","componentCategories","Set","values","components","map","component","category","Array","from","assets","locales","admins","webhooks","apiTokens","getHomepageLayout","key","value","get","HomepageLayoutSchema","parse","updateHomepageLayout","input","write","HomepageLayoutWriteSchema","currentRaw","current","widgetsNext","widgets","normalizedWidgets","w","prev","find","cw","uid","width","next","version","updatedAt","Date","toISOString","set"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var passportLocal = require('passport-local');
5
5
  var index = require('../../utils/index.js');
6
6
 
@@ -11,7 +11,7 @@ const createLocalStrategy = (strapi, middleware)=>{
11
11
  session: false
12
12
  }, (email, password, done)=>{
13
13
  return index.getService('auth').checkCredentials({
14
- email: fp.toLower(email),
14
+ email: _.toLower(email),
15
15
  password
16
16
  }).then(async ([error, user, message])=>{
17
17
  if (middleware) {
@@ -1 +1 @@
1
- {"version":3,"file":"local-strategy.js","sources":["../../../../../../server/src/services/passport/local-strategy.ts"],"sourcesContent":["import { toLower } from 'lodash/fp';\nimport { Strategy as LocalStrategy } from 'passport-local';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst createLocalStrategy = (strapi: Core.Strapi, middleware?: any) => {\n return new LocalStrategy(\n {\n usernameField: 'email',\n passwordField: 'password',\n session: false,\n },\n (email: string, password: string, done: any) => {\n return getService('auth')\n .checkCredentials({ email: toLower(email), password })\n .then(async ([error, user, message]) => {\n if (middleware) {\n return middleware([error, user, message], done);\n }\n\n return done(error, user, message);\n })\n .catch((error) => done(error));\n }\n );\n};\n\nexport default createLocalStrategy;\n"],"names":["createLocalStrategy","strapi","middleware","LocalStrategy","usernameField","passwordField","session","email","password","done","getService","checkCredentials","toLower","then","error","user","message","catch"],"mappings":";;;;;;AAKA,MAAMA,mBAAAA,GAAsB,CAACC,MAAAA,EAAqBC,UAAAA,GAAAA;AAChD,IAAA,OAAO,IAAIC,sBAAAA,CACT;QACEC,aAAAA,EAAe,OAAA;QACfC,aAAAA,EAAe,UAAA;QACfC,OAAAA,EAAS;KACX,EACA,CAACC,OAAeC,QAAAA,EAAkBC,IAAAA,GAAAA;QAChC,OAAOC,gBAAAA,CAAW,MAAA,CAAA,CACfC,gBAAgB,CAAC;AAAEJ,YAAAA,KAAAA,EAAOK,UAAAA,CAAQL,KAAAA,CAAAA;AAAQC,YAAAA;AAAS,SAAA,CAAA,CACnDK,IAAI,CAAC,OAAO,CAACC,KAAAA,EAAOC,MAAMC,OAAAA,CAAQ,GAAA;AACjC,YAAA,IAAId,UAAAA,EAAY;AACd,gBAAA,OAAOA,UAAAA,CAAW;AAACY,oBAAAA,KAAAA;AAAOC,oBAAAA,IAAAA;AAAMC,oBAAAA;iBAAQ,EAAEP,IAAAA,CAAAA;AAC5C,YAAA;YAEA,OAAOA,IAAAA,CAAKK,OAAOC,IAAAA,EAAMC,OAAAA,CAAAA;AAC3B,QAAA,CAAA,CAAA,CACCC,KAAK,CAAC,CAACH,KAAAA,GAAUL,IAAAA,CAAKK,KAAAA,CAAAA,CAAAA;AAC3B,IAAA,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"local-strategy.js","sources":["../../../../../../server/src/services/passport/local-strategy.ts"],"sourcesContent":["import { toLower } from 'lodash';\n\nimport { Strategy as LocalStrategy } from 'passport-local';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst createLocalStrategy = (strapi: Core.Strapi, middleware?: any) => {\n return new LocalStrategy(\n {\n usernameField: 'email',\n passwordField: 'password',\n session: false,\n },\n (email: string, password: string, done: any) => {\n return getService('auth')\n .checkCredentials({ email: toLower(email), password })\n .then(async ([error, user, message]) => {\n if (middleware) {\n return middleware([error, user, message], done);\n }\n\n return done(error, user, message);\n })\n .catch((error) => done(error));\n }\n );\n};\n\nexport default createLocalStrategy;\n"],"names":["createLocalStrategy","strapi","middleware","LocalStrategy","usernameField","passwordField","session","email","password","done","getService","checkCredentials","toLower","then","error","user","message","catch"],"mappings":";;;;;;AAMA,MAAMA,mBAAAA,GAAsB,CAACC,MAAAA,EAAqBC,UAAAA,GAAAA;AAChD,IAAA,OAAO,IAAIC,sBAAAA,CACT;QACEC,aAAAA,EAAe,OAAA;QACfC,aAAAA,EAAe,UAAA;QACfC,OAAAA,EAAS;KACX,EACA,CAACC,OAAeC,QAAAA,EAAkBC,IAAAA,GAAAA;QAChC,OAAOC,gBAAAA,CAAW,MAAA,CAAA,CACfC,gBAAgB,CAAC;AAAEJ,YAAAA,KAAAA,EAAOK,SAAAA,CAAQL,KAAAA,CAAAA;AAAQC,YAAAA;AAAS,SAAA,CAAA,CACnDK,IAAI,CAAC,OAAO,CAACC,KAAAA,EAAOC,MAAMC,OAAAA,CAAQ,GAAA;AACjC,YAAA,IAAId,UAAAA,EAAY;AACd,gBAAA,OAAOA,UAAAA,CAAW;AAACY,oBAAAA,KAAAA;AAAOC,oBAAAA,IAAAA;AAAMC,oBAAAA;iBAAQ,EAAEP,IAAAA,CAAAA;AAC5C,YAAA;YAEA,OAAOA,IAAAA,CAAKK,OAAOC,IAAAA,EAAMC,OAAAA,CAAAA;AAC3B,QAAA,CAAA,CAAA,CACCC,KAAK,CAAC,CAACH,KAAAA,GAAUL,IAAAA,CAAKK,KAAAA,CAAAA,CAAAA;AAC3B,IAAA,CAAA,CAAA;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- import { toLower } from 'lodash/fp';
1
+ import { toLower } from 'lodash';
2
2
  import { Strategy } from 'passport-local';
3
3
  import { getService } from '../../utils/index.mjs';
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"local-strategy.mjs","sources":["../../../../../../server/src/services/passport/local-strategy.ts"],"sourcesContent":["import { toLower } from 'lodash/fp';\nimport { Strategy as LocalStrategy } from 'passport-local';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst createLocalStrategy = (strapi: Core.Strapi, middleware?: any) => {\n return new LocalStrategy(\n {\n usernameField: 'email',\n passwordField: 'password',\n session: false,\n },\n (email: string, password: string, done: any) => {\n return getService('auth')\n .checkCredentials({ email: toLower(email), password })\n .then(async ([error, user, message]) => {\n if (middleware) {\n return middleware([error, user, message], done);\n }\n\n return done(error, user, message);\n })\n .catch((error) => done(error));\n }\n );\n};\n\nexport default createLocalStrategy;\n"],"names":["createLocalStrategy","strapi","middleware","LocalStrategy","usernameField","passwordField","session","email","password","done","getService","checkCredentials","toLower","then","error","user","message","catch"],"mappings":";;;;AAKA,MAAMA,mBAAAA,GAAsB,CAACC,MAAAA,EAAqBC,UAAAA,GAAAA;AAChD,IAAA,OAAO,IAAIC,QAAAA,CACT;QACEC,aAAAA,EAAe,OAAA;QACfC,aAAAA,EAAe,UAAA;QACfC,OAAAA,EAAS;KACX,EACA,CAACC,OAAeC,QAAAA,EAAkBC,IAAAA,GAAAA;QAChC,OAAOC,UAAAA,CAAW,MAAA,CAAA,CACfC,gBAAgB,CAAC;AAAEJ,YAAAA,KAAAA,EAAOK,OAAAA,CAAQL,KAAAA,CAAAA;AAAQC,YAAAA;AAAS,SAAA,CAAA,CACnDK,IAAI,CAAC,OAAO,CAACC,KAAAA,EAAOC,MAAMC,OAAAA,CAAQ,GAAA;AACjC,YAAA,IAAId,UAAAA,EAAY;AACd,gBAAA,OAAOA,UAAAA,CAAW;AAACY,oBAAAA,KAAAA;AAAOC,oBAAAA,IAAAA;AAAMC,oBAAAA;iBAAQ,EAAEP,IAAAA,CAAAA;AAC5C,YAAA;YAEA,OAAOA,IAAAA,CAAKK,OAAOC,IAAAA,EAAMC,OAAAA,CAAAA;AAC3B,QAAA,CAAA,CAAA,CACCC,KAAK,CAAC,CAACH,KAAAA,GAAUL,IAAAA,CAAKK,KAAAA,CAAAA,CAAAA;AAC3B,IAAA,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"local-strategy.mjs","sources":["../../../../../../server/src/services/passport/local-strategy.ts"],"sourcesContent":["import { toLower } from 'lodash';\n\nimport { Strategy as LocalStrategy } from 'passport-local';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst createLocalStrategy = (strapi: Core.Strapi, middleware?: any) => {\n return new LocalStrategy(\n {\n usernameField: 'email',\n passwordField: 'password',\n session: false,\n },\n (email: string, password: string, done: any) => {\n return getService('auth')\n .checkCredentials({ email: toLower(email), password })\n .then(async ([error, user, message]) => {\n if (middleware) {\n return middleware([error, user, message], done);\n }\n\n return done(error, user, message);\n })\n .catch((error) => done(error));\n }\n );\n};\n\nexport default createLocalStrategy;\n"],"names":["createLocalStrategy","strapi","middleware","LocalStrategy","usernameField","passwordField","session","email","password","done","getService","checkCredentials","toLower","then","error","user","message","catch"],"mappings":";;;;AAMA,MAAMA,mBAAAA,GAAsB,CAACC,MAAAA,EAAqBC,UAAAA,GAAAA;AAChD,IAAA,OAAO,IAAIC,QAAAA,CACT;QACEC,aAAAA,EAAe,OAAA;QACfC,aAAAA,EAAe,UAAA;QACfC,OAAAA,EAAS;KACX,EACA,CAACC,OAAeC,QAAAA,EAAkBC,IAAAA,GAAAA;QAChC,OAAOC,UAAAA,CAAW,MAAA,CAAA,CACfC,gBAAgB,CAAC;AAAEJ,YAAAA,KAAAA,EAAOK,OAAAA,CAAQL,KAAAA,CAAAA;AAAQC,YAAAA;AAAS,SAAA,CAAA,CACnDK,IAAI,CAAC,OAAO,CAACC,KAAAA,EAAOC,MAAMC,OAAAA,CAAQ,GAAA;AACjC,YAAA,IAAId,UAAAA,EAAY;AACd,gBAAA,OAAOA,UAAAA,CAAW;AAACY,oBAAAA,KAAAA;AAAOC,oBAAAA,IAAAA;AAAMC,oBAAAA;iBAAQ,EAAEP,IAAAA,CAAAA;AAC5C,YAAA;YAEA,OAAOA,IAAAA,CAAKK,OAAOC,IAAAA,EAAMC,OAAAA,CAAAA;AAC3B,QAAA,CAAA,CAAA,CACCC,KAAK,CAAC,CAACH,KAAAA,GAAUL,IAAAA,CAAKK,KAAAA,CAAAA,CAAAA;AAC3B,IAAA,CAAA,CAAA;AAEJ;;;;"}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var passport$1 = require('koa-passport');
4
- var fp = require('lodash/fp');
5
4
  var localStrategy = require('./passport/local-strategy.js');
6
5
 
7
6
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -12,7 +11,7 @@ const authEventsMapper = {
12
11
  onConnectionSuccess: 'admin.auth.success',
13
12
  onConnectionError: 'admin.auth.error'
14
13
  };
15
- const valueIsFunctionType = ([, value])=>fp.isFunction(value);
14
+ const valueIsFunctionType = ([, value])=>typeof value === 'function';
16
15
  const keyIsValidEventName = ([key])=>{
17
16
  return Object.keys(strapi.service('admin::passport').authEventsMapper).includes(key);
18
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"passport.js","sources":["../../../../../server/src/services/passport.ts"],"sourcesContent":["import passport from 'koa-passport';\nimport type { Strategy } from 'passport-local';\nimport { isFunction } from 'lodash/fp';\n\nimport createLocalStrategy from './passport/local-strategy';\n\nconst authEventsMapper = {\n onConnectionSuccess: 'admin.auth.success',\n onConnectionError: 'admin.auth.error',\n};\n\nconst valueIsFunctionType = ([, value]: [any, any]) => isFunction(value);\nconst keyIsValidEventName = ([key]: any) => {\n return Object.keys(strapi.service('admin::passport').authEventsMapper).includes(key);\n};\n\nconst getPassportStrategies = () => [createLocalStrategy(strapi)] as Strategy[];\n\nconst registerAuthEvents = () => {\n // @ts-expect-error - TODO: migrate auth service to TS\n const { events = {} } = strapi.config.get('admin.auth', {});\n const { authEventsMapper } = strapi.service('admin::passport');\n\n const eventList = Object.entries(events).filter(keyIsValidEventName).filter(valueIsFunctionType);\n\n for (const [eventName, handler] of eventList) {\n // TODO - TS: ensure the handler is an EventHub.Listener\n strapi.eventHub.on(authEventsMapper[eventName], handler as any);\n }\n};\n\nconst init = () => {\n strapi\n .service('admin::passport')\n .getPassportStrategies()\n .forEach((strategy: Strategy) => passport.use(strategy));\n\n registerAuthEvents();\n\n return passport.initialize();\n};\n\nexport default { init, getPassportStrategies, authEventsMapper };\n"],"names":["authEventsMapper","onConnectionSuccess","onConnectionError","valueIsFunctionType","value","isFunction","keyIsValidEventName","key","Object","keys","strapi","service","includes","getPassportStrategies","createLocalStrategy","registerAuthEvents","events","config","get","eventList","entries","filter","eventName","handler","eventHub","on","init","forEach","strategy","passport","use","initialize"],"mappings":";;;;;;;;;;AAMA,MAAMA,gBAAAA,GAAmB;IACvBC,mBAAAA,EAAqB,oBAAA;IACrBC,iBAAAA,EAAmB;AACrB,CAAA;AAEA,MAAMC,mBAAAA,GAAsB,CAAC,GAAGC,KAAAA,CAAkB,GAAKC,aAAAA,CAAWD,KAAAA,CAAAA;AAClE,MAAME,mBAAAA,GAAsB,CAAC,CAACC,GAAAA,CAAS,GAAA;IACrC,OAAOC,MAAAA,CAAOC,IAAI,CAACC,MAAAA,CAAOC,OAAO,CAAC,iBAAA,CAAA,CAAmBX,gBAAgB,CAAA,CAAEY,QAAQ,CAACL,GAAAA,CAAAA;AAClF,CAAA;AAEA,MAAMM,wBAAwB,IAAM;QAACC,aAAAA,CAAoBJ,MAAAA;AAAQ,KAAA;AAEjE,MAAMK,kBAAAA,GAAqB,IAAA;;AAEzB,IAAA,MAAM,EAAEC,MAAAA,GAAS,EAAE,EAAE,GAAGN,MAAAA,CAAOO,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,EAAC,CAAA;AACzD,IAAA,MAAM,EAAElB,gBAAgB,EAAE,GAAGU,MAAAA,CAAOC,OAAO,CAAC,iBAAA,CAAA;IAE5C,MAAMQ,SAAAA,GAAYX,OAAOY,OAAO,CAACJ,QAAQK,MAAM,CAACf,mBAAAA,CAAAA,CAAqBe,MAAM,CAAClB,mBAAAA,CAAAA;AAE5E,IAAA,KAAK,MAAM,CAACmB,SAAAA,EAAWC,OAAAA,CAAQ,IAAIJ,SAAAA,CAAW;;AAE5CT,QAAAA,MAAAA,CAAOc,QAAQ,CAACC,EAAE,CAACzB,gBAAgB,CAACsB,UAAU,EAAEC,OAAAA,CAAAA;AAClD,IAAA;AACF,CAAA;AAEA,MAAMG,IAAAA,GAAO,IAAA;IACXhB,MAAAA,CACGC,OAAO,CAAC,iBAAA,CAAA,CACRE,qBAAqB,EAAA,CACrBc,OAAO,CAAC,CAACC,QAAAA,GAAuBC,yBAAAA,CAASC,GAAG,CAACF,QAAAA,CAAAA,CAAAA;AAEhDb,IAAAA,kBAAAA,EAAAA;AAEA,IAAA,OAAOc,0BAASE,UAAU,EAAA;AAC5B,CAAA;AAEA,eAAe;AAAEL,IAAAA,IAAAA;AAAMb,IAAAA,qBAAAA;AAAuBb,IAAAA;AAAiB,CAAA;;;;"}
1
+ {"version":3,"file":"passport.js","sources":["../../../../../server/src/services/passport.ts"],"sourcesContent":["import passport from 'koa-passport';\nimport type { Strategy } from 'passport-local';\n\nimport createLocalStrategy from './passport/local-strategy';\n\nconst authEventsMapper = {\n onConnectionSuccess: 'admin.auth.success',\n onConnectionError: 'admin.auth.error',\n};\n\nconst valueIsFunctionType = ([, value]: [any, any]) => typeof value === 'function';\nconst keyIsValidEventName = ([key]: any) => {\n return Object.keys(strapi.service('admin::passport').authEventsMapper).includes(key);\n};\n\nconst getPassportStrategies = () => [createLocalStrategy(strapi)] as Strategy[];\n\nconst registerAuthEvents = () => {\n // @ts-expect-error - TODO: migrate auth service to TS\n const { events = {} } = strapi.config.get('admin.auth', {});\n const { authEventsMapper } = strapi.service('admin::passport');\n\n const eventList = Object.entries(events).filter(keyIsValidEventName).filter(valueIsFunctionType);\n\n for (const [eventName, handler] of eventList) {\n // TODO - TS: ensure the handler is an EventHub.Listener\n strapi.eventHub.on(authEventsMapper[eventName], handler as any);\n }\n};\n\nconst init = () => {\n strapi\n .service('admin::passport')\n .getPassportStrategies()\n .forEach((strategy: Strategy) => passport.use(strategy));\n\n registerAuthEvents();\n\n return passport.initialize();\n};\n\nexport default { init, getPassportStrategies, authEventsMapper };\n"],"names":["authEventsMapper","onConnectionSuccess","onConnectionError","valueIsFunctionType","value","keyIsValidEventName","key","Object","keys","strapi","service","includes","getPassportStrategies","createLocalStrategy","registerAuthEvents","events","config","get","eventList","entries","filter","eventName","handler","eventHub","on","init","forEach","strategy","passport","use","initialize"],"mappings":";;;;;;;;;AAKA,MAAMA,gBAAAA,GAAmB;IACvBC,mBAAAA,EAAqB,oBAAA;IACrBC,iBAAAA,EAAmB;AACrB,CAAA;AAEA,MAAMC,sBAAsB,CAAC,GAAGC,KAAAA,CAAkB,GAAK,OAAOA,KAAAA,KAAU,UAAA;AACxE,MAAMC,mBAAAA,GAAsB,CAAC,CAACC,GAAAA,CAAS,GAAA;IACrC,OAAOC,MAAAA,CAAOC,IAAI,CAACC,MAAAA,CAAOC,OAAO,CAAC,iBAAA,CAAA,CAAmBV,gBAAgB,CAAA,CAAEW,QAAQ,CAACL,GAAAA,CAAAA;AAClF,CAAA;AAEA,MAAMM,wBAAwB,IAAM;QAACC,aAAAA,CAAoBJ,MAAAA;AAAQ,KAAA;AAEjE,MAAMK,kBAAAA,GAAqB,IAAA;;AAEzB,IAAA,MAAM,EAAEC,MAAAA,GAAS,EAAE,EAAE,GAAGN,MAAAA,CAAOO,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,EAAC,CAAA;AACzD,IAAA,MAAM,EAAEjB,gBAAgB,EAAE,GAAGS,MAAAA,CAAOC,OAAO,CAAC,iBAAA,CAAA;IAE5C,MAAMQ,SAAAA,GAAYX,OAAOY,OAAO,CAACJ,QAAQK,MAAM,CAACf,mBAAAA,CAAAA,CAAqBe,MAAM,CAACjB,mBAAAA,CAAAA;AAE5E,IAAA,KAAK,MAAM,CAACkB,SAAAA,EAAWC,OAAAA,CAAQ,IAAIJ,SAAAA,CAAW;;AAE5CT,QAAAA,MAAAA,CAAOc,QAAQ,CAACC,EAAE,CAACxB,gBAAgB,CAACqB,UAAU,EAAEC,OAAAA,CAAAA;AAClD,IAAA;AACF,CAAA;AAEA,MAAMG,IAAAA,GAAO,IAAA;IACXhB,MAAAA,CACGC,OAAO,CAAC,iBAAA,CAAA,CACRE,qBAAqB,EAAA,CACrBc,OAAO,CAAC,CAACC,QAAAA,GAAuBC,yBAAAA,CAASC,GAAG,CAACF,QAAAA,CAAAA,CAAAA;AAEhDb,IAAAA,kBAAAA,EAAAA;AAEA,IAAA,OAAOc,0BAASE,UAAU,EAAA;AAC5B,CAAA;AAEA,eAAe;AAAEL,IAAAA,IAAAA;AAAMb,IAAAA,qBAAAA;AAAuBZ,IAAAA;AAAiB,CAAA;;;;"}
@@ -1,12 +1,11 @@
1
1
  import passport$1 from 'koa-passport';
2
- import { isFunction } from 'lodash/fp';
3
2
  import createLocalStrategy from './passport/local-strategy.mjs';
4
3
 
5
4
  const authEventsMapper = {
6
5
  onConnectionSuccess: 'admin.auth.success',
7
6
  onConnectionError: 'admin.auth.error'
8
7
  };
9
- const valueIsFunctionType = ([, value])=>isFunction(value);
8
+ const valueIsFunctionType = ([, value])=>typeof value === 'function';
10
9
  const keyIsValidEventName = ([key])=>{
11
10
  return Object.keys(strapi.service('admin::passport').authEventsMapper).includes(key);
12
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"passport.mjs","sources":["../../../../../server/src/services/passport.ts"],"sourcesContent":["import passport from 'koa-passport';\nimport type { Strategy } from 'passport-local';\nimport { isFunction } from 'lodash/fp';\n\nimport createLocalStrategy from './passport/local-strategy';\n\nconst authEventsMapper = {\n onConnectionSuccess: 'admin.auth.success',\n onConnectionError: 'admin.auth.error',\n};\n\nconst valueIsFunctionType = ([, value]: [any, any]) => isFunction(value);\nconst keyIsValidEventName = ([key]: any) => {\n return Object.keys(strapi.service('admin::passport').authEventsMapper).includes(key);\n};\n\nconst getPassportStrategies = () => [createLocalStrategy(strapi)] as Strategy[];\n\nconst registerAuthEvents = () => {\n // @ts-expect-error - TODO: migrate auth service to TS\n const { events = {} } = strapi.config.get('admin.auth', {});\n const { authEventsMapper } = strapi.service('admin::passport');\n\n const eventList = Object.entries(events).filter(keyIsValidEventName).filter(valueIsFunctionType);\n\n for (const [eventName, handler] of eventList) {\n // TODO - TS: ensure the handler is an EventHub.Listener\n strapi.eventHub.on(authEventsMapper[eventName], handler as any);\n }\n};\n\nconst init = () => {\n strapi\n .service('admin::passport')\n .getPassportStrategies()\n .forEach((strategy: Strategy) => passport.use(strategy));\n\n registerAuthEvents();\n\n return passport.initialize();\n};\n\nexport default { init, getPassportStrategies, authEventsMapper };\n"],"names":["authEventsMapper","onConnectionSuccess","onConnectionError","valueIsFunctionType","value","isFunction","keyIsValidEventName","key","Object","keys","strapi","service","includes","getPassportStrategies","createLocalStrategy","registerAuthEvents","events","config","get","eventList","entries","filter","eventName","handler","eventHub","on","init","forEach","strategy","passport","use","initialize"],"mappings":";;;;AAMA,MAAMA,gBAAAA,GAAmB;IACvBC,mBAAAA,EAAqB,oBAAA;IACrBC,iBAAAA,EAAmB;AACrB,CAAA;AAEA,MAAMC,mBAAAA,GAAsB,CAAC,GAAGC,KAAAA,CAAkB,GAAKC,UAAAA,CAAWD,KAAAA,CAAAA;AAClE,MAAME,mBAAAA,GAAsB,CAAC,CAACC,GAAAA,CAAS,GAAA;IACrC,OAAOC,MAAAA,CAAOC,IAAI,CAACC,MAAAA,CAAOC,OAAO,CAAC,iBAAA,CAAA,CAAmBX,gBAAgB,CAAA,CAAEY,QAAQ,CAACL,GAAAA,CAAAA;AAClF,CAAA;AAEA,MAAMM,wBAAwB,IAAM;QAACC,mBAAAA,CAAoBJ,MAAAA;AAAQ,KAAA;AAEjE,MAAMK,kBAAAA,GAAqB,IAAA;;AAEzB,IAAA,MAAM,EAAEC,MAAAA,GAAS,EAAE,EAAE,GAAGN,MAAAA,CAAOO,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,EAAC,CAAA;AACzD,IAAA,MAAM,EAAElB,gBAAgB,EAAE,GAAGU,MAAAA,CAAOC,OAAO,CAAC,iBAAA,CAAA;IAE5C,MAAMQ,SAAAA,GAAYX,OAAOY,OAAO,CAACJ,QAAQK,MAAM,CAACf,mBAAAA,CAAAA,CAAqBe,MAAM,CAAClB,mBAAAA,CAAAA;AAE5E,IAAA,KAAK,MAAM,CAACmB,SAAAA,EAAWC,OAAAA,CAAQ,IAAIJ,SAAAA,CAAW;;AAE5CT,QAAAA,MAAAA,CAAOc,QAAQ,CAACC,EAAE,CAACzB,gBAAgB,CAACsB,UAAU,EAAEC,OAAAA,CAAAA;AAClD,IAAA;AACF,CAAA;AAEA,MAAMG,IAAAA,GAAO,IAAA;IACXhB,MAAAA,CACGC,OAAO,CAAC,iBAAA,CAAA,CACRE,qBAAqB,EAAA,CACrBc,OAAO,CAAC,CAACC,QAAAA,GAAuBC,UAAAA,CAASC,GAAG,CAACF,QAAAA,CAAAA,CAAAA;AAEhDb,IAAAA,kBAAAA,EAAAA;AAEA,IAAA,OAAOc,WAASE,UAAU,EAAA;AAC5B,CAAA;AAEA,eAAe;AAAEL,IAAAA,IAAAA;AAAMb,IAAAA,qBAAAA;AAAuBb,IAAAA;AAAiB,CAAA;;;;"}
1
+ {"version":3,"file":"passport.mjs","sources":["../../../../../server/src/services/passport.ts"],"sourcesContent":["import passport from 'koa-passport';\nimport type { Strategy } from 'passport-local';\n\nimport createLocalStrategy from './passport/local-strategy';\n\nconst authEventsMapper = {\n onConnectionSuccess: 'admin.auth.success',\n onConnectionError: 'admin.auth.error',\n};\n\nconst valueIsFunctionType = ([, value]: [any, any]) => typeof value === 'function';\nconst keyIsValidEventName = ([key]: any) => {\n return Object.keys(strapi.service('admin::passport').authEventsMapper).includes(key);\n};\n\nconst getPassportStrategies = () => [createLocalStrategy(strapi)] as Strategy[];\n\nconst registerAuthEvents = () => {\n // @ts-expect-error - TODO: migrate auth service to TS\n const { events = {} } = strapi.config.get('admin.auth', {});\n const { authEventsMapper } = strapi.service('admin::passport');\n\n const eventList = Object.entries(events).filter(keyIsValidEventName).filter(valueIsFunctionType);\n\n for (const [eventName, handler] of eventList) {\n // TODO - TS: ensure the handler is an EventHub.Listener\n strapi.eventHub.on(authEventsMapper[eventName], handler as any);\n }\n};\n\nconst init = () => {\n strapi\n .service('admin::passport')\n .getPassportStrategies()\n .forEach((strategy: Strategy) => passport.use(strategy));\n\n registerAuthEvents();\n\n return passport.initialize();\n};\n\nexport default { init, getPassportStrategies, authEventsMapper };\n"],"names":["authEventsMapper","onConnectionSuccess","onConnectionError","valueIsFunctionType","value","keyIsValidEventName","key","Object","keys","strapi","service","includes","getPassportStrategies","createLocalStrategy","registerAuthEvents","events","config","get","eventList","entries","filter","eventName","handler","eventHub","on","init","forEach","strategy","passport","use","initialize"],"mappings":";;;AAKA,MAAMA,gBAAAA,GAAmB;IACvBC,mBAAAA,EAAqB,oBAAA;IACrBC,iBAAAA,EAAmB;AACrB,CAAA;AAEA,MAAMC,sBAAsB,CAAC,GAAGC,KAAAA,CAAkB,GAAK,OAAOA,KAAAA,KAAU,UAAA;AACxE,MAAMC,mBAAAA,GAAsB,CAAC,CAACC,GAAAA,CAAS,GAAA;IACrC,OAAOC,MAAAA,CAAOC,IAAI,CAACC,MAAAA,CAAOC,OAAO,CAAC,iBAAA,CAAA,CAAmBV,gBAAgB,CAAA,CAAEW,QAAQ,CAACL,GAAAA,CAAAA;AAClF,CAAA;AAEA,MAAMM,wBAAwB,IAAM;QAACC,mBAAAA,CAAoBJ,MAAAA;AAAQ,KAAA;AAEjE,MAAMK,kBAAAA,GAAqB,IAAA;;AAEzB,IAAA,MAAM,EAAEC,MAAAA,GAAS,EAAE,EAAE,GAAGN,MAAAA,CAAOO,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,EAAC,CAAA;AACzD,IAAA,MAAM,EAAEjB,gBAAgB,EAAE,GAAGS,MAAAA,CAAOC,OAAO,CAAC,iBAAA,CAAA;IAE5C,MAAMQ,SAAAA,GAAYX,OAAOY,OAAO,CAACJ,QAAQK,MAAM,CAACf,mBAAAA,CAAAA,CAAqBe,MAAM,CAACjB,mBAAAA,CAAAA;AAE5E,IAAA,KAAK,MAAM,CAACkB,SAAAA,EAAWC,OAAAA,CAAQ,IAAIJ,SAAAA,CAAW;;AAE5CT,QAAAA,MAAAA,CAAOc,QAAQ,CAACC,EAAE,CAACxB,gBAAgB,CAACqB,UAAU,EAAEC,OAAAA,CAAAA;AAClD,IAAA;AACF,CAAA;AAEA,MAAMG,IAAAA,GAAO,IAAA;IACXhB,MAAAA,CACGC,OAAO,CAAC,iBAAA,CAAA,CACRE,qBAAqB,EAAA,CACrBc,OAAO,CAAC,CAACC,QAAAA,GAAuBC,UAAAA,CAASC,GAAG,CAACF,QAAAA,CAAAA,CAAAA;AAEhDb,IAAAA,kBAAAA,EAAAA;AAEA,IAAA,OAAOc,WAASE,UAAU,EAAA;AAC5B,CAAA;AAEA,eAAe;AAAEL,IAAAA,IAAAA;AAAMb,IAAAA,qBAAAA;AAAuBZ,IAAAA;AAAiB,CAAA;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var permissions = require('@strapi/permissions');
5
5
  var index = require('../../domain/permission/index.js');
6
6
  var index$1 = require('../../utils/index.js');
@@ -25,7 +25,7 @@ var createPermissionEngine = ((params)=>{
25
25
  const properties = permission.properties || {};
26
26
  // Only keep the properties allowed by the action (action.applyToProperties)
27
27
  const propertiesName = Object.keys(properties);
28
- const invalidProperties = fp.difference(propertiesName, // @ts-expect-error - applyToProperties is defined inside the options of an action
28
+ const invalidProperties = _.difference(propertiesName, // @ts-expect-error - applyToProperties is defined inside the options of an action
29
29
  action.applyToProperties || propertiesName);
30
30
  const permissionWithSanitizedProperties = invalidProperties.reduce(// @ts-expect-error - fix reduce, property should be a string but it's actually the permission object
31
31
  (property)=>index.default.deleteProperty(property, permission), permission);
@@ -34,7 +34,7 @@ var createPermissionEngine = ((params)=>{
34
34
  * Ignore the permission if the fields property is an empty array (access to no field)
35
35
  */ .on('after-format::validate.permission', ({ permission })=>{
36
36
  const { fields } = permission.properties;
37
- if (fp.isArray(fields) && fp.isEmpty(fields)) {
37
+ if (Array.isArray(fields) && _.isEmpty(fields)) {
38
38
  return false;
39
39
  }
40
40
  });
@@ -57,7 +57,7 @@ var createPermissionEngine = ((params)=>{
57
57
  },
58
58
  /**
59
59
  * Check many permissions based on an ability
60
- */ checkMany: fp.curry((ability, permissions)=>{
60
+ */ checkMany: _.curry((ability, permissions)=>{
61
61
  // @ts-expect-error - Permissions does not contain any field property
62
62
  return permissions.map(({ action, subject, field })=>ability.can(action, subject, field));
63
63
  })
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sources":["../../../../../../server/src/services/permission/engine.ts"],"sourcesContent":["import { curry, isArray, isEmpty, difference } from 'lodash/fp';\nimport { engine } from '@strapi/permissions';\nimport type { Ability } from '@casl/ability';\nimport permissionDomain from '../../domain/permission';\nimport { getService } from '../../utils';\nimport { Action } from '../../domain/action';\nimport type { AdminUser, Permission } from '../../../../shared/contracts/shared';\n\nexport default (params: { providers: engine.EngineParams['providers'] }) => {\n const { providers } = params;\n\n const engineInstance = engine\n .new({ providers })\n /**\n * Validate the permission's action exists in the action registry\n */\n .on('before-format::validate.permission', ({ permission }) => {\n const action = providers.action.get(permission.action);\n\n // If the action isn't registered into the action provider, then ignore the permission\n if (!action) {\n strapi.log.debug(\n `Unknown action \"${permission.action}\" supplied when registering a new permission in engine`\n );\n return false;\n }\n })\n\n /**\n * Remove invalid properties from the permission based on the action (applyToProperties)\n */\n .on('format.permission', (permission: Permission) => {\n const action = providers.action.get(permission.action) as Action;\n const properties = permission.properties || {};\n\n // Only keep the properties allowed by the action (action.applyToProperties)\n const propertiesName = Object.keys(properties);\n const invalidProperties = difference(\n propertiesName,\n // @ts-expect-error - applyToProperties is defined inside the options of an action\n action.applyToProperties || propertiesName\n );\n\n const permissionWithSanitizedProperties = invalidProperties.reduce(\n // @ts-expect-error - fix reduce, property should be a string but it's actually the permission object\n (property) => permissionDomain.deleteProperty(property, permission) as Permission,\n permission\n );\n\n return permissionWithSanitizedProperties;\n })\n\n /**\n * Ignore the permission if the fields property is an empty array (access to no field)\n */\n .on('after-format::validate.permission', ({ permission }) => {\n const { fields } = permission.properties;\n\n if (isArray(fields) && isEmpty(fields)) {\n return false;\n }\n });\n\n return {\n get hooks() {\n return engineInstance.hooks;\n },\n\n /**\n * Generate an ability based on the given user (using associated roles & permissions)\n * @param user\n */\n async generateUserAbility(user: AdminUser): Promise<Ability> {\n const permissions = (await getService('permission').findUserPermissions(user)) as any;\n\n return engineInstance.generateAbility(permissions, user);\n },\n\n /**\n * Generate an ability based on an admin token's stored permissions, scoped to the owner.\n * Token permissions are already validated and ceiling-clamped at write time.\n */\n async generateTokenAbility(tokenPermissions: Permission[], owner: AdminUser): Promise<Ability> {\n return engineInstance.generateAbility(tokenPermissions as any, owner);\n },\n\n /**\n * Check many permissions based on an ability\n */\n checkMany: curry((ability: Ability, permissions: Permission[]) => {\n // @ts-expect-error - Permissions does not contain any field property\n return permissions.map(({ action, subject, field }) => ability.can(action, subject, field));\n }),\n };\n};\n"],"names":["params","providers","engineInstance","engine","new","on","permission","action","get","strapi","log","debug","properties","propertiesName","Object","keys","invalidProperties","difference","applyToProperties","permissionWithSanitizedProperties","reduce","property","permissionDomain","deleteProperty","fields","isArray","isEmpty","hooks","generateUserAbility","user","permissions","getService","findUserPermissions","generateAbility","generateTokenAbility","tokenPermissions","owner","checkMany","curry","ability","map","subject","field","can"],"mappings":";;;;;;;AAQA,6BAAe,CAAA,CAACA,MAAAA,GAAAA;IACd,MAAM,EAAEC,SAAS,EAAE,GAAGD,MAAAA;IAEtB,MAAME,cAAAA,GAAiBC,kBAAAA,CACpBC,GAAG,CAAC;AAAEH,QAAAA;KAAU,CACjB;;AAEC,SACAI,EAAE,CAAC,oCAAA,EAAsC,CAAC,EAAEC,UAAU,EAAE,GAAA;AACvD,QAAA,MAAMC,SAASN,SAAAA,CAAUM,MAAM,CAACC,GAAG,CAACF,WAAWC,MAAM,CAAA;;AAGrD,QAAA,IAAI,CAACA,MAAAA,EAAQ;YACXE,MAAAA,CAAOC,GAAG,CAACC,KAAK,CACd,CAAC,gBAAgB,EAAEL,UAAAA,CAAWC,MAAM,CAAC,sDAAsD,CAAC,CAAA;YAE9F,OAAO,KAAA;AACT,QAAA;IACF,CAAA,CAEA;;SAGCF,EAAE,CAAC,mBAAA,EAAqB,CAACC,UAAAA,GAAAA;AACxB,QAAA,MAAMC,SAASN,SAAAA,CAAUM,MAAM,CAACC,GAAG,CAACF,WAAWC,MAAM,CAAA;AACrD,QAAA,MAAMK,UAAAA,GAAaN,UAAAA,CAAWM,UAAU,IAAI,EAAC;;QAG7C,MAAMC,cAAAA,GAAiBC,MAAAA,CAAOC,IAAI,CAACH,UAAAA,CAAAA;QACnC,MAAMI,iBAAAA,GAAoBC,aAAAA,CACxBJ,cAAAA;AAEAN,QAAAA,MAAAA,CAAOW,iBAAiB,IAAIL,cAAAA,CAAAA;AAG9B,QAAA,MAAMM,iCAAAA,GAAoCH,iBAAAA,CAAkBI,MAAM;AAEhE,QAAA,CAACC,QAAAA,GAAaC,aAAAA,CAAiBC,cAAc,CAACF,UAAUf,UAAAA,CAAAA,EACxDA,UAAAA,CAAAA;QAGF,OAAOa,iCAAAA;IACT,CAAA,CAEA;;AAEC,SACAd,EAAE,CAAC,mCAAA,EAAqC,CAAC,EAAEC,UAAU,EAAE,GAAA;AACtD,QAAA,MAAM,EAAEkB,MAAM,EAAE,GAAGlB,WAAWM,UAAU;QAExC,IAAIa,UAAAA,CAAQD,MAAAA,CAAAA,IAAWE,UAAAA,CAAQF,MAAAA,CAAAA,EAAS;YACtC,OAAO,KAAA;AACT,QAAA;AACF,IAAA,CAAA,CAAA;IAEF,OAAO;AACL,QAAA,IAAIG,KAAAA,CAAAA,GAAQ;AACV,YAAA,OAAOzB,eAAeyB,KAAK;AAC7B,QAAA,CAAA;AAEA;;;QAIA,MAAMC,qBAAoBC,IAAe,EAAA;AACvC,YAAA,MAAMC,WAAAA,GAAe,MAAMC,kBAAAA,CAAW,YAAA,CAAA,CAAcC,mBAAmB,CAACH,IAAAA,CAAAA;YAExE,OAAO3B,cAAAA,CAAe+B,eAAe,CAACH,WAAAA,EAAaD,IAAAA,CAAAA;AACrD,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMK,oBAAAA,CAAAA,CAAqBC,gBAA8B,EAAEC,KAAgB,EAAA;YACzE,OAAOlC,cAAAA,CAAe+B,eAAe,CAACE,gBAAAA,EAAyBC,KAAAA,CAAAA;AACjE,QAAA,CAAA;AAEA;;QAGAC,SAAAA,EAAWC,QAAAA,CAAM,CAACC,OAAAA,EAAkBT,WAAAA,GAAAA;;AAElC,YAAA,OAAOA,YAAYU,GAAG,CAAC,CAAC,EAAEjC,MAAM,EAAEkC,OAAO,EAAEC,KAAK,EAAE,GAAKH,OAAAA,CAAQI,GAAG,CAACpC,QAAQkC,OAAAA,EAASC,KAAAA,CAAAA,CAAAA;AACtF,QAAA,CAAA;AACF,KAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"engine.js","sources":["../../../../../../server/src/services/permission/engine.ts"],"sourcesContent":["import { curry, isEmpty, difference } from 'lodash';\n\nimport { engine } from '@strapi/permissions';\nimport type { Ability } from '@casl/ability';\nimport permissionDomain from '../../domain/permission';\nimport { getService } from '../../utils';\nimport { Action } from '../../domain/action';\nimport type { AdminUser, Permission } from '../../../../shared/contracts/shared';\n\nexport default (params: { providers: engine.EngineParams['providers'] }) => {\n const { providers } = params;\n\n const engineInstance = engine\n .new({ providers })\n /**\n * Validate the permission's action exists in the action registry\n */\n .on('before-format::validate.permission', ({ permission }) => {\n const action = providers.action.get(permission.action);\n\n // If the action isn't registered into the action provider, then ignore the permission\n if (!action) {\n strapi.log.debug(\n `Unknown action \"${permission.action}\" supplied when registering a new permission in engine`\n );\n return false;\n }\n })\n\n /**\n * Remove invalid properties from the permission based on the action (applyToProperties)\n */\n .on('format.permission', (permission: Permission) => {\n const action = providers.action.get(permission.action) as Action;\n const properties = permission.properties || {};\n\n // Only keep the properties allowed by the action (action.applyToProperties)\n const propertiesName = Object.keys(properties);\n const invalidProperties = difference(\n propertiesName,\n // @ts-expect-error - applyToProperties is defined inside the options of an action\n action.applyToProperties || propertiesName\n );\n\n const permissionWithSanitizedProperties = invalidProperties.reduce(\n // @ts-expect-error - fix reduce, property should be a string but it's actually the permission object\n (property) => permissionDomain.deleteProperty(property, permission) as Permission,\n permission\n );\n\n return permissionWithSanitizedProperties;\n })\n\n /**\n * Ignore the permission if the fields property is an empty array (access to no field)\n */\n .on('after-format::validate.permission', ({ permission }) => {\n const { fields } = permission.properties;\n\n if (Array.isArray(fields) && isEmpty(fields)) {\n return false;\n }\n });\n\n return {\n get hooks() {\n return engineInstance.hooks;\n },\n\n /**\n * Generate an ability based on the given user (using associated roles & permissions)\n * @param user\n */\n async generateUserAbility(user: AdminUser): Promise<Ability> {\n const permissions = (await getService('permission').findUserPermissions(user)) as any;\n\n return engineInstance.generateAbility(permissions, user);\n },\n\n /**\n * Generate an ability based on an admin token's stored permissions, scoped to the owner.\n * Token permissions are already validated and ceiling-clamped at write time.\n */\n async generateTokenAbility(tokenPermissions: Permission[], owner: AdminUser): Promise<Ability> {\n return engineInstance.generateAbility(tokenPermissions as any, owner);\n },\n\n /**\n * Check many permissions based on an ability\n */\n checkMany: curry((ability: Ability, permissions: Permission[]) => {\n // @ts-expect-error - Permissions does not contain any field property\n return permissions.map(({ action, subject, field }) => ability.can(action, subject, field));\n }),\n };\n};\n"],"names":["params","providers","engineInstance","engine","new","on","permission","action","get","strapi","log","debug","properties","propertiesName","Object","keys","invalidProperties","difference","applyToProperties","permissionWithSanitizedProperties","reduce","property","permissionDomain","deleteProperty","fields","Array","isArray","isEmpty","hooks","generateUserAbility","user","permissions","getService","findUserPermissions","generateAbility","generateTokenAbility","tokenPermissions","owner","checkMany","curry","ability","map","subject","field","can"],"mappings":";;;;;;;AASA,6BAAe,CAAA,CAACA,MAAAA,GAAAA;IACd,MAAM,EAAEC,SAAS,EAAE,GAAGD,MAAAA;IAEtB,MAAME,cAAAA,GAAiBC,kBAAAA,CACpBC,GAAG,CAAC;AAAEH,QAAAA;KAAU,CACjB;;AAEC,SACAI,EAAE,CAAC,oCAAA,EAAsC,CAAC,EAAEC,UAAU,EAAE,GAAA;AACvD,QAAA,MAAMC,SAASN,SAAAA,CAAUM,MAAM,CAACC,GAAG,CAACF,WAAWC,MAAM,CAAA;;AAGrD,QAAA,IAAI,CAACA,MAAAA,EAAQ;YACXE,MAAAA,CAAOC,GAAG,CAACC,KAAK,CACd,CAAC,gBAAgB,EAAEL,UAAAA,CAAWC,MAAM,CAAC,sDAAsD,CAAC,CAAA;YAE9F,OAAO,KAAA;AACT,QAAA;IACF,CAAA,CAEA;;SAGCF,EAAE,CAAC,mBAAA,EAAqB,CAACC,UAAAA,GAAAA;AACxB,QAAA,MAAMC,SAASN,SAAAA,CAAUM,MAAM,CAACC,GAAG,CAACF,WAAWC,MAAM,CAAA;AACrD,QAAA,MAAMK,UAAAA,GAAaN,UAAAA,CAAWM,UAAU,IAAI,EAAC;;QAG7C,MAAMC,cAAAA,GAAiBC,MAAAA,CAAOC,IAAI,CAACH,UAAAA,CAAAA;QACnC,MAAMI,iBAAAA,GAAoBC,YAAAA,CACxBJ,cAAAA;AAEAN,QAAAA,MAAAA,CAAOW,iBAAiB,IAAIL,cAAAA,CAAAA;AAG9B,QAAA,MAAMM,iCAAAA,GAAoCH,iBAAAA,CAAkBI,MAAM;AAEhE,QAAA,CAACC,QAAAA,GAAaC,aAAAA,CAAiBC,cAAc,CAACF,UAAUf,UAAAA,CAAAA,EACxDA,UAAAA,CAAAA;QAGF,OAAOa,iCAAAA;IACT,CAAA,CAEA;;AAEC,SACAd,EAAE,CAAC,mCAAA,EAAqC,CAAC,EAAEC,UAAU,EAAE,GAAA;AACtD,QAAA,MAAM,EAAEkB,MAAM,EAAE,GAAGlB,WAAWM,UAAU;AAExC,QAAA,IAAIa,KAAAA,CAAMC,OAAO,CAACF,MAAAA,CAAAA,IAAWG,UAAQH,MAAAA,CAAAA,EAAS;YAC5C,OAAO,KAAA;AACT,QAAA;AACF,IAAA,CAAA,CAAA;IAEF,OAAO;AACL,QAAA,IAAII,KAAAA,CAAAA,GAAQ;AACV,YAAA,OAAO1B,eAAe0B,KAAK;AAC7B,QAAA,CAAA;AAEA;;;QAIA,MAAMC,qBAAoBC,IAAe,EAAA;AACvC,YAAA,MAAMC,WAAAA,GAAe,MAAMC,kBAAAA,CAAW,YAAA,CAAA,CAAcC,mBAAmB,CAACH,IAAAA,CAAAA;YAExE,OAAO5B,cAAAA,CAAegC,eAAe,CAACH,WAAAA,EAAaD,IAAAA,CAAAA;AACrD,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMK,oBAAAA,CAAAA,CAAqBC,gBAA8B,EAAEC,KAAgB,EAAA;YACzE,OAAOnC,cAAAA,CAAegC,eAAe,CAACE,gBAAAA,EAAyBC,KAAAA,CAAAA;AACjE,QAAA,CAAA;AAEA;;QAGAC,SAAAA,EAAWC,OAAAA,CAAM,CAACC,OAAAA,EAAkBT,WAAAA,GAAAA;;AAElC,YAAA,OAAOA,YAAYU,GAAG,CAAC,CAAC,EAAElC,MAAM,EAAEmC,OAAO,EAAEC,KAAK,EAAE,GAAKH,OAAAA,CAAQI,GAAG,CAACrC,QAAQmC,OAAAA,EAASC,KAAAA,CAAAA,CAAAA;AACtF,QAAA,CAAA;AACF,KAAA;AACF,CAAA;;;;"}
@@ -1,4 +1,4 @@
1
- import { difference, isArray, isEmpty, curry } from 'lodash/fp';
1
+ import { difference, isEmpty, curry } from 'lodash';
2
2
  import { engine } from '@strapi/permissions';
3
3
  import permissionDomain from '../../domain/permission/index.mjs';
4
4
  import { getService } from '../../utils/index.mjs';
@@ -32,7 +32,7 @@ var createPermissionEngine = ((params)=>{
32
32
  * Ignore the permission if the fields property is an empty array (access to no field)
33
33
  */ .on('after-format::validate.permission', ({ permission })=>{
34
34
  const { fields } = permission.properties;
35
- if (isArray(fields) && isEmpty(fields)) {
35
+ if (Array.isArray(fields) && isEmpty(fields)) {
36
36
  return false;
37
37
  }
38
38
  });
@@ -1 +1 @@
1
- {"version":3,"file":"engine.mjs","sources":["../../../../../../server/src/services/permission/engine.ts"],"sourcesContent":["import { curry, isArray, isEmpty, difference } from 'lodash/fp';\nimport { engine } from '@strapi/permissions';\nimport type { Ability } from '@casl/ability';\nimport permissionDomain from '../../domain/permission';\nimport { getService } from '../../utils';\nimport { Action } from '../../domain/action';\nimport type { AdminUser, Permission } from '../../../../shared/contracts/shared';\n\nexport default (params: { providers: engine.EngineParams['providers'] }) => {\n const { providers } = params;\n\n const engineInstance = engine\n .new({ providers })\n /**\n * Validate the permission's action exists in the action registry\n */\n .on('before-format::validate.permission', ({ permission }) => {\n const action = providers.action.get(permission.action);\n\n // If the action isn't registered into the action provider, then ignore the permission\n if (!action) {\n strapi.log.debug(\n `Unknown action \"${permission.action}\" supplied when registering a new permission in engine`\n );\n return false;\n }\n })\n\n /**\n * Remove invalid properties from the permission based on the action (applyToProperties)\n */\n .on('format.permission', (permission: Permission) => {\n const action = providers.action.get(permission.action) as Action;\n const properties = permission.properties || {};\n\n // Only keep the properties allowed by the action (action.applyToProperties)\n const propertiesName = Object.keys(properties);\n const invalidProperties = difference(\n propertiesName,\n // @ts-expect-error - applyToProperties is defined inside the options of an action\n action.applyToProperties || propertiesName\n );\n\n const permissionWithSanitizedProperties = invalidProperties.reduce(\n // @ts-expect-error - fix reduce, property should be a string but it's actually the permission object\n (property) => permissionDomain.deleteProperty(property, permission) as Permission,\n permission\n );\n\n return permissionWithSanitizedProperties;\n })\n\n /**\n * Ignore the permission if the fields property is an empty array (access to no field)\n */\n .on('after-format::validate.permission', ({ permission }) => {\n const { fields } = permission.properties;\n\n if (isArray(fields) && isEmpty(fields)) {\n return false;\n }\n });\n\n return {\n get hooks() {\n return engineInstance.hooks;\n },\n\n /**\n * Generate an ability based on the given user (using associated roles & permissions)\n * @param user\n */\n async generateUserAbility(user: AdminUser): Promise<Ability> {\n const permissions = (await getService('permission').findUserPermissions(user)) as any;\n\n return engineInstance.generateAbility(permissions, user);\n },\n\n /**\n * Generate an ability based on an admin token's stored permissions, scoped to the owner.\n * Token permissions are already validated and ceiling-clamped at write time.\n */\n async generateTokenAbility(tokenPermissions: Permission[], owner: AdminUser): Promise<Ability> {\n return engineInstance.generateAbility(tokenPermissions as any, owner);\n },\n\n /**\n * Check many permissions based on an ability\n */\n checkMany: curry((ability: Ability, permissions: Permission[]) => {\n // @ts-expect-error - Permissions does not contain any field property\n return permissions.map(({ action, subject, field }) => ability.can(action, subject, field));\n }),\n };\n};\n"],"names":["params","providers","engineInstance","engine","new","on","permission","action","get","strapi","log","debug","properties","propertiesName","Object","keys","invalidProperties","difference","applyToProperties","permissionWithSanitizedProperties","reduce","property","permissionDomain","deleteProperty","fields","isArray","isEmpty","hooks","generateUserAbility","user","permissions","getService","findUserPermissions","generateAbility","generateTokenAbility","tokenPermissions","owner","checkMany","curry","ability","map","subject","field","can"],"mappings":";;;;;AAQA,6BAAe,CAAA,CAACA,MAAAA,GAAAA;IACd,MAAM,EAAEC,SAAS,EAAE,GAAGD,MAAAA;IAEtB,MAAME,cAAAA,GAAiBC,MAAAA,CACpBC,GAAG,CAAC;AAAEH,QAAAA;KAAU,CACjB;;AAEC,SACAI,EAAE,CAAC,oCAAA,EAAsC,CAAC,EAAEC,UAAU,EAAE,GAAA;AACvD,QAAA,MAAMC,SAASN,SAAAA,CAAUM,MAAM,CAACC,GAAG,CAACF,WAAWC,MAAM,CAAA;;AAGrD,QAAA,IAAI,CAACA,MAAAA,EAAQ;YACXE,MAAAA,CAAOC,GAAG,CAACC,KAAK,CACd,CAAC,gBAAgB,EAAEL,UAAAA,CAAWC,MAAM,CAAC,sDAAsD,CAAC,CAAA;YAE9F,OAAO,KAAA;AACT,QAAA;IACF,CAAA,CAEA;;SAGCF,EAAE,CAAC,mBAAA,EAAqB,CAACC,UAAAA,GAAAA;AACxB,QAAA,MAAMC,SAASN,SAAAA,CAAUM,MAAM,CAACC,GAAG,CAACF,WAAWC,MAAM,CAAA;AACrD,QAAA,MAAMK,UAAAA,GAAaN,UAAAA,CAAWM,UAAU,IAAI,EAAC;;QAG7C,MAAMC,cAAAA,GAAiBC,MAAAA,CAAOC,IAAI,CAACH,UAAAA,CAAAA;QACnC,MAAMI,iBAAAA,GAAoBC,UAAAA,CACxBJ,cAAAA;AAEAN,QAAAA,MAAAA,CAAOW,iBAAiB,IAAIL,cAAAA,CAAAA;AAG9B,QAAA,MAAMM,iCAAAA,GAAoCH,iBAAAA,CAAkBI,MAAM;AAEhE,QAAA,CAACC,QAAAA,GAAaC,gBAAAA,CAAiBC,cAAc,CAACF,UAAUf,UAAAA,CAAAA,EACxDA,UAAAA,CAAAA;QAGF,OAAOa,iCAAAA;IACT,CAAA,CAEA;;AAEC,SACAd,EAAE,CAAC,mCAAA,EAAqC,CAAC,EAAEC,UAAU,EAAE,GAAA;AACtD,QAAA,MAAM,EAAEkB,MAAM,EAAE,GAAGlB,WAAWM,UAAU;QAExC,IAAIa,OAAAA,CAAQD,MAAAA,CAAAA,IAAWE,OAAAA,CAAQF,MAAAA,CAAAA,EAAS;YACtC,OAAO,KAAA;AACT,QAAA;AACF,IAAA,CAAA,CAAA;IAEF,OAAO;AACL,QAAA,IAAIG,KAAAA,CAAAA,GAAQ;AACV,YAAA,OAAOzB,eAAeyB,KAAK;AAC7B,QAAA,CAAA;AAEA;;;QAIA,MAAMC,qBAAoBC,IAAe,EAAA;AACvC,YAAA,MAAMC,WAAAA,GAAe,MAAMC,UAAAA,CAAW,YAAA,CAAA,CAAcC,mBAAmB,CAACH,IAAAA,CAAAA;YAExE,OAAO3B,cAAAA,CAAe+B,eAAe,CAACH,WAAAA,EAAaD,IAAAA,CAAAA;AACrD,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMK,oBAAAA,CAAAA,CAAqBC,gBAA8B,EAAEC,KAAgB,EAAA;YACzE,OAAOlC,cAAAA,CAAe+B,eAAe,CAACE,gBAAAA,EAAyBC,KAAAA,CAAAA;AACjE,QAAA,CAAA;AAEA;;QAGAC,SAAAA,EAAWC,KAAAA,CAAM,CAACC,OAAAA,EAAkBT,WAAAA,GAAAA;;AAElC,YAAA,OAAOA,YAAYU,GAAG,CAAC,CAAC,EAAEjC,MAAM,EAAEkC,OAAO,EAAEC,KAAK,EAAE,GAAKH,OAAAA,CAAQI,GAAG,CAACpC,QAAQkC,OAAAA,EAASC,KAAAA,CAAAA,CAAAA;AACtF,QAAA,CAAA;AACF,KAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"engine.mjs","sources":["../../../../../../server/src/services/permission/engine.ts"],"sourcesContent":["import { curry, isEmpty, difference } from 'lodash';\n\nimport { engine } from '@strapi/permissions';\nimport type { Ability } from '@casl/ability';\nimport permissionDomain from '../../domain/permission';\nimport { getService } from '../../utils';\nimport { Action } from '../../domain/action';\nimport type { AdminUser, Permission } from '../../../../shared/contracts/shared';\n\nexport default (params: { providers: engine.EngineParams['providers'] }) => {\n const { providers } = params;\n\n const engineInstance = engine\n .new({ providers })\n /**\n * Validate the permission's action exists in the action registry\n */\n .on('before-format::validate.permission', ({ permission }) => {\n const action = providers.action.get(permission.action);\n\n // If the action isn't registered into the action provider, then ignore the permission\n if (!action) {\n strapi.log.debug(\n `Unknown action \"${permission.action}\" supplied when registering a new permission in engine`\n );\n return false;\n }\n })\n\n /**\n * Remove invalid properties from the permission based on the action (applyToProperties)\n */\n .on('format.permission', (permission: Permission) => {\n const action = providers.action.get(permission.action) as Action;\n const properties = permission.properties || {};\n\n // Only keep the properties allowed by the action (action.applyToProperties)\n const propertiesName = Object.keys(properties);\n const invalidProperties = difference(\n propertiesName,\n // @ts-expect-error - applyToProperties is defined inside the options of an action\n action.applyToProperties || propertiesName\n );\n\n const permissionWithSanitizedProperties = invalidProperties.reduce(\n // @ts-expect-error - fix reduce, property should be a string but it's actually the permission object\n (property) => permissionDomain.deleteProperty(property, permission) as Permission,\n permission\n );\n\n return permissionWithSanitizedProperties;\n })\n\n /**\n * Ignore the permission if the fields property is an empty array (access to no field)\n */\n .on('after-format::validate.permission', ({ permission }) => {\n const { fields } = permission.properties;\n\n if (Array.isArray(fields) && isEmpty(fields)) {\n return false;\n }\n });\n\n return {\n get hooks() {\n return engineInstance.hooks;\n },\n\n /**\n * Generate an ability based on the given user (using associated roles & permissions)\n * @param user\n */\n async generateUserAbility(user: AdminUser): Promise<Ability> {\n const permissions = (await getService('permission').findUserPermissions(user)) as any;\n\n return engineInstance.generateAbility(permissions, user);\n },\n\n /**\n * Generate an ability based on an admin token's stored permissions, scoped to the owner.\n * Token permissions are already validated and ceiling-clamped at write time.\n */\n async generateTokenAbility(tokenPermissions: Permission[], owner: AdminUser): Promise<Ability> {\n return engineInstance.generateAbility(tokenPermissions as any, owner);\n },\n\n /**\n * Check many permissions based on an ability\n */\n checkMany: curry((ability: Ability, permissions: Permission[]) => {\n // @ts-expect-error - Permissions does not contain any field property\n return permissions.map(({ action, subject, field }) => ability.can(action, subject, field));\n }),\n };\n};\n"],"names":["params","providers","engineInstance","engine","new","on","permission","action","get","strapi","log","debug","properties","propertiesName","Object","keys","invalidProperties","difference","applyToProperties","permissionWithSanitizedProperties","reduce","property","permissionDomain","deleteProperty","fields","Array","isArray","isEmpty","hooks","generateUserAbility","user","permissions","getService","findUserPermissions","generateAbility","generateTokenAbility","tokenPermissions","owner","checkMany","curry","ability","map","subject","field","can"],"mappings":";;;;;AASA,6BAAe,CAAA,CAACA,MAAAA,GAAAA;IACd,MAAM,EAAEC,SAAS,EAAE,GAAGD,MAAAA;IAEtB,MAAME,cAAAA,GAAiBC,MAAAA,CACpBC,GAAG,CAAC;AAAEH,QAAAA;KAAU,CACjB;;AAEC,SACAI,EAAE,CAAC,oCAAA,EAAsC,CAAC,EAAEC,UAAU,EAAE,GAAA;AACvD,QAAA,MAAMC,SAASN,SAAAA,CAAUM,MAAM,CAACC,GAAG,CAACF,WAAWC,MAAM,CAAA;;AAGrD,QAAA,IAAI,CAACA,MAAAA,EAAQ;YACXE,MAAAA,CAAOC,GAAG,CAACC,KAAK,CACd,CAAC,gBAAgB,EAAEL,UAAAA,CAAWC,MAAM,CAAC,sDAAsD,CAAC,CAAA;YAE9F,OAAO,KAAA;AACT,QAAA;IACF,CAAA,CAEA;;SAGCF,EAAE,CAAC,mBAAA,EAAqB,CAACC,UAAAA,GAAAA;AACxB,QAAA,MAAMC,SAASN,SAAAA,CAAUM,MAAM,CAACC,GAAG,CAACF,WAAWC,MAAM,CAAA;AACrD,QAAA,MAAMK,UAAAA,GAAaN,UAAAA,CAAWM,UAAU,IAAI,EAAC;;QAG7C,MAAMC,cAAAA,GAAiBC,MAAAA,CAAOC,IAAI,CAACH,UAAAA,CAAAA;QACnC,MAAMI,iBAAAA,GAAoBC,UAAAA,CACxBJ,cAAAA;AAEAN,QAAAA,MAAAA,CAAOW,iBAAiB,IAAIL,cAAAA,CAAAA;AAG9B,QAAA,MAAMM,iCAAAA,GAAoCH,iBAAAA,CAAkBI,MAAM;AAEhE,QAAA,CAACC,QAAAA,GAAaC,gBAAAA,CAAiBC,cAAc,CAACF,UAAUf,UAAAA,CAAAA,EACxDA,UAAAA,CAAAA;QAGF,OAAOa,iCAAAA;IACT,CAAA,CAEA;;AAEC,SACAd,EAAE,CAAC,mCAAA,EAAqC,CAAC,EAAEC,UAAU,EAAE,GAAA;AACtD,QAAA,MAAM,EAAEkB,MAAM,EAAE,GAAGlB,WAAWM,UAAU;AAExC,QAAA,IAAIa,KAAAA,CAAMC,OAAO,CAACF,MAAAA,CAAAA,IAAWG,QAAQH,MAAAA,CAAAA,EAAS;YAC5C,OAAO,KAAA;AACT,QAAA;AACF,IAAA,CAAA,CAAA;IAEF,OAAO;AACL,QAAA,IAAII,KAAAA,CAAAA,GAAQ;AACV,YAAA,OAAO1B,eAAe0B,KAAK;AAC7B,QAAA,CAAA;AAEA;;;QAIA,MAAMC,qBAAoBC,IAAe,EAAA;AACvC,YAAA,MAAMC,WAAAA,GAAe,MAAMC,UAAAA,CAAW,YAAA,CAAA,CAAcC,mBAAmB,CAACH,IAAAA,CAAAA;YAExE,OAAO5B,cAAAA,CAAegC,eAAe,CAACH,WAAAA,EAAaD,IAAAA,CAAAA;AACrD,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMK,oBAAAA,CAAAA,CAAqBC,gBAA8B,EAAEC,KAAgB,EAAA;YACzE,OAAOnC,cAAAA,CAAegC,eAAe,CAACE,gBAAAA,EAAyBC,KAAAA,CAAAA;AACjE,QAAA,CAAA;AAEA;;QAGAC,SAAAA,EAAWC,KAAAA,CAAM,CAACC,OAAAA,EAAkBT,WAAAA,GAAAA;;AAElC,YAAA,OAAOA,YAAYU,GAAG,CAAC,CAAC,EAAElC,MAAM,EAAEmC,OAAO,EAAEC,KAAK,EAAE,GAAKH,OAAAA,CAAQI,GAAG,CAACrC,QAAQmC,OAAAA,EAASC,KAAAA,CAAAA,CAAAA;AACtF,QAAA,CAAA;AACF,KAAA;AACF,CAAA;;;;"}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var _ = require('lodash');
4
- var fp = require('lodash/fp');
5
4
  var ability = require('@casl/ability');
6
5
  var sanitize = require('./sanitize.js');
7
6
  var validate = require('./validate.js');
@@ -32,9 +31,9 @@ var index = (({ ability: ability$1, action, model })=>({
32
31
  },
33
32
  // eslint-disable-next-line @typescript-eslint/default-param-last
34
33
  addPermissionsQueryTo (query = {}, action) {
35
- const newQuery = fp.cloneDeep(query);
34
+ const newQuery = _.cloneDeep(query);
36
35
  const permissionQuery = this.getQuery(action) ?? undefined;
37
- if (fp.isPlainObject(query.filters)) {
36
+ if (_.isPlainObject(query.filters)) {
38
37
  newQuery.filters = permissionQuery ? {
39
38
  $and: [
40
39
  query.filters,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../../server/src/services/permission/permissions-manager/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { cloneDeep, isPlainObject } from 'lodash/fp';\nimport { subject as asSubject } from '@casl/ability';\nimport createSanitizeHelpers from './sanitize';\nimport createValidateHelpers from './validate';\n\nimport { buildStrapiQuery, buildCaslQuery } from './query-builders';\n\nexport default ({ ability, action, model }: any) => ({\n ability,\n action,\n model,\n\n get isAllowed(): unknown {\n return this.ability.can(action, model);\n },\n\n toSubject(target: any, subjectType = model) {\n return asSubject(subjectType, target);\n },\n\n pickPermittedFieldsOf(data: unknown, options = {}) {\n return this.sanitizeInput(data, options);\n },\n\n getQuery(queryAction = action) {\n if (_.isUndefined(queryAction)) {\n throw new Error('Action must be defined to build a permission query');\n }\n\n return buildStrapiQuery(buildCaslQuery(ability, queryAction, model));\n },\n\n // eslint-disable-next-line @typescript-eslint/default-param-last\n addPermissionsQueryTo(query = {} as any, action: unknown) {\n const newQuery = cloneDeep(query);\n const permissionQuery = this.getQuery(action) ?? undefined;\n\n if (isPlainObject(query.filters)) {\n newQuery.filters = permissionQuery\n ? { $and: [query.filters, permissionQuery] }\n : query.filters;\n } else {\n newQuery.filters = permissionQuery;\n }\n\n return newQuery;\n },\n\n ...createSanitizeHelpers({ action, ability, model }),\n ...createValidateHelpers({ action, ability, model }),\n});\n"],"names":["ability","action","model","isAllowed","can","toSubject","target","subjectType","asSubject","pickPermittedFieldsOf","data","options","sanitizeInput","getQuery","queryAction","_","isUndefined","Error","buildStrapiQuery","buildCaslQuery","addPermissionsQueryTo","query","newQuery","cloneDeep","permissionQuery","undefined","isPlainObject","filters","$and","createSanitizeHelpers","createValidateHelpers"],"mappings":";;;;;;;;;;;;;AAQA,YAAe,CAAA,CAAC,WAAEA,SAAO,EAAEC,MAAM,EAAEC,KAAK,EAAO,IAAM;AACnDF,iBAAAA,SAAAA;AACAC,QAAAA,MAAAA;AACAC,QAAAA,KAAAA;AAEA,QAAA,IAAIC,SAAAA,CAAAA,GAAqB;AACvB,YAAA,OAAO,IAAI,CAACH,OAAO,CAACI,GAAG,CAACH,MAAAA,EAAQC,KAAAA,CAAAA;AAClC,QAAA,CAAA;QAEAG,SAAAA,CAAAA,CAAUC,MAAW,EAAEC,WAAAA,GAAcL,KAAK,EAAA;AACxC,YAAA,OAAOM,gBAAUD,WAAAA,EAAaD,MAAAA,CAAAA;AAChC,QAAA,CAAA;AAEAG,QAAAA,qBAAAA,CAAAA,CAAsBC,IAAa,EAAEC,OAAAA,GAAU,EAAE,EAAA;AAC/C,YAAA,OAAO,IAAI,CAACC,aAAa,CAACF,IAAAA,EAAMC,OAAAA,CAAAA;AAClC,QAAA,CAAA;AAEAE,QAAAA,QAAAA,CAAAA,CAASC,cAAcb,MAAM,EAAA;YAC3B,IAAIc,kBAAAA,CAAEC,WAAW,CAACF,WAAAA,CAAAA,EAAc;AAC9B,gBAAA,MAAM,IAAIG,KAAAA,CAAM,oDAAA,CAAA;AAClB,YAAA;YAEA,OAAOC,8BAAAA,CAAiBC,4BAAAA,CAAenB,SAAAA,EAASc,WAAAA,EAAaZ,KAAAA,CAAAA,CAAAA;AAC/D,QAAA,CAAA;;AAGAkB,QAAAA,qBAAAA,CAAAA,CAAsBC,KAAAA,GAAQ,EAAS,EAAEpB,MAAe,EAAA;AACtD,YAAA,MAAMqB,WAAWC,YAAAA,CAAUF,KAAAA,CAAAA;AAC3B,YAAA,MAAMG,eAAAA,GAAkB,IAAI,CAACX,QAAQ,CAACZ,MAAAA,CAAAA,IAAWwB,SAAAA;YAEjD,IAAIC,gBAAAA,CAAcL,KAAAA,CAAMM,OAAO,CAAA,EAAG;gBAChCL,QAAAA,CAASK,OAAO,GAAGH,eAAAA,GACf;oBAAEI,IAAAA,EAAM;AAACP,wBAAAA,KAAAA,CAAMM,OAAO;AAAEH,wBAAAA;AAAgB;AAAC,iBAAA,GACzCH,MAAMM,OAAO;YACnB,CAAA,MAAO;AACLL,gBAAAA,QAAAA,CAASK,OAAO,GAAGH,eAAAA;AACrB,YAAA;YAEA,OAAOF,QAAAA;AACT,QAAA,CAAA;AAEA,QAAA,GAAGO,QAAAA,CAAsB;AAAE5B,YAAAA,MAAAA;AAAQD,qBAAAA,SAAAA;AAASE,YAAAA;SAAM,CAAE;AACpD,QAAA,GAAG4B,QAAAA,CAAsB;AAAE7B,YAAAA,MAAAA;AAAQD,qBAAAA,SAAAA;AAASE,YAAAA;SAAM;AACpD,KAAA,CAAC;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../../server/src/services/permission/permissions-manager/index.ts"],"sourcesContent":["import _, { cloneDeep, isPlainObject } from 'lodash';\n\nimport { subject as asSubject } from '@casl/ability';\nimport createSanitizeHelpers from './sanitize';\nimport createValidateHelpers from './validate';\n\nimport { buildStrapiQuery, buildCaslQuery } from './query-builders';\n\nexport default ({ ability, action, model }: any) => ({\n ability,\n action,\n model,\n\n get isAllowed(): unknown {\n return this.ability.can(action, model);\n },\n\n toSubject(target: any, subjectType = model) {\n return asSubject(subjectType, target);\n },\n\n pickPermittedFieldsOf(data: unknown, options = {}) {\n return this.sanitizeInput(data, options);\n },\n\n getQuery(queryAction = action) {\n if (_.isUndefined(queryAction)) {\n throw new Error('Action must be defined to build a permission query');\n }\n\n return buildStrapiQuery(buildCaslQuery(ability, queryAction, model));\n },\n\n // eslint-disable-next-line @typescript-eslint/default-param-last\n addPermissionsQueryTo(query = {} as any, action: unknown) {\n const newQuery = cloneDeep(query);\n const permissionQuery = this.getQuery(action) ?? undefined;\n\n if (isPlainObject(query.filters)) {\n newQuery.filters = permissionQuery\n ? { $and: [query.filters, permissionQuery] }\n : query.filters;\n } else {\n newQuery.filters = permissionQuery;\n }\n\n return newQuery;\n },\n\n ...createSanitizeHelpers({ action, ability, model }),\n ...createValidateHelpers({ action, ability, model }),\n});\n"],"names":["ability","action","model","isAllowed","can","toSubject","target","subjectType","asSubject","pickPermittedFieldsOf","data","options","sanitizeInput","getQuery","queryAction","_","isUndefined","Error","buildStrapiQuery","buildCaslQuery","addPermissionsQueryTo","query","newQuery","cloneDeep","permissionQuery","undefined","isPlainObject","filters","$and","createSanitizeHelpers","createValidateHelpers"],"mappings":";;;;;;;;;;;;AAQA,YAAe,CAAA,CAAC,WAAEA,SAAO,EAAEC,MAAM,EAAEC,KAAK,EAAO,IAAM;AACnDF,iBAAAA,SAAAA;AACAC,QAAAA,MAAAA;AACAC,QAAAA,KAAAA;AAEA,QAAA,IAAIC,SAAAA,CAAAA,GAAqB;AACvB,YAAA,OAAO,IAAI,CAACH,OAAO,CAACI,GAAG,CAACH,MAAAA,EAAQC,KAAAA,CAAAA;AAClC,QAAA,CAAA;QAEAG,SAAAA,CAAAA,CAAUC,MAAW,EAAEC,WAAAA,GAAcL,KAAK,EAAA;AACxC,YAAA,OAAOM,gBAAUD,WAAAA,EAAaD,MAAAA,CAAAA;AAChC,QAAA,CAAA;AAEAG,QAAAA,qBAAAA,CAAAA,CAAsBC,IAAa,EAAEC,OAAAA,GAAU,EAAE,EAAA;AAC/C,YAAA,OAAO,IAAI,CAACC,aAAa,CAACF,IAAAA,EAAMC,OAAAA,CAAAA;AAClC,QAAA,CAAA;AAEAE,QAAAA,QAAAA,CAAAA,CAASC,cAAcb,MAAM,EAAA;YAC3B,IAAIc,kBAAAA,CAAEC,WAAW,CAACF,WAAAA,CAAAA,EAAc;AAC9B,gBAAA,MAAM,IAAIG,KAAAA,CAAM,oDAAA,CAAA;AAClB,YAAA;YAEA,OAAOC,8BAAAA,CAAiBC,4BAAAA,CAAenB,SAAAA,EAASc,WAAAA,EAAaZ,KAAAA,CAAAA,CAAAA;AAC/D,QAAA,CAAA;;AAGAkB,QAAAA,qBAAAA,CAAAA,CAAsBC,KAAAA,GAAQ,EAAS,EAAEpB,MAAe,EAAA;AACtD,YAAA,MAAMqB,WAAWC,WAAAA,CAAUF,KAAAA,CAAAA;AAC3B,YAAA,MAAMG,eAAAA,GAAkB,IAAI,CAACX,QAAQ,CAACZ,MAAAA,CAAAA,IAAWwB,SAAAA;YAEjD,IAAIC,eAAAA,CAAcL,KAAAA,CAAMM,OAAO,CAAA,EAAG;gBAChCL,QAAAA,CAASK,OAAO,GAAGH,eAAAA,GACf;oBAAEI,IAAAA,EAAM;AAACP,wBAAAA,KAAAA,CAAMM,OAAO;AAAEH,wBAAAA;AAAgB;AAAC,iBAAA,GACzCH,MAAMM,OAAO;YACnB,CAAA,MAAO;AACLL,gBAAAA,QAAAA,CAASK,OAAO,GAAGH,eAAAA;AACrB,YAAA;YAEA,OAAOF,QAAAA;AACT,QAAA,CAAA;AAEA,QAAA,GAAGO,QAAAA,CAAsB;AAAE5B,YAAAA,MAAAA;AAAQD,qBAAAA,SAAAA;AAASE,YAAAA;SAAM,CAAE;AACpD,QAAA,GAAG4B,QAAAA,CAAsB;AAAE7B,YAAAA,MAAAA;AAAQD,qBAAAA,SAAAA;AAASE,YAAAA;SAAM;AACpD,KAAA,CAAC;;;;"}