@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":"getFetchClient.js","sources":["../../../../../admin/src/utils/getFetchClient.ts"],"sourcesContent":["import pipe from 'lodash/fp/pipe';\n// eslint-disable-next-line import/default\nimport qs from 'qs';\n\nimport { AUTH_COOKIE_NAME, getCookieValue, setCookie } from './cookies';\nimport { decodeAccessTokenExpiry } from './jwt';\n\nimport type { errors } from '@strapi/utils';\n\nexport type ApiError =\n | errors.ApplicationError\n | errors.ForbiddenError\n | errors.NotFoundError\n | errors.NotImplementedError\n | errors.PaginationError\n | errors.PayloadTooLargeError\n | errors.PolicyError\n | errors.RateLimitError\n | errors.UnauthorizedError\n | errors.ValidationError\n | errors.YupValidationError;\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n USER: 'userInfo',\n};\n\n/**\n * Module-level promise to ensure only one token refresh happens at a time\n */\nlet refreshPromise: Promise<string | null> | null = null;\n\n/**\n * Callback to notify the app when the token is updated (e.g., to update Redux state)\n */\nlet onTokenUpdate: ((token: string) => void) | null = null;\n\n/**\n * Callback to notify the app when the session has been terminated and the user\n * should be redirected to the login page (e.g., refresh token rejected, idle\n * session expired). The React layer registers a handler that clears local\n * auth state and navigates to /auth/login.\n */\nlet onSessionExpired: (() => void) | null = null;\n\n/**\n * A 401 after a failed refresh is delivered twice in the common RTK path\n * (baseQuery, then the store middleware). Concurrent in-flight queries can\n * add more. Fire the React handler once per dead session; re-arm when a new\n * token is stored (refresh or login).\n */\nlet sessionExpiredNotified = false;\n\n/**\n * Set the callback that will be called when the token is refreshed.\n * This allows the React layer to update Redux state when a token refresh occurs.\n *\n * @param callback - Function to call with the new token, or null to clear\n * @example\n * // In a React component\n * useEffect(() => {\n * setOnTokenUpdate((token) => dispatch(setToken(token)));\n * return () => setOnTokenUpdate(null);\n * }, [dispatch]);\n */\nconst setOnTokenUpdate = (callback: ((token: string) => void) | null): void => {\n onTokenUpdate = callback;\n};\n\n/**\n * Set the callback that will be called when the active session is no longer\n * valid — i.e. the server rejected the refresh token, not merely that the\n * short-lived access token expired. This lets the tab redirect to /auth/login\n * (after any unsaved-changes guard) rather than sitting on a dead session.\n *\n * @param callback - Function to call when the session ends, or null to clear\n */\nconst setOnSessionExpired = (callback: (() => void) | null): void => {\n onSessionExpired = callback;\n if (callback === null) {\n resetSessionExpiredNotification();\n }\n};\n\n/**\n * Re-arm session-expired notifications after a new access token is stored\n * (silent refresh) or after a successful login.\n */\nconst resetSessionExpiredNotification = (): void => {\n sessionExpiredNotified = false;\n};\n\n/**\n * Trigger the registered session-expired callback, if any. Safe to call from\n * non-React code (e.g., the RTK Query baseQuery 401 handler). Returns `false`\n * when nothing is listening, so callers can fall back to a hard redirect\n * instead of leaving the user on a dead page. Subsequent calls during the same\n * dead session return `true` without invoking the handler again.\n */\nconst triggerSessionExpired = (): boolean => {\n if (!onSessionExpired) {\n return false;\n }\n\n if (sessionExpiredNotified) {\n return true;\n }\n\n sessionExpiredNotified = true;\n onSessionExpired();\n return true;\n};\n\n/**\n * Check if the URL is an auth path that should not trigger token refresh.\n * Note: No ^ anchor since the URL may include the baseURL prefix (e.g., \"http://localhost:1337/admin/login\").\n * This differs from baseQuery.ts which uses ^/admin since it receives normalized paths.\n */\nconst isAuthPath = (url: string) => /\\/admin\\/(login|logout|access-token)\\b/.test(url);\n\n/**\n * Store the new token in the appropriate storage (localStorage or cookie)\n * and notify the app to update its state.\n *\n * Uses localStorage if the user selected \"remember me\" during login,\n * otherwise uses cookies for session-based storage.\n *\n * @param token - The JWT token to store\n * @internal Exported for testing purposes\n */\nconst storeToken = (token: string): void => {\n resetSessionExpiredNotification();\n\n // Check if the original token was stored in localStorage (persist mode)\n const wasPersistedToLocalStorage = Boolean(localStorage.getItem(STORAGE_KEYS.TOKEN));\n\n if (wasPersistedToLocalStorage) {\n localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));\n } else {\n setCookie(AUTH_COOKIE_NAME, token);\n }\n\n // Notify the app to update its state (e.g., Redux)\n if (onTokenUpdate) {\n onTokenUpdate(token);\n }\n};\n\nconst getToken = (): string | null => {\n const fromLocalStorage = localStorage.getItem(STORAGE_KEYS.TOKEN);\n if (fromLocalStorage) {\n return JSON.parse(fromLocalStorage);\n }\n\n const fromCookie = getCookieValue(AUTH_COOKIE_NAME);\n return fromCookie ?? null;\n};\n\nconst ADMIN_REFRESH_LOCK = 'strapi-admin-access-token';\nconst FALLBACK_ADOPT_TIMEOUT_MS = 250;\nconst FALLBACK_ADOPT_POLL_MS = 25;\n\nconst postAccessToken = (backendURL: string) =>\n fetch(`${backendURL}/admin/access-token`, {\n method: 'POST',\n credentials: 'include', // Include cookies for the refresh token\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n });\n\nconst adoptSharedAccessToken = (token: string): string => {\n resetSessionExpiredNotification();\n\n if (onTokenUpdate) {\n onTokenUpdate(token);\n }\n return token;\n};\n\n/**\n * Another tab may have refreshed already and written a newer access token to the\n * shared localStorage/cookie. Per-tab Redux is not visible here — only shared\n * storage counts.\n */\nconst readValidAccessTokenFromSharedStorage = (staleToken: string | null): string | null => {\n const stored = getToken();\n if (!stored || stored === staleToken) {\n return null;\n }\n\n const expiry = decodeAccessTokenExpiry(stored);\n if (expiry === null || expiry <= Date.now()) {\n return null;\n }\n\n return stored;\n};\n\nconst waitForSharedAccessToken = async (staleToken: string | null): Promise<string | null> => {\n const timeoutAt = Date.now() + FALLBACK_ADOPT_TIMEOUT_MS;\n\n while (Date.now() < timeoutAt) {\n await new Promise((resolve) => {\n setTimeout(resolve, FALLBACK_ADOPT_POLL_MS);\n });\n\n const adopted = readValidAccessTokenFromSharedStorage(staleToken);\n if (adopted) {\n return adoptSharedAccessToken(adopted);\n }\n }\n\n return null;\n};\n\nconst executeRefreshAccessToken = async (\n backendURL: string,\n tokenBeforeRefresh: string | null,\n { allowHttpRetry }: { allowHttpRetry: boolean }\n): Promise<string | null> => {\n const adopted = readValidAccessTokenFromSharedStorage(tokenBeforeRefresh);\n if (adopted) {\n return adoptSharedAccessToken(adopted);\n }\n\n let response = await postAccessToken(backendURL);\n\n if (response.status === 401 && allowHttpRetry) {\n const adoptedAfterFail = readValidAccessTokenFromSharedStorage(tokenBeforeRefresh);\n if (adoptedAfterFail) {\n return adoptSharedAccessToken(adoptedAfterFail);\n }\n\n const adoptedAfterWait = await waitForSharedAccessToken(tokenBeforeRefresh);\n if (adoptedAfterWait) {\n return adoptedAfterWait;\n }\n\n response = await postAccessToken(backendURL);\n }\n\n if (!response.ok) {\n console.warn('[Auth] Token refresh failed with status:', response.status);\n return null;\n }\n\n const result = await response.json();\n const token = result?.data?.token as string | undefined;\n\n if (!token) {\n console.warn('[Auth] Token refresh response missing token');\n return null;\n }\n\n storeToken(token);\n return token;\n};\n\n/**\n * Refresh the access token by calling the /admin/access-token endpoint.\n * This uses a low-level fetch to avoid recursion through the interceptor.\n * Returns the new token on success, or null on failure.\n */\nconst refreshAccessToken = async (\n tokenUsedByFailedRequest?: string | null\n): Promise<string | null> => {\n const backendURL = window.strapi.backendURL;\n const tokenBeforeRefresh = tokenUsedByFailedRequest ?? getToken();\n\n try {\n if (typeof navigator !== 'undefined' && navigator.locks?.request) {\n return await navigator.locks.request(ADMIN_REFRESH_LOCK, () =>\n executeRefreshAccessToken(backendURL, tokenBeforeRefresh, { allowHttpRetry: false })\n );\n }\n\n return await executeRefreshAccessToken(backendURL, tokenBeforeRefresh, {\n allowHttpRetry: true,\n });\n } catch (error) {\n console.error('[Auth] Token refresh error:', error);\n return null;\n }\n};\n\n/**\n * Attempt to refresh the token if not already refreshing.\n * Uses a module-level promise to prevent concurrent refresh requests.\n *\n * @returns The new authentication token\n * @throws {Error} If the token refresh fails (e.g., refresh token expired)\n * @internal Exported for testing purposes\n */\nconst attemptTokenRefresh = async (tokenUsedByFailedRequest?: string | null): Promise<string> => {\n if (!refreshPromise) {\n refreshPromise = refreshAccessToken(tokenUsedByFailedRequest).finally(() => {\n refreshPromise = null;\n });\n }\n\n const newToken = await refreshPromise;\n if (!newToken) {\n const error = new Error('Session expired. Please log in again.');\n error.name = 'TokenRefreshError';\n throw error;\n }\n\n return newToken;\n};\n\ntype FetchResponse<TData = unknown> = {\n data: TData;\n status?: number;\n headers?: Headers;\n};\n\ntype FetchOptions = {\n params?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n validateStatus?: ((status: number) => boolean) | null;\n responseType?: 'json' | 'blob' | 'text' | 'arrayBuffer';\n};\n\ntype FetchConfig = {\n signal?: AbortSignal;\n};\n\ninterface ErrorResponse {\n data: {\n data?: unknown;\n error: ApiError & { status?: number };\n };\n}\n\nclass FetchError extends Error {\n public name: string;\n public message: string;\n public response?: ErrorResponse;\n public code?: number;\n public status?: number;\n\n constructor(message: string, response?: ErrorResponse) {\n super(message);\n this.name = 'FetchError';\n this.message = message;\n this.response = response;\n this.code = response?.data?.error?.status;\n this.status = response?.data?.error?.status;\n\n // Ensure correct stack trace in error object\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FetchError);\n }\n }\n}\n\nconst isFetchError = (error: unknown): error is FetchError => {\n return error instanceof FetchError;\n};\n\ntype FetchClient = {\n get: {\n (url: string, config: FetchOptions & { responseType: 'blob' }): Promise<FetchResponse<Blob>>;\n (url: string, config: FetchOptions & { responseType: 'text' }): Promise<FetchResponse<string>>;\n (\n url: string,\n config: FetchOptions & { responseType: 'arrayBuffer' }\n ): Promise<FetchResponse<ArrayBuffer>>;\n <TData = unknown>(url: string, config?: FetchOptions): Promise<FetchResponse<TData>>;\n };\n put: <TData = unknown, TSend = unknown>(\n url: string,\n data?: TSend,\n config?: FetchOptions\n ) => Promise<FetchResponse<TData>>;\n post: <TData = unknown, TSend = unknown>(\n url: string,\n data?: TSend,\n config?: FetchOptions\n ) => Promise<FetchResponse<TData>>;\n del: <TData = unknown>(url: string, config?: FetchOptions) => Promise<FetchResponse<TData>>;\n};\n\n/**\n * @public\n * @param {FetchConfig} [defaultOptions={}] - Fetch Configs.\n * @returns {FetchClient} A fetch client object with methods for making HTTP requests.\n * @description This is an abstraction around the native fetch exposed by a function. It provides a simple interface to handle API calls\n * to the Strapi backend.\n * @example\n * ```tsx\n * import { getFetchClient } from '@strapi/admin/admin';\n *\n * const myFunct = () => {\n * const { get } = getFetchClient();\n * const requestURL = \"/some-endpoint\";\n *\n * const { data } = await get(requestURL);\n *\n * return data;\n * };\n * ```\n */\nconst getFetchClient = (defaultOptions: FetchConfig = {}): FetchClient => {\n const backendURL = window.strapi.backendURL;\n\n /**\n * Create default headers with the current token.\n * This is a function so we can get a fresh token after refresh.\n */\n const getDefaultHeaders = (token = getToken()) => ({\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n });\n\n const isFormDataRequest = (body: unknown) => body instanceof FormData;\n const addPrependingSlash = (url: string) => (url.charAt(0) !== '/' ? `/${url}` : url);\n\n // This regular expression matches a string that starts with either \"http://\" or \"https://\" or any other protocol name in lower case letters, followed by \"://\" and ends with anything else\n const hasProtocol = (url: string) => new RegExp('^(?:[a-z+]+:)?//', 'i').test(url);\n\n // Check if the url has a prepending slash, if not add a slash\n const normalizeUrl = (url: string) => (hasProtocol(url) ? url : addPrependingSlash(url));\n\n // Add a response interceptor to return the response\n const responseInterceptor = async <TData = unknown>(\n response: Response,\n validateStatus?: FetchOptions['validateStatus'],\n responseType: NonNullable<FetchOptions['responseType']> = 'json'\n ): Promise<FetchResponse<TData>> => {\n if (responseType !== 'json') {\n if (!response.ok && !validateStatus?.(response.status)) {\n const fetchError = new FetchError('Server Error');\n fetchError.status = response.status;\n throw fetchError;\n }\n\n let result: Blob | string | ArrayBuffer;\n if (responseType === 'blob') {\n result = await response.blob();\n } else if (responseType === 'text') {\n result = await response.text();\n } else {\n result = await response.arrayBuffer();\n }\n\n return { data: result as TData, status: response.status, headers: response.headers };\n }\n\n if (response.status === 204) {\n return { data: {} as TData, status: response.status };\n }\n\n try {\n const result = await response.json();\n\n if (!response.ok && result.error && !validateStatus?.(response.status)) {\n const fetchError = new FetchError(result.error.message, { data: result });\n fetchError.status = response.status;\n throw fetchError;\n }\n\n if (!response.ok && !validateStatus?.(response.status)) {\n const fetchError = new FetchError('Unknown Server Error');\n fetchError.status = response.status;\n throw fetchError;\n }\n\n return { data: result };\n } catch (error) {\n // An empty 200 body causes `response.json()` to throw a `SyntaxError`. We treat\n // it as success and return an empty payload. We match on `error.name` rather\n // than `instanceof SyntaxError` because constructor identity differs across JS\n // realms — a Response from a different realm (e.g. undici under jsdom in tests,\n // a service worker or iframe in browsers) throws a `SyntaxError` whose\n // constructor is not the same identity as the one this module closes over. Name\n // comparison is realm-agnostic.\n if ((error as Error | null)?.name === 'SyntaxError' && response.ok) {\n return { data: {}, status: response.status } as FetchResponse<TData>;\n } else {\n throw error;\n }\n }\n };\n\n /**\n * Execute a fetch request with automatic token refresh on 401 errors.\n * @param url - The request URL (used to check if it's an auth path)\n * @param executeRequest - Function that performs the fetch (called again on retry with fresh headers)\n */\n const withTokenRefresh = async <TData>(\n url: string,\n executeRequest: () => Promise<FetchResponse<TData>>,\n getRequestToken: () => string | null\n ): Promise<FetchResponse<TData>> => {\n try {\n return await executeRequest();\n } catch (error) {\n // Only attempt refresh for 401 errors on non-auth paths\n if (isFetchError(error) && error.status === 401 && !isAuthPath(url)) {\n try {\n await attemptTokenRefresh(getRequestToken());\n // Retry - executeRequest will call getDefaultHeaders() again, picking up the new token\n return await executeRequest();\n } catch {\n // If refresh fails, throw the original error\n throw error;\n }\n }\n throw error;\n }\n };\n\n const paramsSerializer =\n <Param = unknown>(params?: Param) =>\n (url: string) => {\n if (params) {\n if (typeof params === 'string') {\n return `${url}?${params}`;\n }\n\n /**\n * TODO V6: Encoding should be enabled in this step\n * So the rest of the app doesn't have to worry about it,\n * It's considered a breaking change because it impacts any API request, including the user's custom code\n */\n const serializedParams = qs.stringify(params, { encode: false });\n if (serializedParams) {\n return `${url}?${serializedParams}`;\n }\n return url;\n }\n return url;\n };\n\n const addBaseUrl = (url: Parameters<typeof fetch>[0]) => {\n return `${backendURL}${url}`;\n };\n\n /**\n * We use the factory method because the options\n * are unique to the individual request\n */\n const makeCreateRequestUrl = (options?: FetchOptions) =>\n pipe(normalizeUrl, addBaseUrl, paramsSerializer(options?.params));\n\n const fetchClient: FetchClient = {\n get: async <TData>(url: string, options?: FetchOptions): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n const responseType = options?.responseType ?? 'json';\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const { Authorization } = getDefaultHeaders(requestToken);\n\n // For non-JSON response types, omit content negotiation headers that imply JSON\n const defaultHeaders =\n responseType === 'json' ? getDefaultHeaders(requestToken) : { Authorization };\n\n const headers = new Headers({\n ...defaultHeaders,\n ...options?.headers,\n });\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'GET',\n credentials: 'include',\n headers,\n });\n\n return responseInterceptor<TData>(response, options?.validateStatus, responseType);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n post: async <TData, TSend = unknown>(\n url: string,\n data?: TSend,\n options?: FetchOptions\n ): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n /**\n * we have to remove the Content-Type value if it was a formData request\n * the browser will automatically set the header value\n */\n if (isFormDataRequest(data)) {\n headers.delete('Content-Type');\n }\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'POST',\n credentials: 'include',\n headers,\n body: isFormDataRequest(data) ? (data as FormData) : JSON.stringify(data),\n });\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n put: async <TData, TSend = unknown>(\n url: string,\n data?: TSend,\n options?: FetchOptions\n ): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n /**\n * we have to remove the Content-Type value if it was a formData request\n * the browser will automatically set the header value\n */\n if (isFormDataRequest(data)) {\n headers.delete('Content-Type');\n }\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'PUT',\n credentials: 'include',\n headers,\n body: isFormDataRequest(data) ? (data as FormData) : JSON.stringify(data),\n });\n\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n del: async <TData>(url: string, options?: FetchOptions): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'DELETE',\n credentials: 'include',\n headers,\n });\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n };\n\n return fetchClient;\n};\n\nexport {\n getFetchClient,\n isFetchError,\n FetchError,\n attemptTokenRefresh,\n refreshAccessToken,\n storeToken,\n setOnTokenUpdate,\n setOnSessionExpired,\n triggerSessionExpired,\n resetSessionExpiredNotification,\n ADMIN_REFRESH_LOCK,\n};\nexport type { FetchOptions, FetchResponse, FetchConfig, FetchClient, ErrorResponse };\n"],"names":["STORAGE_KEYS","TOKEN","refreshPromise","onTokenUpdate","onSessionExpired","sessionExpiredNotified","setOnTokenUpdate","callback","setOnSessionExpired","resetSessionExpiredNotification","triggerSessionExpired","isAuthPath","url","test","storeToken","token","wasPersistedToLocalStorage","Boolean","localStorage","getItem","setItem","JSON","stringify","setCookie","AUTH_COOKIE_NAME","getToken","fromLocalStorage","parse","fromCookie","getCookieValue","ADMIN_REFRESH_LOCK","FALLBACK_ADOPT_TIMEOUT_MS","FALLBACK_ADOPT_POLL_MS","postAccessToken","backendURL","fetch","method","credentials","headers","Accept","adoptSharedAccessToken","readValidAccessTokenFromSharedStorage","staleToken","stored","expiry","decodeAccessTokenExpiry","Date","now","waitForSharedAccessToken","timeoutAt","Promise","resolve","setTimeout","adopted","executeRefreshAccessToken","tokenBeforeRefresh","allowHttpRetry","response","status","adoptedAfterFail","adoptedAfterWait","ok","console","warn","result","json","data","refreshAccessToken","tokenUsedByFailedRequest","window","strapi","navigator","locks","request","error","attemptTokenRefresh","finally","newToken","Error","name","FetchError","message","code","captureStackTrace","isFetchError","getFetchClient","defaultOptions","getDefaultHeaders","Authorization","isFormDataRequest","body","FormData","addPrependingSlash","charAt","hasProtocol","RegExp","normalizeUrl","responseInterceptor","validateStatus","responseType","fetchError","blob","text","arrayBuffer","withTokenRefresh","executeRequest","getRequestToken","paramsSerializer","params","serializedParams","qs","encode","addBaseUrl","makeCreateRequestUrl","options","pipe","fetchClient","get","createRequestUrl","requestToken","defaultHeaders","Headers","signal","post","delete","put","del"],"mappings":"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"}
1
+ {"version":3,"file":"getFetchClient.js","sources":["../../../../../admin/src/utils/getFetchClient.ts"],"sourcesContent":["import flow from 'lodash/flow';\n// eslint-disable-next-line import/default\nimport qs from 'qs';\n\nimport { AUTH_COOKIE_NAME, getCookieValue, setCookie } from './cookies';\nimport { decodeAccessTokenExpiry } from './jwt';\n\nimport type { errors } from '@strapi/utils';\n\nexport type ApiError =\n | errors.ApplicationError\n | errors.ForbiddenError\n | errors.NotFoundError\n | errors.NotImplementedError\n | errors.PaginationError\n | errors.PayloadTooLargeError\n | errors.PolicyError\n | errors.RateLimitError\n | errors.UnauthorizedError\n | errors.ValidationError\n | errors.YupValidationError;\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n USER: 'userInfo',\n};\n\n/**\n * Module-level promise to ensure only one token refresh happens at a time\n */\nlet refreshPromise: Promise<string | null> | null = null;\n\n/**\n * Callback to notify the app when the token is updated (e.g., to update Redux state)\n */\nlet onTokenUpdate: ((token: string) => void) | null = null;\n\n/**\n * Callback to notify the app when the session has been terminated and the user\n * should be redirected to the login page (e.g., refresh token rejected, idle\n * session expired). The React layer registers a handler that clears local\n * auth state and navigates to /auth/login.\n */\nlet onSessionExpired: (() => void) | null = null;\n\n/**\n * A 401 after a failed refresh is delivered twice in the common RTK path\n * (baseQuery, then the store middleware). Concurrent in-flight queries can\n * add more. Fire the React handler once per dead session; re-arm when a new\n * token is stored (refresh or login).\n */\nlet sessionExpiredNotified = false;\n\n/**\n * Set the callback that will be called when the token is refreshed.\n * This allows the React layer to update Redux state when a token refresh occurs.\n *\n * @param callback - Function to call with the new token, or null to clear\n * @example\n * // In a React component\n * useEffect(() => {\n * setOnTokenUpdate((token) => dispatch(setToken(token)));\n * return () => setOnTokenUpdate(null);\n * }, [dispatch]);\n */\nconst setOnTokenUpdate = (callback: ((token: string) => void) | null): void => {\n onTokenUpdate = callback;\n};\n\n/**\n * Set the callback that will be called when the active session is no longer\n * valid — i.e. the server rejected the refresh token, not merely that the\n * short-lived access token expired. This lets the tab redirect to /auth/login\n * (after any unsaved-changes guard) rather than sitting on a dead session.\n *\n * @param callback - Function to call when the session ends, or null to clear\n */\nconst setOnSessionExpired = (callback: (() => void) | null): void => {\n onSessionExpired = callback;\n if (callback === null) {\n resetSessionExpiredNotification();\n }\n};\n\n/**\n * Re-arm session-expired notifications after a new access token is stored\n * (silent refresh) or after a successful login.\n */\nconst resetSessionExpiredNotification = (): void => {\n sessionExpiredNotified = false;\n};\n\n/**\n * Trigger the registered session-expired callback, if any. Safe to call from\n * non-React code (e.g., the RTK Query baseQuery 401 handler). Returns `false`\n * when nothing is listening, so callers can fall back to a hard redirect\n * instead of leaving the user on a dead page. Subsequent calls during the same\n * dead session return `true` without invoking the handler again.\n */\nconst triggerSessionExpired = (): boolean => {\n if (!onSessionExpired) {\n return false;\n }\n\n if (sessionExpiredNotified) {\n return true;\n }\n\n sessionExpiredNotified = true;\n onSessionExpired();\n return true;\n};\n\n/**\n * Check if the URL is an auth path that should not trigger token refresh.\n * Note: No ^ anchor since the URL may include the baseURL prefix (e.g., \"http://localhost:1337/admin/login\").\n * This differs from baseQuery.ts which uses ^/admin since it receives normalized paths.\n */\nconst isAuthPath = (url: string) => /\\/admin\\/(login|logout|access-token)\\b/.test(url);\n\n/**\n * Store the new token in the appropriate storage (localStorage or cookie)\n * and notify the app to update its state.\n *\n * Uses localStorage if the user selected \"remember me\" during login,\n * otherwise uses cookies for session-based storage.\n *\n * @param token - The JWT token to store\n * @internal Exported for testing purposes\n */\nconst storeToken = (token: string): void => {\n resetSessionExpiredNotification();\n\n // Check if the original token was stored in localStorage (persist mode)\n const wasPersistedToLocalStorage = Boolean(localStorage.getItem(STORAGE_KEYS.TOKEN));\n\n if (wasPersistedToLocalStorage) {\n localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));\n } else {\n setCookie(AUTH_COOKIE_NAME, token);\n }\n\n // Notify the app to update its state (e.g., Redux)\n if (onTokenUpdate) {\n onTokenUpdate(token);\n }\n};\n\nconst getToken = (): string | null => {\n const fromLocalStorage = localStorage.getItem(STORAGE_KEYS.TOKEN);\n if (fromLocalStorage) {\n return JSON.parse(fromLocalStorage);\n }\n\n const fromCookie = getCookieValue(AUTH_COOKIE_NAME);\n return fromCookie ?? null;\n};\n\nconst ADMIN_REFRESH_LOCK = 'strapi-admin-access-token';\nconst FALLBACK_ADOPT_TIMEOUT_MS = 250;\nconst FALLBACK_ADOPT_POLL_MS = 25;\n\nconst postAccessToken = (backendURL: string) =>\n fetch(`${backendURL}/admin/access-token`, {\n method: 'POST',\n credentials: 'include', // Include cookies for the refresh token\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n });\n\nconst adoptSharedAccessToken = (token: string): string => {\n resetSessionExpiredNotification();\n\n if (onTokenUpdate) {\n onTokenUpdate(token);\n }\n return token;\n};\n\n/**\n * Another tab may have refreshed already and written a newer access token to the\n * shared localStorage/cookie. Per-tab Redux is not visible here — only shared\n * storage counts.\n */\nconst readValidAccessTokenFromSharedStorage = (staleToken: string | null): string | null => {\n const stored = getToken();\n if (!stored || stored === staleToken) {\n return null;\n }\n\n const expiry = decodeAccessTokenExpiry(stored);\n if (expiry === null || expiry <= Date.now()) {\n return null;\n }\n\n return stored;\n};\n\nconst waitForSharedAccessToken = async (staleToken: string | null): Promise<string | null> => {\n const timeoutAt = Date.now() + FALLBACK_ADOPT_TIMEOUT_MS;\n\n while (Date.now() < timeoutAt) {\n await new Promise((resolve) => {\n setTimeout(resolve, FALLBACK_ADOPT_POLL_MS);\n });\n\n const adopted = readValidAccessTokenFromSharedStorage(staleToken);\n if (adopted) {\n return adoptSharedAccessToken(adopted);\n }\n }\n\n return null;\n};\n\nconst executeRefreshAccessToken = async (\n backendURL: string,\n tokenBeforeRefresh: string | null,\n { allowHttpRetry }: { allowHttpRetry: boolean }\n): Promise<string | null> => {\n const adopted = readValidAccessTokenFromSharedStorage(tokenBeforeRefresh);\n if (adopted) {\n return adoptSharedAccessToken(adopted);\n }\n\n let response = await postAccessToken(backendURL);\n\n if (response.status === 401 && allowHttpRetry) {\n const adoptedAfterFail = readValidAccessTokenFromSharedStorage(tokenBeforeRefresh);\n if (adoptedAfterFail) {\n return adoptSharedAccessToken(adoptedAfterFail);\n }\n\n const adoptedAfterWait = await waitForSharedAccessToken(tokenBeforeRefresh);\n if (adoptedAfterWait) {\n return adoptedAfterWait;\n }\n\n response = await postAccessToken(backendURL);\n }\n\n if (!response.ok) {\n console.warn('[Auth] Token refresh failed with status:', response.status);\n return null;\n }\n\n const result = await response.json();\n const token = result?.data?.token as string | undefined;\n\n if (!token) {\n console.warn('[Auth] Token refresh response missing token');\n return null;\n }\n\n storeToken(token);\n return token;\n};\n\n/**\n * Refresh the access token by calling the /admin/access-token endpoint.\n * This uses a low-level fetch to avoid recursion through the interceptor.\n * Returns the new token on success, or null on failure.\n */\nconst refreshAccessToken = async (\n tokenUsedByFailedRequest?: string | null\n): Promise<string | null> => {\n const backendURL = window.strapi.backendURL;\n const tokenBeforeRefresh = tokenUsedByFailedRequest ?? getToken();\n\n try {\n if (typeof navigator !== 'undefined' && navigator.locks?.request) {\n return await navigator.locks.request(ADMIN_REFRESH_LOCK, () =>\n executeRefreshAccessToken(backendURL, tokenBeforeRefresh, { allowHttpRetry: false })\n );\n }\n\n return await executeRefreshAccessToken(backendURL, tokenBeforeRefresh, {\n allowHttpRetry: true,\n });\n } catch (error) {\n console.error('[Auth] Token refresh error:', error);\n return null;\n }\n};\n\n/**\n * Attempt to refresh the token if not already refreshing.\n * Uses a module-level promise to prevent concurrent refresh requests.\n *\n * @returns The new authentication token\n * @throws {Error} If the token refresh fails (e.g., refresh token expired)\n * @internal Exported for testing purposes\n */\nconst attemptTokenRefresh = async (tokenUsedByFailedRequest?: string | null): Promise<string> => {\n if (!refreshPromise) {\n refreshPromise = refreshAccessToken(tokenUsedByFailedRequest).finally(() => {\n refreshPromise = null;\n });\n }\n\n const newToken = await refreshPromise;\n if (!newToken) {\n const error = new Error('Session expired. Please log in again.');\n error.name = 'TokenRefreshError';\n throw error;\n }\n\n return newToken;\n};\n\ntype FetchResponse<TData = unknown> = {\n data: TData;\n status?: number;\n headers?: Headers;\n};\n\ntype FetchOptions = {\n params?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n validateStatus?: ((status: number) => boolean) | null;\n responseType?: 'json' | 'blob' | 'text' | 'arrayBuffer';\n};\n\ntype FetchConfig = {\n signal?: AbortSignal;\n};\n\ninterface ErrorResponse {\n data: {\n data?: unknown;\n error: ApiError & { status?: number };\n };\n}\n\nclass FetchError extends Error {\n public name: string;\n public message: string;\n public response?: ErrorResponse;\n public code?: number;\n public status?: number;\n\n constructor(message: string, response?: ErrorResponse) {\n super(message);\n this.name = 'FetchError';\n this.message = message;\n this.response = response;\n this.code = response?.data?.error?.status;\n this.status = response?.data?.error?.status;\n\n // Ensure correct stack trace in error object\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FetchError);\n }\n }\n}\n\nconst isFetchError = (error: unknown): error is FetchError => {\n return error instanceof FetchError;\n};\n\ntype FetchClient = {\n get: {\n (url: string, config: FetchOptions & { responseType: 'blob' }): Promise<FetchResponse<Blob>>;\n (url: string, config: FetchOptions & { responseType: 'text' }): Promise<FetchResponse<string>>;\n (\n url: string,\n config: FetchOptions & { responseType: 'arrayBuffer' }\n ): Promise<FetchResponse<ArrayBuffer>>;\n <TData = unknown>(url: string, config?: FetchOptions): Promise<FetchResponse<TData>>;\n };\n put: <TData = unknown, TSend = unknown>(\n url: string,\n data?: TSend,\n config?: FetchOptions\n ) => Promise<FetchResponse<TData>>;\n post: <TData = unknown, TSend = unknown>(\n url: string,\n data?: TSend,\n config?: FetchOptions\n ) => Promise<FetchResponse<TData>>;\n del: <TData = unknown>(url: string, config?: FetchOptions) => Promise<FetchResponse<TData>>;\n};\n\n/**\n * @public\n * @param {FetchConfig} [defaultOptions={}] - Fetch Configs.\n * @returns {FetchClient} A fetch client object with methods for making HTTP requests.\n * @description This is an abstraction around the native fetch exposed by a function. It provides a simple interface to handle API calls\n * to the Strapi backend.\n * @example\n * ```tsx\n * import { getFetchClient } from '@strapi/admin/admin';\n *\n * const myFunct = () => {\n * const { get } = getFetchClient();\n * const requestURL = \"/some-endpoint\";\n *\n * const { data } = await get(requestURL);\n *\n * return data;\n * };\n * ```\n */\nconst getFetchClient = (defaultOptions: FetchConfig = {}): FetchClient => {\n const backendURL = window.strapi.backendURL;\n\n /**\n * Create default headers with the current token.\n * This is a function so we can get a fresh token after refresh.\n */\n const getDefaultHeaders = (token = getToken()) => ({\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n });\n\n const isFormDataRequest = (body: unknown) => body instanceof FormData;\n const addPrependingSlash = (url: string) => (url.charAt(0) !== '/' ? `/${url}` : url);\n\n // This regular expression matches a string that starts with either \"http://\" or \"https://\" or any other protocol name in lower case letters, followed by \"://\" and ends with anything else\n const hasProtocol = (url: string) => new RegExp('^(?:[a-z+]+:)?//', 'i').test(url);\n\n // Check if the url has a prepending slash, if not add a slash\n const normalizeUrl = (url: string) => (hasProtocol(url) ? url : addPrependingSlash(url));\n\n // Add a response interceptor to return the response\n const responseInterceptor = async <TData = unknown>(\n response: Response,\n validateStatus?: FetchOptions['validateStatus'],\n responseType: NonNullable<FetchOptions['responseType']> = 'json'\n ): Promise<FetchResponse<TData>> => {\n if (responseType !== 'json') {\n if (!response.ok && !validateStatus?.(response.status)) {\n const fetchError = new FetchError('Server Error');\n fetchError.status = response.status;\n throw fetchError;\n }\n\n let result: Blob | string | ArrayBuffer;\n if (responseType === 'blob') {\n result = await response.blob();\n } else if (responseType === 'text') {\n result = await response.text();\n } else {\n result = await response.arrayBuffer();\n }\n\n return { data: result as TData, status: response.status, headers: response.headers };\n }\n\n if (response.status === 204) {\n return { data: {} as TData, status: response.status };\n }\n\n try {\n const result = await response.json();\n\n if (!response.ok && result.error && !validateStatus?.(response.status)) {\n const fetchError = new FetchError(result.error.message, { data: result });\n fetchError.status = response.status;\n throw fetchError;\n }\n\n if (!response.ok && !validateStatus?.(response.status)) {\n const fetchError = new FetchError('Unknown Server Error');\n fetchError.status = response.status;\n throw fetchError;\n }\n\n return { data: result };\n } catch (error) {\n // An empty 200 body causes `response.json()` to throw a `SyntaxError`. We treat\n // it as success and return an empty payload. We match on `error.name` rather\n // than `instanceof SyntaxError` because constructor identity differs across JS\n // realms — a Response from a different realm (e.g. undici under jsdom in tests,\n // a service worker or iframe in browsers) throws a `SyntaxError` whose\n // constructor is not the same identity as the one this module closes over. Name\n // comparison is realm-agnostic.\n if ((error as Error | null)?.name === 'SyntaxError' && response.ok) {\n return { data: {}, status: response.status } as FetchResponse<TData>;\n } else {\n throw error;\n }\n }\n };\n\n /**\n * Execute a fetch request with automatic token refresh on 401 errors.\n * @param url - The request URL (used to check if it's an auth path)\n * @param executeRequest - Function that performs the fetch (called again on retry with fresh headers)\n */\n const withTokenRefresh = async <TData>(\n url: string,\n executeRequest: () => Promise<FetchResponse<TData>>,\n getRequestToken: () => string | null\n ): Promise<FetchResponse<TData>> => {\n try {\n return await executeRequest();\n } catch (error) {\n // Only attempt refresh for 401 errors on non-auth paths\n if (isFetchError(error) && error.status === 401 && !isAuthPath(url)) {\n try {\n await attemptTokenRefresh(getRequestToken());\n // Retry - executeRequest will call getDefaultHeaders() again, picking up the new token\n return await executeRequest();\n } catch {\n // If refresh fails, throw the original error\n throw error;\n }\n }\n throw error;\n }\n };\n\n const paramsSerializer =\n <Param = unknown>(params?: Param) =>\n (url: string) => {\n if (params) {\n if (typeof params === 'string') {\n return `${url}?${params}`;\n }\n\n /**\n * TODO V6: Encoding should be enabled in this step\n * So the rest of the app doesn't have to worry about it,\n * It's considered a breaking change because it impacts any API request, including the user's custom code\n */\n const serializedParams = qs.stringify(params, { encode: false });\n if (serializedParams) {\n return `${url}?${serializedParams}`;\n }\n return url;\n }\n return url;\n };\n\n const addBaseUrl = (url: Parameters<typeof fetch>[0]) => {\n return `${backendURL}${url}`;\n };\n\n /**\n * We use the factory method because the options\n * are unique to the individual request\n */\n const makeCreateRequestUrl = (options?: FetchOptions) =>\n flow(normalizeUrl, addBaseUrl, paramsSerializer(options?.params));\n\n const fetchClient: FetchClient = {\n get: async <TData>(url: string, options?: FetchOptions): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n const responseType = options?.responseType ?? 'json';\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const { Authorization } = getDefaultHeaders(requestToken);\n\n // For non-JSON response types, omit content negotiation headers that imply JSON\n const defaultHeaders =\n responseType === 'json' ? getDefaultHeaders(requestToken) : { Authorization };\n\n const headers = new Headers({\n ...defaultHeaders,\n ...options?.headers,\n });\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'GET',\n credentials: 'include',\n headers,\n });\n\n return responseInterceptor<TData>(response, options?.validateStatus, responseType);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n post: async <TData, TSend = unknown>(\n url: string,\n data?: TSend,\n options?: FetchOptions\n ): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n /**\n * we have to remove the Content-Type value if it was a formData request\n * the browser will automatically set the header value\n */\n if (isFormDataRequest(data)) {\n headers.delete('Content-Type');\n }\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'POST',\n credentials: 'include',\n headers,\n body: isFormDataRequest(data) ? (data as FormData) : JSON.stringify(data),\n });\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n put: async <TData, TSend = unknown>(\n url: string,\n data?: TSend,\n options?: FetchOptions\n ): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n /**\n * we have to remove the Content-Type value if it was a formData request\n * the browser will automatically set the header value\n */\n if (isFormDataRequest(data)) {\n headers.delete('Content-Type');\n }\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'PUT',\n credentials: 'include',\n headers,\n body: isFormDataRequest(data) ? (data as FormData) : JSON.stringify(data),\n });\n\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n del: async <TData>(url: string, options?: FetchOptions): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'DELETE',\n credentials: 'include',\n headers,\n });\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n };\n\n return fetchClient;\n};\n\nexport {\n getFetchClient,\n isFetchError,\n FetchError,\n attemptTokenRefresh,\n refreshAccessToken,\n storeToken,\n setOnTokenUpdate,\n setOnSessionExpired,\n triggerSessionExpired,\n resetSessionExpiredNotification,\n ADMIN_REFRESH_LOCK,\n};\nexport type { FetchOptions, FetchResponse, FetchConfig, FetchClient, ErrorResponse };\n"],"names":["STORAGE_KEYS","TOKEN","refreshPromise","onTokenUpdate","onSessionExpired","sessionExpiredNotified","setOnTokenUpdate","callback","setOnSessionExpired","resetSessionExpiredNotification","triggerSessionExpired","isAuthPath","url","test","storeToken","token","wasPersistedToLocalStorage","Boolean","localStorage","getItem","setItem","JSON","stringify","setCookie","AUTH_COOKIE_NAME","getToken","fromLocalStorage","parse","fromCookie","getCookieValue","ADMIN_REFRESH_LOCK","FALLBACK_ADOPT_TIMEOUT_MS","FALLBACK_ADOPT_POLL_MS","postAccessToken","backendURL","fetch","method","credentials","headers","Accept","adoptSharedAccessToken","readValidAccessTokenFromSharedStorage","staleToken","stored","expiry","decodeAccessTokenExpiry","Date","now","waitForSharedAccessToken","timeoutAt","Promise","resolve","setTimeout","adopted","executeRefreshAccessToken","tokenBeforeRefresh","allowHttpRetry","response","status","adoptedAfterFail","adoptedAfterWait","ok","console","warn","result","json","data","refreshAccessToken","tokenUsedByFailedRequest","window","strapi","navigator","locks","request","error","attemptTokenRefresh","finally","newToken","Error","name","FetchError","message","code","captureStackTrace","isFetchError","getFetchClient","defaultOptions","getDefaultHeaders","Authorization","isFormDataRequest","body","FormData","addPrependingSlash","charAt","hasProtocol","RegExp","normalizeUrl","responseInterceptor","validateStatus","responseType","fetchError","blob","text","arrayBuffer","withTokenRefresh","executeRequest","getRequestToken","paramsSerializer","params","serializedParams","qs","encode","addBaseUrl","makeCreateRequestUrl","options","flow","fetchClient","get","createRequestUrl","requestToken","defaultHeaders","Headers","signal","post","delete","put","del"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import pipe from 'lodash/fp/pipe';
1
+ import flow from 'lodash/flow';
2
2
  import qs__default from 'qs';
3
3
  import { getCookieValue, setCookie, AUTH_COOKIE_NAME } from './cookies.mjs';
4
4
  import { decodeAccessTokenExpiry } from './jwt.mjs';
@@ -389,7 +389,7 @@ const isFetchError = (error)=>{
389
389
  /**
390
390
  * We use the factory method because the options
391
391
  * are unique to the individual request
392
- */ const makeCreateRequestUrl = (options)=>pipe(normalizeUrl, addBaseUrl, paramsSerializer(options?.params));
392
+ */ const makeCreateRequestUrl = (options)=>flow(normalizeUrl, addBaseUrl, paramsSerializer(options?.params));
393
393
  const fetchClient = {
394
394
  get: async (url, options)=>{
395
395
  const createRequestUrl = makeCreateRequestUrl(options);
@@ -1 +1 @@
1
- {"version":3,"file":"getFetchClient.mjs","sources":["../../../../../admin/src/utils/getFetchClient.ts"],"sourcesContent":["import pipe from 'lodash/fp/pipe';\n// eslint-disable-next-line import/default\nimport qs from 'qs';\n\nimport { AUTH_COOKIE_NAME, getCookieValue, setCookie } from './cookies';\nimport { decodeAccessTokenExpiry } from './jwt';\n\nimport type { errors } from '@strapi/utils';\n\nexport type ApiError =\n | errors.ApplicationError\n | errors.ForbiddenError\n | errors.NotFoundError\n | errors.NotImplementedError\n | errors.PaginationError\n | errors.PayloadTooLargeError\n | errors.PolicyError\n | errors.RateLimitError\n | errors.UnauthorizedError\n | errors.ValidationError\n | errors.YupValidationError;\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n USER: 'userInfo',\n};\n\n/**\n * Module-level promise to ensure only one token refresh happens at a time\n */\nlet refreshPromise: Promise<string | null> | null = null;\n\n/**\n * Callback to notify the app when the token is updated (e.g., to update Redux state)\n */\nlet onTokenUpdate: ((token: string) => void) | null = null;\n\n/**\n * Callback to notify the app when the session has been terminated and the user\n * should be redirected to the login page (e.g., refresh token rejected, idle\n * session expired). The React layer registers a handler that clears local\n * auth state and navigates to /auth/login.\n */\nlet onSessionExpired: (() => void) | null = null;\n\n/**\n * A 401 after a failed refresh is delivered twice in the common RTK path\n * (baseQuery, then the store middleware). Concurrent in-flight queries can\n * add more. Fire the React handler once per dead session; re-arm when a new\n * token is stored (refresh or login).\n */\nlet sessionExpiredNotified = false;\n\n/**\n * Set the callback that will be called when the token is refreshed.\n * This allows the React layer to update Redux state when a token refresh occurs.\n *\n * @param callback - Function to call with the new token, or null to clear\n * @example\n * // In a React component\n * useEffect(() => {\n * setOnTokenUpdate((token) => dispatch(setToken(token)));\n * return () => setOnTokenUpdate(null);\n * }, [dispatch]);\n */\nconst setOnTokenUpdate = (callback: ((token: string) => void) | null): void => {\n onTokenUpdate = callback;\n};\n\n/**\n * Set the callback that will be called when the active session is no longer\n * valid — i.e. the server rejected the refresh token, not merely that the\n * short-lived access token expired. This lets the tab redirect to /auth/login\n * (after any unsaved-changes guard) rather than sitting on a dead session.\n *\n * @param callback - Function to call when the session ends, or null to clear\n */\nconst setOnSessionExpired = (callback: (() => void) | null): void => {\n onSessionExpired = callback;\n if (callback === null) {\n resetSessionExpiredNotification();\n }\n};\n\n/**\n * Re-arm session-expired notifications after a new access token is stored\n * (silent refresh) or after a successful login.\n */\nconst resetSessionExpiredNotification = (): void => {\n sessionExpiredNotified = false;\n};\n\n/**\n * Trigger the registered session-expired callback, if any. Safe to call from\n * non-React code (e.g., the RTK Query baseQuery 401 handler). Returns `false`\n * when nothing is listening, so callers can fall back to a hard redirect\n * instead of leaving the user on a dead page. Subsequent calls during the same\n * dead session return `true` without invoking the handler again.\n */\nconst triggerSessionExpired = (): boolean => {\n if (!onSessionExpired) {\n return false;\n }\n\n if (sessionExpiredNotified) {\n return true;\n }\n\n sessionExpiredNotified = true;\n onSessionExpired();\n return true;\n};\n\n/**\n * Check if the URL is an auth path that should not trigger token refresh.\n * Note: No ^ anchor since the URL may include the baseURL prefix (e.g., \"http://localhost:1337/admin/login\").\n * This differs from baseQuery.ts which uses ^/admin since it receives normalized paths.\n */\nconst isAuthPath = (url: string) => /\\/admin\\/(login|logout|access-token)\\b/.test(url);\n\n/**\n * Store the new token in the appropriate storage (localStorage or cookie)\n * and notify the app to update its state.\n *\n * Uses localStorage if the user selected \"remember me\" during login,\n * otherwise uses cookies for session-based storage.\n *\n * @param token - The JWT token to store\n * @internal Exported for testing purposes\n */\nconst storeToken = (token: string): void => {\n resetSessionExpiredNotification();\n\n // Check if the original token was stored in localStorage (persist mode)\n const wasPersistedToLocalStorage = Boolean(localStorage.getItem(STORAGE_KEYS.TOKEN));\n\n if (wasPersistedToLocalStorage) {\n localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));\n } else {\n setCookie(AUTH_COOKIE_NAME, token);\n }\n\n // Notify the app to update its state (e.g., Redux)\n if (onTokenUpdate) {\n onTokenUpdate(token);\n }\n};\n\nconst getToken = (): string | null => {\n const fromLocalStorage = localStorage.getItem(STORAGE_KEYS.TOKEN);\n if (fromLocalStorage) {\n return JSON.parse(fromLocalStorage);\n }\n\n const fromCookie = getCookieValue(AUTH_COOKIE_NAME);\n return fromCookie ?? null;\n};\n\nconst ADMIN_REFRESH_LOCK = 'strapi-admin-access-token';\nconst FALLBACK_ADOPT_TIMEOUT_MS = 250;\nconst FALLBACK_ADOPT_POLL_MS = 25;\n\nconst postAccessToken = (backendURL: string) =>\n fetch(`${backendURL}/admin/access-token`, {\n method: 'POST',\n credentials: 'include', // Include cookies for the refresh token\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n });\n\nconst adoptSharedAccessToken = (token: string): string => {\n resetSessionExpiredNotification();\n\n if (onTokenUpdate) {\n onTokenUpdate(token);\n }\n return token;\n};\n\n/**\n * Another tab may have refreshed already and written a newer access token to the\n * shared localStorage/cookie. Per-tab Redux is not visible here — only shared\n * storage counts.\n */\nconst readValidAccessTokenFromSharedStorage = (staleToken: string | null): string | null => {\n const stored = getToken();\n if (!stored || stored === staleToken) {\n return null;\n }\n\n const expiry = decodeAccessTokenExpiry(stored);\n if (expiry === null || expiry <= Date.now()) {\n return null;\n }\n\n return stored;\n};\n\nconst waitForSharedAccessToken = async (staleToken: string | null): Promise<string | null> => {\n const timeoutAt = Date.now() + FALLBACK_ADOPT_TIMEOUT_MS;\n\n while (Date.now() < timeoutAt) {\n await new Promise((resolve) => {\n setTimeout(resolve, FALLBACK_ADOPT_POLL_MS);\n });\n\n const adopted = readValidAccessTokenFromSharedStorage(staleToken);\n if (adopted) {\n return adoptSharedAccessToken(adopted);\n }\n }\n\n return null;\n};\n\nconst executeRefreshAccessToken = async (\n backendURL: string,\n tokenBeforeRefresh: string | null,\n { allowHttpRetry }: { allowHttpRetry: boolean }\n): Promise<string | null> => {\n const adopted = readValidAccessTokenFromSharedStorage(tokenBeforeRefresh);\n if (adopted) {\n return adoptSharedAccessToken(adopted);\n }\n\n let response = await postAccessToken(backendURL);\n\n if (response.status === 401 && allowHttpRetry) {\n const adoptedAfterFail = readValidAccessTokenFromSharedStorage(tokenBeforeRefresh);\n if (adoptedAfterFail) {\n return adoptSharedAccessToken(adoptedAfterFail);\n }\n\n const adoptedAfterWait = await waitForSharedAccessToken(tokenBeforeRefresh);\n if (adoptedAfterWait) {\n return adoptedAfterWait;\n }\n\n response = await postAccessToken(backendURL);\n }\n\n if (!response.ok) {\n console.warn('[Auth] Token refresh failed with status:', response.status);\n return null;\n }\n\n const result = await response.json();\n const token = result?.data?.token as string | undefined;\n\n if (!token) {\n console.warn('[Auth] Token refresh response missing token');\n return null;\n }\n\n storeToken(token);\n return token;\n};\n\n/**\n * Refresh the access token by calling the /admin/access-token endpoint.\n * This uses a low-level fetch to avoid recursion through the interceptor.\n * Returns the new token on success, or null on failure.\n */\nconst refreshAccessToken = async (\n tokenUsedByFailedRequest?: string | null\n): Promise<string | null> => {\n const backendURL = window.strapi.backendURL;\n const tokenBeforeRefresh = tokenUsedByFailedRequest ?? getToken();\n\n try {\n if (typeof navigator !== 'undefined' && navigator.locks?.request) {\n return await navigator.locks.request(ADMIN_REFRESH_LOCK, () =>\n executeRefreshAccessToken(backendURL, tokenBeforeRefresh, { allowHttpRetry: false })\n );\n }\n\n return await executeRefreshAccessToken(backendURL, tokenBeforeRefresh, {\n allowHttpRetry: true,\n });\n } catch (error) {\n console.error('[Auth] Token refresh error:', error);\n return null;\n }\n};\n\n/**\n * Attempt to refresh the token if not already refreshing.\n * Uses a module-level promise to prevent concurrent refresh requests.\n *\n * @returns The new authentication token\n * @throws {Error} If the token refresh fails (e.g., refresh token expired)\n * @internal Exported for testing purposes\n */\nconst attemptTokenRefresh = async (tokenUsedByFailedRequest?: string | null): Promise<string> => {\n if (!refreshPromise) {\n refreshPromise = refreshAccessToken(tokenUsedByFailedRequest).finally(() => {\n refreshPromise = null;\n });\n }\n\n const newToken = await refreshPromise;\n if (!newToken) {\n const error = new Error('Session expired. Please log in again.');\n error.name = 'TokenRefreshError';\n throw error;\n }\n\n return newToken;\n};\n\ntype FetchResponse<TData = unknown> = {\n data: TData;\n status?: number;\n headers?: Headers;\n};\n\ntype FetchOptions = {\n params?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n validateStatus?: ((status: number) => boolean) | null;\n responseType?: 'json' | 'blob' | 'text' | 'arrayBuffer';\n};\n\ntype FetchConfig = {\n signal?: AbortSignal;\n};\n\ninterface ErrorResponse {\n data: {\n data?: unknown;\n error: ApiError & { status?: number };\n };\n}\n\nclass FetchError extends Error {\n public name: string;\n public message: string;\n public response?: ErrorResponse;\n public code?: number;\n public status?: number;\n\n constructor(message: string, response?: ErrorResponse) {\n super(message);\n this.name = 'FetchError';\n this.message = message;\n this.response = response;\n this.code = response?.data?.error?.status;\n this.status = response?.data?.error?.status;\n\n // Ensure correct stack trace in error object\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FetchError);\n }\n }\n}\n\nconst isFetchError = (error: unknown): error is FetchError => {\n return error instanceof FetchError;\n};\n\ntype FetchClient = {\n get: {\n (url: string, config: FetchOptions & { responseType: 'blob' }): Promise<FetchResponse<Blob>>;\n (url: string, config: FetchOptions & { responseType: 'text' }): Promise<FetchResponse<string>>;\n (\n url: string,\n config: FetchOptions & { responseType: 'arrayBuffer' }\n ): Promise<FetchResponse<ArrayBuffer>>;\n <TData = unknown>(url: string, config?: FetchOptions): Promise<FetchResponse<TData>>;\n };\n put: <TData = unknown, TSend = unknown>(\n url: string,\n data?: TSend,\n config?: FetchOptions\n ) => Promise<FetchResponse<TData>>;\n post: <TData = unknown, TSend = unknown>(\n url: string,\n data?: TSend,\n config?: FetchOptions\n ) => Promise<FetchResponse<TData>>;\n del: <TData = unknown>(url: string, config?: FetchOptions) => Promise<FetchResponse<TData>>;\n};\n\n/**\n * @public\n * @param {FetchConfig} [defaultOptions={}] - Fetch Configs.\n * @returns {FetchClient} A fetch client object with methods for making HTTP requests.\n * @description This is an abstraction around the native fetch exposed by a function. It provides a simple interface to handle API calls\n * to the Strapi backend.\n * @example\n * ```tsx\n * import { getFetchClient } from '@strapi/admin/admin';\n *\n * const myFunct = () => {\n * const { get } = getFetchClient();\n * const requestURL = \"/some-endpoint\";\n *\n * const { data } = await get(requestURL);\n *\n * return data;\n * };\n * ```\n */\nconst getFetchClient = (defaultOptions: FetchConfig = {}): FetchClient => {\n const backendURL = window.strapi.backendURL;\n\n /**\n * Create default headers with the current token.\n * This is a function so we can get a fresh token after refresh.\n */\n const getDefaultHeaders = (token = getToken()) => ({\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n });\n\n const isFormDataRequest = (body: unknown) => body instanceof FormData;\n const addPrependingSlash = (url: string) => (url.charAt(0) !== '/' ? `/${url}` : url);\n\n // This regular expression matches a string that starts with either \"http://\" or \"https://\" or any other protocol name in lower case letters, followed by \"://\" and ends with anything else\n const hasProtocol = (url: string) => new RegExp('^(?:[a-z+]+:)?//', 'i').test(url);\n\n // Check if the url has a prepending slash, if not add a slash\n const normalizeUrl = (url: string) => (hasProtocol(url) ? url : addPrependingSlash(url));\n\n // Add a response interceptor to return the response\n const responseInterceptor = async <TData = unknown>(\n response: Response,\n validateStatus?: FetchOptions['validateStatus'],\n responseType: NonNullable<FetchOptions['responseType']> = 'json'\n ): Promise<FetchResponse<TData>> => {\n if (responseType !== 'json') {\n if (!response.ok && !validateStatus?.(response.status)) {\n const fetchError = new FetchError('Server Error');\n fetchError.status = response.status;\n throw fetchError;\n }\n\n let result: Blob | string | ArrayBuffer;\n if (responseType === 'blob') {\n result = await response.blob();\n } else if (responseType === 'text') {\n result = await response.text();\n } else {\n result = await response.arrayBuffer();\n }\n\n return { data: result as TData, status: response.status, headers: response.headers };\n }\n\n if (response.status === 204) {\n return { data: {} as TData, status: response.status };\n }\n\n try {\n const result = await response.json();\n\n if (!response.ok && result.error && !validateStatus?.(response.status)) {\n const fetchError = new FetchError(result.error.message, { data: result });\n fetchError.status = response.status;\n throw fetchError;\n }\n\n if (!response.ok && !validateStatus?.(response.status)) {\n const fetchError = new FetchError('Unknown Server Error');\n fetchError.status = response.status;\n throw fetchError;\n }\n\n return { data: result };\n } catch (error) {\n // An empty 200 body causes `response.json()` to throw a `SyntaxError`. We treat\n // it as success and return an empty payload. We match on `error.name` rather\n // than `instanceof SyntaxError` because constructor identity differs across JS\n // realms — a Response from a different realm (e.g. undici under jsdom in tests,\n // a service worker or iframe in browsers) throws a `SyntaxError` whose\n // constructor is not the same identity as the one this module closes over. Name\n // comparison is realm-agnostic.\n if ((error as Error | null)?.name === 'SyntaxError' && response.ok) {\n return { data: {}, status: response.status } as FetchResponse<TData>;\n } else {\n throw error;\n }\n }\n };\n\n /**\n * Execute a fetch request with automatic token refresh on 401 errors.\n * @param url - The request URL (used to check if it's an auth path)\n * @param executeRequest - Function that performs the fetch (called again on retry with fresh headers)\n */\n const withTokenRefresh = async <TData>(\n url: string,\n executeRequest: () => Promise<FetchResponse<TData>>,\n getRequestToken: () => string | null\n ): Promise<FetchResponse<TData>> => {\n try {\n return await executeRequest();\n } catch (error) {\n // Only attempt refresh for 401 errors on non-auth paths\n if (isFetchError(error) && error.status === 401 && !isAuthPath(url)) {\n try {\n await attemptTokenRefresh(getRequestToken());\n // Retry - executeRequest will call getDefaultHeaders() again, picking up the new token\n return await executeRequest();\n } catch {\n // If refresh fails, throw the original error\n throw error;\n }\n }\n throw error;\n }\n };\n\n const paramsSerializer =\n <Param = unknown>(params?: Param) =>\n (url: string) => {\n if (params) {\n if (typeof params === 'string') {\n return `${url}?${params}`;\n }\n\n /**\n * TODO V6: Encoding should be enabled in this step\n * So the rest of the app doesn't have to worry about it,\n * It's considered a breaking change because it impacts any API request, including the user's custom code\n */\n const serializedParams = qs.stringify(params, { encode: false });\n if (serializedParams) {\n return `${url}?${serializedParams}`;\n }\n return url;\n }\n return url;\n };\n\n const addBaseUrl = (url: Parameters<typeof fetch>[0]) => {\n return `${backendURL}${url}`;\n };\n\n /**\n * We use the factory method because the options\n * are unique to the individual request\n */\n const makeCreateRequestUrl = (options?: FetchOptions) =>\n pipe(normalizeUrl, addBaseUrl, paramsSerializer(options?.params));\n\n const fetchClient: FetchClient = {\n get: async <TData>(url: string, options?: FetchOptions): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n const responseType = options?.responseType ?? 'json';\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const { Authorization } = getDefaultHeaders(requestToken);\n\n // For non-JSON response types, omit content negotiation headers that imply JSON\n const defaultHeaders =\n responseType === 'json' ? getDefaultHeaders(requestToken) : { Authorization };\n\n const headers = new Headers({\n ...defaultHeaders,\n ...options?.headers,\n });\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'GET',\n credentials: 'include',\n headers,\n });\n\n return responseInterceptor<TData>(response, options?.validateStatus, responseType);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n post: async <TData, TSend = unknown>(\n url: string,\n data?: TSend,\n options?: FetchOptions\n ): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n /**\n * we have to remove the Content-Type value if it was a formData request\n * the browser will automatically set the header value\n */\n if (isFormDataRequest(data)) {\n headers.delete('Content-Type');\n }\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'POST',\n credentials: 'include',\n headers,\n body: isFormDataRequest(data) ? (data as FormData) : JSON.stringify(data),\n });\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n put: async <TData, TSend = unknown>(\n url: string,\n data?: TSend,\n options?: FetchOptions\n ): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n /**\n * we have to remove the Content-Type value if it was a formData request\n * the browser will automatically set the header value\n */\n if (isFormDataRequest(data)) {\n headers.delete('Content-Type');\n }\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'PUT',\n credentials: 'include',\n headers,\n body: isFormDataRequest(data) ? (data as FormData) : JSON.stringify(data),\n });\n\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n del: async <TData>(url: string, options?: FetchOptions): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'DELETE',\n credentials: 'include',\n headers,\n });\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n };\n\n return fetchClient;\n};\n\nexport {\n getFetchClient,\n isFetchError,\n FetchError,\n attemptTokenRefresh,\n refreshAccessToken,\n storeToken,\n setOnTokenUpdate,\n setOnSessionExpired,\n triggerSessionExpired,\n resetSessionExpiredNotification,\n ADMIN_REFRESH_LOCK,\n};\nexport type { FetchOptions, FetchResponse, FetchConfig, FetchClient, ErrorResponse };\n"],"names":["STORAGE_KEYS","TOKEN","refreshPromise","onTokenUpdate","onSessionExpired","sessionExpiredNotified","setOnTokenUpdate","callback","setOnSessionExpired","resetSessionExpiredNotification","triggerSessionExpired","isAuthPath","url","test","storeToken","token","wasPersistedToLocalStorage","Boolean","localStorage","getItem","setItem","JSON","stringify","setCookie","AUTH_COOKIE_NAME","getToken","fromLocalStorage","parse","fromCookie","getCookieValue","ADMIN_REFRESH_LOCK","FALLBACK_ADOPT_TIMEOUT_MS","FALLBACK_ADOPT_POLL_MS","postAccessToken","backendURL","fetch","method","credentials","headers","Accept","adoptSharedAccessToken","readValidAccessTokenFromSharedStorage","staleToken","stored","expiry","decodeAccessTokenExpiry","Date","now","waitForSharedAccessToken","timeoutAt","Promise","resolve","setTimeout","adopted","executeRefreshAccessToken","tokenBeforeRefresh","allowHttpRetry","response","status","adoptedAfterFail","adoptedAfterWait","ok","console","warn","result","json","data","refreshAccessToken","tokenUsedByFailedRequest","window","strapi","navigator","locks","request","error","attemptTokenRefresh","finally","newToken","Error","name","FetchError","message","code","captureStackTrace","isFetchError","getFetchClient","defaultOptions","getDefaultHeaders","Authorization","isFormDataRequest","body","FormData","addPrependingSlash","charAt","hasProtocol","RegExp","normalizeUrl","responseInterceptor","validateStatus","responseType","fetchError","blob","text","arrayBuffer","withTokenRefresh","executeRequest","getRequestToken","paramsSerializer","params","serializedParams","qs","encode","addBaseUrl","makeCreateRequestUrl","options","pipe","fetchClient","get","createRequestUrl","requestToken","defaultHeaders","Headers","signal","post","delete","put","del"],"mappings":"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"}
1
+ {"version":3,"file":"getFetchClient.mjs","sources":["../../../../../admin/src/utils/getFetchClient.ts"],"sourcesContent":["import flow from 'lodash/flow';\n// eslint-disable-next-line import/default\nimport qs from 'qs';\n\nimport { AUTH_COOKIE_NAME, getCookieValue, setCookie } from './cookies';\nimport { decodeAccessTokenExpiry } from './jwt';\n\nimport type { errors } from '@strapi/utils';\n\nexport type ApiError =\n | errors.ApplicationError\n | errors.ForbiddenError\n | errors.NotFoundError\n | errors.NotImplementedError\n | errors.PaginationError\n | errors.PayloadTooLargeError\n | errors.PolicyError\n | errors.RateLimitError\n | errors.UnauthorizedError\n | errors.ValidationError\n | errors.YupValidationError;\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n USER: 'userInfo',\n};\n\n/**\n * Module-level promise to ensure only one token refresh happens at a time\n */\nlet refreshPromise: Promise<string | null> | null = null;\n\n/**\n * Callback to notify the app when the token is updated (e.g., to update Redux state)\n */\nlet onTokenUpdate: ((token: string) => void) | null = null;\n\n/**\n * Callback to notify the app when the session has been terminated and the user\n * should be redirected to the login page (e.g., refresh token rejected, idle\n * session expired). The React layer registers a handler that clears local\n * auth state and navigates to /auth/login.\n */\nlet onSessionExpired: (() => void) | null = null;\n\n/**\n * A 401 after a failed refresh is delivered twice in the common RTK path\n * (baseQuery, then the store middleware). Concurrent in-flight queries can\n * add more. Fire the React handler once per dead session; re-arm when a new\n * token is stored (refresh or login).\n */\nlet sessionExpiredNotified = false;\n\n/**\n * Set the callback that will be called when the token is refreshed.\n * This allows the React layer to update Redux state when a token refresh occurs.\n *\n * @param callback - Function to call with the new token, or null to clear\n * @example\n * // In a React component\n * useEffect(() => {\n * setOnTokenUpdate((token) => dispatch(setToken(token)));\n * return () => setOnTokenUpdate(null);\n * }, [dispatch]);\n */\nconst setOnTokenUpdate = (callback: ((token: string) => void) | null): void => {\n onTokenUpdate = callback;\n};\n\n/**\n * Set the callback that will be called when the active session is no longer\n * valid — i.e. the server rejected the refresh token, not merely that the\n * short-lived access token expired. This lets the tab redirect to /auth/login\n * (after any unsaved-changes guard) rather than sitting on a dead session.\n *\n * @param callback - Function to call when the session ends, or null to clear\n */\nconst setOnSessionExpired = (callback: (() => void) | null): void => {\n onSessionExpired = callback;\n if (callback === null) {\n resetSessionExpiredNotification();\n }\n};\n\n/**\n * Re-arm session-expired notifications after a new access token is stored\n * (silent refresh) or after a successful login.\n */\nconst resetSessionExpiredNotification = (): void => {\n sessionExpiredNotified = false;\n};\n\n/**\n * Trigger the registered session-expired callback, if any. Safe to call from\n * non-React code (e.g., the RTK Query baseQuery 401 handler). Returns `false`\n * when nothing is listening, so callers can fall back to a hard redirect\n * instead of leaving the user on a dead page. Subsequent calls during the same\n * dead session return `true` without invoking the handler again.\n */\nconst triggerSessionExpired = (): boolean => {\n if (!onSessionExpired) {\n return false;\n }\n\n if (sessionExpiredNotified) {\n return true;\n }\n\n sessionExpiredNotified = true;\n onSessionExpired();\n return true;\n};\n\n/**\n * Check if the URL is an auth path that should not trigger token refresh.\n * Note: No ^ anchor since the URL may include the baseURL prefix (e.g., \"http://localhost:1337/admin/login\").\n * This differs from baseQuery.ts which uses ^/admin since it receives normalized paths.\n */\nconst isAuthPath = (url: string) => /\\/admin\\/(login|logout|access-token)\\b/.test(url);\n\n/**\n * Store the new token in the appropriate storage (localStorage or cookie)\n * and notify the app to update its state.\n *\n * Uses localStorage if the user selected \"remember me\" during login,\n * otherwise uses cookies for session-based storage.\n *\n * @param token - The JWT token to store\n * @internal Exported for testing purposes\n */\nconst storeToken = (token: string): void => {\n resetSessionExpiredNotification();\n\n // Check if the original token was stored in localStorage (persist mode)\n const wasPersistedToLocalStorage = Boolean(localStorage.getItem(STORAGE_KEYS.TOKEN));\n\n if (wasPersistedToLocalStorage) {\n localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));\n } else {\n setCookie(AUTH_COOKIE_NAME, token);\n }\n\n // Notify the app to update its state (e.g., Redux)\n if (onTokenUpdate) {\n onTokenUpdate(token);\n }\n};\n\nconst getToken = (): string | null => {\n const fromLocalStorage = localStorage.getItem(STORAGE_KEYS.TOKEN);\n if (fromLocalStorage) {\n return JSON.parse(fromLocalStorage);\n }\n\n const fromCookie = getCookieValue(AUTH_COOKIE_NAME);\n return fromCookie ?? null;\n};\n\nconst ADMIN_REFRESH_LOCK = 'strapi-admin-access-token';\nconst FALLBACK_ADOPT_TIMEOUT_MS = 250;\nconst FALLBACK_ADOPT_POLL_MS = 25;\n\nconst postAccessToken = (backendURL: string) =>\n fetch(`${backendURL}/admin/access-token`, {\n method: 'POST',\n credentials: 'include', // Include cookies for the refresh token\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n });\n\nconst adoptSharedAccessToken = (token: string): string => {\n resetSessionExpiredNotification();\n\n if (onTokenUpdate) {\n onTokenUpdate(token);\n }\n return token;\n};\n\n/**\n * Another tab may have refreshed already and written a newer access token to the\n * shared localStorage/cookie. Per-tab Redux is not visible here — only shared\n * storage counts.\n */\nconst readValidAccessTokenFromSharedStorage = (staleToken: string | null): string | null => {\n const stored = getToken();\n if (!stored || stored === staleToken) {\n return null;\n }\n\n const expiry = decodeAccessTokenExpiry(stored);\n if (expiry === null || expiry <= Date.now()) {\n return null;\n }\n\n return stored;\n};\n\nconst waitForSharedAccessToken = async (staleToken: string | null): Promise<string | null> => {\n const timeoutAt = Date.now() + FALLBACK_ADOPT_TIMEOUT_MS;\n\n while (Date.now() < timeoutAt) {\n await new Promise((resolve) => {\n setTimeout(resolve, FALLBACK_ADOPT_POLL_MS);\n });\n\n const adopted = readValidAccessTokenFromSharedStorage(staleToken);\n if (adopted) {\n return adoptSharedAccessToken(adopted);\n }\n }\n\n return null;\n};\n\nconst executeRefreshAccessToken = async (\n backendURL: string,\n tokenBeforeRefresh: string | null,\n { allowHttpRetry }: { allowHttpRetry: boolean }\n): Promise<string | null> => {\n const adopted = readValidAccessTokenFromSharedStorage(tokenBeforeRefresh);\n if (adopted) {\n return adoptSharedAccessToken(adopted);\n }\n\n let response = await postAccessToken(backendURL);\n\n if (response.status === 401 && allowHttpRetry) {\n const adoptedAfterFail = readValidAccessTokenFromSharedStorage(tokenBeforeRefresh);\n if (adoptedAfterFail) {\n return adoptSharedAccessToken(adoptedAfterFail);\n }\n\n const adoptedAfterWait = await waitForSharedAccessToken(tokenBeforeRefresh);\n if (adoptedAfterWait) {\n return adoptedAfterWait;\n }\n\n response = await postAccessToken(backendURL);\n }\n\n if (!response.ok) {\n console.warn('[Auth] Token refresh failed with status:', response.status);\n return null;\n }\n\n const result = await response.json();\n const token = result?.data?.token as string | undefined;\n\n if (!token) {\n console.warn('[Auth] Token refresh response missing token');\n return null;\n }\n\n storeToken(token);\n return token;\n};\n\n/**\n * Refresh the access token by calling the /admin/access-token endpoint.\n * This uses a low-level fetch to avoid recursion through the interceptor.\n * Returns the new token on success, or null on failure.\n */\nconst refreshAccessToken = async (\n tokenUsedByFailedRequest?: string | null\n): Promise<string | null> => {\n const backendURL = window.strapi.backendURL;\n const tokenBeforeRefresh = tokenUsedByFailedRequest ?? getToken();\n\n try {\n if (typeof navigator !== 'undefined' && navigator.locks?.request) {\n return await navigator.locks.request(ADMIN_REFRESH_LOCK, () =>\n executeRefreshAccessToken(backendURL, tokenBeforeRefresh, { allowHttpRetry: false })\n );\n }\n\n return await executeRefreshAccessToken(backendURL, tokenBeforeRefresh, {\n allowHttpRetry: true,\n });\n } catch (error) {\n console.error('[Auth] Token refresh error:', error);\n return null;\n }\n};\n\n/**\n * Attempt to refresh the token if not already refreshing.\n * Uses a module-level promise to prevent concurrent refresh requests.\n *\n * @returns The new authentication token\n * @throws {Error} If the token refresh fails (e.g., refresh token expired)\n * @internal Exported for testing purposes\n */\nconst attemptTokenRefresh = async (tokenUsedByFailedRequest?: string | null): Promise<string> => {\n if (!refreshPromise) {\n refreshPromise = refreshAccessToken(tokenUsedByFailedRequest).finally(() => {\n refreshPromise = null;\n });\n }\n\n const newToken = await refreshPromise;\n if (!newToken) {\n const error = new Error('Session expired. Please log in again.');\n error.name = 'TokenRefreshError';\n throw error;\n }\n\n return newToken;\n};\n\ntype FetchResponse<TData = unknown> = {\n data: TData;\n status?: number;\n headers?: Headers;\n};\n\ntype FetchOptions = {\n params?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n validateStatus?: ((status: number) => boolean) | null;\n responseType?: 'json' | 'blob' | 'text' | 'arrayBuffer';\n};\n\ntype FetchConfig = {\n signal?: AbortSignal;\n};\n\ninterface ErrorResponse {\n data: {\n data?: unknown;\n error: ApiError & { status?: number };\n };\n}\n\nclass FetchError extends Error {\n public name: string;\n public message: string;\n public response?: ErrorResponse;\n public code?: number;\n public status?: number;\n\n constructor(message: string, response?: ErrorResponse) {\n super(message);\n this.name = 'FetchError';\n this.message = message;\n this.response = response;\n this.code = response?.data?.error?.status;\n this.status = response?.data?.error?.status;\n\n // Ensure correct stack trace in error object\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FetchError);\n }\n }\n}\n\nconst isFetchError = (error: unknown): error is FetchError => {\n return error instanceof FetchError;\n};\n\ntype FetchClient = {\n get: {\n (url: string, config: FetchOptions & { responseType: 'blob' }): Promise<FetchResponse<Blob>>;\n (url: string, config: FetchOptions & { responseType: 'text' }): Promise<FetchResponse<string>>;\n (\n url: string,\n config: FetchOptions & { responseType: 'arrayBuffer' }\n ): Promise<FetchResponse<ArrayBuffer>>;\n <TData = unknown>(url: string, config?: FetchOptions): Promise<FetchResponse<TData>>;\n };\n put: <TData = unknown, TSend = unknown>(\n url: string,\n data?: TSend,\n config?: FetchOptions\n ) => Promise<FetchResponse<TData>>;\n post: <TData = unknown, TSend = unknown>(\n url: string,\n data?: TSend,\n config?: FetchOptions\n ) => Promise<FetchResponse<TData>>;\n del: <TData = unknown>(url: string, config?: FetchOptions) => Promise<FetchResponse<TData>>;\n};\n\n/**\n * @public\n * @param {FetchConfig} [defaultOptions={}] - Fetch Configs.\n * @returns {FetchClient} A fetch client object with methods for making HTTP requests.\n * @description This is an abstraction around the native fetch exposed by a function. It provides a simple interface to handle API calls\n * to the Strapi backend.\n * @example\n * ```tsx\n * import { getFetchClient } from '@strapi/admin/admin';\n *\n * const myFunct = () => {\n * const { get } = getFetchClient();\n * const requestURL = \"/some-endpoint\";\n *\n * const { data } = await get(requestURL);\n *\n * return data;\n * };\n * ```\n */\nconst getFetchClient = (defaultOptions: FetchConfig = {}): FetchClient => {\n const backendURL = window.strapi.backendURL;\n\n /**\n * Create default headers with the current token.\n * This is a function so we can get a fresh token after refresh.\n */\n const getDefaultHeaders = (token = getToken()) => ({\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n });\n\n const isFormDataRequest = (body: unknown) => body instanceof FormData;\n const addPrependingSlash = (url: string) => (url.charAt(0) !== '/' ? `/${url}` : url);\n\n // This regular expression matches a string that starts with either \"http://\" or \"https://\" or any other protocol name in lower case letters, followed by \"://\" and ends with anything else\n const hasProtocol = (url: string) => new RegExp('^(?:[a-z+]+:)?//', 'i').test(url);\n\n // Check if the url has a prepending slash, if not add a slash\n const normalizeUrl = (url: string) => (hasProtocol(url) ? url : addPrependingSlash(url));\n\n // Add a response interceptor to return the response\n const responseInterceptor = async <TData = unknown>(\n response: Response,\n validateStatus?: FetchOptions['validateStatus'],\n responseType: NonNullable<FetchOptions['responseType']> = 'json'\n ): Promise<FetchResponse<TData>> => {\n if (responseType !== 'json') {\n if (!response.ok && !validateStatus?.(response.status)) {\n const fetchError = new FetchError('Server Error');\n fetchError.status = response.status;\n throw fetchError;\n }\n\n let result: Blob | string | ArrayBuffer;\n if (responseType === 'blob') {\n result = await response.blob();\n } else if (responseType === 'text') {\n result = await response.text();\n } else {\n result = await response.arrayBuffer();\n }\n\n return { data: result as TData, status: response.status, headers: response.headers };\n }\n\n if (response.status === 204) {\n return { data: {} as TData, status: response.status };\n }\n\n try {\n const result = await response.json();\n\n if (!response.ok && result.error && !validateStatus?.(response.status)) {\n const fetchError = new FetchError(result.error.message, { data: result });\n fetchError.status = response.status;\n throw fetchError;\n }\n\n if (!response.ok && !validateStatus?.(response.status)) {\n const fetchError = new FetchError('Unknown Server Error');\n fetchError.status = response.status;\n throw fetchError;\n }\n\n return { data: result };\n } catch (error) {\n // An empty 200 body causes `response.json()` to throw a `SyntaxError`. We treat\n // it as success and return an empty payload. We match on `error.name` rather\n // than `instanceof SyntaxError` because constructor identity differs across JS\n // realms — a Response from a different realm (e.g. undici under jsdom in tests,\n // a service worker or iframe in browsers) throws a `SyntaxError` whose\n // constructor is not the same identity as the one this module closes over. Name\n // comparison is realm-agnostic.\n if ((error as Error | null)?.name === 'SyntaxError' && response.ok) {\n return { data: {}, status: response.status } as FetchResponse<TData>;\n } else {\n throw error;\n }\n }\n };\n\n /**\n * Execute a fetch request with automatic token refresh on 401 errors.\n * @param url - The request URL (used to check if it's an auth path)\n * @param executeRequest - Function that performs the fetch (called again on retry with fresh headers)\n */\n const withTokenRefresh = async <TData>(\n url: string,\n executeRequest: () => Promise<FetchResponse<TData>>,\n getRequestToken: () => string | null\n ): Promise<FetchResponse<TData>> => {\n try {\n return await executeRequest();\n } catch (error) {\n // Only attempt refresh for 401 errors on non-auth paths\n if (isFetchError(error) && error.status === 401 && !isAuthPath(url)) {\n try {\n await attemptTokenRefresh(getRequestToken());\n // Retry - executeRequest will call getDefaultHeaders() again, picking up the new token\n return await executeRequest();\n } catch {\n // If refresh fails, throw the original error\n throw error;\n }\n }\n throw error;\n }\n };\n\n const paramsSerializer =\n <Param = unknown>(params?: Param) =>\n (url: string) => {\n if (params) {\n if (typeof params === 'string') {\n return `${url}?${params}`;\n }\n\n /**\n * TODO V6: Encoding should be enabled in this step\n * So the rest of the app doesn't have to worry about it,\n * It's considered a breaking change because it impacts any API request, including the user's custom code\n */\n const serializedParams = qs.stringify(params, { encode: false });\n if (serializedParams) {\n return `${url}?${serializedParams}`;\n }\n return url;\n }\n return url;\n };\n\n const addBaseUrl = (url: Parameters<typeof fetch>[0]) => {\n return `${backendURL}${url}`;\n };\n\n /**\n * We use the factory method because the options\n * are unique to the individual request\n */\n const makeCreateRequestUrl = (options?: FetchOptions) =>\n flow(normalizeUrl, addBaseUrl, paramsSerializer(options?.params));\n\n const fetchClient: FetchClient = {\n get: async <TData>(url: string, options?: FetchOptions): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n const responseType = options?.responseType ?? 'json';\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const { Authorization } = getDefaultHeaders(requestToken);\n\n // For non-JSON response types, omit content negotiation headers that imply JSON\n const defaultHeaders =\n responseType === 'json' ? getDefaultHeaders(requestToken) : { Authorization };\n\n const headers = new Headers({\n ...defaultHeaders,\n ...options?.headers,\n });\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'GET',\n credentials: 'include',\n headers,\n });\n\n return responseInterceptor<TData>(response, options?.validateStatus, responseType);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n post: async <TData, TSend = unknown>(\n url: string,\n data?: TSend,\n options?: FetchOptions\n ): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n /**\n * we have to remove the Content-Type value if it was a formData request\n * the browser will automatically set the header value\n */\n if (isFormDataRequest(data)) {\n headers.delete('Content-Type');\n }\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'POST',\n credentials: 'include',\n headers,\n body: isFormDataRequest(data) ? (data as FormData) : JSON.stringify(data),\n });\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n put: async <TData, TSend = unknown>(\n url: string,\n data?: TSend,\n options?: FetchOptions\n ): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n /**\n * we have to remove the Content-Type value if it was a formData request\n * the browser will automatically set the header value\n */\n if (isFormDataRequest(data)) {\n headers.delete('Content-Type');\n }\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'PUT',\n credentials: 'include',\n headers,\n body: isFormDataRequest(data) ? (data as FormData) : JSON.stringify(data),\n });\n\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n del: async <TData>(url: string, options?: FetchOptions): Promise<FetchResponse<TData>> => {\n const createRequestUrl = makeCreateRequestUrl(options);\n let requestToken: string | null = null;\n\n const executeRequest = async () => {\n requestToken = getToken();\n const headers = new Headers({\n ...getDefaultHeaders(requestToken),\n ...options?.headers,\n });\n\n const response = await fetch(createRequestUrl(url), {\n signal: options?.signal ?? defaultOptions.signal,\n method: 'DELETE',\n credentials: 'include',\n headers,\n });\n return responseInterceptor<TData>(response, options?.validateStatus);\n };\n\n return withTokenRefresh(url, executeRequest, () => requestToken);\n },\n };\n\n return fetchClient;\n};\n\nexport {\n getFetchClient,\n isFetchError,\n FetchError,\n attemptTokenRefresh,\n refreshAccessToken,\n storeToken,\n setOnTokenUpdate,\n setOnSessionExpired,\n triggerSessionExpired,\n resetSessionExpiredNotification,\n ADMIN_REFRESH_LOCK,\n};\nexport type { FetchOptions, FetchResponse, FetchConfig, FetchClient, ErrorResponse };\n"],"names":["STORAGE_KEYS","TOKEN","refreshPromise","onTokenUpdate","onSessionExpired","sessionExpiredNotified","setOnTokenUpdate","callback","setOnSessionExpired","resetSessionExpiredNotification","triggerSessionExpired","isAuthPath","url","test","storeToken","token","wasPersistedToLocalStorage","Boolean","localStorage","getItem","setItem","JSON","stringify","setCookie","AUTH_COOKIE_NAME","getToken","fromLocalStorage","parse","fromCookie","getCookieValue","ADMIN_REFRESH_LOCK","FALLBACK_ADOPT_TIMEOUT_MS","FALLBACK_ADOPT_POLL_MS","postAccessToken","backendURL","fetch","method","credentials","headers","Accept","adoptSharedAccessToken","readValidAccessTokenFromSharedStorage","staleToken","stored","expiry","decodeAccessTokenExpiry","Date","now","waitForSharedAccessToken","timeoutAt","Promise","resolve","setTimeout","adopted","executeRefreshAccessToken","tokenBeforeRefresh","allowHttpRetry","response","status","adoptedAfterFail","adoptedAfterWait","ok","console","warn","result","json","data","refreshAccessToken","tokenUsedByFailedRequest","window","strapi","navigator","locks","request","error","attemptTokenRefresh","finally","newToken","Error","name","FetchError","message","code","captureStackTrace","isFetchError","getFetchClient","defaultOptions","getDefaultHeaders","Authorization","isFormDataRequest","body","FormData","addPrependingSlash","charAt","hasProtocol","RegExp","normalizeUrl","responseInterceptor","validateStatus","responseType","fetchError","blob","text","arrayBuffer","withTokenRefresh","executeRequest","getRequestToken","paramsSerializer","params","serializedParams","qs","encode","addBaseUrl","makeCreateRequestUrl","options","flow","fetchClient","get","createRequestUrl","requestToken","defaultHeaders","Headers","signal","post","delete","put","del"],"mappings":"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"}
@@ -55,7 +55,12 @@ const actionTypes = {
55
55
  'admin-user.password.update': 'Update password',
56
56
  'webhook.create': 'Create webhook',
57
57
  'webhook.update': 'Update webhook',
58
- 'webhook.delete': 'Delete webhook'
58
+ 'webhook.delete': 'Delete webhook',
59
+ 'workflow.create': 'Create workflow',
60
+ 'workflow.update': 'Update workflow',
61
+ 'workflow.delete': 'Delete workflow',
62
+ 'review-workflows.updateEntryStage': 'Change entry stage',
63
+ 'entry.assignee.update': 'Change entry assignee'
59
64
  };
60
65
  const getDefaultMessage = (value)=>{
61
66
  return actionTypes[value] || value;
@@ -1 +1 @@
1
- {"version":3,"file":"getActionTypesDefaultMessages.js","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.ts"],"sourcesContent":["export const actionTypes = {\n 'entry.create': 'Create entry{model, select, undefined {} other { ({model})}}',\n 'entry.update': 'Update entry{model, select, undefined {} other { ({model})}}',\n 'entry.delete': 'Delete entry{model, select, undefined {} other { ({model})}}',\n 'entry.publish': 'Publish entry{model, select, undefined {} other { ({model})}}',\n 'entry.unpublish': 'Unpublish entry{model, select, undefined {} other { ({model})}}',\n 'media.create': 'Create media',\n 'media.update': 'Update media',\n 'media.delete': 'Delete media',\n 'media-folder.create': 'Create media folder',\n 'media-folder.update': 'Update media folder',\n 'media-folder.delete': 'Delete media folder',\n 'user.create': 'Create user',\n 'user.update': 'Update user',\n 'user.delete': 'Delete user',\n 'admin.auth.success': 'Admin login',\n 'admin.logout': 'Admin logout',\n 'content-type.create': 'Create content type',\n 'content-type.update': 'Update content type',\n 'content-type.delete': 'Delete content type',\n 'component.create': 'Create component',\n 'component.update': 'Update component',\n 'component.delete': 'Delete component',\n 'role.create': 'Create role',\n 'role.update': 'Update role',\n 'role.delete': 'Delete role',\n 'permission.create': 'Create permission',\n 'permission.update': 'Update permission',\n 'permission.delete': 'Delete permission',\n 'release.create': 'Create release',\n 'release.update': 'Update release',\n 'release.delete': 'Delete release',\n 'release.trigger': 'Trigger release',\n 'release.entry.add': 'Add entry to release',\n 'release.entry.update': 'Change entry on release',\n 'release.entry.remove': 'Remove entry from release',\n 'release.settings.update': 'Update release settings',\n 'audit-log.export': 'Export audit logs',\n 'locale.create': 'Create locale',\n 'locale.update': 'Update locale',\n 'locale.delete': 'Delete locale',\n 'locale.default.update': 'Change default locale',\n 'token.create': 'Create token',\n 'token.update': 'Update token',\n 'token.delete': 'Delete token',\n 'token.regenerate': 'Regenerate token',\n 'admin-user.create': 'Create user',\n 'admin-user.update': 'Update user',\n 'admin-user.delete': 'Delete user',\n 'admin-user.invite.accept': 'Accept invitation',\n 'admin-user.password-reset.create': 'Request password reset',\n 'admin-user.password-reset.confirm': 'Reset password',\n 'admin-user.password.update': 'Update password',\n 'webhook.create': 'Create webhook',\n 'webhook.update': 'Update webhook',\n 'webhook.delete': 'Delete webhook',\n};\n\nexport const getDefaultMessage = (value: keyof typeof actionTypes) => {\n return actionTypes[value] || value;\n};\n"],"names":["actionTypes","getDefaultMessage","value"],"mappings":";;MAAaA,WAAAA,GAAc;IACzB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,eAAA,EAAiB,+DAAA;IACjB,iBAAA,EAAmB,iEAAA;IACnB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,oBAAA,EAAsB,aAAA;IACtB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,iBAAA,EAAmB,iBAAA;IACnB,mBAAA,EAAqB,sBAAA;IACrB,sBAAA,EAAwB,yBAAA;IACxB,sBAAA,EAAwB,2BAAA;IACxB,yBAAA,EAA2B,yBAAA;IAC3B,kBAAA,EAAoB,mBAAA;IACpB,eAAA,EAAiB,eAAA;IACjB,eAAA,EAAiB,eAAA;IACjB,eAAA,EAAiB,eAAA;IACjB,uBAAA,EAAyB,uBAAA;IACzB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,kBAAA,EAAoB,kBAAA;IACpB,mBAAA,EAAqB,aAAA;IACrB,mBAAA,EAAqB,aAAA;IACrB,mBAAA,EAAqB,aAAA;IACrB,0BAAA,EAA4B,mBAAA;IAC5B,kCAAA,EAAoC,wBAAA;IACpC,mCAAA,EAAqC,gBAAA;IACrC,4BAAA,EAA8B,iBAAA;IAC9B,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB;AACpB;AAEO,MAAMC,oBAAoB,CAACC,KAAAA,GAAAA;IAChC,OAAOF,WAAW,CAACE,KAAAA,CAAM,IAAIA,KAAAA;AAC/B;;;;;"}
1
+ {"version":3,"file":"getActionTypesDefaultMessages.js","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.ts"],"sourcesContent":["export const actionTypes = {\n 'entry.create': 'Create entry{model, select, undefined {} other { ({model})}}',\n 'entry.update': 'Update entry{model, select, undefined {} other { ({model})}}',\n 'entry.delete': 'Delete entry{model, select, undefined {} other { ({model})}}',\n 'entry.publish': 'Publish entry{model, select, undefined {} other { ({model})}}',\n 'entry.unpublish': 'Unpublish entry{model, select, undefined {} other { ({model})}}',\n 'media.create': 'Create media',\n 'media.update': 'Update media',\n 'media.delete': 'Delete media',\n 'media-folder.create': 'Create media folder',\n 'media-folder.update': 'Update media folder',\n 'media-folder.delete': 'Delete media folder',\n 'user.create': 'Create user',\n 'user.update': 'Update user',\n 'user.delete': 'Delete user',\n 'admin.auth.success': 'Admin login',\n 'admin.logout': 'Admin logout',\n 'content-type.create': 'Create content type',\n 'content-type.update': 'Update content type',\n 'content-type.delete': 'Delete content type',\n 'component.create': 'Create component',\n 'component.update': 'Update component',\n 'component.delete': 'Delete component',\n 'role.create': 'Create role',\n 'role.update': 'Update role',\n 'role.delete': 'Delete role',\n 'permission.create': 'Create permission',\n 'permission.update': 'Update permission',\n 'permission.delete': 'Delete permission',\n 'release.create': 'Create release',\n 'release.update': 'Update release',\n 'release.delete': 'Delete release',\n 'release.trigger': 'Trigger release',\n 'release.entry.add': 'Add entry to release',\n 'release.entry.update': 'Change entry on release',\n 'release.entry.remove': 'Remove entry from release',\n 'release.settings.update': 'Update release settings',\n 'audit-log.export': 'Export audit logs',\n 'locale.create': 'Create locale',\n 'locale.update': 'Update locale',\n 'locale.delete': 'Delete locale',\n 'locale.default.update': 'Change default locale',\n 'token.create': 'Create token',\n 'token.update': 'Update token',\n 'token.delete': 'Delete token',\n 'token.regenerate': 'Regenerate token',\n 'admin-user.create': 'Create user',\n 'admin-user.update': 'Update user',\n 'admin-user.delete': 'Delete user',\n 'admin-user.invite.accept': 'Accept invitation',\n 'admin-user.password-reset.create': 'Request password reset',\n 'admin-user.password-reset.confirm': 'Reset password',\n 'admin-user.password.update': 'Update password',\n 'webhook.create': 'Create webhook',\n 'webhook.update': 'Update webhook',\n 'webhook.delete': 'Delete webhook',\n 'workflow.create': 'Create workflow',\n 'workflow.update': 'Update workflow',\n 'workflow.delete': 'Delete workflow',\n 'review-workflows.updateEntryStage': 'Change entry stage',\n 'entry.assignee.update': 'Change entry assignee',\n};\n\nexport const getDefaultMessage = (value: keyof typeof actionTypes) => {\n return actionTypes[value] || value;\n};\n"],"names":["actionTypes","getDefaultMessage","value"],"mappings":";;MAAaA,WAAAA,GAAc;IACzB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,eAAA,EAAiB,+DAAA;IACjB,iBAAA,EAAmB,iEAAA;IACnB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,oBAAA,EAAsB,aAAA;IACtB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,iBAAA,EAAmB,iBAAA;IACnB,mBAAA,EAAqB,sBAAA;IACrB,sBAAA,EAAwB,yBAAA;IACxB,sBAAA,EAAwB,2BAAA;IACxB,yBAAA,EAA2B,yBAAA;IAC3B,kBAAA,EAAoB,mBAAA;IACpB,eAAA,EAAiB,eAAA;IACjB,eAAA,EAAiB,eAAA;IACjB,eAAA,EAAiB,eAAA;IACjB,uBAAA,EAAyB,uBAAA;IACzB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,kBAAA,EAAoB,kBAAA;IACpB,mBAAA,EAAqB,aAAA;IACrB,mBAAA,EAAqB,aAAA;IACrB,mBAAA,EAAqB,aAAA;IACrB,0BAAA,EAA4B,mBAAA;IAC5B,kCAAA,EAAoC,wBAAA;IACpC,mCAAA,EAAqC,gBAAA;IACrC,4BAAA,EAA8B,iBAAA;IAC9B,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,iBAAA,EAAmB,iBAAA;IACnB,iBAAA,EAAmB,iBAAA;IACnB,iBAAA,EAAmB,iBAAA;IACnB,mCAAA,EAAqC,oBAAA;IACrC,uBAAA,EAAyB;AAC3B;AAEO,MAAMC,oBAAoB,CAACC,KAAAA,GAAAA;IAChC,OAAOF,WAAW,CAACE,KAAAA,CAAM,IAAIA,KAAAA;AAC/B;;;;;"}
@@ -53,7 +53,12 @@ const actionTypes = {
53
53
  'admin-user.password.update': 'Update password',
54
54
  'webhook.create': 'Create webhook',
55
55
  'webhook.update': 'Update webhook',
56
- 'webhook.delete': 'Delete webhook'
56
+ 'webhook.delete': 'Delete webhook',
57
+ 'workflow.create': 'Create workflow',
58
+ 'workflow.update': 'Update workflow',
59
+ 'workflow.delete': 'Delete workflow',
60
+ 'review-workflows.updateEntryStage': 'Change entry stage',
61
+ 'entry.assignee.update': 'Change entry assignee'
57
62
  };
58
63
  const getDefaultMessage = (value)=>{
59
64
  return actionTypes[value] || value;
@@ -1 +1 @@
1
- {"version":3,"file":"getActionTypesDefaultMessages.mjs","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.ts"],"sourcesContent":["export const actionTypes = {\n 'entry.create': 'Create entry{model, select, undefined {} other { ({model})}}',\n 'entry.update': 'Update entry{model, select, undefined {} other { ({model})}}',\n 'entry.delete': 'Delete entry{model, select, undefined {} other { ({model})}}',\n 'entry.publish': 'Publish entry{model, select, undefined {} other { ({model})}}',\n 'entry.unpublish': 'Unpublish entry{model, select, undefined {} other { ({model})}}',\n 'media.create': 'Create media',\n 'media.update': 'Update media',\n 'media.delete': 'Delete media',\n 'media-folder.create': 'Create media folder',\n 'media-folder.update': 'Update media folder',\n 'media-folder.delete': 'Delete media folder',\n 'user.create': 'Create user',\n 'user.update': 'Update user',\n 'user.delete': 'Delete user',\n 'admin.auth.success': 'Admin login',\n 'admin.logout': 'Admin logout',\n 'content-type.create': 'Create content type',\n 'content-type.update': 'Update content type',\n 'content-type.delete': 'Delete content type',\n 'component.create': 'Create component',\n 'component.update': 'Update component',\n 'component.delete': 'Delete component',\n 'role.create': 'Create role',\n 'role.update': 'Update role',\n 'role.delete': 'Delete role',\n 'permission.create': 'Create permission',\n 'permission.update': 'Update permission',\n 'permission.delete': 'Delete permission',\n 'release.create': 'Create release',\n 'release.update': 'Update release',\n 'release.delete': 'Delete release',\n 'release.trigger': 'Trigger release',\n 'release.entry.add': 'Add entry to release',\n 'release.entry.update': 'Change entry on release',\n 'release.entry.remove': 'Remove entry from release',\n 'release.settings.update': 'Update release settings',\n 'audit-log.export': 'Export audit logs',\n 'locale.create': 'Create locale',\n 'locale.update': 'Update locale',\n 'locale.delete': 'Delete locale',\n 'locale.default.update': 'Change default locale',\n 'token.create': 'Create token',\n 'token.update': 'Update token',\n 'token.delete': 'Delete token',\n 'token.regenerate': 'Regenerate token',\n 'admin-user.create': 'Create user',\n 'admin-user.update': 'Update user',\n 'admin-user.delete': 'Delete user',\n 'admin-user.invite.accept': 'Accept invitation',\n 'admin-user.password-reset.create': 'Request password reset',\n 'admin-user.password-reset.confirm': 'Reset password',\n 'admin-user.password.update': 'Update password',\n 'webhook.create': 'Create webhook',\n 'webhook.update': 'Update webhook',\n 'webhook.delete': 'Delete webhook',\n};\n\nexport const getDefaultMessage = (value: keyof typeof actionTypes) => {\n return actionTypes[value] || value;\n};\n"],"names":["actionTypes","getDefaultMessage","value"],"mappings":"MAAaA,WAAAA,GAAc;IACzB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,eAAA,EAAiB,+DAAA;IACjB,iBAAA,EAAmB,iEAAA;IACnB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,oBAAA,EAAsB,aAAA;IACtB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,iBAAA,EAAmB,iBAAA;IACnB,mBAAA,EAAqB,sBAAA;IACrB,sBAAA,EAAwB,yBAAA;IACxB,sBAAA,EAAwB,2BAAA;IACxB,yBAAA,EAA2B,yBAAA;IAC3B,kBAAA,EAAoB,mBAAA;IACpB,eAAA,EAAiB,eAAA;IACjB,eAAA,EAAiB,eAAA;IACjB,eAAA,EAAiB,eAAA;IACjB,uBAAA,EAAyB,uBAAA;IACzB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,kBAAA,EAAoB,kBAAA;IACpB,mBAAA,EAAqB,aAAA;IACrB,mBAAA,EAAqB,aAAA;IACrB,mBAAA,EAAqB,aAAA;IACrB,0BAAA,EAA4B,mBAAA;IAC5B,kCAAA,EAAoC,wBAAA;IACpC,mCAAA,EAAqC,gBAAA;IACrC,4BAAA,EAA8B,iBAAA;IAC9B,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB;AACpB;AAEO,MAAMC,oBAAoB,CAACC,KAAAA,GAAAA;IAChC,OAAOF,WAAW,CAACE,KAAAA,CAAM,IAAIA,KAAAA;AAC/B;;;;"}
1
+ {"version":3,"file":"getActionTypesDefaultMessages.mjs","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.ts"],"sourcesContent":["export const actionTypes = {\n 'entry.create': 'Create entry{model, select, undefined {} other { ({model})}}',\n 'entry.update': 'Update entry{model, select, undefined {} other { ({model})}}',\n 'entry.delete': 'Delete entry{model, select, undefined {} other { ({model})}}',\n 'entry.publish': 'Publish entry{model, select, undefined {} other { ({model})}}',\n 'entry.unpublish': 'Unpublish entry{model, select, undefined {} other { ({model})}}',\n 'media.create': 'Create media',\n 'media.update': 'Update media',\n 'media.delete': 'Delete media',\n 'media-folder.create': 'Create media folder',\n 'media-folder.update': 'Update media folder',\n 'media-folder.delete': 'Delete media folder',\n 'user.create': 'Create user',\n 'user.update': 'Update user',\n 'user.delete': 'Delete user',\n 'admin.auth.success': 'Admin login',\n 'admin.logout': 'Admin logout',\n 'content-type.create': 'Create content type',\n 'content-type.update': 'Update content type',\n 'content-type.delete': 'Delete content type',\n 'component.create': 'Create component',\n 'component.update': 'Update component',\n 'component.delete': 'Delete component',\n 'role.create': 'Create role',\n 'role.update': 'Update role',\n 'role.delete': 'Delete role',\n 'permission.create': 'Create permission',\n 'permission.update': 'Update permission',\n 'permission.delete': 'Delete permission',\n 'release.create': 'Create release',\n 'release.update': 'Update release',\n 'release.delete': 'Delete release',\n 'release.trigger': 'Trigger release',\n 'release.entry.add': 'Add entry to release',\n 'release.entry.update': 'Change entry on release',\n 'release.entry.remove': 'Remove entry from release',\n 'release.settings.update': 'Update release settings',\n 'audit-log.export': 'Export audit logs',\n 'locale.create': 'Create locale',\n 'locale.update': 'Update locale',\n 'locale.delete': 'Delete locale',\n 'locale.default.update': 'Change default locale',\n 'token.create': 'Create token',\n 'token.update': 'Update token',\n 'token.delete': 'Delete token',\n 'token.regenerate': 'Regenerate token',\n 'admin-user.create': 'Create user',\n 'admin-user.update': 'Update user',\n 'admin-user.delete': 'Delete user',\n 'admin-user.invite.accept': 'Accept invitation',\n 'admin-user.password-reset.create': 'Request password reset',\n 'admin-user.password-reset.confirm': 'Reset password',\n 'admin-user.password.update': 'Update password',\n 'webhook.create': 'Create webhook',\n 'webhook.update': 'Update webhook',\n 'webhook.delete': 'Delete webhook',\n 'workflow.create': 'Create workflow',\n 'workflow.update': 'Update workflow',\n 'workflow.delete': 'Delete workflow',\n 'review-workflows.updateEntryStage': 'Change entry stage',\n 'entry.assignee.update': 'Change entry assignee',\n};\n\nexport const getDefaultMessage = (value: keyof typeof actionTypes) => {\n return actionTypes[value] || value;\n};\n"],"names":["actionTypes","getDefaultMessage","value"],"mappings":"MAAaA,WAAAA,GAAc;IACzB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,eAAA,EAAiB,+DAAA;IACjB,iBAAA,EAAmB,iEAAA;IACnB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,oBAAA,EAAsB,aAAA;IACtB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,iBAAA,EAAmB,iBAAA;IACnB,mBAAA,EAAqB,sBAAA;IACrB,sBAAA,EAAwB,yBAAA;IACxB,sBAAA,EAAwB,2BAAA;IACxB,yBAAA,EAA2B,yBAAA;IAC3B,kBAAA,EAAoB,mBAAA;IACpB,eAAA,EAAiB,eAAA;IACjB,eAAA,EAAiB,eAAA;IACjB,eAAA,EAAiB,eAAA;IACjB,uBAAA,EAAyB,uBAAA;IACzB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,kBAAA,EAAoB,kBAAA;IACpB,mBAAA,EAAqB,aAAA;IACrB,mBAAA,EAAqB,aAAA;IACrB,mBAAA,EAAqB,aAAA;IACrB,0BAAA,EAA4B,mBAAA;IAC5B,kCAAA,EAAoC,wBAAA;IACpC,mCAAA,EAAqC,gBAAA;IACrC,4BAAA,EAA8B,iBAAA;IAC9B,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,iBAAA,EAAmB,iBAAA;IACnB,iBAAA,EAAmB,iBAAA;IACnB,iBAAA,EAAmB,iBAAA;IACnB,mCAAA,EAAqC,oBAAA;IACrC,uBAAA,EAAyB;AAC3B;AAEO,MAAMC,oBAAoB,CAACC,KAAAA,GAAAA;IAChC,OAAOF,WAAW,CAACE,KAAAA,CAAM,IAAIA,KAAAA;AAC/B;;;;"}
@@ -1,2 +1,11 @@
1
- declare const MediaLibraryBanner: () => import("react/jsx-runtime").JSX.Element | null;
1
+ interface MediaLibraryBannerProps {
2
+ /**
3
+ * Called synchronously (before paint) whenever this banner's own visibility changes, so a
4
+ * parent rendering it alongside another banner (e.g. `UpsellBanner`) can hide that other one
5
+ * instead of stacking both. This banner owns its dismissal state, so it's the source of truth
6
+ * for whether it's showing — the parent shouldn't have to re-derive that itself.
7
+ */
8
+ onVisibilityChange?: (isVisible: boolean) => void;
9
+ }
10
+ declare const MediaLibraryBanner: ({ onVisibilityChange }?: MediaLibraryBannerProps) => import("react/jsx-runtime").JSX.Element | null;
2
11
  export { MediaLibraryBanner };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @description Renders the admin's top banners, ensuring only one shows at a time instead of
3
+ * stacking: the Media Library banner takes priority over the upsell one. Kept as its own
4
+ * component (rather than inline in `AuthenticatedLayout`) so this wiring can be unit tested
5
+ * without the rest of the layout's unrelated dependencies (menu, tracking, app info, etc.).
6
+ */
7
+ declare const TopBanners: () => import("react/jsx-runtime").JSX.Element;
8
+ export { TopBanners };
@@ -13,6 +13,13 @@ export interface TelemetryProperties {
13
13
  export interface TrackingContextValue {
14
14
  uuid?: string | boolean;
15
15
  telemetryProperties?: TelemetryProperties;
16
+ strapiVersion?: string | null;
17
+ /**
18
+ * True once the version that `trackUsage` will attach is known, or the
19
+ * information request has failed. Callers that must send a single event
20
+ * wait for this so a later version update does not send the event again.
21
+ */
22
+ isStrapiVersionReady: boolean;
16
23
  }
17
24
  export interface TrackingProviderProps {
18
25
  children: React.ReactNode;
@@ -285,4 +292,8 @@ export interface UseTrackingReturn {
285
292
  * ```
286
293
  */
287
294
  declare const useTracking: () => UseTrackingReturn;
288
- export { TrackingProvider, useTracking };
295
+ /**
296
+ * Internal readiness signal for events that must wait for the provider's version.
297
+ */
298
+ declare const useStrapiVersionReady: () => boolean;
299
+ export { TrackingProvider, useTracking, useStrapiVersionReady };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Sends `didAccessAuthenticatedAdministration` once per mount, after the Strapi
3
+ * version is ready and the telemetry-properties query has settled.
4
+ */
5
+ declare const useAuthenticatedAccessTracking: (projectId?: string | null) => void;
6
+ export { useAuthenticatedAccessTracking };
@@ -54,5 +54,10 @@ export declare const actionTypes: {
54
54
  'webhook.create': string;
55
55
  'webhook.update': string;
56
56
  'webhook.delete': string;
57
+ 'workflow.create': string;
58
+ 'workflow.update': string;
59
+ 'workflow.delete': string;
60
+ 'review-workflows.updateEntryStage': string;
61
+ 'entry.assignee.update': string;
57
62
  };
58
63
  export declare const getDefaultMessage: (value: keyof typeof actionTypes) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/controllers/admin.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;;sBAI/C,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;AAF1D,wBAmEE"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/controllers/admin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;;sBAI/C,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;AAF1D,wBAmEE"}
@@ -22,7 +22,10 @@ export declare const getAdminStore: () => Promise<{
22
22
  tag?: string;
23
23
  }>): Promise<void>;
24
24
  }>;
25
- export declare const getPrefixedRedirectUrls: () => import("lodash").Dictionary<string>;
25
+ export declare const getPrefixedRedirectUrls: () => {
26
+ success: string;
27
+ error: string;
28
+ };
26
29
  declare const _default: {
27
30
  getAdminStore: () => Promise<{
28
31
  get(params?: Partial<{
@@ -48,7 +51,10 @@ declare const _default: {
48
51
  tag?: string;
49
52
  }>): Promise<void>;
50
53
  }>;
51
- getPrefixedRedirectUrls: () => import("lodash").Dictionary<string>;
54
+ getPrefixedRedirectUrls: () => {
55
+ success: string;
56
+ error: string;
57
+ };
52
58
  };
53
59
  export default _default;
54
60
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/controllers/authentication-utils/utils.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;EAA4D,CAAC;AAEvF,eAAO,MAAM,uBAAuB,2CAKnC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,wBAGE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/controllers/authentication-utils/utils.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;EAA4D,CAAC;AAEvF,eAAO,MAAM,uBAAuB;;;CAKnC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,wBAGE"}
@@ -1 +1 @@
1
- {"version":3,"file":"authentication.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/controllers/authentication.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;;sBAmBf,OAAO;iCAMI,OAAO;oCASJ,OAAO;uBAmB1B,OAAO,QAAQ,IAAI;;AAnCxC,wBAgDE"}
1
+ {"version":3,"file":"authentication.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/controllers/authentication.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;;sBAmBf,OAAO;iCAMI,OAAO;oCASJ,OAAO;uBAmB1B,OAAO,QAAQ,IAAI;;AAnCxC,wBAgDE"}