@strapi/admin 5.29.0 → 5.30.1

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 (375) hide show
  1. package/dist/admin/admin/src/StrapiApp.js.map +1 -1
  2. package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
  3. package/dist/admin/admin/src/components/ContentBox.js.map +1 -1
  4. package/dist/admin/admin/src/components/ContentBox.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/DescriptionComponentRenderer.js.map +1 -1
  6. package/dist/admin/admin/src/components/DescriptionComponentRenderer.mjs.map +1 -1
  7. package/dist/admin/admin/src/components/Filters.js +1 -1
  8. package/dist/admin/admin/src/components/Filters.js.map +1 -1
  9. package/dist/admin/admin/src/components/Filters.mjs +1 -1
  10. package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
  11. package/dist/admin/admin/src/components/Form.js +8 -3
  12. package/dist/admin/admin/src/components/Form.js.map +1 -1
  13. package/dist/admin/admin/src/components/Form.mjs +8 -3
  14. package/dist/admin/admin/src/components/Form.mjs.map +1 -1
  15. package/dist/admin/admin/src/components/FormInputs/Enumeration.js +1 -1
  16. package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
  17. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +1 -1
  18. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
  19. package/dist/admin/admin/src/components/FormInputs/Number.js +1 -1
  20. package/dist/admin/admin/src/components/FormInputs/Number.js.map +1 -1
  21. package/dist/admin/admin/src/components/FormInputs/Number.mjs +1 -1
  22. package/dist/admin/admin/src/components/FormInputs/Number.mjs.map +1 -1
  23. package/dist/admin/admin/src/components/FormInputs/Renderer.js.map +1 -1
  24. package/dist/admin/admin/src/components/FormInputs/Renderer.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/FormInputs/String.js +2 -1
  26. package/dist/admin/admin/src/components/FormInputs/String.js.map +1 -1
  27. package/dist/admin/admin/src/components/FormInputs/String.mjs +2 -1
  28. package/dist/admin/admin/src/components/FormInputs/String.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/FormInputs/Time.js.map +1 -1
  30. package/dist/admin/admin/src/components/FormInputs/Time.mjs.map +1 -1
  31. package/dist/admin/admin/src/components/GapDropZone.js.map +1 -1
  32. package/dist/admin/admin/src/components/GapDropZone.mjs.map +1 -1
  33. package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -1
  34. package/dist/admin/admin/src/components/GuidedTour/Overview.mjs.map +1 -1
  35. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js.map +1 -1
  36. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs.map +1 -1
  37. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js.map +1 -1
  38. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs.map +1 -1
  39. package/dist/admin/admin/src/components/Layouts/GridLayout.js.map +1 -1
  40. package/dist/admin/admin/src/components/Layouts/GridLayout.mjs.map +1 -1
  41. package/dist/admin/admin/src/components/Layouts/HeaderLayout.js +8 -4
  42. package/dist/admin/admin/src/components/Layouts/HeaderLayout.js.map +1 -1
  43. package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs +8 -4
  44. package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs.map +1 -1
  45. package/dist/admin/admin/src/components/NpsSurvey.js +5 -3
  46. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  47. package/dist/admin/admin/src/components/NpsSurvey.mjs +5 -3
  48. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  49. package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
  50. package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
  51. package/dist/admin/admin/src/components/PrivateRoute.js.map +1 -1
  52. package/dist/admin/admin/src/components/PrivateRoute.mjs.map +1 -1
  53. package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
  54. package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
  55. package/dist/admin/admin/src/components/ResizeIndicator.js.map +1 -1
  56. package/dist/admin/admin/src/components/ResizeIndicator.mjs.map +1 -1
  57. package/dist/admin/admin/src/components/Table.js +1 -1
  58. package/dist/admin/admin/src/components/Table.js.map +1 -1
  59. package/dist/admin/admin/src/components/Table.mjs +1 -1
  60. package/dist/admin/admin/src/components/Table.mjs.map +1 -1
  61. package/dist/admin/admin/src/components/Theme.js +34 -1
  62. package/dist/admin/admin/src/components/Theme.js.map +1 -1
  63. package/dist/admin/admin/src/components/Theme.mjs +34 -1
  64. package/dist/admin/admin/src/components/Theme.mjs.map +1 -1
  65. package/dist/admin/admin/src/components/Widgets.js.map +1 -1
  66. package/dist/admin/admin/src/components/Widgets.mjs.map +1 -1
  67. package/dist/admin/admin/src/core/apis/CustomFields.js.map +1 -1
  68. package/dist/admin/admin/src/core/apis/CustomFields.mjs.map +1 -1
  69. package/dist/admin/admin/src/core/apis/Plugin.js +0 -1
  70. package/dist/admin/admin/src/core/apis/Plugin.js.map +1 -1
  71. package/dist/admin/admin/src/core/apis/Plugin.mjs +0 -1
  72. package/dist/admin/admin/src/core/apis/Plugin.mjs.map +1 -1
  73. package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
  74. package/dist/admin/admin/src/core/apis/Widgets.mjs.map +1 -1
  75. package/dist/admin/admin/src/core/apis/rbac.js.map +1 -1
  76. package/dist/admin/admin/src/core/apis/rbac.mjs.map +1 -1
  77. package/dist/admin/admin/src/core/apis/router.js.map +1 -1
  78. package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
  79. package/dist/admin/admin/src/features/BackButton.js.map +1 -1
  80. package/dist/admin/admin/src/features/BackButton.mjs.map +1 -1
  81. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  82. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  83. package/dist/admin/admin/src/features/Widgets.js.map +1 -1
  84. package/dist/admin/admin/src/features/Widgets.mjs.map +1 -1
  85. package/dist/admin/admin/src/hooks/usePersistentState.js.map +1 -1
  86. package/dist/admin/admin/src/hooks/usePersistentState.mjs.map +1 -1
  87. package/dist/admin/admin/src/hooks/useRBAC.js.map +1 -1
  88. package/dist/admin/admin/src/hooks/useRBAC.mjs.map +1 -1
  89. package/dist/admin/admin/src/pages/Auth/components/Login.js +1 -1
  90. package/dist/admin/admin/src/pages/Auth/components/Login.js.map +1 -1
  91. package/dist/admin/admin/src/pages/Auth/components/Login.mjs +1 -1
  92. package/dist/admin/admin/src/pages/Auth/components/Login.mjs.map +1 -1
  93. package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
  94. package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
  95. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  96. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  97. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.js +2 -2
  98. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.js.map +1 -1
  99. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.mjs +2 -2
  100. package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.mjs.map +1 -1
  101. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.js.map +1 -1
  102. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.mjs.map +1 -1
  103. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.js.map +1 -1
  104. package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.mjs.map +1 -1
  105. package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.js.map +1 -1
  106. package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.mjs.map +1 -1
  107. package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.js.map +1 -1
  108. package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.mjs.map +1 -1
  109. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  110. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  111. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +8 -1
  112. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
  113. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +9 -2
  114. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
  115. package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.js.map +1 -1
  116. package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.mjs.map +1 -1
  117. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
  118. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs.map +1 -1
  119. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.js +1 -0
  120. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.js.map +1 -1
  121. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.mjs +1 -0
  122. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.mjs.map +1 -1
  123. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
  124. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -1
  125. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js.map +1 -1
  126. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs.map +1 -1
  127. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.js.map +1 -1
  128. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.mjs.map +1 -1
  129. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +2 -0
  130. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
  131. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +2 -0
  132. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
  133. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  134. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  135. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js +1 -0
  136. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
  137. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs +1 -0
  138. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs.map +1 -1
  139. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/utils/files.js.map +1 -1
  140. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/utils/files.mjs.map +1 -1
  141. package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js.map +1 -1
  142. package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.mjs.map +1 -1
  143. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +10 -2
  144. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
  145. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs +10 -2
  146. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs.map +1 -1
  147. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js +9 -2
  148. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js.map +1 -1
  149. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs +9 -2
  150. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs.map +1 -1
  151. package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js.map +1 -1
  152. package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.mjs.map +1 -1
  153. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
  154. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs.map +1 -1
  155. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js.map +1 -1
  156. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs.map +1 -1
  157. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
  158. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs.map +1 -1
  159. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js.map +1 -1
  160. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs.map +1 -1
  161. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
  162. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
  163. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
  164. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs.map +1 -1
  165. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.js +2 -1
  166. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.js.map +1 -1
  167. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.mjs +2 -1
  168. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.mjs.map +1 -1
  169. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.js.map +1 -1
  170. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.mjs.map +1 -1
  171. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/permissions.js.map +1 -1
  172. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/permissions.mjs.map +1 -1
  173. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
  174. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs.map +1 -1
  175. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js +2 -0
  176. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js.map +1 -1
  177. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.mjs +2 -0
  178. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.mjs.map +1 -1
  179. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js +9 -2
  180. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js.map +1 -1
  181. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs +9 -2
  182. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs.map +1 -1
  183. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js +3 -1
  184. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
  185. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs +3 -1
  186. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
  187. package/dist/admin/admin/src/pages/Settings/pages/Users/components/MagicLinkCE.js.map +1 -1
  188. package/dist/admin/admin/src/pages/Settings/pages/Users/components/MagicLinkCE.mjs.map +1 -1
  189. package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.js.map +1 -1
  190. package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.mjs.map +1 -1
  191. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.js.map +1 -1
  192. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.mjs.map +1 -1
  193. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js.map +1 -1
  194. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs.map +1 -1
  195. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +1 -1
  196. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js.map +1 -1
  197. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs +1 -1
  198. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs.map +1 -1
  199. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js +9 -2
  200. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js.map +1 -1
  201. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs +9 -2
  202. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs.map +1 -1
  203. package/dist/admin/admin/src/pages/UseCasePage.js +1 -0
  204. package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
  205. package/dist/admin/admin/src/pages/UseCasePage.mjs +1 -0
  206. package/dist/admin/admin/src/pages/UseCasePage.mjs.map +1 -1
  207. package/dist/admin/admin/src/services/api.js +2 -1
  208. package/dist/admin/admin/src/services/api.js.map +1 -1
  209. package/dist/admin/admin/src/services/api.mjs +2 -1
  210. package/dist/admin/admin/src/services/api.mjs.map +1 -1
  211. package/dist/admin/admin/src/services/apiTokens.js.map +1 -1
  212. package/dist/admin/admin/src/services/apiTokens.mjs.map +1 -1
  213. package/dist/admin/admin/src/services/transferTokens.js.map +1 -1
  214. package/dist/admin/admin/src/services/transferTokens.mjs.map +1 -1
  215. package/dist/admin/admin/src/services/users.js.map +1 -1
  216. package/dist/admin/admin/src/services/users.mjs.map +1 -1
  217. package/dist/admin/admin/src/services/webhooks.js.map +1 -1
  218. package/dist/admin/admin/src/services/webhooks.mjs.map +1 -1
  219. package/dist/admin/admin/src/translations/en.json.js +4 -0
  220. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  221. package/dist/admin/admin/src/translations/en.json.mjs +4 -0
  222. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  223. package/dist/admin/admin/src/utils/cookies.js.map +1 -1
  224. package/dist/admin/admin/src/utils/cookies.mjs.map +1 -1
  225. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  226. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  227. package/dist/admin/admin/src/utils/getPrefixedId.js.map +1 -1
  228. package/dist/admin/admin/src/utils/getPrefixedId.mjs.map +1 -1
  229. package/dist/admin/admin/src/utils/rulesEngine.js.map +1 -1
  230. package/dist/admin/admin/src/utils/rulesEngine.mjs.map +1 -1
  231. package/dist/admin/admin/src/utils/urls.js.map +1 -1
  232. package/dist/admin/admin/src/utils/urls.mjs.map +1 -1
  233. package/dist/admin/admin/src/utils/users.js.map +1 -1
  234. package/dist/admin/admin/src/utils/users.mjs.map +1 -1
  235. package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js.map +1 -1
  236. package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.mjs.map +1 -1
  237. package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js.map +1 -1
  238. package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.mjs.map +1 -1
  239. package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.js.map +1 -1
  240. package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.mjs.map +1 -1
  241. package/dist/admin/ee/admin/src/pages/AuthResponse.js.map +1 -1
  242. package/dist/admin/ee/admin/src/pages/AuthResponse.mjs.map +1 -1
  243. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
  244. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
  245. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js +3 -3
  246. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js.map +1 -1
  247. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs +3 -3
  248. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs.map +1 -1
  249. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js.map +1 -1
  250. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.mjs.map +1 -1
  251. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.js.map +1 -1
  252. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.mjs.map +1 -1
  253. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js.map +1 -1
  254. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs.map +1 -1
  255. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/MagicLinkEE.js.map +1 -1
  256. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/MagicLinkEE.mjs.map +1 -1
  257. package/dist/admin/ee/admin/src/services/ai.js +14 -1
  258. package/dist/admin/ee/admin/src/services/ai.js.map +1 -1
  259. package/dist/admin/ee/admin/src/services/ai.mjs +14 -2
  260. package/dist/admin/ee/admin/src/services/ai.mjs.map +1 -1
  261. package/dist/admin/ee/admin/src/services/auditLogs.js.map +1 -1
  262. package/dist/admin/ee/admin/src/services/auditLogs.mjs.map +1 -1
  263. package/dist/admin/ee.js +1 -0
  264. package/dist/admin/ee.js.map +1 -1
  265. package/dist/admin/ee.mjs +1 -1
  266. package/dist/admin/src/components/Form.d.ts +1 -1
  267. package/dist/admin/src/core/store/configure.d.ts +2 -2
  268. package/dist/admin/src/core/store/hooks.d.ts +2 -2
  269. package/dist/admin/src/ee.d.ts +1 -1
  270. package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
  271. package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
  272. package/dist/admin/src/selectors.d.ts +2 -2
  273. package/dist/admin/src/services/admin.d.ts +6 -6
  274. package/dist/admin/src/services/api.d.ts +1 -1
  275. package/dist/admin/src/services/apiTokens.d.ts +1 -1
  276. package/dist/admin/src/services/auth.d.ts +13 -13
  277. package/dist/admin/src/services/contentApi.d.ts +1 -1
  278. package/dist/admin/src/services/contentManager.d.ts +1 -1
  279. package/dist/admin/src/services/homepage.d.ts +3 -3
  280. package/dist/admin/src/services/transferTokens.d.ts +1 -1
  281. package/dist/admin/src/services/users.d.ts +8 -8
  282. package/dist/admin/src/services/webhooks.d.ts +2 -2
  283. package/dist/admin/tests/utils.d.ts +1 -1
  284. package/dist/ee/admin/src/services/ai.d.ts +6 -3
  285. package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
  286. package/dist/ee/server/src/ai/containers/ai.d.ts +11 -0
  287. package/dist/ee/server/src/ai/containers/ai.d.ts.map +1 -0
  288. package/dist/ee/server/src/ai/controllers/ai.d.ts +1 -0
  289. package/dist/ee/server/src/ai/controllers/ai.d.ts.map +1 -1
  290. package/dist/ee/server/src/ai/routes/ai.d.ts.map +1 -1
  291. package/dist/ee/server/src/index.d.ts +1 -0
  292. package/dist/ee/server/src/index.d.ts.map +1 -1
  293. package/dist/server/ee/server/src/ai/containers/ai.js +18 -0
  294. package/dist/server/ee/server/src/ai/containers/ai.js.map +1 -0
  295. package/dist/server/ee/server/src/ai/containers/ai.mjs +16 -0
  296. package/dist/server/ee/server/src/ai/containers/ai.mjs.map +1 -0
  297. package/dist/server/ee/server/src/ai/controllers/ai.js +6 -0
  298. package/dist/server/ee/server/src/ai/controllers/ai.js.map +1 -1
  299. package/dist/server/ee/server/src/ai/controllers/ai.mjs +6 -0
  300. package/dist/server/ee/server/src/ai/controllers/ai.mjs.map +1 -1
  301. package/dist/server/ee/server/src/ai/routes/ai.js +11 -0
  302. package/dist/server/ee/server/src/ai/routes/ai.js.map +1 -1
  303. package/dist/server/ee/server/src/ai/routes/ai.mjs +11 -0
  304. package/dist/server/ee/server/src/ai/routes/ai.mjs.map +1 -1
  305. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js.map +1 -1
  306. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs.map +1 -1
  307. package/dist/server/ee/server/src/controllers/authentication-utils/constants.js.map +1 -1
  308. package/dist/server/ee/server/src/controllers/authentication-utils/constants.mjs.map +1 -1
  309. package/dist/server/ee/server/src/controllers/authentication-utils/utils.js.map +1 -1
  310. package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs.map +1 -1
  311. package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
  312. package/dist/server/ee/server/src/controllers/authentication.mjs.map +1 -1
  313. package/dist/server/ee/server/src/controllers/user.js.map +1 -1
  314. package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
  315. package/dist/server/ee/server/src/index.js +7 -0
  316. package/dist/server/ee/server/src/index.js.map +1 -1
  317. package/dist/server/ee/server/src/index.mjs +7 -0
  318. package/dist/server/ee/server/src/index.mjs.map +1 -1
  319. package/dist/server/ee/server/src/services/auth.js.map +1 -1
  320. package/dist/server/ee/server/src/services/auth.mjs.map +1 -1
  321. package/dist/server/ee/server/src/services/passport/sso.js.map +1 -1
  322. package/dist/server/ee/server/src/services/passport/sso.mjs.map +1 -1
  323. package/dist/server/ee/server/src/utils/index.js.map +1 -1
  324. package/dist/server/ee/server/src/utils/index.mjs.map +1 -1
  325. package/dist/server/server/src/controllers/transfer/index.js.map +1 -1
  326. package/dist/server/server/src/controllers/transfer/index.mjs.map +1 -1
  327. package/dist/server/server/src/controllers/user.js +10 -0
  328. package/dist/server/server/src/controllers/user.js.map +1 -1
  329. package/dist/server/server/src/controllers/user.mjs +10 -0
  330. package/dist/server/server/src/controllers/user.mjs.map +1 -1
  331. package/dist/server/server/src/domain/action/index.js.map +1 -1
  332. package/dist/server/server/src/domain/action/index.mjs.map +1 -1
  333. package/dist/server/server/src/domain/condition/index.js.map +1 -1
  334. package/dist/server/server/src/domain/condition/index.mjs.map +1 -1
  335. package/dist/server/server/src/domain/permission/index.js.map +1 -1
  336. package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
  337. package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
  338. package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
  339. package/dist/server/server/src/routes/serve-admin-panel.js.map +1 -1
  340. package/dist/server/server/src/routes/serve-admin-panel.mjs.map +1 -1
  341. package/dist/server/server/src/services/api-token.js.map +1 -1
  342. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  343. package/dist/server/server/src/services/auth.js.map +1 -1
  344. package/dist/server/server/src/services/auth.mjs.map +1 -1
  345. package/dist/server/server/src/services/content-type.js.map +1 -1
  346. package/dist/server/server/src/services/content-type.mjs.map +1 -1
  347. package/dist/server/server/src/services/encryption.js.map +1 -1
  348. package/dist/server/server/src/services/encryption.mjs.map +1 -1
  349. package/dist/server/server/src/services/homepage.js.map +1 -1
  350. package/dist/server/server/src/services/homepage.mjs.map +1 -1
  351. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
  352. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
  353. package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
  354. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
  355. package/dist/server/server/src/services/role.js.map +1 -1
  356. package/dist/server/server/src/services/role.mjs.map +1 -1
  357. package/dist/server/server/src/services/transfer/token.js.map +1 -1
  358. package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
  359. package/dist/server/server/src/services/user.js +30 -0
  360. package/dist/server/server/src/services/user.js.map +1 -1
  361. package/dist/server/server/src/services/user.mjs +30 -0
  362. package/dist/server/server/src/services/user.mjs.map +1 -1
  363. package/dist/server/server/src/utils/index.js.map +1 -1
  364. package/dist/server/server/src/utils/index.mjs.map +1 -1
  365. package/dist/server/server/src/validation/action-provider.js.map +1 -1
  366. package/dist/server/server/src/validation/action-provider.mjs.map +1 -1
  367. package/dist/server/server/src/validation/common-functions/check-fields-are-correctly-nested.js.map +1 -1
  368. package/dist/server/server/src/validation/common-functions/check-fields-are-correctly-nested.mjs.map +1 -1
  369. package/dist/server/server/src/validation/common-validators.js.map +1 -1
  370. package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
  371. package/dist/server/src/controllers/user.d.ts.map +1 -1
  372. package/dist/server/src/services/user.d.ts.map +1 -1
  373. package/dist/shared/contracts/ai.d.ts +16 -0
  374. package/dist/shared/contracts/ai.d.ts.map +1 -1
  375. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sources":["../../../../../../ee/server/src/services/auth.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { isSsoLocked } from '../utils/sso-lock';\n\nconst { ApplicationError } = errors;\n/**\n * Send an email to the user if it exists and is not locked to SSO\n * If those conditions are not met, nothing happens\n *\n * @param {Object} param params\n * @param {string} param.email user email for which to reset the password\n */\nconst forgotPassword = async ({ email }: any = {}) => {\n const user = await strapi.db.query('admin::user').findOne({ where: { email, isActive: true } });\n\n if (!user || (await isSsoLocked(user))) {\n return;\n }\n\n const resetPasswordToken = getService('token').createToken();\n await getService('user').updateById(user.id, { resetPasswordToken });\n\n // Send an email to the admin.\n const url = `${strapi.config.get(\n 'admin.absoluteUrl'\n )}/auth/reset-password?code=${resetPasswordToken}`;\n return strapi\n .plugin('email')\n .service('email')\n .sendTemplatedEmail(\n {\n to: user.email,\n from: strapi.config.get('admin.forgotPassword.from'),\n replyTo: strapi.config.get('admin.forgotPassword.replyTo'),\n },\n strapi.config.get('admin.forgotPassword.emailTemplate'),\n {\n url,\n user: _.pick(user, ['email', 'firstname', 'lastname', 'username']),\n }\n )\n .catch((err: unknown) => {\n // log error server side but do not disclose it to the user to avoid leaking informations\n strapi.log.error(err);\n });\n};\n\n/**\n * Reset a user password\n * @param {Object} param params\n * @param {string} param.resetPasswordToken token generated to request a password reset\n * @param {string} param.password new user password\n */\nconst resetPassword = async ({ resetPasswordToken, password }: any = {}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { resetPasswordToken, isActive: true } });\n\n if (!matchingUser || (await isSsoLocked(matchingUser))) {\n throw new ApplicationError();\n }\n\n return getService('user').updateById(matchingUser.id, {\n password,\n resetPasswordToken: null,\n });\n};\n\nexport default {\n forgotPassword,\n resetPassword,\n};\n"],"names":["ApplicationError","errors","forgotPassword","email","user","strapi","db","query","findOne","where","isActive","isSsoLocked","resetPasswordToken","getService","createToken","updateById","id","url","config","get","plugin","service","sendTemplatedEmail","to","from","replyTo","_","pick","catch","err","log","error","resetPassword","password","matchingUser"],"mappings":";;;;;;;AAKA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,YAAAA;AAC7B;;;;;;IAOA,MAAMC,iBAAiB,OAAO,EAAEC,KAAK,EAAO,GAAG,EAAE,GAAA;IAC/C,MAAMC,IAAAA,GAAO,MAAMC,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAAC,aAAeC,CAAAA,CAAAA,OAAO,CAAC;QAAEC,KAAO,EAAA;AAAEN,YAAAA,KAAAA;YAAOO,QAAU,EAAA;AAAK;AAAE,KAAA,CAAA;AAE7F,IAAA,IAAI,CAACN,IAAAA,IAAS,MAAMO,mBAAAA,CAAYP,IAAQ,CAAA,EAAA;AACtC,QAAA;AACF;IAEA,MAAMQ,kBAAAA,GAAqBC,gBAAW,CAAA,OAAA,CAAA,CAASC,WAAW,EAAA;AAC1D,IAAA,MAAMD,iBAAW,MAAQE,CAAAA,CAAAA,UAAU,CAACX,IAAAA,CAAKY,EAAE,EAAE;AAAEJ,QAAAA;AAAmB,KAAA,CAAA;;AAGlE,IAAA,MAAMK,GAAM,GAAA,CAAC,EAAEZ,MAAAA,CAAOa,MAAM,CAACC,GAAG,CAC9B,mBACA,CAAA,CAAA,0BAA0B,EAAEP,kBAAAA,CAAmB,CAAC;IAClD,OAAOP,MAAAA,CACJe,MAAM,CAAC,OAAA,CAAA,CACPC,OAAO,CAAC,OAAA,CAAA,CACRC,kBAAkB,CACjB;AACEC,QAAAA,EAAAA,EAAInB,KAAKD,KAAK;AACdqB,QAAAA,IAAAA,EAAMnB,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,2BAAA,CAAA;AACxBM,QAAAA,OAAAA,EAASpB,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,8BAAA;AAC7B,KAAA,EACAd,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,oCAClB,CAAA,EAAA;AACEF,QAAAA,GAAAA;QACAb,IAAMsB,EAAAA,CAAAA,CAAEC,IAAI,CAACvB,IAAM,EAAA;AAAC,YAAA,OAAA;AAAS,YAAA,WAAA;AAAa,YAAA,UAAA;AAAY,YAAA;AAAW,SAAA;KAGpEwB,CAAAA,CAAAA,KAAK,CAAC,CAACC,GAAAA,GAAAA;;QAENxB,MAAOyB,CAAAA,GAAG,CAACC,KAAK,CAACF,GAAAA,CAAAA;AACnB,KAAA,CAAA;AACJ,CAAA;AAEA;;;;;IAMA,MAAMG,aAAgB,GAAA,OAAO,EAAEpB,kBAAkB,EAAEqB,QAAQ,EAAO,GAAG,EAAE,GAAA;IACrE,MAAMC,YAAAA,GAAe,MAAM7B,MAAOC,CAAAA,EAAE,CACjCC,KAAK,CAAC,aACNC,CAAAA,CAAAA,OAAO,CAAC;QAAEC,KAAO,EAAA;AAAEG,YAAAA,kBAAAA;YAAoBF,QAAU,EAAA;AAAK;AAAE,KAAA,CAAA;AAE3D,IAAA,IAAI,CAACwB,YAAAA,IAAiB,MAAMvB,mBAAAA,CAAYuB,YAAgB,CAAA,EAAA;AACtD,QAAA,MAAM,IAAIlC,gBAAAA,EAAAA;AACZ;AAEA,IAAA,OAAOa,iBAAW,MAAQE,CAAAA,CAAAA,UAAU,CAACmB,YAAAA,CAAalB,EAAE,EAAE;AACpDiB,QAAAA,QAAAA;QACArB,kBAAoB,EAAA;AACtB,KAAA,CAAA;AACF,CAAA;AAEA,WAAe;AACbV,IAAAA,cAAAA;AACA8B,IAAAA;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"auth.js","sources":["../../../../../../ee/server/src/services/auth.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { isSsoLocked } from '../utils/sso-lock';\n\nconst { ApplicationError } = errors;\n/**\n * Send an email to the user if it exists and is not locked to SSO\n * If those conditions are not met, nothing happens\n *\n * @param {Object} param params\n * @param {string} param.email user email for which to reset the password\n */\nconst forgotPassword = async ({ email }: any = {}) => {\n const user = await strapi.db.query('admin::user').findOne({ where: { email, isActive: true } });\n\n if (!user || (await isSsoLocked(user))) {\n return;\n }\n\n const resetPasswordToken = getService('token').createToken();\n await getService('user').updateById(user.id, { resetPasswordToken });\n\n // Send an email to the admin.\n const url = `${strapi.config.get(\n 'admin.absoluteUrl'\n )}/auth/reset-password?code=${resetPasswordToken}`;\n return strapi\n .plugin('email')\n .service('email')\n .sendTemplatedEmail(\n {\n to: user.email,\n from: strapi.config.get('admin.forgotPassword.from'),\n replyTo: strapi.config.get('admin.forgotPassword.replyTo'),\n },\n strapi.config.get('admin.forgotPassword.emailTemplate'),\n {\n url,\n user: _.pick(user, ['email', 'firstname', 'lastname', 'username']),\n }\n )\n .catch((err: unknown) => {\n // log error server side but do not disclose it to the user to avoid leaking informations\n strapi.log.error(err);\n });\n};\n\n/**\n * Reset a user password\n * @param {Object} param params\n * @param {string} param.resetPasswordToken token generated to request a password reset\n * @param {string} param.password new user password\n */\nconst resetPassword = async ({ resetPasswordToken, password }: any = {}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { resetPasswordToken, isActive: true } });\n\n if (!matchingUser || (await isSsoLocked(matchingUser))) {\n throw new ApplicationError();\n }\n\n return getService('user').updateById(matchingUser.id, {\n password,\n resetPasswordToken: null,\n });\n};\n\nexport default {\n forgotPassword,\n resetPassword,\n};\n"],"names":["ApplicationError","errors","forgotPassword","email","user","strapi","db","query","findOne","where","isActive","isSsoLocked","resetPasswordToken","getService","createToken","updateById","id","url","config","get","plugin","service","sendTemplatedEmail","to","from","replyTo","_","pick","catch","err","log","error","resetPassword","password","matchingUser"],"mappings":";;;;;;;AAKA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,YAAAA;AAC7B;;;;;;IAOA,MAAMC,iBAAiB,OAAO,EAAEC,KAAK,EAAO,GAAG,EAAE,GAAA;IAC/C,MAAMC,IAAAA,GAAO,MAAMC,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAAC,aAAeC,CAAAA,CAAAA,OAAO,CAAC;QAAEC,KAAO,EAAA;AAAEN,YAAAA,KAAAA;YAAOO,QAAU,EAAA;AAAK;AAAE,KAAA,CAAA;AAE7F,IAAA,IAAI,CAACN,IAAAA,IAAS,MAAMO,mBAAAA,CAAYP,IAAQ,CAAA,EAAA;AACtC,QAAA;AACF;IAEA,MAAMQ,kBAAAA,GAAqBC,gBAAW,CAAA,OAAA,CAAA,CAASC,WAAW,EAAA;AAC1D,IAAA,MAAMD,iBAAW,MAAQE,CAAAA,CAAAA,UAAU,CAACX,IAAAA,CAAKY,EAAE,EAAE;AAAEJ,QAAAA;AAAmB,KAAA,CAAA;;IAGlE,MAAMK,GAAAA,GAAM,CAAGZ,EAAAA,MAAAA,CAAOa,MAAM,CAACC,GAAG,CAC9B,mBAAA,CAAA,CACA,0BAA0B,EAAEP,kBAAoB,CAAA,CAAA;IAClD,OAAOP,MAAAA,CACJe,MAAM,CAAC,OAAA,CAAA,CACPC,OAAO,CAAC,OAAA,CAAA,CACRC,kBAAkB,CACjB;AACEC,QAAAA,EAAAA,EAAInB,KAAKD,KAAK;AACdqB,QAAAA,IAAAA,EAAMnB,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,2BAAA,CAAA;AACxBM,QAAAA,OAAAA,EAASpB,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,8BAAA;AAC7B,KAAA,EACAd,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,oCAClB,CAAA,EAAA;AACEF,QAAAA,GAAAA;QACAb,IAAMsB,EAAAA,CAAAA,CAAEC,IAAI,CAACvB,IAAM,EAAA;AAAC,YAAA,OAAA;AAAS,YAAA,WAAA;AAAa,YAAA,UAAA;AAAY,YAAA;AAAW,SAAA;KAGpEwB,CAAAA,CAAAA,KAAK,CAAC,CAACC,GAAAA,GAAAA;;QAENxB,MAAOyB,CAAAA,GAAG,CAACC,KAAK,CAACF,GAAAA,CAAAA;AACnB,KAAA,CAAA;AACJ,CAAA;AAEA;;;;;IAMA,MAAMG,aAAgB,GAAA,OAAO,EAAEpB,kBAAkB,EAAEqB,QAAQ,EAAO,GAAG,EAAE,GAAA;IACrE,MAAMC,YAAAA,GAAe,MAAM7B,MAAOC,CAAAA,EAAE,CACjCC,KAAK,CAAC,aACNC,CAAAA,CAAAA,OAAO,CAAC;QAAEC,KAAO,EAAA;AAAEG,YAAAA,kBAAAA;YAAoBF,QAAU,EAAA;AAAK;AAAE,KAAA,CAAA;AAE3D,IAAA,IAAI,CAACwB,YAAAA,IAAiB,MAAMvB,mBAAAA,CAAYuB,YAAgB,CAAA,EAAA;AACtD,QAAA,MAAM,IAAIlC,gBAAAA,EAAAA;AACZ;AAEA,IAAA,OAAOa,iBAAW,MAAQE,CAAAA,CAAAA,UAAU,CAACmB,YAAAA,CAAalB,EAAE,EAAE;AACpDiB,QAAAA,QAAAA;QACArB,kBAAoB,EAAA;AACtB,KAAA,CAAA;AACF,CAAA;AAEA,WAAe;AACbV,IAAAA,cAAAA;AACA8B,IAAAA;AACF,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.mjs","sources":["../../../../../../ee/server/src/services/auth.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { isSsoLocked } from '../utils/sso-lock';\n\nconst { ApplicationError } = errors;\n/**\n * Send an email to the user if it exists and is not locked to SSO\n * If those conditions are not met, nothing happens\n *\n * @param {Object} param params\n * @param {string} param.email user email for which to reset the password\n */\nconst forgotPassword = async ({ email }: any = {}) => {\n const user = await strapi.db.query('admin::user').findOne({ where: { email, isActive: true } });\n\n if (!user || (await isSsoLocked(user))) {\n return;\n }\n\n const resetPasswordToken = getService('token').createToken();\n await getService('user').updateById(user.id, { resetPasswordToken });\n\n // Send an email to the admin.\n const url = `${strapi.config.get(\n 'admin.absoluteUrl'\n )}/auth/reset-password?code=${resetPasswordToken}`;\n return strapi\n .plugin('email')\n .service('email')\n .sendTemplatedEmail(\n {\n to: user.email,\n from: strapi.config.get('admin.forgotPassword.from'),\n replyTo: strapi.config.get('admin.forgotPassword.replyTo'),\n },\n strapi.config.get('admin.forgotPassword.emailTemplate'),\n {\n url,\n user: _.pick(user, ['email', 'firstname', 'lastname', 'username']),\n }\n )\n .catch((err: unknown) => {\n // log error server side but do not disclose it to the user to avoid leaking informations\n strapi.log.error(err);\n });\n};\n\n/**\n * Reset a user password\n * @param {Object} param params\n * @param {string} param.resetPasswordToken token generated to request a password reset\n * @param {string} param.password new user password\n */\nconst resetPassword = async ({ resetPasswordToken, password }: any = {}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { resetPasswordToken, isActive: true } });\n\n if (!matchingUser || (await isSsoLocked(matchingUser))) {\n throw new ApplicationError();\n }\n\n return getService('user').updateById(matchingUser.id, {\n password,\n resetPasswordToken: null,\n });\n};\n\nexport default {\n forgotPassword,\n resetPassword,\n};\n"],"names":["ApplicationError","errors","forgotPassword","email","user","strapi","db","query","findOne","where","isActive","isSsoLocked","resetPasswordToken","getService","createToken","updateById","id","url","config","get","plugin","service","sendTemplatedEmail","to","from","replyTo","_","pick","catch","err","log","error","resetPassword","password","matchingUser"],"mappings":";;;;;AAKA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,MAAAA;AAC7B;;;;;;IAOA,MAAMC,iBAAiB,OAAO,EAAEC,KAAK,EAAO,GAAG,EAAE,GAAA;IAC/C,MAAMC,IAAAA,GAAO,MAAMC,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAAC,aAAeC,CAAAA,CAAAA,OAAO,CAAC;QAAEC,KAAO,EAAA;AAAEN,YAAAA,KAAAA;YAAOO,QAAU,EAAA;AAAK;AAAE,KAAA,CAAA;AAE7F,IAAA,IAAI,CAACN,IAAAA,IAAS,MAAMO,WAAAA,CAAYP,IAAQ,CAAA,EAAA;AACtC,QAAA;AACF;IAEA,MAAMQ,kBAAAA,GAAqBC,UAAW,CAAA,OAAA,CAAA,CAASC,WAAW,EAAA;AAC1D,IAAA,MAAMD,WAAW,MAAQE,CAAAA,CAAAA,UAAU,CAACX,IAAAA,CAAKY,EAAE,EAAE;AAAEJ,QAAAA;AAAmB,KAAA,CAAA;;AAGlE,IAAA,MAAMK,GAAM,GAAA,CAAC,EAAEZ,MAAAA,CAAOa,MAAM,CAACC,GAAG,CAC9B,mBACA,CAAA,CAAA,0BAA0B,EAAEP,kBAAAA,CAAmB,CAAC;IAClD,OAAOP,MAAAA,CACJe,MAAM,CAAC,OAAA,CAAA,CACPC,OAAO,CAAC,OAAA,CAAA,CACRC,kBAAkB,CACjB;AACEC,QAAAA,EAAAA,EAAInB,KAAKD,KAAK;AACdqB,QAAAA,IAAAA,EAAMnB,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,2BAAA,CAAA;AACxBM,QAAAA,OAAAA,EAASpB,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,8BAAA;AAC7B,KAAA,EACAd,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,oCAClB,CAAA,EAAA;AACEF,QAAAA,GAAAA;QACAb,IAAMsB,EAAAA,UAAAA,CAAEC,IAAI,CAACvB,IAAM,EAAA;AAAC,YAAA,OAAA;AAAS,YAAA,WAAA;AAAa,YAAA,UAAA;AAAY,YAAA;AAAW,SAAA;KAGpEwB,CAAAA,CAAAA,KAAK,CAAC,CAACC,GAAAA,GAAAA;;QAENxB,MAAOyB,CAAAA,GAAG,CAACC,KAAK,CAACF,GAAAA,CAAAA;AACnB,KAAA,CAAA;AACJ,CAAA;AAEA;;;;;IAMA,MAAMG,aAAgB,GAAA,OAAO,EAAEpB,kBAAkB,EAAEqB,QAAQ,EAAO,GAAG,EAAE,GAAA;IACrE,MAAMC,YAAAA,GAAe,MAAM7B,MAAOC,CAAAA,EAAE,CACjCC,KAAK,CAAC,aACNC,CAAAA,CAAAA,OAAO,CAAC;QAAEC,KAAO,EAAA;AAAEG,YAAAA,kBAAAA;YAAoBF,QAAU,EAAA;AAAK;AAAE,KAAA,CAAA;AAE3D,IAAA,IAAI,CAACwB,YAAAA,IAAiB,MAAMvB,WAAAA,CAAYuB,YAAgB,CAAA,EAAA;AACtD,QAAA,MAAM,IAAIlC,gBAAAA,EAAAA;AACZ;AAEA,IAAA,OAAOa,WAAW,MAAQE,CAAAA,CAAAA,UAAU,CAACmB,YAAAA,CAAalB,EAAE,EAAE;AACpDiB,QAAAA,QAAAA;QACArB,kBAAoB,EAAA;AACtB,KAAA,CAAA;AACF,CAAA;AAEA,WAAe;AACbV,IAAAA,cAAAA;AACA8B,IAAAA;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"auth.mjs","sources":["../../../../../../ee/server/src/services/auth.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { isSsoLocked } from '../utils/sso-lock';\n\nconst { ApplicationError } = errors;\n/**\n * Send an email to the user if it exists and is not locked to SSO\n * If those conditions are not met, nothing happens\n *\n * @param {Object} param params\n * @param {string} param.email user email for which to reset the password\n */\nconst forgotPassword = async ({ email }: any = {}) => {\n const user = await strapi.db.query('admin::user').findOne({ where: { email, isActive: true } });\n\n if (!user || (await isSsoLocked(user))) {\n return;\n }\n\n const resetPasswordToken = getService('token').createToken();\n await getService('user').updateById(user.id, { resetPasswordToken });\n\n // Send an email to the admin.\n const url = `${strapi.config.get(\n 'admin.absoluteUrl'\n )}/auth/reset-password?code=${resetPasswordToken}`;\n return strapi\n .plugin('email')\n .service('email')\n .sendTemplatedEmail(\n {\n to: user.email,\n from: strapi.config.get('admin.forgotPassword.from'),\n replyTo: strapi.config.get('admin.forgotPassword.replyTo'),\n },\n strapi.config.get('admin.forgotPassword.emailTemplate'),\n {\n url,\n user: _.pick(user, ['email', 'firstname', 'lastname', 'username']),\n }\n )\n .catch((err: unknown) => {\n // log error server side but do not disclose it to the user to avoid leaking informations\n strapi.log.error(err);\n });\n};\n\n/**\n * Reset a user password\n * @param {Object} param params\n * @param {string} param.resetPasswordToken token generated to request a password reset\n * @param {string} param.password new user password\n */\nconst resetPassword = async ({ resetPasswordToken, password }: any = {}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { resetPasswordToken, isActive: true } });\n\n if (!matchingUser || (await isSsoLocked(matchingUser))) {\n throw new ApplicationError();\n }\n\n return getService('user').updateById(matchingUser.id, {\n password,\n resetPasswordToken: null,\n });\n};\n\nexport default {\n forgotPassword,\n resetPassword,\n};\n"],"names":["ApplicationError","errors","forgotPassword","email","user","strapi","db","query","findOne","where","isActive","isSsoLocked","resetPasswordToken","getService","createToken","updateById","id","url","config","get","plugin","service","sendTemplatedEmail","to","from","replyTo","_","pick","catch","err","log","error","resetPassword","password","matchingUser"],"mappings":";;;;;AAKA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,MAAAA;AAC7B;;;;;;IAOA,MAAMC,iBAAiB,OAAO,EAAEC,KAAK,EAAO,GAAG,EAAE,GAAA;IAC/C,MAAMC,IAAAA,GAAO,MAAMC,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAAC,aAAeC,CAAAA,CAAAA,OAAO,CAAC;QAAEC,KAAO,EAAA;AAAEN,YAAAA,KAAAA;YAAOO,QAAU,EAAA;AAAK;AAAE,KAAA,CAAA;AAE7F,IAAA,IAAI,CAACN,IAAAA,IAAS,MAAMO,WAAAA,CAAYP,IAAQ,CAAA,EAAA;AACtC,QAAA;AACF;IAEA,MAAMQ,kBAAAA,GAAqBC,UAAW,CAAA,OAAA,CAAA,CAASC,WAAW,EAAA;AAC1D,IAAA,MAAMD,WAAW,MAAQE,CAAAA,CAAAA,UAAU,CAACX,IAAAA,CAAKY,EAAE,EAAE;AAAEJ,QAAAA;AAAmB,KAAA,CAAA;;IAGlE,MAAMK,GAAAA,GAAM,CAAGZ,EAAAA,MAAAA,CAAOa,MAAM,CAACC,GAAG,CAC9B,mBAAA,CAAA,CACA,0BAA0B,EAAEP,kBAAoB,CAAA,CAAA;IAClD,OAAOP,MAAAA,CACJe,MAAM,CAAC,OAAA,CAAA,CACPC,OAAO,CAAC,OAAA,CAAA,CACRC,kBAAkB,CACjB;AACEC,QAAAA,EAAAA,EAAInB,KAAKD,KAAK;AACdqB,QAAAA,IAAAA,EAAMnB,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,2BAAA,CAAA;AACxBM,QAAAA,OAAAA,EAASpB,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,8BAAA;AAC7B,KAAA,EACAd,MAAOa,CAAAA,MAAM,CAACC,GAAG,CAAC,oCAClB,CAAA,EAAA;AACEF,QAAAA,GAAAA;QACAb,IAAMsB,EAAAA,UAAAA,CAAEC,IAAI,CAACvB,IAAM,EAAA;AAAC,YAAA,OAAA;AAAS,YAAA,WAAA;AAAa,YAAA,UAAA;AAAY,YAAA;AAAW,SAAA;KAGpEwB,CAAAA,CAAAA,KAAK,CAAC,CAACC,GAAAA,GAAAA;;QAENxB,MAAOyB,CAAAA,GAAG,CAACC,KAAK,CAACF,GAAAA,CAAAA;AACnB,KAAA,CAAA;AACJ,CAAA;AAEA;;;;;IAMA,MAAMG,aAAgB,GAAA,OAAO,EAAEpB,kBAAkB,EAAEqB,QAAQ,EAAO,GAAG,EAAE,GAAA;IACrE,MAAMC,YAAAA,GAAe,MAAM7B,MAAOC,CAAAA,EAAE,CACjCC,KAAK,CAAC,aACNC,CAAAA,CAAAA,OAAO,CAAC;QAAEC,KAAO,EAAA;AAAEG,YAAAA,kBAAAA;YAAoBF,QAAU,EAAA;AAAK;AAAE,KAAA,CAAA;AAE3D,IAAA,IAAI,CAACwB,YAAAA,IAAiB,MAAMvB,WAAAA,CAAYuB,YAAgB,CAAA,EAAA;AACtD,QAAA,MAAM,IAAIlC,gBAAAA,EAAAA;AACZ;AAEA,IAAA,OAAOa,WAAW,MAAQE,CAAAA,CAAAA,UAAU,CAACmB,YAAAA,CAAalB,EAAE,EAAE;AACpDiB,QAAAA,QAAAA;QACArB,kBAAoB,EAAA;AACtB,KAAA,CAAA;AACF,CAAA;AAEA,WAAe;AACbV,IAAAA,cAAAA;AACA8B,IAAAA;AACF,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"sso.js","sources":["../../../../../../../ee/server/src/services/passport/sso.ts"],"sourcesContent":["import '@strapi/types';\nimport passport from '../../../../../server/src/services/passport';\nimport createProviderRegistry from './provider-registry';\n\nexport const providerRegistry = createProviderRegistry();\nconst errorMessage = 'SSO is disabled. Its functionnalities cannot be accessed.';\n\nexport const getStrategyCallbackURL = (providerName: string) => {\n if (!strapi.ee.features.isEnabled('sso')) {\n throw new Error(errorMessage);\n }\n\n return `/admin/connect/${providerName}`;\n};\n\nexport const syncProviderRegistryWithConfig = () => {\n if (!strapi.ee.features.isEnabled('sso')) {\n throw new Error(errorMessage);\n }\n\n const { providers = [] } = strapi.config.get('admin.auth', {}) as any;\n\n // TODO\n // @ts-expect-error check map types\n providerRegistry.registerMany(providers);\n};\n\nexport const SSOAuthEventsMapper = {\n onSSOAutoRegistration: 'admin.auth.autoRegistration',\n};\n\nexport default {\n providerRegistry,\n getStrategyCallbackURL,\n syncProviderRegistryWithConfig,\n authEventsMapper: { ...passport.authEventsMapper, ...SSOAuthEventsMapper },\n};\n"],"names":["providerRegistry","createProviderRegistry","errorMessage","getStrategyCallbackURL","providerName","strapi","ee","features","isEnabled","Error","syncProviderRegistryWithConfig","providers","config","get","registerMany","SSOAuthEventsMapper","onSSOAutoRegistration","authEventsMapper","passport"],"mappings":";;;;;;;;AAIO,MAAMA,mBAAmBC,kBAAyB;AACzD,MAAMC,YAAe,GAAA,2DAAA;AAEd,MAAMC,yBAAyB,CAACC,YAAAA,GAAAA;IACrC,IAAI,CAACC,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAQ,CAAA,EAAA;AACxC,QAAA,MAAM,IAAIC,KAAMP,CAAAA,YAAAA,CAAAA;AAClB;AAEA,IAAA,OAAO,CAAC,eAAe,EAAEE,YAAAA,CAAa,CAAC;AACzC;MAEaM,8BAAiC,GAAA,IAAA;IAC5C,IAAI,CAACL,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAQ,CAAA,EAAA;AACxC,QAAA,MAAM,IAAIC,KAAMP,CAAAA,YAAAA,CAAAA;AAClB;IAEA,MAAM,EAAES,SAAY,GAAA,EAAE,EAAE,GAAGN,MAAOO,CAAAA,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,EAAC,CAAA;;;AAI5Db,IAAAA,gBAAAA,CAAiBc,YAAY,CAACH,SAAAA,CAAAA;AAChC;MAEaI,mBAAsB,GAAA;IACjCC,qBAAuB,EAAA;AACzB;AAEA,UAAe;AACbhB,IAAAA,gBAAAA;AACAG,IAAAA,sBAAAA;AACAO,IAAAA,8BAAAA;IACAO,gBAAkB,EAAA;AAAE,QAAA,GAAGC,SAASD,gBAAgB;AAAE,QAAA,GAAGF;AAAoB;AAC3E,CAAE;;;;;;;;"}
1
+ {"version":3,"file":"sso.js","sources":["../../../../../../../ee/server/src/services/passport/sso.ts"],"sourcesContent":["import '@strapi/types';\nimport passport from '../../../../../server/src/services/passport';\nimport createProviderRegistry from './provider-registry';\n\nexport const providerRegistry = createProviderRegistry();\nconst errorMessage = 'SSO is disabled. Its functionnalities cannot be accessed.';\n\nexport const getStrategyCallbackURL = (providerName: string) => {\n if (!strapi.ee.features.isEnabled('sso')) {\n throw new Error(errorMessage);\n }\n\n return `/admin/connect/${providerName}`;\n};\n\nexport const syncProviderRegistryWithConfig = () => {\n if (!strapi.ee.features.isEnabled('sso')) {\n throw new Error(errorMessage);\n }\n\n const { providers = [] } = strapi.config.get('admin.auth', {}) as any;\n\n // TODO\n // @ts-expect-error check map types\n providerRegistry.registerMany(providers);\n};\n\nexport const SSOAuthEventsMapper = {\n onSSOAutoRegistration: 'admin.auth.autoRegistration',\n};\n\nexport default {\n providerRegistry,\n getStrategyCallbackURL,\n syncProviderRegistryWithConfig,\n authEventsMapper: { ...passport.authEventsMapper, ...SSOAuthEventsMapper },\n};\n"],"names":["providerRegistry","createProviderRegistry","errorMessage","getStrategyCallbackURL","providerName","strapi","ee","features","isEnabled","Error","syncProviderRegistryWithConfig","providers","config","get","registerMany","SSOAuthEventsMapper","onSSOAutoRegistration","authEventsMapper","passport"],"mappings":";;;;;;;;AAIO,MAAMA,mBAAmBC,kBAAyB;AACzD,MAAMC,YAAe,GAAA,2DAAA;AAEd,MAAMC,yBAAyB,CAACC,YAAAA,GAAAA;IACrC,IAAI,CAACC,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAQ,CAAA,EAAA;AACxC,QAAA,MAAM,IAAIC,KAAMP,CAAAA,YAAAA,CAAAA;AAClB;IAEA,OAAO,CAAC,eAAe,EAAEE,YAAc,CAAA,CAAA;AACzC;MAEaM,8BAAiC,GAAA,IAAA;IAC5C,IAAI,CAACL,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAQ,CAAA,EAAA;AACxC,QAAA,MAAM,IAAIC,KAAMP,CAAAA,YAAAA,CAAAA;AAClB;IAEA,MAAM,EAAES,SAAY,GAAA,EAAE,EAAE,GAAGN,MAAOO,CAAAA,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,EAAC,CAAA;;;AAI5Db,IAAAA,gBAAAA,CAAiBc,YAAY,CAACH,SAAAA,CAAAA;AAChC;MAEaI,mBAAsB,GAAA;IACjCC,qBAAuB,EAAA;AACzB;AAEA,UAAe;AACbhB,IAAAA,gBAAAA;AACAG,IAAAA,sBAAAA;AACAO,IAAAA,8BAAAA;IACAO,gBAAkB,EAAA;AAAE,QAAA,GAAGC,SAASD,gBAAgB;AAAE,QAAA,GAAGF;AAAoB;AAC3E,CAAE;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"sso.mjs","sources":["../../../../../../../ee/server/src/services/passport/sso.ts"],"sourcesContent":["import '@strapi/types';\nimport passport from '../../../../../server/src/services/passport';\nimport createProviderRegistry from './provider-registry';\n\nexport const providerRegistry = createProviderRegistry();\nconst errorMessage = 'SSO is disabled. Its functionnalities cannot be accessed.';\n\nexport const getStrategyCallbackURL = (providerName: string) => {\n if (!strapi.ee.features.isEnabled('sso')) {\n throw new Error(errorMessage);\n }\n\n return `/admin/connect/${providerName}`;\n};\n\nexport const syncProviderRegistryWithConfig = () => {\n if (!strapi.ee.features.isEnabled('sso')) {\n throw new Error(errorMessage);\n }\n\n const { providers = [] } = strapi.config.get('admin.auth', {}) as any;\n\n // TODO\n // @ts-expect-error check map types\n providerRegistry.registerMany(providers);\n};\n\nexport const SSOAuthEventsMapper = {\n onSSOAutoRegistration: 'admin.auth.autoRegistration',\n};\n\nexport default {\n providerRegistry,\n getStrategyCallbackURL,\n syncProviderRegistryWithConfig,\n authEventsMapper: { ...passport.authEventsMapper, ...SSOAuthEventsMapper },\n};\n"],"names":["providerRegistry","createProviderRegistry","errorMessage","getStrategyCallbackURL","providerName","strapi","ee","features","isEnabled","Error","syncProviderRegistryWithConfig","providers","config","get","registerMany","SSOAuthEventsMapper","onSSOAutoRegistration","authEventsMapper","passport"],"mappings":";;;;AAIO,MAAMA,mBAAmBC,sBAAyB;AACzD,MAAMC,YAAe,GAAA,2DAAA;AAEd,MAAMC,yBAAyB,CAACC,YAAAA,GAAAA;IACrC,IAAI,CAACC,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAQ,CAAA,EAAA;AACxC,QAAA,MAAM,IAAIC,KAAMP,CAAAA,YAAAA,CAAAA;AAClB;AAEA,IAAA,OAAO,CAAC,eAAe,EAAEE,YAAAA,CAAa,CAAC;AACzC;MAEaM,8BAAiC,GAAA,IAAA;IAC5C,IAAI,CAACL,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAQ,CAAA,EAAA;AACxC,QAAA,MAAM,IAAIC,KAAMP,CAAAA,YAAAA,CAAAA;AAClB;IAEA,MAAM,EAAES,SAAY,GAAA,EAAE,EAAE,GAAGN,MAAOO,CAAAA,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,EAAC,CAAA;;;AAI5Db,IAAAA,gBAAAA,CAAiBc,YAAY,CAACH,SAAAA,CAAAA;AAChC;MAEaI,mBAAsB,GAAA;IACjCC,qBAAuB,EAAA;AACzB;AAEA,UAAe;AACbhB,IAAAA,gBAAAA;AACAG,IAAAA,sBAAAA;AACAO,IAAAA,8BAAAA;IACAO,gBAAkB,EAAA;AAAE,QAAA,GAAGC,SAASD,gBAAgB;AAAE,QAAA,GAAGF;AAAoB;AAC3E,CAAE;;;;"}
1
+ {"version":3,"file":"sso.mjs","sources":["../../../../../../../ee/server/src/services/passport/sso.ts"],"sourcesContent":["import '@strapi/types';\nimport passport from '../../../../../server/src/services/passport';\nimport createProviderRegistry from './provider-registry';\n\nexport const providerRegistry = createProviderRegistry();\nconst errorMessage = 'SSO is disabled. Its functionnalities cannot be accessed.';\n\nexport const getStrategyCallbackURL = (providerName: string) => {\n if (!strapi.ee.features.isEnabled('sso')) {\n throw new Error(errorMessage);\n }\n\n return `/admin/connect/${providerName}`;\n};\n\nexport const syncProviderRegistryWithConfig = () => {\n if (!strapi.ee.features.isEnabled('sso')) {\n throw new Error(errorMessage);\n }\n\n const { providers = [] } = strapi.config.get('admin.auth', {}) as any;\n\n // TODO\n // @ts-expect-error check map types\n providerRegistry.registerMany(providers);\n};\n\nexport const SSOAuthEventsMapper = {\n onSSOAutoRegistration: 'admin.auth.autoRegistration',\n};\n\nexport default {\n providerRegistry,\n getStrategyCallbackURL,\n syncProviderRegistryWithConfig,\n authEventsMapper: { ...passport.authEventsMapper, ...SSOAuthEventsMapper },\n};\n"],"names":["providerRegistry","createProviderRegistry","errorMessage","getStrategyCallbackURL","providerName","strapi","ee","features","isEnabled","Error","syncProviderRegistryWithConfig","providers","config","get","registerMany","SSOAuthEventsMapper","onSSOAutoRegistration","authEventsMapper","passport"],"mappings":";;;;AAIO,MAAMA,mBAAmBC,sBAAyB;AACzD,MAAMC,YAAe,GAAA,2DAAA;AAEd,MAAMC,yBAAyB,CAACC,YAAAA,GAAAA;IACrC,IAAI,CAACC,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAQ,CAAA,EAAA;AACxC,QAAA,MAAM,IAAIC,KAAMP,CAAAA,YAAAA,CAAAA;AAClB;IAEA,OAAO,CAAC,eAAe,EAAEE,YAAc,CAAA,CAAA;AACzC;MAEaM,8BAAiC,GAAA,IAAA;IAC5C,IAAI,CAACL,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAQ,CAAA,EAAA;AACxC,QAAA,MAAM,IAAIC,KAAMP,CAAAA,YAAAA,CAAAA;AAClB;IAEA,MAAM,EAAES,SAAY,GAAA,EAAE,EAAE,GAAGN,MAAOO,CAAAA,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,EAAC,CAAA;;;AAI5Db,IAAAA,gBAAAA,CAAiBc,YAAY,CAACH,SAAAA,CAAAA;AAChC;MAEaI,mBAAsB,GAAA;IACjCC,qBAAuB,EAAA;AACzB;AAEA,UAAe;AACbhB,IAAAA,gBAAAA;AACAG,IAAAA,sBAAAA;AACAO,IAAAA,8BAAAA;IACAO,gBAAkB,EAAA;AAAE,QAAA,GAAGC,SAASD,gBAAgB;AAAE,QAAA,GAAGF;AAAoB;AAC3E,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../ee/server/src/utils/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport const getService = (\n name: string,\n { strapi }: { strapi: Core.Strapi } = { strapi: global.strapi }\n) => {\n return strapi.service(`admin::${name}`);\n};\n\nexport default {\n getService,\n};\n"],"names":["getService","name","strapi","global","service"],"mappings":";;MAEaA,UAAa,GAAA,CACxBC,MACA,EAAEC,MAAM,EAA2B,GAAG;AAAEA,IAAAA,MAAAA,EAAQC,OAAOD;AAAO,CAAC,GAAA;AAE/D,IAAA,OAAOA,OAAOE,OAAO,CAAC,CAAC,OAAO,EAAEH,KAAK,CAAC,CAAA;AACxC;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../ee/server/src/utils/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport const getService = (\n name: string,\n { strapi }: { strapi: Core.Strapi } = { strapi: global.strapi }\n) => {\n return strapi.service(`admin::${name}`);\n};\n\nexport default {\n getService,\n};\n"],"names":["getService","name","strapi","global","service"],"mappings":";;MAEaA,UAAa,GAAA,CACxBC,MACA,EAAEC,MAAM,EAA2B,GAAG;AAAEA,IAAAA,MAAAA,EAAQC,OAAOD;AAAO,CAAC,GAAA;AAE/D,IAAA,OAAOA,OAAOE,OAAO,CAAC,CAAC,OAAO,EAAEH,IAAM,CAAA,CAAA,CAAA;AACxC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../ee/server/src/utils/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport const getService = (\n name: string,\n { strapi }: { strapi: Core.Strapi } = { strapi: global.strapi }\n) => {\n return strapi.service(`admin::${name}`);\n};\n\nexport default {\n getService,\n};\n"],"names":["getService","name","strapi","global","service"],"mappings":"MAEaA,UAAa,GAAA,CACxBC,MACA,EAAEC,MAAM,EAA2B,GAAG;AAAEA,IAAAA,MAAAA,EAAQC,OAAOD;AAAO,CAAC,GAAA;AAE/D,IAAA,OAAOA,OAAOE,OAAO,CAAC,CAAC,OAAO,EAAEH,KAAK,CAAC,CAAA;AACxC;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../ee/server/src/utils/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport const getService = (\n name: string,\n { strapi }: { strapi: Core.Strapi } = { strapi: global.strapi }\n) => {\n return strapi.service(`admin::${name}`);\n};\n\nexport default {\n getService,\n};\n"],"names":["getService","name","strapi","global","service"],"mappings":"MAEaA,UAAa,GAAA,CACxBC,MACA,EAAEC,MAAM,EAA2B,GAAG;AAAEA,IAAAA,MAAAA,EAAQC,OAAOD;AAAO,CAAC,GAAA;AAE/D,IAAA,OAAOA,OAAOE,OAAO,CAAC,CAAC,OAAO,EAAEH,IAAM,CAAA,CAAA,CAAA;AACxC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../server/src/controllers/transfer/index.ts"],"sourcesContent":["import { mapKeys } from 'lodash/fp';\nimport runner from './runner';\nimport token from './token';\n\nconst prefixActionsName = (prefix: string, dict: any) => mapKeys((key) => `${prefix}-${key}`, dict);\n\nexport default {\n ...prefixActionsName('runner', runner),\n ...prefixActionsName('token', token),\n};\n"],"names":["prefixActionsName","prefix","dict","mapKeys","key","runner","token"],"mappings":";;;;;;AAIA,MAAMA,iBAAoB,GAAA,CAACC,MAAgBC,EAAAA,IAAAA,GAAcC,WAAQ,CAACC,GAAAA,GAAQ,CAAC,EAAEH,MAAO,CAAA,CAAC,EAAEG,GAAAA,CAAI,CAAC,EAAEF,IAAAA,CAAAA;AAE9F,eAAe;IACb,GAAGF,iBAAAA,CAAkB,UAAUK,cAAO,CAAA;IACtC,GAAGL,iBAAAA,CAAkB,SAASM,KAAM;AACtC,CAAE;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../server/src/controllers/transfer/index.ts"],"sourcesContent":["import { mapKeys } from 'lodash/fp';\nimport runner from './runner';\nimport token from './token';\n\nconst prefixActionsName = (prefix: string, dict: any) => mapKeys((key) => `${prefix}-${key}`, dict);\n\nexport default {\n ...prefixActionsName('runner', runner),\n ...prefixActionsName('token', token),\n};\n"],"names":["prefixActionsName","prefix","dict","mapKeys","key","runner","token"],"mappings":";;;;;;AAIA,MAAMA,iBAAoB,GAAA,CAACC,MAAgBC,EAAAA,IAAAA,GAAcC,UAAQ,CAAA,CAACC,GAAQ,GAAA,CAAA,EAAGH,MAAO,CAAA,CAAC,EAAEG,GAAAA,CAAAA,CAAK,EAAEF,IAAAA,CAAAA;AAE9F,eAAe;IACb,GAAGF,iBAAAA,CAAkB,UAAUK,cAAO,CAAA;IACtC,GAAGL,iBAAAA,CAAkB,SAASM,KAAM;AACtC,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../server/src/controllers/transfer/index.ts"],"sourcesContent":["import { mapKeys } from 'lodash/fp';\nimport runner from './runner';\nimport token from './token';\n\nconst prefixActionsName = (prefix: string, dict: any) => mapKeys((key) => `${prefix}-${key}`, dict);\n\nexport default {\n ...prefixActionsName('runner', runner),\n ...prefixActionsName('token', token),\n};\n"],"names":["prefixActionsName","prefix","dict","mapKeys","key","runner","token"],"mappings":";;;;AAIA,MAAMA,iBAAoB,GAAA,CAACC,MAAgBC,EAAAA,IAAAA,GAAcC,QAAQ,CAACC,GAAAA,GAAQ,CAAC,EAAEH,MAAO,CAAA,CAAC,EAAEG,GAAAA,CAAI,CAAC,EAAEF,IAAAA,CAAAA;AAE9F,eAAe;IACb,GAAGF,iBAAAA,CAAkB,UAAUK,MAAO,CAAA;IACtC,GAAGL,iBAAAA,CAAkB,SAASM,KAAM;AACtC,CAAE;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../server/src/controllers/transfer/index.ts"],"sourcesContent":["import { mapKeys } from 'lodash/fp';\nimport runner from './runner';\nimport token from './token';\n\nconst prefixActionsName = (prefix: string, dict: any) => mapKeys((key) => `${prefix}-${key}`, dict);\n\nexport default {\n ...prefixActionsName('runner', runner),\n ...prefixActionsName('token', token),\n};\n"],"names":["prefixActionsName","prefix","dict","mapKeys","key","runner","token"],"mappings":";;;;AAIA,MAAMA,iBAAoB,GAAA,CAACC,MAAgBC,EAAAA,IAAAA,GAAcC,OAAQ,CAAA,CAACC,GAAQ,GAAA,CAAA,EAAGH,MAAO,CAAA,CAAC,EAAEG,GAAAA,CAAAA,CAAK,EAAEF,IAAAA,CAAAA;AAE9F,eAAe;IACb,GAAGF,iBAAAA,CAAkB,UAAUK,MAAO,CAAA;IACtC,GAAGL,iBAAAA,CAAkB,SAASM,KAAM;AACtC,CAAE;;;;"}
@@ -110,6 +110,10 @@ var user = {
110
110
  },
111
111
  async deleteOne (ctx) {
112
112
  const { id } = ctx.params;
113
+ const user = ctx.state.user;
114
+ if (user && user.id === id) {
115
+ throw new ApplicationError('You cannot delete your own user');
116
+ }
113
117
  const deletedUser = await index.getService('user').deleteById(id);
114
118
  if (!deletedUser) {
115
119
  return ctx.notFound('User not found');
@@ -123,7 +127,13 @@ var user = {
123
127
  * @param ctx - koa context
124
128
  */ async deleteMany (ctx) {
125
129
  const { body } = ctx.request;
130
+ const user = ctx.state.user;
126
131
  await user$1.validateUsersDeleteInput(body);
132
+ const idsSet = new Set(body.ids);
133
+ // Prevent self-deletion
134
+ if (user && idsSet.has(user.id)) {
135
+ throw new ApplicationError('You cannot delete your own user');
136
+ }
127
137
  const users = await index.getService('user').deleteByIds(body.ids);
128
138
  const sanitizedUsers = users.map(index.getService('user').sanitizeUser);
129
139
  return ctx.deleted({
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","sources":["../../../../../server/src/controllers/user.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport * as _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport {\n validateUserCreationInput,\n validateUserUpdateInput,\n validateUsersDeleteInput,\n} from '../validation/user';\nimport { getService } from '../utils';\nimport {\n Create,\n DeleteMany,\n DeleteOne,\n FindAll,\n FindOne,\n Update,\n} from '../../../shared/contracts/user';\nimport { AdminUser } from '../../../shared/contracts/shared';\n\nconst { ApplicationError } = errors;\n\nexport default {\n async create(ctx: Context) {\n const { body } = ctx.request as Create.Request;\n const cleanData = { ...body, email: _.get(body, `email`, ``).toLowerCase() };\n\n await validateUserCreationInput(cleanData);\n\n const attributes = _.pick(cleanData, [\n 'firstname',\n 'lastname',\n 'email',\n 'roles',\n 'preferedLanguage',\n ]);\n\n const userAlreadyExists = await getService('user').exists({\n email: attributes.email,\n });\n\n if (userAlreadyExists) {\n throw new ApplicationError('Email already taken');\n }\n\n const createdUser = await getService('user').create(attributes);\n\n const userInfo = getService('user').sanitizeUser(createdUser);\n\n // Note: We need to assign manually the registrationToken to the\n // final user payload so that it's not removed in the sanitation process.\n Object.assign(userInfo, { registrationToken: createdUser.registrationToken });\n\n // Send 201 created\n ctx.created({ data: userInfo } satisfies Create.Response);\n },\n\n async find(ctx: Context) {\n const userService = getService('user');\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: 'admin::user',\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const sanitizedQuery = await permissionsManager.sanitizeQuery(ctx.query);\n\n // @ts-expect-error update the service type\n const { results, pagination } = await userService.findPage(sanitizedQuery);\n\n ctx.body = {\n data: {\n results: results.map((user: AdminUser) => userService.sanitizeUser(user)),\n pagination,\n },\n } satisfies FindAll.Response;\n },\n\n async findOne(ctx: Context) {\n const { id } = ctx.params as FindOne.Params;\n\n const user = await getService('user').findOne(id);\n\n if (!user) {\n return ctx.notFound('User does not exist');\n }\n\n ctx.body = {\n data: getService('user').sanitizeUser(user as AdminUser),\n } as FindOne.Response;\n },\n\n async update(ctx: Context) {\n const { id } = ctx.params as Update.Params;\n const { body: input } = ctx.request as Update.Request;\n\n await validateUserUpdateInput(input);\n\n if (_.has(input, 'email')) {\n const uniqueEmailCheck = await getService('user').exists({\n id: { $ne: id },\n email: input.email,\n });\n\n if (uniqueEmailCheck) {\n throw new ApplicationError('A user with this email address already exists');\n }\n }\n\n const updatedUser = await getService('user').updateById(id, input);\n\n if (!updatedUser) {\n return ctx.notFound('User does not exist');\n }\n\n ctx.body = {\n data: getService('user').sanitizeUser(updatedUser),\n } satisfies Update.Response;\n },\n\n async deleteOne(ctx: Context) {\n const { id } = ctx.params as DeleteOne.Params;\n\n const deletedUser = await getService('user').deleteById(id);\n\n if (!deletedUser) {\n return ctx.notFound('User not found');\n }\n\n return ctx.deleted({\n data: getService('user').sanitizeUser(deletedUser),\n } satisfies DeleteOne.Response);\n },\n\n /**\n * Delete several users\n * @param ctx - koa context\n */\n async deleteMany(ctx: Context) {\n const { body } = ctx.request as DeleteMany.Request;\n await validateUsersDeleteInput(body);\n\n const users = await getService('user').deleteByIds(body.ids);\n\n const sanitizedUsers = users.map(getService('user').sanitizeUser);\n\n return ctx.deleted({\n data: sanitizedUsers,\n } satisfies DeleteMany.Response);\n },\n};\n"],"names":["ApplicationError","errors","create","ctx","body","request","cleanData","email","_","get","toLowerCase","validateUserCreationInput","attributes","pick","userAlreadyExists","getService","exists","createdUser","userInfo","sanitizeUser","Object","assign","registrationToken","created","data","find","userService","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","validateQuery","query","sanitizedQuery","sanitizeQuery","results","pagination","findPage","map","user","findOne","id","params","notFound","update","input","validateUserUpdateInput","has","uniqueEmailCheck","$ne","updatedUser","updateById","deleteOne","deletedUser","deleteById","deleted","deleteMany","validateUsersDeleteInput","users","deleteByIds","ids","sanitizedUsers"],"mappings":"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"}
1
+ {"version":3,"file":"user.js","sources":["../../../../../server/src/controllers/user.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport * as _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport {\n validateUserCreationInput,\n validateUserUpdateInput,\n validateUsersDeleteInput,\n} from '../validation/user';\nimport { getService } from '../utils';\nimport {\n Create,\n DeleteMany,\n DeleteOne,\n FindAll,\n FindOne,\n Update,\n} from '../../../shared/contracts/user';\nimport { AdminUser } from '../../../shared/contracts/shared';\n\nconst { ApplicationError } = errors;\n\nexport default {\n async create(ctx: Context) {\n const { body } = ctx.request as Create.Request;\n const cleanData = { ...body, email: _.get(body, `email`, ``).toLowerCase() };\n\n await validateUserCreationInput(cleanData);\n\n const attributes = _.pick(cleanData, [\n 'firstname',\n 'lastname',\n 'email',\n 'roles',\n 'preferedLanguage',\n ]);\n\n const userAlreadyExists = await getService('user').exists({\n email: attributes.email,\n });\n\n if (userAlreadyExists) {\n throw new ApplicationError('Email already taken');\n }\n\n const createdUser = await getService('user').create(attributes);\n\n const userInfo = getService('user').sanitizeUser(createdUser);\n\n // Note: We need to assign manually the registrationToken to the\n // final user payload so that it's not removed in the sanitation process.\n Object.assign(userInfo, { registrationToken: createdUser.registrationToken });\n\n // Send 201 created\n ctx.created({ data: userInfo } satisfies Create.Response);\n },\n\n async find(ctx: Context) {\n const userService = getService('user');\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: 'admin::user',\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const sanitizedQuery = await permissionsManager.sanitizeQuery(ctx.query);\n\n // @ts-expect-error update the service type\n const { results, pagination } = await userService.findPage(sanitizedQuery);\n\n ctx.body = {\n data: {\n results: results.map((user: AdminUser) => userService.sanitizeUser(user)),\n pagination,\n },\n } satisfies FindAll.Response;\n },\n\n async findOne(ctx: Context) {\n const { id } = ctx.params as FindOne.Params;\n\n const user = await getService('user').findOne(id);\n\n if (!user) {\n return ctx.notFound('User does not exist');\n }\n\n ctx.body = {\n data: getService('user').sanitizeUser(user as AdminUser),\n } as FindOne.Response;\n },\n\n async update(ctx: Context) {\n const { id } = ctx.params as Update.Params;\n const { body: input } = ctx.request as Update.Request;\n\n await validateUserUpdateInput(input);\n\n if (_.has(input, 'email')) {\n const uniqueEmailCheck = await getService('user').exists({\n id: { $ne: id },\n email: input.email,\n });\n\n if (uniqueEmailCheck) {\n throw new ApplicationError('A user with this email address already exists');\n }\n }\n\n const updatedUser = await getService('user').updateById(id, input);\n\n if (!updatedUser) {\n return ctx.notFound('User does not exist');\n }\n\n ctx.body = {\n data: getService('user').sanitizeUser(updatedUser),\n } satisfies Update.Response;\n },\n\n async deleteOne(ctx: Context) {\n const { id } = ctx.params as DeleteOne.Params;\n const user = ctx.state.user as AdminUser | undefined;\n\n if (user && user.id === id) {\n throw new ApplicationError('You cannot delete your own user');\n }\n\n const deletedUser = await getService('user').deleteById(id);\n\n if (!deletedUser) {\n return ctx.notFound('User not found');\n }\n\n return ctx.deleted({\n data: getService('user').sanitizeUser(deletedUser),\n } satisfies DeleteOne.Response);\n },\n\n /**\n * Delete several users\n * @param ctx - koa context\n */\n async deleteMany(ctx: Context) {\n const { body } = ctx.request as DeleteMany.Request;\n const user = ctx.state.user as AdminUser | undefined;\n await validateUsersDeleteInput(body);\n const idsSet = new Set(body.ids);\n\n // Prevent self-deletion\n if (user && idsSet.has(user.id)) {\n throw new ApplicationError('You cannot delete your own user');\n }\n const users = await getService('user').deleteByIds(body.ids);\n\n const sanitizedUsers = users.map(getService('user').sanitizeUser);\n\n return ctx.deleted({\n data: sanitizedUsers,\n } satisfies DeleteMany.Response);\n },\n};\n"],"names":["ApplicationError","errors","create","ctx","body","request","cleanData","email","_","get","toLowerCase","validateUserCreationInput","attributes","pick","userAlreadyExists","getService","exists","createdUser","userInfo","sanitizeUser","Object","assign","registrationToken","created","data","find","userService","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","validateQuery","query","sanitizedQuery","sanitizeQuery","results","pagination","findPage","map","user","findOne","id","params","notFound","update","input","validateUserUpdateInput","has","uniqueEmailCheck","$ne","updatedUser","updateById","deleteOne","deletedUser","deleteById","deleted","deleteMany","validateUsersDeleteInput","idsSet","Set","ids","users","deleteByIds","sanitizedUsers"],"mappings":"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"}
@@ -89,6 +89,10 @@ var user = {
89
89
  },
90
90
  async deleteOne (ctx) {
91
91
  const { id } = ctx.params;
92
+ const user = ctx.state.user;
93
+ if (user && user.id === id) {
94
+ throw new ApplicationError('You cannot delete your own user');
95
+ }
92
96
  const deletedUser = await getService('user').deleteById(id);
93
97
  if (!deletedUser) {
94
98
  return ctx.notFound('User not found');
@@ -102,7 +106,13 @@ var user = {
102
106
  * @param ctx - koa context
103
107
  */ async deleteMany (ctx) {
104
108
  const { body } = ctx.request;
109
+ const user = ctx.state.user;
105
110
  await validateUsersDeleteInput(body);
111
+ const idsSet = new Set(body.ids);
112
+ // Prevent self-deletion
113
+ if (user && idsSet.has(user.id)) {
114
+ throw new ApplicationError('You cannot delete your own user');
115
+ }
106
116
  const users = await getService('user').deleteByIds(body.ids);
107
117
  const sanitizedUsers = users.map(getService('user').sanitizeUser);
108
118
  return ctx.deleted({
@@ -1 +1 @@
1
- {"version":3,"file":"user.mjs","sources":["../../../../../server/src/controllers/user.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport * as _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport {\n validateUserCreationInput,\n validateUserUpdateInput,\n validateUsersDeleteInput,\n} from '../validation/user';\nimport { getService } from '../utils';\nimport {\n Create,\n DeleteMany,\n DeleteOne,\n FindAll,\n FindOne,\n Update,\n} from '../../../shared/contracts/user';\nimport { AdminUser } from '../../../shared/contracts/shared';\n\nconst { ApplicationError } = errors;\n\nexport default {\n async create(ctx: Context) {\n const { body } = ctx.request as Create.Request;\n const cleanData = { ...body, email: _.get(body, `email`, ``).toLowerCase() };\n\n await validateUserCreationInput(cleanData);\n\n const attributes = _.pick(cleanData, [\n 'firstname',\n 'lastname',\n 'email',\n 'roles',\n 'preferedLanguage',\n ]);\n\n const userAlreadyExists = await getService('user').exists({\n email: attributes.email,\n });\n\n if (userAlreadyExists) {\n throw new ApplicationError('Email already taken');\n }\n\n const createdUser = await getService('user').create(attributes);\n\n const userInfo = getService('user').sanitizeUser(createdUser);\n\n // Note: We need to assign manually the registrationToken to the\n // final user payload so that it's not removed in the sanitation process.\n Object.assign(userInfo, { registrationToken: createdUser.registrationToken });\n\n // Send 201 created\n ctx.created({ data: userInfo } satisfies Create.Response);\n },\n\n async find(ctx: Context) {\n const userService = getService('user');\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: 'admin::user',\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const sanitizedQuery = await permissionsManager.sanitizeQuery(ctx.query);\n\n // @ts-expect-error update the service type\n const { results, pagination } = await userService.findPage(sanitizedQuery);\n\n ctx.body = {\n data: {\n results: results.map((user: AdminUser) => userService.sanitizeUser(user)),\n pagination,\n },\n } satisfies FindAll.Response;\n },\n\n async findOne(ctx: Context) {\n const { id } = ctx.params as FindOne.Params;\n\n const user = await getService('user').findOne(id);\n\n if (!user) {\n return ctx.notFound('User does not exist');\n }\n\n ctx.body = {\n data: getService('user').sanitizeUser(user as AdminUser),\n } as FindOne.Response;\n },\n\n async update(ctx: Context) {\n const { id } = ctx.params as Update.Params;\n const { body: input } = ctx.request as Update.Request;\n\n await validateUserUpdateInput(input);\n\n if (_.has(input, 'email')) {\n const uniqueEmailCheck = await getService('user').exists({\n id: { $ne: id },\n email: input.email,\n });\n\n if (uniqueEmailCheck) {\n throw new ApplicationError('A user with this email address already exists');\n }\n }\n\n const updatedUser = await getService('user').updateById(id, input);\n\n if (!updatedUser) {\n return ctx.notFound('User does not exist');\n }\n\n ctx.body = {\n data: getService('user').sanitizeUser(updatedUser),\n } satisfies Update.Response;\n },\n\n async deleteOne(ctx: Context) {\n const { id } = ctx.params as DeleteOne.Params;\n\n const deletedUser = await getService('user').deleteById(id);\n\n if (!deletedUser) {\n return ctx.notFound('User not found');\n }\n\n return ctx.deleted({\n data: getService('user').sanitizeUser(deletedUser),\n } satisfies DeleteOne.Response);\n },\n\n /**\n * Delete several users\n * @param ctx - koa context\n */\n async deleteMany(ctx: Context) {\n const { body } = ctx.request as DeleteMany.Request;\n await validateUsersDeleteInput(body);\n\n const users = await getService('user').deleteByIds(body.ids);\n\n const sanitizedUsers = users.map(getService('user').sanitizeUser);\n\n return ctx.deleted({\n data: sanitizedUsers,\n } satisfies DeleteMany.Response);\n },\n};\n"],"names":["ApplicationError","errors","create","ctx","body","request","cleanData","email","_","get","toLowerCase","validateUserCreationInput","attributes","pick","userAlreadyExists","getService","exists","createdUser","userInfo","sanitizeUser","Object","assign","registrationToken","created","data","find","userService","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","validateQuery","query","sanitizedQuery","sanitizeQuery","results","pagination","findPage","map","user","findOne","id","params","notFound","update","input","validateUserUpdateInput","has","uniqueEmailCheck","$ne","updatedUser","updateById","deleteOne","deletedUser","deleteById","deleted","deleteMany","validateUsersDeleteInput","users","deleteByIds","ids","sanitizedUsers"],"mappings":";;;;;AAoBA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,MAAAA;AAE7B,WAAe;AACb,IAAA,MAAMC,QAAOC,GAAY,EAAA;AACvB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,IAAIE,OAAO;AAC5B,QAAA,MAAMC,SAAY,GAAA;AAAE,YAAA,GAAGF,IAAI;YAAEG,KAAOC,EAAAA,CAAAA,CAAEC,GAAG,CAACL,IAAM,EAAA,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA,CAAEM,WAAW;AAAG,SAAA;AAE3E,QAAA,MAAMC,yBAA0BL,CAAAA,SAAAA,CAAAA;AAEhC,QAAA,MAAMM,UAAaJ,GAAAA,CAAAA,CAAEK,IAAI,CAACP,SAAW,EAAA;AACnC,YAAA,WAAA;AACA,YAAA,UAAA;AACA,YAAA,OAAA;AACA,YAAA,OAAA;AACA,YAAA;AACD,SAAA,CAAA;AAED,QAAA,MAAMQ,iBAAoB,GAAA,MAAMC,UAAW,CAAA,MAAA,CAAA,CAAQC,MAAM,CAAC;AACxDT,YAAAA,KAAAA,EAAOK,WAAWL;AACpB,SAAA,CAAA;AAEA,QAAA,IAAIO,iBAAmB,EAAA;AACrB,YAAA,MAAM,IAAId,gBAAiB,CAAA,qBAAA,CAAA;AAC7B;AAEA,QAAA,MAAMiB,WAAc,GAAA,MAAMF,UAAW,CAAA,MAAA,CAAA,CAAQb,MAAM,CAACU,UAAAA,CAAAA;AAEpD,QAAA,MAAMM,QAAWH,GAAAA,UAAAA,CAAW,MAAQI,CAAAA,CAAAA,YAAY,CAACF,WAAAA,CAAAA;;;QAIjDG,MAAOC,CAAAA,MAAM,CAACH,QAAU,EAAA;AAAEI,YAAAA,iBAAAA,EAAmBL,YAAYK;AAAkB,SAAA,CAAA;;AAG3EnB,QAAAA,GAAAA,CAAIoB,OAAO,CAAC;YAAEC,IAAMN,EAAAA;AAAS,SAAA,CAAA;AAC/B,KAAA;AAEA,IAAA,MAAMO,MAAKtB,GAAY,EAAA;AACrB,QAAA,MAAMuB,cAAcX,UAAW,CAAA,MAAA,CAAA;AAE/B,QAAA,MAAMY,qBAAqBC,MAAOC,CAAAA,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YACtFC,OAAS5B,EAAAA,GAAAA,CAAI6B,KAAK,CAACC,WAAW;YAC9BC,KAAO,EAAA;AACT,SAAA,CAAA;AAEA,QAAA,MAAMP,kBAAmBQ,CAAAA,aAAa,CAAChC,GAAAA,CAAIiC,KAAK,CAAA;AAChD,QAAA,MAAMC,iBAAiB,MAAMV,kBAAAA,CAAmBW,aAAa,CAACnC,IAAIiC,KAAK,CAAA;;QAGvE,MAAM,EAAEG,OAAO,EAAEC,UAAU,EAAE,GAAG,MAAMd,WAAYe,CAAAA,QAAQ,CAACJ,cAAAA,CAAAA;AAE3DlC,QAAAA,GAAAA,CAAIC,IAAI,GAAG;YACToB,IAAM,EAAA;AACJe,gBAAAA,OAAAA,EAASA,QAAQG,GAAG,CAAC,CAACC,IAAoBjB,GAAAA,WAAAA,CAAYP,YAAY,CAACwB,IAAAA,CAAAA,CAAAA;AACnEH,gBAAAA;AACF;AACF,SAAA;AACF,KAAA;AAEA,IAAA,MAAMI,SAAQzC,GAAY,EAAA;AACxB,QAAA,MAAM,EAAE0C,EAAE,EAAE,GAAG1C,IAAI2C,MAAM;AAEzB,QAAA,MAAMH,IAAO,GAAA,MAAM5B,UAAW,CAAA,MAAA,CAAA,CAAQ6B,OAAO,CAACC,EAAAA,CAAAA;AAE9C,QAAA,IAAI,CAACF,IAAM,EAAA;YACT,OAAOxC,GAAAA,CAAI4C,QAAQ,CAAC,qBAAA,CAAA;AACtB;AAEA5C,QAAAA,GAAAA,CAAIC,IAAI,GAAG;YACToB,IAAMT,EAAAA,UAAAA,CAAW,MAAQI,CAAAA,CAAAA,YAAY,CAACwB,IAAAA;AACxC,SAAA;AACF,KAAA;AAEA,IAAA,MAAMK,QAAO7C,GAAY,EAAA;AACvB,QAAA,MAAM,EAAE0C,EAAE,EAAE,GAAG1C,IAAI2C,MAAM;AACzB,QAAA,MAAM,EAAE1C,IAAM6C,EAAAA,KAAK,EAAE,GAAG9C,IAAIE,OAAO;AAEnC,QAAA,MAAM6C,uBAAwBD,CAAAA,KAAAA,CAAAA;AAE9B,QAAA,IAAIzC,CAAE2C,CAAAA,GAAG,CAACF,KAAAA,EAAO,OAAU,CAAA,EAAA;AACzB,YAAA,MAAMG,gBAAmB,GAAA,MAAMrC,UAAW,CAAA,MAAA,CAAA,CAAQC,MAAM,CAAC;gBACvD6B,EAAI,EAAA;oBAAEQ,GAAKR,EAAAA;AAAG,iBAAA;AACdtC,gBAAAA,KAAAA,EAAO0C,MAAM1C;AACf,aAAA,CAAA;AAEA,YAAA,IAAI6C,gBAAkB,EAAA;AACpB,gBAAA,MAAM,IAAIpD,gBAAiB,CAAA,+CAAA,CAAA;AAC7B;AACF;AAEA,QAAA,MAAMsD,cAAc,MAAMvC,UAAAA,CAAW,MAAQwC,CAAAA,CAAAA,UAAU,CAACV,EAAII,EAAAA,KAAAA,CAAAA;AAE5D,QAAA,IAAI,CAACK,WAAa,EAAA;YAChB,OAAOnD,GAAAA,CAAI4C,QAAQ,CAAC,qBAAA,CAAA;AACtB;AAEA5C,QAAAA,GAAAA,CAAIC,IAAI,GAAG;YACToB,IAAMT,EAAAA,UAAAA,CAAW,MAAQI,CAAAA,CAAAA,YAAY,CAACmC,WAAAA;AACxC,SAAA;AACF,KAAA;AAEA,IAAA,MAAME,WAAUrD,GAAY,EAAA;AAC1B,QAAA,MAAM,EAAE0C,EAAE,EAAE,GAAG1C,IAAI2C,MAAM;AAEzB,QAAA,MAAMW,WAAc,GAAA,MAAM1C,UAAW,CAAA,MAAA,CAAA,CAAQ2C,UAAU,CAACb,EAAAA,CAAAA;AAExD,QAAA,IAAI,CAACY,WAAa,EAAA;YAChB,OAAOtD,GAAAA,CAAI4C,QAAQ,CAAC,gBAAA,CAAA;AACtB;QAEA,OAAO5C,GAAAA,CAAIwD,OAAO,CAAC;YACjBnC,IAAMT,EAAAA,UAAAA,CAAW,MAAQI,CAAAA,CAAAA,YAAY,CAACsC,WAAAA;AACxC,SAAA,CAAA;AACF,KAAA;AAEA;;;MAIA,MAAMG,YAAWzD,GAAY,EAAA;AAC3B,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,IAAIE,OAAO;AAC5B,QAAA,MAAMwD,wBAAyBzD,CAAAA,IAAAA,CAAAA;AAE/B,QAAA,MAAM0D,QAAQ,MAAM/C,UAAAA,CAAW,QAAQgD,WAAW,CAAC3D,KAAK4D,GAAG,CAAA;AAE3D,QAAA,MAAMC,iBAAiBH,KAAMpB,CAAAA,GAAG,CAAC3B,UAAAA,CAAW,QAAQI,YAAY,CAAA;QAEhE,OAAOhB,GAAAA,CAAIwD,OAAO,CAAC;YACjBnC,IAAMyC,EAAAA;AACR,SAAA,CAAA;AACF;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"user.mjs","sources":["../../../../../server/src/controllers/user.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport * as _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport {\n validateUserCreationInput,\n validateUserUpdateInput,\n validateUsersDeleteInput,\n} from '../validation/user';\nimport { getService } from '../utils';\nimport {\n Create,\n DeleteMany,\n DeleteOne,\n FindAll,\n FindOne,\n Update,\n} from '../../../shared/contracts/user';\nimport { AdminUser } from '../../../shared/contracts/shared';\n\nconst { ApplicationError } = errors;\n\nexport default {\n async create(ctx: Context) {\n const { body } = ctx.request as Create.Request;\n const cleanData = { ...body, email: _.get(body, `email`, ``).toLowerCase() };\n\n await validateUserCreationInput(cleanData);\n\n const attributes = _.pick(cleanData, [\n 'firstname',\n 'lastname',\n 'email',\n 'roles',\n 'preferedLanguage',\n ]);\n\n const userAlreadyExists = await getService('user').exists({\n email: attributes.email,\n });\n\n if (userAlreadyExists) {\n throw new ApplicationError('Email already taken');\n }\n\n const createdUser = await getService('user').create(attributes);\n\n const userInfo = getService('user').sanitizeUser(createdUser);\n\n // Note: We need to assign manually the registrationToken to the\n // final user payload so that it's not removed in the sanitation process.\n Object.assign(userInfo, { registrationToken: createdUser.registrationToken });\n\n // Send 201 created\n ctx.created({ data: userInfo } satisfies Create.Response);\n },\n\n async find(ctx: Context) {\n const userService = getService('user');\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: 'admin::user',\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const sanitizedQuery = await permissionsManager.sanitizeQuery(ctx.query);\n\n // @ts-expect-error update the service type\n const { results, pagination } = await userService.findPage(sanitizedQuery);\n\n ctx.body = {\n data: {\n results: results.map((user: AdminUser) => userService.sanitizeUser(user)),\n pagination,\n },\n } satisfies FindAll.Response;\n },\n\n async findOne(ctx: Context) {\n const { id } = ctx.params as FindOne.Params;\n\n const user = await getService('user').findOne(id);\n\n if (!user) {\n return ctx.notFound('User does not exist');\n }\n\n ctx.body = {\n data: getService('user').sanitizeUser(user as AdminUser),\n } as FindOne.Response;\n },\n\n async update(ctx: Context) {\n const { id } = ctx.params as Update.Params;\n const { body: input } = ctx.request as Update.Request;\n\n await validateUserUpdateInput(input);\n\n if (_.has(input, 'email')) {\n const uniqueEmailCheck = await getService('user').exists({\n id: { $ne: id },\n email: input.email,\n });\n\n if (uniqueEmailCheck) {\n throw new ApplicationError('A user with this email address already exists');\n }\n }\n\n const updatedUser = await getService('user').updateById(id, input);\n\n if (!updatedUser) {\n return ctx.notFound('User does not exist');\n }\n\n ctx.body = {\n data: getService('user').sanitizeUser(updatedUser),\n } satisfies Update.Response;\n },\n\n async deleteOne(ctx: Context) {\n const { id } = ctx.params as DeleteOne.Params;\n const user = ctx.state.user as AdminUser | undefined;\n\n if (user && user.id === id) {\n throw new ApplicationError('You cannot delete your own user');\n }\n\n const deletedUser = await getService('user').deleteById(id);\n\n if (!deletedUser) {\n return ctx.notFound('User not found');\n }\n\n return ctx.deleted({\n data: getService('user').sanitizeUser(deletedUser),\n } satisfies DeleteOne.Response);\n },\n\n /**\n * Delete several users\n * @param ctx - koa context\n */\n async deleteMany(ctx: Context) {\n const { body } = ctx.request as DeleteMany.Request;\n const user = ctx.state.user as AdminUser | undefined;\n await validateUsersDeleteInput(body);\n const idsSet = new Set(body.ids);\n\n // Prevent self-deletion\n if (user && idsSet.has(user.id)) {\n throw new ApplicationError('You cannot delete your own user');\n }\n const users = await getService('user').deleteByIds(body.ids);\n\n const sanitizedUsers = users.map(getService('user').sanitizeUser);\n\n return ctx.deleted({\n data: sanitizedUsers,\n } satisfies DeleteMany.Response);\n },\n};\n"],"names":["ApplicationError","errors","create","ctx","body","request","cleanData","email","_","get","toLowerCase","validateUserCreationInput","attributes","pick","userAlreadyExists","getService","exists","createdUser","userInfo","sanitizeUser","Object","assign","registrationToken","created","data","find","userService","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","validateQuery","query","sanitizedQuery","sanitizeQuery","results","pagination","findPage","map","user","findOne","id","params","notFound","update","input","validateUserUpdateInput","has","uniqueEmailCheck","$ne","updatedUser","updateById","deleteOne","deletedUser","deleteById","deleted","deleteMany","validateUsersDeleteInput","idsSet","Set","ids","users","deleteByIds","sanitizedUsers"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../server/src/domain/action/index.ts"],"sourcesContent":["import type { Utils } from '@strapi/types';\n\nimport { curry, pipe, merge, set, pick, omit, includes, isArray, prop } from 'lodash/fp';\n\nexport interface ActionAlias {\n /**\n * The action ID to alias\n */\n actionId: string;\n\n /**\n * An optional array of subject to restrict the alias usage\n */\n subjects?: string[];\n}\n\nexport type Action = {\n /**\n * The unique identifier of the action\n */\n actionId: string;\n\n /**\n * The section linked to the action - These can be 'contentTypes' | 'plugins' | 'settings' | 'internal'\n */\n section: string;\n\n /**\n * The human readable name of an action\n */\n displayName: string;\n\n /**\n * The main category of an action\n */\n category: string;\n\n /**\n * The secondary category of an action (only for settings and plugins section)\n */\n subCategory?: string;\n\n /**\n * The plugin that provides the action\n */\n pluginName?: string;\n\n /**\n * A list of subjects on which the action can be applied\n */\n subjects?: string[];\n\n /**\n * The options of an action\n */\n options: {\n /**\n * The list of properties that can be associated with an action\n */\n applyToProperties: string[] | null;\n };\n\n /**\n * An optional array of @see {@link ActionAlias}.\n *\n * It represents the possible aliases for the current action.\n *\n * Aliases are unidirectional.\n *\n * Note: This is an internal property and probably shouldn't be used outside Strapi core features.\n * Its behavior might change at any time without notice.\n *\n * @internal\n */\n aliases?: ActionAlias[];\n};\n\n/**\n * Set of attributes used to create a new {@link Action} object\n * @typedef {Action, { uid: string }} CreateActionPayload\n */\nexport type CreateActionPayload = Utils.Intersect<\n [\n Utils.Object.PartialBy<\n // Action Id is computed from the uid value\n Omit<Action, 'actionId'>,\n // Options is filled with default values\n 'options'\n >,\n { uid: string },\n ]\n>;\n\n/**\n * Return the default attributes of a new {@link Action}\n * @return Partial<Action>\n */\nconst getDefaultActionAttributes = (): Partial<Action> => ({\n options: {\n applyToProperties: null,\n },\n});\n\n/**\n * Get the list of all the valid attributes of an {@link Action}\n */\nconst actionFields = [\n 'section',\n 'displayName',\n 'category',\n 'subCategory',\n 'pluginName',\n 'subjects',\n 'options',\n 'actionId',\n 'aliases',\n] as const;\n\n/**\n * Remove unwanted attributes from an {@link Action}\n */\nconst sanitizeActionAttributes = pick(actionFields) as (\n action: Action | CreateActionPayload\n) => Action;\n\n/**\n * Create and return an identifier for an {@link CreateActionPayload}.\n * The format is based on the action's source ({@link CreateActionPayload.pluginName} or 'application') and {@link CreateActionPayload.uid}.\n * @param {CreateActionPayload} attributes\n * @return {string}\n */\n// TODO: TS - Use Common.UID\nconst computeActionId = (attributes: CreateActionPayload): string => {\n const { pluginName, uid } = attributes;\n\n if (!pluginName) {\n return `api::${uid}`;\n }\n\n if (pluginName === 'admin') {\n return `admin::${uid}`;\n }\n\n return `plugin::${pluginName}.${uid}`;\n};\n\n/**\n * Assign an actionId attribute to an {@link CreateActionPayload} object\n */\nconst assignActionId = (attrs: CreateActionPayload) =>\n set('actionId', computeActionId(attrs), attrs);\n\n/**\n * Transform an action by adding or removing the {@link Action.subCategory} attribute\n * @param {Action} action - The action to process\n * @return {Action}\n */\nconst assignOrOmitSubCategory = (action: Action): Action => {\n const shouldHaveSubCategory = ['settings', 'plugins'].includes(action.section);\n\n return shouldHaveSubCategory\n ? set('subCategory', action.subCategory || 'general', action)\n : omit('subCategory', action);\n};\n\n/**\n * Check if a property can be applied to an {@link Action}\n */\nconst appliesToProperty = curry((property: string, action: Action): boolean => {\n return pipe(prop('options.applyToProperties'), includes(property))(action);\n});\n\n/**\n * Check if an action applies to a subject\n */\nconst appliesToSubject = curry((subject: string, action: Action): boolean => {\n return isArray(action.subjects) && includes(subject, action.subjects);\n});\n\n/**\n * Transform the given attributes into a domain representation of an Action\n */\nconst create: (payload: CreateActionPayload) => Action = pipe(\n // Create and assign an action identifier to the action\n // (need to be done before the sanitizeActionAttributes since we need the uid here)\n assignActionId,\n // Add or remove the sub category field based on the pluginName attribute\n assignOrOmitSubCategory,\n // Remove unwanted attributes from the payload\n sanitizeActionAttributes,\n // Complete the action creation by adding default values for some attributes\n merge(getDefaultActionAttributes())\n);\n\nexport default {\n actionFields,\n appliesToProperty,\n appliesToSubject,\n assignActionId,\n assignOrOmitSubCategory,\n create,\n computeActionId,\n getDefaultActionAttributes,\n sanitizeActionAttributes,\n};\n"],"names":["getDefaultActionAttributes","options","applyToProperties","actionFields","sanitizeActionAttributes","pick","computeActionId","attributes","pluginName","uid","assignActionId","attrs","set","assignOrOmitSubCategory","action","shouldHaveSubCategory","includes","section","subCategory","omit","appliesToProperty","curry","property","pipe","prop","appliesToSubject","subject","isArray","subjects","create","merge"],"mappings":";;;;AA6FA;;;IAIA,MAAMA,0BAA6B,GAAA,KAAwB;QACzDC,OAAS,EAAA;YACPC,iBAAmB,EAAA;AACrB;KACF,CAAA;AAEA;;AAEC,IACD,MAAMC,YAAe,GAAA;AACnB,IAAA,SAAA;AACA,IAAA,aAAA;AACA,IAAA,UAAA;AACA,IAAA,aAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;AACD,CAAA;AAED;;IAGA,MAAMC,2BAA2BC,OAAKF,CAAAA,YAAAA,CAAAA;AAItC;;;;;AAKC;AAED,MAAMG,kBAAkB,CAACC,UAAAA,GAAAA;AACvB,IAAA,MAAM,EAAEC,UAAU,EAAEC,GAAG,EAAE,GAAGF,UAAAA;AAE5B,IAAA,IAAI,CAACC,UAAY,EAAA;AACf,QAAA,OAAO,CAAC,KAAK,EAAEC,GAAAA,CAAI,CAAC;AACtB;AAEA,IAAA,IAAID,eAAe,OAAS,EAAA;AAC1B,QAAA,OAAO,CAAC,OAAO,EAAEC,GAAAA,CAAI,CAAC;AACxB;AAEA,IAAA,OAAO,CAAC,QAAQ,EAAED,WAAW,CAAC,EAAEC,IAAI,CAAC;AACvC,CAAA;AAEA;;AAEC,IACD,MAAMC,cAAiB,GAAA,CAACC,QACtBC,MAAI,CAAA,UAAA,EAAYN,gBAAgBK,KAAQA,CAAAA,EAAAA,KAAAA,CAAAA;AAE1C;;;;IAKA,MAAME,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,qBAAwB,GAAA;AAAC,QAAA,UAAA;AAAY,QAAA;KAAU,CAACC,QAAQ,CAACF,MAAAA,CAAOG,OAAO,CAAA;IAE7E,OAAOF,qBAAAA,GACHH,OAAI,aAAeE,EAAAA,MAAAA,CAAOI,WAAW,IAAI,SAAA,EAAWJ,MACpDK,CAAAA,GAAAA,OAAAA,CAAK,aAAeL,EAAAA,MAAAA,CAAAA;AAC1B,CAAA;AAEA;;AAEC,IACD,MAAMM,iBAAAA,GAAoBC,QAAM,CAAA,CAACC,QAAkBR,EAAAA,MAAAA,GAAAA;AACjD,IAAA,OAAOS,OAAKC,CAAAA,OAAAA,CAAK,2BAA8BR,CAAAA,EAAAA,WAAAA,CAASM,QAAWR,CAAAA,CAAAA,CAAAA,MAAAA,CAAAA;AACrE,CAAA,CAAA;AAEA;;AAEC,IACD,MAAMW,gBAAAA,GAAmBJ,QAAM,CAAA,CAACK,OAAiBZ,EAAAA,MAAAA,GAAAA;AAC/C,IAAA,OAAOa,WAAQb,MAAOc,CAAAA,QAAQ,KAAKZ,WAASU,CAAAA,OAAAA,EAASZ,OAAOc,QAAQ,CAAA;AACtE,CAAA,CAAA;AAEA;;IAGA,MAAMC,MAAmDN,GAAAA,OAAAA;AAEvD;AACAb,cAAAA;AAEAG,uBAAAA;AAEAT,wBAAAA;AAEA0B,QAAM9B,CAAAA,0BAAAA,EAAAA,CAAAA,CAAAA;AAGR,mBAAe;AACbG,IAAAA,YAAAA;AACAiB,IAAAA,iBAAAA;AACAK,IAAAA,gBAAAA;AACAf,IAAAA,cAAAA;AACAG,IAAAA,uBAAAA;AACAgB,IAAAA,MAAAA;AACAvB,IAAAA,eAAAA;AACAN,IAAAA,0BAAAA;AACAI,IAAAA;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../server/src/domain/action/index.ts"],"sourcesContent":["import type { Utils } from '@strapi/types';\n\nimport { curry, pipe, merge, set, pick, omit, includes, isArray, prop } from 'lodash/fp';\n\nexport interface ActionAlias {\n /**\n * The action ID to alias\n */\n actionId: string;\n\n /**\n * An optional array of subject to restrict the alias usage\n */\n subjects?: string[];\n}\n\nexport type Action = {\n /**\n * The unique identifier of the action\n */\n actionId: string;\n\n /**\n * The section linked to the action - These can be 'contentTypes' | 'plugins' | 'settings' | 'internal'\n */\n section: string;\n\n /**\n * The human readable name of an action\n */\n displayName: string;\n\n /**\n * The main category of an action\n */\n category: string;\n\n /**\n * The secondary category of an action (only for settings and plugins section)\n */\n subCategory?: string;\n\n /**\n * The plugin that provides the action\n */\n pluginName?: string;\n\n /**\n * A list of subjects on which the action can be applied\n */\n subjects?: string[];\n\n /**\n * The options of an action\n */\n options: {\n /**\n * The list of properties that can be associated with an action\n */\n applyToProperties: string[] | null;\n };\n\n /**\n * An optional array of @see {@link ActionAlias}.\n *\n * It represents the possible aliases for the current action.\n *\n * Aliases are unidirectional.\n *\n * Note: This is an internal property and probably shouldn't be used outside Strapi core features.\n * Its behavior might change at any time without notice.\n *\n * @internal\n */\n aliases?: ActionAlias[];\n};\n\n/**\n * Set of attributes used to create a new {@link Action} object\n * @typedef {Action, { uid: string }} CreateActionPayload\n */\nexport type CreateActionPayload = Utils.Intersect<\n [\n Utils.Object.PartialBy<\n // Action Id is computed from the uid value\n Omit<Action, 'actionId'>,\n // Options is filled with default values\n 'options'\n >,\n { uid: string },\n ]\n>;\n\n/**\n * Return the default attributes of a new {@link Action}\n * @return Partial<Action>\n */\nconst getDefaultActionAttributes = (): Partial<Action> => ({\n options: {\n applyToProperties: null,\n },\n});\n\n/**\n * Get the list of all the valid attributes of an {@link Action}\n */\nconst actionFields = [\n 'section',\n 'displayName',\n 'category',\n 'subCategory',\n 'pluginName',\n 'subjects',\n 'options',\n 'actionId',\n 'aliases',\n] as const;\n\n/**\n * Remove unwanted attributes from an {@link Action}\n */\nconst sanitizeActionAttributes = pick(actionFields) as (\n action: Action | CreateActionPayload\n) => Action;\n\n/**\n * Create and return an identifier for an {@link CreateActionPayload}.\n * The format is based on the action's source ({@link CreateActionPayload.pluginName} or 'application') and {@link CreateActionPayload.uid}.\n * @param {CreateActionPayload} attributes\n * @return {string}\n */\n// TODO: TS - Use Common.UID\nconst computeActionId = (attributes: CreateActionPayload): string => {\n const { pluginName, uid } = attributes;\n\n if (!pluginName) {\n return `api::${uid}`;\n }\n\n if (pluginName === 'admin') {\n return `admin::${uid}`;\n }\n\n return `plugin::${pluginName}.${uid}`;\n};\n\n/**\n * Assign an actionId attribute to an {@link CreateActionPayload} object\n */\nconst assignActionId = (attrs: CreateActionPayload) =>\n set('actionId', computeActionId(attrs), attrs);\n\n/**\n * Transform an action by adding or removing the {@link Action.subCategory} attribute\n * @param {Action} action - The action to process\n * @return {Action}\n */\nconst assignOrOmitSubCategory = (action: Action): Action => {\n const shouldHaveSubCategory = ['settings', 'plugins'].includes(action.section);\n\n return shouldHaveSubCategory\n ? set('subCategory', action.subCategory || 'general', action)\n : omit('subCategory', action);\n};\n\n/**\n * Check if a property can be applied to an {@link Action}\n */\nconst appliesToProperty = curry((property: string, action: Action): boolean => {\n return pipe(prop('options.applyToProperties'), includes(property))(action);\n});\n\n/**\n * Check if an action applies to a subject\n */\nconst appliesToSubject = curry((subject: string, action: Action): boolean => {\n return isArray(action.subjects) && includes(subject, action.subjects);\n});\n\n/**\n * Transform the given attributes into a domain representation of an Action\n */\nconst create: (payload: CreateActionPayload) => Action = pipe(\n // Create and assign an action identifier to the action\n // (need to be done before the sanitizeActionAttributes since we need the uid here)\n assignActionId,\n // Add or remove the sub category field based on the pluginName attribute\n assignOrOmitSubCategory,\n // Remove unwanted attributes from the payload\n sanitizeActionAttributes,\n // Complete the action creation by adding default values for some attributes\n merge(getDefaultActionAttributes())\n);\n\nexport default {\n actionFields,\n appliesToProperty,\n appliesToSubject,\n assignActionId,\n assignOrOmitSubCategory,\n create,\n computeActionId,\n getDefaultActionAttributes,\n sanitizeActionAttributes,\n};\n"],"names":["getDefaultActionAttributes","options","applyToProperties","actionFields","sanitizeActionAttributes","pick","computeActionId","attributes","pluginName","uid","assignActionId","attrs","set","assignOrOmitSubCategory","action","shouldHaveSubCategory","includes","section","subCategory","omit","appliesToProperty","curry","property","pipe","prop","appliesToSubject","subject","isArray","subjects","create","merge"],"mappings":";;;;AA6FA;;;IAIA,MAAMA,0BAA6B,GAAA,KAAwB;QACzDC,OAAS,EAAA;YACPC,iBAAmB,EAAA;AACrB;KACF,CAAA;AAEA;;AAEC,IACD,MAAMC,YAAe,GAAA;AACnB,IAAA,SAAA;AACA,IAAA,aAAA;AACA,IAAA,UAAA;AACA,IAAA,aAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;AACD,CAAA;AAED;;IAGA,MAAMC,2BAA2BC,OAAKF,CAAAA,YAAAA,CAAAA;AAItC;;;;;AAKC;AAED,MAAMG,kBAAkB,CAACC,UAAAA,GAAAA;AACvB,IAAA,MAAM,EAAEC,UAAU,EAAEC,GAAG,EAAE,GAAGF,UAAAA;AAE5B,IAAA,IAAI,CAACC,UAAY,EAAA;QACf,OAAO,CAAC,KAAK,EAAEC,GAAK,CAAA,CAAA;AACtB;AAEA,IAAA,IAAID,eAAe,OAAS,EAAA;QAC1B,OAAO,CAAC,OAAO,EAAEC,GAAK,CAAA,CAAA;AACxB;AAEA,IAAA,OAAO,CAAC,QAAQ,EAAED,UAAW,CAAA,CAAC,EAAEC,GAAK,CAAA,CAAA;AACvC,CAAA;AAEA;;AAEC,IACD,MAAMC,cAAiB,GAAA,CAACC,QACtBC,MAAI,CAAA,UAAA,EAAYN,gBAAgBK,KAAQA,CAAAA,EAAAA,KAAAA,CAAAA;AAE1C;;;;IAKA,MAAME,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,qBAAwB,GAAA;AAAC,QAAA,UAAA;AAAY,QAAA;KAAU,CAACC,QAAQ,CAACF,MAAAA,CAAOG,OAAO,CAAA;IAE7E,OAAOF,qBAAAA,GACHH,OAAI,aAAeE,EAAAA,MAAAA,CAAOI,WAAW,IAAI,SAAA,EAAWJ,MACpDK,CAAAA,GAAAA,OAAAA,CAAK,aAAeL,EAAAA,MAAAA,CAAAA;AAC1B,CAAA;AAEA;;AAEC,IACD,MAAMM,iBAAAA,GAAoBC,QAAM,CAAA,CAACC,QAAkBR,EAAAA,MAAAA,GAAAA;AACjD,IAAA,OAAOS,OAAKC,CAAAA,OAAAA,CAAK,2BAA8BR,CAAAA,EAAAA,WAAAA,CAASM,QAAWR,CAAAA,CAAAA,CAAAA,MAAAA,CAAAA;AACrE,CAAA,CAAA;AAEA;;AAEC,IACD,MAAMW,gBAAAA,GAAmBJ,QAAM,CAAA,CAACK,OAAiBZ,EAAAA,MAAAA,GAAAA;AAC/C,IAAA,OAAOa,WAAQb,MAAOc,CAAAA,QAAQ,KAAKZ,WAASU,CAAAA,OAAAA,EAASZ,OAAOc,QAAQ,CAAA;AACtE,CAAA,CAAA;AAEA;;IAGA,MAAMC,MAAmDN,GAAAA,OAAAA;AAEvD;AACAb,cAAAA;AAEAG,uBAAAA;AAEAT,wBAAAA;AAEA0B,QAAM9B,CAAAA,0BAAAA,EAAAA,CAAAA,CAAAA;AAGR,mBAAe;AACbG,IAAAA,YAAAA;AACAiB,IAAAA,iBAAAA;AACAK,IAAAA,gBAAAA;AACAf,IAAAA,cAAAA;AACAG,IAAAA,uBAAAA;AACAgB,IAAAA,MAAAA;AACAvB,IAAAA,eAAAA;AACAN,IAAAA,0BAAAA;AACAI,IAAAA;AACF,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../server/src/domain/action/index.ts"],"sourcesContent":["import type { Utils } from '@strapi/types';\n\nimport { curry, pipe, merge, set, pick, omit, includes, isArray, prop } from 'lodash/fp';\n\nexport interface ActionAlias {\n /**\n * The action ID to alias\n */\n actionId: string;\n\n /**\n * An optional array of subject to restrict the alias usage\n */\n subjects?: string[];\n}\n\nexport type Action = {\n /**\n * The unique identifier of the action\n */\n actionId: string;\n\n /**\n * The section linked to the action - These can be 'contentTypes' | 'plugins' | 'settings' | 'internal'\n */\n section: string;\n\n /**\n * The human readable name of an action\n */\n displayName: string;\n\n /**\n * The main category of an action\n */\n category: string;\n\n /**\n * The secondary category of an action (only for settings and plugins section)\n */\n subCategory?: string;\n\n /**\n * The plugin that provides the action\n */\n pluginName?: string;\n\n /**\n * A list of subjects on which the action can be applied\n */\n subjects?: string[];\n\n /**\n * The options of an action\n */\n options: {\n /**\n * The list of properties that can be associated with an action\n */\n applyToProperties: string[] | null;\n };\n\n /**\n * An optional array of @see {@link ActionAlias}.\n *\n * It represents the possible aliases for the current action.\n *\n * Aliases are unidirectional.\n *\n * Note: This is an internal property and probably shouldn't be used outside Strapi core features.\n * Its behavior might change at any time without notice.\n *\n * @internal\n */\n aliases?: ActionAlias[];\n};\n\n/**\n * Set of attributes used to create a new {@link Action} object\n * @typedef {Action, { uid: string }} CreateActionPayload\n */\nexport type CreateActionPayload = Utils.Intersect<\n [\n Utils.Object.PartialBy<\n // Action Id is computed from the uid value\n Omit<Action, 'actionId'>,\n // Options is filled with default values\n 'options'\n >,\n { uid: string },\n ]\n>;\n\n/**\n * Return the default attributes of a new {@link Action}\n * @return Partial<Action>\n */\nconst getDefaultActionAttributes = (): Partial<Action> => ({\n options: {\n applyToProperties: null,\n },\n});\n\n/**\n * Get the list of all the valid attributes of an {@link Action}\n */\nconst actionFields = [\n 'section',\n 'displayName',\n 'category',\n 'subCategory',\n 'pluginName',\n 'subjects',\n 'options',\n 'actionId',\n 'aliases',\n] as const;\n\n/**\n * Remove unwanted attributes from an {@link Action}\n */\nconst sanitizeActionAttributes = pick(actionFields) as (\n action: Action | CreateActionPayload\n) => Action;\n\n/**\n * Create and return an identifier for an {@link CreateActionPayload}.\n * The format is based on the action's source ({@link CreateActionPayload.pluginName} or 'application') and {@link CreateActionPayload.uid}.\n * @param {CreateActionPayload} attributes\n * @return {string}\n */\n// TODO: TS - Use Common.UID\nconst computeActionId = (attributes: CreateActionPayload): string => {\n const { pluginName, uid } = attributes;\n\n if (!pluginName) {\n return `api::${uid}`;\n }\n\n if (pluginName === 'admin') {\n return `admin::${uid}`;\n }\n\n return `plugin::${pluginName}.${uid}`;\n};\n\n/**\n * Assign an actionId attribute to an {@link CreateActionPayload} object\n */\nconst assignActionId = (attrs: CreateActionPayload) =>\n set('actionId', computeActionId(attrs), attrs);\n\n/**\n * Transform an action by adding or removing the {@link Action.subCategory} attribute\n * @param {Action} action - The action to process\n * @return {Action}\n */\nconst assignOrOmitSubCategory = (action: Action): Action => {\n const shouldHaveSubCategory = ['settings', 'plugins'].includes(action.section);\n\n return shouldHaveSubCategory\n ? set('subCategory', action.subCategory || 'general', action)\n : omit('subCategory', action);\n};\n\n/**\n * Check if a property can be applied to an {@link Action}\n */\nconst appliesToProperty = curry((property: string, action: Action): boolean => {\n return pipe(prop('options.applyToProperties'), includes(property))(action);\n});\n\n/**\n * Check if an action applies to a subject\n */\nconst appliesToSubject = curry((subject: string, action: Action): boolean => {\n return isArray(action.subjects) && includes(subject, action.subjects);\n});\n\n/**\n * Transform the given attributes into a domain representation of an Action\n */\nconst create: (payload: CreateActionPayload) => Action = pipe(\n // Create and assign an action identifier to the action\n // (need to be done before the sanitizeActionAttributes since we need the uid here)\n assignActionId,\n // Add or remove the sub category field based on the pluginName attribute\n assignOrOmitSubCategory,\n // Remove unwanted attributes from the payload\n sanitizeActionAttributes,\n // Complete the action creation by adding default values for some attributes\n merge(getDefaultActionAttributes())\n);\n\nexport default {\n actionFields,\n appliesToProperty,\n appliesToSubject,\n assignActionId,\n assignOrOmitSubCategory,\n create,\n computeActionId,\n getDefaultActionAttributes,\n sanitizeActionAttributes,\n};\n"],"names":["getDefaultActionAttributes","options","applyToProperties","actionFields","sanitizeActionAttributes","pick","computeActionId","attributes","pluginName","uid","assignActionId","attrs","set","assignOrOmitSubCategory","action","shouldHaveSubCategory","includes","section","subCategory","omit","appliesToProperty","curry","property","pipe","prop","appliesToSubject","subject","isArray","subjects","create","merge"],"mappings":";;AA6FA;;;IAIA,MAAMA,0BAA6B,GAAA,KAAwB;QACzDC,OAAS,EAAA;YACPC,iBAAmB,EAAA;AACrB;KACF,CAAA;AAEA;;AAEC,IACD,MAAMC,YAAe,GAAA;AACnB,IAAA,SAAA;AACA,IAAA,aAAA;AACA,IAAA,UAAA;AACA,IAAA,aAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;AACD,CAAA;AAED;;IAGA,MAAMC,2BAA2BC,IAAKF,CAAAA,YAAAA,CAAAA;AAItC;;;;;AAKC;AAED,MAAMG,kBAAkB,CAACC,UAAAA,GAAAA;AACvB,IAAA,MAAM,EAAEC,UAAU,EAAEC,GAAG,EAAE,GAAGF,UAAAA;AAE5B,IAAA,IAAI,CAACC,UAAY,EAAA;AACf,QAAA,OAAO,CAAC,KAAK,EAAEC,GAAAA,CAAI,CAAC;AACtB;AAEA,IAAA,IAAID,eAAe,OAAS,EAAA;AAC1B,QAAA,OAAO,CAAC,OAAO,EAAEC,GAAAA,CAAI,CAAC;AACxB;AAEA,IAAA,OAAO,CAAC,QAAQ,EAAED,WAAW,CAAC,EAAEC,IAAI,CAAC;AACvC,CAAA;AAEA;;AAEC,IACD,MAAMC,cAAiB,GAAA,CAACC,QACtBC,GAAI,CAAA,UAAA,EAAYN,gBAAgBK,KAAQA,CAAAA,EAAAA,KAAAA,CAAAA;AAE1C;;;;IAKA,MAAME,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,qBAAwB,GAAA;AAAC,QAAA,UAAA;AAAY,QAAA;KAAU,CAACC,QAAQ,CAACF,MAAAA,CAAOG,OAAO,CAAA;IAE7E,OAAOF,qBAAAA,GACHH,IAAI,aAAeE,EAAAA,MAAAA,CAAOI,WAAW,IAAI,SAAA,EAAWJ,MACpDK,CAAAA,GAAAA,IAAAA,CAAK,aAAeL,EAAAA,MAAAA,CAAAA;AAC1B,CAAA;AAEA;;AAEC,IACD,MAAMM,iBAAAA,GAAoBC,KAAM,CAAA,CAACC,QAAkBR,EAAAA,MAAAA,GAAAA;AACjD,IAAA,OAAOS,IAAKC,CAAAA,IAAAA,CAAK,2BAA8BR,CAAAA,EAAAA,QAAAA,CAASM,QAAWR,CAAAA,CAAAA,CAAAA,MAAAA,CAAAA;AACrE,CAAA,CAAA;AAEA;;AAEC,IACD,MAAMW,gBAAAA,GAAmBJ,KAAM,CAAA,CAACK,OAAiBZ,EAAAA,MAAAA,GAAAA;AAC/C,IAAA,OAAOa,QAAQb,MAAOc,CAAAA,QAAQ,KAAKZ,QAASU,CAAAA,OAAAA,EAASZ,OAAOc,QAAQ,CAAA;AACtE,CAAA,CAAA;AAEA;;IAGA,MAAMC,MAAmDN,GAAAA,IAAAA;AAEvD;AACAb,cAAAA;AAEAG,uBAAAA;AAEAT,wBAAAA;AAEA0B,KAAM9B,CAAAA,0BAAAA,EAAAA,CAAAA,CAAAA;AAGR,mBAAe;AACbG,IAAAA,YAAAA;AACAiB,IAAAA,iBAAAA;AACAK,IAAAA,gBAAAA;AACAf,IAAAA,cAAAA;AACAG,IAAAA,uBAAAA;AACAgB,IAAAA,MAAAA;AACAvB,IAAAA,eAAAA;AACAN,IAAAA,0BAAAA;AACAI,IAAAA;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../server/src/domain/action/index.ts"],"sourcesContent":["import type { Utils } from '@strapi/types';\n\nimport { curry, pipe, merge, set, pick, omit, includes, isArray, prop } from 'lodash/fp';\n\nexport interface ActionAlias {\n /**\n * The action ID to alias\n */\n actionId: string;\n\n /**\n * An optional array of subject to restrict the alias usage\n */\n subjects?: string[];\n}\n\nexport type Action = {\n /**\n * The unique identifier of the action\n */\n actionId: string;\n\n /**\n * The section linked to the action - These can be 'contentTypes' | 'plugins' | 'settings' | 'internal'\n */\n section: string;\n\n /**\n * The human readable name of an action\n */\n displayName: string;\n\n /**\n * The main category of an action\n */\n category: string;\n\n /**\n * The secondary category of an action (only for settings and plugins section)\n */\n subCategory?: string;\n\n /**\n * The plugin that provides the action\n */\n pluginName?: string;\n\n /**\n * A list of subjects on which the action can be applied\n */\n subjects?: string[];\n\n /**\n * The options of an action\n */\n options: {\n /**\n * The list of properties that can be associated with an action\n */\n applyToProperties: string[] | null;\n };\n\n /**\n * An optional array of @see {@link ActionAlias}.\n *\n * It represents the possible aliases for the current action.\n *\n * Aliases are unidirectional.\n *\n * Note: This is an internal property and probably shouldn't be used outside Strapi core features.\n * Its behavior might change at any time without notice.\n *\n * @internal\n */\n aliases?: ActionAlias[];\n};\n\n/**\n * Set of attributes used to create a new {@link Action} object\n * @typedef {Action, { uid: string }} CreateActionPayload\n */\nexport type CreateActionPayload = Utils.Intersect<\n [\n Utils.Object.PartialBy<\n // Action Id is computed from the uid value\n Omit<Action, 'actionId'>,\n // Options is filled with default values\n 'options'\n >,\n { uid: string },\n ]\n>;\n\n/**\n * Return the default attributes of a new {@link Action}\n * @return Partial<Action>\n */\nconst getDefaultActionAttributes = (): Partial<Action> => ({\n options: {\n applyToProperties: null,\n },\n});\n\n/**\n * Get the list of all the valid attributes of an {@link Action}\n */\nconst actionFields = [\n 'section',\n 'displayName',\n 'category',\n 'subCategory',\n 'pluginName',\n 'subjects',\n 'options',\n 'actionId',\n 'aliases',\n] as const;\n\n/**\n * Remove unwanted attributes from an {@link Action}\n */\nconst sanitizeActionAttributes = pick(actionFields) as (\n action: Action | CreateActionPayload\n) => Action;\n\n/**\n * Create and return an identifier for an {@link CreateActionPayload}.\n * The format is based on the action's source ({@link CreateActionPayload.pluginName} or 'application') and {@link CreateActionPayload.uid}.\n * @param {CreateActionPayload} attributes\n * @return {string}\n */\n// TODO: TS - Use Common.UID\nconst computeActionId = (attributes: CreateActionPayload): string => {\n const { pluginName, uid } = attributes;\n\n if (!pluginName) {\n return `api::${uid}`;\n }\n\n if (pluginName === 'admin') {\n return `admin::${uid}`;\n }\n\n return `plugin::${pluginName}.${uid}`;\n};\n\n/**\n * Assign an actionId attribute to an {@link CreateActionPayload} object\n */\nconst assignActionId = (attrs: CreateActionPayload) =>\n set('actionId', computeActionId(attrs), attrs);\n\n/**\n * Transform an action by adding or removing the {@link Action.subCategory} attribute\n * @param {Action} action - The action to process\n * @return {Action}\n */\nconst assignOrOmitSubCategory = (action: Action): Action => {\n const shouldHaveSubCategory = ['settings', 'plugins'].includes(action.section);\n\n return shouldHaveSubCategory\n ? set('subCategory', action.subCategory || 'general', action)\n : omit('subCategory', action);\n};\n\n/**\n * Check if a property can be applied to an {@link Action}\n */\nconst appliesToProperty = curry((property: string, action: Action): boolean => {\n return pipe(prop('options.applyToProperties'), includes(property))(action);\n});\n\n/**\n * Check if an action applies to a subject\n */\nconst appliesToSubject = curry((subject: string, action: Action): boolean => {\n return isArray(action.subjects) && includes(subject, action.subjects);\n});\n\n/**\n * Transform the given attributes into a domain representation of an Action\n */\nconst create: (payload: CreateActionPayload) => Action = pipe(\n // Create and assign an action identifier to the action\n // (need to be done before the sanitizeActionAttributes since we need the uid here)\n assignActionId,\n // Add or remove the sub category field based on the pluginName attribute\n assignOrOmitSubCategory,\n // Remove unwanted attributes from the payload\n sanitizeActionAttributes,\n // Complete the action creation by adding default values for some attributes\n merge(getDefaultActionAttributes())\n);\n\nexport default {\n actionFields,\n appliesToProperty,\n appliesToSubject,\n assignActionId,\n assignOrOmitSubCategory,\n create,\n computeActionId,\n getDefaultActionAttributes,\n sanitizeActionAttributes,\n};\n"],"names":["getDefaultActionAttributes","options","applyToProperties","actionFields","sanitizeActionAttributes","pick","computeActionId","attributes","pluginName","uid","assignActionId","attrs","set","assignOrOmitSubCategory","action","shouldHaveSubCategory","includes","section","subCategory","omit","appliesToProperty","curry","property","pipe","prop","appliesToSubject","subject","isArray","subjects","create","merge"],"mappings":";;AA6FA;;;IAIA,MAAMA,0BAA6B,GAAA,KAAwB;QACzDC,OAAS,EAAA;YACPC,iBAAmB,EAAA;AACrB;KACF,CAAA;AAEA;;AAEC,IACD,MAAMC,YAAe,GAAA;AACnB,IAAA,SAAA;AACA,IAAA,aAAA;AACA,IAAA,UAAA;AACA,IAAA,aAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;AACD,CAAA;AAED;;IAGA,MAAMC,2BAA2BC,IAAKF,CAAAA,YAAAA,CAAAA;AAItC;;;;;AAKC;AAED,MAAMG,kBAAkB,CAACC,UAAAA,GAAAA;AACvB,IAAA,MAAM,EAAEC,UAAU,EAAEC,GAAG,EAAE,GAAGF,UAAAA;AAE5B,IAAA,IAAI,CAACC,UAAY,EAAA;QACf,OAAO,CAAC,KAAK,EAAEC,GAAK,CAAA,CAAA;AACtB;AAEA,IAAA,IAAID,eAAe,OAAS,EAAA;QAC1B,OAAO,CAAC,OAAO,EAAEC,GAAK,CAAA,CAAA;AACxB;AAEA,IAAA,OAAO,CAAC,QAAQ,EAAED,UAAW,CAAA,CAAC,EAAEC,GAAK,CAAA,CAAA;AACvC,CAAA;AAEA;;AAEC,IACD,MAAMC,cAAiB,GAAA,CAACC,QACtBC,GAAI,CAAA,UAAA,EAAYN,gBAAgBK,KAAQA,CAAAA,EAAAA,KAAAA,CAAAA;AAE1C;;;;IAKA,MAAME,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,qBAAwB,GAAA;AAAC,QAAA,UAAA;AAAY,QAAA;KAAU,CAACC,QAAQ,CAACF,MAAAA,CAAOG,OAAO,CAAA;IAE7E,OAAOF,qBAAAA,GACHH,IAAI,aAAeE,EAAAA,MAAAA,CAAOI,WAAW,IAAI,SAAA,EAAWJ,MACpDK,CAAAA,GAAAA,IAAAA,CAAK,aAAeL,EAAAA,MAAAA,CAAAA;AAC1B,CAAA;AAEA;;AAEC,IACD,MAAMM,iBAAAA,GAAoBC,KAAM,CAAA,CAACC,QAAkBR,EAAAA,MAAAA,GAAAA;AACjD,IAAA,OAAOS,IAAKC,CAAAA,IAAAA,CAAK,2BAA8BR,CAAAA,EAAAA,QAAAA,CAASM,QAAWR,CAAAA,CAAAA,CAAAA,MAAAA,CAAAA;AACrE,CAAA,CAAA;AAEA;;AAEC,IACD,MAAMW,gBAAAA,GAAmBJ,KAAM,CAAA,CAACK,OAAiBZ,EAAAA,MAAAA,GAAAA;AAC/C,IAAA,OAAOa,QAAQb,MAAOc,CAAAA,QAAQ,KAAKZ,QAASU,CAAAA,OAAAA,EAASZ,OAAOc,QAAQ,CAAA;AACtE,CAAA,CAAA;AAEA;;IAGA,MAAMC,MAAmDN,GAAAA,IAAAA;AAEvD;AACAb,cAAAA;AAEAG,uBAAAA;AAEAT,wBAAAA;AAEA0B,KAAM9B,CAAAA,0BAAAA,EAAAA,CAAAA,CAAAA;AAGR,mBAAe;AACbG,IAAAA,YAAAA;AACAiB,IAAAA,iBAAAA;AACAK,IAAAA,gBAAAA;AACAf,IAAAA,cAAAA;AACAG,IAAAA,uBAAAA;AACAgB,IAAAA,MAAAA;AACAvB,IAAAA,eAAAA;AACAN,IAAAA,0BAAAA;AACAI,IAAAA;AACF,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../server/src/domain/condition/index.ts"],"sourcesContent":["import { pipe, merge, set, pick } from 'lodash/fp';\n\nexport type Condition = {\n id: string;\n displayName: string;\n name: string;\n plugin?: string;\n category?: string;\n /**\n * The handler of a {@link Condition}\n */\n handler: (user: object, options: object) => object | boolean;\n};\n\n/**\n * Set of attributes used to create a new {@link Action} object\n */\nexport type CreateConditionPayload = Omit<Condition, 'id'>;\n\nconst DEFAULT_CATEGORY = 'default';\n\n/**\n * Get the default value used for every condition\n * @return {Condition}\n */\nexport const getDefaultConditionAttributes = () => ({\n category: DEFAULT_CATEGORY,\n});\n\n/**\n * Get the list of all the valid attributes of a {@link Condition}\n * @return {string[]}\n */\nexport const conditionFields = ['id', 'displayName', 'handler', 'plugin', 'category'] as const;\n\n/**\n * Remove unwanted attributes from a {@link Condition}\n */\nexport const sanitizeConditionAttributes = pick(conditionFields);\n\nexport const computeConditionId = (condition: CreateConditionPayload) => {\n const { name, plugin } = condition;\n\n if (!plugin) {\n return `api::${name}`;\n }\n\n if (plugin === 'admin') {\n return `admin::${name}`;\n }\n\n return `plugin::${plugin}.${name}`;\n};\n\n/**\n * Assign an id attribute to a {@link CreateConditionPayload} object\n * @param attrs - Payload used to create a condition\n */\nexport const assignConditionId = (attrs: CreateConditionPayload): Condition => {\n const condition = set('id', computeConditionId(attrs), attrs) as CreateConditionPayload & {\n id: string;\n };\n return condition;\n};\n\n/**\n * Transform the given attributes into a domain representation of a Condition\n * @param payload - The condition payload containing the attributes needed to create a {@link Condition}\n */\nexport const create = pipe(\n assignConditionId,\n sanitizeConditionAttributes,\n merge(getDefaultConditionAttributes())\n) as (payload: CreateConditionPayload) => Condition;\n\nexport default {\n assignConditionId,\n computeConditionId,\n conditionFields,\n create,\n getDefaultConditionAttributes,\n sanitizeConditionAttributes,\n};\n"],"names":["DEFAULT_CATEGORY","getDefaultConditionAttributes","category","conditionFields","sanitizeConditionAttributes","pick","computeConditionId","condition","name","plugin","assignConditionId","attrs","set","create","pipe","merge"],"mappings":";;;;;;AAmBA,MAAMA,gBAAmB,GAAA,SAAA;AAEzB;;;AAGC,IACM,MAAMC,6BAAgC,GAAA,KAAO;QAClDC,QAAUF,EAAAA;AACZ,KAAA;AAEA;;;UAIaG,eAAkB,GAAA;AAAC,IAAA,IAAA;AAAM,IAAA,aAAA;AAAe,IAAA,SAAA;AAAW,IAAA,QAAA;AAAU,IAAA;;AAE1E;;AAEC,IACM,MAAMC,2BAA8BC,GAAAA,OAAAA,CAAKF,eAAiB;AAE1D,MAAMG,qBAAqB,CAACC,SAAAA,GAAAA;AACjC,IAAA,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAGF,SAAAA;AAEzB,IAAA,IAAI,CAACE,MAAQ,EAAA;AACX,QAAA,OAAO,CAAC,KAAK,EAAED,IAAAA,CAAK,CAAC;AACvB;AAEA,IAAA,IAAIC,WAAW,OAAS,EAAA;AACtB,QAAA,OAAO,CAAC,OAAO,EAAED,IAAAA,CAAK,CAAC;AACzB;AAEA,IAAA,OAAO,CAAC,QAAQ,EAAEC,OAAO,CAAC,EAAED,KAAK,CAAC;AACpC;AAEA;;;IAIaE,MAAAA,iBAAAA,GAAoB,CAACC,KAAAA,GAAAA;AAChC,IAAA,MAAMJ,SAAYK,GAAAA,MAAAA,CAAI,IAAMN,EAAAA,kBAAAA,CAAmBK,KAAQA,CAAAA,EAAAA,KAAAA,CAAAA;IAGvD,OAAOJ,SAAAA;AACT;AAEA;;;AAGC,IACYM,MAAAA,MAAAA,GAASC,QACpBJ,iBACAN,EAAAA,2BAAAA,EACAW,SAAMd,6BAC4C,EAAA,CAAA;AAEpD,aAAe;AACbS,IAAAA,iBAAAA;AACAJ,IAAAA,kBAAAA;AACAH,IAAAA,eAAAA;AACAU,IAAAA,MAAAA;AACAZ,IAAAA,6BAAAA;AACAG,IAAAA;AACF,CAAE;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../server/src/domain/condition/index.ts"],"sourcesContent":["import { pipe, merge, set, pick } from 'lodash/fp';\n\nexport type Condition = {\n id: string;\n displayName: string;\n name: string;\n plugin?: string;\n category?: string;\n /**\n * The handler of a {@link Condition}\n */\n handler: (user: object, options: object) => object | boolean;\n};\n\n/**\n * Set of attributes used to create a new {@link Action} object\n */\nexport type CreateConditionPayload = Omit<Condition, 'id'>;\n\nconst DEFAULT_CATEGORY = 'default';\n\n/**\n * Get the default value used for every condition\n * @return {Condition}\n */\nexport const getDefaultConditionAttributes = () => ({\n category: DEFAULT_CATEGORY,\n});\n\n/**\n * Get the list of all the valid attributes of a {@link Condition}\n * @return {string[]}\n */\nexport const conditionFields = ['id', 'displayName', 'handler', 'plugin', 'category'] as const;\n\n/**\n * Remove unwanted attributes from a {@link Condition}\n */\nexport const sanitizeConditionAttributes = pick(conditionFields);\n\nexport const computeConditionId = (condition: CreateConditionPayload) => {\n const { name, plugin } = condition;\n\n if (!plugin) {\n return `api::${name}`;\n }\n\n if (plugin === 'admin') {\n return `admin::${name}`;\n }\n\n return `plugin::${plugin}.${name}`;\n};\n\n/**\n * Assign an id attribute to a {@link CreateConditionPayload} object\n * @param attrs - Payload used to create a condition\n */\nexport const assignConditionId = (attrs: CreateConditionPayload): Condition => {\n const condition = set('id', computeConditionId(attrs), attrs) as CreateConditionPayload & {\n id: string;\n };\n return condition;\n};\n\n/**\n * Transform the given attributes into a domain representation of a Condition\n * @param payload - The condition payload containing the attributes needed to create a {@link Condition}\n */\nexport const create = pipe(\n assignConditionId,\n sanitizeConditionAttributes,\n merge(getDefaultConditionAttributes())\n) as (payload: CreateConditionPayload) => Condition;\n\nexport default {\n assignConditionId,\n computeConditionId,\n conditionFields,\n create,\n getDefaultConditionAttributes,\n sanitizeConditionAttributes,\n};\n"],"names":["DEFAULT_CATEGORY","getDefaultConditionAttributes","category","conditionFields","sanitizeConditionAttributes","pick","computeConditionId","condition","name","plugin","assignConditionId","attrs","set","create","pipe","merge"],"mappings":";;;;;;AAmBA,MAAMA,gBAAmB,GAAA,SAAA;AAEzB;;;AAGC,IACM,MAAMC,6BAAgC,GAAA,KAAO;QAClDC,QAAUF,EAAAA;AACZ,KAAA;AAEA;;;UAIaG,eAAkB,GAAA;AAAC,IAAA,IAAA;AAAM,IAAA,aAAA;AAAe,IAAA,SAAA;AAAW,IAAA,QAAA;AAAU,IAAA;;AAE1E;;AAEC,IACM,MAAMC,2BAA8BC,GAAAA,OAAAA,CAAKF,eAAiB;AAE1D,MAAMG,qBAAqB,CAACC,SAAAA,GAAAA;AACjC,IAAA,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAGF,SAAAA;AAEzB,IAAA,IAAI,CAACE,MAAQ,EAAA;QACX,OAAO,CAAC,KAAK,EAAED,IAAM,CAAA,CAAA;AACvB;AAEA,IAAA,IAAIC,WAAW,OAAS,EAAA;QACtB,OAAO,CAAC,OAAO,EAAED,IAAM,CAAA,CAAA;AACzB;AAEA,IAAA,OAAO,CAAC,QAAQ,EAAEC,MAAO,CAAA,CAAC,EAAED,IAAM,CAAA,CAAA;AACpC;AAEA;;;IAIaE,MAAAA,iBAAAA,GAAoB,CAACC,KAAAA,GAAAA;AAChC,IAAA,MAAMJ,SAAYK,GAAAA,MAAAA,CAAI,IAAMN,EAAAA,kBAAAA,CAAmBK,KAAQA,CAAAA,EAAAA,KAAAA,CAAAA;IAGvD,OAAOJ,SAAAA;AACT;AAEA;;;AAGC,IACYM,MAAAA,MAAAA,GAASC,QACpBJ,iBACAN,EAAAA,2BAAAA,EACAW,SAAMd,6BAC4C,EAAA,CAAA;AAEpD,aAAe;AACbS,IAAAA,iBAAAA;AACAJ,IAAAA,kBAAAA;AACAH,IAAAA,eAAAA;AACAU,IAAAA,MAAAA;AACAZ,IAAAA,6BAAAA;AACAG,IAAAA;AACF,CAAE;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../server/src/domain/condition/index.ts"],"sourcesContent":["import { pipe, merge, set, pick } from 'lodash/fp';\n\nexport type Condition = {\n id: string;\n displayName: string;\n name: string;\n plugin?: string;\n category?: string;\n /**\n * The handler of a {@link Condition}\n */\n handler: (user: object, options: object) => object | boolean;\n};\n\n/**\n * Set of attributes used to create a new {@link Action} object\n */\nexport type CreateConditionPayload = Omit<Condition, 'id'>;\n\nconst DEFAULT_CATEGORY = 'default';\n\n/**\n * Get the default value used for every condition\n * @return {Condition}\n */\nexport const getDefaultConditionAttributes = () => ({\n category: DEFAULT_CATEGORY,\n});\n\n/**\n * Get the list of all the valid attributes of a {@link Condition}\n * @return {string[]}\n */\nexport const conditionFields = ['id', 'displayName', 'handler', 'plugin', 'category'] as const;\n\n/**\n * Remove unwanted attributes from a {@link Condition}\n */\nexport const sanitizeConditionAttributes = pick(conditionFields);\n\nexport const computeConditionId = (condition: CreateConditionPayload) => {\n const { name, plugin } = condition;\n\n if (!plugin) {\n return `api::${name}`;\n }\n\n if (plugin === 'admin') {\n return `admin::${name}`;\n }\n\n return `plugin::${plugin}.${name}`;\n};\n\n/**\n * Assign an id attribute to a {@link CreateConditionPayload} object\n * @param attrs - Payload used to create a condition\n */\nexport const assignConditionId = (attrs: CreateConditionPayload): Condition => {\n const condition = set('id', computeConditionId(attrs), attrs) as CreateConditionPayload & {\n id: string;\n };\n return condition;\n};\n\n/**\n * Transform the given attributes into a domain representation of a Condition\n * @param payload - The condition payload containing the attributes needed to create a {@link Condition}\n */\nexport const create = pipe(\n assignConditionId,\n sanitizeConditionAttributes,\n merge(getDefaultConditionAttributes())\n) as (payload: CreateConditionPayload) => Condition;\n\nexport default {\n assignConditionId,\n computeConditionId,\n conditionFields,\n create,\n getDefaultConditionAttributes,\n sanitizeConditionAttributes,\n};\n"],"names":["DEFAULT_CATEGORY","getDefaultConditionAttributes","category","conditionFields","sanitizeConditionAttributes","pick","computeConditionId","condition","name","plugin","assignConditionId","attrs","set","create","pipe","merge"],"mappings":";;AAmBA,MAAMA,gBAAmB,GAAA,SAAA;AAEzB;;;AAGC,IACM,MAAMC,6BAAgC,GAAA,KAAO;QAClDC,QAAUF,EAAAA;AACZ,KAAA;AAEA;;;UAIaG,eAAkB,GAAA;AAAC,IAAA,IAAA;AAAM,IAAA,aAAA;AAAe,IAAA,SAAA;AAAW,IAAA,QAAA;AAAU,IAAA;;AAE1E;;AAEC,IACM,MAAMC,2BAA8BC,GAAAA,IAAAA,CAAKF,eAAiB;AAE1D,MAAMG,qBAAqB,CAACC,SAAAA,GAAAA;AACjC,IAAA,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAGF,SAAAA;AAEzB,IAAA,IAAI,CAACE,MAAQ,EAAA;AACX,QAAA,OAAO,CAAC,KAAK,EAAED,IAAAA,CAAK,CAAC;AACvB;AAEA,IAAA,IAAIC,WAAW,OAAS,EAAA;AACtB,QAAA,OAAO,CAAC,OAAO,EAAED,IAAAA,CAAK,CAAC;AACzB;AAEA,IAAA,OAAO,CAAC,QAAQ,EAAEC,OAAO,CAAC,EAAED,KAAK,CAAC;AACpC;AAEA;;;IAIaE,MAAAA,iBAAAA,GAAoB,CAACC,KAAAA,GAAAA;AAChC,IAAA,MAAMJ,SAAYK,GAAAA,GAAAA,CAAI,IAAMN,EAAAA,kBAAAA,CAAmBK,KAAQA,CAAAA,EAAAA,KAAAA,CAAAA;IAGvD,OAAOJ,SAAAA;AACT;AAEA;;;AAGC,IACYM,MAAAA,MAAAA,GAASC,KACpBJ,iBACAN,EAAAA,2BAAAA,EACAW,MAAMd,6BAC4C,EAAA,CAAA;AAEpD,aAAe;AACbS,IAAAA,iBAAAA;AACAJ,IAAAA,kBAAAA;AACAH,IAAAA,eAAAA;AACAU,IAAAA,MAAAA;AACAZ,IAAAA,6BAAAA;AACAG,IAAAA;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../server/src/domain/condition/index.ts"],"sourcesContent":["import { pipe, merge, set, pick } from 'lodash/fp';\n\nexport type Condition = {\n id: string;\n displayName: string;\n name: string;\n plugin?: string;\n category?: string;\n /**\n * The handler of a {@link Condition}\n */\n handler: (user: object, options: object) => object | boolean;\n};\n\n/**\n * Set of attributes used to create a new {@link Action} object\n */\nexport type CreateConditionPayload = Omit<Condition, 'id'>;\n\nconst DEFAULT_CATEGORY = 'default';\n\n/**\n * Get the default value used for every condition\n * @return {Condition}\n */\nexport const getDefaultConditionAttributes = () => ({\n category: DEFAULT_CATEGORY,\n});\n\n/**\n * Get the list of all the valid attributes of a {@link Condition}\n * @return {string[]}\n */\nexport const conditionFields = ['id', 'displayName', 'handler', 'plugin', 'category'] as const;\n\n/**\n * Remove unwanted attributes from a {@link Condition}\n */\nexport const sanitizeConditionAttributes = pick(conditionFields);\n\nexport const computeConditionId = (condition: CreateConditionPayload) => {\n const { name, plugin } = condition;\n\n if (!plugin) {\n return `api::${name}`;\n }\n\n if (plugin === 'admin') {\n return `admin::${name}`;\n }\n\n return `plugin::${plugin}.${name}`;\n};\n\n/**\n * Assign an id attribute to a {@link CreateConditionPayload} object\n * @param attrs - Payload used to create a condition\n */\nexport const assignConditionId = (attrs: CreateConditionPayload): Condition => {\n const condition = set('id', computeConditionId(attrs), attrs) as CreateConditionPayload & {\n id: string;\n };\n return condition;\n};\n\n/**\n * Transform the given attributes into a domain representation of a Condition\n * @param payload - The condition payload containing the attributes needed to create a {@link Condition}\n */\nexport const create = pipe(\n assignConditionId,\n sanitizeConditionAttributes,\n merge(getDefaultConditionAttributes())\n) as (payload: CreateConditionPayload) => Condition;\n\nexport default {\n assignConditionId,\n computeConditionId,\n conditionFields,\n create,\n getDefaultConditionAttributes,\n sanitizeConditionAttributes,\n};\n"],"names":["DEFAULT_CATEGORY","getDefaultConditionAttributes","category","conditionFields","sanitizeConditionAttributes","pick","computeConditionId","condition","name","plugin","assignConditionId","attrs","set","create","pipe","merge"],"mappings":";;AAmBA,MAAMA,gBAAmB,GAAA,SAAA;AAEzB;;;AAGC,IACM,MAAMC,6BAAgC,GAAA,KAAO;QAClDC,QAAUF,EAAAA;AACZ,KAAA;AAEA;;;UAIaG,eAAkB,GAAA;AAAC,IAAA,IAAA;AAAM,IAAA,aAAA;AAAe,IAAA,SAAA;AAAW,IAAA,QAAA;AAAU,IAAA;;AAE1E;;AAEC,IACM,MAAMC,2BAA8BC,GAAAA,IAAAA,CAAKF,eAAiB;AAE1D,MAAMG,qBAAqB,CAACC,SAAAA,GAAAA;AACjC,IAAA,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAGF,SAAAA;AAEzB,IAAA,IAAI,CAACE,MAAQ,EAAA;QACX,OAAO,CAAC,KAAK,EAAED,IAAM,CAAA,CAAA;AACvB;AAEA,IAAA,IAAIC,WAAW,OAAS,EAAA;QACtB,OAAO,CAAC,OAAO,EAAED,IAAM,CAAA,CAAA;AACzB;AAEA,IAAA,OAAO,CAAC,QAAQ,EAAEC,MAAO,CAAA,CAAC,EAAED,IAAM,CAAA,CAAA;AACpC;AAEA;;;IAIaE,MAAAA,iBAAAA,GAAoB,CAACC,KAAAA,GAAAA;AAChC,IAAA,MAAMJ,SAAYK,GAAAA,GAAAA,CAAI,IAAMN,EAAAA,kBAAAA,CAAmBK,KAAQA,CAAAA,EAAAA,KAAAA,CAAAA;IAGvD,OAAOJ,SAAAA;AACT;AAEA;;;AAGC,IACYM,MAAAA,MAAAA,GAASC,KACpBJ,iBACAN,EAAAA,2BAAAA,EACAW,MAAMd,6BAC4C,EAAA,CAAA;AAEpD,aAAe;AACbS,IAAAA,iBAAAA;AACAJ,IAAAA,kBAAAA;AACAH,IAAAA,eAAAA;AACAU,IAAAA,MAAAA;AACAZ,IAAAA,6BAAAA;AACAG,IAAAA;AACF,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../server/src/domain/permission/index.ts"],"sourcesContent":["import type { Utils } from '@strapi/types';\n\nimport { providerFactory } from '@strapi/utils';\nimport {\n pipe,\n set,\n pick,\n eq,\n omit,\n remove,\n get,\n uniq,\n isArray,\n map,\n curry,\n merge,\n} from 'lodash/fp';\nimport { Permission } from '../../../../shared/contracts/shared';\nimport { SanitizedPermission } from '../../../../shared/contracts/roles';\n\nexport type CreatePermissionPayload = Utils.Object.PartialBy<\n Permission,\n 'actionParameters' | 'conditions' | 'properties' | 'subject' | 'id' | 'createdAt' | 'updatedAt'\n>;\n\ntype Provider = ReturnType<typeof providerFactory>;\n\nexport const permissionFields = [\n 'id',\n 'action',\n 'actionParameters',\n 'subject',\n 'properties',\n 'conditions',\n 'role',\n];\nexport const sanitizedPermissionFields = [\n 'id',\n 'action',\n 'actionParameters',\n 'subject',\n 'properties',\n 'conditions',\n] as const;\n\nexport const sanitizePermissionFields: (p: Permission) => SanitizedPermission =\n pick(sanitizedPermissionFields);\n\n/**\n * Creates a permission with default values\n */\nconst getDefaultPermission = () => ({\n actionParameters: {},\n conditions: [],\n properties: {},\n subject: null,\n});\n\n/**\n * Returns a new permission with the given condition\n * @param condition - The condition to add\n * @param permission - The permission on which we want to add the condition\n * @return\n */\nexport const addCondition = curry((condition: string, permission: Permission): Permission => {\n const { conditions } = permission;\n const newConditions = Array.isArray(conditions)\n ? uniq(conditions.concat(condition))\n : [condition];\n\n return set('conditions', newConditions, permission);\n});\n\n/**\n * Returns a new permission without the given condition\n * @param condition - The condition to remove\n * @param permission - The permission on which we want to remove the condition\n */\nexport const removeCondition = curry((condition: string, permission: Permission): Permission => {\n return set('conditions', remove(eq(condition), permission.conditions), permission);\n});\n\n/**\n * Gets a property or a part of a property from a permission.\n * @param property - The property to get\n * @param permission - The permission on which we want to access the property\n */\nexport const getProperty = curry(\n (property: string, permission: Permission): Permission =>\n get(`properties.${property}`, permission)\n);\n\n/**\n * Set a value for a given property on a new permission object\n * @param property - The name of the property\n * @param value - The value of the property\n * @param permission - The permission on which we want to set the property\n */\nexport const setProperty = (\n property: string,\n value: unknown,\n permission: Permission\n): Permission => {\n return set(`properties.${property}`, value, permission);\n};\n\n/**\n * Returns a new permission without the given property name set\n * @param property - The name of the property to delete\n * @param permission - The permission on which we want to remove the property\n */\nexport const deleteProperty = <TProperty extends string>(\n property: TProperty,\n permission: Permission\n) => omit(`properties.${property}`, permission) as Omit<Permission, TProperty>;\n\n/**\n * Creates a new {@link Permission} object from raw attributes. Set default values for certain fields\n * @param attributes\n */\nexport const create = (attributes: CreatePermissionPayload) => {\n return pipe(pick(permissionFields), merge(getDefaultPermission()))(attributes) as Permission;\n};\n\n/**\n * Using the given condition provider, check and remove invalid condition from the permission's condition array.\n * @param provider - The condition provider used to do the checks\n * @param permission - The condition to sanitize\n */\nexport const sanitizeConditions = curry(\n (provider: Provider, permission: Permission): Permission => {\n if (!isArray(permission.conditions)) {\n return permission;\n }\n\n return permission.conditions\n .filter((condition: string) => !provider.has(condition))\n .reduce(\n (perm: Permission, condition: string) => removeCondition(condition, perm),\n permission\n );\n }\n);\n\n/**\n * Transform raw attributes into valid permissions using the create domain function.\n * @param payload - Can either be a single object of attributes or an array of those objects.\n */\n\nfunction toPermission<T extends CreatePermissionPayload>(payload: T[]): Permission[];\nfunction toPermission<T extends CreatePermissionPayload>(payload: T): Permission;\nfunction toPermission<T extends CreatePermissionPayload>(\n payload: T[] | T\n): Permission[] | Permission {\n if (isArray(payload)) {\n return map((value) => create(value), payload);\n }\n\n return create(payload);\n}\n\nexport { toPermission };\n\nexport default {\n addCondition,\n removeCondition,\n create,\n deleteProperty,\n permissionFields,\n getProperty,\n sanitizedPermissionFields,\n sanitizeConditions,\n sanitizePermissionFields,\n setProperty,\n toPermission,\n};\n"],"names":["permissionFields","sanitizedPermissionFields","sanitizePermissionFields","pick","getDefaultPermission","actionParameters","conditions","properties","subject","addCondition","curry","condition","permission","newConditions","Array","isArray","uniq","concat","set","removeCondition","remove","eq","getProperty","property","get","setProperty","value","deleteProperty","omit","create","attributes","pipe","merge","sanitizeConditions","provider","filter","has","reduce","perm","toPermission","payload","map"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../server/src/domain/permission/index.ts"],"sourcesContent":["import type { Utils } from '@strapi/types';\n\nimport { providerFactory } from '@strapi/utils';\nimport {\n pipe,\n set,\n pick,\n eq,\n omit,\n remove,\n get,\n uniq,\n isArray,\n map,\n curry,\n merge,\n} from 'lodash/fp';\nimport { Permission } from '../../../../shared/contracts/shared';\nimport { SanitizedPermission } from '../../../../shared/contracts/roles';\n\nexport type CreatePermissionPayload = Utils.Object.PartialBy<\n Permission,\n 'actionParameters' | 'conditions' | 'properties' | 'subject' | 'id' | 'createdAt' | 'updatedAt'\n>;\n\ntype Provider = ReturnType<typeof providerFactory>;\n\nexport const permissionFields = [\n 'id',\n 'action',\n 'actionParameters',\n 'subject',\n 'properties',\n 'conditions',\n 'role',\n];\nexport const sanitizedPermissionFields = [\n 'id',\n 'action',\n 'actionParameters',\n 'subject',\n 'properties',\n 'conditions',\n] as const;\n\nexport const sanitizePermissionFields: (p: Permission) => SanitizedPermission =\n pick(sanitizedPermissionFields);\n\n/**\n * Creates a permission with default values\n */\nconst getDefaultPermission = () => ({\n actionParameters: {},\n conditions: [],\n properties: {},\n subject: null,\n});\n\n/**\n * Returns a new permission with the given condition\n * @param condition - The condition to add\n * @param permission - The permission on which we want to add the condition\n * @return\n */\nexport const addCondition = curry((condition: string, permission: Permission): Permission => {\n const { conditions } = permission;\n const newConditions = Array.isArray(conditions)\n ? uniq(conditions.concat(condition))\n : [condition];\n\n return set('conditions', newConditions, permission);\n});\n\n/**\n * Returns a new permission without the given condition\n * @param condition - The condition to remove\n * @param permission - The permission on which we want to remove the condition\n */\nexport const removeCondition = curry((condition: string, permission: Permission): Permission => {\n return set('conditions', remove(eq(condition), permission.conditions), permission);\n});\n\n/**\n * Gets a property or a part of a property from a permission.\n * @param property - The property to get\n * @param permission - The permission on which we want to access the property\n */\nexport const getProperty = curry(\n (property: string, permission: Permission): Permission =>\n get(`properties.${property}`, permission)\n);\n\n/**\n * Set a value for a given property on a new permission object\n * @param property - The name of the property\n * @param value - The value of the property\n * @param permission - The permission on which we want to set the property\n */\nexport const setProperty = (\n property: string,\n value: unknown,\n permission: Permission\n): Permission => {\n return set(`properties.${property}`, value, permission);\n};\n\n/**\n * Returns a new permission without the given property name set\n * @param property - The name of the property to delete\n * @param permission - The permission on which we want to remove the property\n */\nexport const deleteProperty = <TProperty extends string>(\n property: TProperty,\n permission: Permission\n) => omit(`properties.${property}`, permission) as Omit<Permission, TProperty>;\n\n/**\n * Creates a new {@link Permission} object from raw attributes. Set default values for certain fields\n * @param attributes\n */\nexport const create = (attributes: CreatePermissionPayload) => {\n return pipe(pick(permissionFields), merge(getDefaultPermission()))(attributes) as Permission;\n};\n\n/**\n * Using the given condition provider, check and remove invalid condition from the permission's condition array.\n * @param provider - The condition provider used to do the checks\n * @param permission - The condition to sanitize\n */\nexport const sanitizeConditions = curry(\n (provider: Provider, permission: Permission): Permission => {\n if (!isArray(permission.conditions)) {\n return permission;\n }\n\n return permission.conditions\n .filter((condition: string) => !provider.has(condition))\n .reduce(\n (perm: Permission, condition: string) => removeCondition(condition, perm),\n permission\n );\n }\n);\n\n/**\n * Transform raw attributes into valid permissions using the create domain function.\n * @param payload - Can either be a single object of attributes or an array of those objects.\n */\n\nfunction toPermission<T extends CreatePermissionPayload>(payload: T[]): Permission[];\nfunction toPermission<T extends CreatePermissionPayload>(payload: T): Permission;\nfunction toPermission<T extends CreatePermissionPayload>(\n payload: T[] | T\n): Permission[] | Permission {\n if (isArray(payload)) {\n return map((value) => create(value), payload);\n }\n\n return create(payload);\n}\n\nexport { toPermission };\n\nexport default {\n addCondition,\n removeCondition,\n create,\n deleteProperty,\n permissionFields,\n getProperty,\n sanitizedPermissionFields,\n sanitizeConditions,\n sanitizePermissionFields,\n setProperty,\n toPermission,\n};\n"],"names":["permissionFields","sanitizedPermissionFields","sanitizePermissionFields","pick","getDefaultPermission","actionParameters","conditions","properties","subject","addCondition","curry","condition","permission","newConditions","Array","isArray","uniq","concat","set","removeCondition","remove","eq","getProperty","property","get","setProperty","value","deleteProperty","omit","create","attributes","pipe","merge","sanitizeConditions","provider","filter","has","reduce","perm","toPermission","payload","map"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../server/src/domain/permission/index.ts"],"sourcesContent":["import type { Utils } from '@strapi/types';\n\nimport { providerFactory } from '@strapi/utils';\nimport {\n pipe,\n set,\n pick,\n eq,\n omit,\n remove,\n get,\n uniq,\n isArray,\n map,\n curry,\n merge,\n} from 'lodash/fp';\nimport { Permission } from '../../../../shared/contracts/shared';\nimport { SanitizedPermission } from '../../../../shared/contracts/roles';\n\nexport type CreatePermissionPayload = Utils.Object.PartialBy<\n Permission,\n 'actionParameters' | 'conditions' | 'properties' | 'subject' | 'id' | 'createdAt' | 'updatedAt'\n>;\n\ntype Provider = ReturnType<typeof providerFactory>;\n\nexport const permissionFields = [\n 'id',\n 'action',\n 'actionParameters',\n 'subject',\n 'properties',\n 'conditions',\n 'role',\n];\nexport const sanitizedPermissionFields = [\n 'id',\n 'action',\n 'actionParameters',\n 'subject',\n 'properties',\n 'conditions',\n] as const;\n\nexport const sanitizePermissionFields: (p: Permission) => SanitizedPermission =\n pick(sanitizedPermissionFields);\n\n/**\n * Creates a permission with default values\n */\nconst getDefaultPermission = () => ({\n actionParameters: {},\n conditions: [],\n properties: {},\n subject: null,\n});\n\n/**\n * Returns a new permission with the given condition\n * @param condition - The condition to add\n * @param permission - The permission on which we want to add the condition\n * @return\n */\nexport const addCondition = curry((condition: string, permission: Permission): Permission => {\n const { conditions } = permission;\n const newConditions = Array.isArray(conditions)\n ? uniq(conditions.concat(condition))\n : [condition];\n\n return set('conditions', newConditions, permission);\n});\n\n/**\n * Returns a new permission without the given condition\n * @param condition - The condition to remove\n * @param permission - The permission on which we want to remove the condition\n */\nexport const removeCondition = curry((condition: string, permission: Permission): Permission => {\n return set('conditions', remove(eq(condition), permission.conditions), permission);\n});\n\n/**\n * Gets a property or a part of a property from a permission.\n * @param property - The property to get\n * @param permission - The permission on which we want to access the property\n */\nexport const getProperty = curry(\n (property: string, permission: Permission): Permission =>\n get(`properties.${property}`, permission)\n);\n\n/**\n * Set a value for a given property on a new permission object\n * @param property - The name of the property\n * @param value - The value of the property\n * @param permission - The permission on which we want to set the property\n */\nexport const setProperty = (\n property: string,\n value: unknown,\n permission: Permission\n): Permission => {\n return set(`properties.${property}`, value, permission);\n};\n\n/**\n * Returns a new permission without the given property name set\n * @param property - The name of the property to delete\n * @param permission - The permission on which we want to remove the property\n */\nexport const deleteProperty = <TProperty extends string>(\n property: TProperty,\n permission: Permission\n) => omit(`properties.${property}`, permission) as Omit<Permission, TProperty>;\n\n/**\n * Creates a new {@link Permission} object from raw attributes. Set default values for certain fields\n * @param attributes\n */\nexport const create = (attributes: CreatePermissionPayload) => {\n return pipe(pick(permissionFields), merge(getDefaultPermission()))(attributes) as Permission;\n};\n\n/**\n * Using the given condition provider, check and remove invalid condition from the permission's condition array.\n * @param provider - The condition provider used to do the checks\n * @param permission - The condition to sanitize\n */\nexport const sanitizeConditions = curry(\n (provider: Provider, permission: Permission): Permission => {\n if (!isArray(permission.conditions)) {\n return permission;\n }\n\n return permission.conditions\n .filter((condition: string) => !provider.has(condition))\n .reduce(\n (perm: Permission, condition: string) => removeCondition(condition, perm),\n permission\n );\n }\n);\n\n/**\n * Transform raw attributes into valid permissions using the create domain function.\n * @param payload - Can either be a single object of attributes or an array of those objects.\n */\n\nfunction toPermission<T extends CreatePermissionPayload>(payload: T[]): Permission[];\nfunction toPermission<T extends CreatePermissionPayload>(payload: T): Permission;\nfunction toPermission<T extends CreatePermissionPayload>(\n payload: T[] | T\n): Permission[] | Permission {\n if (isArray(payload)) {\n return map((value) => create(value), payload);\n }\n\n return create(payload);\n}\n\nexport { toPermission };\n\nexport default {\n addCondition,\n removeCondition,\n create,\n deleteProperty,\n permissionFields,\n getProperty,\n sanitizedPermissionFields,\n sanitizeConditions,\n sanitizePermissionFields,\n setProperty,\n toPermission,\n};\n"],"names":["permissionFields","sanitizedPermissionFields","sanitizePermissionFields","pick","getDefaultPermission","actionParameters","conditions","properties","subject","addCondition","curry","condition","permission","newConditions","Array","isArray","uniq","concat","set","removeCondition","remove","eq","getProperty","property","get","setProperty","value","deleteProperty","omit","create","attributes","pipe","merge","sanitizeConditions","provider","filter","has","reduce","perm","toPermission","payload","map"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../server/src/domain/permission/index.ts"],"sourcesContent":["import type { Utils } from '@strapi/types';\n\nimport { providerFactory } from '@strapi/utils';\nimport {\n pipe,\n set,\n pick,\n eq,\n omit,\n remove,\n get,\n uniq,\n isArray,\n map,\n curry,\n merge,\n} from 'lodash/fp';\nimport { Permission } from '../../../../shared/contracts/shared';\nimport { SanitizedPermission } from '../../../../shared/contracts/roles';\n\nexport type CreatePermissionPayload = Utils.Object.PartialBy<\n Permission,\n 'actionParameters' | 'conditions' | 'properties' | 'subject' | 'id' | 'createdAt' | 'updatedAt'\n>;\n\ntype Provider = ReturnType<typeof providerFactory>;\n\nexport const permissionFields = [\n 'id',\n 'action',\n 'actionParameters',\n 'subject',\n 'properties',\n 'conditions',\n 'role',\n];\nexport const sanitizedPermissionFields = [\n 'id',\n 'action',\n 'actionParameters',\n 'subject',\n 'properties',\n 'conditions',\n] as const;\n\nexport const sanitizePermissionFields: (p: Permission) => SanitizedPermission =\n pick(sanitizedPermissionFields);\n\n/**\n * Creates a permission with default values\n */\nconst getDefaultPermission = () => ({\n actionParameters: {},\n conditions: [],\n properties: {},\n subject: null,\n});\n\n/**\n * Returns a new permission with the given condition\n * @param condition - The condition to add\n * @param permission - The permission on which we want to add the condition\n * @return\n */\nexport const addCondition = curry((condition: string, permission: Permission): Permission => {\n const { conditions } = permission;\n const newConditions = Array.isArray(conditions)\n ? uniq(conditions.concat(condition))\n : [condition];\n\n return set('conditions', newConditions, permission);\n});\n\n/**\n * Returns a new permission without the given condition\n * @param condition - The condition to remove\n * @param permission - The permission on which we want to remove the condition\n */\nexport const removeCondition = curry((condition: string, permission: Permission): Permission => {\n return set('conditions', remove(eq(condition), permission.conditions), permission);\n});\n\n/**\n * Gets a property or a part of a property from a permission.\n * @param property - The property to get\n * @param permission - The permission on which we want to access the property\n */\nexport const getProperty = curry(\n (property: string, permission: Permission): Permission =>\n get(`properties.${property}`, permission)\n);\n\n/**\n * Set a value for a given property on a new permission object\n * @param property - The name of the property\n * @param value - The value of the property\n * @param permission - The permission on which we want to set the property\n */\nexport const setProperty = (\n property: string,\n value: unknown,\n permission: Permission\n): Permission => {\n return set(`properties.${property}`, value, permission);\n};\n\n/**\n * Returns a new permission without the given property name set\n * @param property - The name of the property to delete\n * @param permission - The permission on which we want to remove the property\n */\nexport const deleteProperty = <TProperty extends string>(\n property: TProperty,\n permission: Permission\n) => omit(`properties.${property}`, permission) as Omit<Permission, TProperty>;\n\n/**\n * Creates a new {@link Permission} object from raw attributes. Set default values for certain fields\n * @param attributes\n */\nexport const create = (attributes: CreatePermissionPayload) => {\n return pipe(pick(permissionFields), merge(getDefaultPermission()))(attributes) as Permission;\n};\n\n/**\n * Using the given condition provider, check and remove invalid condition from the permission's condition array.\n * @param provider - The condition provider used to do the checks\n * @param permission - The condition to sanitize\n */\nexport const sanitizeConditions = curry(\n (provider: Provider, permission: Permission): Permission => {\n if (!isArray(permission.conditions)) {\n return permission;\n }\n\n return permission.conditions\n .filter((condition: string) => !provider.has(condition))\n .reduce(\n (perm: Permission, condition: string) => removeCondition(condition, perm),\n permission\n );\n }\n);\n\n/**\n * Transform raw attributes into valid permissions using the create domain function.\n * @param payload - Can either be a single object of attributes or an array of those objects.\n */\n\nfunction toPermission<T extends CreatePermissionPayload>(payload: T[]): Permission[];\nfunction toPermission<T extends CreatePermissionPayload>(payload: T): Permission;\nfunction toPermission<T extends CreatePermissionPayload>(\n payload: T[] | T\n): Permission[] | Permission {\n if (isArray(payload)) {\n return map((value) => create(value), payload);\n }\n\n return create(payload);\n}\n\nexport { toPermission };\n\nexport default {\n addCondition,\n removeCondition,\n create,\n deleteProperty,\n permissionFields,\n getProperty,\n sanitizedPermissionFields,\n sanitizeConditions,\n sanitizePermissionFields,\n setProperty,\n toPermission,\n};\n"],"names":["permissionFields","sanitizedPermissionFields","sanitizePermissionFields","pick","getDefaultPermission","actionParameters","conditions","properties","subject","addCondition","curry","condition","permission","newConditions","Array","isArray","uniq","concat","set","removeCondition","remove","eq","getProperty","property","get","setProperty","value","deleteProperty","omit","create","attributes","pipe","merge","sanitizeConditions","provider","filter","has","reduce","perm","toPermission","payload","map"],"mappings":";;MA2BaA,gBAAmB,GAAA;AAC9B,IAAA,IAAA;AACA,IAAA,QAAA;AACA,IAAA,kBAAA;AACA,IAAA,SAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA;;MAEWC,yBAA4B,GAAA;AACvC,IAAA,IAAA;AACA,IAAA,QAAA;AACA,IAAA,kBAAA;AACA,IAAA,SAAA;AACA,IAAA,YAAA;AACA,IAAA;;AAGK,MAAMC,wBACXC,GAAAA,IAAAA,CAAKF,yBAA2B;AAElC;;IAGA,MAAMG,oBAAuB,GAAA,KAAO;AAClCC,QAAAA,gBAAAA,EAAkB,EAAC;AACnBC,QAAAA,UAAAA,EAAY,EAAE;AACdC,QAAAA,UAAAA,EAAY,EAAC;QACbC,OAAS,EAAA;KACX,CAAA;AAEA;;;;;AAKC,IACM,MAAMC,YAAeC,GAAAA,KAAAA,CAAM,CAACC,SAAmBC,EAAAA,UAAAA,GAAAA;IACpD,MAAM,EAAEN,UAAU,EAAE,GAAGM,UAAAA;IACvB,MAAMC,aAAAA,GAAgBC,MAAMC,OAAO,CAACT,cAChCU,IAAKV,CAAAA,UAAAA,CAAWW,MAAM,CAACN,SACvB,CAAA,CAAA,GAAA;AAACA,QAAAA;AAAU,KAAA;IAEf,OAAOO,GAAAA,CAAI,cAAcL,aAAeD,EAAAA,UAAAA,CAAAA;AAC1C,CAAG;AAEH;;;;AAIC,IACM,MAAMO,eAAkBT,GAAAA,KAAAA,CAAM,CAACC,SAAmBC,EAAAA,UAAAA,GAAAA;AACvD,IAAA,OAAOM,IAAI,YAAcE,EAAAA,MAAAA,CAAOC,GAAGV,SAAYC,CAAAA,EAAAA,UAAAA,CAAWN,UAAU,CAAGM,EAAAA,UAAAA,CAAAA;AACzE,CAAG;AAEH;;;;AAIC,IACM,MAAMU,WAAcZ,GAAAA,KAAAA,CACzB,CAACa,QAAAA,EAAkBX,UACjBY,GAAAA,GAAAA,CAAI,CAAC,WAAW,EAAED,QAAAA,CAAAA,CAAU,EAAEX,UAChC,CAAA;AAEF;;;;;AAKC,IACM,MAAMa,WAAc,GAAA,CACzBF,UACAG,KACAd,EAAAA,UAAAA,GAAAA;AAEA,IAAA,OAAOM,IAAI,CAAC,WAAW,EAAEK,QAAAA,CAAAA,CAAU,EAAEG,KAAOd,EAAAA,UAAAA,CAAAA;AAC9C;AAEA;;;;AAIC,IACM,MAAMe,cAAiB,GAAA,CAC5BJ,QACAX,EAAAA,UAAAA,GACGgB,IAAK,CAAA,CAAC,WAAW,EAAEL,QAAU,CAAA,CAAA,EAAEX,UAA2C;AAE/E;;;IAIaiB,MAAAA,MAAAA,GAAS,CAACC,UAAAA,GAAAA;AACrB,IAAA,OAAOC,IAAK5B,CAAAA,IAAAA,CAAKH,gBAAmBgC,CAAAA,EAAAA,KAAAA,CAAM5B,oBAAyB0B,EAAAA,CAAAA,CAAAA,CAAAA,UAAAA,CAAAA;AACrE;AAEA;;;;AAIC,IACM,MAAMG,kBAAqBvB,GAAAA,KAAAA,CAChC,CAACwB,QAAoBtB,EAAAA,UAAAA,GAAAA;AACnB,IAAA,IAAI,CAACG,OAAAA,CAAQH,UAAWN,CAAAA,UAAU,CAAG,EAAA;QACnC,OAAOM,UAAAA;AACT;AAEA,IAAA,OAAOA,WAAWN,UAAU,CACzB6B,MAAM,CAAC,CAACxB,YAAsB,CAACuB,QAAAA,CAASE,GAAG,CAACzB,SAAAA,CAAAA,CAAAA,CAC5C0B,MAAM,CACL,CAACC,MAAkB3B,SAAsBQ,GAAAA,eAAAA,CAAgBR,WAAW2B,IACpE1B,CAAAA,EAAAA,UAAAA,CAAAA;AAEN,CACA;AASF,SAAS2B,aACPC,OAAgB,EAAA;AAEhB,IAAA,IAAIzB,QAAQyB,OAAU,CAAA,EAAA;AACpB,QAAA,OAAOC,GAAI,CAAA,CAACf,KAAUG,GAAAA,MAAAA,CAAOH,KAAQc,CAAAA,EAAAA,OAAAA,CAAAA;AACvC;AAEA,IAAA,OAAOX,MAAOW,CAAAA,OAAAA,CAAAA;AAChB;AAIA,uBAAe;AACb/B,IAAAA,YAAAA;AACAU,IAAAA,eAAAA;AACAU,IAAAA,MAAAA;AACAF,IAAAA,cAAAA;AACA3B,IAAAA,gBAAAA;AACAsB,IAAAA,WAAAA;AACArB,IAAAA,yBAAAA;AACAgC,IAAAA,kBAAAA;AACA/B,IAAAA,wBAAAA;AACAuB,IAAAA,WAAAA;AACAc,IAAAA;AACF,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimit.js","sources":["../../../../../server/src/middlewares/rateLimit.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport path from 'path';\nimport utils from '@strapi/utils';\nimport { isString, has, toLower, get } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\nconst { RateLimitError } = utils.errors;\n\nexport default (config: any, { strapi }: { strapi: Core.Strapi }) =>\n async (ctx: Context, next: Next) => {\n let rateLimitConfig = strapi.config.get('admin.rateLimit') as any;\n\n if (!rateLimitConfig) {\n rateLimitConfig = {\n enabled: true,\n };\n }\n\n if (!has('enabled', rateLimitConfig)) {\n rateLimitConfig.enabled = true;\n }\n\n if (rateLimitConfig.enabled === true) {\n // TODO: TS - Do the dynamic import\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const rateLimit = require('koa2-ratelimit').RateLimit;\n\n const requestEmail = get('request.body.email')(ctx);\n const userEmail = isString(requestEmail) ? requestEmail.toLowerCase() : 'unknownEmail';\n\n const requestPath = isString(ctx.request.path)\n ? toLower(path.normalize(ctx.request.path)).replace(/\\/$/, '')\n : 'invalidPath';\n\n const loadConfig = {\n interval: { min: 5 },\n max: 5,\n prefixKey: `${userEmail}:${requestPath}:${ctx.request.ip}`,\n handler() {\n throw new RateLimitError();\n },\n ...rateLimitConfig,\n ...config,\n };\n\n return rateLimit.middleware(loadConfig)(ctx, next);\n }\n\n return next();\n };\n"],"names":["RateLimitError","utils","errors","config","strapi","ctx","next","rateLimitConfig","get","enabled","has","rateLimit","require","RateLimit","requestEmail","userEmail","isString","toLowerCase","requestPath","request","path","toLower","normalize","replace","loadConfig","interval","min","max","prefixKey","ip","handler","middleware"],"mappings":";;;;;;AAMA,MAAM,EAAEA,cAAc,EAAE,GAAGC,MAAMC,MAAM;AAEvC,gBAAe,CAAA,CAACC,MAAa,EAAA,EAAEC,MAAM,EAA2B,GAC9D,OAAOC,GAAcC,EAAAA,IAAAA,GAAAA;AACnB,QAAA,IAAIC,eAAkBH,GAAAA,MAAAA,CAAOD,MAAM,CAACK,GAAG,CAAC,iBAAA,CAAA;AAExC,QAAA,IAAI,CAACD,eAAiB,EAAA;YACpBA,eAAkB,GAAA;gBAChBE,OAAS,EAAA;AACX,aAAA;AACF;QAEA,IAAI,CAACC,MAAI,CAAA,SAAA,EAAWH,eAAkB,CAAA,EAAA;AACpCA,YAAAA,eAAAA,CAAgBE,OAAO,GAAG,IAAA;AAC5B;QAEA,IAAIF,eAAAA,CAAgBE,OAAO,KAAK,IAAM,EAAA;;;YAGpC,MAAME,SAAAA,GAAYC,OAAQ,CAAA,gBAAA,CAAA,CAAkBC,SAAS;YAErD,MAAMC,YAAAA,GAAeN,OAAI,oBAAsBH,CAAAA,CAAAA,GAAAA,CAAAA;AAC/C,YAAA,MAAMU,SAAYC,GAAAA,WAAAA,CAASF,YAAgBA,CAAAA,GAAAA,YAAAA,CAAaG,WAAW,EAAK,GAAA,cAAA;AAExE,YAAA,MAAMC,cAAcF,WAASX,CAAAA,GAAAA,CAAIc,OAAO,CAACC,IAAI,IACzCC,UAAQD,CAAAA,IAAAA,CAAKE,SAAS,CAACjB,GAAAA,CAAIc,OAAO,CAACC,IAAI,GAAGG,OAAO,CAAC,OAAO,EACzD,CAAA,GAAA,aAAA;AAEJ,YAAA,MAAMC,UAAa,GAAA;gBACjBC,QAAU,EAAA;oBAAEC,GAAK,EAAA;AAAE,iBAAA;gBACnBC,GAAK,EAAA,CAAA;AACLC,gBAAAA,SAAAA,EAAW,CAAC,EAAEb,SAAU,CAAA,CAAC,EAAEG,WAAAA,CAAY,CAAC,EAAEb,GAAIc,CAAAA,OAAO,CAACU,EAAE,CAAC,CAAC;AAC1DC,gBAAAA,OAAAA,CAAAA,GAAAA;AACE,oBAAA,MAAM,IAAI9B,cAAAA,EAAAA;AACZ,iBAAA;AACA,gBAAA,GAAGO,eAAe;AAClB,gBAAA,GAAGJ;AACL,aAAA;AAEA,YAAA,OAAOQ,SAAUoB,CAAAA,UAAU,CAACP,UAAAA,CAAAA,CAAYnB,GAAKC,EAAAA,IAAAA,CAAAA;AAC/C;QAEA,OAAOA,IAAAA,EAAAA;AACT,KAAA;;;;"}
1
+ {"version":3,"file":"rateLimit.js","sources":["../../../../../server/src/middlewares/rateLimit.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport path from 'path';\nimport utils from '@strapi/utils';\nimport { isString, has, toLower, get } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\nconst { RateLimitError } = utils.errors;\n\nexport default (config: any, { strapi }: { strapi: Core.Strapi }) =>\n async (ctx: Context, next: Next) => {\n let rateLimitConfig = strapi.config.get('admin.rateLimit') as any;\n\n if (!rateLimitConfig) {\n rateLimitConfig = {\n enabled: true,\n };\n }\n\n if (!has('enabled', rateLimitConfig)) {\n rateLimitConfig.enabled = true;\n }\n\n if (rateLimitConfig.enabled === true) {\n // TODO: TS - Do the dynamic import\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const rateLimit = require('koa2-ratelimit').RateLimit;\n\n const requestEmail = get('request.body.email')(ctx);\n const userEmail = isString(requestEmail) ? requestEmail.toLowerCase() : 'unknownEmail';\n\n const requestPath = isString(ctx.request.path)\n ? toLower(path.normalize(ctx.request.path)).replace(/\\/$/, '')\n : 'invalidPath';\n\n const loadConfig = {\n interval: { min: 5 },\n max: 5,\n prefixKey: `${userEmail}:${requestPath}:${ctx.request.ip}`,\n handler() {\n throw new RateLimitError();\n },\n ...rateLimitConfig,\n ...config,\n };\n\n return rateLimit.middleware(loadConfig)(ctx, next);\n }\n\n return next();\n };\n"],"names":["RateLimitError","utils","errors","config","strapi","ctx","next","rateLimitConfig","get","enabled","has","rateLimit","require","RateLimit","requestEmail","userEmail","isString","toLowerCase","requestPath","request","path","toLower","normalize","replace","loadConfig","interval","min","max","prefixKey","ip","handler","middleware"],"mappings":";;;;;;AAMA,MAAM,EAAEA,cAAc,EAAE,GAAGC,MAAMC,MAAM;AAEvC,gBAAe,CAAA,CAACC,MAAa,EAAA,EAAEC,MAAM,EAA2B,GAC9D,OAAOC,GAAcC,EAAAA,IAAAA,GAAAA;AACnB,QAAA,IAAIC,eAAkBH,GAAAA,MAAAA,CAAOD,MAAM,CAACK,GAAG,CAAC,iBAAA,CAAA;AAExC,QAAA,IAAI,CAACD,eAAiB,EAAA;YACpBA,eAAkB,GAAA;gBAChBE,OAAS,EAAA;AACX,aAAA;AACF;QAEA,IAAI,CAACC,MAAI,CAAA,SAAA,EAAWH,eAAkB,CAAA,EAAA;AACpCA,YAAAA,eAAAA,CAAgBE,OAAO,GAAG,IAAA;AAC5B;QAEA,IAAIF,eAAAA,CAAgBE,OAAO,KAAK,IAAM,EAAA;;;YAGpC,MAAME,SAAAA,GAAYC,OAAQ,CAAA,gBAAA,CAAA,CAAkBC,SAAS;YAErD,MAAMC,YAAAA,GAAeN,OAAI,oBAAsBH,CAAAA,CAAAA,GAAAA,CAAAA;AAC/C,YAAA,MAAMU,SAAYC,GAAAA,WAAAA,CAASF,YAAgBA,CAAAA,GAAAA,YAAAA,CAAaG,WAAW,EAAK,GAAA,cAAA;AAExE,YAAA,MAAMC,cAAcF,WAASX,CAAAA,GAAAA,CAAIc,OAAO,CAACC,IAAI,IACzCC,UAAQD,CAAAA,IAAAA,CAAKE,SAAS,CAACjB,GAAAA,CAAIc,OAAO,CAACC,IAAI,GAAGG,OAAO,CAAC,OAAO,EACzD,CAAA,GAAA,aAAA;AAEJ,YAAA,MAAMC,UAAa,GAAA;gBACjBC,QAAU,EAAA;oBAAEC,GAAK,EAAA;AAAE,iBAAA;gBACnBC,GAAK,EAAA,CAAA;gBACLC,SAAW,EAAA,CAAA,EAAGb,SAAU,CAAA,CAAC,EAAEG,WAAAA,CAAY,CAAC,EAAEb,GAAIc,CAAAA,OAAO,CAACU,EAAE,CAAE,CAAA;AAC1DC,gBAAAA,OAAAA,CAAAA,GAAAA;AACE,oBAAA,MAAM,IAAI9B,cAAAA,EAAAA;AACZ,iBAAA;AACA,gBAAA,GAAGO,eAAe;AAClB,gBAAA,GAAGJ;AACL,aAAA;AAEA,YAAA,OAAOQ,SAAUoB,CAAAA,UAAU,CAACP,UAAAA,CAAAA,CAAYnB,GAAKC,EAAAA,IAAAA,CAAAA;AAC/C;QAEA,OAAOA,IAAAA,EAAAA;AACT,KAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimit.mjs","sources":["../../../../../server/src/middlewares/rateLimit.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport path from 'path';\nimport utils from '@strapi/utils';\nimport { isString, has, toLower, get } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\nconst { RateLimitError } = utils.errors;\n\nexport default (config: any, { strapi }: { strapi: Core.Strapi }) =>\n async (ctx: Context, next: Next) => {\n let rateLimitConfig = strapi.config.get('admin.rateLimit') as any;\n\n if (!rateLimitConfig) {\n rateLimitConfig = {\n enabled: true,\n };\n }\n\n if (!has('enabled', rateLimitConfig)) {\n rateLimitConfig.enabled = true;\n }\n\n if (rateLimitConfig.enabled === true) {\n // TODO: TS - Do the dynamic import\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const rateLimit = require('koa2-ratelimit').RateLimit;\n\n const requestEmail = get('request.body.email')(ctx);\n const userEmail = isString(requestEmail) ? requestEmail.toLowerCase() : 'unknownEmail';\n\n const requestPath = isString(ctx.request.path)\n ? toLower(path.normalize(ctx.request.path)).replace(/\\/$/, '')\n : 'invalidPath';\n\n const loadConfig = {\n interval: { min: 5 },\n max: 5,\n prefixKey: `${userEmail}:${requestPath}:${ctx.request.ip}`,\n handler() {\n throw new RateLimitError();\n },\n ...rateLimitConfig,\n ...config,\n };\n\n return rateLimit.middleware(loadConfig)(ctx, next);\n }\n\n return next();\n };\n"],"names":["RateLimitError","utils","errors","config","strapi","ctx","next","rateLimitConfig","get","enabled","has","rateLimit","require","RateLimit","requestEmail","userEmail","isString","toLowerCase","requestPath","request","path","toLower","normalize","replace","loadConfig","interval","min","max","prefixKey","ip","handler","middleware"],"mappings":";;;;AAMA,MAAM,EAAEA,cAAc,EAAE,GAAGC,MAAMC,MAAM;AAEvC,gBAAe,CAAA,CAACC,MAAa,EAAA,EAAEC,MAAM,EAA2B,GAC9D,OAAOC,GAAcC,EAAAA,IAAAA,GAAAA;AACnB,QAAA,IAAIC,eAAkBH,GAAAA,MAAAA,CAAOD,MAAM,CAACK,GAAG,CAAC,iBAAA,CAAA;AAExC,QAAA,IAAI,CAACD,eAAiB,EAAA;YACpBA,eAAkB,GAAA;gBAChBE,OAAS,EAAA;AACX,aAAA;AACF;QAEA,IAAI,CAACC,GAAI,CAAA,SAAA,EAAWH,eAAkB,CAAA,EAAA;AACpCA,YAAAA,eAAAA,CAAgBE,OAAO,GAAG,IAAA;AAC5B;QAEA,IAAIF,eAAAA,CAAgBE,OAAO,KAAK,IAAM,EAAA;;;YAGpC,MAAME,SAAAA,GAAYC,OAAQ,CAAA,gBAAA,CAAA,CAAkBC,SAAS;YAErD,MAAMC,YAAAA,GAAeN,IAAI,oBAAsBH,CAAAA,CAAAA,GAAAA,CAAAA;AAC/C,YAAA,MAAMU,SAAYC,GAAAA,QAAAA,CAASF,YAAgBA,CAAAA,GAAAA,YAAAA,CAAaG,WAAW,EAAK,GAAA,cAAA;AAExE,YAAA,MAAMC,cAAcF,QAASX,CAAAA,GAAAA,CAAIc,OAAO,CAACC,IAAI,IACzCC,OAAQD,CAAAA,IAAAA,CAAKE,SAAS,CAACjB,GAAAA,CAAIc,OAAO,CAACC,IAAI,GAAGG,OAAO,CAAC,OAAO,EACzD,CAAA,GAAA,aAAA;AAEJ,YAAA,MAAMC,UAAa,GAAA;gBACjBC,QAAU,EAAA;oBAAEC,GAAK,EAAA;AAAE,iBAAA;gBACnBC,GAAK,EAAA,CAAA;AACLC,gBAAAA,SAAAA,EAAW,CAAC,EAAEb,SAAU,CAAA,CAAC,EAAEG,WAAAA,CAAY,CAAC,EAAEb,GAAIc,CAAAA,OAAO,CAACU,EAAE,CAAC,CAAC;AAC1DC,gBAAAA,OAAAA,CAAAA,GAAAA;AACE,oBAAA,MAAM,IAAI9B,cAAAA,EAAAA;AACZ,iBAAA;AACA,gBAAA,GAAGO,eAAe;AAClB,gBAAA,GAAGJ;AACL,aAAA;AAEA,YAAA,OAAOQ,SAAUoB,CAAAA,UAAU,CAACP,UAAAA,CAAAA,CAAYnB,GAAKC,EAAAA,IAAAA,CAAAA;AAC/C;QAEA,OAAOA,IAAAA,EAAAA;AACT,KAAA;;;;"}
1
+ {"version":3,"file":"rateLimit.mjs","sources":["../../../../../server/src/middlewares/rateLimit.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport path from 'path';\nimport utils from '@strapi/utils';\nimport { isString, has, toLower, get } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\nconst { RateLimitError } = utils.errors;\n\nexport default (config: any, { strapi }: { strapi: Core.Strapi }) =>\n async (ctx: Context, next: Next) => {\n let rateLimitConfig = strapi.config.get('admin.rateLimit') as any;\n\n if (!rateLimitConfig) {\n rateLimitConfig = {\n enabled: true,\n };\n }\n\n if (!has('enabled', rateLimitConfig)) {\n rateLimitConfig.enabled = true;\n }\n\n if (rateLimitConfig.enabled === true) {\n // TODO: TS - Do the dynamic import\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const rateLimit = require('koa2-ratelimit').RateLimit;\n\n const requestEmail = get('request.body.email')(ctx);\n const userEmail = isString(requestEmail) ? requestEmail.toLowerCase() : 'unknownEmail';\n\n const requestPath = isString(ctx.request.path)\n ? toLower(path.normalize(ctx.request.path)).replace(/\\/$/, '')\n : 'invalidPath';\n\n const loadConfig = {\n interval: { min: 5 },\n max: 5,\n prefixKey: `${userEmail}:${requestPath}:${ctx.request.ip}`,\n handler() {\n throw new RateLimitError();\n },\n ...rateLimitConfig,\n ...config,\n };\n\n return rateLimit.middleware(loadConfig)(ctx, next);\n }\n\n return next();\n };\n"],"names":["RateLimitError","utils","errors","config","strapi","ctx","next","rateLimitConfig","get","enabled","has","rateLimit","require","RateLimit","requestEmail","userEmail","isString","toLowerCase","requestPath","request","path","toLower","normalize","replace","loadConfig","interval","min","max","prefixKey","ip","handler","middleware"],"mappings":";;;;AAMA,MAAM,EAAEA,cAAc,EAAE,GAAGC,MAAMC,MAAM;AAEvC,gBAAe,CAAA,CAACC,MAAa,EAAA,EAAEC,MAAM,EAA2B,GAC9D,OAAOC,GAAcC,EAAAA,IAAAA,GAAAA;AACnB,QAAA,IAAIC,eAAkBH,GAAAA,MAAAA,CAAOD,MAAM,CAACK,GAAG,CAAC,iBAAA,CAAA;AAExC,QAAA,IAAI,CAACD,eAAiB,EAAA;YACpBA,eAAkB,GAAA;gBAChBE,OAAS,EAAA;AACX,aAAA;AACF;QAEA,IAAI,CAACC,GAAI,CAAA,SAAA,EAAWH,eAAkB,CAAA,EAAA;AACpCA,YAAAA,eAAAA,CAAgBE,OAAO,GAAG,IAAA;AAC5B;QAEA,IAAIF,eAAAA,CAAgBE,OAAO,KAAK,IAAM,EAAA;;;YAGpC,MAAME,SAAAA,GAAYC,OAAQ,CAAA,gBAAA,CAAA,CAAkBC,SAAS;YAErD,MAAMC,YAAAA,GAAeN,IAAI,oBAAsBH,CAAAA,CAAAA,GAAAA,CAAAA;AAC/C,YAAA,MAAMU,SAAYC,GAAAA,QAAAA,CAASF,YAAgBA,CAAAA,GAAAA,YAAAA,CAAaG,WAAW,EAAK,GAAA,cAAA;AAExE,YAAA,MAAMC,cAAcF,QAASX,CAAAA,GAAAA,CAAIc,OAAO,CAACC,IAAI,IACzCC,OAAQD,CAAAA,IAAAA,CAAKE,SAAS,CAACjB,GAAAA,CAAIc,OAAO,CAACC,IAAI,GAAGG,OAAO,CAAC,OAAO,EACzD,CAAA,GAAA,aAAA;AAEJ,YAAA,MAAMC,UAAa,GAAA;gBACjBC,QAAU,EAAA;oBAAEC,GAAK,EAAA;AAAE,iBAAA;gBACnBC,GAAK,EAAA,CAAA;gBACLC,SAAW,EAAA,CAAA,EAAGb,SAAU,CAAA,CAAC,EAAEG,WAAAA,CAAY,CAAC,EAAEb,GAAIc,CAAAA,OAAO,CAACU,EAAE,CAAE,CAAA;AAC1DC,gBAAAA,OAAAA,CAAAA,GAAAA;AACE,oBAAA,MAAM,IAAI9B,cAAAA,EAAAA;AACZ,iBAAA;AACA,gBAAA,GAAGO,eAAe;AAClB,gBAAA,GAAGJ;AACL,aAAA;AAEA,YAAA,OAAOQ,SAAUoB,CAAAA,UAAU,CAACP,UAAAA,CAAAA,CAAYnB,GAAKC,EAAAA,IAAAA,CAAAA;AAC/C;QAEA,OAAOA,IAAAA,EAAAA;AACT,KAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"serve-admin-panel.js","sources":["../../../../../server/src/routes/serve-admin-panel.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport { resolve, join, extname, basename } from 'path';\nimport fse from 'fs-extra';\nimport koaStatic from 'koa-static';\nimport type { Core } from '@strapi/types';\n\nconst registerAdminPanelRoute = ({ strapi }: { strapi: Core.Strapi }) => {\n let buildDir = resolve(strapi.dirs.dist.root, 'build');\n\n if (!fse.pathExistsSync(buildDir)) {\n buildDir = resolve(__dirname, '../../build');\n }\n\n const serveAdminMiddleware = async (ctx: Context, next: Next) => {\n await next();\n\n if (ctx.method !== 'HEAD' && ctx.method !== 'GET') {\n return;\n }\n\n if (ctx.body != null || ctx.status !== 404) {\n return;\n }\n\n ctx.type = 'html';\n ctx.body = fse.createReadStream(join(buildDir, 'index.html'));\n };\n\n strapi.server.routes([\n {\n method: 'GET',\n path: `${strapi.config.admin.path}/:path*`,\n handler: [\n serveAdminMiddleware,\n serveStatic(buildDir, {\n maxage: 31536000,\n defer: false,\n index: 'index.html',\n setHeaders(res: any, path: any) {\n const ext = extname(path);\n // publicly cache static files to avoid unnecessary network & disk access\n if (ext !== '.html') {\n res.setHeader('cache-control', 'public, max-age=31536000, immutable');\n }\n },\n }),\n ],\n config: { auth: false },\n },\n ]);\n};\n\n// serveStatic is not supposed to be used to serve a folder that have sub-folders\nconst serveStatic = (filesDir: any, koaStaticOptions = {}) => {\n const serve = koaStatic(filesDir, koaStaticOptions);\n\n return async (ctx: Context, next: Next) => {\n const prev = ctx.path;\n const newPath = basename(ctx.path);\n\n ctx.path = newPath;\n await serve(ctx, async () => {\n ctx.path = prev;\n await next();\n ctx.path = newPath;\n });\n ctx.path = prev;\n };\n};\n\nexport default registerAdminPanelRoute;\n"],"names":["registerAdminPanelRoute","strapi","buildDir","resolve","dirs","dist","root","fse","pathExistsSync","__dirname","serveAdminMiddleware","ctx","next","method","body","status","type","createReadStream","join","server","routes","path","config","admin","handler","serveStatic","maxage","defer","index","setHeaders","res","ext","extname","setHeader","auth","filesDir","koaStaticOptions","serve","koaStatic","prev","newPath","basename"],"mappings":";;;;;;AAMA,MAAMA,uBAA0B,GAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IAClE,IAAIC,QAAAA,GAAWC,aAAQF,MAAOG,CAAAA,IAAI,CAACC,IAAI,CAACC,IAAI,EAAE,OAAA,CAAA;AAE9C,IAAA,IAAI,CAACC,GAAAA,CAAIC,cAAc,CAACN,QAAW,CAAA,EAAA;AACjCA,QAAAA,QAAAA,GAAWC,aAAQM,SAAW,EAAA,aAAA,CAAA;AAChC;IAEA,MAAMC,oBAAAA,GAAuB,OAAOC,GAAcC,EAAAA,IAAAA,GAAAA;QAChD,MAAMA,IAAAA,EAAAA;AAEN,QAAA,IAAID,IAAIE,MAAM,KAAK,UAAUF,GAAIE,CAAAA,MAAM,KAAK,KAAO,EAAA;AACjD,YAAA;AACF;AAEA,QAAA,IAAIF,IAAIG,IAAI,IAAI,QAAQH,GAAII,CAAAA,MAAM,KAAK,GAAK,EAAA;AAC1C,YAAA;AACF;AAEAJ,QAAAA,GAAAA,CAAIK,IAAI,GAAG,MAAA;AACXL,QAAAA,GAAAA,CAAIG,IAAI,GAAGP,GAAAA,CAAIU,gBAAgB,CAACC,UAAKhB,QAAU,EAAA,YAAA,CAAA,CAAA;AACjD,KAAA;IAEAD,MAAOkB,CAAAA,MAAM,CAACC,MAAM,CAAC;AACnB,QAAA;YACEP,MAAQ,EAAA,KAAA;YACRQ,IAAM,EAAA,CAAC,EAAEpB,MAAAA,CAAOqB,MAAM,CAACC,KAAK,CAACF,IAAI,CAAC,OAAO,CAAC;YAC1CG,OAAS,EAAA;AACPd,gBAAAA,oBAAAA;AACAe,gBAAAA,WAAAA,CAAYvB,QAAU,EAAA;oBACpBwB,MAAQ,EAAA,QAAA;oBACRC,KAAO,EAAA,KAAA;oBACPC,KAAO,EAAA,YAAA;oBACPC,UAAWC,CAAAA,CAAAA,GAAQ,EAAET,MAAS,EAAA;AAC5B,wBAAA,MAAMU,MAAMC,YAAQX,CAAAA,MAAAA,CAAAA;;AAEpB,wBAAA,IAAIU,QAAQ,OAAS,EAAA;4BACnBD,GAAIG,CAAAA,SAAS,CAAC,eAAiB,EAAA,qCAAA,CAAA;AACjC;AACF;AACF,iBAAA;AACD,aAAA;YACDX,MAAQ,EAAA;gBAAEY,IAAM,EAAA;AAAM;AACxB;AACD,KAAA,CAAA;AACH;AAEA;AACA,MAAMT,WAAc,GAAA,CAACU,QAAeC,EAAAA,gBAAAA,GAAmB,EAAE,GAAA;IACvD,MAAMC,KAAAA,GAAQC,UAAUH,QAAUC,EAAAA,gBAAAA,CAAAA;AAElC,IAAA,OAAO,OAAOzB,GAAcC,EAAAA,IAAAA,GAAAA;QAC1B,MAAM2B,IAAAA,GAAO5B,IAAIU,IAAI;QACrB,MAAMmB,OAAAA,GAAUC,aAAS9B,CAAAA,GAAAA,CAAIU,IAAI,CAAA;AAEjCV,QAAAA,GAAAA,CAAIU,IAAI,GAAGmB,OAAAA;AACX,QAAA,MAAMH,MAAM1B,GAAK,EAAA,UAAA;AACfA,YAAAA,GAAAA,CAAIU,IAAI,GAAGkB,IAAAA;YACX,MAAM3B,IAAAA,EAAAA;AACND,YAAAA,GAAAA,CAAIU,IAAI,GAAGmB,OAAAA;AACb,SAAA,CAAA;AACA7B,QAAAA,GAAAA,CAAIU,IAAI,GAAGkB,IAAAA;AACb,KAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"serve-admin-panel.js","sources":["../../../../../server/src/routes/serve-admin-panel.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport { resolve, join, extname, basename } from 'path';\nimport fse from 'fs-extra';\nimport koaStatic from 'koa-static';\nimport type { Core } from '@strapi/types';\n\nconst registerAdminPanelRoute = ({ strapi }: { strapi: Core.Strapi }) => {\n let buildDir = resolve(strapi.dirs.dist.root, 'build');\n\n if (!fse.pathExistsSync(buildDir)) {\n buildDir = resolve(__dirname, '../../build');\n }\n\n const serveAdminMiddleware = async (ctx: Context, next: Next) => {\n await next();\n\n if (ctx.method !== 'HEAD' && ctx.method !== 'GET') {\n return;\n }\n\n if (ctx.body != null || ctx.status !== 404) {\n return;\n }\n\n ctx.type = 'html';\n ctx.body = fse.createReadStream(join(buildDir, 'index.html'));\n };\n\n strapi.server.routes([\n {\n method: 'GET',\n path: `${strapi.config.admin.path}/:path*`,\n handler: [\n serveAdminMiddleware,\n serveStatic(buildDir, {\n maxage: 31536000,\n defer: false,\n index: 'index.html',\n setHeaders(res: any, path: any) {\n const ext = extname(path);\n // publicly cache static files to avoid unnecessary network & disk access\n if (ext !== '.html') {\n res.setHeader('cache-control', 'public, max-age=31536000, immutable');\n }\n },\n }),\n ],\n config: { auth: false },\n },\n ]);\n};\n\n// serveStatic is not supposed to be used to serve a folder that have sub-folders\nconst serveStatic = (filesDir: any, koaStaticOptions = {}) => {\n const serve = koaStatic(filesDir, koaStaticOptions);\n\n return async (ctx: Context, next: Next) => {\n const prev = ctx.path;\n const newPath = basename(ctx.path);\n\n ctx.path = newPath;\n await serve(ctx, async () => {\n ctx.path = prev;\n await next();\n ctx.path = newPath;\n });\n ctx.path = prev;\n };\n};\n\nexport default registerAdminPanelRoute;\n"],"names":["registerAdminPanelRoute","strapi","buildDir","resolve","dirs","dist","root","fse","pathExistsSync","__dirname","serveAdminMiddleware","ctx","next","method","body","status","type","createReadStream","join","server","routes","path","config","admin","handler","serveStatic","maxage","defer","index","setHeaders","res","ext","extname","setHeader","auth","filesDir","koaStaticOptions","serve","koaStatic","prev","newPath","basename"],"mappings":";;;;;;AAMA,MAAMA,uBAA0B,GAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IAClE,IAAIC,QAAAA,GAAWC,aAAQF,MAAOG,CAAAA,IAAI,CAACC,IAAI,CAACC,IAAI,EAAE,OAAA,CAAA;AAE9C,IAAA,IAAI,CAACC,GAAAA,CAAIC,cAAc,CAACN,QAAW,CAAA,EAAA;AACjCA,QAAAA,QAAAA,GAAWC,aAAQM,SAAW,EAAA,aAAA,CAAA;AAChC;IAEA,MAAMC,oBAAAA,GAAuB,OAAOC,GAAcC,EAAAA,IAAAA,GAAAA;QAChD,MAAMA,IAAAA,EAAAA;AAEN,QAAA,IAAID,IAAIE,MAAM,KAAK,UAAUF,GAAIE,CAAAA,MAAM,KAAK,KAAO,EAAA;AACjD,YAAA;AACF;AAEA,QAAA,IAAIF,IAAIG,IAAI,IAAI,QAAQH,GAAII,CAAAA,MAAM,KAAK,GAAK,EAAA;AAC1C,YAAA;AACF;AAEAJ,QAAAA,GAAAA,CAAIK,IAAI,GAAG,MAAA;AACXL,QAAAA,GAAAA,CAAIG,IAAI,GAAGP,GAAAA,CAAIU,gBAAgB,CAACC,UAAKhB,QAAU,EAAA,YAAA,CAAA,CAAA;AACjD,KAAA;IAEAD,MAAOkB,CAAAA,MAAM,CAACC,MAAM,CAAC;AACnB,QAAA;YACEP,MAAQ,EAAA,KAAA;YACRQ,IAAM,EAAA,CAAA,EAAGpB,OAAOqB,MAAM,CAACC,KAAK,CAACF,IAAI,CAAC,OAAO,CAAC;YAC1CG,OAAS,EAAA;AACPd,gBAAAA,oBAAAA;AACAe,gBAAAA,WAAAA,CAAYvB,QAAU,EAAA;oBACpBwB,MAAQ,EAAA,QAAA;oBACRC,KAAO,EAAA,KAAA;oBACPC,KAAO,EAAA,YAAA;oBACPC,UAAWC,CAAAA,CAAAA,GAAQ,EAAET,MAAS,EAAA;AAC5B,wBAAA,MAAMU,MAAMC,YAAQX,CAAAA,MAAAA,CAAAA;;AAEpB,wBAAA,IAAIU,QAAQ,OAAS,EAAA;4BACnBD,GAAIG,CAAAA,SAAS,CAAC,eAAiB,EAAA,qCAAA,CAAA;AACjC;AACF;AACF,iBAAA;AACD,aAAA;YACDX,MAAQ,EAAA;gBAAEY,IAAM,EAAA;AAAM;AACxB;AACD,KAAA,CAAA;AACH;AAEA;AACA,MAAMT,WAAc,GAAA,CAACU,QAAeC,EAAAA,gBAAAA,GAAmB,EAAE,GAAA;IACvD,MAAMC,KAAAA,GAAQC,UAAUH,QAAUC,EAAAA,gBAAAA,CAAAA;AAElC,IAAA,OAAO,OAAOzB,GAAcC,EAAAA,IAAAA,GAAAA;QAC1B,MAAM2B,IAAAA,GAAO5B,IAAIU,IAAI;QACrB,MAAMmB,OAAAA,GAAUC,aAAS9B,CAAAA,GAAAA,CAAIU,IAAI,CAAA;AAEjCV,QAAAA,GAAAA,CAAIU,IAAI,GAAGmB,OAAAA;AACX,QAAA,MAAMH,MAAM1B,GAAK,EAAA,UAAA;AACfA,YAAAA,GAAAA,CAAIU,IAAI,GAAGkB,IAAAA;YACX,MAAM3B,IAAAA,EAAAA;AACND,YAAAA,GAAAA,CAAIU,IAAI,GAAGmB,OAAAA;AACb,SAAA,CAAA;AACA7B,QAAAA,GAAAA,CAAIU,IAAI,GAAGkB,IAAAA;AACb,KAAA;AACF,CAAA;;;;"}