@strapi/core 0.0.0-experimental.aa8f064c5e2c0138b780746dc4455c060da87829 → 0.0.0-experimental.ab7bb8f8d3c8871e51e0720c5d36d826309f80b5

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.

Potentially problematic release.


This version of @strapi/core might be problematic. Click here for more details.

Files changed (281) hide show
  1. package/dist/Strapi.d.ts +1 -0
  2. package/dist/Strapi.d.ts.map +1 -1
  3. package/dist/Strapi.js +22 -5
  4. package/dist/Strapi.js.map +1 -1
  5. package/dist/Strapi.mjs +22 -5
  6. package/dist/Strapi.mjs.map +1 -1
  7. package/dist/configuration/config-loader.js.map +1 -1
  8. package/dist/configuration/config-loader.mjs.map +1 -1
  9. package/dist/configuration/urls.js.map +1 -1
  10. package/dist/configuration/urls.mjs.map +1 -1
  11. package/dist/constants.d.ts +3 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +6 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/constants.mjs +4 -0
  16. package/dist/constants.mjs.map +1 -0
  17. package/dist/container.js.map +1 -1
  18. package/dist/container.mjs.map +1 -1
  19. package/dist/core-api/controller/index.d.ts.map +1 -1
  20. package/dist/core-api/controller/index.js +2 -1
  21. package/dist/core-api/controller/index.js.map +1 -1
  22. package/dist/core-api/controller/index.mjs +2 -1
  23. package/dist/core-api/controller/index.mjs.map +1 -1
  24. package/dist/core-api/controller/transform.d.ts +3 -2
  25. package/dist/core-api/controller/transform.d.ts.map +1 -1
  26. package/dist/core-api/controller/transform.js +13 -3
  27. package/dist/core-api/controller/transform.js.map +1 -1
  28. package/dist/core-api/controller/transform.mjs +13 -3
  29. package/dist/core-api/controller/transform.mjs.map +1 -1
  30. package/dist/core-api/routes/index.d.ts +4 -22
  31. package/dist/core-api/routes/index.d.ts.map +1 -1
  32. package/dist/core-api/routes/index.js +150 -8
  33. package/dist/core-api/routes/index.js.map +1 -1
  34. package/dist/core-api/routes/index.mjs +131 -8
  35. package/dist/core-api/routes/index.mjs.map +1 -1
  36. package/dist/core-api/routes/validation/attributes.d.ts +244 -0
  37. package/dist/core-api/routes/validation/attributes.d.ts.map +1 -0
  38. package/dist/core-api/routes/validation/attributes.js +560 -0
  39. package/dist/core-api/routes/validation/attributes.js.map +1 -0
  40. package/dist/core-api/routes/validation/attributes.mjs +521 -0
  41. package/dist/core-api/routes/validation/attributes.mjs.map +1 -0
  42. package/dist/core-api/routes/validation/common.d.ts +105 -0
  43. package/dist/core-api/routes/validation/common.d.ts.map +1 -0
  44. package/dist/core-api/routes/validation/common.js +116 -0
  45. package/dist/core-api/routes/validation/common.js.map +1 -0
  46. package/dist/core-api/routes/validation/common.mjs +95 -0
  47. package/dist/core-api/routes/validation/common.mjs.map +1 -0
  48. package/dist/core-api/routes/validation/component.d.ts +34 -0
  49. package/dist/core-api/routes/validation/component.d.ts.map +1 -0
  50. package/dist/core-api/routes/validation/component.js +45 -0
  51. package/dist/core-api/routes/validation/component.js.map +1 -0
  52. package/dist/core-api/routes/validation/component.mjs +43 -0
  53. package/dist/core-api/routes/validation/component.mjs.map +1 -0
  54. package/dist/core-api/routes/validation/constants.d.ts +8 -0
  55. package/dist/core-api/routes/validation/constants.d.ts.map +1 -0
  56. package/dist/core-api/routes/validation/constants.js +18 -0
  57. package/dist/core-api/routes/validation/constants.js.map +1 -0
  58. package/dist/core-api/routes/validation/constants.mjs +16 -0
  59. package/dist/core-api/routes/validation/constants.mjs.map +1 -0
  60. package/dist/core-api/routes/validation/content-type.d.ts +128 -0
  61. package/dist/core-api/routes/validation/content-type.d.ts.map +1 -0
  62. package/dist/core-api/routes/validation/content-type.js +201 -0
  63. package/dist/core-api/routes/validation/content-type.js.map +1 -0
  64. package/dist/core-api/routes/validation/content-type.mjs +180 -0
  65. package/dist/core-api/routes/validation/content-type.mjs.map +1 -0
  66. package/dist/core-api/routes/validation/index.d.ts +5 -0
  67. package/dist/core-api/routes/validation/index.d.ts.map +1 -0
  68. package/dist/core-api/routes/validation/mappers.d.ts +105 -0
  69. package/dist/core-api/routes/validation/mappers.d.ts.map +1 -0
  70. package/dist/core-api/routes/validation/mappers.js +273 -0
  71. package/dist/core-api/routes/validation/mappers.js.map +1 -0
  72. package/dist/core-api/routes/validation/mappers.mjs +249 -0
  73. package/dist/core-api/routes/validation/mappers.mjs.map +1 -0
  74. package/dist/core-api/routes/validation/utils.d.ts +47 -0
  75. package/dist/core-api/routes/validation/utils.d.ts.map +1 -0
  76. package/dist/core-api/routes/validation/utils.js +128 -0
  77. package/dist/core-api/routes/validation/utils.js.map +1 -0
  78. package/dist/core-api/routes/validation/utils.mjs +106 -0
  79. package/dist/core-api/routes/validation/utils.mjs.map +1 -0
  80. package/dist/core-api/service/collection-type.js.map +1 -1
  81. package/dist/core-api/service/collection-type.mjs.map +1 -1
  82. package/dist/core-api/service/single-type.js.map +1 -1
  83. package/dist/core-api/service/single-type.mjs.map +1 -1
  84. package/dist/domain/content-type/index.d.ts.map +1 -1
  85. package/dist/domain/content-type/index.js +17 -1
  86. package/dist/domain/content-type/index.js.map +1 -1
  87. package/dist/domain/content-type/index.mjs +17 -1
  88. package/dist/domain/content-type/index.mjs.map +1 -1
  89. package/dist/domain/module/index.d.ts.map +1 -1
  90. package/dist/domain/module/index.js +3 -0
  91. package/dist/domain/module/index.js.map +1 -1
  92. package/dist/domain/module/index.mjs +3 -0
  93. package/dist/domain/module/index.mjs.map +1 -1
  94. package/dist/ee/index.js.map +1 -1
  95. package/dist/ee/index.mjs.map +1 -1
  96. package/dist/ee/license.js +1 -2
  97. package/dist/ee/license.js.map +1 -1
  98. package/dist/ee/license.mjs +1 -2
  99. package/dist/ee/license.mjs.map +1 -1
  100. package/dist/factories.d.ts +3 -1
  101. package/dist/factories.d.ts.map +1 -1
  102. package/dist/factories.js +10 -2
  103. package/dist/factories.js.map +1 -1
  104. package/dist/factories.mjs +10 -3
  105. package/dist/factories.mjs.map +1 -1
  106. package/dist/loaders/apis.js.map +1 -1
  107. package/dist/loaders/apis.mjs.map +1 -1
  108. package/dist/loaders/components.js.map +1 -1
  109. package/dist/loaders/components.mjs.map +1 -1
  110. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  111. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  112. package/dist/loaders/plugins/index.js +1 -1
  113. package/dist/loaders/plugins/index.js.map +1 -1
  114. package/dist/loaders/plugins/index.mjs +1 -1
  115. package/dist/loaders/plugins/index.mjs.map +1 -1
  116. package/dist/loaders/src-index.js.map +1 -1
  117. package/dist/loaders/src-index.mjs.map +1 -1
  118. package/dist/middlewares/cors.d.ts +9 -1
  119. package/dist/middlewares/cors.d.ts.map +1 -1
  120. package/dist/middlewares/cors.js +39 -17
  121. package/dist/middlewares/cors.js.map +1 -1
  122. package/dist/middlewares/cors.mjs +39 -18
  123. package/dist/middlewares/cors.mjs.map +1 -1
  124. package/dist/middlewares/logger.js.map +1 -1
  125. package/dist/middlewares/logger.mjs.map +1 -1
  126. package/dist/middlewares/response-time.js.map +1 -1
  127. package/dist/middlewares/response-time.mjs.map +1 -1
  128. package/dist/middlewares/security.d.ts.map +1 -1
  129. package/dist/middlewares/security.js +2 -15
  130. package/dist/middlewares/security.js.map +1 -1
  131. package/dist/middlewares/security.mjs +2 -15
  132. package/dist/middlewares/security.mjs.map +1 -1
  133. package/dist/migrations/database/5.0.0-discard-drafts.js +1 -1
  134. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  135. package/dist/migrations/database/5.0.0-discard-drafts.mjs +1 -1
  136. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  137. package/dist/migrations/first-published-at.d.ts +4 -0
  138. package/dist/migrations/first-published-at.d.ts.map +1 -0
  139. package/dist/migrations/first-published-at.js +51 -0
  140. package/dist/migrations/first-published-at.js.map +1 -0
  141. package/dist/migrations/first-published-at.mjs +49 -0
  142. package/dist/migrations/first-published-at.mjs.map +1 -0
  143. package/dist/migrations/index.d.ts.map +1 -1
  144. package/dist/migrations/index.js +5 -0
  145. package/dist/migrations/index.js.map +1 -1
  146. package/dist/migrations/index.mjs +5 -0
  147. package/dist/migrations/index.mjs.map +1 -1
  148. package/dist/package.json.js +19 -16
  149. package/dist/package.json.js.map +1 -1
  150. package/dist/package.json.mjs +19 -16
  151. package/dist/package.json.mjs.map +1 -1
  152. package/dist/providers/index.d.ts.map +1 -1
  153. package/dist/providers/index.js +2 -0
  154. package/dist/providers/index.js.map +1 -1
  155. package/dist/providers/index.mjs +2 -0
  156. package/dist/providers/index.mjs.map +1 -1
  157. package/dist/providers/session-manager.d.ts +3 -0
  158. package/dist/providers/session-manager.d.ts.map +1 -0
  159. package/dist/providers/session-manager.js +23 -0
  160. package/dist/providers/session-manager.js.map +1 -0
  161. package/dist/providers/session-manager.mjs +21 -0
  162. package/dist/providers/session-manager.mjs.map +1 -0
  163. package/dist/registries/apis.js.map +1 -1
  164. package/dist/registries/apis.mjs.map +1 -1
  165. package/dist/registries/custom-fields.js.map +1 -1
  166. package/dist/registries/custom-fields.mjs.map +1 -1
  167. package/dist/registries/namespace.js.map +1 -1
  168. package/dist/registries/namespace.mjs.map +1 -1
  169. package/dist/registries/plugins.js.map +1 -1
  170. package/dist/registries/plugins.mjs.map +1 -1
  171. package/dist/registries/policies.js.map +1 -1
  172. package/dist/registries/policies.mjs.map +1 -1
  173. package/dist/services/config.js.map +1 -1
  174. package/dist/services/config.mjs.map +1 -1
  175. package/dist/services/content-api/index.d.ts +1 -1
  176. package/dist/services/content-api/index.d.ts.map +1 -1
  177. package/dist/services/content-api/index.js +1 -1
  178. package/dist/services/content-api/index.js.map +1 -1
  179. package/dist/services/content-api/index.mjs +2 -2
  180. package/dist/services/content-api/index.mjs.map +1 -1
  181. package/dist/services/content-api/permissions/index.js.map +1 -1
  182. package/dist/services/content-api/permissions/index.mjs.map +1 -1
  183. package/dist/services/content-source-maps.d.ts +13 -0
  184. package/dist/services/content-source-maps.d.ts.map +1 -0
  185. package/dist/services/content-source-maps.js +108 -0
  186. package/dist/services/content-source-maps.js.map +1 -0
  187. package/dist/services/content-source-maps.mjs +106 -0
  188. package/dist/services/content-source-maps.mjs.map +1 -0
  189. package/dist/services/core-store.js.map +1 -1
  190. package/dist/services/core-store.mjs.map +1 -1
  191. package/dist/services/document-service/components.d.ts +31 -1
  192. package/dist/services/document-service/components.d.ts.map +1 -1
  193. package/dist/services/document-service/components.js +109 -0
  194. package/dist/services/document-service/components.js.map +1 -1
  195. package/dist/services/document-service/components.mjs +107 -1
  196. package/dist/services/document-service/components.mjs.map +1 -1
  197. package/dist/services/document-service/first-published-at.d.ts +7 -0
  198. package/dist/services/document-service/first-published-at.d.ts.map +1 -0
  199. package/dist/services/document-service/first-published-at.js +31 -0
  200. package/dist/services/document-service/first-published-at.js.map +1 -0
  201. package/dist/services/document-service/first-published-at.mjs +28 -0
  202. package/dist/services/document-service/first-published-at.mjs.map +1 -0
  203. package/dist/services/document-service/repository.d.ts.map +1 -1
  204. package/dist/services/document-service/repository.js +12 -5
  205. package/dist/services/document-service/repository.js.map +1 -1
  206. package/dist/services/document-service/repository.mjs +13 -6
  207. package/dist/services/document-service/repository.mjs.map +1 -1
  208. package/dist/services/document-service/transform/fields.js.map +1 -1
  209. package/dist/services/document-service/transform/fields.mjs.map +1 -1
  210. package/dist/services/document-service/transform/id-map.js.map +1 -1
  211. package/dist/services/document-service/transform/id-map.mjs.map +1 -1
  212. package/dist/services/document-service/utils/clean-component-join-table.d.ts +7 -0
  213. package/dist/services/document-service/utils/clean-component-join-table.d.ts.map +1 -0
  214. package/dist/services/document-service/utils/clean-component-join-table.js +145 -0
  215. package/dist/services/document-service/utils/clean-component-join-table.js.map +1 -0
  216. package/dist/services/document-service/utils/clean-component-join-table.mjs +143 -0
  217. package/dist/services/document-service/utils/clean-component-join-table.mjs.map +1 -0
  218. package/dist/services/document-service/utils/unidirectional-relations.d.ts +19 -2
  219. package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
  220. package/dist/services/document-service/utils/unidirectional-relations.js +21 -6
  221. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
  222. package/dist/services/document-service/utils/unidirectional-relations.mjs +21 -6
  223. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
  224. package/dist/services/entity-service/index.js.map +1 -1
  225. package/dist/services/entity-service/index.mjs.map +1 -1
  226. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  227. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  228. package/dist/services/entity-validator/index.js.map +1 -1
  229. package/dist/services/entity-validator/index.mjs.map +1 -1
  230. package/dist/services/metrics/index.d.ts +1 -1
  231. package/dist/services/metrics/index.d.ts.map +1 -1
  232. package/dist/services/metrics/index.js +11 -9
  233. package/dist/services/metrics/index.js.map +1 -1
  234. package/dist/services/metrics/index.mjs +11 -9
  235. package/dist/services/metrics/index.mjs.map +1 -1
  236. package/dist/services/metrics/middleware.d.ts +2 -1
  237. package/dist/services/metrics/middleware.d.ts.map +1 -1
  238. package/dist/services/metrics/middleware.js +2 -2
  239. package/dist/services/metrics/middleware.js.map +1 -1
  240. package/dist/services/metrics/middleware.mjs +2 -2
  241. package/dist/services/metrics/middleware.mjs.map +1 -1
  242. package/dist/services/metrics/sender.d.ts.map +1 -1
  243. package/dist/services/metrics/sender.js +4 -3
  244. package/dist/services/metrics/sender.js.map +1 -1
  245. package/dist/services/metrics/sender.mjs +4 -3
  246. package/dist/services/metrics/sender.mjs.map +1 -1
  247. package/dist/services/server/compose-endpoint.js.map +1 -1
  248. package/dist/services/server/compose-endpoint.mjs.map +1 -1
  249. package/dist/services/server/index.js.map +1 -1
  250. package/dist/services/server/index.mjs.map +1 -1
  251. package/dist/services/server/middleware.js.map +1 -1
  252. package/dist/services/server/middleware.mjs.map +1 -1
  253. package/dist/services/server/register-routes.js +22 -2
  254. package/dist/services/server/register-routes.js.map +1 -1
  255. package/dist/services/server/register-routes.mjs +22 -2
  256. package/dist/services/server/register-routes.mjs.map +1 -1
  257. package/dist/services/server/routing.d.ts +10 -0
  258. package/dist/services/server/routing.d.ts.map +1 -1
  259. package/dist/services/server/routing.js +7 -1
  260. package/dist/services/server/routing.js.map +1 -1
  261. package/dist/services/server/routing.mjs +7 -1
  262. package/dist/services/server/routing.mjs.map +1 -1
  263. package/dist/services/session-manager.d.ts +167 -0
  264. package/dist/services/session-manager.d.ts.map +1 -0
  265. package/dist/services/session-manager.js +529 -0
  266. package/dist/services/session-manager.js.map +1 -0
  267. package/dist/services/session-manager.mjs +526 -0
  268. package/dist/services/session-manager.mjs.map +1 -0
  269. package/dist/services/webhook-runner.js.map +1 -1
  270. package/dist/services/webhook-runner.mjs.map +1 -1
  271. package/dist/services/worker-queue.js.map +1 -1
  272. package/dist/services/worker-queue.mjs.map +1 -1
  273. package/dist/utils/fetch.js.map +1 -1
  274. package/dist/utils/fetch.mjs.map +1 -1
  275. package/dist/utils/filepath-to-prop-path.js.map +1 -1
  276. package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
  277. package/dist/utils/load-config-file.js.map +1 -1
  278. package/dist/utils/load-config-file.mjs.map +1 -1
  279. package/dist/utils/startup-logger.js.map +1 -1
  280. package/dist/utils/startup-logger.mjs.map +1 -1
  281. package/package.json +19 -16
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var nodeSchedule = require('node-schedule');
4
3
  var rateLimiter = require('./rate-limiter.js');
5
4
  var sender = require('./sender.js');
6
5
  var middleware = require('./middleware.js');
@@ -17,7 +16,6 @@ const createTelemetryInstance = (strapi)=>{
17
16
  const uuid = strapi.config.get('uuid');
18
17
  const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');
19
18
  const isDisabled = !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);
20
- const crons = [];
21
19
  const sender$1 = sender(strapi);
22
20
  const sendEvent = rateLimiter(sender$1, {
23
21
  limitedEvents: LIMITED_EVENTS
@@ -28,21 +26,25 @@ const createTelemetryInstance = (strapi)=>{
28
26
  },
29
27
  register () {
30
28
  if (!isDisabled) {
31
- const pingCron = nodeSchedule.scheduleJob('0 0 12 * * *', ()=>sendEvent('ping'));
32
- crons.push(pingCron);
29
+ strapi.cron.add({
30
+ sendPingEvent: {
31
+ task: ()=>sendEvent('ping'),
32
+ options: '0 0 12 * * *'
33
+ }
34
+ });
33
35
  strapi.server.use(middleware({
34
- sendEvent
36
+ sendEvent,
37
+ strapi
35
38
  }));
36
39
  }
37
40
  },
38
41
  bootstrap () {},
39
- destroy () {
40
- // Clear open handles
41
- crons.forEach((cron)=>cron.cancel());
42
- },
43
42
  async send (event, payload = {}) {
44
43
  if (isDisabled) return true;
45
44
  return sendEvent(event, payload);
45
+ },
46
+ destroy () {
47
+ // Clean up resources if needed
46
48
  }
47
49
  };
48
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport { Job, scheduleJob } from 'node-schedule';\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n const crons: Job[] = [];\n const sender = createSender(strapi);\n const sendEvent = wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS });\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled) {\n const pingCron = scheduleJob('0 0 12 * * *', () => sendEvent('ping'));\n crons.push(pingCron);\n\n strapi.server.use(createMiddleware({ sendEvent }));\n }\n },\n\n bootstrap() {},\n\n destroy() {\n // Clear open handles\n crons.forEach((cron) => cron.cancel());\n },\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled) return true;\n return sendEvent(event, payload);\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","crons","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","pingCron","scheduleJob","push","server","use","createMiddleware","bootstrap","destroy","forEach","cron","cancel","send","event","payload"],"mappings":";;;;;;;;AAaA,MAAMA,cAAiB,GAAA;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAOD,GAAAA,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAoBJ,GAAAA,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAQK,IAAAA,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAASF,CAAAA,iBAAAA,CAAAA;AAEvE,IAAA,MAAMM,QAAe,EAAE;AACvB,IAAA,MAAMC,WAASC,MAAaZ,CAAAA,MAAAA,CAAAA;IAC5B,MAAMa,SAAAA,GAAYC,YAAkBH,QAAQ,EAAA;QAAEI,aAAejB,EAAAA;AAAe,KAAA,CAAA;IAE5E,OAAO;AACL,QAAA,IAAIO,UAAa,CAAA,GAAA;YACf,OAAOA,UAAAA;AACT,SAAA;AAEAW,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACX,UAAY,EAAA;AACf,gBAAA,MAAMY,QAAWC,GAAAA,wBAAAA,CAAY,cAAgB,EAAA,IAAML,SAAU,CAAA,MAAA,CAAA,CAAA;AAC7DH,gBAAAA,KAAAA,CAAMS,IAAI,CAACF,QAAAA,CAAAA;AAEXjB,gBAAAA,MAAAA,CAAOoB,MAAM,CAACC,GAAG,CAACC,UAAiB,CAAA;AAAET,oBAAAA;AAAU,iBAAA,CAAA,CAAA;AACjD;AACF,SAAA;QAEAU,SAAa,CAAA,GAAA,EAAA;AAEbC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEEd,YAAAA,KAAAA,CAAMe,OAAO,CAAC,CAACC,IAAAA,GAASA,KAAKC,MAAM,EAAA,CAAA;AACrC,SAAA;AAEA,QAAA,MAAMC,IAAKC,CAAAA,CAAAA,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;AAC7D,YAAA,IAAIzB,YAAY,OAAO,IAAA;AACvB,YAAA,OAAOQ,UAAUgB,KAAOC,EAAAA,OAAAA,CAAAA;AAC1B;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n const sender = createSender(strapi);\n const sendEvent = wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS });\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled) {\n strapi.cron.add({\n sendPingEvent: {\n task: () => sendEvent('ping'),\n options: '0 0 12 * * *',\n },\n });\n\n strapi.server.use(createMiddleware({ sendEvent, strapi }));\n }\n },\n\n bootstrap() {},\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled) return true;\n return sendEvent(event, payload);\n },\n\n destroy() {\n // Clean up resources if needed\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","cron","add","sendPingEvent","task","options","server","use","createMiddleware","bootstrap","send","event","payload","destroy"],"mappings":";;;;;;;AAYA,MAAMA,cAAiB,GAAA;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAOD,GAAAA,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAoBJ,GAAAA,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAQK,IAAAA,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAASF,CAAAA,iBAAAA,CAAAA;AAEvE,IAAA,MAAMM,WAASC,MAAaX,CAAAA,MAAAA,CAAAA;IAC5B,MAAMY,SAAAA,GAAYC,YAAkBH,QAAQ,EAAA;QAAEI,aAAehB,EAAAA;AAAe,KAAA,CAAA;IAE5E,OAAO;AACL,QAAA,IAAIO,UAAa,CAAA,GAAA;YACf,OAAOA,UAAAA;AACT,SAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACV,UAAY,EAAA;gBACfL,MAAOgB,CAAAA,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAe,EAAA;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAU,CAAA,MAAA,CAAA;wBACtBQ,OAAS,EAAA;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,UAAiB,CAAA;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD;AACF,SAAA;QAEAwB,SAAa,CAAA,GAAA,EAAA;AAEb,QAAA,MAAMC,IAAKC,CAAAA,CAAAA,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;AAC7D,YAAA,IAAItB,YAAY,OAAO,IAAA;AACvB,YAAA,OAAOO,UAAUc,KAAOC,EAAAA,OAAAA,CAAAA;AAC1B,SAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA;AACF,KAAA;AACF;;;;"}
@@ -1,4 +1,3 @@
1
- import { scheduleJob } from 'node-schedule';
2
1
  import wrapWithRateLimit from './rate-limiter.mjs';
3
2
  import createSender from './sender.mjs';
4
3
  import createMiddleware from './middleware.mjs';
@@ -15,7 +14,6 @@ const createTelemetryInstance = (strapi)=>{
15
14
  const uuid = strapi.config.get('uuid');
16
15
  const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');
17
16
  const isDisabled = !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);
18
- const crons = [];
19
17
  const sender = createSender(strapi);
20
18
  const sendEvent = wrapWithRateLimit(sender, {
21
19
  limitedEvents: LIMITED_EVENTS
@@ -26,21 +24,25 @@ const createTelemetryInstance = (strapi)=>{
26
24
  },
27
25
  register () {
28
26
  if (!isDisabled) {
29
- const pingCron = scheduleJob('0 0 12 * * *', ()=>sendEvent('ping'));
30
- crons.push(pingCron);
27
+ strapi.cron.add({
28
+ sendPingEvent: {
29
+ task: ()=>sendEvent('ping'),
30
+ options: '0 0 12 * * *'
31
+ }
32
+ });
31
33
  strapi.server.use(createMiddleware({
32
- sendEvent
34
+ sendEvent,
35
+ strapi
33
36
  }));
34
37
  }
35
38
  },
36
39
  bootstrap () {},
37
- destroy () {
38
- // Clear open handles
39
- crons.forEach((cron)=>cron.cancel());
40
- },
41
40
  async send (event, payload = {}) {
42
41
  if (isDisabled) return true;
43
42
  return sendEvent(event, payload);
43
+ },
44
+ destroy () {
45
+ // Clean up resources if needed
44
46
  }
45
47
  };
46
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport { Job, scheduleJob } from 'node-schedule';\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n const crons: Job[] = [];\n const sender = createSender(strapi);\n const sendEvent = wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS });\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled) {\n const pingCron = scheduleJob('0 0 12 * * *', () => sendEvent('ping'));\n crons.push(pingCron);\n\n strapi.server.use(createMiddleware({ sendEvent }));\n }\n },\n\n bootstrap() {},\n\n destroy() {\n // Clear open handles\n crons.forEach((cron) => cron.cancel());\n },\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled) return true;\n return sendEvent(event, payload);\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","crons","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","pingCron","scheduleJob","push","server","use","createMiddleware","bootstrap","destroy","forEach","cron","cancel","send","event","payload"],"mappings":";;;;;;AAaA,MAAMA,cAAiB,GAAA;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAOD,GAAAA,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAoBJ,GAAAA,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAQK,IAAAA,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAASF,CAAAA,iBAAAA,CAAAA;AAEvE,IAAA,MAAMM,QAAe,EAAE;AACvB,IAAA,MAAMC,SAASC,YAAaZ,CAAAA,MAAAA,CAAAA;IAC5B,MAAMa,SAAAA,GAAYC,kBAAkBH,MAAQ,EAAA;QAAEI,aAAejB,EAAAA;AAAe,KAAA,CAAA;IAE5E,OAAO;AACL,QAAA,IAAIO,UAAa,CAAA,GAAA;YACf,OAAOA,UAAAA;AACT,SAAA;AAEAW,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACX,UAAY,EAAA;AACf,gBAAA,MAAMY,QAAWC,GAAAA,WAAAA,CAAY,cAAgB,EAAA,IAAML,SAAU,CAAA,MAAA,CAAA,CAAA;AAC7DH,gBAAAA,KAAAA,CAAMS,IAAI,CAACF,QAAAA,CAAAA;AAEXjB,gBAAAA,MAAAA,CAAOoB,MAAM,CAACC,GAAG,CAACC,gBAAiB,CAAA;AAAET,oBAAAA;AAAU,iBAAA,CAAA,CAAA;AACjD;AACF,SAAA;QAEAU,SAAa,CAAA,GAAA,EAAA;AAEbC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEEd,YAAAA,KAAAA,CAAMe,OAAO,CAAC,CAACC,IAAAA,GAASA,KAAKC,MAAM,EAAA,CAAA;AACrC,SAAA;AAEA,QAAA,MAAMC,IAAKC,CAAAA,CAAAA,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;AAC7D,YAAA,IAAIzB,YAAY,OAAO,IAAA;AACvB,YAAA,OAAOQ,UAAUgB,KAAOC,EAAAA,OAAAA,CAAAA;AAC1B;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n const sender = createSender(strapi);\n const sendEvent = wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS });\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled) {\n strapi.cron.add({\n sendPingEvent: {\n task: () => sendEvent('ping'),\n options: '0 0 12 * * *',\n },\n });\n\n strapi.server.use(createMiddleware({ sendEvent, strapi }));\n }\n },\n\n bootstrap() {},\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled) return true;\n return sendEvent(event, payload);\n },\n\n destroy() {\n // Clean up resources if needed\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","cron","add","sendPingEvent","task","options","server","use","createMiddleware","bootstrap","send","event","payload","destroy"],"mappings":";;;;;AAYA,MAAMA,cAAiB,GAAA;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAOD,GAAAA,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAoBJ,GAAAA,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAQK,IAAAA,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAASF,CAAAA,iBAAAA,CAAAA;AAEvE,IAAA,MAAMM,SAASC,YAAaX,CAAAA,MAAAA,CAAAA;IAC5B,MAAMY,SAAAA,GAAYC,kBAAkBH,MAAQ,EAAA;QAAEI,aAAehB,EAAAA;AAAe,KAAA,CAAA;IAE5E,OAAO;AACL,QAAA,IAAIO,UAAa,CAAA,GAAA;YACf,OAAOA,UAAAA;AACT,SAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACV,UAAY,EAAA;gBACfL,MAAOgB,CAAAA,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAe,EAAA;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAU,CAAA,MAAA,CAAA;wBACtBQ,OAAS,EAAA;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,gBAAiB,CAAA;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD;AACF,SAAA;QAEAwB,SAAa,CAAA,GAAA,EAAA;AAEb,QAAA,MAAMC,IAAKC,CAAAA,CAAAA,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;AAC7D,YAAA,IAAItB,YAAY,OAAO,IAAA;AACvB,YAAA,OAAOO,UAAUc,KAAOC,EAAAA,OAAAA,CAAAA;AAC1B,SAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA;AACF,KAAA;AACF;;;;"}
@@ -1,7 +1,8 @@
1
1
  import type { Core } from '@strapi/types';
2
2
  import type { Sender } from './sender';
3
- declare const createMiddleware: ({ sendEvent }: {
3
+ declare const createMiddleware: ({ sendEvent, strapi }: {
4
4
  sendEvent: Sender;
5
+ strapi: Core.Strapi;
5
6
  }) => Core.MiddlewareHandler;
6
7
  export default createMiddleware;
7
8
  //# sourceMappingURL=middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAWvC,QAAA,MAAM,gBAAgB,kBAAmB;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,2BA4B7D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAWvC,QAAA,MAAM,gBAAgB,0BAA2B;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE,2BAgC1F,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -3,14 +3,14 @@
3
3
  function nextResetDate() {
4
4
  return Date.now() + 24 * 60 * 60 * 1000; // Now + 24 hours.
5
5
  }
6
- const createMiddleware = ({ sendEvent })=>{
6
+ const createMiddleware = ({ sendEvent, strapi })=>{
7
7
  const state = {
8
8
  expires: nextResetDate(),
9
9
  counter: 0
10
10
  };
11
11
  const middleware = async (ctx, next)=>{
12
12
  const { url, method } = ctx.request;
13
- if (!url.includes('.') && [
13
+ if (!url.includes('.') && url.includes(strapi.config.get('api.rest.prefix')) && [
14
14
  'GET',
15
15
  'PUT',
16
16
  'POST',
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sources":["../../../src/services/metrics/middleware.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { Sender } from './sender';\n\ninterface State {\n expires: number;\n counter: number;\n}\n\nfunction nextResetDate(): number {\n return Date.now() + 24 * 60 * 60 * 1000; // Now + 24 hours.\n}\n\nconst createMiddleware = ({ sendEvent }: { sendEvent: Sender }) => {\n const state: State = {\n expires: nextResetDate(),\n counter: 0,\n };\n\n const middleware: Core.MiddlewareHandler = async (ctx, next) => {\n const { url, method } = ctx.request;\n\n if (!url.includes('.') && ['GET', 'PUT', 'POST', 'DELETE'].includes(method)) {\n if (Date.now() > state.expires) {\n state.expires = nextResetDate();\n state.counter = 0;\n }\n\n // Send max. 1000 events per day.\n if (state.counter < 1000) {\n sendEvent('didReceiveRequest', { eventProperties: { url: ctx.request.url } });\n\n // Increase counter.\n state.counter += 1;\n }\n }\n\n await next();\n };\n\n return middleware;\n};\n\nexport default createMiddleware;\n"],"names":["nextResetDate","Date","now","createMiddleware","sendEvent","state","expires","counter","middleware","ctx","next","url","method","request","includes","eventProperties"],"mappings":";;AAQA,SAASA,aAAAA,GAAAA;AACP,IAAA,OAAOC,KAAKC,GAAG,EAAA,GAAK,KAAK,EAAK,GAAA,EAAA,GAAK;AACrC;AAEA,MAAMC,gBAAmB,GAAA,CAAC,EAAEC,SAAS,EAAyB,GAAA;AAC5D,IAAA,MAAMC,KAAe,GAAA;QACnBC,OAASN,EAAAA,aAAAA,EAAAA;QACTO,OAAS,EAAA;AACX,KAAA;IAEA,MAAMC,UAAAA,GAAqC,OAAOC,GAAKC,EAAAA,IAAAA,GAAAA;AACrD,QAAA,MAAM,EAAEC,GAAG,EAAEC,MAAM,EAAE,GAAGH,IAAII,OAAO;AAEnC,QAAA,IAAI,CAACF,GAAAA,CAAIG,QAAQ,CAAC,GAAQ,CAAA,IAAA;AAAC,YAAA,KAAA;AAAO,YAAA,KAAA;AAAO,YAAA,MAAA;AAAQ,YAAA;SAAS,CAACA,QAAQ,CAACF,MAAS,CAAA,EAAA;AAC3E,YAAA,IAAIX,IAAKC,CAAAA,GAAG,EAAKG,GAAAA,KAAAA,CAAMC,OAAO,EAAE;AAC9BD,gBAAAA,KAAAA,CAAMC,OAAO,GAAGN,aAAAA,EAAAA;AAChBK,gBAAAA,KAAAA,CAAME,OAAO,GAAG,CAAA;AAClB;;YAGA,IAAIF,KAAAA,CAAME,OAAO,GAAG,IAAM,EAAA;AACxBH,gBAAAA,SAAAA,CAAU,mBAAqB,EAAA;oBAAEW,eAAiB,EAAA;wBAAEJ,GAAKF,EAAAA,GAAAA,CAAII,OAAO,CAACF;AAAI;AAAE,iBAAA,CAAA;;AAG3EN,gBAAAA,KAAAA,CAAME,OAAO,IAAI,CAAA;AACnB;AACF;QAEA,MAAMG,IAAAA,EAAAA;AACR,KAAA;IAEA,OAAOF,UAAAA;AACT;;;;"}
1
+ {"version":3,"file":"middleware.js","sources":["../../../src/services/metrics/middleware.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { Sender } from './sender';\n\ninterface State {\n expires: number;\n counter: number;\n}\n\nfunction nextResetDate(): number {\n return Date.now() + 24 * 60 * 60 * 1000; // Now + 24 hours.\n}\n\nconst createMiddleware = ({ sendEvent, strapi }: { sendEvent: Sender; strapi: Core.Strapi }) => {\n const state: State = {\n expires: nextResetDate(),\n counter: 0,\n };\n\n const middleware: Core.MiddlewareHandler = async (ctx, next) => {\n const { url, method } = ctx.request;\n\n if (\n !url.includes('.') &&\n url.includes(strapi.config.get('api.rest.prefix')) &&\n ['GET', 'PUT', 'POST', 'DELETE'].includes(method)\n ) {\n if (Date.now() > state.expires) {\n state.expires = nextResetDate();\n state.counter = 0;\n }\n\n // Send max. 1000 events per day.\n if (state.counter < 1000) {\n sendEvent('didReceiveRequest', { eventProperties: { url: ctx.request.url } });\n\n // Increase counter.\n state.counter += 1;\n }\n }\n\n await next();\n };\n\n return middleware;\n};\n\nexport default createMiddleware;\n"],"names":["nextResetDate","Date","now","createMiddleware","sendEvent","strapi","state","expires","counter","middleware","ctx","next","url","method","request","includes","config","get","eventProperties"],"mappings":";;AAQA,SAASA,aAAAA,GAAAA;AACP,IAAA,OAAOC,KAAKC,GAAG,EAAA,GAAK,KAAK,EAAK,GAAA,EAAA,GAAK;AACrC;AAEA,MAAMC,mBAAmB,CAAC,EAAEC,SAAS,EAAEC,MAAM,EAA8C,GAAA;AACzF,IAAA,MAAMC,KAAe,GAAA;QACnBC,OAASP,EAAAA,aAAAA,EAAAA;QACTQ,OAAS,EAAA;AACX,KAAA;IAEA,MAAMC,UAAAA,GAAqC,OAAOC,GAAKC,EAAAA,IAAAA,GAAAA;AACrD,QAAA,MAAM,EAAEC,GAAG,EAAEC,MAAM,EAAE,GAAGH,IAAII,OAAO;AAEnC,QAAA,IACE,CAACF,GAAAA,CAAIG,QAAQ,CAAC,GACdH,CAAAA,IAAAA,GAAAA,CAAIG,QAAQ,CAACV,MAAOW,CAAAA,MAAM,CAACC,GAAG,CAAC,iBAC/B,CAAA,CAAA,IAAA;AAAC,YAAA,KAAA;AAAO,YAAA,KAAA;AAAO,YAAA,MAAA;AAAQ,YAAA;SAAS,CAACF,QAAQ,CAACF,MAC1C,CAAA,EAAA;AACA,YAAA,IAAIZ,IAAKC,CAAAA,GAAG,EAAKI,GAAAA,KAAAA,CAAMC,OAAO,EAAE;AAC9BD,gBAAAA,KAAAA,CAAMC,OAAO,GAAGP,aAAAA,EAAAA;AAChBM,gBAAAA,KAAAA,CAAME,OAAO,GAAG,CAAA;AAClB;;YAGA,IAAIF,KAAAA,CAAME,OAAO,GAAG,IAAM,EAAA;AACxBJ,gBAAAA,SAAAA,CAAU,mBAAqB,EAAA;oBAAEc,eAAiB,EAAA;wBAAEN,GAAKF,EAAAA,GAAAA,CAAII,OAAO,CAACF;AAAI;AAAE,iBAAA,CAAA;;AAG3EN,gBAAAA,KAAAA,CAAME,OAAO,IAAI,CAAA;AACnB;AACF;QAEA,MAAMG,IAAAA,EAAAA;AACR,KAAA;IAEA,OAAOF,UAAAA;AACT;;;;"}
@@ -1,14 +1,14 @@
1
1
  function nextResetDate() {
2
2
  return Date.now() + 24 * 60 * 60 * 1000; // Now + 24 hours.
3
3
  }
4
- const createMiddleware = ({ sendEvent })=>{
4
+ const createMiddleware = ({ sendEvent, strapi })=>{
5
5
  const state = {
6
6
  expires: nextResetDate(),
7
7
  counter: 0
8
8
  };
9
9
  const middleware = async (ctx, next)=>{
10
10
  const { url, method } = ctx.request;
11
- if (!url.includes('.') && [
11
+ if (!url.includes('.') && url.includes(strapi.config.get('api.rest.prefix')) && [
12
12
  'GET',
13
13
  'PUT',
14
14
  'POST',
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.mjs","sources":["../../../src/services/metrics/middleware.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { Sender } from './sender';\n\ninterface State {\n expires: number;\n counter: number;\n}\n\nfunction nextResetDate(): number {\n return Date.now() + 24 * 60 * 60 * 1000; // Now + 24 hours.\n}\n\nconst createMiddleware = ({ sendEvent }: { sendEvent: Sender }) => {\n const state: State = {\n expires: nextResetDate(),\n counter: 0,\n };\n\n const middleware: Core.MiddlewareHandler = async (ctx, next) => {\n const { url, method } = ctx.request;\n\n if (!url.includes('.') && ['GET', 'PUT', 'POST', 'DELETE'].includes(method)) {\n if (Date.now() > state.expires) {\n state.expires = nextResetDate();\n state.counter = 0;\n }\n\n // Send max. 1000 events per day.\n if (state.counter < 1000) {\n sendEvent('didReceiveRequest', { eventProperties: { url: ctx.request.url } });\n\n // Increase counter.\n state.counter += 1;\n }\n }\n\n await next();\n };\n\n return middleware;\n};\n\nexport default createMiddleware;\n"],"names":["nextResetDate","Date","now","createMiddleware","sendEvent","state","expires","counter","middleware","ctx","next","url","method","request","includes","eventProperties"],"mappings":"AAQA,SAASA,aAAAA,GAAAA;AACP,IAAA,OAAOC,KAAKC,GAAG,EAAA,GAAK,KAAK,EAAK,GAAA,EAAA,GAAK;AACrC;AAEA,MAAMC,gBAAmB,GAAA,CAAC,EAAEC,SAAS,EAAyB,GAAA;AAC5D,IAAA,MAAMC,KAAe,GAAA;QACnBC,OAASN,EAAAA,aAAAA,EAAAA;QACTO,OAAS,EAAA;AACX,KAAA;IAEA,MAAMC,UAAAA,GAAqC,OAAOC,GAAKC,EAAAA,IAAAA,GAAAA;AACrD,QAAA,MAAM,EAAEC,GAAG,EAAEC,MAAM,EAAE,GAAGH,IAAII,OAAO;AAEnC,QAAA,IAAI,CAACF,GAAAA,CAAIG,QAAQ,CAAC,GAAQ,CAAA,IAAA;AAAC,YAAA,KAAA;AAAO,YAAA,KAAA;AAAO,YAAA,MAAA;AAAQ,YAAA;SAAS,CAACA,QAAQ,CAACF,MAAS,CAAA,EAAA;AAC3E,YAAA,IAAIX,IAAKC,CAAAA,GAAG,EAAKG,GAAAA,KAAAA,CAAMC,OAAO,EAAE;AAC9BD,gBAAAA,KAAAA,CAAMC,OAAO,GAAGN,aAAAA,EAAAA;AAChBK,gBAAAA,KAAAA,CAAME,OAAO,GAAG,CAAA;AAClB;;YAGA,IAAIF,KAAAA,CAAME,OAAO,GAAG,IAAM,EAAA;AACxBH,gBAAAA,SAAAA,CAAU,mBAAqB,EAAA;oBAAEW,eAAiB,EAAA;wBAAEJ,GAAKF,EAAAA,GAAAA,CAAII,OAAO,CAACF;AAAI;AAAE,iBAAA,CAAA;;AAG3EN,gBAAAA,KAAAA,CAAME,OAAO,IAAI,CAAA;AACnB;AACF;QAEA,MAAMG,IAAAA,EAAAA;AACR,KAAA;IAEA,OAAOF,UAAAA;AACT;;;;"}
1
+ {"version":3,"file":"middleware.mjs","sources":["../../../src/services/metrics/middleware.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { Sender } from './sender';\n\ninterface State {\n expires: number;\n counter: number;\n}\n\nfunction nextResetDate(): number {\n return Date.now() + 24 * 60 * 60 * 1000; // Now + 24 hours.\n}\n\nconst createMiddleware = ({ sendEvent, strapi }: { sendEvent: Sender; strapi: Core.Strapi }) => {\n const state: State = {\n expires: nextResetDate(),\n counter: 0,\n };\n\n const middleware: Core.MiddlewareHandler = async (ctx, next) => {\n const { url, method } = ctx.request;\n\n if (\n !url.includes('.') &&\n url.includes(strapi.config.get('api.rest.prefix')) &&\n ['GET', 'PUT', 'POST', 'DELETE'].includes(method)\n ) {\n if (Date.now() > state.expires) {\n state.expires = nextResetDate();\n state.counter = 0;\n }\n\n // Send max. 1000 events per day.\n if (state.counter < 1000) {\n sendEvent('didReceiveRequest', { eventProperties: { url: ctx.request.url } });\n\n // Increase counter.\n state.counter += 1;\n }\n }\n\n await next();\n };\n\n return middleware;\n};\n\nexport default createMiddleware;\n"],"names":["nextResetDate","Date","now","createMiddleware","sendEvent","strapi","state","expires","counter","middleware","ctx","next","url","method","request","includes","config","get","eventProperties"],"mappings":"AAQA,SAASA,aAAAA,GAAAA;AACP,IAAA,OAAOC,KAAKC,GAAG,EAAA,GAAK,KAAK,EAAK,GAAA,EAAA,GAAK;AACrC;AAEA,MAAMC,mBAAmB,CAAC,EAAEC,SAAS,EAAEC,MAAM,EAA8C,GAAA;AACzF,IAAA,MAAMC,KAAe,GAAA;QACnBC,OAASP,EAAAA,aAAAA,EAAAA;QACTQ,OAAS,EAAA;AACX,KAAA;IAEA,MAAMC,UAAAA,GAAqC,OAAOC,GAAKC,EAAAA,IAAAA,GAAAA;AACrD,QAAA,MAAM,EAAEC,GAAG,EAAEC,MAAM,EAAE,GAAGH,IAAII,OAAO;AAEnC,QAAA,IACE,CAACF,GAAAA,CAAIG,QAAQ,CAAC,GACdH,CAAAA,IAAAA,GAAAA,CAAIG,QAAQ,CAACV,MAAOW,CAAAA,MAAM,CAACC,GAAG,CAAC,iBAC/B,CAAA,CAAA,IAAA;AAAC,YAAA,KAAA;AAAO,YAAA,KAAA;AAAO,YAAA,MAAA;AAAQ,YAAA;SAAS,CAACF,QAAQ,CAACF,MAC1C,CAAA,EAAA;AACA,YAAA,IAAIZ,IAAKC,CAAAA,GAAG,EAAKI,GAAAA,KAAAA,CAAMC,OAAO,EAAE;AAC9BD,gBAAAA,KAAAA,CAAMC,OAAO,GAAGP,aAAAA,EAAAA;AAChBM,gBAAAA,KAAAA,CAAME,OAAO,GAAG,CAAA;AAClB;;YAGA,IAAIF,KAAAA,CAAME,OAAO,GAAG,IAAM,EAAA;AACxBJ,gBAAAA,SAAAA,CAAU,mBAAqB,EAAA;oBAAEc,eAAiB,EAAA;wBAAEN,GAAKF,EAAAA,GAAAA,CAAII,OAAO,CAACF;AAAI;AAAE,iBAAA,CAAA;;AAG3EN,gBAAAA,KAAAA,CAAME,OAAO,IAAI,CAAA;AACnB;AACF;QAEA,MAAMG,IAAAA,EAAAA;AACR,KAAA;IAEA,OAAOF,UAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/sender.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,WAAW,OAAO;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,MAAM,GAAG,CACnB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;AAkBtB;;GAEG;iCACqB,KAAK,MAAM,KAAG,MAAM;AAA5C,wBAwDE"}
1
+ {"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/sender.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,WAAW,OAAO;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,MAAM,GAAG,CACnB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;AAgBtB;;GAEG;iCACqB,KAAK,MAAM,KAAG,MAAM;AAA5C,wBA0DE"}
@@ -15,7 +15,6 @@ const defaultQueryOpts = {
15
15
  'Content-Type': 'application/json'
16
16
  }
17
17
  };
18
- const ANALYTICS_URI = 'https://analytics.strapi.io';
19
18
  /**
20
19
  * Add properties from the package.json strapi key in the metadata
21
20
  */ const addPackageJsonStrapiMetadata = (metadata, strapi)=>{
@@ -44,7 +43,8 @@ const ANALYTICS_URI = 'https://analytics.strapi.io';
44
43
  useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),
45
44
  useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),
46
45
  projectId: uuid,
47
- isHostedOnStrapiCloud: strapiUtils.env('STRAPI_HOSTING', null) === 'strapi.cloud'
46
+ isHostedOnStrapiCloud: strapiUtils.env('STRAPI_HOSTING', null) === 'strapi.cloud',
47
+ aiLicenseKey: strapiUtils.env('STRAPI_ADMIN_AI_LICENSE', null)
48
48
  };
49
49
  addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);
50
50
  return async (event, payload = {}, opts = {})=>{
@@ -73,7 +73,8 @@ const ANALYTICS_URI = 'https://analytics.strapi.io';
73
73
  }, defaultQueryOpts, opts)
74
74
  };
75
75
  try {
76
- const res = await strapi.fetch(`${ANALYTICS_URI}/api/v2/track`, reqParams);
76
+ const analyticsUrl = strapiUtils.env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');
77
+ const res = await strapi.fetch(`${analyticsUrl}/api/v2/track`, reqParams);
77
78
  return res.ok;
78
79
  } catch (err) {
79
80
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"sender.js","sources":["../../../src/services/metrics/sender.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport _ from 'lodash';\nimport isDocker from 'is-docker';\nimport ciEnv from 'ci-info';\nimport tsUtils from '@strapi/typescript-utils';\nimport { env, generateInstallId } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { generateAdminUserHash } from './admin-user-hash';\n\nexport interface Payload {\n eventProperties?: Record<string, unknown>;\n userProperties?: Record<string, unknown>;\n groupProperties?: Record<string, unknown>;\n}\n\nexport type Sender = (\n event: string,\n payload?: Payload,\n opts?: Record<string, unknown>\n) => Promise<boolean>;\n\nconst defaultQueryOpts = {\n timeout: 1000,\n headers: { 'Content-Type': 'application/json' },\n};\n\nconst ANALYTICS_URI = 'https://analytics.strapi.io';\n\n/**\n * Add properties from the package.json strapi key in the metadata\n */\nconst addPackageJsonStrapiMetadata = (metadata: Record<string, unknown>, strapi: Core.Strapi) => {\n const { packageJsonStrapi = {} } = strapi.config;\n\n _.defaults(metadata, packageJsonStrapi);\n};\n\n/**\n * Create a send function for event with all the necessary metadata\n */\nexport default (strapi: Core.Strapi): Sender => {\n const { uuid, installId: installIdFromPackageJson } = strapi.config;\n\n const installId = generateInstallId(uuid, installIdFromPackageJson);\n\n const serverRootPath = strapi.dirs.app.root;\n const adminRootPath = path.join(strapi.dirs.app.root, 'src', 'admin');\n\n const anonymousUserProperties = {\n environment: strapi.config.environment,\n os: os.type(),\n osPlatform: os.platform(),\n osArch: os.arch(),\n osRelease: os.release(),\n nodeVersion: process.versions.node,\n };\n\n const anonymousGroupProperties = {\n docker: process.env.DOCKER || isDocker(),\n isCI: ciEnv.isCI,\n version: strapi.config.get('info.strapi'),\n useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),\n useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),\n projectId: uuid,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n };\n\n addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);\n\n return async (event: string, payload: Payload = {}, opts = {}) => {\n const userId = generateAdminUserHash(strapi);\n\n const reqParams = {\n method: 'POST',\n body: JSON.stringify({\n event,\n userId,\n installId,\n eventProperties: payload.eventProperties,\n userProperties: userId ? { ...anonymousUserProperties, ...payload.userProperties } : {},\n groupProperties: {\n ...anonymousGroupProperties,\n projectType: strapi.EE ? 'Enterprise' : 'Community',\n ...payload.groupProperties,\n },\n }),\n ..._.merge({ headers: { 'X-Strapi-Event': event } }, defaultQueryOpts, opts),\n };\n\n try {\n const res = await strapi.fetch(`${ANALYTICS_URI}/api/v2/track`, reqParams);\n return res.ok;\n } catch (err) {\n return false;\n }\n };\n};\n"],"names":["defaultQueryOpts","timeout","headers","ANALYTICS_URI","addPackageJsonStrapiMetadata","metadata","strapi","packageJsonStrapi","config","_","defaults","uuid","installId","installIdFromPackageJson","generateInstallId","serverRootPath","dirs","app","root","adminRootPath","path","join","anonymousUserProperties","environment","os","type","osPlatform","platform","osArch","arch","osRelease","release","nodeVersion","process","versions","node","anonymousGroupProperties","docker","env","DOCKER","isDocker","isCI","ciEnv","version","get","useTypescriptOnServer","tsUtils","isUsingTypeScriptSync","useTypescriptOnAdmin","projectId","isHostedOnStrapiCloud","event","payload","opts","userId","generateAdminUserHash","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","res","fetch","ok","err"],"mappings":"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"}
1
+ {"version":3,"file":"sender.js","sources":["../../../src/services/metrics/sender.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport _ from 'lodash';\nimport isDocker from 'is-docker';\nimport ciEnv from 'ci-info';\nimport tsUtils from '@strapi/typescript-utils';\nimport { env, generateInstallId } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { generateAdminUserHash } from './admin-user-hash';\n\nexport interface Payload {\n eventProperties?: Record<string, unknown>;\n userProperties?: Record<string, unknown>;\n groupProperties?: Record<string, unknown>;\n}\n\nexport type Sender = (\n event: string,\n payload?: Payload,\n opts?: Record<string, unknown>\n) => Promise<boolean>;\n\nconst defaultQueryOpts = {\n timeout: 1000,\n headers: { 'Content-Type': 'application/json' },\n};\n\n/**\n * Add properties from the package.json strapi key in the metadata\n */\nconst addPackageJsonStrapiMetadata = (metadata: Record<string, unknown>, strapi: Core.Strapi) => {\n const { packageJsonStrapi = {} } = strapi.config;\n\n _.defaults(metadata, packageJsonStrapi);\n};\n\n/**\n * Create a send function for event with all the necessary metadata\n */\nexport default (strapi: Core.Strapi): Sender => {\n const { uuid, installId: installIdFromPackageJson } = strapi.config;\n\n const installId = generateInstallId(uuid, installIdFromPackageJson);\n\n const serverRootPath = strapi.dirs.app.root;\n const adminRootPath = path.join(strapi.dirs.app.root, 'src', 'admin');\n\n const anonymousUserProperties = {\n environment: strapi.config.environment,\n os: os.type(),\n osPlatform: os.platform(),\n osArch: os.arch(),\n osRelease: os.release(),\n nodeVersion: process.versions.node,\n };\n\n const anonymousGroupProperties = {\n docker: process.env.DOCKER || isDocker(),\n isCI: ciEnv.isCI,\n version: strapi.config.get('info.strapi'),\n useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),\n useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),\n projectId: uuid,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n aiLicenseKey: env('STRAPI_ADMIN_AI_LICENSE', null),\n };\n\n addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);\n\n return async (event: string, payload: Payload = {}, opts = {}) => {\n const userId = generateAdminUserHash(strapi);\n\n const reqParams = {\n method: 'POST',\n body: JSON.stringify({\n event,\n userId,\n installId,\n eventProperties: payload.eventProperties,\n userProperties: userId ? { ...anonymousUserProperties, ...payload.userProperties } : {},\n groupProperties: {\n ...anonymousGroupProperties,\n projectType: strapi.EE ? 'Enterprise' : 'Community',\n ...payload.groupProperties,\n },\n }),\n ..._.merge({ headers: { 'X-Strapi-Event': event } }, defaultQueryOpts, opts),\n };\n\n try {\n const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');\n const res = await strapi.fetch(`${analyticsUrl}/api/v2/track`, reqParams);\n return res.ok;\n } catch (err) {\n return false;\n }\n };\n};\n"],"names":["defaultQueryOpts","timeout","headers","addPackageJsonStrapiMetadata","metadata","strapi","packageJsonStrapi","config","_","defaults","uuid","installId","installIdFromPackageJson","generateInstallId","serverRootPath","dirs","app","root","adminRootPath","path","join","anonymousUserProperties","environment","os","type","osPlatform","platform","osArch","arch","osRelease","release","nodeVersion","process","versions","node","anonymousGroupProperties","docker","env","DOCKER","isDocker","isCI","ciEnv","version","get","useTypescriptOnServer","tsUtils","isUsingTypeScriptSync","useTypescriptOnAdmin","projectId","isHostedOnStrapiCloud","aiLicenseKey","event","payload","opts","userId","generateAdminUserHash","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","analyticsUrl","res","fetch","ok","err"],"mappings":"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"}
@@ -13,7 +13,6 @@ const defaultQueryOpts = {
13
13
  'Content-Type': 'application/json'
14
14
  }
15
15
  };
16
- const ANALYTICS_URI = 'https://analytics.strapi.io';
17
16
  /**
18
17
  * Add properties from the package.json strapi key in the metadata
19
18
  */ const addPackageJsonStrapiMetadata = (metadata, strapi)=>{
@@ -42,7 +41,8 @@ const ANALYTICS_URI = 'https://analytics.strapi.io';
42
41
  useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),
43
42
  useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),
44
43
  projectId: uuid,
45
- isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud'
44
+ isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',
45
+ aiLicenseKey: env('STRAPI_ADMIN_AI_LICENSE', null)
46
46
  };
47
47
  addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);
48
48
  return async (event, payload = {}, opts = {})=>{
@@ -71,7 +71,8 @@ const ANALYTICS_URI = 'https://analytics.strapi.io';
71
71
  }, defaultQueryOpts, opts)
72
72
  };
73
73
  try {
74
- const res = await strapi.fetch(`${ANALYTICS_URI}/api/v2/track`, reqParams);
74
+ const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');
75
+ const res = await strapi.fetch(`${analyticsUrl}/api/v2/track`, reqParams);
75
76
  return res.ok;
76
77
  } catch (err) {
77
78
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"sender.mjs","sources":["../../../src/services/metrics/sender.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport _ from 'lodash';\nimport isDocker from 'is-docker';\nimport ciEnv from 'ci-info';\nimport tsUtils from '@strapi/typescript-utils';\nimport { env, generateInstallId } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { generateAdminUserHash } from './admin-user-hash';\n\nexport interface Payload {\n eventProperties?: Record<string, unknown>;\n userProperties?: Record<string, unknown>;\n groupProperties?: Record<string, unknown>;\n}\n\nexport type Sender = (\n event: string,\n payload?: Payload,\n opts?: Record<string, unknown>\n) => Promise<boolean>;\n\nconst defaultQueryOpts = {\n timeout: 1000,\n headers: { 'Content-Type': 'application/json' },\n};\n\nconst ANALYTICS_URI = 'https://analytics.strapi.io';\n\n/**\n * Add properties from the package.json strapi key in the metadata\n */\nconst addPackageJsonStrapiMetadata = (metadata: Record<string, unknown>, strapi: Core.Strapi) => {\n const { packageJsonStrapi = {} } = strapi.config;\n\n _.defaults(metadata, packageJsonStrapi);\n};\n\n/**\n * Create a send function for event with all the necessary metadata\n */\nexport default (strapi: Core.Strapi): Sender => {\n const { uuid, installId: installIdFromPackageJson } = strapi.config;\n\n const installId = generateInstallId(uuid, installIdFromPackageJson);\n\n const serverRootPath = strapi.dirs.app.root;\n const adminRootPath = path.join(strapi.dirs.app.root, 'src', 'admin');\n\n const anonymousUserProperties = {\n environment: strapi.config.environment,\n os: os.type(),\n osPlatform: os.platform(),\n osArch: os.arch(),\n osRelease: os.release(),\n nodeVersion: process.versions.node,\n };\n\n const anonymousGroupProperties = {\n docker: process.env.DOCKER || isDocker(),\n isCI: ciEnv.isCI,\n version: strapi.config.get('info.strapi'),\n useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),\n useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),\n projectId: uuid,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n };\n\n addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);\n\n return async (event: string, payload: Payload = {}, opts = {}) => {\n const userId = generateAdminUserHash(strapi);\n\n const reqParams = {\n method: 'POST',\n body: JSON.stringify({\n event,\n userId,\n installId,\n eventProperties: payload.eventProperties,\n userProperties: userId ? { ...anonymousUserProperties, ...payload.userProperties } : {},\n groupProperties: {\n ...anonymousGroupProperties,\n projectType: strapi.EE ? 'Enterprise' : 'Community',\n ...payload.groupProperties,\n },\n }),\n ..._.merge({ headers: { 'X-Strapi-Event': event } }, defaultQueryOpts, opts),\n };\n\n try {\n const res = await strapi.fetch(`${ANALYTICS_URI}/api/v2/track`, reqParams);\n return res.ok;\n } catch (err) {\n return false;\n }\n };\n};\n"],"names":["defaultQueryOpts","timeout","headers","ANALYTICS_URI","addPackageJsonStrapiMetadata","metadata","strapi","packageJsonStrapi","config","_","defaults","uuid","installId","installIdFromPackageJson","generateInstallId","serverRootPath","dirs","app","root","adminRootPath","path","join","anonymousUserProperties","environment","os","type","osPlatform","platform","osArch","arch","osRelease","release","nodeVersion","process","versions","node","anonymousGroupProperties","docker","env","DOCKER","isDocker","isCI","ciEnv","version","get","useTypescriptOnServer","tsUtils","isUsingTypeScriptSync","useTypescriptOnAdmin","projectId","isHostedOnStrapiCloud","event","payload","opts","userId","generateAdminUserHash","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","res","fetch","ok","err"],"mappings":"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"}
1
+ {"version":3,"file":"sender.mjs","sources":["../../../src/services/metrics/sender.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport _ from 'lodash';\nimport isDocker from 'is-docker';\nimport ciEnv from 'ci-info';\nimport tsUtils from '@strapi/typescript-utils';\nimport { env, generateInstallId } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { generateAdminUserHash } from './admin-user-hash';\n\nexport interface Payload {\n eventProperties?: Record<string, unknown>;\n userProperties?: Record<string, unknown>;\n groupProperties?: Record<string, unknown>;\n}\n\nexport type Sender = (\n event: string,\n payload?: Payload,\n opts?: Record<string, unknown>\n) => Promise<boolean>;\n\nconst defaultQueryOpts = {\n timeout: 1000,\n headers: { 'Content-Type': 'application/json' },\n};\n\n/**\n * Add properties from the package.json strapi key in the metadata\n */\nconst addPackageJsonStrapiMetadata = (metadata: Record<string, unknown>, strapi: Core.Strapi) => {\n const { packageJsonStrapi = {} } = strapi.config;\n\n _.defaults(metadata, packageJsonStrapi);\n};\n\n/**\n * Create a send function for event with all the necessary metadata\n */\nexport default (strapi: Core.Strapi): Sender => {\n const { uuid, installId: installIdFromPackageJson } = strapi.config;\n\n const installId = generateInstallId(uuid, installIdFromPackageJson);\n\n const serverRootPath = strapi.dirs.app.root;\n const adminRootPath = path.join(strapi.dirs.app.root, 'src', 'admin');\n\n const anonymousUserProperties = {\n environment: strapi.config.environment,\n os: os.type(),\n osPlatform: os.platform(),\n osArch: os.arch(),\n osRelease: os.release(),\n nodeVersion: process.versions.node,\n };\n\n const anonymousGroupProperties = {\n docker: process.env.DOCKER || isDocker(),\n isCI: ciEnv.isCI,\n version: strapi.config.get('info.strapi'),\n useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),\n useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),\n projectId: uuid,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n aiLicenseKey: env('STRAPI_ADMIN_AI_LICENSE', null),\n };\n\n addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);\n\n return async (event: string, payload: Payload = {}, opts = {}) => {\n const userId = generateAdminUserHash(strapi);\n\n const reqParams = {\n method: 'POST',\n body: JSON.stringify({\n event,\n userId,\n installId,\n eventProperties: payload.eventProperties,\n userProperties: userId ? { ...anonymousUserProperties, ...payload.userProperties } : {},\n groupProperties: {\n ...anonymousGroupProperties,\n projectType: strapi.EE ? 'Enterprise' : 'Community',\n ...payload.groupProperties,\n },\n }),\n ..._.merge({ headers: { 'X-Strapi-Event': event } }, defaultQueryOpts, opts),\n };\n\n try {\n const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');\n const res = await strapi.fetch(`${analyticsUrl}/api/v2/track`, reqParams);\n return res.ok;\n } catch (err) {\n return false;\n }\n };\n};\n"],"names":["defaultQueryOpts","timeout","headers","addPackageJsonStrapiMetadata","metadata","strapi","packageJsonStrapi","config","_","defaults","uuid","installId","installIdFromPackageJson","generateInstallId","serverRootPath","dirs","app","root","adminRootPath","path","join","anonymousUserProperties","environment","os","type","osPlatform","platform","osArch","arch","osRelease","release","nodeVersion","process","versions","node","anonymousGroupProperties","docker","env","DOCKER","isDocker","isCI","ciEnv","version","get","useTypescriptOnServer","tsUtils","isUsingTypeScriptSync","useTypescriptOnAdmin","projectId","isHostedOnStrapiCloud","aiLicenseKey","event","payload","opts","userId","generateAdminUserHash","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","analyticsUrl","res","fetch","ok","err"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compose-endpoint.js","sources":["../../../src/services/server/compose-endpoint.ts"],"sourcesContent":["import { toLower, castArray, trim, prop, isNil } from 'lodash/fp';\nimport type { Core, UID } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport Router from '@koa/router';\n\nimport compose from 'koa-compose';\nimport { resolveRouteMiddlewares } from './middleware';\nimport { createPolicicesMiddleware } from './policy';\n\nconst getMethod = (route: Core.Route) => {\n return trim(toLower(route.method)) as Lowercase<Core.Route['method']>;\n};\n\nconst getPath = (route: Core.Route) => trim(route.path);\n\nconst createRouteInfoMiddleware =\n (routeInfo: Core.Route): Core.MiddlewareHandler =>\n (ctx, next) => {\n const route = {\n ...routeInfo,\n config: routeInfo.config || {},\n };\n\n ctx.state.route = route;\n return next();\n };\n\nconst getAuthConfig = prop('config.auth');\n\nconst createAuthorizeMiddleware =\n (strapi: Core.Strapi): Core.MiddlewareHandler =>\n async (ctx, next) => {\n const { auth, route } = ctx.state;\n\n const authService = strapi.get('auth');\n\n try {\n await authService.verify(auth, getAuthConfig(route));\n\n return await next();\n } catch (error) {\n if (error instanceof errors.UnauthorizedError) {\n return ctx.unauthorized();\n }\n\n if (error instanceof errors.ForbiddenError) {\n // allow PolicyError as an exception to throw a publicly visible message in the API\n if (error instanceof errors.PolicyError) {\n throw error;\n }\n return ctx.forbidden();\n }\n\n throw error;\n }\n };\n\nconst createAuthenticateMiddleware =\n (strapi: Core.Strapi): Core.MiddlewareHandler =>\n async (ctx, next) => {\n return strapi.get('auth').authenticate(ctx, next);\n };\n\nconst returnBodyMiddleware: Core.MiddlewareHandler = async (ctx, next) => {\n const values = await next();\n\n if (isNil(ctx.body) && !isNil(values)) {\n ctx.body = values;\n }\n};\n\nexport default (strapi: Core.Strapi) => {\n const authenticate = createAuthenticateMiddleware(strapi);\n const authorize = createAuthorizeMiddleware(strapi);\n\n return (route: Core.Route, { router }: { router: Router }) => {\n try {\n const method = getMethod(route);\n const path = getPath(route);\n\n const middlewares = resolveRouteMiddlewares(route, strapi);\n\n const action = getAction(route, strapi);\n\n const routeHandler = compose([\n createRouteInfoMiddleware(route),\n authenticate,\n authorize,\n createPolicicesMiddleware(route, strapi),\n ...middlewares,\n returnBodyMiddleware,\n ...castArray(action),\n ]);\n\n router[method](path, routeHandler);\n } catch (error) {\n if (error instanceof Error) {\n error.message = `Error creating endpoint ${route.method} ${route.path}: ${error.message}`;\n }\n\n throw error;\n }\n };\n};\n\nconst getController = (\n name: string,\n { pluginName, apiName }: Core.RouteInfo,\n strapi: Core.Strapi\n) => {\n let ctrl: Core.Controller | undefined;\n\n if (pluginName) {\n if (pluginName === 'admin') {\n ctrl = strapi.controller(`admin::${name}`);\n } else {\n ctrl = strapi.plugin(pluginName).controller(name);\n }\n } else if (apiName) {\n ctrl = strapi.controller(`api::${apiName}.${name}`);\n }\n\n if (!ctrl) {\n return strapi.controller(name as UID.Controller);\n }\n\n return ctrl;\n};\n\nconst extractHandlerParts = (name: string) => {\n const controllerName = name.slice(0, name.lastIndexOf('.'));\n const actionName = name.slice(name.lastIndexOf('.') + 1);\n\n return { controllerName, actionName };\n};\n\nconst getAction = (route: Core.Route, strapi: Core.Strapi) => {\n const { handler, info } = route;\n const { pluginName, apiName, type } = info ?? {};\n\n if (Array.isArray(handler) || typeof handler === 'function') {\n return handler;\n }\n\n const { controllerName, actionName } = extractHandlerParts(trim(handler));\n\n const controller = getController(controllerName, { pluginName, apiName, type }, strapi);\n\n if (typeof controller[actionName] !== 'function') {\n throw new Error(`Handler not found \"${handler}\"`);\n }\n\n if (Symbol.for('__type__') in controller[actionName]) {\n (controller[actionName] as any)[Symbol.for('__type__')].push(type);\n } else {\n (controller[actionName] as any)[Symbol.for('__type__')] = [type];\n }\n\n return controller[actionName].bind(controller);\n};\n"],"names":["getMethod","route","trim","toLower","method","getPath","path","createRouteInfoMiddleware","routeInfo","ctx","next","config","state","getAuthConfig","prop","createAuthorizeMiddleware","strapi","auth","authService","get","verify","error","errors","UnauthorizedError","unauthorized","ForbiddenError","PolicyError","forbidden","createAuthenticateMiddleware","authenticate","returnBodyMiddleware","values","isNil","body","authorize","router","middlewares","resolveRouteMiddlewares","action","getAction","routeHandler","compose","createPolicicesMiddleware","castArray","Error","message","getController","name","pluginName","apiName","ctrl","controller","plugin","extractHandlerParts","controllerName","slice","lastIndexOf","actionName","handler","info","type","Array","isArray","Symbol","for","push","bind"],"mappings":"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"}
1
+ {"version":3,"file":"compose-endpoint.js","sources":["../../../src/services/server/compose-endpoint.ts"],"sourcesContent":["import { toLower, castArray, trim, prop, isNil } from 'lodash/fp';\nimport type { Core, UID } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport Router from '@koa/router';\n\nimport compose from 'koa-compose';\nimport { resolveRouteMiddlewares } from './middleware';\nimport { createPolicicesMiddleware } from './policy';\n\nconst getMethod = (route: Core.Route) => {\n return trim(toLower(route.method)) as Lowercase<Core.Route['method']>;\n};\n\nconst getPath = (route: Core.Route) => trim(route.path);\n\nconst createRouteInfoMiddleware =\n (routeInfo: Core.Route): Core.MiddlewareHandler =>\n (ctx, next) => {\n const route = {\n ...routeInfo,\n config: routeInfo.config || {},\n };\n\n ctx.state.route = route;\n return next();\n };\n\nconst getAuthConfig = prop('config.auth');\n\nconst createAuthorizeMiddleware =\n (strapi: Core.Strapi): Core.MiddlewareHandler =>\n async (ctx, next) => {\n const { auth, route } = ctx.state;\n\n const authService = strapi.get('auth');\n\n try {\n await authService.verify(auth, getAuthConfig(route));\n\n return await next();\n } catch (error) {\n if (error instanceof errors.UnauthorizedError) {\n return ctx.unauthorized();\n }\n\n if (error instanceof errors.ForbiddenError) {\n // allow PolicyError as an exception to throw a publicly visible message in the API\n if (error instanceof errors.PolicyError) {\n throw error;\n }\n return ctx.forbidden();\n }\n\n throw error;\n }\n };\n\nconst createAuthenticateMiddleware =\n (strapi: Core.Strapi): Core.MiddlewareHandler =>\n async (ctx, next) => {\n return strapi.get('auth').authenticate(ctx, next);\n };\n\nconst returnBodyMiddleware: Core.MiddlewareHandler = async (ctx, next) => {\n const values = await next();\n\n if (isNil(ctx.body) && !isNil(values)) {\n ctx.body = values;\n }\n};\n\nexport default (strapi: Core.Strapi) => {\n const authenticate = createAuthenticateMiddleware(strapi);\n const authorize = createAuthorizeMiddleware(strapi);\n\n return (route: Core.Route, { router }: { router: Router }) => {\n try {\n const method = getMethod(route);\n const path = getPath(route);\n\n const middlewares = resolveRouteMiddlewares(route, strapi);\n\n const action = getAction(route, strapi);\n\n const routeHandler = compose([\n createRouteInfoMiddleware(route),\n authenticate,\n authorize,\n createPolicicesMiddleware(route, strapi),\n ...middlewares,\n returnBodyMiddleware,\n ...castArray(action),\n ]);\n\n router[method](path, routeHandler);\n } catch (error) {\n if (error instanceof Error) {\n error.message = `Error creating endpoint ${route.method} ${route.path}: ${error.message}`;\n }\n\n throw error;\n }\n };\n};\n\nconst getController = (\n name: string,\n { pluginName, apiName }: Core.RouteInfo,\n strapi: Core.Strapi\n) => {\n let ctrl: Core.Controller | undefined;\n\n if (pluginName) {\n if (pluginName === 'admin') {\n ctrl = strapi.controller(`admin::${name}`);\n } else {\n ctrl = strapi.plugin(pluginName).controller(name);\n }\n } else if (apiName) {\n ctrl = strapi.controller(`api::${apiName}.${name}`);\n }\n\n if (!ctrl) {\n return strapi.controller(name as UID.Controller);\n }\n\n return ctrl;\n};\n\nconst extractHandlerParts = (name: string) => {\n const controllerName = name.slice(0, name.lastIndexOf('.'));\n const actionName = name.slice(name.lastIndexOf('.') + 1);\n\n return { controllerName, actionName };\n};\n\nconst getAction = (route: Core.Route, strapi: Core.Strapi) => {\n const { handler, info } = route;\n const { pluginName, apiName, type } = info ?? {};\n\n if (Array.isArray(handler) || typeof handler === 'function') {\n return handler;\n }\n\n const { controllerName, actionName } = extractHandlerParts(trim(handler));\n\n const controller = getController(controllerName, { pluginName, apiName, type }, strapi);\n\n if (typeof controller[actionName] !== 'function') {\n throw new Error(`Handler not found \"${handler}\"`);\n }\n\n if (Symbol.for('__type__') in controller[actionName]) {\n (controller[actionName] as any)[Symbol.for('__type__')].push(type);\n } else {\n (controller[actionName] as any)[Symbol.for('__type__')] = [type];\n }\n\n return controller[actionName].bind(controller);\n};\n"],"names":["getMethod","route","trim","toLower","method","getPath","path","createRouteInfoMiddleware","routeInfo","ctx","next","config","state","getAuthConfig","prop","createAuthorizeMiddleware","strapi","auth","authService","get","verify","error","errors","UnauthorizedError","unauthorized","ForbiddenError","PolicyError","forbidden","createAuthenticateMiddleware","authenticate","returnBodyMiddleware","values","isNil","body","authorize","router","middlewares","resolveRouteMiddlewares","action","getAction","routeHandler","compose","createPolicicesMiddleware","castArray","Error","message","getController","name","pluginName","apiName","ctrl","controller","plugin","extractHandlerParts","controllerName","slice","lastIndexOf","actionName","handler","info","type","Array","isArray","Symbol","for","push","bind"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compose-endpoint.mjs","sources":["../../../src/services/server/compose-endpoint.ts"],"sourcesContent":["import { toLower, castArray, trim, prop, isNil } from 'lodash/fp';\nimport type { Core, UID } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport Router from '@koa/router';\n\nimport compose from 'koa-compose';\nimport { resolveRouteMiddlewares } from './middleware';\nimport { createPolicicesMiddleware } from './policy';\n\nconst getMethod = (route: Core.Route) => {\n return trim(toLower(route.method)) as Lowercase<Core.Route['method']>;\n};\n\nconst getPath = (route: Core.Route) => trim(route.path);\n\nconst createRouteInfoMiddleware =\n (routeInfo: Core.Route): Core.MiddlewareHandler =>\n (ctx, next) => {\n const route = {\n ...routeInfo,\n config: routeInfo.config || {},\n };\n\n ctx.state.route = route;\n return next();\n };\n\nconst getAuthConfig = prop('config.auth');\n\nconst createAuthorizeMiddleware =\n (strapi: Core.Strapi): Core.MiddlewareHandler =>\n async (ctx, next) => {\n const { auth, route } = ctx.state;\n\n const authService = strapi.get('auth');\n\n try {\n await authService.verify(auth, getAuthConfig(route));\n\n return await next();\n } catch (error) {\n if (error instanceof errors.UnauthorizedError) {\n return ctx.unauthorized();\n }\n\n if (error instanceof errors.ForbiddenError) {\n // allow PolicyError as an exception to throw a publicly visible message in the API\n if (error instanceof errors.PolicyError) {\n throw error;\n }\n return ctx.forbidden();\n }\n\n throw error;\n }\n };\n\nconst createAuthenticateMiddleware =\n (strapi: Core.Strapi): Core.MiddlewareHandler =>\n async (ctx, next) => {\n return strapi.get('auth').authenticate(ctx, next);\n };\n\nconst returnBodyMiddleware: Core.MiddlewareHandler = async (ctx, next) => {\n const values = await next();\n\n if (isNil(ctx.body) && !isNil(values)) {\n ctx.body = values;\n }\n};\n\nexport default (strapi: Core.Strapi) => {\n const authenticate = createAuthenticateMiddleware(strapi);\n const authorize = createAuthorizeMiddleware(strapi);\n\n return (route: Core.Route, { router }: { router: Router }) => {\n try {\n const method = getMethod(route);\n const path = getPath(route);\n\n const middlewares = resolveRouteMiddlewares(route, strapi);\n\n const action = getAction(route, strapi);\n\n const routeHandler = compose([\n createRouteInfoMiddleware(route),\n authenticate,\n authorize,\n createPolicicesMiddleware(route, strapi),\n ...middlewares,\n returnBodyMiddleware,\n ...castArray(action),\n ]);\n\n router[method](path, routeHandler);\n } catch (error) {\n if (error instanceof Error) {\n error.message = `Error creating endpoint ${route.method} ${route.path}: ${error.message}`;\n }\n\n throw error;\n }\n };\n};\n\nconst getController = (\n name: string,\n { pluginName, apiName }: Core.RouteInfo,\n strapi: Core.Strapi\n) => {\n let ctrl: Core.Controller | undefined;\n\n if (pluginName) {\n if (pluginName === 'admin') {\n ctrl = strapi.controller(`admin::${name}`);\n } else {\n ctrl = strapi.plugin(pluginName).controller(name);\n }\n } else if (apiName) {\n ctrl = strapi.controller(`api::${apiName}.${name}`);\n }\n\n if (!ctrl) {\n return strapi.controller(name as UID.Controller);\n }\n\n return ctrl;\n};\n\nconst extractHandlerParts = (name: string) => {\n const controllerName = name.slice(0, name.lastIndexOf('.'));\n const actionName = name.slice(name.lastIndexOf('.') + 1);\n\n return { controllerName, actionName };\n};\n\nconst getAction = (route: Core.Route, strapi: Core.Strapi) => {\n const { handler, info } = route;\n const { pluginName, apiName, type } = info ?? {};\n\n if (Array.isArray(handler) || typeof handler === 'function') {\n return handler;\n }\n\n const { controllerName, actionName } = extractHandlerParts(trim(handler));\n\n const controller = getController(controllerName, { pluginName, apiName, type }, strapi);\n\n if (typeof controller[actionName] !== 'function') {\n throw new Error(`Handler not found \"${handler}\"`);\n }\n\n if (Symbol.for('__type__') in controller[actionName]) {\n (controller[actionName] as any)[Symbol.for('__type__')].push(type);\n } else {\n (controller[actionName] as any)[Symbol.for('__type__')] = [type];\n }\n\n return controller[actionName].bind(controller);\n};\n"],"names":["getMethod","route","trim","toLower","method","getPath","path","createRouteInfoMiddleware","routeInfo","ctx","next","config","state","getAuthConfig","prop","createAuthorizeMiddleware","strapi","auth","authService","get","verify","error","errors","UnauthorizedError","unauthorized","ForbiddenError","PolicyError","forbidden","createAuthenticateMiddleware","authenticate","returnBodyMiddleware","values","isNil","body","authorize","router","middlewares","resolveRouteMiddlewares","action","getAction","routeHandler","compose","createPolicicesMiddleware","castArray","Error","message","getController","name","pluginName","apiName","ctrl","controller","plugin","extractHandlerParts","controllerName","slice","lastIndexOf","actionName","handler","info","type","Array","isArray","Symbol","for","push","bind"],"mappings":";;;;;;AASA,MAAMA,YAAY,CAACC,KAAAA,GAAAA;IACjB,OAAOC,IAAAA,CAAKC,OAAQF,CAAAA,KAAAA,CAAMG,MAAM,CAAA,CAAA;AAClC,CAAA;AAEA,MAAMC,OAAU,GAAA,CAACJ,KAAsBC,GAAAA,IAAAA,CAAKD,MAAMK,IAAI,CAAA;AAEtD,MAAMC,yBACJ,GAAA,CAACC,SACD,GAAA,CAACC,GAAKC,EAAAA,IAAAA,GAAAA;AACJ,QAAA,MAAMT,KAAQ,GAAA;AACZ,YAAA,GAAGO,SAAS;YACZG,MAAQH,EAAAA,SAAAA,CAAUG,MAAM,IAAI;AAC9B,SAAA;QAEAF,GAAIG,CAAAA,KAAK,CAACX,KAAK,GAAGA,KAAAA;QAClB,OAAOS,IAAAA,EAAAA;AACT,KAAA;AAEF,MAAMG,gBAAgBC,IAAK,CAAA,aAAA,CAAA;AAE3B,MAAMC,yBACJ,GAAA,CAACC,MACD,GAAA,OAAOP,GAAKC,EAAAA,IAAAA,GAAAA;AACV,QAAA,MAAM,EAAEO,IAAI,EAAEhB,KAAK,EAAE,GAAGQ,IAAIG,KAAK;QAEjC,MAAMM,WAAAA,GAAcF,MAAOG,CAAAA,GAAG,CAAC,MAAA,CAAA;QAE/B,IAAI;AACF,YAAA,MAAMD,WAAYE,CAAAA,MAAM,CAACH,IAAAA,EAAMJ,aAAcZ,CAAAA,KAAAA,CAAAA,CAAAA;AAE7C,YAAA,OAAO,MAAMS,IAAAA,EAAAA;AACf,SAAA,CAAE,OAAOW,KAAO,EAAA;YACd,IAAIA,KAAAA,YAAiBC,MAAOC,CAAAA,iBAAiB,EAAE;AAC7C,gBAAA,OAAOd,IAAIe,YAAY,EAAA;AACzB;YAEA,IAAIH,KAAAA,YAAiBC,MAAOG,CAAAA,cAAc,EAAE;;gBAE1C,IAAIJ,KAAAA,YAAiBC,MAAOI,CAAAA,WAAW,EAAE;oBACvC,MAAML,KAAAA;AACR;AACA,gBAAA,OAAOZ,IAAIkB,SAAS,EAAA;AACtB;YAEA,MAAMN,KAAAA;AACR;AACF,KAAA;AAEF,MAAMO,4BACJ,GAAA,CAACZ,MACD,GAAA,OAAOP,GAAKC,EAAAA,IAAAA,GAAAA;AACV,QAAA,OAAOM,OAAOG,GAAG,CAAC,MAAQU,CAAAA,CAAAA,YAAY,CAACpB,GAAKC,EAAAA,IAAAA,CAAAA;AAC9C,KAAA;AAEF,MAAMoB,oBAAAA,GAA+C,OAAOrB,GAAKC,EAAAA,IAAAA,GAAAA;AAC/D,IAAA,MAAMqB,SAAS,MAAMrB,IAAAA,EAAAA;AAErB,IAAA,IAAIsB,MAAMvB,GAAIwB,CAAAA,IAAI,CAAK,IAAA,CAACD,MAAMD,MAAS,CAAA,EAAA;AACrCtB,QAAAA,GAAAA,CAAIwB,IAAI,GAAGF,MAAAA;AACb;AACF,CAAA;AAEA,6BAAe,CAAA,CAACf,MAAAA,GAAAA;AACd,IAAA,MAAMa,eAAeD,4BAA6BZ,CAAAA,MAAAA,CAAAA;AAClD,IAAA,MAAMkB,YAAYnB,yBAA0BC,CAAAA,MAAAA,CAAAA;AAE5C,IAAA,OAAO,CAACf,KAAAA,EAAmB,EAAEkC,MAAM,EAAsB,GAAA;QACvD,IAAI;AACF,YAAA,MAAM/B,SAASJ,SAAUC,CAAAA,KAAAA,CAAAA;AACzB,YAAA,MAAMK,OAAOD,OAAQJ,CAAAA,KAAAA,CAAAA;YAErB,MAAMmC,WAAAA,GAAcC,wBAAwBpC,KAAOe,EAAAA,MAAAA,CAAAA;YAEnD,MAAMsB,MAAAA,GAASC,UAAUtC,KAAOe,EAAAA,MAAAA,CAAAA;AAEhC,YAAA,MAAMwB,eAAeC,OAAQ,CAAA;gBAC3BlC,yBAA0BN,CAAAA,KAAAA,CAAAA;AAC1B4B,gBAAAA,YAAAA;AACAK,gBAAAA,SAAAA;AACAQ,gBAAAA,yBAAAA,CAA0BzC,KAAOe,EAAAA,MAAAA,CAAAA;AAC9BoB,gBAAAA,GAAAA,WAAAA;AACHN,gBAAAA,oBAAAA;mBACGa,SAAUL,CAAAA,MAAAA;AACd,aAAA,CAAA;YAEDH,MAAM,CAAC/B,MAAO,CAAA,CAACE,IAAMkC,EAAAA,YAAAA,CAAAA;AACvB,SAAA,CAAE,OAAOnB,KAAO,EAAA;AACd,YAAA,IAAIA,iBAAiBuB,KAAO,EAAA;AAC1BvB,gBAAAA,KAAAA,CAAMwB,OAAO,GAAG,CAAC,wBAAwB,EAAE5C,KAAAA,CAAMG,MAAM,CAAC,CAAC,EAAEH,KAAAA,CAAMK,IAAI,CAAC,EAAE,EAAEe,KAAMwB,CAAAA,OAAO,CAAC,CAAC;AAC3F;YAEA,MAAMxB,KAAAA;AACR;AACF,KAAA;AACF,CAAA;AAEA,MAAMyB,aAAAA,GAAgB,CACpBC,IACA,EAAA,EAAEC,UAAU,EAAEC,OAAO,EAAkB,EACvCjC,MAAAA,GAAAA;IAEA,IAAIkC,IAAAA;AAEJ,IAAA,IAAIF,UAAY,EAAA;AACd,QAAA,IAAIA,eAAe,OAAS,EAAA;AAC1BE,YAAAA,IAAAA,GAAOlC,OAAOmC,UAAU,CAAC,CAAC,OAAO,EAAEJ,KAAK,CAAC,CAAA;SACpC,MAAA;AACLG,YAAAA,IAAAA,GAAOlC,MAAOoC,CAAAA,MAAM,CAACJ,UAAAA,CAAAA,CAAYG,UAAU,CAACJ,IAAAA,CAAAA;AAC9C;AACF,KAAA,MAAO,IAAIE,OAAS,EAAA;QAClBC,IAAOlC,GAAAA,MAAAA,CAAOmC,UAAU,CAAC,CAAC,KAAK,EAAEF,OAAQ,CAAA,CAAC,EAAEF,IAAAA,CAAK,CAAC,CAAA;AACpD;AAEA,IAAA,IAAI,CAACG,IAAM,EAAA;QACT,OAAOlC,MAAAA,CAAOmC,UAAU,CAACJ,IAAAA,CAAAA;AAC3B;IAEA,OAAOG,IAAAA;AACT,CAAA;AAEA,MAAMG,sBAAsB,CAACN,IAAAA,GAAAA;AAC3B,IAAA,MAAMO,iBAAiBP,IAAKQ,CAAAA,KAAK,CAAC,CAAGR,EAAAA,IAAAA,CAAKS,WAAW,CAAC,GAAA,CAAA,CAAA;AACtD,IAAA,MAAMC,aAAaV,IAAKQ,CAAAA,KAAK,CAACR,IAAKS,CAAAA,WAAW,CAAC,GAAO,CAAA,GAAA,CAAA,CAAA;IAEtD,OAAO;AAAEF,QAAAA,cAAAA;AAAgBG,QAAAA;AAAW,KAAA;AACtC,CAAA;AAEA,MAAMlB,SAAAA,GAAY,CAACtC,KAAmBe,EAAAA,MAAAA,GAAAA;AACpC,IAAA,MAAM,EAAE0C,OAAO,EAAEC,IAAI,EAAE,GAAG1D,KAAAA;IAC1B,MAAM,EAAE+C,UAAU,EAAEC,OAAO,EAAEW,IAAI,EAAE,GAAGD,IAAAA,IAAQ,EAAC;AAE/C,IAAA,IAAIE,MAAMC,OAAO,CAACJ,OAAY,CAAA,IAAA,OAAOA,YAAY,UAAY,EAAA;QAC3D,OAAOA,OAAAA;AACT;AAEA,IAAA,MAAM,EAAEJ,cAAc,EAAEG,UAAU,EAAE,GAAGJ,oBAAoBnD,IAAKwD,CAAAA,OAAAA,CAAAA,CAAAA;IAEhE,MAAMP,UAAAA,GAAaL,cAAcQ,cAAgB,EAAA;AAAEN,QAAAA,UAAAA;AAAYC,QAAAA,OAAAA;AAASW,QAAAA;KAAQ5C,EAAAA,MAAAA,CAAAA;AAEhF,IAAA,IAAI,OAAOmC,UAAU,CAACM,UAAAA,CAAW,KAAK,UAAY,EAAA;AAChD,QAAA,MAAM,IAAIb,KAAM,CAAA,CAAC,mBAAmB,EAAEc,OAAAA,CAAQ,CAAC,CAAC,CAAA;AAClD;AAEA,IAAA,IAAIK,OAAOC,GAAG,CAAC,eAAeb,UAAU,CAACM,WAAW,EAAE;QACnDN,UAAU,CAACM,UAAW,CAAQ,CAACM,MAAAA,CAAOC,GAAG,CAAC,UAAA,CAAA,CAAY,CAACC,IAAI,CAACL,IAAAA,CAAAA;KACxD,MAAA;QACJT,UAAU,CAACM,WAAW,CAASM,OAAOC,GAAG,CAAC,YAAY,GAAG;AAACJ,YAAAA;AAAK,SAAA;AAClE;AAEA,IAAA,OAAOT,UAAU,CAACM,UAAW,CAAA,CAACS,IAAI,CAACf,UAAAA,CAAAA;AACrC,CAAA;;;;"}
1
+ {"version":3,"file":"compose-endpoint.mjs","sources":["../../../src/services/server/compose-endpoint.ts"],"sourcesContent":["import { toLower, castArray, trim, prop, isNil } from 'lodash/fp';\nimport type { Core, UID } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport Router from '@koa/router';\n\nimport compose from 'koa-compose';\nimport { resolveRouteMiddlewares } from './middleware';\nimport { createPolicicesMiddleware } from './policy';\n\nconst getMethod = (route: Core.Route) => {\n return trim(toLower(route.method)) as Lowercase<Core.Route['method']>;\n};\n\nconst getPath = (route: Core.Route) => trim(route.path);\n\nconst createRouteInfoMiddleware =\n (routeInfo: Core.Route): Core.MiddlewareHandler =>\n (ctx, next) => {\n const route = {\n ...routeInfo,\n config: routeInfo.config || {},\n };\n\n ctx.state.route = route;\n return next();\n };\n\nconst getAuthConfig = prop('config.auth');\n\nconst createAuthorizeMiddleware =\n (strapi: Core.Strapi): Core.MiddlewareHandler =>\n async (ctx, next) => {\n const { auth, route } = ctx.state;\n\n const authService = strapi.get('auth');\n\n try {\n await authService.verify(auth, getAuthConfig(route));\n\n return await next();\n } catch (error) {\n if (error instanceof errors.UnauthorizedError) {\n return ctx.unauthorized();\n }\n\n if (error instanceof errors.ForbiddenError) {\n // allow PolicyError as an exception to throw a publicly visible message in the API\n if (error instanceof errors.PolicyError) {\n throw error;\n }\n return ctx.forbidden();\n }\n\n throw error;\n }\n };\n\nconst createAuthenticateMiddleware =\n (strapi: Core.Strapi): Core.MiddlewareHandler =>\n async (ctx, next) => {\n return strapi.get('auth').authenticate(ctx, next);\n };\n\nconst returnBodyMiddleware: Core.MiddlewareHandler = async (ctx, next) => {\n const values = await next();\n\n if (isNil(ctx.body) && !isNil(values)) {\n ctx.body = values;\n }\n};\n\nexport default (strapi: Core.Strapi) => {\n const authenticate = createAuthenticateMiddleware(strapi);\n const authorize = createAuthorizeMiddleware(strapi);\n\n return (route: Core.Route, { router }: { router: Router }) => {\n try {\n const method = getMethod(route);\n const path = getPath(route);\n\n const middlewares = resolveRouteMiddlewares(route, strapi);\n\n const action = getAction(route, strapi);\n\n const routeHandler = compose([\n createRouteInfoMiddleware(route),\n authenticate,\n authorize,\n createPolicicesMiddleware(route, strapi),\n ...middlewares,\n returnBodyMiddleware,\n ...castArray(action),\n ]);\n\n router[method](path, routeHandler);\n } catch (error) {\n if (error instanceof Error) {\n error.message = `Error creating endpoint ${route.method} ${route.path}: ${error.message}`;\n }\n\n throw error;\n }\n };\n};\n\nconst getController = (\n name: string,\n { pluginName, apiName }: Core.RouteInfo,\n strapi: Core.Strapi\n) => {\n let ctrl: Core.Controller | undefined;\n\n if (pluginName) {\n if (pluginName === 'admin') {\n ctrl = strapi.controller(`admin::${name}`);\n } else {\n ctrl = strapi.plugin(pluginName).controller(name);\n }\n } else if (apiName) {\n ctrl = strapi.controller(`api::${apiName}.${name}`);\n }\n\n if (!ctrl) {\n return strapi.controller(name as UID.Controller);\n }\n\n return ctrl;\n};\n\nconst extractHandlerParts = (name: string) => {\n const controllerName = name.slice(0, name.lastIndexOf('.'));\n const actionName = name.slice(name.lastIndexOf('.') + 1);\n\n return { controllerName, actionName };\n};\n\nconst getAction = (route: Core.Route, strapi: Core.Strapi) => {\n const { handler, info } = route;\n const { pluginName, apiName, type } = info ?? {};\n\n if (Array.isArray(handler) || typeof handler === 'function') {\n return handler;\n }\n\n const { controllerName, actionName } = extractHandlerParts(trim(handler));\n\n const controller = getController(controllerName, { pluginName, apiName, type }, strapi);\n\n if (typeof controller[actionName] !== 'function') {\n throw new Error(`Handler not found \"${handler}\"`);\n }\n\n if (Symbol.for('__type__') in controller[actionName]) {\n (controller[actionName] as any)[Symbol.for('__type__')].push(type);\n } else {\n (controller[actionName] as any)[Symbol.for('__type__')] = [type];\n }\n\n return controller[actionName].bind(controller);\n};\n"],"names":["getMethod","route","trim","toLower","method","getPath","path","createRouteInfoMiddleware","routeInfo","ctx","next","config","state","getAuthConfig","prop","createAuthorizeMiddleware","strapi","auth","authService","get","verify","error","errors","UnauthorizedError","unauthorized","ForbiddenError","PolicyError","forbidden","createAuthenticateMiddleware","authenticate","returnBodyMiddleware","values","isNil","body","authorize","router","middlewares","resolveRouteMiddlewares","action","getAction","routeHandler","compose","createPolicicesMiddleware","castArray","Error","message","getController","name","pluginName","apiName","ctrl","controller","plugin","extractHandlerParts","controllerName","slice","lastIndexOf","actionName","handler","info","type","Array","isArray","Symbol","for","push","bind"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/services/server/index.ts"],"sourcesContent":["import Router from '@koa/router';\nimport type { Core, Modules } from '@strapi/types';\n\nimport { createHTTPServer } from './http-server';\nimport { createRouteManager } from './routing';\nimport { createAdminAPI } from './admin-api';\nimport { createContentAPI } from './content-api';\nimport registerAllRoutes from './register-routes';\nimport registerApplicationMiddlewares from './register-middlewares';\nimport createKoaApp from './koa';\nimport requestCtx from '../request-context';\n\nconst healthCheck: Core.MiddlewareHandler = async (ctx) => {\n ctx.set('strapi', 'You are so French!');\n ctx.status = 204;\n};\n\nconst createServer = (strapi: Core.Strapi): Modules.Server.Server => {\n const app = createKoaApp({\n proxy: strapi.config.get('server.proxy.koa'),\n keys: strapi.config.get('server.app.keys'),\n });\n\n app.use((ctx, next) => requestCtx.run(ctx, () => next()));\n\n const router = new Router();\n\n const routeManager = createRouteManager(strapi);\n\n const httpServer = createHTTPServer(strapi, app);\n\n const apis = {\n 'content-api': createContentAPI(strapi),\n admin: createAdminAPI(strapi),\n };\n\n // init health check\n router.all('/_health', healthCheck);\n\n const state = {\n mounted: false,\n };\n\n return {\n app,\n router,\n httpServer,\n\n api(name) {\n return apis[name];\n },\n\n use(...args) {\n app.use(...args);\n return this;\n },\n\n routes(routes: Core.Router | Omit<Core.Route, 'info'>[]) {\n if (!Array.isArray(routes) && routes.type) {\n const api = apis[routes.type];\n if (!api) {\n throw new Error(`API ${routes.type} not found. Possible APIs are ${Object.keys(apis)}`);\n }\n\n apis[routes.type].routes(routes);\n return this;\n }\n\n routeManager.addRoutes(routes, router);\n return this;\n },\n\n mount() {\n state.mounted = true;\n\n Object.values(apis).forEach((api) => api.mount(router));\n app.use(router.routes()).use(router.allowedMethods());\n\n return this;\n },\n\n initRouting() {\n registerAllRoutes(strapi);\n\n return this;\n },\n\n async initMiddlewares() {\n await registerApplicationMiddlewares(strapi);\n\n return this;\n },\n\n listRoutes() {\n return [...router.stack];\n },\n\n listen(...args: any[]) {\n if (!state.mounted) {\n this.mount();\n }\n\n return httpServer.listen(...args);\n },\n\n async destroy() {\n await httpServer.destroy();\n },\n };\n};\n\nexport { createServer };\n"],"names":["healthCheck","ctx","set","status","createServer","strapi","app","createKoaApp","proxy","config","get","keys","use","next","requestCtx","run","router","Router","routeManager","createRouteManager","httpServer","createHTTPServer","apis","createContentAPI","admin","createAdminAPI","all","state","mounted","api","name","args","routes","Array","isArray","type","Error","Object","addRoutes","mount","values","forEach","allowedMethods","initRouting","registerAllRoutes","initMiddlewares","registerApplicationMiddlewares","listRoutes","stack","listen","destroy"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/services/server/index.ts"],"sourcesContent":["import Router from '@koa/router';\nimport type { Core, Modules } from '@strapi/types';\n\nimport { createHTTPServer } from './http-server';\nimport { createRouteManager } from './routing';\nimport { createAdminAPI } from './admin-api';\nimport { createContentAPI } from './content-api';\nimport registerAllRoutes from './register-routes';\nimport registerApplicationMiddlewares from './register-middlewares';\nimport createKoaApp from './koa';\nimport requestCtx from '../request-context';\n\nconst healthCheck: Core.MiddlewareHandler = async (ctx) => {\n ctx.set('strapi', 'You are so French!');\n ctx.status = 204;\n};\n\nconst createServer = (strapi: Core.Strapi): Modules.Server.Server => {\n const app = createKoaApp({\n proxy: strapi.config.get('server.proxy.koa'),\n keys: strapi.config.get('server.app.keys'),\n });\n\n app.use((ctx, next) => requestCtx.run(ctx, () => next()));\n\n const router = new Router();\n\n const routeManager = createRouteManager(strapi);\n\n const httpServer = createHTTPServer(strapi, app);\n\n const apis = {\n 'content-api': createContentAPI(strapi),\n admin: createAdminAPI(strapi),\n };\n\n // init health check\n router.all('/_health', healthCheck);\n\n const state = {\n mounted: false,\n };\n\n return {\n app,\n router,\n httpServer,\n\n api(name) {\n return apis[name];\n },\n\n use(...args) {\n app.use(...args);\n return this;\n },\n\n routes(routes: Core.Router | Omit<Core.Route, 'info'>[]) {\n if (!Array.isArray(routes) && routes.type) {\n const api = apis[routes.type];\n if (!api) {\n throw new Error(`API ${routes.type} not found. Possible APIs are ${Object.keys(apis)}`);\n }\n\n apis[routes.type].routes(routes);\n return this;\n }\n\n routeManager.addRoutes(routes, router);\n return this;\n },\n\n mount() {\n state.mounted = true;\n\n Object.values(apis).forEach((api) => api.mount(router));\n app.use(router.routes()).use(router.allowedMethods());\n\n return this;\n },\n\n initRouting() {\n registerAllRoutes(strapi);\n\n return this;\n },\n\n async initMiddlewares() {\n await registerApplicationMiddlewares(strapi);\n\n return this;\n },\n\n listRoutes() {\n return [...router.stack];\n },\n\n listen(...args: any[]) {\n if (!state.mounted) {\n this.mount();\n }\n\n return httpServer.listen(...args);\n },\n\n async destroy() {\n await httpServer.destroy();\n },\n };\n};\n\nexport { createServer };\n"],"names":["healthCheck","ctx","set","status","createServer","strapi","app","createKoaApp","proxy","config","get","keys","use","next","requestCtx","run","router","Router","routeManager","createRouteManager","httpServer","createHTTPServer","apis","createContentAPI","admin","createAdminAPI","all","state","mounted","api","name","args","routes","Array","isArray","type","Error","Object","addRoutes","mount","values","forEach","allowedMethods","initRouting","registerAllRoutes","initMiddlewares","registerApplicationMiddlewares","listRoutes","stack","listen","destroy"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/server/index.ts"],"sourcesContent":["import Router from '@koa/router';\nimport type { Core, Modules } from '@strapi/types';\n\nimport { createHTTPServer } from './http-server';\nimport { createRouteManager } from './routing';\nimport { createAdminAPI } from './admin-api';\nimport { createContentAPI } from './content-api';\nimport registerAllRoutes from './register-routes';\nimport registerApplicationMiddlewares from './register-middlewares';\nimport createKoaApp from './koa';\nimport requestCtx from '../request-context';\n\nconst healthCheck: Core.MiddlewareHandler = async (ctx) => {\n ctx.set('strapi', 'You are so French!');\n ctx.status = 204;\n};\n\nconst createServer = (strapi: Core.Strapi): Modules.Server.Server => {\n const app = createKoaApp({\n proxy: strapi.config.get('server.proxy.koa'),\n keys: strapi.config.get('server.app.keys'),\n });\n\n app.use((ctx, next) => requestCtx.run(ctx, () => next()));\n\n const router = new Router();\n\n const routeManager = createRouteManager(strapi);\n\n const httpServer = createHTTPServer(strapi, app);\n\n const apis = {\n 'content-api': createContentAPI(strapi),\n admin: createAdminAPI(strapi),\n };\n\n // init health check\n router.all('/_health', healthCheck);\n\n const state = {\n mounted: false,\n };\n\n return {\n app,\n router,\n httpServer,\n\n api(name) {\n return apis[name];\n },\n\n use(...args) {\n app.use(...args);\n return this;\n },\n\n routes(routes: Core.Router | Omit<Core.Route, 'info'>[]) {\n if (!Array.isArray(routes) && routes.type) {\n const api = apis[routes.type];\n if (!api) {\n throw new Error(`API ${routes.type} not found. Possible APIs are ${Object.keys(apis)}`);\n }\n\n apis[routes.type].routes(routes);\n return this;\n }\n\n routeManager.addRoutes(routes, router);\n return this;\n },\n\n mount() {\n state.mounted = true;\n\n Object.values(apis).forEach((api) => api.mount(router));\n app.use(router.routes()).use(router.allowedMethods());\n\n return this;\n },\n\n initRouting() {\n registerAllRoutes(strapi);\n\n return this;\n },\n\n async initMiddlewares() {\n await registerApplicationMiddlewares(strapi);\n\n return this;\n },\n\n listRoutes() {\n return [...router.stack];\n },\n\n listen(...args: any[]) {\n if (!state.mounted) {\n this.mount();\n }\n\n return httpServer.listen(...args);\n },\n\n async destroy() {\n await httpServer.destroy();\n },\n };\n};\n\nexport { createServer };\n"],"names":["healthCheck","ctx","set","status","createServer","strapi","app","createKoaApp","proxy","config","get","keys","use","next","requestCtx","run","router","Router","routeManager","createRouteManager","httpServer","createHTTPServer","apis","createContentAPI","admin","createAdminAPI","all","state","mounted","api","name","args","routes","Array","isArray","type","Error","Object","addRoutes","mount","values","forEach","allowedMethods","initRouting","registerAllRoutes","initMiddlewares","registerApplicationMiddlewares","listRoutes","stack","listen","destroy"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/server/index.ts"],"sourcesContent":["import Router from '@koa/router';\nimport type { Core, Modules } from '@strapi/types';\n\nimport { createHTTPServer } from './http-server';\nimport { createRouteManager } from './routing';\nimport { createAdminAPI } from './admin-api';\nimport { createContentAPI } from './content-api';\nimport registerAllRoutes from './register-routes';\nimport registerApplicationMiddlewares from './register-middlewares';\nimport createKoaApp from './koa';\nimport requestCtx from '../request-context';\n\nconst healthCheck: Core.MiddlewareHandler = async (ctx) => {\n ctx.set('strapi', 'You are so French!');\n ctx.status = 204;\n};\n\nconst createServer = (strapi: Core.Strapi): Modules.Server.Server => {\n const app = createKoaApp({\n proxy: strapi.config.get('server.proxy.koa'),\n keys: strapi.config.get('server.app.keys'),\n });\n\n app.use((ctx, next) => requestCtx.run(ctx, () => next()));\n\n const router = new Router();\n\n const routeManager = createRouteManager(strapi);\n\n const httpServer = createHTTPServer(strapi, app);\n\n const apis = {\n 'content-api': createContentAPI(strapi),\n admin: createAdminAPI(strapi),\n };\n\n // init health check\n router.all('/_health', healthCheck);\n\n const state = {\n mounted: false,\n };\n\n return {\n app,\n router,\n httpServer,\n\n api(name) {\n return apis[name];\n },\n\n use(...args) {\n app.use(...args);\n return this;\n },\n\n routes(routes: Core.Router | Omit<Core.Route, 'info'>[]) {\n if (!Array.isArray(routes) && routes.type) {\n const api = apis[routes.type];\n if (!api) {\n throw new Error(`API ${routes.type} not found. Possible APIs are ${Object.keys(apis)}`);\n }\n\n apis[routes.type].routes(routes);\n return this;\n }\n\n routeManager.addRoutes(routes, router);\n return this;\n },\n\n mount() {\n state.mounted = true;\n\n Object.values(apis).forEach((api) => api.mount(router));\n app.use(router.routes()).use(router.allowedMethods());\n\n return this;\n },\n\n initRouting() {\n registerAllRoutes(strapi);\n\n return this;\n },\n\n async initMiddlewares() {\n await registerApplicationMiddlewares(strapi);\n\n return this;\n },\n\n listRoutes() {\n return [...router.stack];\n },\n\n listen(...args: any[]) {\n if (!state.mounted) {\n this.mount();\n }\n\n return httpServer.listen(...args);\n },\n\n async destroy() {\n await httpServer.destroy();\n },\n };\n};\n\nexport { createServer };\n"],"names":["healthCheck","ctx","set","status","createServer","strapi","app","createKoaApp","proxy","config","get","keys","use","next","requestCtx","run","router","Router","routeManager","createRouteManager","httpServer","createHTTPServer","apis","createContentAPI","admin","createAdminAPI","all","state","mounted","api","name","args","routes","Array","isArray","type","Error","Object","addRoutes","mount","values","forEach","allowedMethods","initRouting","registerAllRoutes","initMiddlewares","registerApplicationMiddlewares","listRoutes","stack","listen","destroy"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sources":["../../../src/services/server/middleware.ts"],"sourcesContent":["import path from 'path';\nimport { isArray } from 'lodash/fp';\nimport { importDefault } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nconst instantiateMiddleware = (\n middlewareFactory: Core.MiddlewareFactory,\n name: string,\n config: unknown,\n strapi: Core.Strapi\n) => {\n try {\n return middlewareFactory(config, { strapi });\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Middleware \"${name}\": ${e.message}`);\n }\n }\n};\n\nconst resolveRouteMiddlewares = (route: Core.Route, strapi: Core.Strapi) => {\n const middlewaresConfig = route?.config?.middlewares ?? [];\n\n if (!isArray(middlewaresConfig)) {\n throw new Error('Route middlewares config must be an array');\n }\n\n const middlewares = resolveMiddlewares(middlewaresConfig, strapi);\n\n return middlewares.map(({ handler }) => handler);\n};\n\nconst dummyMiddleware: Core.MiddlewareHandler = (_, next) => next();\n\n/**\n * Initialize every configured middlewares\n */\nconst resolveMiddlewares = (\n config: Array<Core.MiddlewareName | Core.MiddlewareConfig | Core.MiddlewareHandler>,\n strapi: Core.Strapi\n) => {\n const middlewares: {\n name: string | null;\n handler: Core.MiddlewareHandler;\n }[] = [];\n\n for (const item of config) {\n if (typeof item === 'function') {\n middlewares.push({\n name: null,\n handler: item,\n });\n\n continue;\n }\n\n if (typeof item === 'string') {\n const middlewareFactory = strapi.middleware(item);\n\n if (!middlewareFactory) {\n throw new Error(`Middleware ${item} not found.`);\n }\n\n middlewares.push({\n name: item,\n handler: instantiateMiddleware(middlewareFactory, item, {}, strapi) ?? dummyMiddleware,\n });\n\n continue;\n }\n\n if (typeof item === 'object' && item !== null) {\n const { name, resolve, config = {} } = item;\n\n if (name) {\n const middlewareFactory = strapi.middleware(name);\n middlewares.push({\n name,\n handler:\n instantiateMiddleware(middlewareFactory, name, config, strapi) ?? dummyMiddleware,\n });\n\n continue;\n }\n\n if (resolve) {\n const resolvedMiddlewareFactory = resolveCustomMiddleware(resolve, strapi);\n middlewares.push({\n name: resolve,\n handler:\n instantiateMiddleware(resolvedMiddlewareFactory, resolve, config, strapi) ??\n dummyMiddleware,\n });\n\n continue;\n }\n\n throw new Error('Invalid middleware configuration. Missing name or resolve properties.');\n }\n\n throw new Error(\n 'Middleware config must either be a string or an object {name?: string, resolve?: string, config: any}.'\n );\n }\n\n return middlewares;\n};\n\n/**\n * Resolve middleware from package name or path\n */\nconst resolveCustomMiddleware = (resolve: string, strapi: Core.Strapi) => {\n let modulePath;\n\n try {\n modulePath = require.resolve(resolve);\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'MODULE_NOT_FOUND') {\n modulePath = path.resolve(strapi.dirs.dist.root, resolve);\n } else {\n throw error;\n }\n }\n\n try {\n return importDefault(modulePath);\n } catch (err) {\n throw new Error(`Could not load middleware \"${modulePath}\".`);\n }\n};\n\nexport { resolveRouteMiddlewares, resolveMiddlewares };\n"],"names":["instantiateMiddleware","middlewareFactory","name","config","strapi","e","Error","message","resolveRouteMiddlewares","route","middlewaresConfig","middlewares","isArray","resolveMiddlewares","map","handler","dummyMiddleware","_","next","item","push","middleware","resolve","resolvedMiddlewareFactory","resolveCustomMiddleware","modulePath","require","error","code","path","dirs","dist","root","importDefault","err"],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sources":["../../../src/services/server/middleware.ts"],"sourcesContent":["import path from 'path';\nimport { isArray } from 'lodash/fp';\nimport { importDefault } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nconst instantiateMiddleware = (\n middlewareFactory: Core.MiddlewareFactory,\n name: string,\n config: unknown,\n strapi: Core.Strapi\n) => {\n try {\n return middlewareFactory(config, { strapi });\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Middleware \"${name}\": ${e.message}`);\n }\n }\n};\n\nconst resolveRouteMiddlewares = (route: Core.Route, strapi: Core.Strapi) => {\n const middlewaresConfig = route?.config?.middlewares ?? [];\n\n if (!isArray(middlewaresConfig)) {\n throw new Error('Route middlewares config must be an array');\n }\n\n const middlewares = resolveMiddlewares(middlewaresConfig, strapi);\n\n return middlewares.map(({ handler }) => handler);\n};\n\nconst dummyMiddleware: Core.MiddlewareHandler = (_, next) => next();\n\n/**\n * Initialize every configured middlewares\n */\nconst resolveMiddlewares = (\n config: Array<Core.MiddlewareName | Core.MiddlewareConfig | Core.MiddlewareHandler>,\n strapi: Core.Strapi\n) => {\n const middlewares: {\n name: string | null;\n handler: Core.MiddlewareHandler;\n }[] = [];\n\n for (const item of config) {\n if (typeof item === 'function') {\n middlewares.push({\n name: null,\n handler: item,\n });\n\n continue;\n }\n\n if (typeof item === 'string') {\n const middlewareFactory = strapi.middleware(item);\n\n if (!middlewareFactory) {\n throw new Error(`Middleware ${item} not found.`);\n }\n\n middlewares.push({\n name: item,\n handler: instantiateMiddleware(middlewareFactory, item, {}, strapi) ?? dummyMiddleware,\n });\n\n continue;\n }\n\n if (typeof item === 'object' && item !== null) {\n const { name, resolve, config = {} } = item;\n\n if (name) {\n const middlewareFactory = strapi.middleware(name);\n middlewares.push({\n name,\n handler:\n instantiateMiddleware(middlewareFactory, name, config, strapi) ?? dummyMiddleware,\n });\n\n continue;\n }\n\n if (resolve) {\n const resolvedMiddlewareFactory = resolveCustomMiddleware(resolve, strapi);\n middlewares.push({\n name: resolve,\n handler:\n instantiateMiddleware(resolvedMiddlewareFactory, resolve, config, strapi) ??\n dummyMiddleware,\n });\n\n continue;\n }\n\n throw new Error('Invalid middleware configuration. Missing name or resolve properties.');\n }\n\n throw new Error(\n 'Middleware config must either be a string or an object {name?: string, resolve?: string, config: any}.'\n );\n }\n\n return middlewares;\n};\n\n/**\n * Resolve middleware from package name or path\n */\nconst resolveCustomMiddleware = (resolve: string, strapi: Core.Strapi) => {\n let modulePath;\n\n try {\n modulePath = require.resolve(resolve);\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'MODULE_NOT_FOUND') {\n modulePath = path.resolve(strapi.dirs.dist.root, resolve);\n } else {\n throw error;\n }\n }\n\n try {\n return importDefault(modulePath);\n } catch (err) {\n throw new Error(`Could not load middleware \"${modulePath}\".`);\n }\n};\n\nexport { resolveRouteMiddlewares, resolveMiddlewares };\n"],"names":["instantiateMiddleware","middlewareFactory","name","config","strapi","e","Error","message","resolveRouteMiddlewares","route","middlewaresConfig","middlewares","isArray","resolveMiddlewares","map","handler","dummyMiddleware","_","next","item","push","middleware","resolve","resolvedMiddlewareFactory","resolveCustomMiddleware","modulePath","require","error","code","path","dirs","dist","root","importDefault","err"],"mappings":"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"}