@strapi/core 5.46.1 → 5.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/dist/Strapi.d.ts.map +1 -1
  2. package/dist/Strapi.js +12 -3
  3. package/dist/Strapi.js.map +1 -1
  4. package/dist/Strapi.mjs +12 -3
  5. package/dist/Strapi.mjs.map +1 -1
  6. package/dist/compile.d.ts.map +1 -1
  7. package/dist/compile.js +12 -5
  8. package/dist/compile.js.map +1 -1
  9. package/dist/compile.mjs +12 -5
  10. package/dist/compile.mjs.map +1 -1
  11. package/dist/core-api/routes/index.js +2 -0
  12. package/dist/core-api/routes/index.js.map +1 -1
  13. package/dist/core-api/routes/index.mjs +2 -0
  14. package/dist/core-api/routes/index.mjs.map +1 -1
  15. package/dist/core-api/routes/validation/content-type.d.ts +13 -1
  16. package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
  17. package/dist/core-api/routes/validation/content-type.js +15 -2
  18. package/dist/core-api/routes/validation/content-type.js.map +1 -1
  19. package/dist/core-api/routes/validation/content-type.mjs +15 -2
  20. package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
  21. package/dist/middlewares/session.d.ts +2 -2
  22. package/dist/middlewares/session.d.ts.map +1 -1
  23. package/dist/middlewares/session.js +1 -1
  24. package/dist/middlewares/session.js.map +1 -1
  25. package/dist/middlewares/session.mjs +2 -2
  26. package/dist/middlewares/session.mjs.map +1 -1
  27. package/dist/migrations/database/5.0.0-discard-drafts.d.ts +2 -1
  28. package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
  29. package/dist/migrations/database/5.0.0-discard-drafts.js +41 -30
  30. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  31. package/dist/migrations/database/5.0.0-discard-drafts.mjs +41 -30
  32. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  33. package/dist/package.json.js +16 -15
  34. package/dist/package.json.js.map +1 -1
  35. package/dist/package.json.mjs +16 -15
  36. package/dist/package.json.mjs.map +1 -1
  37. package/dist/providers/index.d.ts.map +1 -1
  38. package/dist/providers/index.js +3 -1
  39. package/dist/providers/index.js.map +1 -1
  40. package/dist/providers/index.mjs +3 -1
  41. package/dist/providers/index.mjs.map +1 -1
  42. package/dist/providers/mcp.d.ts +3 -0
  43. package/dist/providers/mcp.d.ts.map +1 -0
  44. package/dist/providers/mcp.js +39 -0
  45. package/dist/providers/mcp.js.map +1 -0
  46. package/dist/providers/mcp.mjs +37 -0
  47. package/dist/providers/mcp.mjs.map +1 -0
  48. package/dist/providers/session-manager.d.ts.map +1 -1
  49. package/dist/providers/session-manager.js +3 -0
  50. package/dist/providers/session-manager.js.map +1 -1
  51. package/dist/providers/session-manager.mjs +3 -0
  52. package/dist/providers/session-manager.mjs.map +1 -1
  53. package/dist/services/ai.d.ts.map +1 -1
  54. package/dist/services/ai.js +3 -0
  55. package/dist/services/ai.js.map +1 -1
  56. package/dist/services/ai.mjs +3 -0
  57. package/dist/services/ai.mjs.map +1 -1
  58. package/dist/services/cron.d.ts +1 -1
  59. package/dist/services/cron.d.ts.map +1 -1
  60. package/dist/services/cron.js +10 -2
  61. package/dist/services/cron.js.map +1 -1
  62. package/dist/services/cron.mjs +10 -2
  63. package/dist/services/cron.mjs.map +1 -1
  64. package/dist/services/document-service/draft-and-publish.d.ts +2 -16
  65. package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
  66. package/dist/services/document-service/draft-and-publish.js +0 -53
  67. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  68. package/dist/services/document-service/draft-and-publish.mjs +2 -53
  69. package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
  70. package/dist/services/document-service/params.d.ts +2 -2
  71. package/dist/services/document-service/params.d.ts.map +1 -1
  72. package/dist/services/document-service/publication-filter.d.ts +6 -0
  73. package/dist/services/document-service/publication-filter.d.ts.map +1 -0
  74. package/dist/services/document-service/publication-filter.js +20 -0
  75. package/dist/services/document-service/publication-filter.js.map +1 -0
  76. package/dist/services/document-service/publication-filter.mjs +15 -0
  77. package/dist/services/document-service/publication-filter.mjs.map +1 -0
  78. package/dist/services/document-service/transform/query.d.ts +1 -1
  79. package/dist/services/document-service/transform/query.d.ts.map +1 -1
  80. package/dist/services/document-service/transform/query.js +32 -19
  81. package/dist/services/document-service/transform/query.js.map +1 -1
  82. package/dist/services/document-service/transform/query.mjs +33 -20
  83. package/dist/services/document-service/transform/query.mjs.map +1 -1
  84. package/dist/services/entity-validator/blocks-validator.js +1 -1
  85. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  86. package/dist/services/entity-validator/blocks-validator.mjs +1 -1
  87. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  88. package/dist/services/mcp/authentication.d.ts +23 -0
  89. package/dist/services/mcp/authentication.d.ts.map +1 -0
  90. package/dist/services/mcp/authentication.js +45 -0
  91. package/dist/services/mcp/authentication.js.map +1 -0
  92. package/dist/services/mcp/authentication.mjs +43 -0
  93. package/dist/services/mcp/authentication.mjs.map +1 -0
  94. package/dist/services/mcp/handlers/handlePost.d.ts +4 -0
  95. package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -0
  96. package/dist/services/mcp/handlers/handlePost.js +59 -0
  97. package/dist/services/mcp/handlers/handlePost.js.map +1 -0
  98. package/dist/services/mcp/handlers/handlePost.mjs +57 -0
  99. package/dist/services/mcp/handlers/handlePost.mjs.map +1 -0
  100. package/dist/services/mcp/handlers/types.d.ts +12 -0
  101. package/dist/services/mcp/handlers/types.d.ts.map +1 -0
  102. package/dist/services/mcp/index.d.ts +6 -0
  103. package/dist/services/mcp/index.d.ts.map +1 -0
  104. package/dist/services/mcp/index.js +101 -0
  105. package/dist/services/mcp/index.js.map +1 -0
  106. package/dist/services/mcp/index.mjs +99 -0
  107. package/dist/services/mcp/index.mjs.map +1 -0
  108. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts +13 -0
  109. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts.map +1 -0
  110. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js +53 -0
  111. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js.map +1 -0
  112. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs +51 -0
  113. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs.map +1 -0
  114. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +43 -0
  115. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -0
  116. package/dist/services/mcp/internal/McpCapabilityRegistry.js +108 -0
  117. package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -0
  118. package/dist/services/mcp/internal/McpCapabilityRegistry.mjs +106 -0
  119. package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -0
  120. package/dist/services/mcp/internal/McpConfiguration.d.ts +11 -0
  121. package/dist/services/mcp/internal/McpConfiguration.d.ts.map +1 -0
  122. package/dist/services/mcp/internal/McpConfiguration.js +34 -0
  123. package/dist/services/mcp/internal/McpConfiguration.js.map +1 -0
  124. package/dist/services/mcp/internal/McpConfiguration.mjs +32 -0
  125. package/dist/services/mcp/internal/McpConfiguration.mjs.map +1 -0
  126. package/dist/services/mcp/internal/McpServerFactory.d.ts +37 -0
  127. package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -0
  128. package/dist/services/mcp/internal/McpServerFactory.js +71 -0
  129. package/dist/services/mcp/internal/McpServerFactory.js.map +1 -0
  130. package/dist/services/mcp/internal/McpServerFactory.mjs +69 -0
  131. package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -0
  132. package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts +21 -0
  133. package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts.map +1 -0
  134. package/dist/services/mcp/internal/syncMcpSessionCapabilities.js +76 -0
  135. package/dist/services/mcp/internal/syncMcpSessionCapabilities.js.map +1 -0
  136. package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs +73 -0
  137. package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs.map +1 -0
  138. package/dist/services/mcp/metrics/metrics.d.ts +29 -0
  139. package/dist/services/mcp/metrics/metrics.d.ts.map +1 -0
  140. package/dist/services/mcp/metrics/metrics.js +97 -0
  141. package/dist/services/mcp/metrics/metrics.js.map +1 -0
  142. package/dist/services/mcp/metrics/metrics.mjs +88 -0
  143. package/dist/services/mcp/metrics/metrics.mjs.map +1 -0
  144. package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts +11 -0
  145. package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts.map +1 -0
  146. package/dist/services/mcp/metrics/normalizeMcpCapability.js +10 -0
  147. package/dist/services/mcp/metrics/normalizeMcpCapability.js.map +1 -0
  148. package/dist/services/mcp/metrics/normalizeMcpCapability.mjs +8 -0
  149. package/dist/services/mcp/metrics/normalizeMcpCapability.mjs.map +1 -0
  150. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts +4 -0
  151. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts.map +1 -0
  152. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js +27 -0
  153. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js.map +1 -0
  154. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs +25 -0
  155. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs.map +1 -0
  156. package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts +3 -0
  157. package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts.map +1 -0
  158. package/dist/services/mcp/middleware/oauthDiscoveryFallback.js +47 -0
  159. package/dist/services/mcp/middleware/oauthDiscoveryFallback.js.map +1 -0
  160. package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs +45 -0
  161. package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs.map +1 -0
  162. package/dist/services/mcp/prompt-registry.d.ts +16 -0
  163. package/dist/services/mcp/prompt-registry.d.ts.map +1 -0
  164. package/dist/services/mcp/prompt-registry.js +77 -0
  165. package/dist/services/mcp/prompt-registry.js.map +1 -0
  166. package/dist/services/mcp/prompt-registry.mjs +75 -0
  167. package/dist/services/mcp/prompt-registry.mjs.map +1 -0
  168. package/dist/services/mcp/resource-registry.d.ts +14 -0
  169. package/dist/services/mcp/resource-registry.d.ts.map +1 -0
  170. package/dist/services/mcp/resource-registry.js +67 -0
  171. package/dist/services/mcp/resource-registry.js.map +1 -0
  172. package/dist/services/mcp/resource-registry.mjs +65 -0
  173. package/dist/services/mcp/resource-registry.mjs.map +1 -0
  174. package/dist/services/mcp/routes.d.ts +11 -0
  175. package/dist/services/mcp/routes.d.ts.map +1 -0
  176. package/dist/services/mcp/routes.js +58 -0
  177. package/dist/services/mcp/routes.js.map +1 -0
  178. package/dist/services/mcp/routes.mjs +56 -0
  179. package/dist/services/mcp/routes.mjs.map +1 -0
  180. package/dist/services/mcp/tool-registry.d.ts +25 -0
  181. package/dist/services/mcp/tool-registry.d.ts.map +1 -0
  182. package/dist/services/mcp/tool-registry.js +102 -0
  183. package/dist/services/mcp/tool-registry.js.map +1 -0
  184. package/dist/services/mcp/tool-registry.mjs +99 -0
  185. package/dist/services/mcp/tool-registry.mjs.map +1 -0
  186. package/dist/services/mcp/tools/log.d.ts +87 -0
  187. package/dist/services/mcp/tools/log.d.ts.map +1 -0
  188. package/dist/services/mcp/tools/log.js +88 -0
  189. package/dist/services/mcp/tools/log.js.map +1 -0
  190. package/dist/services/mcp/tools/log.mjs +86 -0
  191. package/dist/services/mcp/tools/log.mjs.map +1 -0
  192. package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts +36 -0
  193. package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts.map +1 -0
  194. package/dist/services/mcp/utils/createSafeCapabilityRegistration.js +59 -0
  195. package/dist/services/mcp/utils/createSafeCapabilityRegistration.js.map +1 -0
  196. package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs +56 -0
  197. package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs.map +1 -0
  198. package/dist/services/mcp/utils/jsonRpcErrors.d.ts +22 -0
  199. package/dist/services/mcp/utils/jsonRpcErrors.d.ts.map +1 -0
  200. package/dist/services/mcp/utils/jsonRpcErrors.js +25 -0
  201. package/dist/services/mcp/utils/jsonRpcErrors.js.map +1 -0
  202. package/dist/services/mcp/utils/jsonRpcErrors.mjs +23 -0
  203. package/dist/services/mcp/utils/jsonRpcErrors.mjs.map +1 -0
  204. package/dist/services/mcp/utils/safeHandlerWrapper.d.ts +18 -0
  205. package/dist/services/mcp/utils/safeHandlerWrapper.d.ts.map +1 -0
  206. package/dist/services/mcp/utils/safeHandlerWrapper.js +29 -0
  207. package/dist/services/mcp/utils/safeHandlerWrapper.js.map +1 -0
  208. package/dist/services/mcp/utils/safeHandlerWrapper.mjs +27 -0
  209. package/dist/services/mcp/utils/safeHandlerWrapper.mjs.map +1 -0
  210. package/dist/services/mcp/utils/sendJsonRpcError.d.ts +5 -0
  211. package/dist/services/mcp/utils/sendJsonRpcError.d.ts.map +1 -0
  212. package/dist/services/mcp/utils/sendJsonRpcError.js +23 -0
  213. package/dist/services/mcp/utils/sendJsonRpcError.js.map +1 -0
  214. package/dist/services/mcp/utils/sendJsonRpcError.mjs +21 -0
  215. package/dist/services/mcp/utils/sendJsonRpcError.mjs.map +1 -0
  216. package/dist/services/mcp/utils/withTimeout.d.ts +7 -0
  217. package/dist/services/mcp/utils/withTimeout.d.ts.map +1 -0
  218. package/dist/services/mcp/utils/withTimeout.js +23 -0
  219. package/dist/services/mcp/utils/withTimeout.js.map +1 -0
  220. package/dist/services/mcp/utils/withTimeout.mjs +21 -0
  221. package/dist/services/mcp/utils/withTimeout.mjs.map +1 -0
  222. package/dist/services/metrics/index.d.ts.map +1 -1
  223. package/dist/services/metrics/index.js +9 -6
  224. package/dist/services/metrics/index.js.map +1 -1
  225. package/dist/services/metrics/index.mjs +9 -6
  226. package/dist/services/metrics/index.mjs.map +1 -1
  227. package/dist/services/metrics/sender.d.ts.map +1 -1
  228. package/dist/services/metrics/sender.js +11 -3
  229. package/dist/services/metrics/sender.js.map +1 -1
  230. package/dist/services/metrics/sender.mjs +11 -3
  231. package/dist/services/metrics/sender.mjs.map +1 -1
  232. package/package.json +16 -15
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Wraps an MCP capability handler to catch and log errors from user-provided callbacks.
3
+ *
4
+ * This prevents externally-registered capabilities (from plugin developers)
5
+ * from crashing Strapi core when they throw during execution.
6
+ *
7
+ * Errors are:
8
+ * - Logged with full detail (message + stack) via Strapi's logger
9
+ * - Returned to the MCP client as a safe error response (no stack trace leak)
10
+ */ const wrapSafeHandler = (handler, options)=>{
11
+ const { strapi, capabilityType, name, createErrorResult } = options;
12
+ return async (...args)=>{
13
+ try {
14
+ return await handler(...args);
15
+ } catch (error) {
16
+ const normalized = error instanceof Error ? error : new Error(String(error));
17
+ strapi.log.error(`[MCP] ${capabilityType} "${name}" threw an error during execution: ${normalized.message}`, {
18
+ error: normalized.message,
19
+ stack: normalized.stack
20
+ });
21
+ return createErrorResult(normalized, args);
22
+ }
23
+ };
24
+ };
25
+
26
+ export { wrapSafeHandler };
27
+ //# sourceMappingURL=safeHandlerWrapper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeHandlerWrapper.mjs","sources":["../../../../src/services/mcp/utils/safeHandlerWrapper.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\n/**\n * Wraps an MCP capability handler to catch and log errors from user-provided callbacks.\n *\n * This prevents externally-registered capabilities (from plugin developers)\n * from crashing Strapi core when they throw during execution.\n *\n * Errors are:\n * - Logged with full detail (message + stack) via Strapi's logger\n * - Returned to the MCP client as a safe error response (no stack trace leak)\n */\nexport const wrapSafeHandler = <TArgs extends unknown[], TResult>(\n handler: (...args: TArgs) => Promise<TResult>,\n options: {\n strapi: Core.Strapi;\n capabilityType: string;\n name: string;\n createErrorResult: (error: Error, args: TArgs) => TResult;\n }\n): ((...args: TArgs) => Promise<TResult>) => {\n const { strapi, capabilityType, name, createErrorResult } = options;\n\n return async (...args: TArgs): Promise<TResult> => {\n try {\n return await handler(...args);\n } catch (error) {\n const normalized = error instanceof Error ? error : new Error(String(error));\n\n strapi.log.error(\n `[MCP] ${capabilityType} \"${name}\" threw an error during execution: ${normalized.message}`,\n {\n error: normalized.message,\n stack: normalized.stack,\n }\n );\n\n return createErrorResult(normalized, args);\n }\n };\n};\n"],"names":["wrapSafeHandler","handler","options","strapi","capabilityType","name","createErrorResult","args","error","normalized","Error","String","log","message","stack"],"mappings":"AAEA;;;;;;;;;AASC,IACM,MAAMA,eAAAA,GAAkB,CAC7BC,OAAAA,EACAC,OAAAA,GAAAA;IAOA,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAEC,IAAI,EAAEC,iBAAiB,EAAE,GAAGJ,OAAAA;AAE5D,IAAA,OAAO,OAAO,GAAGK,IAAAA,GAAAA;QACf,IAAI;AACF,YAAA,OAAO,MAAMN,OAAAA,CAAAA,GAAWM,IAAAA,CAAAA;AAC1B,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACd,YAAA,MAAMC,aAAaD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,GAAQ,IAAIE,MAAMC,MAAAA,CAAOH,KAAAA,CAAAA,CAAAA;AAErEL,YAAAA,MAAAA,CAAOS,GAAG,CAACJ,KAAK,CACd,CAAC,MAAM,EAAEJ,cAAAA,CAAe,EAAE,EAAEC,KAAK,mCAAmC,EAAEI,UAAAA,CAAWI,OAAO,EAAE,EAC1F;AACEL,gBAAAA,KAAAA,EAAOC,WAAWI,OAAO;AACzBC,gBAAAA,KAAAA,EAAOL,WAAWK;AACpB,aAAA,CAAA;AAGF,YAAA,OAAOR,kBAAkBG,UAAAA,EAAYF,IAAAA,CAAAA;AACvC,QAAA;AACF,IAAA,CAAA;AACF;;;;"}
@@ -0,0 +1,5 @@
1
+ /// <reference types="node" />
2
+ import type { ServerResponse } from 'node:http';
3
+ import { JSON_RPC_ERRORS } from './jsonRpcErrors';
4
+ export declare const sendJsonRpcError: (res: ServerResponse, errorKey: keyof typeof JSON_RPC_ERRORS, customMessage?: string) => void;
5
+ //# sourceMappingURL=sendJsonRpcError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendJsonRpcError.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/sendJsonRpcError.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,eAAO,MAAM,gBAAgB,QACtB,cAAc,YACT,MAAM,sBAAsB,kBACtB,MAAM,KACrB,IAaF,CAAC"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ var jsonRpcErrors = require('./jsonRpcErrors.js');
4
+
5
+ const sendJsonRpcError = (res, errorKey, customMessage)=>{
6
+ if (res.headersSent === false) {
7
+ const { code, message, httpStatus } = jsonRpcErrors.JSON_RPC_ERRORS[errorKey];
8
+ res.writeHead(httpStatus, {
9
+ 'Content-Type': 'application/json'
10
+ });
11
+ res.end(JSON.stringify({
12
+ jsonrpc: '2.0',
13
+ error: {
14
+ code,
15
+ message: message
16
+ },
17
+ id: null
18
+ }));
19
+ }
20
+ };
21
+
22
+ exports.sendJsonRpcError = sendJsonRpcError;
23
+ //# sourceMappingURL=sendJsonRpcError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendJsonRpcError.js","sources":["../../../../src/services/mcp/utils/sendJsonRpcError.ts"],"sourcesContent":["import type { ServerResponse } from 'node:http';\nimport { JSON_RPC_ERRORS } from './jsonRpcErrors';\n\nexport const sendJsonRpcError = (\n res: ServerResponse,\n errorKey: keyof typeof JSON_RPC_ERRORS,\n customMessage?: string\n): void => {\n if (res.headersSent === false) {\n const { code, message, httpStatus } = JSON_RPC_ERRORS[errorKey];\n\n res.writeHead(httpStatus, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code, message: customMessage ?? message },\n id: null,\n })\n );\n }\n};\n"],"names":["sendJsonRpcError","res","errorKey","customMessage","headersSent","code","message","httpStatus","JSON_RPC_ERRORS","writeHead","end","JSON","stringify","jsonrpc","error","id"],"mappings":";;;;AAGO,MAAMA,gBAAAA,GAAmB,CAC9BC,GAAAA,EACAC,QAAAA,EACAC,aAAAA,GAAAA;IAEA,IAAIF,GAAAA,CAAIG,WAAW,KAAK,KAAA,EAAO;QAC7B,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGC,6BAAe,CAACN,QAAAA,CAAS;QAE/DD,GAAAA,CAAIQ,SAAS,CAACF,UAAAA,EAAY;YAAE,cAAA,EAAgB;AAAmB,SAAA,CAAA;AAC/DN,QAAAA,GAAAA,CAAIS,GAAG,CACLC,IAAAA,CAAKC,SAAS,CAAC;YACbC,OAAAA,EAAS,KAAA;YACTC,KAAAA,EAAO;AAAET,gBAAAA,IAAAA;AAAMC,gBAAAA,OAAAA,EAA0BA;AAAQ,aAAA;YACjDS,EAAAA,EAAI;AACN,SAAA,CAAA,CAAA;AAEJ,IAAA;AACF;;;;"}
@@ -0,0 +1,21 @@
1
+ import { JSON_RPC_ERRORS } from './jsonRpcErrors.mjs';
2
+
3
+ const sendJsonRpcError = (res, errorKey, customMessage)=>{
4
+ if (res.headersSent === false) {
5
+ const { code, message, httpStatus } = JSON_RPC_ERRORS[errorKey];
6
+ res.writeHead(httpStatus, {
7
+ 'Content-Type': 'application/json'
8
+ });
9
+ res.end(JSON.stringify({
10
+ jsonrpc: '2.0',
11
+ error: {
12
+ code,
13
+ message: message
14
+ },
15
+ id: null
16
+ }));
17
+ }
18
+ };
19
+
20
+ export { sendJsonRpcError };
21
+ //# sourceMappingURL=sendJsonRpcError.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendJsonRpcError.mjs","sources":["../../../../src/services/mcp/utils/sendJsonRpcError.ts"],"sourcesContent":["import type { ServerResponse } from 'node:http';\nimport { JSON_RPC_ERRORS } from './jsonRpcErrors';\n\nexport const sendJsonRpcError = (\n res: ServerResponse,\n errorKey: keyof typeof JSON_RPC_ERRORS,\n customMessage?: string\n): void => {\n if (res.headersSent === false) {\n const { code, message, httpStatus } = JSON_RPC_ERRORS[errorKey];\n\n res.writeHead(httpStatus, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code, message: customMessage ?? message },\n id: null,\n })\n );\n }\n};\n"],"names":["sendJsonRpcError","res","errorKey","customMessage","headersSent","code","message","httpStatus","JSON_RPC_ERRORS","writeHead","end","JSON","stringify","jsonrpc","error","id"],"mappings":";;AAGO,MAAMA,gBAAAA,GAAmB,CAC9BC,GAAAA,EACAC,QAAAA,EACAC,aAAAA,GAAAA;IAEA,IAAIF,GAAAA,CAAIG,WAAW,KAAK,KAAA,EAAO;QAC7B,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGC,eAAe,CAACN,QAAAA,CAAS;QAE/DD,GAAAA,CAAIQ,SAAS,CAACF,UAAAA,EAAY;YAAE,cAAA,EAAgB;AAAmB,SAAA,CAAA;AAC/DN,QAAAA,GAAAA,CAAIS,GAAG,CACLC,IAAAA,CAAKC,SAAS,CAAC;YACbC,OAAAA,EAAS,KAAA;YACTC,KAAAA,EAAO;AAAET,gBAAAA,IAAAA;AAAMC,gBAAAA,OAAAA,EAA0BA;AAAQ,aAAA;YACjDS,EAAAA,EAAI;AACN,SAAA,CAAA,CAAA;AAEJ,IAAA;AACF;;;;"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Wraps a promise with a timeout to prevent hanging operations.
3
+ * The internal timer is always cleared once the race settles, preventing
4
+ * ref'd timer handles from keeping the event loop alive after the operation completes.
5
+ */
6
+ export declare const withTimeout: <T>(promise: Promise<T>, timeoutMs: number, operation: string) => Promise<T>;
7
+ //# sourceMappingURL=withTimeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withTimeout.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/withTimeout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,WAAW,eACb,QAAQ,CAAC,CAAC,aACR,MAAM,aACN,MAAM,KAChB,QAAQ,CAAC,CAYX,CAAC"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Wraps a promise with a timeout to prevent hanging operations.
5
+ * The internal timer is always cleared once the race settles, preventing
6
+ * ref'd timer handles from keeping the event loop alive after the operation completes.
7
+ */ const withTimeout = (promise, timeoutMs, operation)=>{
8
+ let timeoutId;
9
+ const timeoutPromise = new Promise((_, reject)=>{
10
+ timeoutId = setTimeout(()=>{
11
+ reject(new Error(`Operation '${operation}' timed out after ${timeoutMs}ms`));
12
+ }, timeoutMs);
13
+ });
14
+ return Promise.race([
15
+ promise,
16
+ timeoutPromise
17
+ ]).finally(()=>{
18
+ clearTimeout(timeoutId);
19
+ });
20
+ };
21
+
22
+ exports.withTimeout = withTimeout;
23
+ //# sourceMappingURL=withTimeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withTimeout.js","sources":["../../../../src/services/mcp/utils/withTimeout.ts"],"sourcesContent":["/**\n * Wraps a promise with a timeout to prevent hanging operations.\n * The internal timer is always cleared once the race settles, preventing\n * ref'd timer handles from keeping the event loop alive after the operation completes.\n */\nexport const withTimeout = <T>(\n promise: Promise<T>,\n timeoutMs: number,\n operation: string\n): Promise<T> => {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const timeoutPromise = new Promise<T>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`Operation '${operation}' timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n clearTimeout(timeoutId);\n });\n};\n"],"names":["withTimeout","promise","timeoutMs","operation","timeoutId","timeoutPromise","Promise","_","reject","setTimeout","Error","race","finally","clearTimeout"],"mappings":";;AAAA;;;;AAIC,IACM,MAAMA,WAAAA,GAAc,CACzBC,SACAC,SAAAA,EACAC,SAAAA,GAAAA;IAEA,IAAIC,SAAAA;AAEJ,IAAA,MAAMC,cAAAA,GAAiB,IAAIC,OAAAA,CAAW,CAACC,CAAAA,EAAGC,MAAAA,GAAAA;AACxCJ,QAAAA,SAAAA,GAAYK,UAAAA,CAAW,IAAA;YACrBD,MAAAA,CAAO,IAAIE,KAAAA,CAAM,CAAC,WAAW,EAAEP,UAAU,kBAAkB,EAAED,SAAAA,CAAU,EAAE,CAAC,CAAA,CAAA;QAC5E,CAAA,EAAGA,SAAAA,CAAAA;AACL,IAAA,CAAA,CAAA;IAEA,OAAOI,OAAAA,CAAQK,IAAI,CAAC;AAACV,QAAAA,OAAAA;AAASI,QAAAA;AAAe,KAAA,CAAA,CAAEO,OAAO,CAAC,IAAA;QACrDC,YAAAA,CAAaT,SAAAA,CAAAA;AACf,IAAA,CAAA,CAAA;AACF;;;;"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Wraps a promise with a timeout to prevent hanging operations.
3
+ * The internal timer is always cleared once the race settles, preventing
4
+ * ref'd timer handles from keeping the event loop alive after the operation completes.
5
+ */ const withTimeout = (promise, timeoutMs, operation)=>{
6
+ let timeoutId;
7
+ const timeoutPromise = new Promise((_, reject)=>{
8
+ timeoutId = setTimeout(()=>{
9
+ reject(new Error(`Operation '${operation}' timed out after ${timeoutMs}ms`));
10
+ }, timeoutMs);
11
+ });
12
+ return Promise.race([
13
+ promise,
14
+ timeoutPromise
15
+ ]).finally(()=>{
16
+ clearTimeout(timeoutId);
17
+ });
18
+ };
19
+
20
+ export { withTimeout };
21
+ //# sourceMappingURL=withTimeout.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withTimeout.mjs","sources":["../../../../src/services/mcp/utils/withTimeout.ts"],"sourcesContent":["/**\n * Wraps a promise with a timeout to prevent hanging operations.\n * The internal timer is always cleared once the race settles, preventing\n * ref'd timer handles from keeping the event loop alive after the operation completes.\n */\nexport const withTimeout = <T>(\n promise: Promise<T>,\n timeoutMs: number,\n operation: string\n): Promise<T> => {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const timeoutPromise = new Promise<T>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`Operation '${operation}' timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n clearTimeout(timeoutId);\n });\n};\n"],"names":["withTimeout","promise","timeoutMs","operation","timeoutId","timeoutPromise","Promise","_","reject","setTimeout","Error","race","finally","clearTimeout"],"mappings":"AAAA;;;;AAIC,IACM,MAAMA,WAAAA,GAAc,CACzBC,SACAC,SAAAA,EACAC,SAAAA,GAAAA;IAEA,IAAIC,SAAAA;AAEJ,IAAA,MAAMC,cAAAA,GAAiB,IAAIC,OAAAA,CAAW,CAACC,CAAAA,EAAGC,MAAAA,GAAAA;AACxCJ,QAAAA,SAAAA,GAAYK,UAAAA,CAAW,IAAA;YACrBD,MAAAA,CAAO,IAAIE,KAAAA,CAAM,CAAC,WAAW,EAAEP,UAAU,kBAAkB,EAAED,SAAAA,CAAU,EAAE,CAAC,CAAA,CAAA;QAC5E,CAAA,EAAGA,SAAAA,CAAAA;AACL,IAAA,CAAA,CAAA;IAEA,OAAOI,OAAAA,CAAQK,IAAI,CAAC;AAACV,QAAAA,OAAAA;AAASI,QAAAA;AAAe,KAAA,CAAA,CAAEO,OAAO,CAAC,IAAA;QACrDC,YAAAA,CAAaT,SAAAA,CAAAA;AACf,IAAA,CAAA,CAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAe1C,QAAA,MAAM,uBAAuB,WAAY,KAAK,MAAM;;;;gBA6B9B,MAAM,YAAW,OAAO,MAAM,EAAE,OAAO,CAAC;;CAS7D,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAiB1C,QAAA,MAAM,uBAAuB,WAAY,KAAK,MAAM;;;;gBA8B9B,MAAM,YAAW,OAAO,MAAM,EAAE,OAAO,CAAC;;CAS7D,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -4,28 +4,31 @@ var rateLimiter = require('./rate-limiter.js');
4
4
  var sender = require('./sender.js');
5
5
  var middleware = require('./middleware.js');
6
6
  var isTruthy = require('./is-truthy.js');
7
+ var metrics = require('../mcp/metrics/metrics.js');
7
8
 
8
9
  const LIMITED_EVENTS = [
9
10
  'didSaveMediaWithAlternativeText',
10
11
  'didSaveMediaWithCaption',
11
12
  'didDisableResponsiveDimensions',
12
13
  'didEnableResponsiveDimensions',
13
- 'didInitializePluginUpload'
14
+ 'didInitializePluginUpload',
15
+ ...Object.values(metrics.MCP_LIMITED_TELEMETRY_EVENTS)
14
16
  ];
15
17
  const createTelemetryInstance = (strapi)=>{
16
18
  const uuid = strapi.config.get('uuid');
17
19
  const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');
18
20
  const isDisabled = !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);
19
- const sender$1 = sender(strapi);
20
- const sendEvent = rateLimiter(sender$1, {
21
+ // Skip the sender (and its tsUtils consumer) entirely when telemetry is off
22
+ const sender$1 = isDisabled ? null : sender(strapi);
23
+ const sendEvent = sender$1 ? rateLimiter(sender$1, {
21
24
  limitedEvents: LIMITED_EVENTS
22
- });
25
+ }) : null;
23
26
  return {
24
27
  get isDisabled () {
25
28
  return isDisabled;
26
29
  },
27
30
  register () {
28
- if (!isDisabled) {
31
+ if (!isDisabled && sendEvent) {
29
32
  strapi.cron.add({
30
33
  sendPingEvent: {
31
34
  task: ()=>sendEvent('ping'),
@@ -40,7 +43,7 @@ const createTelemetryInstance = (strapi)=>{
40
43
  },
41
44
  bootstrap () {},
42
45
  async send (event, payload = {}) {
43
- if (isDisabled) return true;
46
+ if (isDisabled || !sendEvent) return true;
44
47
  return sendEvent(event, payload);
45
48
  },
46
49
  destroy () {
@@ -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 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,cAAAA,GAAiB;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,IAAAA,GAAOD,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAAA,GAAoBJ,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAAA,IAAQK,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAAAA,CAASF,iBAAAA,CAAAA;AAEvE,IAAA,MAAMM,WAASC,MAAAA,CAAaX,MAAAA,CAAAA;IAC5B,MAAMY,SAAAA,GAAYC,YAAkBH,QAAAA,EAAQ;QAAEI,aAAAA,EAAehB;AAAe,KAAA,CAAA;IAE5E,OAAO;AACL,QAAA,IAAIO,UAAAA,CAAAA,GAAa;YACf,OAAOA,UAAAA;AACT,QAAA,CAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACV,UAAAA,EAAY;gBACfL,MAAAA,CAAOgB,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAAA,EAAe;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAAA,CAAU,MAAA,CAAA;wBACtBQ,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,UAAAA,CAAiB;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD,YAAA;AACF,QAAA,CAAA;QAEAwB,SAAAA,CAAAA,GAAAA,CAAa,CAAA;AAEb,QAAA,MAAMC,IAAAA,CAAAA,CAAKC,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;AAC7D,YAAA,IAAItB,YAAY,OAAO,IAAA;AACvB,YAAA,OAAOO,UAAUc,KAAAA,EAAOC,OAAAA,CAAAA;AAC1B,QAAA,CAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA,QAAA;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';\nimport { MCP_LIMITED_TELEMETRY_EVENTS } from '../mcp/metrics/metrics';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n ...Object.values(MCP_LIMITED_TELEMETRY_EVENTS),\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 // Skip the sender (and its tsUtils consumer) entirely when telemetry is off\n const sender = isDisabled ? null : createSender(strapi);\n const sendEvent = sender ? wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS }) : null;\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled && sendEvent) {\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 || !sendEvent) 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","Object","values","MCP_LIMITED_TELEMETRY_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":";;;;;;;;AAaA,MAAMA,cAAAA,GAAiB;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA,2BAAA;AACGC,IAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACC,oCAAAA;AAClB,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAAA,GAAOD,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAAA,GAAoBJ,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAAA,IAAQK,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAAAA,CAASF,iBAAAA,CAAAA;;IAGvE,MAAMM,QAAAA,GAASL,UAAAA,GAAa,IAAA,GAAOM,MAAAA,CAAaX,MAAAA,CAAAA;IAChD,MAAMY,SAAAA,GAAYF,QAAAA,GAASG,WAAAA,CAAkBH,QAAAA,EAAQ;QAAEI,aAAAA,EAAenB;KAAe,CAAA,GAAK,IAAA;IAE1F,OAAO;AACL,QAAA,IAAIU,UAAAA,CAAAA,GAAa;YACf,OAAOA,UAAAA;AACT,QAAA,CAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;YACE,IAAI,CAACV,cAAcO,SAAAA,EAAW;gBAC5BZ,MAAAA,CAAOgB,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAAA,EAAe;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAAA,CAAU,MAAA,CAAA;wBACtBQ,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,UAAAA,CAAiB;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD,YAAA;AACF,QAAA,CAAA;QAEAwB,SAAAA,CAAAA,GAAAA,CAAa,CAAA;AAEb,QAAA,MAAMC,IAAAA,CAAAA,CAAKC,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;YAC7D,IAAItB,UAAAA,IAAc,CAACO,SAAAA,EAAW,OAAO,IAAA;AACrC,YAAA,OAAOA,UAAUc,KAAAA,EAAOC,OAAAA,CAAAA;AAC1B,QAAA,CAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA,QAAA;AACF,KAAA;AACF;;;;"}
@@ -2,28 +2,31 @@ import wrapWithRateLimit from './rate-limiter.mjs';
2
2
  import createSender from './sender.mjs';
3
3
  import createMiddleware from './middleware.mjs';
4
4
  import isTruthy from './is-truthy.mjs';
5
+ import { MCP_LIMITED_TELEMETRY_EVENTS } from '../mcp/metrics/metrics.mjs';
5
6
 
6
7
  const LIMITED_EVENTS = [
7
8
  'didSaveMediaWithAlternativeText',
8
9
  'didSaveMediaWithCaption',
9
10
  'didDisableResponsiveDimensions',
10
11
  'didEnableResponsiveDimensions',
11
- 'didInitializePluginUpload'
12
+ 'didInitializePluginUpload',
13
+ ...Object.values(MCP_LIMITED_TELEMETRY_EVENTS)
12
14
  ];
13
15
  const createTelemetryInstance = (strapi)=>{
14
16
  const uuid = strapi.config.get('uuid');
15
17
  const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');
16
18
  const isDisabled = !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);
17
- const sender = createSender(strapi);
18
- const sendEvent = wrapWithRateLimit(sender, {
19
+ // Skip the sender (and its tsUtils consumer) entirely when telemetry is off
20
+ const sender = isDisabled ? null : createSender(strapi);
21
+ const sendEvent = sender ? wrapWithRateLimit(sender, {
19
22
  limitedEvents: LIMITED_EVENTS
20
- });
23
+ }) : null;
21
24
  return {
22
25
  get isDisabled () {
23
26
  return isDisabled;
24
27
  },
25
28
  register () {
26
- if (!isDisabled) {
29
+ if (!isDisabled && sendEvent) {
27
30
  strapi.cron.add({
28
31
  sendPingEvent: {
29
32
  task: ()=>sendEvent('ping'),
@@ -38,7 +41,7 @@ const createTelemetryInstance = (strapi)=>{
38
41
  },
39
42
  bootstrap () {},
40
43
  async send (event, payload = {}) {
41
- if (isDisabled) return true;
44
+ if (isDisabled || !sendEvent) return true;
42
45
  return sendEvent(event, payload);
43
46
  },
44
47
  destroy () {
@@ -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 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,cAAAA,GAAiB;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,IAAAA,GAAOD,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAAA,GAAoBJ,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAAA,IAAQK,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAAAA,CAASF,iBAAAA,CAAAA;AAEvE,IAAA,MAAMM,SAASC,YAAAA,CAAaX,MAAAA,CAAAA;IAC5B,MAAMY,SAAAA,GAAYC,kBAAkBH,MAAAA,EAAQ;QAAEI,aAAAA,EAAehB;AAAe,KAAA,CAAA;IAE5E,OAAO;AACL,QAAA,IAAIO,UAAAA,CAAAA,GAAa;YACf,OAAOA,UAAAA;AACT,QAAA,CAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACV,UAAAA,EAAY;gBACfL,MAAAA,CAAOgB,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAAA,EAAe;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAAA,CAAU,MAAA,CAAA;wBACtBQ,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,gBAAAA,CAAiB;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD,YAAA;AACF,QAAA,CAAA;QAEAwB,SAAAA,CAAAA,GAAAA,CAAa,CAAA;AAEb,QAAA,MAAMC,IAAAA,CAAAA,CAAKC,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;AAC7D,YAAA,IAAItB,YAAY,OAAO,IAAA;AACvB,YAAA,OAAOO,UAAUc,KAAAA,EAAOC,OAAAA,CAAAA;AAC1B,QAAA,CAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA,QAAA;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';\nimport { MCP_LIMITED_TELEMETRY_EVENTS } from '../mcp/metrics/metrics';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n ...Object.values(MCP_LIMITED_TELEMETRY_EVENTS),\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 // Skip the sender (and its tsUtils consumer) entirely when telemetry is off\n const sender = isDisabled ? null : createSender(strapi);\n const sendEvent = sender ? wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS }) : null;\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled && sendEvent) {\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 || !sendEvent) 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","Object","values","MCP_LIMITED_TELEMETRY_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":";;;;;;AAaA,MAAMA,cAAAA,GAAiB;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA,2BAAA;AACGC,IAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACC,4BAAAA;AAClB,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAAA,GAAOD,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAAA,GAAoBJ,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAAA,IAAQK,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAAAA,CAASF,iBAAAA,CAAAA;;IAGvE,MAAMM,MAAAA,GAASL,UAAAA,GAAa,IAAA,GAAOM,YAAAA,CAAaX,MAAAA,CAAAA;IAChD,MAAMY,SAAAA,GAAYF,MAAAA,GAASG,iBAAAA,CAAkBH,MAAAA,EAAQ;QAAEI,aAAAA,EAAenB;KAAe,CAAA,GAAK,IAAA;IAE1F,OAAO;AACL,QAAA,IAAIU,UAAAA,CAAAA,GAAa;YACf,OAAOA,UAAAA;AACT,QAAA,CAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;YACE,IAAI,CAACV,cAAcO,SAAAA,EAAW;gBAC5BZ,MAAAA,CAAOgB,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAAA,EAAe;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAAA,CAAU,MAAA,CAAA;wBACtBQ,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,gBAAAA,CAAiB;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD,YAAA;AACF,QAAA,CAAA;QAEAwB,SAAAA,CAAAA,GAAAA,CAAa,CAAA;AAEb,QAAA,MAAMC,IAAAA,CAAAA,CAAKC,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;YAC7D,IAAItB,UAAAA,IAAc,CAACO,SAAAA,EAAW,OAAO,IAAA;AACrC,YAAA,OAAOA,UAAUc,KAAAA,EAAOC,OAAAA,CAAAA;AAC1B,QAAA,CAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA,QAAA;AACF,KAAA;AACF;;;;"}
@@ -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;AAgBtB;;GAEG;iCACqB,KAAK,MAAM,KAAG,MAAM;AAA5C,wBAkEE"}
1
+ {"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/sender.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAa1C,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,wBAkEE"}
@@ -5,10 +5,18 @@ var path = require('path');
5
5
  var _ = require('lodash');
6
6
  var isDocker = require('is-docker');
7
7
  var ciEnv = require('ci-info');
8
- var tsUtils = require('@strapi/typescript-utils');
9
8
  var strapiUtils = require('@strapi/utils');
10
9
  var adminUserHash = require('./admin-user-hash.js');
11
10
 
11
+ // Lazy: only resolved when telemetry is enabled and a sender is constructed
12
+ let lazyTsUtils;
13
+ const tsUtils = ()=>{
14
+ if (!lazyTsUtils) {
15
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
16
+ lazyTsUtils = require('@strapi/typescript-utils');
17
+ }
18
+ return lazyTsUtils;
19
+ };
12
20
  const defaultQueryOpts = {
13
21
  timeout: 1000,
14
22
  headers: {
@@ -40,8 +48,8 @@ const defaultQueryOpts = {
40
48
  docker: process.env.DOCKER || isDocker(),
41
49
  isCI: ciEnv.isCI,
42
50
  version: strapi.config.get('info.strapi'),
43
- useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),
44
- useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),
51
+ useTypescriptOnServer: tsUtils().isUsingTypeScriptSync(serverRootPath),
52
+ useTypescriptOnAdmin: tsUtils().isUsingTypeScriptSync(adminRootPath),
45
53
  projectId: uuid,
46
54
  isHostedOnStrapiCloud: strapiUtils.env('STRAPI_HOSTING', null) === 'strapi.cloud'
47
55
  };
@@ -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\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 eeGroupProps: Record<string, unknown> = {};\n if (strapi.ee?.subscriptionId !== undefined && strapi.ee?.subscriptionId !== null) {\n eeGroupProps.subscriptionId = strapi.ee.subscriptionId;\n }\n if (strapi.ee?.planPriceId !== undefined && strapi.ee?.planPriceId !== null) {\n eeGroupProps.planPriceId = strapi.ee.planPriceId;\n }\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 ...eeGroupProps,\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","event","payload","opts","userId","generateAdminUserHash","eeGroupProps","ee","subscriptionId","undefined","planPriceId","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","analyticsUrl","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 { env, generateInstallId } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { generateAdminUserHash } from './admin-user-hash';\n\n// Lazy: only resolved when telemetry is enabled and a sender is constructed\nlet lazyTsUtils: typeof import('@strapi/typescript-utils') | undefined;\nconst tsUtils = (): typeof import('@strapi/typescript-utils') => {\n if (!lazyTsUtils) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n lazyTsUtils = require('@strapi/typescript-utils');\n }\n return lazyTsUtils as typeof import('@strapi/typescript-utils');\n};\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 };\n\n addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);\n\n return async (event: string, payload: Payload = {}, opts = {}) => {\n const userId = generateAdminUserHash(strapi);\n\n const eeGroupProps: Record<string, unknown> = {};\n if (strapi.ee?.subscriptionId !== undefined && strapi.ee?.subscriptionId !== null) {\n eeGroupProps.subscriptionId = strapi.ee.subscriptionId;\n }\n if (strapi.ee?.planPriceId !== undefined && strapi.ee?.planPriceId !== null) {\n eeGroupProps.planPriceId = strapi.ee.planPriceId;\n }\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 ...eeGroupProps,\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":["lazyTsUtils","tsUtils","require","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","isUsingTypeScriptSync","useTypescriptOnAdmin","projectId","isHostedOnStrapiCloud","event","payload","opts","userId","generateAdminUserHash","eeGroupProps","ee","subscriptionId","undefined","planPriceId","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","analyticsUrl","res","fetch","ok","err"],"mappings":"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"}
@@ -3,10 +3,18 @@ import path from 'path';
3
3
  import _ from 'lodash';
4
4
  import isDocker from 'is-docker';
5
5
  import ciEnv from 'ci-info';
6
- import tsUtils from '@strapi/typescript-utils';
7
6
  import { generateInstallId, env } from '@strapi/utils';
8
7
  import { generateAdminUserHash } from './admin-user-hash.mjs';
9
8
 
9
+ // Lazy: only resolved when telemetry is enabled and a sender is constructed
10
+ let lazyTsUtils;
11
+ const tsUtils = ()=>{
12
+ if (!lazyTsUtils) {
13
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
14
+ lazyTsUtils = require('@strapi/typescript-utils');
15
+ }
16
+ return lazyTsUtils;
17
+ };
10
18
  const defaultQueryOpts = {
11
19
  timeout: 1000,
12
20
  headers: {
@@ -38,8 +46,8 @@ const defaultQueryOpts = {
38
46
  docker: process.env.DOCKER || isDocker(),
39
47
  isCI: ciEnv.isCI,
40
48
  version: strapi.config.get('info.strapi'),
41
- useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),
42
- useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),
49
+ useTypescriptOnServer: tsUtils().isUsingTypeScriptSync(serverRootPath),
50
+ useTypescriptOnAdmin: tsUtils().isUsingTypeScriptSync(adminRootPath),
43
51
  projectId: uuid,
44
52
  isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud'
45
53
  };
@@ -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\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 eeGroupProps: Record<string, unknown> = {};\n if (strapi.ee?.subscriptionId !== undefined && strapi.ee?.subscriptionId !== null) {\n eeGroupProps.subscriptionId = strapi.ee.subscriptionId;\n }\n if (strapi.ee?.planPriceId !== undefined && strapi.ee?.planPriceId !== null) {\n eeGroupProps.planPriceId = strapi.ee.planPriceId;\n }\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 ...eeGroupProps,\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","event","payload","opts","userId","generateAdminUserHash","eeGroupProps","ee","subscriptionId","undefined","planPriceId","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","analyticsUrl","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 { env, generateInstallId } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { generateAdminUserHash } from './admin-user-hash';\n\n// Lazy: only resolved when telemetry is enabled and a sender is constructed\nlet lazyTsUtils: typeof import('@strapi/typescript-utils') | undefined;\nconst tsUtils = (): typeof import('@strapi/typescript-utils') => {\n if (!lazyTsUtils) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n lazyTsUtils = require('@strapi/typescript-utils');\n }\n return lazyTsUtils as typeof import('@strapi/typescript-utils');\n};\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 };\n\n addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);\n\n return async (event: string, payload: Payload = {}, opts = {}) => {\n const userId = generateAdminUserHash(strapi);\n\n const eeGroupProps: Record<string, unknown> = {};\n if (strapi.ee?.subscriptionId !== undefined && strapi.ee?.subscriptionId !== null) {\n eeGroupProps.subscriptionId = strapi.ee.subscriptionId;\n }\n if (strapi.ee?.planPriceId !== undefined && strapi.ee?.planPriceId !== null) {\n eeGroupProps.planPriceId = strapi.ee.planPriceId;\n }\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 ...eeGroupProps,\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":["lazyTsUtils","tsUtils","require","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","isUsingTypeScriptSync","useTypescriptOnAdmin","projectId","isHostedOnStrapiCloud","event","payload","opts","userId","generateAdminUserHash","eeGroupProps","ee","subscriptionId","undefined","planPriceId","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","analyticsUrl","res","fetch","ok","err"],"mappings":";;;;;;;;AASA;AACA,IAAIA,WAAAA;AACJ,MAAMC,OAAAA,GAAU,IAAA;AACd,IAAA,IAAI,CAACD,WAAAA,EAAa;;AAEhBA,QAAAA,WAAAA,GAAcE,OAAAA,CAAQ,0BAAA,CAAA;AACxB,IAAA;IACA,OAAOF,WAAAA;AACT,CAAA;AAcA,MAAMG,gBAAAA,GAAmB;IACvBC,OAAAA,EAAS,IAAA;IACTC,OAAAA,EAAS;QAAE,cAAA,EAAgB;AAAmB;AAChD,CAAA;AAEA;;IAGA,MAAMC,4BAAAA,GAA+B,CAACC,QAAAA,EAAmCC,MAAAA,GAAAA;AACvE,IAAA,MAAM,EAAEC,iBAAAA,GAAoB,EAAE,EAAE,GAAGD,OAAOE,MAAM;IAEhDC,CAAAA,CAAEC,QAAQ,CAACL,QAAAA,EAAUE,iBAAAA,CAAAA;AACvB,CAAA;AAEA;;IAGA,mBAAe,CAAA,CAACD,MAAAA,GAAAA;IACd,MAAM,EAAEK,IAAI,EAAEC,SAAAA,EAAWC,wBAAwB,EAAE,GAAGP,OAAOE,MAAM;IAEnE,MAAMI,SAAAA,GAAYE,kBAAkBH,IAAAA,EAAME,wBAAAA,CAAAA;AAE1C,IAAA,MAAME,iBAAiBT,MAAAA,CAAOU,IAAI,CAACC,GAAG,CAACC,IAAI;IAC3C,MAAMC,aAAAA,GAAgBC,IAAAA,CAAKC,IAAI,CAACf,MAAAA,CAAOU,IAAI,CAACC,GAAG,CAACC,IAAI,EAAE,KAAA,EAAO,OAAA,CAAA;AAE7D,IAAA,MAAMI,uBAAAA,GAA0B;QAC9BC,WAAAA,EAAajB,MAAAA,CAAOE,MAAM,CAACe,WAAW;AACtCC,QAAAA,EAAAA,EAAIA,GAAGC,IAAI,EAAA;AACXC,QAAAA,UAAAA,EAAYF,GAAGG,QAAQ,EAAA;AACvBC,QAAAA,MAAAA,EAAQJ,GAAGK,IAAI,EAAA;AACfC,QAAAA,SAAAA,EAAWN,GAAGO,OAAO,EAAA;QACrBC,WAAAA,EAAaC,OAAAA,CAAQC,QAAQ,CAACC;AAChC,KAAA;AAEA,IAAA,MAAMC,wBAAAA,GAA2B;AAC/BC,QAAAA,MAAAA,EAAQJ,OAAAA,CAAQK,GAAG,CAACC,MAAM,IAAIC,QAAAA,EAAAA;AAC9BC,QAAAA,IAAAA,EAAMC,MAAMD,IAAI;AAChBE,QAAAA,OAAAA,EAASrC,MAAAA,CAAOE,MAAM,CAACoC,GAAG,CAAC,aAAA,CAAA;QAC3BC,qBAAAA,EAAuB9C,OAAAA,EAAAA,CAAU+C,qBAAqB,CAAC/B,cAAAA,CAAAA;QACvDgC,oBAAAA,EAAsBhD,OAAAA,EAAAA,CAAU+C,qBAAqB,CAAC3B,aAAAA,CAAAA;QACtD6B,SAAAA,EAAWrC,IAAAA;QACXsC,qBAAAA,EAAuBX,GAAAA,CAAI,kBAAkB,IAAA,CAAA,KAAU;AACzD,KAAA;AAEAlC,IAAAA,4BAAAA,CAA6BgC,wBAAAA,EAA0B9B,MAAAA,CAAAA;IAEvD,OAAO,OAAO4C,OAAeC,OAAAA,GAAmB,EAAE,EAAEC,IAAAA,GAAO,EAAE,GAAA;AAC3D,QAAA,MAAMC,SAASC,qBAAAA,CAAsBhD,MAAAA,CAAAA;AAErC,QAAA,MAAMiD,eAAwC,EAAC;QAC/C,IAAIjD,MAAAA,CAAOkD,EAAE,EAAEC,cAAAA,KAAmBC,aAAapD,MAAAA,CAAOkD,EAAE,EAAEC,cAAAA,KAAmB,IAAA,EAAM;AACjFF,YAAAA,YAAAA,CAAaE,cAAc,GAAGnD,MAAAA,CAAOkD,EAAE,CAACC,cAAc;AACxD,QAAA;QACA,IAAInD,MAAAA,CAAOkD,EAAE,EAAEG,WAAAA,KAAgBD,aAAapD,MAAAA,CAAOkD,EAAE,EAAEG,WAAAA,KAAgB,IAAA,EAAM;AAC3EJ,YAAAA,YAAAA,CAAaI,WAAW,GAAGrD,MAAAA,CAAOkD,EAAE,CAACG,WAAW;AAClD,QAAA;AAEA,QAAA,MAAMC,SAAAA,GAAY;YAChBC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAAC;AACnBd,gBAAAA,KAAAA;AACAG,gBAAAA,MAAAA;AACAzC,gBAAAA,SAAAA;AACAqD,gBAAAA,eAAAA,EAAiBd,QAAQc,eAAe;AACxCC,gBAAAA,cAAAA,EAAgBb,MAAAA,GAAS;AAAE,oBAAA,GAAG/B,uBAAuB;AAAE,oBAAA,GAAG6B,QAAQe;AAAe,iBAAA,GAAI,EAAC;gBACtFC,eAAAA,EAAiB;AACf,oBAAA,GAAG/B,wBAAwB;oBAC3BgC,WAAAA,EAAa9D,MAAAA,CAAO+D,EAAE,GAAG,YAAA,GAAe,WAAA;AACxC,oBAAA,GAAGd,YAAY;AACf,oBAAA,GAAGJ,QAAQgB;AACb;AACF,aAAA,CAAA;YACA,GAAG1D,CAAAA,CAAE6D,KAAK,CAAC;gBAAEnE,OAAAA,EAAS;oBAAE,gBAAA,EAAkB+C;AAAM;AAAE,aAAA,EAAGjD,kBAAkBmD,IAAAA;AACzE,SAAA;QAEA,IAAI;YACF,MAAMmB,YAAAA,GAAejC,IAAI,sBAAA,EAAwB,6BAAA,CAAA;YACjD,MAAMkC,GAAAA,GAAM,MAAMlE,MAAAA,CAAOmE,KAAK,CAAC,CAAA,EAAGF,YAAAA,CAAa,aAAa,CAAC,EAAEX,SAAAA,CAAAA;AAC/D,YAAA,OAAOY,IAAIE,EAAE;AACf,QAAA,CAAA,CAAE,OAAOC,GAAAA,EAAK;YACZ,OAAO,KAAA;AACT,QAAA;AACF,IAAA,CAAA;AACF,CAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/core",
3
- "version": "5.46.1",
3
+ "version": "5.47.1",
4
4
  "description": "Core of Strapi",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -56,17 +56,19 @@
56
56
  "test:unit:vitest:watch": "vitest --watch"
57
57
  },
58
58
  "dependencies": {
59
+ "@casl/ability": "6.7.5",
59
60
  "@koa/cors": "5.0.0",
60
61
  "@koa/router": "12.0.2",
62
+ "@modelcontextprotocol/sdk": "1.29.0",
61
63
  "@paralleldrive/cuid2": "2.2.2",
62
- "@strapi/admin": "5.46.1",
63
- "@strapi/database": "5.46.1",
64
- "@strapi/generators": "5.46.1",
65
- "@strapi/logger": "5.46.1",
66
- "@strapi/permissions": "5.46.1",
67
- "@strapi/types": "5.46.1",
68
- "@strapi/typescript-utils": "5.46.1",
69
- "@strapi/utils": "5.46.1",
64
+ "@strapi/admin": "5.47.1",
65
+ "@strapi/database": "5.47.1",
66
+ "@strapi/generators": "5.47.1",
67
+ "@strapi/logger": "5.47.1",
68
+ "@strapi/permissions": "5.47.1",
69
+ "@strapi/types": "5.47.1",
70
+ "@strapi/typescript-utils": "5.47.1",
71
+ "@strapi/utils": "5.47.1",
70
72
  "@vercel/stega": "0.1.2",
71
73
  "bcryptjs": "2.4.3",
72
74
  "boxen": "5.1.2",
@@ -94,7 +96,7 @@
94
96
  "koa-favicon": "2.1.0",
95
97
  "koa-helmet": "7.0.2",
96
98
  "koa-ip": "^2.1.3",
97
- "koa-session": "6.4.0",
99
+ "koa-session": "7.0.2",
98
100
  "koa-static": "5.0.0",
99
101
  "lodash": "4.18.1",
100
102
  "mime-types": "2.1.35",
@@ -103,7 +105,7 @@
103
105
  "ora": "5.4.1",
104
106
  "package-json": "7.0.0",
105
107
  "pkg-up": "3.1.0",
106
- "qs": "6.15.0",
108
+ "qs": "6.15.2",
107
109
  "resolve.exports": "2.0.2",
108
110
  "semver": "7.7.4",
109
111
  "statuses": "2.0.1",
@@ -125,7 +127,6 @@
125
127
  "@types/json-logic-js": "2.0.8",
126
128
  "@types/koa": "2.13.4",
127
129
  "@types/koa-compress": "4.0.3",
128
- "@types/koa-session": "6.4.1",
129
130
  "@types/koa-static": "4.0.2",
130
131
  "@types/koa__router": "12.0.0",
131
132
  "@types/lodash": "^4.14.191",
@@ -133,11 +134,11 @@
133
134
  "@types/node": "24.10.0",
134
135
  "@types/node-schedule": "2.1.7",
135
136
  "@types/statuses": "2.0.1",
136
- "eslint-config-custom": "5.46.1",
137
+ "eslint-config-custom": "5.47.1",
137
138
  "supertest": "7.2.2",
138
- "tsconfig": "5.46.1",
139
+ "tsconfig": "5.47.1",
139
140
  "vitest": "catalog:",
140
- "vitest-config": "5.46.1"
141
+ "vitest-config": "5.47.1"
141
142
  },
142
143
  "engines": {
143
144
  "node": ">=20.0.0 <=24.x.x",