@strapi/admin 5.58.0 → 5.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) 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/ConfirmDialog.js +10 -9
  4. package/dist/admin/admin/src/components/ConfirmDialog.js.map +1 -1
  5. package/dist/admin/admin/src/components/ConfirmDialog.mjs +10 -9
  6. package/dist/admin/admin/src/components/ConfirmDialog.mjs.map +1 -1
  7. package/dist/admin/admin/src/components/Filters.js +57 -12
  8. package/dist/admin/admin/src/components/Filters.js.map +1 -1
  9. package/dist/admin/admin/src/components/Filters.mjs +57 -12
  10. package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
  11. package/dist/admin/admin/src/components/Form.js +3 -1
  12. package/dist/admin/admin/src/components/Form.js.map +1 -1
  13. package/dist/admin/admin/src/components/Form.mjs +3 -1
  14. package/dist/admin/admin/src/components/Form.mjs.map +1 -1
  15. package/dist/admin/admin/src/components/FormInputs/Enumeration.js +2 -1
  16. package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
  17. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +2 -1
  18. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
  19. package/dist/admin/admin/src/components/LeftMenu.js +5 -1
  20. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  21. package/dist/admin/admin/src/components/LeftMenu.mjs +5 -1
  22. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  23. package/dist/admin/admin/src/components/PageHelpers.js +2 -1
  24. package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
  25. package/dist/admin/admin/src/components/PageHelpers.mjs +2 -1
  26. package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
  27. package/dist/admin/admin/src/components/Pagination.js +7 -6
  28. package/dist/admin/admin/src/components/Pagination.js.map +1 -1
  29. package/dist/admin/admin/src/components/Pagination.mjs +7 -6
  30. package/dist/admin/admin/src/components/Pagination.mjs.map +1 -1
  31. package/dist/admin/admin/src/components/RelativeTime.js +2 -1
  32. package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
  33. package/dist/admin/admin/src/components/RelativeTime.mjs +2 -1
  34. package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
  35. package/dist/admin/admin/src/components/SubNav.js +6 -12
  36. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  37. package/dist/admin/admin/src/components/SubNav.mjs +7 -13
  38. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  39. package/dist/admin/admin/src/components/Table.js +3 -1
  40. package/dist/admin/admin/src/components/Table.js.map +1 -1
  41. package/dist/admin/admin/src/components/Table.mjs +3 -1
  42. package/dist/admin/admin/src/components/Table.mjs.map +1 -1
  43. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  44. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  45. package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -1
  46. package/dist/admin/admin/src/components/WidgetRoot.mjs.map +1 -1
  47. package/dist/admin/admin/src/constants.js.map +1 -1
  48. package/dist/admin/admin/src/constants.mjs.map +1 -1
  49. package/dist/admin/admin/src/core/apis/Plugin.js.map +1 -1
  50. package/dist/admin/admin/src/core/apis/Plugin.mjs.map +1 -1
  51. package/dist/admin/admin/src/features/Auth.js +2 -1
  52. package/dist/admin/admin/src/features/Auth.js.map +1 -1
  53. package/dist/admin/admin/src/features/Auth.mjs +2 -1
  54. package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
  55. package/dist/admin/admin/src/features/StrapiApp.js.map +1 -1
  56. package/dist/admin/admin/src/features/StrapiApp.mjs.map +1 -1
  57. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  58. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  59. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
  60. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
  61. package/dist/admin/admin/src/pages/ProfilePage.js +2 -2
  62. package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
  63. package/dist/admin/admin/src/pages/ProfilePage.mjs +2 -2
  64. package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
  65. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  66. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  67. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.js +4 -1
  68. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.js.map +1 -1
  69. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs +4 -1
  70. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs.map +1 -1
  71. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +3 -1
  72. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
  73. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs +3 -1
  74. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs.map +1 -1
  75. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.js +2 -1
  76. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.js.map +1 -1
  77. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.mjs +2 -1
  78. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.mjs.map +1 -1
  79. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js +6 -5
  80. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js.map +1 -1
  81. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.mjs +6 -5
  82. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.mjs.map +1 -1
  83. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +2 -1
  84. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js.map +1 -1
  85. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs +2 -1
  86. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs.map +1 -1
  87. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.js +4 -4
  88. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.js.map +1 -1
  89. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.mjs +4 -4
  90. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.mjs.map +1 -1
  91. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +1 -2
  92. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  93. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +1 -2
  94. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  95. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
  96. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs.map +1 -1
  97. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js.map +1 -1
  98. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs.map +1 -1
  99. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +9 -4
  100. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
  101. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs +9 -4
  102. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs.map +1 -1
  103. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js +15 -9
  104. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js.map +1 -1
  105. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs +15 -9
  106. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs.map +1 -1
  107. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +5 -2
  108. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
  109. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs +5 -2
  110. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs.map +1 -1
  111. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js +2 -1
  112. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js.map +1 -1
  113. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs +2 -1
  114. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs.map +1 -1
  115. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +2 -1
  116. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
  117. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +2 -1
  118. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
  119. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +2 -1
  120. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
  121. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs +2 -1
  122. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs.map +1 -1
  123. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js.map +1 -1
  124. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.mjs.map +1 -1
  125. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js +3 -1
  126. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
  127. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs +3 -1
  128. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs.map +1 -1
  129. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js.map +1 -1
  130. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs.map +1 -1
  131. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
  132. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
  133. package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.js.map +1 -1
  134. package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.mjs.map +1 -1
  135. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js +4 -1
  136. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js.map +1 -1
  137. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.mjs +4 -1
  138. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.mjs.map +1 -1
  139. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +18 -3
  140. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js.map +1 -1
  141. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs +18 -3
  142. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs.map +1 -1
  143. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js.map +1 -1
  144. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs.map +1 -1
  145. package/dist/admin/admin/src/router.js.map +1 -1
  146. package/dist/admin/admin/src/router.mjs.map +1 -1
  147. package/dist/admin/admin/src/services/users.js.map +1 -1
  148. package/dist/admin/admin/src/services/users.mjs.map +1 -1
  149. package/dist/admin/admin/src/translations/eu.json.js +1 -1
  150. package/dist/admin/admin/src/translations/eu.json.mjs +1 -1
  151. package/dist/admin/admin/src/utils/cookies.js +7 -6
  152. package/dist/admin/admin/src/utils/cookies.js.map +1 -1
  153. package/dist/admin/admin/src/utils/cookies.mjs +7 -6
  154. package/dist/admin/admin/src/utils/cookies.mjs.map +1 -1
  155. package/dist/admin/admin/tests/utils.js +2 -1
  156. package/dist/admin/admin/tests/utils.js.map +1 -1
  157. package/dist/admin/admin/tests/utils.mjs +2 -1
  158. package/dist/admin/admin/tests/utils.mjs.map +1 -1
  159. package/dist/admin/shared/utils/auth-cookie-path.js +13 -10
  160. package/dist/admin/shared/utils/auth-cookie-path.js.map +1 -1
  161. package/dist/admin/shared/utils/auth-cookie-path.mjs +13 -10
  162. package/dist/admin/shared/utils/auth-cookie-path.mjs.map +1 -1
  163. package/dist/admin/shared/utils/get-project-type.js +3 -3
  164. package/dist/admin/shared/utils/get-project-type.js.map +1 -1
  165. package/dist/admin/shared/utils/get-project-type.mjs +3 -3
  166. package/dist/admin/shared/utils/get-project-type.mjs.map +1 -1
  167. package/dist/admin/src/components/Filters.d.ts +1 -1
  168. package/dist/admin/src/components/Form.d.ts +1 -1
  169. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.d.ts +1 -1
  170. package/dist/admin/src/utils/cookies.d.ts +7 -6
  171. package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -1
  172. package/dist/ee/server/src/validation/role.d.ts.map +1 -1
  173. package/dist/server/ee/server/src/audit-logs/utils/csv.js +3 -3
  174. package/dist/server/ee/server/src/audit-logs/utils/csv.js.map +1 -1
  175. package/dist/server/ee/server/src/audit-logs/utils/csv.mjs +3 -3
  176. package/dist/server/ee/server/src/audit-logs/utils/csv.mjs.map +1 -1
  177. package/dist/server/ee/server/src/services/seat-enforcement.js.map +1 -1
  178. package/dist/server/ee/server/src/services/seat-enforcement.mjs.map +1 -1
  179. package/dist/server/ee/server/src/validation/role.js +4 -2
  180. package/dist/server/ee/server/src/validation/role.js.map +1 -1
  181. package/dist/server/ee/server/src/validation/role.mjs +4 -2
  182. package/dist/server/ee/server/src/validation/role.mjs.map +1 -1
  183. package/dist/server/server/src/ai/services/ai.js.map +1 -1
  184. package/dist/server/server/src/ai/services/ai.mjs.map +1 -1
  185. package/dist/server/server/src/controllers/admin.js +11 -12
  186. package/dist/server/server/src/controllers/admin.js.map +1 -1
  187. package/dist/server/server/src/controllers/admin.mjs +11 -12
  188. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  189. package/dist/server/server/src/domain/permission/index.js.map +1 -1
  190. package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
  191. package/dist/server/server/src/services/api-token.js +4 -8
  192. package/dist/server/server/src/services/api-token.js.map +1 -1
  193. package/dist/server/server/src/services/api-token.mjs +4 -8
  194. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  195. package/dist/server/server/src/services/constants.js +4 -0
  196. package/dist/server/server/src/services/constants.js.map +1 -1
  197. package/dist/server/server/src/services/constants.mjs +4 -0
  198. package/dist/server/server/src/services/constants.mjs.map +1 -1
  199. package/dist/server/server/src/services/permission/rename-fields.js.map +1 -1
  200. package/dist/server/server/src/services/permission/rename-fields.mjs.map +1 -1
  201. package/dist/server/server/src/services/permission/sections-builder/handlers.js.map +1 -1
  202. package/dist/server/server/src/services/permission/sections-builder/handlers.mjs.map +1 -1
  203. package/dist/server/server/src/services/role.js +8 -5
  204. package/dist/server/server/src/services/role.js.map +1 -1
  205. package/dist/server/server/src/services/role.mjs +8 -5
  206. package/dist/server/server/src/services/role.mjs.map +1 -1
  207. package/dist/server/server/src/validation/admin-tokens.js +4 -4
  208. package/dist/server/server/src/validation/admin-tokens.js.map +1 -1
  209. package/dist/server/server/src/validation/admin-tokens.mjs +4 -4
  210. package/dist/server/server/src/validation/admin-tokens.mjs.map +1 -1
  211. package/dist/server/server/src/validation/api-tokens.js +4 -4
  212. package/dist/server/server/src/validation/api-tokens.js.map +1 -1
  213. package/dist/server/server/src/validation/api-tokens.mjs +4 -4
  214. package/dist/server/server/src/validation/api-tokens.mjs.map +1 -1
  215. package/dist/server/server/src/validation/role.js +6 -4
  216. package/dist/server/server/src/validation/role.js.map +1 -1
  217. package/dist/server/server/src/validation/role.mjs +6 -4
  218. package/dist/server/server/src/validation/role.mjs.map +1 -1
  219. package/dist/server/server/src/validation/transfer/token.js +4 -4
  220. package/dist/server/server/src/validation/transfer/token.js.map +1 -1
  221. package/dist/server/server/src/validation/transfer/token.mjs +4 -4
  222. package/dist/server/server/src/validation/transfer/token.mjs.map +1 -1
  223. package/dist/server/shared/utils/auth-cookie-path.js +13 -10
  224. package/dist/server/shared/utils/auth-cookie-path.js.map +1 -1
  225. package/dist/server/shared/utils/auth-cookie-path.mjs +13 -10
  226. package/dist/server/shared/utils/auth-cookie-path.mjs.map +1 -1
  227. package/dist/server/shared/utils/get-project-type.js +3 -3
  228. package/dist/server/shared/utils/get-project-type.js.map +1 -1
  229. package/dist/server/shared/utils/get-project-type.mjs +3 -3
  230. package/dist/server/shared/utils/get-project-type.mjs.map +1 -1
  231. package/dist/server/shared/utils/session-auth.js +70 -3
  232. package/dist/server/shared/utils/session-auth.js.map +1 -1
  233. package/dist/server/shared/utils/session-auth.mjs +70 -4
  234. package/dist/server/shared/utils/session-auth.mjs.map +1 -1
  235. package/dist/server/src/ai/services/ai.d.ts.map +1 -1
  236. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  237. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  238. package/dist/server/src/services/constants.d.ts +2 -0
  239. package/dist/server/src/services/constants.d.ts.map +1 -1
  240. package/dist/server/src/services/permission/rename-fields.d.ts.map +1 -1
  241. package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
  242. package/dist/server/src/services/role.d.ts.map +1 -1
  243. package/dist/server/src/validation/role.d.ts.map +1 -1
  244. package/dist/shared/contracts/transfer.d.ts.map +1 -1
  245. package/dist/shared/utils/auth-cookie-path.d.ts +13 -10
  246. package/dist/shared/utils/auth-cookie-path.d.ts.map +1 -1
  247. package/dist/shared/utils/session-auth.d.ts +16 -0
  248. package/dist/shared/utils/session-auth.d.ts.map +1 -1
  249. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"ai.mjs","sources":["../../../../../../server/src/ai/services/ai.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport { AdminUser } from '../../../../shared/contracts/shared';\n\nconst STRAPI_MANAGED_AI_LICENSE_FEATURE = 'cms-ai';\nconst CUSTOM_AI_PROVIDER_LICENSE_FEATURE = 'cms-byok-ai';\n\nconst createAiAdminService = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * In-memory cache for AI tokens\n * Key format: `${projectId}:${userId}`\n */\n const aiTokenCache = new Map<\n string,\n {\n token: string;\n expiresAt?: string;\n expiresAtMs?: number;\n }\n >();\n\n let isCustomProviderRejected = false;\n\n const isConfigEnabled = (): boolean => strapi.config.get('admin.ai.enabled', true) === true;\n\n const isAvailable = (): boolean =>\n isConfigEnabled() && strapi.ee?.isEE === true && !isCustomProviderRejected;\n\n const isStrapiManagedAiEnabled = (): boolean =>\n isConfigEnabled() &&\n !isCustomProviderRejected &&\n strapi.ee?.features?.isEnabled(STRAPI_MANAGED_AI_LICENSE_FEATURE) === true;\n\n const authorizeCustomProvider = (): boolean => {\n if (!isConfigEnabled()) {\n strapi.log.info(\n 'A custom AI provider was ignored: AI is disabled by the \"admin.ai.enabled\" config.'\n );\n return false;\n }\n\n if (strapi.ee?.features?.isEnabled(CUSTOM_AI_PROVIDER_LICENSE_FEATURE) === true) {\n return true;\n }\n\n isCustomProviderRejected = true;\n strapi.log.warn(\n `A custom AI provider was rejected: the Strapi license does not include the \"${CUSTOM_AI_PROVIDER_LICENSE_FEATURE}\" feature. All AI features are disabled.`\n );\n return false;\n };\n\n const isPluginAiFeatureConfigured = async (plugin: string, service: string): Promise<boolean> => {\n const aiService = strapi.plugin(plugin)?.service(service) as\n | { isEnabled?: () => Promise<boolean> | boolean }\n | undefined;\n\n if (typeof aiService?.isEnabled !== 'function') {\n return false;\n }\n\n return (await aiService.isEnabled()) === true;\n };\n\n const getAiFeatureConfig = async () => {\n if (!isAvailable()) {\n return {\n isAiI18nConfigured: false,\n isAiMediaLibraryConfigured: false,\n };\n }\n\n const [isAiI18nConfigured, isAiMediaLibraryConfigured] = await Promise.all([\n isPluginAiFeatureConfigured('i18n', 'ai-localizations'),\n isPluginAiFeatureConfigured('upload', 'aiMetadata'),\n ]);\n\n return { isAiI18nConfigured, isAiMediaLibraryConfigured };\n };\n\n /**\n * Resolves the shared context required by both getAiToken and getAiUsage:\n * EE license, project ID, and AI server URL.\n */\n const resolveAiContext = (errorPrefix: string) => {\n if (!isStrapiManagedAiEnabled()) {\n strapi.log.error(`${errorPrefix} AI is not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n if (!strapi.ee?.isEE) {\n strapi.log.error(`${errorPrefix} Enterprise Edition features are not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n let eeLicense = process.env.STRAPI_LICENSE;\n\n if (!eeLicense) {\n try {\n const licensePath = path.join(strapi.dirs.app.root, 'license.txt');\n eeLicense = fs.readFileSync(licensePath).toString();\n } catch {\n // License file doesn't exist or can't be read\n }\n }\n\n if (!eeLicense) {\n strapi.log.error(\n `${errorPrefix} No EE license found. Please ensure STRAPI_LICENSE environment variable is set or license.txt file exists.`\n );\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const projectId = strapi.config.get('uuid');\n if (!projectId) {\n strapi.log.error(`${errorPrefix} Project ID not configured`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return { eeLicense, projectId, aiServerUrl };\n };\n\n const getAiToken = async () => {\n const ERROR_PREFIX = 'AI token request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n // Get the current user\n const user = strapi.requestContext.get()?.state?.user as AdminUser | undefined;\n if (!user) {\n strapi.log.error(`${ERROR_PREFIX} No authenticated user in request context`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n // Create a secure user identifier using only user ID\n const userIdentifier = user.id.toString();\n\n // Check cache for existing valid token\n const cacheKey = `${projectId}:${userIdentifier}`;\n const cachedToken = aiTokenCache.get(cacheKey);\n\n if (cachedToken) {\n const now = Date.now();\n // Check if token is still valid (with buffer so it has time to be used)\n const bufferMs = 2 * 60 * 1000; // 2 minutes\n\n if (cachedToken.expiresAtMs && cachedToken.expiresAtMs - bufferMs > now) {\n strapi.log.info('Using cached AI token');\n\n return {\n token: cachedToken.token,\n expiresAt: cachedToken.expiresAt,\n };\n }\n\n // Token expired or will expire soon, remove from cache\n aiTokenCache.delete(cacheKey);\n }\n\n strapi.log.http('Contacting AI Server for token generation');\n\n try {\n const response = await fetch(`${aiServerUrl}/auth/getAiJWT`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeLicense,\n userIdentifier,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n jwt: string;\n expiresAt?: string;\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n if (!data.jwt) {\n strapi.log.error(`${ERROR_PREFIX} Invalid response: missing JWT token`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n strapi.log.info('AI token generated successfully', {\n userId: user.id,\n expiresAt: data.expiresAt,\n });\n\n // Cache the token if it has an expiration time\n if (data.expiresAt) {\n const expiresAtMs = new Date(data.expiresAt).getTime();\n aiTokenCache.set(cacheKey, {\n token: data.jwt,\n expiresAt: data.expiresAt,\n expiresAtMs,\n });\n }\n\n // Note: Token expires in 1 hour, client should handle refresh\n return {\n token: data.jwt,\n expiresAt: data.expiresAt,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n const getAiUsage = async () => {\n const ERROR_PREFIX = 'AI usage data request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n strapi.log.http('Contacting AI Server for usage data');\n\n try {\n const response = await fetch(`${aiServerUrl}/cms/ai-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeKey: eeLicense,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n data: { cmsAiCreditsUsed: number };\n subscription: {\n subscriptionId: string;\n planPriceId: string;\n subscriptionStatus: string;\n isActiveSubscription: boolean;\n cmsAiEnabled: boolean;\n cmsAiCreditsBase: number;\n cmsAiCreditsMaxUsage: number;\n currentTermStart: string;\n currentTermEnd: string;\n };\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n return {\n ...data.data,\n subscription: data.subscription,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n return {\n /* Requires `ai.enabled=true` + license + no failed AI provider registration */\n isAvailable,\n /* `true` only when the license has the `cms-ai` entitlement to globally enable AI features.\n TODO: once all AI features are migrated to the providers architecture, consider removing this flag */\n isStrapiManagedAiEnabled,\n authorizeCustomProvider,\n /* Returns the status of each AI feature, flagging which are enabled. */\n getAiFeatureConfig,\n getAiToken,\n getAiUsage,\n };\n};\n\nexport { createAiAdminService };\n"],"names":["STRAPI_MANAGED_AI_LICENSE_FEATURE","CUSTOM_AI_PROVIDER_LICENSE_FEATURE","createAiAdminService","strapi","aiTokenCache","Map","isCustomProviderRejected","isConfigEnabled","config","get","isAvailable","ee","isEE","isStrapiManagedAiEnabled","features","isEnabled","authorizeCustomProvider","log","info","warn","isPluginAiFeatureConfigured","plugin","service","aiService","getAiFeatureConfig","isAiI18nConfigured","isAiMediaLibraryConfigured","Promise","all","resolveAiContext","errorPrefix","error","Error","replace","eeLicense","process","env","STRAPI_LICENSE","licensePath","path","join","dirs","app","root","fs","readFileSync","toString","projectId","aiServerUrl","STRAPI_AI_URL","getAiToken","ERROR_PREFIX","user","requestContext","state","userIdentifier","id","cacheKey","cachedToken","now","Date","bufferMs","expiresAtMs","token","expiresAt","delete","http","response","fetch","method","headers","crypto","randomUUID","body","JSON","stringify","ok","errorData","errorText","text","parse","status","statusText","data","json","parseError","jwt","userId","getTime","set","fetchError","name","getAiUsage","eeKey","subscription"],"mappings":"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"}
1
+ {"version":3,"file":"ai.mjs","sources":["../../../../../../server/src/ai/services/ai.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport { AdminUser } from '../../../../shared/contracts/shared';\n\nconst STRAPI_MANAGED_AI_LICENSE_FEATURE = 'cms-ai';\nconst CUSTOM_AI_PROVIDER_LICENSE_FEATURE = 'cms-byok-ai';\n\nconst createAiAdminService = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * In-memory cache for AI tokens\n * Key format: `${projectId}:${userId}`\n */\n const aiTokenCache = new Map<\n string,\n {\n token: string;\n expiresAt?: string;\n expiresAtMs?: number;\n }\n >();\n\n let isCustomProviderRejected = false;\n\n const isConfigEnabled = (): boolean => strapi.config.get('admin.ai.enabled', true) === true;\n\n const isAvailable = (): boolean =>\n isConfigEnabled() && strapi.ee?.isEE === true && !isCustomProviderRejected;\n\n const isStrapiManagedAiEnabled = (): boolean =>\n isConfigEnabled() &&\n !isCustomProviderRejected &&\n strapi.ee?.features?.isEnabled(STRAPI_MANAGED_AI_LICENSE_FEATURE) === true;\n\n const authorizeCustomProvider = (): boolean => {\n if (!isConfigEnabled()) {\n strapi.log.info(\n 'A custom AI provider was ignored: AI is disabled by the \"admin.ai.enabled\" config.'\n );\n return false;\n }\n\n if (strapi.ee?.features?.isEnabled(CUSTOM_AI_PROVIDER_LICENSE_FEATURE) === true) {\n return true;\n }\n\n isCustomProviderRejected = true;\n strapi.log.warn(\n `A custom AI provider was rejected: the Strapi license does not include the \"${CUSTOM_AI_PROVIDER_LICENSE_FEATURE}\" feature. All AI features are disabled.`\n );\n return false;\n };\n\n const isPluginAiFeatureConfigured = async (plugin: string, service: string): Promise<boolean> => {\n const aiService = strapi.plugin(plugin)?.service(service) as\n { isEnabled?: () => Promise<boolean> | boolean } | undefined;\n\n if (typeof aiService?.isEnabled !== 'function') {\n return false;\n }\n\n return (await aiService.isEnabled()) === true;\n };\n\n const getAiFeatureConfig = async () => {\n if (!isAvailable()) {\n return {\n isAiI18nConfigured: false,\n isAiMediaLibraryConfigured: false,\n };\n }\n\n const [isAiI18nConfigured, isAiMediaLibraryConfigured] = await Promise.all([\n isPluginAiFeatureConfigured('i18n', 'ai-localizations'),\n isPluginAiFeatureConfigured('upload', 'aiMetadata'),\n ]);\n\n return { isAiI18nConfigured, isAiMediaLibraryConfigured };\n };\n\n /**\n * Resolves the shared context required by both getAiToken and getAiUsage:\n * EE license, project ID, and AI server URL.\n */\n const resolveAiContext = (errorPrefix: string) => {\n if (!isStrapiManagedAiEnabled()) {\n strapi.log.error(`${errorPrefix} AI is not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n if (!strapi.ee?.isEE) {\n strapi.log.error(`${errorPrefix} Enterprise Edition features are not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n let eeLicense = process.env.STRAPI_LICENSE;\n\n if (!eeLicense) {\n try {\n const licensePath = path.join(strapi.dirs.app.root, 'license.txt');\n eeLicense = fs.readFileSync(licensePath).toString();\n } catch {\n // License file doesn't exist or can't be read\n }\n }\n\n if (!eeLicense) {\n strapi.log.error(\n `${errorPrefix} No EE license found. Please ensure STRAPI_LICENSE environment variable is set or license.txt file exists.`\n );\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const projectId = strapi.config.get('uuid');\n if (!projectId) {\n strapi.log.error(`${errorPrefix} Project ID not configured`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return { eeLicense, projectId, aiServerUrl };\n };\n\n const getAiToken = async () => {\n const ERROR_PREFIX = 'AI token request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n // Get the current user\n const user = strapi.requestContext.get()?.state?.user as AdminUser | undefined;\n if (!user) {\n strapi.log.error(`${ERROR_PREFIX} No authenticated user in request context`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n // Create a secure user identifier using only user ID\n const userIdentifier = user.id.toString();\n\n // Check cache for existing valid token\n const cacheKey = `${projectId}:${userIdentifier}`;\n const cachedToken = aiTokenCache.get(cacheKey);\n\n if (cachedToken) {\n const now = Date.now();\n // Check if token is still valid (with buffer so it has time to be used)\n const bufferMs = 2 * 60 * 1000; // 2 minutes\n\n if (cachedToken.expiresAtMs && cachedToken.expiresAtMs - bufferMs > now) {\n strapi.log.info('Using cached AI token');\n\n return {\n token: cachedToken.token,\n expiresAt: cachedToken.expiresAt,\n };\n }\n\n // Token expired or will expire soon, remove from cache\n aiTokenCache.delete(cacheKey);\n }\n\n strapi.log.http('Contacting AI Server for token generation');\n\n try {\n const response = await fetch(`${aiServerUrl}/auth/getAiJWT`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeLicense,\n userIdentifier,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n jwt: string;\n expiresAt?: string;\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n if (!data.jwt) {\n strapi.log.error(`${ERROR_PREFIX} Invalid response: missing JWT token`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n strapi.log.info('AI token generated successfully', {\n userId: user.id,\n expiresAt: data.expiresAt,\n });\n\n // Cache the token if it has an expiration time\n if (data.expiresAt) {\n const expiresAtMs = new Date(data.expiresAt).getTime();\n aiTokenCache.set(cacheKey, {\n token: data.jwt,\n expiresAt: data.expiresAt,\n expiresAtMs,\n });\n }\n\n // Note: Token expires in 1 hour, client should handle refresh\n return {\n token: data.jwt,\n expiresAt: data.expiresAt,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n const getAiUsage = async () => {\n const ERROR_PREFIX = 'AI usage data request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n strapi.log.http('Contacting AI Server for usage data');\n\n try {\n const response = await fetch(`${aiServerUrl}/cms/ai-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeKey: eeLicense,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n data: { cmsAiCreditsUsed: number };\n subscription: {\n subscriptionId: string;\n planPriceId: string;\n subscriptionStatus: string;\n isActiveSubscription: boolean;\n cmsAiEnabled: boolean;\n cmsAiCreditsBase: number;\n cmsAiCreditsMaxUsage: number;\n currentTermStart: string;\n currentTermEnd: string;\n };\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n return {\n ...data.data,\n subscription: data.subscription,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n return {\n /* Requires `ai.enabled=true` + license + no failed AI provider registration */\n isAvailable,\n /* `true` only when the license has the `cms-ai` entitlement to globally enable AI features.\n TODO: once all AI features are migrated to the providers architecture, consider removing this flag */\n isStrapiManagedAiEnabled,\n authorizeCustomProvider,\n /* Returns the status of each AI feature, flagging which are enabled. */\n getAiFeatureConfig,\n getAiToken,\n getAiUsage,\n };\n};\n\nexport { createAiAdminService };\n"],"names":["STRAPI_MANAGED_AI_LICENSE_FEATURE","CUSTOM_AI_PROVIDER_LICENSE_FEATURE","createAiAdminService","strapi","aiTokenCache","Map","isCustomProviderRejected","isConfigEnabled","config","get","isAvailable","ee","isEE","isStrapiManagedAiEnabled","features","isEnabled","authorizeCustomProvider","log","info","warn","isPluginAiFeatureConfigured","plugin","service","aiService","getAiFeatureConfig","isAiI18nConfigured","isAiMediaLibraryConfigured","Promise","all","resolveAiContext","errorPrefix","error","Error","replace","eeLicense","process","env","STRAPI_LICENSE","licensePath","path","join","dirs","app","root","fs","readFileSync","toString","projectId","aiServerUrl","STRAPI_AI_URL","getAiToken","ERROR_PREFIX","user","requestContext","state","userIdentifier","id","cacheKey","cachedToken","now","Date","bufferMs","expiresAtMs","token","expiresAt","delete","http","response","fetch","method","headers","crypto","randomUUID","body","JSON","stringify","ok","errorData","errorText","text","parse","status","statusText","data","json","parseError","jwt","userId","getTime","set","fetchError","name","getAiUsage","eeKey","subscription"],"mappings":"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"}
@@ -20,6 +20,16 @@ const isUsingTypeScript = (...args)=>{
20
20
  }
21
21
  return lazyTsUtils.isUsingTypeScript(...args);
22
22
  };
23
+ // Core plugins are always enabled, so they are omitted from the plugins list.
24
+ const CORE_PLUGINS = new Set([
25
+ 'content-manager',
26
+ 'content-type-builder',
27
+ 'email',
28
+ 'upload',
29
+ 'i18n',
30
+ 'content-releases',
31
+ 'review-workflows'
32
+ ]);
23
33
  /**
24
34
  * A set of functions called "actions" for `Admin`
25
35
  */ var admin = {
@@ -139,18 +149,7 @@ const isUsingTypeScript = (...args)=>{
139
149
  },
140
150
  async plugins (ctx) {
141
151
  const enabledPlugins = strapi.config.get('enabledPlugins');
142
- // List of core plugins that are always enabled,
143
- // and so it's not necessary to display them in the plugins list
144
- const CORE_PLUGINS = [
145
- 'content-manager',
146
- 'content-type-builder',
147
- 'email',
148
- 'upload',
149
- 'i18n',
150
- 'content-releases',
151
- 'review-workflows'
152
- ];
153
- const plugins = Object.entries(enabledPlugins).filter(([key])=>!CORE_PLUGINS.includes(key)).map(([key, plugin])=>({
152
+ const plugins = Object.entries(enabledPlugins).filter(([key])=>!CORE_PLUGINS.has(key)).map(([key, plugin])=>({
154
153
  name: plugin.info.name || key,
155
154
  displayName: plugin.info.displayName || plugin.info.name || key,
156
155
  description: plugin.info.description || '',
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n GetProjectType,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n DebugDump,\n} from '../../../shared/contracts/admin';\n\n// Lazy: only resolved on first GET /admin/project-type request\ntype TsUtilsModule = typeof import('@strapi/typescript-utils');\nlet lazyTsUtils: TsUtilsModule | undefined;\nconst isUsingTypeScript: TsUtilsModule['isUsingTypeScript'] = (\n ...args: Parameters<TsUtilsModule['isUsingTypeScript']>\n) => {\n if (!lazyTsUtils) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n lazyTsUtils = require('@strapi/typescript-utils');\n }\n return (lazyTsUtils as TsUtilsModule).isUsingTypeScript(...args);\n};\n\n/**\n * A set of functions called \"actions\" for `Admin`\n */\nexport default {\n // TODO very temporary to check the switch ee/ce\n // When removing this we need to update the /admin/src/index.js file\n // whe,re we set the strapi.window.isEE value\n\n // NOTE: admin/ee/server overrides this controller, and adds the EE features\n // This returns an empty feature list for CE\n async getProjectType(): Promise<GetProjectType.Response> {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, isTrial: false, features: [], flags, ai: { enabled: false } } };\n },\n\n async init() {\n let uuid = strapi.config.get('uuid', false);\n const hasAdmin = await getService('user').exists();\n const { menuLogo, authLogo } = await getService('project-settings').getProjectSettings();\n // set to null if telemetryDisabled flag not avaialble in package.json\n const telemetryDisabled: boolean | null = strapi.config.get(\n 'packageJsonStrapi.telemetryDisabled',\n null\n );\n\n if (telemetryDisabled !== null && telemetryDisabled === true) {\n uuid = false;\n }\n\n return {\n data: {\n uuid,\n hasAdmin,\n menuLogo: menuLogo ? menuLogo.url : null,\n authLogo: authLogo ? authLogo.url : null,\n },\n } satisfies Init.Response;\n },\n\n async getProjectSettings() {\n return getService(\n 'project-settings'\n ).getProjectSettings() satisfies Promise<GetProjectSettings.Response>;\n },\n\n async updateProjectSettings(ctx: Context) {\n const {\n request: { files, body },\n } = ctx as { request: UpdateProjectSettings.Request };\n\n const projectSettingsService = getService('project-settings');\n\n await validateUpdateProjectSettings(body);\n await validateUpdateProjectSettingsFiles(files);\n\n const formatedFiles = await projectSettingsService.parseFilesData(files);\n await validateUpdateProjectSettingsImagesDimensions(formatedFiles);\n\n return projectSettingsService.updateProjectSettings({\n ...body,\n ...formatedFiles,\n }) satisfies Promise<UpdateProjectSettings.Response>;\n },\n\n async telemetryProperties(ctx: Context) {\n // If the telemetry is disabled, ignore the request and return early\n if (strapi.telemetry.isDisabled) {\n ctx.status = 204;\n return;\n }\n\n const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);\n const useTypescriptOnAdmin = await isUsingTypeScript(\n path.join(strapi.dirs.app.root, 'src', 'admin')\n );\n const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return Object.values(strapi.contentTypes)\n .flatMap((contentType: Struct.ContentTypeSchema) => Object.values(contentType.attributes))\n .filter((attribute) => attribute.type === 'dynamiczone').length;\n };\n\n const getNumberOfFolders = async (): Promise<number> => {\n try {\n const contentStructure = strapi.get('content-structure') as\n | { countGroups?: () => Promise<number> }\n | undefined;\n\n return (await contentStructure?.countGroups?.()) ?? 0;\n } catch {\n return 0;\n }\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n numberOfAllContentTypes, // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n numberOfComponents,\n numberOfDynamicZones: getNumberOfDynamicZones(),\n numberOfContentTypeFolders: await getNumberOfFolders(),\n },\n } satisfies TelemetryProperties.Response;\n },\n\n async information() {\n const currentEnvironment: string = strapi.config.get('environment');\n const autoReload = strapi.config.get('autoReload', false);\n const strapiVersion = strapi.config.get('info.strapi', null);\n const dependencies = strapi.config.get('info.dependencies', {});\n const projectId = strapi.config.get('uuid', null);\n const nodeVersion = process.version;\n const communityEdition = !strapi.EE;\n const useYarn: boolean = await exists(path.join(process.cwd(), 'yarn.lock'));\n\n return {\n data: {\n currentEnvironment,\n autoReload,\n strapiVersion,\n dependencies,\n projectId,\n nodeVersion,\n communityEdition,\n useYarn,\n },\n } satisfies Information.Response;\n },\n\n async debugDump() {\n const data = await getService('debug-dump').generate();\n\n return { data } satisfies DebugDump.Response;\n },\n\n async plugins(ctx: Context) {\n const enabledPlugins = strapi.config.get('enabledPlugins') as any;\n\n // List of core plugins that are always enabled,\n // and so it's not necessary to display them in the plugins list\n const CORE_PLUGINS = [\n 'content-manager',\n 'content-type-builder',\n 'email',\n 'upload',\n 'i18n',\n 'content-releases',\n 'review-workflows',\n ];\n\n const plugins = Object.entries(enabledPlugins)\n .filter(([key]: any) => !CORE_PLUGINS.includes(key))\n .map(([key, plugin]: any) => ({\n name: plugin.info.name || key,\n displayName: plugin.info.displayName || plugin.info.name || key,\n description: plugin.info.description || '',\n packageName: plugin.info.packageName,\n }));\n\n ctx.send({ plugins } satisfies Plugins.Response);\n },\n\n async licenseTrialTimeLeft() {\n const data = await strapi.ee.getTrialEndDate({\n strapi,\n });\n\n return data;\n },\n\n async getGuidedTourMeta(ctx: Context) {\n const isFirstSuperAdminUser = await getService('user').isFirstSuperAdminUser(ctx.state.user.id);\n\n return {\n data: {\n isFirstSuperAdminUser,\n schemas: strapi.contentTypes,\n },\n } satisfies GetGuidedTourMeta.Response;\n },\n};\n"],"names":["lazyTsUtils","isUsingTypeScript","args","require","getProjectType","flags","strapi","config","get","data","isEE","isTrial","features","ai","enabled","init","uuid","hasAdmin","getService","exists","menuLogo","authLogo","getProjectSettings","telemetryDisabled","url","updateProjectSettings","ctx","request","files","body","projectSettingsService","validateUpdateProjectSettings","validateUpdateProjectSettingsFiles","formatedFiles","parseFilesData","validateUpdateProjectSettingsImagesDimensions","telemetryProperties","telemetry","isDisabled","status","useTypescriptOnServer","dirs","app","root","useTypescriptOnAdmin","path","join","isHostedOnStrapiCloud","env","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","Object","values","flatMap","contentType","attributes","filter","attribute","type","length","getNumberOfFolders","contentStructure","countGroups","numberOfDynamicZones","numberOfContentTypeFolders","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","debugDump","generate","plugins","enabledPlugins","CORE_PLUGINS","entries","key","includes","map","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":"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"}
1
+ {"version":3,"file":"admin.js","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n GetProjectType,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n DebugDump,\n} from '../../../shared/contracts/admin';\n\n// Lazy: only resolved on first GET /admin/project-type request\ntype TsUtilsModule = typeof import('@strapi/typescript-utils');\nlet lazyTsUtils: TsUtilsModule | undefined;\nconst isUsingTypeScript: TsUtilsModule['isUsingTypeScript'] = (\n ...args: Parameters<TsUtilsModule['isUsingTypeScript']>\n) => {\n if (!lazyTsUtils) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n lazyTsUtils = require('@strapi/typescript-utils');\n }\n return (lazyTsUtils as TsUtilsModule).isUsingTypeScript(...args);\n};\n\n// Core plugins are always enabled, so they are omitted from the plugins list.\nconst CORE_PLUGINS = new Set([\n 'content-manager',\n 'content-type-builder',\n 'email',\n 'upload',\n 'i18n',\n 'content-releases',\n 'review-workflows',\n]);\n\n/**\n * A set of functions called \"actions\" for `Admin`\n */\nexport default {\n // TODO very temporary to check the switch ee/ce\n // When removing this we need to update the /admin/src/index.js file\n // whe,re we set the strapi.window.isEE value\n\n // NOTE: admin/ee/server overrides this controller, and adds the EE features\n // This returns an empty feature list for CE\n async getProjectType(): Promise<GetProjectType.Response> {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, isTrial: false, features: [], flags, ai: { enabled: false } } };\n },\n\n async init() {\n let uuid = strapi.config.get('uuid', false);\n const hasAdmin = await getService('user').exists();\n const { menuLogo, authLogo } = await getService('project-settings').getProjectSettings();\n // set to null if telemetryDisabled flag not avaialble in package.json\n const telemetryDisabled: boolean | null = strapi.config.get(\n 'packageJsonStrapi.telemetryDisabled',\n null\n );\n\n if (telemetryDisabled !== null && telemetryDisabled === true) {\n uuid = false;\n }\n\n return {\n data: {\n uuid,\n hasAdmin,\n menuLogo: menuLogo ? menuLogo.url : null,\n authLogo: authLogo ? authLogo.url : null,\n },\n } satisfies Init.Response;\n },\n\n async getProjectSettings() {\n return getService(\n 'project-settings'\n ).getProjectSettings() satisfies Promise<GetProjectSettings.Response>;\n },\n\n async updateProjectSettings(ctx: Context) {\n const {\n request: { files, body },\n } = ctx as { request: UpdateProjectSettings.Request };\n\n const projectSettingsService = getService('project-settings');\n\n await validateUpdateProjectSettings(body);\n await validateUpdateProjectSettingsFiles(files);\n\n const formatedFiles = await projectSettingsService.parseFilesData(files);\n await validateUpdateProjectSettingsImagesDimensions(formatedFiles);\n\n return projectSettingsService.updateProjectSettings({\n ...body,\n ...formatedFiles,\n }) satisfies Promise<UpdateProjectSettings.Response>;\n },\n\n async telemetryProperties(ctx: Context) {\n // If the telemetry is disabled, ignore the request and return early\n if (strapi.telemetry.isDisabled) {\n ctx.status = 204;\n return;\n }\n\n const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);\n const useTypescriptOnAdmin = await isUsingTypeScript(\n path.join(strapi.dirs.app.root, 'src', 'admin')\n );\n const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return Object.values(strapi.contentTypes)\n .flatMap((contentType: Struct.ContentTypeSchema) => Object.values(contentType.attributes))\n .filter((attribute) => attribute.type === 'dynamiczone').length;\n };\n\n const getNumberOfFolders = async (): Promise<number> => {\n try {\n const contentStructure = strapi.get('content-structure') as\n { countGroups?: () => Promise<number> } | undefined;\n\n return (await contentStructure?.countGroups?.()) ?? 0;\n } catch {\n return 0;\n }\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n numberOfAllContentTypes, // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n numberOfComponents,\n numberOfDynamicZones: getNumberOfDynamicZones(),\n numberOfContentTypeFolders: await getNumberOfFolders(),\n },\n } satisfies TelemetryProperties.Response;\n },\n\n async information() {\n const currentEnvironment: string = strapi.config.get('environment');\n const autoReload = strapi.config.get('autoReload', false);\n const strapiVersion = strapi.config.get('info.strapi', null);\n const dependencies = strapi.config.get('info.dependencies', {});\n const projectId = strapi.config.get('uuid', null);\n const nodeVersion = process.version;\n const communityEdition = !strapi.EE;\n const useYarn: boolean = await exists(path.join(process.cwd(), 'yarn.lock'));\n\n return {\n data: {\n currentEnvironment,\n autoReload,\n strapiVersion,\n dependencies,\n projectId,\n nodeVersion,\n communityEdition,\n useYarn,\n },\n } satisfies Information.Response;\n },\n\n async debugDump() {\n const data = await getService('debug-dump').generate();\n\n return { data } satisfies DebugDump.Response;\n },\n\n async plugins(ctx: Context) {\n const enabledPlugins = strapi.config.get('enabledPlugins') as any;\n\n const plugins = Object.entries(enabledPlugins)\n .filter(([key]: any) => !CORE_PLUGINS.has(key))\n .map(([key, plugin]: any) => ({\n name: plugin.info.name || key,\n displayName: plugin.info.displayName || plugin.info.name || key,\n description: plugin.info.description || '',\n packageName: plugin.info.packageName,\n }));\n\n ctx.send({ plugins } satisfies Plugins.Response);\n },\n\n async licenseTrialTimeLeft() {\n const data = await strapi.ee.getTrialEndDate({\n strapi,\n });\n\n return data;\n },\n\n async getGuidedTourMeta(ctx: Context) {\n const isFirstSuperAdminUser = await getService('user').isFirstSuperAdminUser(ctx.state.user.id);\n\n return {\n data: {\n isFirstSuperAdminUser,\n schemas: strapi.contentTypes,\n },\n } satisfies GetGuidedTourMeta.Response;\n },\n};\n"],"names":["lazyTsUtils","isUsingTypeScript","args","require","CORE_PLUGINS","Set","getProjectType","flags","strapi","config","get","data","isEE","isTrial","features","ai","enabled","init","uuid","hasAdmin","getService","exists","menuLogo","authLogo","getProjectSettings","telemetryDisabled","url","updateProjectSettings","ctx","request","files","body","projectSettingsService","validateUpdateProjectSettings","validateUpdateProjectSettingsFiles","formatedFiles","parseFilesData","validateUpdateProjectSettingsImagesDimensions","telemetryProperties","telemetry","isDisabled","status","useTypescriptOnServer","dirs","app","root","useTypescriptOnAdmin","path","join","isHostedOnStrapiCloud","env","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","Object","values","flatMap","contentType","attributes","filter","attribute","type","length","getNumberOfFolders","contentStructure","countGroups","numberOfDynamicZones","numberOfContentTypeFolders","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","debugDump","generate","plugins","enabledPlugins","entries","key","has","map","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":"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"}
@@ -13,6 +13,16 @@ const isUsingTypeScript = (...args)=>{
13
13
  }
14
14
  return lazyTsUtils.isUsingTypeScript(...args);
15
15
  };
16
+ // Core plugins are always enabled, so they are omitted from the plugins list.
17
+ const CORE_PLUGINS = new Set([
18
+ 'content-manager',
19
+ 'content-type-builder',
20
+ 'email',
21
+ 'upload',
22
+ 'i18n',
23
+ 'content-releases',
24
+ 'review-workflows'
25
+ ]);
16
26
  /**
17
27
  * A set of functions called "actions" for `Admin`
18
28
  */ var admin = {
@@ -132,18 +142,7 @@ const isUsingTypeScript = (...args)=>{
132
142
  },
133
143
  async plugins (ctx) {
134
144
  const enabledPlugins = strapi.config.get('enabledPlugins');
135
- // List of core plugins that are always enabled,
136
- // and so it's not necessary to display them in the plugins list
137
- const CORE_PLUGINS = [
138
- 'content-manager',
139
- 'content-type-builder',
140
- 'email',
141
- 'upload',
142
- 'i18n',
143
- 'content-releases',
144
- 'review-workflows'
145
- ];
146
- const plugins = Object.entries(enabledPlugins).filter(([key])=>!CORE_PLUGINS.includes(key)).map(([key, plugin])=>({
145
+ const plugins = Object.entries(enabledPlugins).filter(([key])=>!CORE_PLUGINS.has(key)).map(([key, plugin])=>({
147
146
  name: plugin.info.name || key,
148
147
  displayName: plugin.info.displayName || plugin.info.name || key,
149
148
  description: plugin.info.description || '',
@@ -1 +1 @@
1
- {"version":3,"file":"admin.mjs","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n GetProjectType,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n DebugDump,\n} from '../../../shared/contracts/admin';\n\n// Lazy: only resolved on first GET /admin/project-type request\ntype TsUtilsModule = typeof import('@strapi/typescript-utils');\nlet lazyTsUtils: TsUtilsModule | undefined;\nconst isUsingTypeScript: TsUtilsModule['isUsingTypeScript'] = (\n ...args: Parameters<TsUtilsModule['isUsingTypeScript']>\n) => {\n if (!lazyTsUtils) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n lazyTsUtils = require('@strapi/typescript-utils');\n }\n return (lazyTsUtils as TsUtilsModule).isUsingTypeScript(...args);\n};\n\n/**\n * A set of functions called \"actions\" for `Admin`\n */\nexport default {\n // TODO very temporary to check the switch ee/ce\n // When removing this we need to update the /admin/src/index.js file\n // whe,re we set the strapi.window.isEE value\n\n // NOTE: admin/ee/server overrides this controller, and adds the EE features\n // This returns an empty feature list for CE\n async getProjectType(): Promise<GetProjectType.Response> {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, isTrial: false, features: [], flags, ai: { enabled: false } } };\n },\n\n async init() {\n let uuid = strapi.config.get('uuid', false);\n const hasAdmin = await getService('user').exists();\n const { menuLogo, authLogo } = await getService('project-settings').getProjectSettings();\n // set to null if telemetryDisabled flag not avaialble in package.json\n const telemetryDisabled: boolean | null = strapi.config.get(\n 'packageJsonStrapi.telemetryDisabled',\n null\n );\n\n if (telemetryDisabled !== null && telemetryDisabled === true) {\n uuid = false;\n }\n\n return {\n data: {\n uuid,\n hasAdmin,\n menuLogo: menuLogo ? menuLogo.url : null,\n authLogo: authLogo ? authLogo.url : null,\n },\n } satisfies Init.Response;\n },\n\n async getProjectSettings() {\n return getService(\n 'project-settings'\n ).getProjectSettings() satisfies Promise<GetProjectSettings.Response>;\n },\n\n async updateProjectSettings(ctx: Context) {\n const {\n request: { files, body },\n } = ctx as { request: UpdateProjectSettings.Request };\n\n const projectSettingsService = getService('project-settings');\n\n await validateUpdateProjectSettings(body);\n await validateUpdateProjectSettingsFiles(files);\n\n const formatedFiles = await projectSettingsService.parseFilesData(files);\n await validateUpdateProjectSettingsImagesDimensions(formatedFiles);\n\n return projectSettingsService.updateProjectSettings({\n ...body,\n ...formatedFiles,\n }) satisfies Promise<UpdateProjectSettings.Response>;\n },\n\n async telemetryProperties(ctx: Context) {\n // If the telemetry is disabled, ignore the request and return early\n if (strapi.telemetry.isDisabled) {\n ctx.status = 204;\n return;\n }\n\n const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);\n const useTypescriptOnAdmin = await isUsingTypeScript(\n path.join(strapi.dirs.app.root, 'src', 'admin')\n );\n const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return Object.values(strapi.contentTypes)\n .flatMap((contentType: Struct.ContentTypeSchema) => Object.values(contentType.attributes))\n .filter((attribute) => attribute.type === 'dynamiczone').length;\n };\n\n const getNumberOfFolders = async (): Promise<number> => {\n try {\n const contentStructure = strapi.get('content-structure') as\n | { countGroups?: () => Promise<number> }\n | undefined;\n\n return (await contentStructure?.countGroups?.()) ?? 0;\n } catch {\n return 0;\n }\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n numberOfAllContentTypes, // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n numberOfComponents,\n numberOfDynamicZones: getNumberOfDynamicZones(),\n numberOfContentTypeFolders: await getNumberOfFolders(),\n },\n } satisfies TelemetryProperties.Response;\n },\n\n async information() {\n const currentEnvironment: string = strapi.config.get('environment');\n const autoReload = strapi.config.get('autoReload', false);\n const strapiVersion = strapi.config.get('info.strapi', null);\n const dependencies = strapi.config.get('info.dependencies', {});\n const projectId = strapi.config.get('uuid', null);\n const nodeVersion = process.version;\n const communityEdition = !strapi.EE;\n const useYarn: boolean = await exists(path.join(process.cwd(), 'yarn.lock'));\n\n return {\n data: {\n currentEnvironment,\n autoReload,\n strapiVersion,\n dependencies,\n projectId,\n nodeVersion,\n communityEdition,\n useYarn,\n },\n } satisfies Information.Response;\n },\n\n async debugDump() {\n const data = await getService('debug-dump').generate();\n\n return { data } satisfies DebugDump.Response;\n },\n\n async plugins(ctx: Context) {\n const enabledPlugins = strapi.config.get('enabledPlugins') as any;\n\n // List of core plugins that are always enabled,\n // and so it's not necessary to display them in the plugins list\n const CORE_PLUGINS = [\n 'content-manager',\n 'content-type-builder',\n 'email',\n 'upload',\n 'i18n',\n 'content-releases',\n 'review-workflows',\n ];\n\n const plugins = Object.entries(enabledPlugins)\n .filter(([key]: any) => !CORE_PLUGINS.includes(key))\n .map(([key, plugin]: any) => ({\n name: plugin.info.name || key,\n displayName: plugin.info.displayName || plugin.info.name || key,\n description: plugin.info.description || '',\n packageName: plugin.info.packageName,\n }));\n\n ctx.send({ plugins } satisfies Plugins.Response);\n },\n\n async licenseTrialTimeLeft() {\n const data = await strapi.ee.getTrialEndDate({\n strapi,\n });\n\n return data;\n },\n\n async getGuidedTourMeta(ctx: Context) {\n const isFirstSuperAdminUser = await getService('user').isFirstSuperAdminUser(ctx.state.user.id);\n\n return {\n data: {\n isFirstSuperAdminUser,\n schemas: strapi.contentTypes,\n },\n } satisfies GetGuidedTourMeta.Response;\n },\n};\n"],"names":["lazyTsUtils","isUsingTypeScript","args","require","getProjectType","flags","strapi","config","get","data","isEE","isTrial","features","ai","enabled","init","uuid","hasAdmin","getService","exists","menuLogo","authLogo","getProjectSettings","telemetryDisabled","url","updateProjectSettings","ctx","request","files","body","projectSettingsService","validateUpdateProjectSettings","validateUpdateProjectSettingsFiles","formatedFiles","parseFilesData","validateUpdateProjectSettingsImagesDimensions","telemetryProperties","telemetry","isDisabled","status","useTypescriptOnServer","dirs","app","root","useTypescriptOnAdmin","path","join","isHostedOnStrapiCloud","env","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","Object","values","flatMap","contentType","attributes","filter","attribute","type","length","getNumberOfFolders","contentStructure","countGroups","numberOfDynamicZones","numberOfContentTypeFolders","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","debugDump","generate","plugins","enabledPlugins","CORE_PLUGINS","entries","key","includes","map","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":";;;;;;;AA6BA,IAAIA,WAAAA;AACJ,MAAMC,iBAAAA,GAAwD,CAC5D,GAAGC,IAAAA,GAAAA;AAEH,IAAA,IAAI,CAACF,WAAAA,EAAa;;AAEhBA,QAAAA,WAAAA,GAAcG,OAAAA,CAAQ,0BAAA,CAAA;AACxB,IAAA;IACA,OAAQH,WAAAA,CAA8BC,iBAAiB,CAAA,GAAIC,IAAAA,CAAAA;AAC7D,CAAA;AAEA;;AAEC,IACD,YAAe;;;;;;IAOb,MAAME,cAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,QAAQC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAe,EAAC,CAAA;QAChD,OAAO;YAAEC,IAAAA,EAAM;gBAAEC,IAAAA,EAAM,KAAA;gBAAOC,OAAAA,EAAS,KAAA;AAAOC,gBAAAA,QAAAA,EAAU,EAAE;AAAEP,gBAAAA,KAAAA;gBAAOQ,EAAAA,EAAI;oBAAEC,OAAAA,EAAS;AAAM;AAAE;AAAE,SAAA;AAC9F,IAAA,CAAA;IAEA,MAAMC,IAAAA,CAAAA,GAAAA;AACJ,QAAA,IAAIC,OAAOV,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,MAAA,EAAQ,KAAA,CAAA;AACrC,QAAA,MAAMS,QAAAA,GAAW,MAAMC,UAAAA,CAAW,MAAA,CAAA,CAAQC,MAAM,EAAA;QAChD,MAAM,EAAEC,QAAQ,EAAEC,QAAQ,EAAE,GAAG,MAAMH,UAAAA,CAAW,kBAAA,CAAA,CAAoBI,kBAAkB,EAAA;;AAEtF,QAAA,MAAMC,oBAAoCjB,MAAAA,CAAOC,MAAM,CAACC,GAAG,CACzD,qCAAA,EACA,IAAA,CAAA;QAGF,IAAIe,iBAAAA,KAAsB,IAAA,IAAQA,iBAAAA,KAAsB,IAAA,EAAM;YAC5DP,IAAAA,GAAO,KAAA;AACT,QAAA;QAEA,OAAO;YACLP,IAAAA,EAAM;AACJO,gBAAAA,IAAAA;AACAC,gBAAAA,QAAAA;gBACAG,QAAAA,EAAUA,QAAAA,GAAWA,QAAAA,CAASI,GAAG,GAAG,IAAA;gBACpCH,QAAAA,EAAUA,QAAAA,GAAWA,QAAAA,CAASG,GAAG,GAAG;AACtC;AACF,SAAA;AACF,IAAA,CAAA;IAEA,MAAMF,kBAAAA,CAAAA,GAAAA;QACJ,OAAOJ,UAAAA,CACL,oBACAI,kBAAkB,EAAA;AACtB,IAAA,CAAA;AAEA,IAAA,MAAMG,uBAAsBC,GAAY,EAAA;QACtC,MAAM,EACJC,SAAS,EAAEC,KAAK,EAAEC,IAAI,EAAE,EACzB,GAAGH,GAAAA;AAEJ,QAAA,MAAMI,yBAAyBZ,UAAAA,CAAW,kBAAA,CAAA;AAE1C,QAAA,MAAMa,6BAAAA,CAA8BF,IAAAA,CAAAA;AACpC,QAAA,MAAMG,kCAAAA,CAAmCJ,KAAAA,CAAAA;AAEzC,QAAA,MAAMK,aAAAA,GAAgB,MAAMH,sBAAAA,CAAuBI,cAAc,CAACN,KAAAA,CAAAA;AAClE,QAAA,MAAMO,6CAAAA,CAA8CF,aAAAA,CAAAA;QAEpD,OAAOH,sBAAAA,CAAuBL,qBAAqB,CAAC;AAClD,YAAA,GAAGI,IAAI;AACP,YAAA,GAAGI;AACL,SAAA,CAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMG,qBAAoBV,GAAY,EAAA;;AAEpC,QAAA,IAAIpB,MAAAA,CAAO+B,SAAS,CAACC,UAAU,EAAE;AAC/BZ,YAAAA,GAAAA,CAAIa,MAAM,GAAG,GAAA;AACb,YAAA;AACF,QAAA;QAEA,MAAMC,qBAAAA,GAAwB,MAAMvC,iBAAAA,CAAkBK,MAAAA,CAAOmC,IAAI,CAACC,GAAG,CAACC,IAAI,CAAA;AAC1E,QAAA,MAAMC,oBAAAA,GAAuB,MAAM3C,iBAAAA,CACjC4C,IAAAA,CAAKC,IAAI,CAACxC,MAAAA,CAAOmC,IAAI,CAACC,GAAG,CAACC,IAAI,EAAE,KAAA,EAAO,OAAA,CAAA,CAAA;QAEzC,MAAMI,qBAAAA,GAAwBC,GAAAA,CAAI,gBAAA,EAAkB,IAAA,CAAA,KAAU,cAAA;AAE9D,QAAA,MAAMC,uBAAAA,GAA0BC,UAAAA,CAAEC,IAAI,CAAC7C,OAAO8C,YAAY,CAAA;AAC1D,QAAA,MAAMC,kBAAAA,GAAqBH,UAAAA,CAAEC,IAAI,CAAC7C,OAAOgD,UAAU,CAAA;AAEnD,QAAA,MAAMC,uBAAAA,GAA0B,IAAA;YAC9B,OAAOC,MAAAA,CAAOC,MAAM,CAACnD,MAAAA,CAAO8C,YAAY,EACrCM,OAAO,CAAC,CAACC,WAAAA,GAA0CH,MAAAA,CAAOC,MAAM,CAACE,WAAAA,CAAYC,UAAU,CAAA,CAAA,CACvFC,MAAM,CAAC,CAACC,YAAcA,SAAAA,CAAUC,IAAI,KAAK,aAAA,CAAA,CAAeC,MAAM;AACnE,QAAA,CAAA;AAEA,QAAA,MAAMC,kBAAAA,GAAqB,UAAA;YACzB,IAAI;gBACF,MAAMC,gBAAAA,GAAmB5D,MAAAA,CAAOE,GAAG,CAAC,mBAAA,CAAA;gBAIpC,OAAQ,MAAM0D,gBAAAA,EAAkBC,WAAAA,IAAAA,IAAoB,CAAA;AACtD,YAAA,CAAA,CAAE,OAAM;gBACN,OAAO,CAAA;AACT,YAAA;AACF,QAAA,CAAA;QAEA,OAAO;YACL1D,IAAAA,EAAM;AACJ+B,gBAAAA,qBAAAA;AACAI,gBAAAA,oBAAAA;AACAG,gBAAAA,qBAAAA;AACAE,gBAAAA,uBAAAA;AACAI,gBAAAA,kBAAAA;gBACAe,oBAAAA,EAAsBb,uBAAAA,EAAAA;AACtBc,gBAAAA,0BAAAA,EAA4B,MAAMJ,kBAAAA;AACpC;AACF,SAAA;AACF,IAAA,CAAA;IAEA,MAAMK,WAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,kBAAAA,GAA6BjE,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,aAAA,CAAA;AACrD,QAAA,MAAMgE,aAAalE,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,KAAA,CAAA;AACnD,QAAA,MAAMiE,gBAAgBnE,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,aAAA,EAAe,IAAA,CAAA;AACvD,QAAA,MAAMkE,eAAepE,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,qBAAqB,EAAC,CAAA;AAC7D,QAAA,MAAMmE,YAAYrE,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,MAAA,EAAQ,IAAA,CAAA;QAC5C,MAAMoE,WAAAA,GAAcC,QAAQC,OAAO;QACnC,MAAMC,gBAAAA,GAAmB,CAACzE,MAAAA,CAAO0E,EAAE;QACnC,MAAMC,OAAAA,GAAmB,MAAM9D,MAAAA,CAAO0B,IAAAA,CAAKC,IAAI,CAAC+B,OAAAA,CAAQK,GAAG,EAAA,EAAI,WAAA,CAAA,CAAA;QAE/D,OAAO;YACLzE,IAAAA,EAAM;AACJ8D,gBAAAA,kBAAAA;AACAC,gBAAAA,UAAAA;AACAC,gBAAAA,aAAAA;AACAC,gBAAAA,YAAAA;AACAC,gBAAAA,SAAAA;AACAC,gBAAAA,WAAAA;AACAG,gBAAAA,gBAAAA;AACAE,gBAAAA;AACF;AACF,SAAA;AACF,IAAA,CAAA;IAEA,MAAME,SAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAM1E,IAAAA,GAAO,MAAMS,UAAAA,CAAW,YAAA,CAAA,CAAckE,QAAQ,EAAA;QAEpD,OAAO;AAAE3E,YAAAA;AAAK,SAAA;AAChB,IAAA,CAAA;AAEA,IAAA,MAAM4E,SAAQ3D,GAAY,EAAA;AACxB,QAAA,MAAM4D,cAAAA,GAAiBhF,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,gBAAA,CAAA;;;AAIzC,QAAA,MAAM+E,YAAAA,GAAe;AACnB,YAAA,iBAAA;AACA,YAAA,sBAAA;AACA,YAAA,OAAA;AACA,YAAA,QAAA;AACA,YAAA,MAAA;AACA,YAAA,kBAAA;AACA,YAAA;AACD,SAAA;QAED,MAAMF,OAAAA,GAAU7B,OAAOgC,OAAO,CAACF,gBAC5BzB,MAAM,CAAC,CAAC,CAAC4B,GAAAA,CAAS,GAAK,CAACF,YAAAA,CAAaG,QAAQ,CAACD,GAAAA,CAAAA,CAAAA,CAC9CE,GAAG,CAAC,CAAC,CAACF,GAAAA,EAAKG,MAAAA,CAAY,IAAM;AAC5BC,gBAAAA,IAAAA,EAAMD,MAAAA,CAAOE,IAAI,CAACD,IAAI,IAAIJ,GAAAA;gBAC1BM,WAAAA,EAAaH,MAAAA,CAAOE,IAAI,CAACC,WAAW,IAAIH,MAAAA,CAAOE,IAAI,CAACD,IAAI,IAAIJ,GAAAA;AAC5DO,gBAAAA,WAAAA,EAAaJ,MAAAA,CAAOE,IAAI,CAACE,WAAW,IAAI,EAAA;gBACxCC,WAAAA,EAAaL,MAAAA,CAAOE,IAAI,CAACG;aAC3B,CAAA,CAAA;AAEFvE,QAAAA,GAAAA,CAAIwE,IAAI,CAAC;AAAEb,YAAAA;AAAQ,SAAA,CAAA;AACrB,IAAA,CAAA;IAEA,MAAMc,oBAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAM1F,OAAO,MAAMH,MAAAA,CAAO8F,EAAE,CAACC,eAAe,CAAC;AAC3C/F,YAAAA;AACF,SAAA,CAAA;QAEA,OAAOG,IAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAM6F,mBAAkB5E,GAAY,EAAA;QAClC,MAAM6E,qBAAAA,GAAwB,MAAMrF,UAAAA,CAAW,MAAA,CAAA,CAAQqF,qBAAqB,CAAC7E,GAAAA,CAAI8E,KAAK,CAACC,IAAI,CAACC,EAAE,CAAA;QAE9F,OAAO;YACLjG,IAAAA,EAAM;AACJ8F,gBAAAA,qBAAAA;AACAI,gBAAAA,OAAAA,EAASrG,OAAO8C;AAClB;AACF,SAAA;AACF,IAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"admin.mjs","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n GetProjectType,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n DebugDump,\n} from '../../../shared/contracts/admin';\n\n// Lazy: only resolved on first GET /admin/project-type request\ntype TsUtilsModule = typeof import('@strapi/typescript-utils');\nlet lazyTsUtils: TsUtilsModule | undefined;\nconst isUsingTypeScript: TsUtilsModule['isUsingTypeScript'] = (\n ...args: Parameters<TsUtilsModule['isUsingTypeScript']>\n) => {\n if (!lazyTsUtils) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n lazyTsUtils = require('@strapi/typescript-utils');\n }\n return (lazyTsUtils as TsUtilsModule).isUsingTypeScript(...args);\n};\n\n// Core plugins are always enabled, so they are omitted from the plugins list.\nconst CORE_PLUGINS = new Set([\n 'content-manager',\n 'content-type-builder',\n 'email',\n 'upload',\n 'i18n',\n 'content-releases',\n 'review-workflows',\n]);\n\n/**\n * A set of functions called \"actions\" for `Admin`\n */\nexport default {\n // TODO very temporary to check the switch ee/ce\n // When removing this we need to update the /admin/src/index.js file\n // whe,re we set the strapi.window.isEE value\n\n // NOTE: admin/ee/server overrides this controller, and adds the EE features\n // This returns an empty feature list for CE\n async getProjectType(): Promise<GetProjectType.Response> {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, isTrial: false, features: [], flags, ai: { enabled: false } } };\n },\n\n async init() {\n let uuid = strapi.config.get('uuid', false);\n const hasAdmin = await getService('user').exists();\n const { menuLogo, authLogo } = await getService('project-settings').getProjectSettings();\n // set to null if telemetryDisabled flag not avaialble in package.json\n const telemetryDisabled: boolean | null = strapi.config.get(\n 'packageJsonStrapi.telemetryDisabled',\n null\n );\n\n if (telemetryDisabled !== null && telemetryDisabled === true) {\n uuid = false;\n }\n\n return {\n data: {\n uuid,\n hasAdmin,\n menuLogo: menuLogo ? menuLogo.url : null,\n authLogo: authLogo ? authLogo.url : null,\n },\n } satisfies Init.Response;\n },\n\n async getProjectSettings() {\n return getService(\n 'project-settings'\n ).getProjectSettings() satisfies Promise<GetProjectSettings.Response>;\n },\n\n async updateProjectSettings(ctx: Context) {\n const {\n request: { files, body },\n } = ctx as { request: UpdateProjectSettings.Request };\n\n const projectSettingsService = getService('project-settings');\n\n await validateUpdateProjectSettings(body);\n await validateUpdateProjectSettingsFiles(files);\n\n const formatedFiles = await projectSettingsService.parseFilesData(files);\n await validateUpdateProjectSettingsImagesDimensions(formatedFiles);\n\n return projectSettingsService.updateProjectSettings({\n ...body,\n ...formatedFiles,\n }) satisfies Promise<UpdateProjectSettings.Response>;\n },\n\n async telemetryProperties(ctx: Context) {\n // If the telemetry is disabled, ignore the request and return early\n if (strapi.telemetry.isDisabled) {\n ctx.status = 204;\n return;\n }\n\n const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);\n const useTypescriptOnAdmin = await isUsingTypeScript(\n path.join(strapi.dirs.app.root, 'src', 'admin')\n );\n const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return Object.values(strapi.contentTypes)\n .flatMap((contentType: Struct.ContentTypeSchema) => Object.values(contentType.attributes))\n .filter((attribute) => attribute.type === 'dynamiczone').length;\n };\n\n const getNumberOfFolders = async (): Promise<number> => {\n try {\n const contentStructure = strapi.get('content-structure') as\n { countGroups?: () => Promise<number> } | undefined;\n\n return (await contentStructure?.countGroups?.()) ?? 0;\n } catch {\n return 0;\n }\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n numberOfAllContentTypes, // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n numberOfComponents,\n numberOfDynamicZones: getNumberOfDynamicZones(),\n numberOfContentTypeFolders: await getNumberOfFolders(),\n },\n } satisfies TelemetryProperties.Response;\n },\n\n async information() {\n const currentEnvironment: string = strapi.config.get('environment');\n const autoReload = strapi.config.get('autoReload', false);\n const strapiVersion = strapi.config.get('info.strapi', null);\n const dependencies = strapi.config.get('info.dependencies', {});\n const projectId = strapi.config.get('uuid', null);\n const nodeVersion = process.version;\n const communityEdition = !strapi.EE;\n const useYarn: boolean = await exists(path.join(process.cwd(), 'yarn.lock'));\n\n return {\n data: {\n currentEnvironment,\n autoReload,\n strapiVersion,\n dependencies,\n projectId,\n nodeVersion,\n communityEdition,\n useYarn,\n },\n } satisfies Information.Response;\n },\n\n async debugDump() {\n const data = await getService('debug-dump').generate();\n\n return { data } satisfies DebugDump.Response;\n },\n\n async plugins(ctx: Context) {\n const enabledPlugins = strapi.config.get('enabledPlugins') as any;\n\n const plugins = Object.entries(enabledPlugins)\n .filter(([key]: any) => !CORE_PLUGINS.has(key))\n .map(([key, plugin]: any) => ({\n name: plugin.info.name || key,\n displayName: plugin.info.displayName || plugin.info.name || key,\n description: plugin.info.description || '',\n packageName: plugin.info.packageName,\n }));\n\n ctx.send({ plugins } satisfies Plugins.Response);\n },\n\n async licenseTrialTimeLeft() {\n const data = await strapi.ee.getTrialEndDate({\n strapi,\n });\n\n return data;\n },\n\n async getGuidedTourMeta(ctx: Context) {\n const isFirstSuperAdminUser = await getService('user').isFirstSuperAdminUser(ctx.state.user.id);\n\n return {\n data: {\n isFirstSuperAdminUser,\n schemas: strapi.contentTypes,\n },\n } satisfies GetGuidedTourMeta.Response;\n },\n};\n"],"names":["lazyTsUtils","isUsingTypeScript","args","require","CORE_PLUGINS","Set","getProjectType","flags","strapi","config","get","data","isEE","isTrial","features","ai","enabled","init","uuid","hasAdmin","getService","exists","menuLogo","authLogo","getProjectSettings","telemetryDisabled","url","updateProjectSettings","ctx","request","files","body","projectSettingsService","validateUpdateProjectSettings","validateUpdateProjectSettingsFiles","formatedFiles","parseFilesData","validateUpdateProjectSettingsImagesDimensions","telemetryProperties","telemetry","isDisabled","status","useTypescriptOnServer","dirs","app","root","useTypescriptOnAdmin","path","join","isHostedOnStrapiCloud","env","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","Object","values","flatMap","contentType","attributes","filter","attribute","type","length","getNumberOfFolders","contentStructure","countGroups","numberOfDynamicZones","numberOfContentTypeFolders","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","debugDump","generate","plugins","enabledPlugins","entries","key","has","map","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../server/src/domain/permission/index.ts"],"sourcesContent":["import { objects, providerFactory } from '@strapi/utils';\nimport { pick, reject, merge, omit, get, curry } from 'lodash';\nimport type { Utils } from '@strapi/types';\n\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 'apiToken',\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 = (permission) =>\n pick(permission, 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 ? [...new Set(conditions.concat(condition))]\n : [condition];\n\n return { ...permission, conditions: newConditions };\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 {\n ...permission,\n conditions: reject(permission.conditions, (value) => value === condition),\n };\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(permission, `properties.${property}`)\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 objects.set(permission, `properties.${property}`, value);\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(permission, `properties.${property}` as string) 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 merge({}, getDefaultPermission(), pick(attributes, permissionFields)) 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 (!Array.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 (Array.isArray(payload)) {\n return Array.from(payload, (value) => create(value));\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","permission","pick","getDefaultPermission","actionParameters","conditions","properties","subject","addCondition","curry","condition","newConditions","Array","isArray","Set","concat","removeCondition","reject","value","getProperty","property","get","setProperty","objects","set","deleteProperty","omit","create","attributes","merge","sanitizeConditions","provider","filter","has","reduce","perm","toPermission","payload","from"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../server/src/domain/permission/index.ts"],"sourcesContent":["import { objects, providerFactory } from '@strapi/utils';\nimport { pick, reject, merge, omit, get, curry } from 'lodash';\nimport type { Utils } from '@strapi/types';\n\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 'apiToken',\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 = (permission) =>\n pick(permission, 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 ? [...new Set(conditions.concat(condition))]\n : [condition];\n\n return { ...permission, conditions: newConditions };\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 {\n ...permission,\n conditions: reject(permission.conditions, (value) => value === condition),\n };\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((property: string, permission: Permission): Permission =>\n get(permission, `properties.${property}`)\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 objects.set(permission, `properties.${property}`, value);\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(permission, `properties.${property}` as string) 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 merge({}, getDefaultPermission(), pick(attributes, permissionFields)) 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 (!Array.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 (Array.isArray(payload)) {\n return Array.from(payload, (value) => create(value));\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","permission","pick","getDefaultPermission","actionParameters","conditions","properties","subject","addCondition","curry","condition","newConditions","Array","isArray","Set","concat","removeCondition","reject","value","getProperty","property","get","setProperty","objects","set","deleteProperty","omit","create","attributes","merge","sanitizeConditions","provider","filter","has","reduce","perm","toPermission","payload","from"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../server/src/domain/permission/index.ts"],"sourcesContent":["import { objects, providerFactory } from '@strapi/utils';\nimport { pick, reject, merge, omit, get, curry } from 'lodash';\nimport type { Utils } from '@strapi/types';\n\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 'apiToken',\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 = (permission) =>\n pick(permission, 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 ? [...new Set(conditions.concat(condition))]\n : [condition];\n\n return { ...permission, conditions: newConditions };\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 {\n ...permission,\n conditions: reject(permission.conditions, (value) => value === condition),\n };\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(permission, `properties.${property}`)\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 objects.set(permission, `properties.${property}`, value);\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(permission, `properties.${property}` as string) 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 merge({}, getDefaultPermission(), pick(attributes, permissionFields)) 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 (!Array.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 (Array.isArray(payload)) {\n return Array.from(payload, (value) => create(value));\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","permission","pick","getDefaultPermission","actionParameters","conditions","properties","subject","addCondition","curry","condition","newConditions","Array","isArray","Set","concat","removeCondition","reject","value","getProperty","property","get","setProperty","objects","set","deleteProperty","omit","create","attributes","merge","sanitizeConditions","provider","filter","has","reduce","perm","toPermission","payload","from"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../server/src/domain/permission/index.ts"],"sourcesContent":["import { objects, providerFactory } from '@strapi/utils';\nimport { pick, reject, merge, omit, get, curry } from 'lodash';\nimport type { Utils } from '@strapi/types';\n\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 'apiToken',\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 = (permission) =>\n pick(permission, 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 ? [...new Set(conditions.concat(condition))]\n : [condition];\n\n return { ...permission, conditions: newConditions };\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 {\n ...permission,\n conditions: reject(permission.conditions, (value) => value === condition),\n };\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((property: string, permission: Permission): Permission =>\n get(permission, `properties.${property}`)\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 objects.set(permission, `properties.${property}`, value);\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(permission, `properties.${property}` as string) 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 merge({}, getDefaultPermission(), pick(attributes, permissionFields)) 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 (!Array.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 (Array.isArray(payload)) {\n return Array.from(payload, (value) => create(value));\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","permission","pick","getDefaultPermission","actionParameters","conditions","properties","subject","addCondition","curry","condition","newConditions","Array","isArray","Set","concat","removeCondition","reject","value","getProperty","property","get","setProperty","objects","set","deleteProperty","omit","create","attributes","merge","sanitizeConditions","provider","filter","has","reduce","perm","toPermission","payload","from"],"mappings":"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"}
@@ -232,9 +232,7 @@ const UPDATABLE_FIELDS = [
232
232
  const anyUserPermHasAllFields = matchingUserPerms.some((p)=>!p.properties?.fields || p.properties.fields.length === 0);
233
233
  const requestedFields = requested.properties?.fields;
234
234
  if (!anyUserPermHasAllFields) {
235
- const effectiveUserFields = [
236
- ...new Set(matchingUserPerms.flatMap((p)=>p.properties?.fields || []))
237
- ];
235
+ const effectiveUserFields = new Set(matchingUserPerms.flatMap((p)=>p.properties?.fields || []));
238
236
  // When the owner is field-restricted, omitting fields would widen access to all fields.
239
237
  // Force explicit field selection so token scope can't exceed the owner's ceiling.
240
238
  if (requestedFields === undefined || requestedFields === null) {
@@ -242,7 +240,7 @@ const UPDATABLE_FIELDS = [
242
240
  return requested;
243
241
  }
244
242
  if (requestedFields.length > 0) {
245
- const exceedingFields = requestedFields.filter((f)=>!effectiveUserFields.includes(f));
243
+ const exceedingFields = requestedFields.filter((f)=>!effectiveUserFields.has(f));
246
244
  if (exceedingFields.length > 0) {
247
245
  exceeding.push(`${label} (fields: ${exceedingFields.join(', ')})`);
248
246
  return requested;
@@ -367,10 +365,8 @@ const pickComparableFields = (permission)=>_.pick(permission, COMPARABLE_FIELDS)
367
365
  const anyUserPermHasAllFields = matchingUserPerms.some((p)=>!p.properties?.fields || p.properties.fields.length === 0);
368
366
  const tokenFields = tokenPerm.properties?.fields;
369
367
  const fieldCeilingExceeded = !anyUserPermHasAllFields && tokenFields !== undefined && tokenFields !== null && tokenFields.length > 0 && (()=>{
370
- const effectiveUserFields = [
371
- ...new Set(matchingUserPerms.flatMap((p)=>p.properties?.fields || []))
372
- ];
373
- return tokenFields.some((f)=>!effectiveUserFields.includes(f));
368
+ const effectiveUserFields = new Set(matchingUserPerms.flatMap((p)=>p.properties?.fields || []));
369
+ return tokenFields.some((f)=>!effectiveUserFields.has(f));
374
370
  })();
375
371
  if (fieldCeilingExceeded) {
376
372
  toDelete.push(tokenPerm);