@strapi/admin 5.24.2 → 5.26.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 (166) hide show
  1. package/dist/admin/admin/src/App.js +6 -2
  2. package/dist/admin/admin/src/App.js.map +1 -1
  3. package/dist/admin/admin/src/App.mjs +7 -3
  4. package/dist/admin/admin/src/App.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/GuidedTour/Context.js +11 -1
  6. package/dist/admin/admin/src/components/GuidedTour/Context.js.map +1 -1
  7. package/dist/admin/admin/src/components/GuidedTour/Context.mjs +11 -1
  8. package/dist/admin/admin/src/components/GuidedTour/Context.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js +160 -23
  10. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js.map +1 -1
  11. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs +162 -25
  12. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js +28 -9
  14. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js.map +1 -1
  15. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs +30 -11
  16. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.js +2 -1
  18. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.js.map +1 -1
  19. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.mjs +2 -1
  20. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/NpsSurvey.js +2 -1
  22. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  23. package/dist/admin/admin/src/components/NpsSurvey.mjs +2 -1
  24. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  25. package/dist/admin/admin/src/features/Tracking.js +2 -1
  26. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  27. package/dist/admin/admin/src/features/Tracking.mjs +2 -1
  28. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  29. package/dist/admin/admin/src/hooks/useAIAvailability.js +13 -0
  30. package/dist/admin/admin/src/hooks/useAIAvailability.js.map +1 -0
  31. package/dist/admin/admin/src/hooks/useAIAvailability.mjs +11 -0
  32. package/dist/admin/admin/src/hooks/useAIAvailability.mjs.map +1 -0
  33. package/dist/admin/admin/src/pages/Home/HomePage.js +1 -0
  34. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  35. package/dist/admin/admin/src/pages/Home/HomePage.mjs +1 -0
  36. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  37. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +12 -1
  38. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  39. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +12 -1
  40. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  41. package/dist/admin/admin/src/render.js +6 -1
  42. package/dist/admin/admin/src/render.js.map +1 -1
  43. package/dist/admin/admin/src/render.mjs +6 -1
  44. package/dist/admin/admin/src/render.mjs.map +1 -1
  45. package/dist/admin/admin/src/services/homepage.js +15 -1
  46. package/dist/admin/admin/src/services/homepage.js.map +1 -1
  47. package/dist/admin/admin/src/services/homepage.mjs +14 -2
  48. package/dist/admin/admin/src/services/homepage.mjs.map +1 -1
  49. package/dist/admin/admin/src/translations/en.json.js +2 -0
  50. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  51. package/dist/admin/admin/src/translations/en.json.mjs +2 -0
  52. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  53. package/dist/admin/ee/admin/src/components/GlobalNotifications.js +11 -0
  54. package/dist/admin/ee/admin/src/components/GlobalNotifications.js.map +1 -0
  55. package/dist/admin/ee/admin/src/components/GlobalNotifications.mjs +9 -0
  56. package/dist/admin/ee/admin/src/components/GlobalNotifications.mjs.map +1 -0
  57. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js +11 -0
  58. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js.map +1 -0
  59. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs +9 -0
  60. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs.map +1 -0
  61. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.js +82 -0
  62. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.js.map +1 -0
  63. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.mjs +80 -0
  64. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.mjs.map +1 -0
  65. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +102 -0
  66. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -0
  67. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +100 -0
  68. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -0
  69. package/dist/admin/ee/admin/src/services/ai.js +30 -0
  70. package/dist/admin/ee/admin/src/services/ai.js.map +1 -0
  71. package/dist/admin/ee/admin/src/services/ai.mjs +26 -0
  72. package/dist/admin/ee/admin/src/services/ai.mjs.map +1 -0
  73. package/dist/admin/ee.js +4 -0
  74. package/dist/admin/ee.js.map +1 -1
  75. package/dist/admin/ee.mjs +2 -0
  76. package/dist/admin/ee.mjs.map +1 -1
  77. package/dist/admin/index.js +2 -0
  78. package/dist/admin/index.js.map +1 -1
  79. package/dist/admin/index.mjs +1 -0
  80. package/dist/admin/index.mjs.map +1 -1
  81. package/dist/admin/src/components/GuidedTour/Context.d.ts +7 -0
  82. package/dist/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.d.ts +7 -16
  83. package/dist/admin/src/components/GuidedTour/Tours.d.ts +1 -22
  84. package/dist/admin/src/ee.d.ts +2 -0
  85. package/dist/admin/src/features/Tracking.d.ts +21 -2
  86. package/dist/admin/src/hooks/useAIAvailability.d.ts +5 -0
  87. package/dist/admin/src/index.d.ts +2 -0
  88. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -2
  89. package/dist/admin/src/services/admin.d.ts +1 -0
  90. package/dist/admin/src/services/homepage.d.ts +3 -2
  91. package/dist/ee/admin/src/components/GlobalNotifications.d.ts +1 -0
  92. package/dist/ee/admin/src/hooks/useAIAvailability.d.ts +1 -0
  93. package/dist/ee/admin/src/hooks/useAIUsageWarning.d.ts +5 -0
  94. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +1 -1
  95. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.d.ts +1 -0
  96. package/dist/ee/admin/src/services/ai.d.ts +9 -0
  97. package/dist/ee/server/src/ai/controllers/ai.d.ts +7 -0
  98. package/dist/ee/server/src/ai/controllers/ai.d.ts.map +1 -0
  99. package/dist/ee/server/src/ai/routes/ai.d.ts +13 -0
  100. package/dist/ee/server/src/ai/routes/ai.d.ts.map +1 -0
  101. package/dist/ee/server/src/controllers/admin.d.ts +3 -0
  102. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  103. package/dist/ee/server/src/controllers/index.d.ts +3 -0
  104. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  105. package/dist/ee/server/src/index.d.ts +15 -187
  106. package/dist/ee/server/src/index.d.ts.map +1 -1
  107. package/dist/server/ee/server/src/ai/controllers/ai.js +218 -0
  108. package/dist/server/ee/server/src/ai/controllers/ai.js.map +1 -0
  109. package/dist/server/ee/server/src/ai/controllers/ai.mjs +216 -0
  110. package/dist/server/ee/server/src/ai/controllers/ai.mjs.map +1 -0
  111. package/dist/server/ee/server/src/ai/routes/ai.js +32 -0
  112. package/dist/server/ee/server/src/ai/routes/ai.js.map +1 -0
  113. package/dist/server/ee/server/src/ai/routes/ai.mjs +30 -0
  114. package/dist/server/ee/server/src/ai/routes/ai.mjs.map +1 -0
  115. package/dist/server/ee/server/src/controllers/admin.js +4 -1
  116. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  117. package/dist/server/ee/server/src/controllers/admin.mjs +4 -1
  118. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  119. package/dist/server/ee/server/src/index.js +37 -23
  120. package/dist/server/ee/server/src/index.js.map +1 -1
  121. package/dist/server/ee/server/src/index.mjs +37 -23
  122. package/dist/server/ee/server/src/index.mjs.map +1 -1
  123. package/dist/server/server/src/controllers/admin.js +5 -1
  124. package/dist/server/server/src/controllers/admin.js.map +1 -1
  125. package/dist/server/server/src/controllers/admin.mjs +5 -1
  126. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  127. package/dist/server/server/src/controllers/homepage.js +17 -0
  128. package/dist/server/server/src/controllers/homepage.js.map +1 -1
  129. package/dist/server/server/src/controllers/homepage.mjs +17 -0
  130. package/dist/server/server/src/controllers/homepage.mjs.map +1 -1
  131. package/dist/server/server/src/controllers/validation/schema.js +30 -0
  132. package/dist/server/server/src/controllers/validation/schema.js.map +1 -0
  133. package/dist/server/server/src/controllers/validation/schema.mjs +26 -0
  134. package/dist/server/server/src/controllers/validation/schema.mjs.map +1 -0
  135. package/dist/server/server/src/routes/homepage.js +20 -0
  136. package/dist/server/server/src/routes/homepage.js.map +1 -1
  137. package/dist/server/server/src/routes/homepage.mjs +20 -0
  138. package/dist/server/server/src/routes/homepage.mjs.map +1 -1
  139. package/dist/server/server/src/services/homepage.js +48 -1
  140. package/dist/server/server/src/services/homepage.js.map +1 -1
  141. package/dist/server/server/src/services/homepage.mjs +48 -1
  142. package/dist/server/server/src/services/homepage.mjs.map +1 -1
  143. package/dist/server/src/controllers/admin.d.ts +2 -0
  144. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  145. package/dist/server/src/controllers/homepage.d.ts +8 -0
  146. package/dist/server/src/controllers/homepage.d.ts.map +1 -1
  147. package/dist/server/src/controllers/index.d.ts +22 -0
  148. package/dist/server/src/controllers/index.d.ts.map +1 -1
  149. package/dist/server/src/controllers/validation/schema.d.ts +61 -0
  150. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -0
  151. package/dist/server/src/index.d.ts +38 -0
  152. package/dist/server/src/index.d.ts.map +1 -1
  153. package/dist/server/src/routes/homepage.d.ts.map +1 -1
  154. package/dist/server/src/services/homepage.d.ts +3 -0
  155. package/dist/server/src/services/homepage.d.ts.map +1 -1
  156. package/dist/server/src/services/index.d.ts +16 -0
  157. package/dist/server/src/services/index.d.ts.map +1 -1
  158. package/dist/shared/contracts/admin.d.ts +1 -0
  159. package/dist/shared/contracts/admin.d.ts.map +1 -1
  160. package/dist/shared/contracts/ai.d.ts +40 -0
  161. package/dist/shared/contracts/ai.d.ts.map +1 -0
  162. package/dist/shared/contracts/homepage.d.ts +27 -0
  163. package/dist/shared/contracts/homepage.d.ts.map +1 -1
  164. package/dist/shared/contracts/users.d.ts +16 -0
  165. package/dist/shared/contracts/users.d.ts.map +1 -1
  166. package/package.json +9 -9
@@ -10,6 +10,8 @@ import auditLogsController from './audit-logs/controllers/audit-logs.mjs';
10
10
  import { createAuditLogsService } from './audit-logs/services/audit-logs.mjs';
11
11
  import { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles.mjs';
12
12
  import { auditLog } from './audit-logs/content-types/audit-log.mjs';
13
+ import aiRoutes from './ai/routes/ai.mjs';
14
+ import aiController from './ai/controllers/ai.mjs';
13
15
 
14
16
  const getAdminEE = ()=>{
15
17
  const eeAdmin = {
@@ -25,39 +27,51 @@ const getAdminEE = ()=>{
25
27
  controllers,
26
28
  routes
27
29
  };
28
- // Only add the other audit-logs APIs if the feature is enabled by the user and the license
29
- if (strapi.config.get('admin.auditLogs.enabled', true) && strapi.ee.features.isEnabled('audit-logs')) {
30
- return {
31
- ...eeAdmin,
32
- controllers: {
33
- ...eeAdmin.controllers,
30
+ const isAIEnabled = strapi.config.get('admin.ai.enabled', true) && strapi.ee.features.isEnabled('cms-ai');
31
+ const isAuditLogsEnabled = strapi.config.get('admin.auditLogs.enabled', true) && strapi.ee.features.isEnabled('audit-logs');
32
+ return {
33
+ ...eeAdmin,
34
+ controllers: {
35
+ ...eeAdmin.controllers,
36
+ ...isAuditLogsEnabled ? {
34
37
  'audit-logs': auditLogsController
35
- },
36
- routes: {
37
- ...eeAdmin.routes,
38
+ } : {},
39
+ ...isAIEnabled ? {
40
+ ai: aiController
41
+ } : {}
42
+ },
43
+ routes: {
44
+ ...eeAdmin.routes,
45
+ ...isAuditLogsEnabled ? {
38
46
  'audit-logs': auditLogsRoutes
39
- },
40
- async register ({ strapi: strapi1 }) {
41
- // Run the the default registration
42
- await eeAdmin.register({
43
- strapi: strapi1
44
- });
47
+ } : {},
48
+ ...isAIEnabled ? {
49
+ ai: aiRoutes
50
+ } : {}
51
+ },
52
+ async register ({ strapi: strapi1 }) {
53
+ // Run the the default registration
54
+ await eeAdmin.register({
55
+ strapi: strapi1
56
+ });
57
+ if (isAuditLogsEnabled) {
45
58
  // Register an internal audit logs service
46
59
  strapi1.add('audit-logs', createAuditLogsService(strapi1));
47
60
  // Register an internal audit logs lifecycle service
48
61
  const auditLogsLifecycle = createAuditLogsLifecycleService(strapi1);
49
62
  strapi1.add('audit-logs-lifecycle', auditLogsLifecycle);
50
63
  await auditLogsLifecycle.register();
51
- },
52
- async destroy ({ strapi: strapi1 }) {
64
+ }
65
+ },
66
+ async destroy ({ strapi: strapi1 }) {
67
+ if (isAuditLogsEnabled) {
53
68
  strapi1.get('audit-logs-lifecycle').destroy();
54
- await eeAdmin.destroy({
55
- strapi: strapi1
56
- });
57
69
  }
58
- };
59
- }
60
- return eeAdmin;
70
+ await eeAdmin.destroy({
71
+ strapi: strapi1
72
+ });
73
+ }
74
+ };
61
75
  };
62
76
 
63
77
  export { getAdminEE as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport type { Core } from '@strapi/types';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n // Only add the other audit-logs APIs if the feature is enabled by the user and the license\n if (\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs')\n ) {\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n 'audit-logs': auditLogsController,\n },\n routes: {\n ...eeAdmin.routes,\n 'audit-logs': auditLogsRoutes,\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the the default registration\n await eeAdmin.register({ strapi });\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n strapi.get('audit-logs-lifecycle').destroy();\n await eeAdmin.destroy({ strapi });\n },\n };\n }\n\n return eeAdmin;\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService"],"mappings":";;;;;;;;;;;;;AAcA,MAAMA,UAAa,GAAA,IAAA;AACjB,IAAA,MAAMC,OAAU,GAAA;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAc,EAAA;;YAEZ,WAAaC,EAAAA,QAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA;;AAGA,IAAA,IACEC,MAAOC,CAAAA,MAAM,CAACC,GAAG,CAAC,yBAA2B,EAAA,IAAA,CAAA,IAC7CF,MAAOG,CAAAA,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAC7B,CAAA,EAAA;QACA,OAAO;AACL,YAAA,GAAGf,OAAO;YACVQ,WAAa,EAAA;AACX,gBAAA,GAAGR,QAAQQ,WAAW;gBACtB,YAAcQ,EAAAA;AAChB,aAAA;YACAP,MAAQ,EAAA;AACN,gBAAA,GAAGT,QAAQS,MAAM;gBACjB,YAAcQ,EAAAA;AAChB,aAAA;AACA,YAAA,MAAMhB,QAAS,CAAA,CAAA,EAAES,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;gBAEhD,MAAMV,OAAAA,CAAQC,QAAQ,CAAC;oBAAES,MAAAA,EAAAA;AAAO,iBAAA,CAAA;;gBAEhCA,OAAOQ,CAAAA,GAAG,CAAC,YAAA,EAAcC,sBAAuBT,CAAAA,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,+BAAgCX,CAAAA,OAAAA,CAAAA;gBAC3DA,OAAOQ,CAAAA,GAAG,CAAC,sBAAwBE,EAAAA,kBAAAA,CAAAA;AAEnC,gBAAA,MAAMA,mBAAmBnB,QAAQ,EAAA;AACnC,aAAA;AACA,YAAA,MAAME,OAAQ,CAAA,CAAA,EAAEO,MAAAA,EAAAA,OAAM,EAA2B,EAAA;gBAC/CA,OAAOE,CAAAA,GAAG,CAAC,sBAAA,CAAA,CAAwBT,OAAO,EAAA;gBAC1C,MAAMH,OAAAA,CAAQG,OAAO,CAAC;oBAAEO,MAAAA,EAAAA;AAAO,iBAAA,CAAA;AACjC;AACF,SAAA;AACF;IAEA,OAAOV,OAAAA;AACT;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport aiRoutes from './ai/routes/ai';\nimport aiController from './ai/controllers/ai';\nimport type { Core } from '@strapi/types';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAIEnabled =\n strapi.config.get('admin.ai.enabled', true) && strapi.ee.features.isEnabled('cms-ai');\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n ...(isAIEnabled ? { ai: aiController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n ...(isAIEnabled ? { ai: aiRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the the default registration\n await eeAdmin.register({ strapi });\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy({ strapi });\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAIEnabled","strapi","config","get","ee","features","isEnabled","isAuditLogsEnabled","auditLogsController","ai","aiController","auditLogsRoutes","aiRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAMA,UAAa,GAAA,IAAA;AACjB,IAAA,MAAMC,OAAU,GAAA;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAc,EAAA;;YAEZ,WAAaC,EAAAA,QAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,WACJC,GAAAA,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,kBAAA,EAAoB,IAASF,CAAAA,IAAAA,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,QAAA,CAAA;AAC9E,IAAA,MAAMC,kBACJN,GAAAA,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAC7CF,CAAAA,IAAAA,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAa,EAAA;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIS,kBAAqB,GAAA;gBAAE,YAAcC,EAAAA;AAAoB,aAAA,GAAI,EAAE;AACnE,YAAA,GAAIR,WAAc,GAAA;gBAAES,EAAIC,EAAAA;AAAa,aAAA,GAAI;AAC3C,SAAA;QACAX,MAAQ,EAAA;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIQ,kBAAqB,GAAA;gBAAE,YAAcI,EAAAA;AAAgB,aAAA,GAAI,EAAE;AAC/D,YAAA,GAAIX,WAAc,GAAA;gBAAES,EAAIG,EAAAA;AAAS,aAAA,GAAI;AACvC,SAAA;AACA,QAAA,MAAMrB,QAAS,CAAA,CAAA,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAChC,YAAA,IAAIM,kBAAoB,EAAA;;gBAEtBN,OAAOY,CAAAA,GAAG,CAAC,YAAA,EAAcC,sBAAuBb,CAAAA,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMc,qBAAqBC,+BAAgCf,CAAAA,OAAAA,CAAAA;gBAC3DA,OAAOY,CAAAA,GAAG,CAAC,sBAAwBE,EAAAA,kBAAAA,CAAAA;AAEnC,gBAAA,MAAMA,mBAAmBxB,QAAQ,EAAA;AACnC;AACF,SAAA;AACA,QAAA,MAAME,OAAQ,CAAA,CAAA,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAIM,kBAAoB,EAAA;gBACtBN,OAAOE,CAAAA,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C;YACA,MAAMH,OAAAA,CAAQG,OAAO,CAAC;gBAAEQ,MAAAA,EAAAA;AAAO,aAAA,CAAA;AACjC;AACF,KAAA;AACF;;;;"}
@@ -20,11 +20,13 @@ const { isUsingTypeScript } = tsUtils;
20
20
  // This returns an empty feature list for CE
21
21
  async getProjectType () {
22
22
  const flags = strapi.config.get('admin.flags', {});
23
+ const ai = strapi.config.get('admin.ai', {});
23
24
  return {
24
25
  data: {
25
26
  isEE: false,
26
27
  features: [],
27
- flags
28
+ flags,
29
+ ai
28
30
  }
29
31
  };
30
32
  },
@@ -70,6 +72,7 @@ const { isUsingTypeScript } = tsUtils;
70
72
  const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);
71
73
  const useTypescriptOnAdmin = await isUsingTypeScript(path.join(strapi.dirs.app.root, 'src', 'admin'));
72
74
  const isHostedOnStrapiCloud = utils.env('STRAPI_HOSTING', null) === 'strapi.cloud';
75
+ const aiLicenseKey = utils.env('STRAPI_ADMIN_AI_LICENSE', undefined);
73
76
  const numberOfAllContentTypes = _.size(strapi.contentTypes);
74
77
  const numberOfComponents = _.size(strapi.components);
75
78
  const getNumberOfDynamicZones = ()=>{
@@ -81,6 +84,7 @@ const { isUsingTypeScript } = tsUtils;
81
84
  useTypescriptOnServer,
82
85
  useTypescriptOnAdmin,
83
86
  isHostedOnStrapiCloud,
87
+ aiLicenseKey,
84
88
  numberOfAllContentTypes,
85
89
  numberOfComponents,
86
90
  numberOfDynamicZones: getNumberOfDynamicZones()
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { map, values, sumBy, pipe, flatMap, propEq } from 'lodash/fp';\nimport _ from 'lodash';\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport tsUtils from '@strapi/typescript-utils';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n} from '../../../shared/contracts/admin';\n\nconst { isUsingTypeScript } = tsUtils;\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() {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, features: [], flags } };\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 pipe(\n map('attributes'),\n flatMap(values),\n // @ts-expect-error lodash types\n sumBy(propEq('type', 'dynamiczone'))\n )(strapi.contentTypes as any);\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 },\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 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":["isUsingTypeScript","tsUtils","getProjectType","flags","strapi","config","get","data","isEE","features","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","pipe","map","flatMap","values","sumBy","propEq","numberOfDynamicZones","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","plugins","enabledPlugins","CORE_PLUGINS","Object","entries","filter","key","includes","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 type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { map, values, sumBy, pipe, flatMap, propEq } from 'lodash/fp';\nimport _ from 'lodash';\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport tsUtils from '@strapi/typescript-utils';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n} from '../../../shared/contracts/admin';\n\nconst { isUsingTypeScript } = tsUtils;\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() {\n const flags = strapi.config.get('admin.flags', {});\n const ai = strapi.config.get('admin.ai', {});\n return { data: { isEE: false, features: [], flags, ai } };\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 const aiLicenseKey = env('STRAPI_ADMIN_AI_LICENSE', undefined);\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n // @ts-expect-error lodash types\n sumBy(propEq('type', 'dynamiczone'))\n )(strapi.contentTypes as any);\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n aiLicenseKey,\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 },\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 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":["isUsingTypeScript","tsUtils","getProjectType","flags","strapi","config","get","ai","data","isEE","features","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","aiLicenseKey","undefined","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","pipe","map","flatMap","values","sumBy","propEq","numberOfDynamicZones","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","plugins","enabledPlugins","CORE_PLUGINS","Object","entries","filter","key","includes","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":"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"}
@@ -18,11 +18,13 @@ const { isUsingTypeScript } = tsUtils;
18
18
  // This returns an empty feature list for CE
19
19
  async getProjectType () {
20
20
  const flags = strapi.config.get('admin.flags', {});
21
+ const ai = strapi.config.get('admin.ai', {});
21
22
  return {
22
23
  data: {
23
24
  isEE: false,
24
25
  features: [],
25
- flags
26
+ flags,
27
+ ai
26
28
  }
27
29
  };
28
30
  },
@@ -68,6 +70,7 @@ const { isUsingTypeScript } = tsUtils;
68
70
  const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);
69
71
  const useTypescriptOnAdmin = await isUsingTypeScript(path.join(strapi.dirs.app.root, 'src', 'admin'));
70
72
  const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';
73
+ const aiLicenseKey = env('STRAPI_ADMIN_AI_LICENSE', undefined);
71
74
  const numberOfAllContentTypes = ___default.size(strapi.contentTypes);
72
75
  const numberOfComponents = ___default.size(strapi.components);
73
76
  const getNumberOfDynamicZones = ()=>{
@@ -79,6 +82,7 @@ const { isUsingTypeScript } = tsUtils;
79
82
  useTypescriptOnServer,
80
83
  useTypescriptOnAdmin,
81
84
  isHostedOnStrapiCloud,
85
+ aiLicenseKey,
82
86
  numberOfAllContentTypes,
83
87
  numberOfComponents,
84
88
  numberOfDynamicZones: getNumberOfDynamicZones()
@@ -1 +1 @@
1
- {"version":3,"file":"admin.mjs","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { map, values, sumBy, pipe, flatMap, propEq } from 'lodash/fp';\nimport _ from 'lodash';\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport tsUtils from '@strapi/typescript-utils';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n} from '../../../shared/contracts/admin';\n\nconst { isUsingTypeScript } = tsUtils;\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() {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, features: [], flags } };\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 pipe(\n map('attributes'),\n flatMap(values),\n // @ts-expect-error lodash types\n sumBy(propEq('type', 'dynamiczone'))\n )(strapi.contentTypes as any);\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 },\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 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":["isUsingTypeScript","tsUtils","getProjectType","flags","strapi","config","get","data","isEE","features","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","pipe","map","flatMap","values","sumBy","propEq","numberOfDynamicZones","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","plugins","enabledPlugins","CORE_PLUGINS","Object","entries","filter","key","includes","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.mjs","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { map, values, sumBy, pipe, flatMap, propEq } from 'lodash/fp';\nimport _ from 'lodash';\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport tsUtils from '@strapi/typescript-utils';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n} from '../../../shared/contracts/admin';\n\nconst { isUsingTypeScript } = tsUtils;\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() {\n const flags = strapi.config.get('admin.flags', {});\n const ai = strapi.config.get('admin.ai', {});\n return { data: { isEE: false, features: [], flags, ai } };\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 const aiLicenseKey = env('STRAPI_ADMIN_AI_LICENSE', undefined);\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n // @ts-expect-error lodash types\n sumBy(propEq('type', 'dynamiczone'))\n )(strapi.contentTypes as any);\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n aiLicenseKey,\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 },\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 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":["isUsingTypeScript","tsUtils","getProjectType","flags","strapi","config","get","ai","data","isEE","features","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","aiLicenseKey","undefined","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","pipe","map","flatMap","values","sumBy","propEq","numberOfDynamicZones","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","plugins","enabledPlugins","CORE_PLUGINS","Object","entries","filter","key","includes","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":"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"}
@@ -8,6 +8,23 @@ var homepage = {
8
8
  return {
9
9
  data: await homepageService.getKeyStatistics()
10
10
  };
11
+ },
12
+ async getHomepageLayout (ctx) {
13
+ const homepageService = index.getService('homepage');
14
+ const userId = ctx.state.user?.id;
15
+ const data = await homepageService.getHomepageLayout(userId);
16
+ return {
17
+ data
18
+ };
19
+ },
20
+ async updateHomepageLayout (ctx) {
21
+ const homepageService = index.getService('homepage');
22
+ const userId = ctx.state.user?.id;
23
+ const body = ctx.request.body;
24
+ const data = await homepageService.updateHomepageLayout(userId, body);
25
+ return {
26
+ data
27
+ };
11
28
  }
12
29
  };
13
30
 
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.js","sources":["../../../../../server/src/controllers/homepage.ts"],"sourcesContent":["import { getService } from '../utils';\n\nexport default {\n async getKeyStatistics(): Promise<{\n data: Awaited<ReturnType<typeof homepageService.getKeyStatistics>>;\n }> {\n const homepageService = getService('homepage');\n return { data: await homepageService.getKeyStatistics() };\n },\n};\n"],"names":["getKeyStatistics","homepageService","getService","data"],"mappings":";;;;AAEA,eAAe;IACb,MAAMA,gBAAAA,CAAAA,GAAAA;AAGJ,QAAA,MAAMC,kBAAkBC,gBAAW,CAAA,UAAA,CAAA;QACnC,OAAO;YAAEC,IAAM,EAAA,MAAMF,gBAAgBD,gBAAgB;AAAG,SAAA;AAC1D;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"homepage.js","sources":["../../../../../server/src/controllers/homepage.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { getService } from '../utils';\nimport { HomepageLayout, HomepageLayoutWrite } from './validation/schema';\n\nexport default {\n async getKeyStatistics(): Promise<{\n data: Awaited<ReturnType<typeof homepageService.getKeyStatistics>>;\n }> {\n const homepageService = getService('homepage');\n return { data: await homepageService.getKeyStatistics() };\n },\n async getHomepageLayout(ctx: Context): Promise<{ data: HomepageLayout | null }> {\n const homepageService = getService('homepage');\n const userId = ctx.state.user?.id;\n\n const data = await homepageService.getHomepageLayout(userId);\n return { data };\n },\n async updateHomepageLayout(ctx: Context): Promise<{ data: HomepageLayout }> {\n const homepageService = getService('homepage');\n const userId = ctx.state.user?.id;\n\n const body = ctx.request.body as HomepageLayoutWrite;\n const data = await homepageService.updateHomepageLayout(userId, body);\n return { data };\n },\n};\n"],"names":["getKeyStatistics","homepageService","getService","data","getHomepageLayout","ctx","userId","state","user","id","updateHomepageLayout","body","request"],"mappings":";;;;AAIA,eAAe;IACb,MAAMA,gBAAAA,CAAAA,GAAAA;AAGJ,QAAA,MAAMC,kBAAkBC,gBAAW,CAAA,UAAA,CAAA;QACnC,OAAO;YAAEC,IAAM,EAAA,MAAMF,gBAAgBD,gBAAgB;AAAG,SAAA;AAC1D,KAAA;AACA,IAAA,MAAMI,mBAAkBC,GAAY,EAAA;AAClC,QAAA,MAAMJ,kBAAkBC,gBAAW,CAAA,UAAA,CAAA;AACnC,QAAA,MAAMI,MAASD,GAAAA,GAAAA,CAAIE,KAAK,CAACC,IAAI,EAAEC,EAAAA;AAE/B,QAAA,MAAMN,IAAO,GAAA,MAAMF,eAAgBG,CAAAA,iBAAiB,CAACE,MAAAA,CAAAA;QACrD,OAAO;AAAEH,YAAAA;AAAK,SAAA;AAChB,KAAA;AACA,IAAA,MAAMO,sBAAqBL,GAAY,EAAA;AACrC,QAAA,MAAMJ,kBAAkBC,gBAAW,CAAA,UAAA,CAAA;AACnC,QAAA,MAAMI,MAASD,GAAAA,GAAAA,CAAIE,KAAK,CAACC,IAAI,EAAEC,EAAAA;AAE/B,QAAA,MAAME,IAAON,GAAAA,GAAAA,CAAIO,OAAO,CAACD,IAAI;AAC7B,QAAA,MAAMR,IAAO,GAAA,MAAMF,eAAgBS,CAAAA,oBAAoB,CAACJ,MAAQK,EAAAA,IAAAA,CAAAA;QAChE,OAAO;AAAER,YAAAA;AAAK,SAAA;AAChB;AACF,CAAE;;;;"}
@@ -6,6 +6,23 @@ var homepage = {
6
6
  return {
7
7
  data: await homepageService.getKeyStatistics()
8
8
  };
9
+ },
10
+ async getHomepageLayout (ctx) {
11
+ const homepageService = getService('homepage');
12
+ const userId = ctx.state.user?.id;
13
+ const data = await homepageService.getHomepageLayout(userId);
14
+ return {
15
+ data
16
+ };
17
+ },
18
+ async updateHomepageLayout (ctx) {
19
+ const homepageService = getService('homepage');
20
+ const userId = ctx.state.user?.id;
21
+ const body = ctx.request.body;
22
+ const data = await homepageService.updateHomepageLayout(userId, body);
23
+ return {
24
+ data
25
+ };
9
26
  }
10
27
  };
11
28
 
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.mjs","sources":["../../../../../server/src/controllers/homepage.ts"],"sourcesContent":["import { getService } from '../utils';\n\nexport default {\n async getKeyStatistics(): Promise<{\n data: Awaited<ReturnType<typeof homepageService.getKeyStatistics>>;\n }> {\n const homepageService = getService('homepage');\n return { data: await homepageService.getKeyStatistics() };\n },\n};\n"],"names":["getKeyStatistics","homepageService","getService","data"],"mappings":";;AAEA,eAAe;IACb,MAAMA,gBAAAA,CAAAA,GAAAA;AAGJ,QAAA,MAAMC,kBAAkBC,UAAW,CAAA,UAAA,CAAA;QACnC,OAAO;YAAEC,IAAM,EAAA,MAAMF,gBAAgBD,gBAAgB;AAAG,SAAA;AAC1D;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"homepage.mjs","sources":["../../../../../server/src/controllers/homepage.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { getService } from '../utils';\nimport { HomepageLayout, HomepageLayoutWrite } from './validation/schema';\n\nexport default {\n async getKeyStatistics(): Promise<{\n data: Awaited<ReturnType<typeof homepageService.getKeyStatistics>>;\n }> {\n const homepageService = getService('homepage');\n return { data: await homepageService.getKeyStatistics() };\n },\n async getHomepageLayout(ctx: Context): Promise<{ data: HomepageLayout | null }> {\n const homepageService = getService('homepage');\n const userId = ctx.state.user?.id;\n\n const data = await homepageService.getHomepageLayout(userId);\n return { data };\n },\n async updateHomepageLayout(ctx: Context): Promise<{ data: HomepageLayout }> {\n const homepageService = getService('homepage');\n const userId = ctx.state.user?.id;\n\n const body = ctx.request.body as HomepageLayoutWrite;\n const data = await homepageService.updateHomepageLayout(userId, body);\n return { data };\n },\n};\n"],"names":["getKeyStatistics","homepageService","getService","data","getHomepageLayout","ctx","userId","state","user","id","updateHomepageLayout","body","request"],"mappings":";;AAIA,eAAe;IACb,MAAMA,gBAAAA,CAAAA,GAAAA;AAGJ,QAAA,MAAMC,kBAAkBC,UAAW,CAAA,UAAA,CAAA;QACnC,OAAO;YAAEC,IAAM,EAAA,MAAMF,gBAAgBD,gBAAgB;AAAG,SAAA;AAC1D,KAAA;AACA,IAAA,MAAMI,mBAAkBC,GAAY,EAAA;AAClC,QAAA,MAAMJ,kBAAkBC,UAAW,CAAA,UAAA,CAAA;AACnC,QAAA,MAAMI,MAASD,GAAAA,GAAAA,CAAIE,KAAK,CAACC,IAAI,EAAEC,EAAAA;AAE/B,QAAA,MAAMN,IAAO,GAAA,MAAMF,eAAgBG,CAAAA,iBAAiB,CAACE,MAAAA,CAAAA;QACrD,OAAO;AAAEH,YAAAA;AAAK,SAAA;AAChB,KAAA;AACA,IAAA,MAAMO,sBAAqBL,GAAY,EAAA;AACrC,QAAA,MAAMJ,kBAAkBC,UAAW,CAAA,UAAA,CAAA;AACnC,QAAA,MAAMI,MAASD,GAAAA,GAAAA,CAAIE,KAAK,CAACC,IAAI,EAAEC,EAAAA;AAE/B,QAAA,MAAME,IAAON,GAAAA,GAAAA,CAAIO,OAAO,CAACD,IAAI;AAC7B,QAAA,MAAMR,IAAO,GAAA,MAAMF,eAAgBS,CAAAA,oBAAoB,CAACJ,MAAQK,EAAAA,IAAAA,CAAAA;QAChE,OAAO;AAAER,YAAAA;AAAK,SAAA;AAChB;AACF,CAAE;;;;"}
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+
5
+ // widths must be one of 4, 6, 8, 12
6
+ const WidthSchema = zod.z.union([
7
+ zod.z.literal(4),
8
+ zod.z.literal(6),
9
+ zod.z.literal(8),
10
+ zod.z.literal(12)
11
+ ]);
12
+ const WidgetEntrySchema = zod.z.object({
13
+ uid: zod.z.string().nonempty(),
14
+ width: WidthSchema
15
+ }).strict();
16
+ const HomepageLayoutSchema = zod.z.object({
17
+ version: zod.z.number().int().min(1),
18
+ widgets: zod.z.array(WidgetEntrySchema).max(100),
19
+ updatedAt: zod.z.string().datetime()
20
+ }).strict();
21
+ const HomepageLayoutWriteSchema = zod.z.object({
22
+ version: zod.z.number().int().min(1).optional(),
23
+ widgets: zod.z.array(WidgetEntrySchema).max(100),
24
+ updatedAt: zod.z.string().datetime().optional()
25
+ }).strict();
26
+
27
+ exports.HomepageLayoutSchema = HomepageLayoutSchema;
28
+ exports.HomepageLayoutWriteSchema = HomepageLayoutWriteSchema;
29
+ exports.WidthSchema = WidthSchema;
30
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sources":["../../../../../../server/src/controllers/validation/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\n// widths must be one of 4, 6, 8, 12\nexport const WidthSchema = z.union([z.literal(4), z.literal(6), z.literal(8), z.literal(12)]);\n\nconst WidgetEntrySchema = z\n .object({\n uid: z.string().nonempty(),\n width: WidthSchema,\n })\n .strict();\n\nexport const HomepageLayoutSchema = z\n .object({\n version: z.number().int().min(1),\n widgets: z.array(WidgetEntrySchema).max(100),\n updatedAt: z.string().datetime(),\n })\n .strict();\n\nexport type HomepageLayout = z.infer<typeof HomepageLayoutSchema>;\n\nexport const HomepageLayoutWriteSchema = z\n .object({\n version: z.number().int().min(1).optional(),\n widgets: z.array(WidgetEntrySchema).max(100),\n updatedAt: z.string().datetime().optional(),\n })\n .strict();\n\nexport type HomepageLayoutWrite = z.infer<typeof HomepageLayoutWriteSchema>;\n"],"names":["WidthSchema","z","union","literal","WidgetEntrySchema","object","uid","string","nonempty","width","strict","HomepageLayoutSchema","version","number","int","min","widgets","array","max","updatedAt","datetime","HomepageLayoutWriteSchema","optional"],"mappings":";;;;AAEA;AACaA,MAAAA,WAAAA,GAAcC,KAAEC,CAAAA,KAAK,CAAC;AAACD,IAAAA,KAAAA,CAAEE,OAAO,CAAC,CAAA,CAAA;AAAIF,IAAAA,KAAAA,CAAEE,OAAO,CAAC,CAAA,CAAA;AAAIF,IAAAA,KAAAA,CAAEE,OAAO,CAAC,CAAA,CAAA;AAAIF,IAAAA,KAAAA,CAAEE,OAAO,CAAC,EAAA;CAAI;AAE5F,MAAMC,iBAAAA,GAAoBH,KACvBI,CAAAA,MAAM,CAAC;IACNC,GAAKL,EAAAA,KAAAA,CAAEM,MAAM,EAAA,CAAGC,QAAQ,EAAA;IACxBC,KAAOT,EAAAA;AACT,CAAA,CAAA,CACCU,MAAM,EAAA;AAEIC,MAAAA,oBAAAA,GAAuBV,KACjCI,CAAAA,MAAM,CAAC;AACNO,IAAAA,OAAAA,EAASX,MAAEY,MAAM,EAAA,CAAGC,GAAG,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA;AAC9BC,IAAAA,OAAAA,EAASf,KAAEgB,CAAAA,KAAK,CAACb,iBAAAA,CAAAA,CAAmBc,GAAG,CAAC,GAAA,CAAA;IACxCC,SAAWlB,EAAAA,KAAAA,CAAEM,MAAM,EAAA,CAAGa,QAAQ;AAChC,CAAA,CAAA,CACCV,MAAM;AAIIW,MAAAA,yBAAAA,GAA4BpB,KACtCI,CAAAA,MAAM,CAAC;IACNO,OAASX,EAAAA,KAAAA,CAAEY,MAAM,EAAGC,CAAAA,GAAG,GAAGC,GAAG,CAAC,GAAGO,QAAQ,EAAA;AACzCN,IAAAA,OAAAA,EAASf,KAAEgB,CAAAA,KAAK,CAACb,iBAAAA,CAAAA,CAAmBc,GAAG,CAAC,GAAA,CAAA;AACxCC,IAAAA,SAAAA,EAAWlB,KAAEM,CAAAA,MAAM,EAAGa,CAAAA,QAAQ,GAAGE,QAAQ;AAC3C,CAAA,CAAA,CACCZ,MAAM;;;;;;"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+
3
+ // widths must be one of 4, 6, 8, 12
4
+ const WidthSchema = z.union([
5
+ z.literal(4),
6
+ z.literal(6),
7
+ z.literal(8),
8
+ z.literal(12)
9
+ ]);
10
+ const WidgetEntrySchema = z.object({
11
+ uid: z.string().nonempty(),
12
+ width: WidthSchema
13
+ }).strict();
14
+ const HomepageLayoutSchema = z.object({
15
+ version: z.number().int().min(1),
16
+ widgets: z.array(WidgetEntrySchema).max(100),
17
+ updatedAt: z.string().datetime()
18
+ }).strict();
19
+ const HomepageLayoutWriteSchema = z.object({
20
+ version: z.number().int().min(1).optional(),
21
+ widgets: z.array(WidgetEntrySchema).max(100),
22
+ updatedAt: z.string().datetime().optional()
23
+ }).strict();
24
+
25
+ export { HomepageLayoutSchema, HomepageLayoutWriteSchema, WidthSchema };
26
+ //# sourceMappingURL=schema.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.mjs","sources":["../../../../../../server/src/controllers/validation/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\n// widths must be one of 4, 6, 8, 12\nexport const WidthSchema = z.union([z.literal(4), z.literal(6), z.literal(8), z.literal(12)]);\n\nconst WidgetEntrySchema = z\n .object({\n uid: z.string().nonempty(),\n width: WidthSchema,\n })\n .strict();\n\nexport const HomepageLayoutSchema = z\n .object({\n version: z.number().int().min(1),\n widgets: z.array(WidgetEntrySchema).max(100),\n updatedAt: z.string().datetime(),\n })\n .strict();\n\nexport type HomepageLayout = z.infer<typeof HomepageLayoutSchema>;\n\nexport const HomepageLayoutWriteSchema = z\n .object({\n version: z.number().int().min(1).optional(),\n widgets: z.array(WidgetEntrySchema).max(100),\n updatedAt: z.string().datetime().optional(),\n })\n .strict();\n\nexport type HomepageLayoutWrite = z.infer<typeof HomepageLayoutWriteSchema>;\n"],"names":["WidthSchema","z","union","literal","WidgetEntrySchema","object","uid","string","nonempty","width","strict","HomepageLayoutSchema","version","number","int","min","widgets","array","max","updatedAt","datetime","HomepageLayoutWriteSchema","optional"],"mappings":";;AAEA;AACaA,MAAAA,WAAAA,GAAcC,CAAEC,CAAAA,KAAK,CAAC;AAACD,IAAAA,CAAAA,CAAEE,OAAO,CAAC,CAAA,CAAA;AAAIF,IAAAA,CAAAA,CAAEE,OAAO,CAAC,CAAA,CAAA;AAAIF,IAAAA,CAAAA,CAAEE,OAAO,CAAC,CAAA,CAAA;AAAIF,IAAAA,CAAAA,CAAEE,OAAO,CAAC,EAAA;CAAI;AAE5F,MAAMC,iBAAAA,GAAoBH,CACvBI,CAAAA,MAAM,CAAC;IACNC,GAAKL,EAAAA,CAAAA,CAAEM,MAAM,EAAA,CAAGC,QAAQ,EAAA;IACxBC,KAAOT,EAAAA;AACT,CAAA,CAAA,CACCU,MAAM,EAAA;AAEIC,MAAAA,oBAAAA,GAAuBV,CACjCI,CAAAA,MAAM,CAAC;AACNO,IAAAA,OAAAA,EAASX,EAAEY,MAAM,EAAA,CAAGC,GAAG,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA;AAC9BC,IAAAA,OAAAA,EAASf,CAAEgB,CAAAA,KAAK,CAACb,iBAAAA,CAAAA,CAAmBc,GAAG,CAAC,GAAA,CAAA;IACxCC,SAAWlB,EAAAA,CAAAA,CAAEM,MAAM,EAAA,CAAGa,QAAQ;AAChC,CAAA,CAAA,CACCV,MAAM;AAIIW,MAAAA,yBAAAA,GAA4BpB,CACtCI,CAAAA,MAAM,CAAC;IACNO,OAASX,EAAAA,CAAAA,CAAEY,MAAM,EAAGC,CAAAA,GAAG,GAAGC,GAAG,CAAC,GAAGO,QAAQ,EAAA;AACzCN,IAAAA,OAAAA,EAASf,CAAEgB,CAAAA,KAAK,CAACb,iBAAAA,CAAAA,CAAmBc,GAAG,CAAC,GAAA,CAAA;AACxCC,IAAAA,SAAAA,EAAWlB,CAAEM,CAAAA,MAAM,EAAGa,CAAAA,QAAQ,GAAGE,QAAQ;AAC3C,CAAA,CAAA,CACCZ,MAAM;;;;"}
@@ -10,6 +10,26 @@ var homepage = [
10
10
  'admin::isAuthenticatedAdmin'
11
11
  ]
12
12
  }
13
+ },
14
+ {
15
+ method: 'GET',
16
+ path: '/homepage/layout',
17
+ handler: 'homepage.getHomepageLayout',
18
+ config: {
19
+ policies: [
20
+ 'admin::isAuthenticatedAdmin'
21
+ ]
22
+ }
23
+ },
24
+ {
25
+ method: 'PUT',
26
+ path: '/homepage/layout',
27
+ handler: 'homepage.updateHomepageLayout',
28
+ config: {
29
+ policies: [
30
+ 'admin::isAuthenticatedAdmin'
31
+ ]
32
+ }
13
33
  }
14
34
  ];
15
35
 
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.js","sources":["../../../../../server/src/routes/homepage.ts"],"sourcesContent":["export default [\n {\n method: 'GET',\n path: '/homepage/key-statistics',\n handler: 'homepage.getKeyStatistics',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n];\n"],"names":["method","path","handler","config","policies"],"mappings":";;AAAA,eAAe;AACb,IAAA;QACEA,MAAQ,EAAA,KAAA;QACRC,IAAM,EAAA,0BAAA;QACNC,OAAS,EAAA,2BAAA;QACTC,MAAQ,EAAA;YACNC,QAAU,EAAA;AAAC,gBAAA;AAA8B;AAC3C;AACF;CACD;;;;"}
1
+ {"version":3,"file":"homepage.js","sources":["../../../../../server/src/routes/homepage.ts"],"sourcesContent":["export default [\n {\n method: 'GET',\n path: '/homepage/key-statistics',\n handler: 'homepage.getKeyStatistics',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/homepage/layout',\n handler: 'homepage.getHomepageLayout',\n config: { policies: ['admin::isAuthenticatedAdmin'] },\n },\n {\n method: 'PUT',\n path: '/homepage/layout',\n handler: 'homepage.updateHomepageLayout',\n config: { policies: ['admin::isAuthenticatedAdmin'] },\n },\n];\n"],"names":["method","path","handler","config","policies"],"mappings":";;AAAA,eAAe;AACb,IAAA;QACEA,MAAQ,EAAA,KAAA;QACRC,IAAM,EAAA,0BAAA;QACNC,OAAS,EAAA,2BAAA;QACTC,MAAQ,EAAA;YACNC,QAAU,EAAA;AAAC,gBAAA;AAA8B;AAC3C;AACF,KAAA;AACA,IAAA;QACEJ,MAAQ,EAAA,KAAA;QACRC,IAAM,EAAA,kBAAA;QACNC,OAAS,EAAA,4BAAA;QACTC,MAAQ,EAAA;YAAEC,QAAU,EAAA;AAAC,gBAAA;AAA8B;AAAC;AACtD,KAAA;AACA,IAAA;QACEJ,MAAQ,EAAA,KAAA;QACRC,IAAM,EAAA,kBAAA;QACNC,OAAS,EAAA,+BAAA;QACTC,MAAQ,EAAA;YAAEC,QAAU,EAAA;AAAC,gBAAA;AAA8B;AAAC;AACtD;CACD;;;;"}
@@ -8,6 +8,26 @@ var homepage = [
8
8
  'admin::isAuthenticatedAdmin'
9
9
  ]
10
10
  }
11
+ },
12
+ {
13
+ method: 'GET',
14
+ path: '/homepage/layout',
15
+ handler: 'homepage.getHomepageLayout',
16
+ config: {
17
+ policies: [
18
+ 'admin::isAuthenticatedAdmin'
19
+ ]
20
+ }
21
+ },
22
+ {
23
+ method: 'PUT',
24
+ path: '/homepage/layout',
25
+ handler: 'homepage.updateHomepageLayout',
26
+ config: {
27
+ policies: [
28
+ 'admin::isAuthenticatedAdmin'
29
+ ]
30
+ }
11
31
  }
12
32
  ];
13
33
 
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.mjs","sources":["../../../../../server/src/routes/homepage.ts"],"sourcesContent":["export default [\n {\n method: 'GET',\n path: '/homepage/key-statistics',\n handler: 'homepage.getKeyStatistics',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n];\n"],"names":["method","path","handler","config","policies"],"mappings":"AAAA,eAAe;AACb,IAAA;QACEA,MAAQ,EAAA,KAAA;QACRC,IAAM,EAAA,0BAAA;QACNC,OAAS,EAAA,2BAAA;QACTC,MAAQ,EAAA;YACNC,QAAU,EAAA;AAAC,gBAAA;AAA8B;AAC3C;AACF;CACD;;;;"}
1
+ {"version":3,"file":"homepage.mjs","sources":["../../../../../server/src/routes/homepage.ts"],"sourcesContent":["export default [\n {\n method: 'GET',\n path: '/homepage/key-statistics',\n handler: 'homepage.getKeyStatistics',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/homepage/layout',\n handler: 'homepage.getHomepageLayout',\n config: { policies: ['admin::isAuthenticatedAdmin'] },\n },\n {\n method: 'PUT',\n path: '/homepage/layout',\n handler: 'homepage.updateHomepageLayout',\n config: { policies: ['admin::isAuthenticatedAdmin'] },\n },\n];\n"],"names":["method","path","handler","config","policies"],"mappings":"AAAA,eAAe;AACb,IAAA;QACEA,MAAQ,EAAA,KAAA;QACRC,IAAM,EAAA,0BAAA;QACNC,OAAS,EAAA,2BAAA;QACTC,MAAQ,EAAA;YACNC,QAAU,EAAA;AAAC,gBAAA;AAA8B;AAC3C;AACF,KAAA;AACA,IAAA;QACEJ,MAAQ,EAAA,KAAA;QACRC,IAAM,EAAA,kBAAA;QACNC,OAAS,EAAA,4BAAA;QACTC,MAAQ,EAAA;YAAEC,QAAU,EAAA;AAAC,gBAAA;AAA8B;AAAC;AACtD,KAAA;AACA,IAAA;QACEJ,MAAQ,EAAA,KAAA;QACRC,IAAM,EAAA,kBAAA;QACNC,OAAS,EAAA,+BAAA;QACTC,MAAQ,EAAA;YAAEC,QAAU,EAAA;AAAC,gBAAA;AAA8B;AAAC;AACtD;CACD;;;;"}
@@ -1,9 +1,16 @@
1
1
  'use strict';
2
2
 
3
3
  var index = require('../utils/index.js');
4
+ var schema = require('../controllers/validation/schema.js');
4
5
 
6
+ const DEFAULT_WIDTH = 6;
7
+ const keyFor = (userId)=>`homepage-layout:${userId}`;
5
8
  const isContentTypeVisible = (model)=>model?.pluginOptions?.['content-type-builder']?.visible !== false;
6
9
  const homepageService = ({ strapi })=>{
10
+ const adminStore = strapi.store({
11
+ type: 'core',
12
+ name: 'admin'
13
+ });
7
14
  const getKeyStatistics = async ()=>{
8
15
  const contentTypes = Object.entries(strapi.contentTypes).filter(([, contentType])=>{
9
16
  return isContentTypeVisible(contentType);
@@ -25,8 +32,48 @@ const homepageService = ({ strapi })=>{
25
32
  apiTokens: countApiTokens
26
33
  };
27
34
  };
35
+ const getHomepageLayout = async (userId)=>{
36
+ const key = keyFor(userId);
37
+ const value = await adminStore.get({
38
+ key
39
+ });
40
+ if (!value) {
41
+ // nothing saved yet
42
+ return null;
43
+ }
44
+ return schema.HomepageLayoutSchema.parse(value);
45
+ };
46
+ const updateHomepageLayout = async (userId, input)=>{
47
+ const write = schema.HomepageLayoutWriteSchema.parse(input);
48
+ const key = keyFor(userId);
49
+ const currentRaw = await adminStore.get({
50
+ key
51
+ });
52
+ const current = currentRaw ? schema.HomepageLayoutSchema.parse(currentRaw) : null;
53
+ const widgetsNext = write.widgets ?? current?.widgets ?? [];
54
+ // Normalize widths (fill defaults where missing)
55
+ const normalizedWidgets = widgetsNext.map((w)=>{
56
+ const prev = current?.widgets.find((cw)=>cw.uid === w.uid);
57
+ return {
58
+ uid: w.uid,
59
+ width: w.width ?? prev?.width ?? DEFAULT_WIDTH
60
+ };
61
+ });
62
+ const next = {
63
+ version: write.version ?? 1,
64
+ widgets: normalizedWidgets,
65
+ updatedAt: write.updatedAt ?? new Date().toISOString()
66
+ };
67
+ await adminStore.set({
68
+ key,
69
+ value: next
70
+ });
71
+ return next;
72
+ };
28
73
  return {
29
- getKeyStatistics
74
+ getKeyStatistics,
75
+ getHomepageLayout,
76
+ updateHomepageLayout
30
77
  };
31
78
  };
32
79
 
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.js","sources":["../../../../../server/src/services/homepage.ts"],"sourcesContent":["import { Core } from '@strapi/types';\nimport { getService } from '../utils';\n\nconst isContentTypeVisible = (model: any) =>\n model?.pluginOptions?.['content-type-builder']?.visible !== false;\n\nexport const homepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const getKeyStatistics = async () => {\n const contentTypes = Object.entries(strapi.contentTypes).filter(([, contentType]) => {\n return isContentTypeVisible(contentType);\n });\n\n const countApiTokens = await getService('api-token').count();\n const countAdmins = await getService('user').count();\n const countLocales = (await strapi.plugin('i18n')?.service('locales')?.count()) ?? null;\n const countsAssets = await strapi.db.query('plugin::upload.file').count();\n const countWebhooks = await strapi.db.query('strapi::webhook').count();\n\n const componentCategories = new Set(\n Object.values(strapi.components).map((component) => component.category)\n );\n const components = Array.from(componentCategories);\n\n return {\n assets: countsAssets,\n contentTypes: contentTypes.length,\n components: components.length,\n locales: countLocales,\n admins: countAdmins,\n webhooks: countWebhooks,\n apiTokens: countApiTokens,\n };\n };\n\n return {\n getKeyStatistics,\n };\n};\n"],"names":["isContentTypeVisible","model","pluginOptions","visible","homepageService","strapi","getKeyStatistics","contentTypes","Object","entries","filter","contentType","countApiTokens","getService","count","countAdmins","countLocales","plugin","service","countsAssets","db","query","countWebhooks","componentCategories","Set","values","components","map","component","category","Array","from","assets","length","locales","admins","webhooks","apiTokens"],"mappings":";;;;AAGA,MAAMA,oBAAAA,GAAuB,CAACC,KAC5BA,GAAAA,KAAAA,EAAOC,gBAAgB,sBAAA,CAAuB,EAAEC,OAAY,KAAA,KAAA;AAEjDC,MAAAA,eAAAA,GAAkB,CAAC,EAAEC,MAAM,EAA2B,GAAA;AACjE,IAAA,MAAMC,gBAAmB,GAAA,UAAA;QACvB,MAAMC,YAAAA,GAAeC,MAAOC,CAAAA,OAAO,CAACJ,MAAAA,CAAOE,YAAY,CAAA,CAAEG,MAAM,CAAC,CAAC,GAAGC,WAAY,CAAA,GAAA;AAC9E,YAAA,OAAOX,oBAAqBW,CAAAA,WAAAA,CAAAA;AAC9B,SAAA,CAAA;AAEA,QAAA,MAAMC,cAAiB,GAAA,MAAMC,gBAAW,CAAA,WAAA,CAAA,CAAaC,KAAK,EAAA;AAC1D,QAAA,MAAMC,WAAc,GAAA,MAAMF,gBAAW,CAAA,MAAA,CAAA,CAAQC,KAAK,EAAA;QAClD,MAAME,YAAAA,GAAe,MAAOX,MAAAA,CAAOY,MAAM,CAAC,MAAA,CAAA,EAASC,OAAQ,CAAA,SAAA,CAAA,EAAYJ,KAAY,EAAA,IAAA,IAAA;QACnF,MAAMK,YAAAA,GAAe,MAAMd,MAAOe,CAAAA,EAAE,CAACC,KAAK,CAAC,uBAAuBP,KAAK,EAAA;QACvE,MAAMQ,aAAAA,GAAgB,MAAMjB,MAAOe,CAAAA,EAAE,CAACC,KAAK,CAAC,mBAAmBP,KAAK,EAAA;AAEpE,QAAA,MAAMS,mBAAsB,GAAA,IAAIC,GAC9BhB,CAAAA,MAAAA,CAAOiB,MAAM,CAACpB,MAAAA,CAAOqB,UAAU,CAAA,CAAEC,GAAG,CAAC,CAACC,SAAAA,GAAcA,UAAUC,QAAQ,CAAA,CAAA;QAExE,MAAMH,UAAAA,GAAaI,KAAMC,CAAAA,IAAI,CAACR,mBAAAA,CAAAA;QAE9B,OAAO;YACLS,MAAQb,EAAAA,YAAAA;AACRZ,YAAAA,YAAAA,EAAcA,aAAa0B,MAAM;AACjCP,YAAAA,UAAAA,EAAYA,WAAWO,MAAM;YAC7BC,OAASlB,EAAAA,YAAAA;YACTmB,MAAQpB,EAAAA,WAAAA;YACRqB,QAAUd,EAAAA,aAAAA;YACVe,SAAWzB,EAAAA;AACb,SAAA;AACF,KAAA;IAEA,OAAO;AACLN,QAAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"homepage.js","sources":["../../../../../server/src/services/homepage.ts"],"sourcesContent":["import { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n HomepageLayout,\n HomepageLayoutSchema,\n HomepageLayoutWrite,\n HomepageLayoutWriteSchema,\n} from '../controllers/validation/schema';\n\nconst DEFAULT_WIDTH = 6 as const;\nconst keyFor = (userId: number) => `homepage-layout:${userId}`;\n\nconst isContentTypeVisible = (model: any) =>\n model?.pluginOptions?.['content-type-builder']?.visible !== false;\n\nexport const homepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const adminStore = strapi.store({ type: 'core', name: 'admin' });\n const getKeyStatistics = async () => {\n const contentTypes = Object.entries(strapi.contentTypes).filter(([, contentType]) => {\n return isContentTypeVisible(contentType);\n });\n\n const countApiTokens = await getService('api-token').count();\n const countAdmins = await getService('user').count();\n const countLocales = (await strapi.plugin('i18n')?.service('locales')?.count()) ?? null;\n const countsAssets = await strapi.db.query('plugin::upload.file').count();\n const countWebhooks = await strapi.db.query('strapi::webhook').count();\n\n const componentCategories = new Set(\n Object.values(strapi.components).map((component) => component.category)\n );\n const components = Array.from(componentCategories);\n\n return {\n assets: countsAssets,\n contentTypes: contentTypes.length,\n components: components.length,\n locales: countLocales,\n admins: countAdmins,\n webhooks: countWebhooks,\n apiTokens: countApiTokens,\n };\n };\n\n const getHomepageLayout = async (userId: number): Promise<HomepageLayout | null> => {\n const key = keyFor(userId);\n const value = await adminStore.get({ key });\n if (!value) {\n // nothing saved yet\n return null;\n }\n\n return HomepageLayoutSchema.parse(value);\n };\n\n const updateHomepageLayout = async (userId: number, input: unknown): Promise<HomepageLayout> => {\n const write: HomepageLayoutWrite = HomepageLayoutWriteSchema.parse(input);\n\n const key = keyFor(userId);\n\n const currentRaw = await adminStore.get({ key });\n const current: HomepageLayout | null = currentRaw\n ? HomepageLayoutSchema.parse(currentRaw)\n : null;\n\n const widgetsNext = write.widgets ?? current?.widgets ?? [];\n\n // Normalize widths (fill defaults where missing)\n const normalizedWidgets = widgetsNext.map((w) => {\n const prev = current?.widgets.find((cw) => cw.uid === w.uid);\n return {\n uid: w.uid,\n width: w.width ?? prev?.width ?? DEFAULT_WIDTH,\n };\n });\n\n const next: HomepageLayout = {\n version: write.version ?? 1,\n widgets: normalizedWidgets,\n updatedAt: write.updatedAt ?? new Date().toISOString(),\n };\n\n await adminStore.set({ key, value: next });\n return next;\n };\n return {\n getKeyStatistics,\n getHomepageLayout,\n updateHomepageLayout,\n };\n};\n"],"names":["DEFAULT_WIDTH","keyFor","userId","isContentTypeVisible","model","pluginOptions","visible","homepageService","strapi","adminStore","store","type","name","getKeyStatistics","contentTypes","Object","entries","filter","contentType","countApiTokens","getService","count","countAdmins","countLocales","plugin","service","countsAssets","db","query","countWebhooks","componentCategories","Set","values","components","map","component","category","Array","from","assets","length","locales","admins","webhooks","apiTokens","getHomepageLayout","key","value","get","HomepageLayoutSchema","parse","updateHomepageLayout","input","write","HomepageLayoutWriteSchema","currentRaw","current","widgetsNext","widgets","normalizedWidgets","w","prev","find","cw","uid","width","next","version","updatedAt","Date","toISOString","set"],"mappings":"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"}