dd-trace 6.12.0 → 6.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/LICENSE-3rdparty.csv +3 -1
  2. package/ci/init.js +8 -3
  3. package/ci/test-optimization-validation/ci-package-scripts.js +2 -2
  4. package/ci/test-optimization-validation/ci-remediation.js +6 -6
  5. package/ci/test-optimization-validation/command-blocker.js +7 -5
  6. package/ci/test-optimization-validation/framework-adapters/cucumber.js +1 -1
  7. package/ci/test-optimization-validation/framework-adapters/cypress.js +9 -11
  8. package/ci/test-optimization-validation/framework-adapters/vitest.js +3 -3
  9. package/ci/test-optimization-validation/package-check.js +1 -1
  10. package/ci/test-optimization-validation/report-writer.js +7 -5
  11. package/ci/test-optimization-validation/scenarios/ci-wiring.js +5 -4
  12. package/ci/vitest-no-worker-init-runner-setup.mjs +8 -0
  13. package/ci/vitest-no-worker-init-setup.mjs +13 -13
  14. package/ci/vitest-no-worker-init-v5-setup.mjs +4 -0
  15. package/index.d.ts +127 -26
  16. package/package.json +22 -19
  17. package/packages/datadog-esbuild/index.js +3 -1
  18. package/packages/datadog-instrumentations/src/bunyan.js +4 -2
  19. package/packages/datadog-instrumentations/src/cypress-config.js +19 -17
  20. package/packages/datadog-instrumentations/src/fs.js +24 -20
  21. package/packages/datadog-instrumentations/src/google-cloud-vertexai.js +2 -2
  22. package/packages/datadog-instrumentations/src/graphql.js +16 -16
  23. package/packages/datadog-instrumentations/src/helpers/bunyan.js +12 -3
  24. package/packages/datadog-instrumentations/src/helpers/graphql-jit-runtime.js +504 -0
  25. package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
  26. package/packages/datadog-instrumentations/src/helpers/pool-acquire.js +266 -0
  27. package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +1 -2
  28. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +95 -30
  29. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/ai.js +0 -25
  30. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/graphql-jit.js +83 -0
  31. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/graphql.js +85 -1
  32. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +1 -0
  33. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/mercurius.js +30 -12
  34. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/playwright.js +13 -0
  35. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +279 -0
  36. package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +12 -1
  37. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +562 -27
  38. package/packages/datadog-instrumentations/src/jest.js +165 -38
  39. package/packages/datadog-instrumentations/src/knex.js +76 -0
  40. package/packages/datadog-instrumentations/src/mariadb-bundle.js +1597 -0
  41. package/packages/datadog-instrumentations/src/mariadb.js +13 -0
  42. package/packages/datadog-instrumentations/src/mocha/common.js +59 -2
  43. package/packages/datadog-instrumentations/src/mocha/main.js +25 -15
  44. package/packages/datadog-instrumentations/src/mocha/utils.js +2 -1
  45. package/packages/datadog-instrumentations/src/mocha/webdriverio-protocol.js +98 -0
  46. package/packages/datadog-instrumentations/src/mocha/worker.js +12 -8
  47. package/packages/datadog-instrumentations/src/net.js +14 -17
  48. package/packages/datadog-instrumentations/src/next.js +212 -62
  49. package/packages/datadog-instrumentations/src/openai.js +42 -40
  50. package/packages/datadog-instrumentations/src/pg.js +15 -0
  51. package/packages/datadog-instrumentations/src/pino.js +15 -4
  52. package/packages/datadog-instrumentations/src/playwright.js +137 -27
  53. package/packages/datadog-instrumentations/src/rum-browser-scripts.js +40 -0
  54. package/packages/datadog-instrumentations/src/sequelize.js +94 -2
  55. package/packages/datadog-instrumentations/src/undici.js +53 -4
  56. package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +44 -7
  57. package/packages/datadog-instrumentations/src/vitest-main.js +92 -9
  58. package/packages/datadog-instrumentations/src/vitest-worker.js +82 -14
  59. package/packages/datadog-instrumentations/src/webdriverio.js +986 -1
  60. package/packages/datadog-instrumentations/src/winston.js +6 -3
  61. package/packages/datadog-plugin-amqp10/src/consumer.js +3 -1
  62. package/packages/datadog-plugin-amqp10/src/producer.js +3 -1
  63. package/packages/datadog-plugin-amqp10/src/util.js +2 -1
  64. package/packages/datadog-plugin-avsc/src/schema_iterator.js +6 -1
  65. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +16 -5
  66. package/packages/datadog-plugin-cassandra-driver/src/index.js +8 -3
  67. package/packages/datadog-plugin-cucumber/src/index.js +0 -2
  68. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +262 -48
  69. package/packages/datadog-plugin-cypress/src/support.js +1 -0
  70. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +4 -1
  71. package/packages/datadog-plugin-graphql/src/execute.js +998 -196
  72. package/packages/datadog-plugin-graphql/src/index.js +27 -7
  73. package/packages/datadog-plugin-graphql/src/jit.js +136 -0
  74. package/packages/datadog-plugin-graphql/src/request.js +18 -27
  75. package/packages/datadog-plugin-graphql/src/resolve-error.js +108 -0
  76. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -2
  77. package/packages/datadog-plugin-graphql/src/tools/transforms.js +45 -3
  78. package/packages/datadog-plugin-graphql/src/utils.js +208 -120
  79. package/packages/datadog-plugin-graphql/src/validate.js +10 -23
  80. package/packages/datadog-plugin-http/src/client.js +2 -15
  81. package/packages/datadog-plugin-http2/src/client.js +2 -15
  82. package/packages/datadog-plugin-jest/src/index.js +0 -6
  83. package/packages/datadog-plugin-langchain/src/tracing.js +7 -0
  84. package/packages/datadog-plugin-mocha/src/index.js +403 -75
  85. package/packages/datadog-plugin-mongodb-core/src/query.js +6 -0
  86. package/packages/datadog-plugin-mysql/src/index.js +41 -15
  87. package/packages/datadog-plugin-net/src/tcp.js +3 -1
  88. package/packages/datadog-plugin-next/src/index.js +63 -29
  89. package/packages/datadog-plugin-openai-agents/src/integration.js +15 -11
  90. package/packages/datadog-plugin-playwright/src/index.js +176 -28
  91. package/packages/datadog-plugin-undici/src/index.js +29 -56
  92. package/packages/datadog-plugin-vitest/src/index.js +6 -12
  93. package/packages/dd-trace/src/aiguard/evaluation.js +96 -21
  94. package/packages/dd-trace/src/aiguard/integrations/vercel-ai.js +2 -3
  95. package/packages/dd-trace/src/aiguard/messages/anthropic.js +29 -10
  96. package/packages/dd-trace/src/aiguard/messages/openai.js +8 -1
  97. package/packages/dd-trace/src/aiguard/messages/vercel-ai.js +20 -6
  98. package/packages/dd-trace/src/aiguard/noop.js +9 -1
  99. package/packages/dd-trace/src/aiguard/redaction.js +183 -0
  100. package/packages/dd-trace/src/aiguard/sdk.js +7 -2
  101. package/packages/dd-trace/src/aiguard/tags.js +2 -0
  102. package/packages/dd-trace/src/appsec/api_security/index.js +23 -6
  103. package/packages/dd-trace/src/appsec/api_security/sampler.js +99 -40
  104. package/packages/dd-trace/src/appsec/graphql.js +6 -2
  105. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +3 -3
  106. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -1
  107. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +8 -2
  108. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +11 -36
  109. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/url-sensitive-analyzer.js +1 -1
  110. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +10 -9
  111. package/packages/dd-trace/src/appsec/lambda.js +44 -26
  112. package/packages/dd-trace/src/appsec/rule_manager.js +2 -0
  113. package/packages/dd-trace/src/ci-visibility/encode/json-encoder.js +32 -2
  114. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +8 -8
  115. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +6 -4
  116. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +20 -4
  117. package/packages/dd-trace/src/ci-visibility/exporters/agentless/request-tracker.js +7 -150
  118. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +7 -6
  119. package/packages/dd-trace/src/ci-visibility/exporters/agents.js +54 -0
  120. package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/writer.js +1 -2
  121. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +397 -234
  122. package/packages/dd-trace/src/ci-visibility/exporters/limits.js +9 -0
  123. package/packages/dd-trace/src/ci-visibility/exporters/request.js +323 -31
  124. package/packages/dd-trace/src/ci-visibility/exporters/settings-cache-key.js +42 -0
  125. package/packages/dd-trace/src/ci-visibility/final-flush.js +21 -0
  126. package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +57 -18
  127. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +0 -3
  128. package/packages/dd-trace/src/ci-visibility/requests/upload-test-screenshot.js +164 -71
  129. package/packages/dd-trace/src/ci-visibility/requests/video-request.js +176 -0
  130. package/packages/dd-trace/src/ci-visibility/telemetry.js +10 -7
  131. package/packages/dd-trace/src/ci-visibility/test-video.js +61 -0
  132. package/packages/dd-trace/src/config/generated-config-types.d.ts +10 -0
  133. package/packages/dd-trace/src/config/index.js +75 -14
  134. package/packages/dd-trace/src/config/parsers.js +11 -1
  135. package/packages/dd-trace/src/config/stable.js +3 -3
  136. package/packages/dd-trace/src/config/supported-configurations.json +47 -2
  137. package/packages/dd-trace/src/crashtracking/crashtracker.js +82 -18
  138. package/packages/dd-trace/src/debugger/config.js +12 -1
  139. package/packages/dd-trace/src/debugger/constants.js +1 -0
  140. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +2 -1
  141. package/packages/dd-trace/src/debugger/devtools_client/request-options.js +33 -0
  142. package/packages/dd-trace/src/debugger/devtools_client/send.js +7 -39
  143. package/packages/dd-trace/src/debugger/devtools_client/status.js +11 -6
  144. package/packages/dd-trace/src/debugger/devtools_client/tags.js +41 -0
  145. package/packages/dd-trace/src/debugger/index.js +23 -3
  146. package/packages/dd-trace/src/dogstatsd.js +532 -71
  147. package/packages/dd-trace/src/encode/0.4-cross-payload.js +170 -0
  148. package/packages/dd-trace/src/encode/0.4.js +5 -5
  149. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +9 -8
  150. package/packages/dd-trace/src/evp_proxy/direct.js +27 -23
  151. package/packages/dd-trace/src/exporters/agent/index.js +24 -3
  152. package/packages/dd-trace/src/exporters/agent/writer.js +28 -11
  153. package/packages/dd-trace/src/exporters/agentless/index.js +7 -9
  154. package/packages/dd-trace/src/exporters/agentless/writer.js +100 -118
  155. package/packages/dd-trace/src/exporters/common/agents.js +28 -6
  156. package/packages/dd-trace/src/exporters/common/buffering-exporter.js +2 -2
  157. package/packages/dd-trace/src/exporters/common/final-flush-request-tracker.js +191 -0
  158. package/packages/dd-trace/src/exporters/common/request.js +31 -11
  159. package/packages/dd-trace/src/exporters/common/url.js +40 -1
  160. package/packages/dd-trace/src/exporters/common/writer.js +31 -7
  161. package/packages/dd-trace/src/exporters/span-stats/index.js +23 -4
  162. package/packages/dd-trace/src/external-logger/src/index.js +4 -3
  163. package/packages/dd-trace/src/flush.js +105 -0
  164. package/packages/dd-trace/src/id.js +14 -0
  165. package/packages/dd-trace/src/index.js +5 -2
  166. package/packages/dd-trace/src/llmobs/experiments/client.js +4 -0
  167. package/packages/dd-trace/src/llmobs/experiments/dataset.js +52 -2
  168. package/packages/dd-trace/src/llmobs/experiments/experiment.js +420 -105
  169. package/packages/dd-trace/src/llmobs/experiments/index.js +54 -42
  170. package/packages/dd-trace/src/llmobs/experiments/noop.js +39 -8
  171. package/packages/dd-trace/src/llmobs/experiments/result.js +1 -0
  172. package/packages/dd-trace/src/llmobs/experiments/util.js +21 -0
  173. package/packages/dd-trace/src/llmobs/index.js +111 -48
  174. package/packages/dd-trace/src/llmobs/noop.js +2 -1
  175. package/packages/dd-trace/src/llmobs/plugins/ai/ddTelemetry.js +22 -71
  176. package/packages/dd-trace/src/llmobs/plugins/ai/vercelTelemetry.js +23 -13
  177. package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +8 -4
  178. package/packages/dd-trace/src/llmobs/plugins/claude-agent-sdk/index.js +6 -3
  179. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +7 -0
  180. package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +13 -6
  181. package/packages/dd-trace/src/llmobs/plugins/openai-agents/utils.js +5 -7
  182. package/packages/dd-trace/src/llmobs/util.js +0 -33
  183. package/packages/dd-trace/src/llmobs/writers/base.js +106 -53
  184. package/packages/dd-trace/src/log/index.js +7 -1
  185. package/packages/dd-trace/src/log-submission/log-submission-plugin.js +249 -0
  186. package/packages/dd-trace/src/noop/span.js +5 -0
  187. package/packages/dd-trace/src/openfeature/writers/base.js +14 -12
  188. package/packages/dd-trace/src/openfeature/writers/exposures.js +8 -1
  189. package/packages/dd-trace/src/openfeature/writers/util.js +1 -1
  190. package/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +45 -3
  191. package/packages/dd-trace/src/opentelemetry/logs/index.js +9 -25
  192. package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +7 -4
  193. package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +14 -4
  194. package/packages/dd-trace/src/opentelemetry/metrics/index.js +18 -23
  195. package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +8 -0
  196. package/packages/dd-trace/src/opentelemetry/metrics/otlp_http_metric_exporter.js +18 -6
  197. package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_exporter.js +14 -2
  198. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +25 -5
  199. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +61 -25
  200. package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +19 -4
  201. package/packages/dd-trace/src/opentelemetry/resource-attributes.js +55 -0
  202. package/packages/dd-trace/src/opentelemetry/trace/index.js +6 -1
  203. package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +10 -0
  204. package/packages/dd-trace/src/opentelemetry/tracer.js +26 -2
  205. package/packages/dd-trace/src/opentracing/propagation/text_map.js +494 -351
  206. package/packages/dd-trace/src/opentracing/span.js +28 -0
  207. package/packages/dd-trace/src/otel-thread-ctx.js +23 -5
  208. package/packages/dd-trace/src/payload-tagging/index.js +2 -1
  209. package/packages/dd-trace/src/plugin_manager.js +2 -0
  210. package/packages/dd-trace/src/plugins/ci_plugin.js +1 -6
  211. package/packages/dd-trace/src/plugins/tracing.js +12 -10
  212. package/packages/dd-trace/src/plugins/util/ci.js +3 -1
  213. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +16 -15
  214. package/packages/dd-trace/src/plugins/util/status-validator.js +98 -0
  215. package/packages/dd-trace/src/plugins/util/test.js +157 -41
  216. package/packages/dd-trace/src/plugins/util/url.js +2 -2
  217. package/packages/dd-trace/src/plugins/util/web.js +6 -74
  218. package/packages/dd-trace/src/profiling/config.js +1 -0
  219. package/packages/dd-trace/src/profiling/oom.js +11 -5
  220. package/packages/dd-trace/src/profiling/profiler.js +30 -13
  221. package/packages/dd-trace/src/profiling/profilers/events.js +3 -3
  222. package/packages/dd-trace/src/profiling/profilers/space.js +38 -11
  223. package/packages/dd-trace/src/profiling/profilers/wall.js +14 -14
  224. package/packages/dd-trace/src/profiling/webspan-utils.js +7 -4
  225. package/packages/dd-trace/src/proxy.js +108 -10
  226. package/packages/dd-trace/src/remote_config/index.js +319 -101
  227. package/packages/dd-trace/src/remote_config/scheduler.js +37 -12
  228. package/packages/dd-trace/src/runtime_metrics/client.js +37 -8
  229. package/packages/dd-trace/src/runtime_metrics/index.js +5 -0
  230. package/packages/dd-trace/src/runtime_metrics/otlp_runtime_metrics.js +10 -1
  231. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +22 -7
  232. package/packages/dd-trace/src/sampling_rule.js +36 -9
  233. package/packages/dd-trace/src/serverless/telemetry-delivery-tracker.js +51 -0
  234. package/packages/dd-trace/src/serverless/vercel.js +155 -0
  235. package/packages/dd-trace/src/serverless.js +45 -21
  236. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  237. package/packages/dd-trace/src/span_stats.js +64 -31
  238. package/packages/dd-trace/src/startup-log.js +3 -2
  239. package/packages/dd-trace/src/telemetry/agentless-url.js +28 -0
  240. package/packages/dd-trace/src/telemetry/send-data.js +18 -16
  241. package/packages/dd-trace/src/telemetry/session-propagation.js +3 -2
  242. package/packages/dd-trace/src/tracer.js +26 -5
  243. package/packages/dd-trace/src/tracer_metadata.js +11 -3
  244. package/packages/dd-trace/src/web-tags-cache.js +67 -13
  245. package/vendor/dist/@datadog/openfeature-node-server/index.js +1 -1
  246. package/vendor/dist/@datadog/sketches-js/index.js +1 -1
  247. package/vendor/dist/protobufjs/index.js +1 -1
  248. package/vendor/dist/protobufjs/minimal/index.js +1 -1
  249. package/packages/datadog-instrumentations/src/playwright-browser-scripts.js +0 -27
  250. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +0 -53
  251. package/packages/dd-trace/src/encode/agentless-json.js +0 -209
@@ -68,6 +68,7 @@ const finishWrappedContexts = new WeakSet()
68
68
  const runFilesWrappedPrototypes = new WeakSet()
69
69
  const activeRunFilesContexts = new WeakSet()
70
70
  const runErrorsByContext = new WeakMap()
71
+ const typecheckPoolWorkerRequests = new WeakMap()
71
72
  let isFlakyTestRetriesEnabled = false
72
73
  let flakyTestRetriesCount = 0
73
74
  let isEarlyFlakeDetectionEnabled = false
@@ -148,6 +149,10 @@ function getTypecheckerExport (vitestPackage) {
148
149
  return findExportByName(vitestPackage, 'Typechecker')
149
150
  }
150
151
 
152
+ function getTypecheckPoolWorkerExport (vitestPackage) {
153
+ return findExportByName(vitestPackage, 'TypecheckPoolWorker')
154
+ }
155
+
151
156
  function getForksPoolWorkerExport (vitestPackage) {
152
157
  return findExportByName(vitestPackage, 'ForksPoolWorker')
153
158
  }
@@ -1207,7 +1212,6 @@ function getFinishWrapper (exitOrClose) {
1207
1212
  status: runError ? 'fail' : (areAllSuitesSkipped ? 'skip' : getSessionStatus(this.state)),
1208
1213
  testCodeCoverageLinesTotal,
1209
1214
  error,
1210
- isTestSessionFinalizationError: Boolean(runError),
1211
1215
  isEarlyFlakeDetectionEnabled,
1212
1216
  isEarlyFlakeDetectionFaulty,
1213
1217
  isTestManagementTestsEnabled,
@@ -1691,9 +1695,9 @@ async function reportTypecheckFile (file, sessionConfiguration, frameworkVersion
1691
1695
  })
1692
1696
  }
1693
1697
 
1694
- async function reportTypecheckResults (result, frameworkVersion, ctx, typechecker) {
1698
+ async function reportTypecheckResults (result, frameworkVersion, ctx, typechecker, files = result?.files) {
1695
1699
  if (!testSuiteFinishCh.hasSubscribers) return
1696
- if (!Array.isArray(result?.files)) return
1700
+ if (!Array.isArray(result?.files) || !Array.isArray(files)) return
1697
1701
 
1698
1702
  const setupState = ctx && mainProcessSetupStates.get(ctx)
1699
1703
  if (
@@ -1703,7 +1707,7 @@ async function reportTypecheckResults (result, frameworkVersion, ctx, typechecke
1703
1707
  await ensureMainProcessSetup(
1704
1708
  ctx,
1705
1709
  frameworkVersion,
1706
- result.files,
1710
+ files,
1707
1711
  false,
1708
1712
  !setupState || setupState.disableTestImpactAnalysis
1709
1713
  )
@@ -1713,7 +1717,7 @@ async function reportTypecheckResults (result, frameworkVersion, ctx, typechecke
1713
1717
  ? await getChannelPromise(testSessionConfigurationCh, { frameworkVersion }) || {}
1714
1718
  : {}
1715
1719
 
1716
- await Promise.all(result.files.map(file => reportTypecheckFile(
1720
+ await Promise.all(files.map(file => reportTypecheckFile(
1717
1721
  file,
1718
1722
  sessionConfiguration,
1719
1723
  frameworkVersion,
@@ -1742,6 +1746,51 @@ function getTypecheckerWrapper (vitestPackage, frameworkVersion) {
1742
1746
  return vitestPackage
1743
1747
  }
1744
1748
 
1749
+ function wrapTypecheckPoolWorker (TypecheckPoolWorker, frameworkVersion) {
1750
+ if (!TypecheckPoolWorker?.prototype?.send || !TypecheckPoolWorker.prototype.on) return
1751
+
1752
+ shimmer.wrap(TypecheckPoolWorker.prototype, 'send', send => function (message) {
1753
+ typecheckPoolWorkerRequests.set(this, {
1754
+ type: message?.type,
1755
+ filepaths: new Set(message?.context?.files?.map(file => file.filepath)),
1756
+ })
1757
+ return send.apply(this, arguments)
1758
+ })
1759
+ shimmer.wrap(TypecheckPoolWorker.prototype, 'on', on => function (event, callback) {
1760
+ if (event !== 'message') return on.apply(this, arguments)
1761
+
1762
+ const worker = this
1763
+ arguments[1] = shimmer.wrapFunction(callback, callback => function (message) {
1764
+ const typechecker = worker.project?.typechecker
1765
+ const request = typecheckPoolWorkerRequests.get(worker)
1766
+ if (
1767
+ message?.type !== 'testfileFinished' ||
1768
+ request?.type !== 'run' ||
1769
+ !typechecker
1770
+ ) {
1771
+ return callback.apply(this, arguments)
1772
+ }
1773
+
1774
+ const result = typechecker.getResult?.()
1775
+ const files = result?.files?.filter(file => request.filepaths.has(file.filepath))
1776
+ return reportTypecheckResults(
1777
+ result,
1778
+ frameworkVersion,
1779
+ worker.project?.vitest,
1780
+ typechecker,
1781
+ files
1782
+ ).then(
1783
+ () => callback.apply(this, arguments),
1784
+ (error) => {
1785
+ log.error('Could not report Vitest typecheck results: %s', error?.message)
1786
+ return callback.apply(this, arguments)
1787
+ }
1788
+ )
1789
+ })
1790
+ return on.apply(this, arguments)
1791
+ })
1792
+ }
1793
+
1745
1794
  function getCreateCliWrapper (vitestPackage, frameworkVersion) {
1746
1795
  const createCliExport = findExportByName(vitestPackage, 'createCLI')
1747
1796
  if (!createCliExport) {
@@ -1963,14 +2012,23 @@ function getStartVitestWrapper (cliApiPackage, frameworkVersion) {
1963
2012
  }
1964
2013
  const startVitestExport = findExportByName(cliApiPackage, 'startVitest')
1965
2014
  shimmer.wrap(cliApiPackage, startVitestExport.key, getCliOrStartVitestWrapper(frameworkVersion))
2015
+ const createVitestExport = findExportByName(cliApiPackage, 'createVitest')
2016
+ if (createVitestExport) {
2017
+ shimmer.wrap(cliApiPackage, createVitestExport.key, getCliOrStartVitestWrapper(frameworkVersion))
2018
+ }
1966
2019
  wrapMessagePortOn()
1967
2020
 
1968
- const vitest = getVitestExport(cliApiPackage)
2021
+ wrapVitestInternals(cliApiPackage, frameworkVersion)
2022
+ return cliApiPackage
2023
+ }
2024
+
2025
+ function wrapVitestInternals (vitestPackage, frameworkVersion) {
2026
+ const vitest = getVitestExport(vitestPackage)
1969
2027
  if (vitest) {
1970
2028
  wrapVitestRunFiles(vitest.value, frameworkVersion)
1971
2029
  }
1972
2030
 
1973
- const forksPoolWorker = getForksPoolWorkerExport(cliApiPackage)
2031
+ const forksPoolWorker = getForksPoolWorkerExport(vitestPackage)
1974
2032
  if (forksPoolWorker) {
1975
2033
  // function is async
1976
2034
  shimmer.wrap(forksPoolWorker.value.prototype, 'start', start => function (...args) {
@@ -1982,7 +2040,7 @@ function getStartVitestWrapper (cliApiPackage, frameworkVersion) {
1982
2040
  shimmer.wrap(forksPoolWorker.value.prototype, 'on', getWrappedOn)
1983
2041
  }
1984
2042
 
1985
- const threadsPoolWorker = getThreadsPoolWorkerExport(cliApiPackage)
2043
+ const threadsPoolWorker = getThreadsPoolWorkerExport(vitestPackage)
1986
2044
  if (threadsPoolWorker) {
1987
2045
  // function is async
1988
2046
  shimmer.wrap(threadsPoolWorker.value.prototype, 'start', start => function (...args) {
@@ -1992,7 +2050,6 @@ function getStartVitestWrapper (cliApiPackage, frameworkVersion) {
1992
2050
  })
1993
2051
  shimmer.wrap(threadsPoolWorker.value.prototype, 'on', getWrappedOn)
1994
2052
  }
1995
- return cliApiPackage
1996
2053
  }
1997
2054
 
1998
2055
  addHook({
@@ -2082,6 +2139,32 @@ addHook({
2082
2139
  return coveragePackage
2083
2140
  })
2084
2141
 
2142
+ // Vitest 5 moved the core and pool worker exports out of cli-api into an index chunk.
2143
+ addHook({
2144
+ name: 'vitest',
2145
+ versions: ['>=5.0.0'],
2146
+ filePattern: 'dist/chunks/index.*',
2147
+ }, (vitestPackage, frameworkVersion) => {
2148
+ if (!getVitestExport(vitestPackage)) return vitestPackage
2149
+
2150
+ wrapVitestInternals(vitestPackage, frameworkVersion)
2151
+
2152
+ const typecheckPoolWorker = getTypecheckPoolWorkerExport(vitestPackage)
2153
+ if (typecheckPoolWorker) {
2154
+ wrapTypecheckPoolWorker(typecheckPoolWorker.value, frameworkVersion)
2155
+ }
2156
+
2157
+ const baseSequencer = getBaseSequencerExport(vitestPackage)
2158
+ if (baseSequencer) {
2159
+ shimmer.wrap(
2160
+ baseSequencer.value.prototype,
2161
+ 'sort',
2162
+ sort => getSortWrapper(sort, frameworkVersion)
2163
+ )
2164
+ }
2165
+ return vitestPackage
2166
+ })
2167
+
2085
2168
  addHook({
2086
2169
  name: 'vitest',
2087
2170
  versions: ['>=3.0.0 <3.0.9'],
@@ -1,10 +1,12 @@
1
1
  'use strict'
2
2
 
3
+ const fs = require('node:fs')
3
4
  const path = require('node:path')
4
5
  const { performance } = require('node:perf_hooks')
5
6
  const { fileURLToPath } = require('node:url')
6
7
  const { isMainThread, parentPort } = require('node:worker_threads')
7
8
 
9
+ const { channel } = require('dc-polyfill')
8
10
  const shimmer = require('../../datadog-shimmer')
9
11
  const log = require('../../dd-trace/src/log')
10
12
  const { getEfdRetryCountForDuration } = require('../../dd-trace/src/ci-visibility/efd-retry-policy')
@@ -40,10 +42,12 @@ const {
40
42
  } = require('./vitest-util')
41
43
 
42
44
  const EFD_SUITE_ADMISSION_TIMEOUT_MS = 5000
45
+ const logSubmissionFlushCh = channel('ci:log-submission:flush')
43
46
  const taskToCtx = new WeakMap()
44
47
  const taskToTestProperties = new WeakMap()
45
48
  const taskToStatuses = new WeakMap()
46
49
  const taskToReportedErrorCount = new WeakMap()
50
+ const runnersWithLogSubmissionCleanup = new WeakSet()
47
51
  const attemptToFixTaskToStatuses = new WeakMap()
48
52
  const fileToHasConcurrentTests = new WeakMap()
49
53
  const fileToEfdSuiteAdmission = new WeakMap()
@@ -241,7 +245,17 @@ function wrapVitestCoverageRpc () {
241
245
  if (property !== 'onAfterSuiteRun' || typeof value !== 'function') return value
242
246
 
243
247
  return function (metadata) {
244
- vitestCoverageSnapshot = metadata?.coverage
248
+ const coverage = metadata?.coverage
249
+ if (typeof coverage === 'string') {
250
+ try {
251
+ vitestCoverageSnapshot = JSON.parse(fs.readFileSync(coverage, 'utf8'))
252
+ } catch (error) {
253
+ log.warn('Could not read Vitest V8 coverage: %s', error?.message)
254
+ vitestCoverageSnapshot = undefined
255
+ }
256
+ } else {
257
+ vitestCoverageSnapshot = coverage
258
+ }
245
259
  return value.apply(this, arguments)
246
260
  }
247
261
  },
@@ -888,22 +902,36 @@ function wrapVitestTestRunner (VitestTestRunner) {
888
902
  }
889
903
 
890
904
  function captureRunnerFunctions (pkg) {
891
- if (vitestGetFn) return
892
905
  const getFnExport = findExportByName(pkg, 'getFn')
893
906
  const setFnExport = findExportByName(pkg, 'setFn')
894
- if (getFnExport && setFnExport) {
907
+ if (!vitestGetFn && getFnExport) {
895
908
  vitestGetFn = getFnExport.value
909
+ }
910
+ if (!vitestSetFn && setFnExport) {
896
911
  vitestSetFn = setFnExport.value
897
912
  }
898
913
  const getHooksExport = findExportByName(pkg, 'getHooks')
899
- if (getHooksExport) {
914
+ if (!vitestGetHooks && getHooksExport) {
900
915
  vitestGetHooks = getHooksExport.value
901
916
  }
902
917
  }
903
918
 
919
+ function installTestScopedRunTask (VitestTestRunner) {
920
+ if (VitestTestRunner.prototype.runTask) return
921
+
922
+ VitestTestRunner.prototype.runTask = function (task) {
923
+ const fn = vitestGetFn?.(task)
924
+ if (!fn) {
925
+ throw new Error('Test function is not found. Did you add it using setFn?')
926
+ }
927
+ const testFn = wrapTestScopedFn(task, fn)
928
+ return testFn()
929
+ }
930
+ }
931
+
904
932
  addHook({
905
933
  name: 'vitest',
906
- versions: ['>=4.0.0'],
934
+ versions: ['>=4.0.0 <5.0.0'],
907
935
  filePattern: 'dist/chunks/test.*',
908
936
  }, (testPackage) => {
909
937
  const testRunner = getTestRunnerExport(testPackage)
@@ -917,6 +945,30 @@ addHook({
917
945
  return testPackage
918
946
  })
919
947
 
948
+ // Vitest 5 bundled the former @vitest/runner implementation into separate index and run chunks.
949
+ addHook({
950
+ name: 'vitest',
951
+ versions: ['>=5.0.0'],
952
+ filePattern: 'dist/chunks/index.*',
953
+ }, (testPackage) => {
954
+ const testRunner = getTestRunnerExport(testPackage)
955
+ if (testRunner) {
956
+ wrapVitestTestRunner(testRunner.value)
957
+ installTestScopedRunTask(testRunner.value)
958
+ }
959
+ return testPackage
960
+ })
961
+
962
+ addHook({
963
+ name: 'vitest',
964
+ versions: ['>=5.0.0'],
965
+ filePattern: 'dist/chunks/run.*',
966
+ }, (runnerPackage, frameworkVersion) => {
967
+ captureRunnerFunctions(runnerPackage)
968
+ wrapStartTests(runnerPackage, frameworkVersion)
969
+ return runnerPackage
970
+ })
971
+
920
972
  addHook({
921
973
  name: '@vitest/runner',
922
974
  versions: ['>=1.6.0'],
@@ -943,17 +995,20 @@ addHook({
943
995
  return vitestPackage
944
996
  })
945
997
 
946
- // test suite start and finish
947
- // only relevant for workers
948
- addHook({
949
- name: '@vitest/runner',
950
- versions: ['>=1.6.0'],
951
- }, (vitestPackage, frameworkVersion) => {
952
- shimmer.wrap(vitestPackage, 'startTests', startTests => async function (testPaths) {
998
+ function getStartTestsWrapper (frameworkVersion) {
999
+ return startTests => async function (testPaths) {
953
1000
  let testSuiteError = null
954
1001
  if (!testSuiteFinishCh.hasSubscribers) {
955
1002
  return startTests.apply(this, arguments)
956
1003
  }
1004
+ const runner = arguments[1]
1005
+ // Vitest 3+ exposes the only awaited worker-shutdown boundary; older versions keep timer/before-exit behavior.
1006
+ if (logSubmissionFlushCh.hasSubscribers &&
1007
+ typeof runner?.onCleanupWorkerContext === 'function' &&
1008
+ !runnersWithLogSubmissionCleanup.has(runner)) {
1009
+ runnersWithLogSubmissionCleanup.add(runner)
1010
+ runner.onCleanupWorkerContext(() => getChannelPromise(logSubmissionFlushCh))
1011
+ }
957
1012
  // From >=3.0.1, the first arguments changes from a string to an object containing the filepath
958
1013
  const testSuiteAbsolutePath = testPaths[0]?.filepath || testPaths[0]
959
1014
  const providedContext = getProvidedContext()
@@ -1155,7 +1210,20 @@ addHook({
1155
1210
  })
1156
1211
 
1157
1212
  return startTestsResponse
1158
- })
1213
+ }
1214
+ }
1159
1215
 
1216
+ function wrapStartTests (vitestPackage, frameworkVersion) {
1217
+ const startTests = findExportByName(vitestPackage, 'startTests')
1218
+ if (startTests) {
1219
+ shimmer.wrap(vitestPackage, startTests.key, getStartTestsWrapper(frameworkVersion))
1220
+ }
1160
1221
  return vitestPackage
1161
- })
1222
+ }
1223
+
1224
+ // test suite start and finish
1225
+ // only relevant for workers
1226
+ addHook({
1227
+ name: '@vitest/runner',
1228
+ versions: ['>=1.6.0'],
1229
+ }, wrapStartTests)