dd-trace 6.15.0 → 6.17.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 (378) hide show
  1. package/README.md +15 -0
  2. package/ci/diagnose.js +0 -23
  3. package/ci/test-optimization-validation/approval-artifacts.js +0 -3
  4. package/ci/test-optimization-validation/approval.js +0 -6
  5. package/ci/test-optimization-validation/artifact-id.js +0 -1
  6. package/ci/test-optimization-validation/bounded-json.js +0 -1
  7. package/ci/test-optimization-validation/cli.js +0 -12
  8. package/ci/test-optimization-validation/command-output-policy.js +0 -1
  9. package/ci/test-optimization-validation/command-runner.js +0 -3
  10. package/ci/test-optimization-validation/environment.js +0 -4
  11. package/ci/test-optimization-validation/executable-approval.js +0 -1
  12. package/ci/test-optimization-validation/executable.js +0 -5
  13. package/ci/test-optimization-validation/framework-adapters/cucumber.js +4 -8
  14. package/ci/test-optimization-validation/framework-adapters/cypress.js +0 -3
  15. package/ci/test-optimization-validation/framework-adapters/playwright.js +0 -6
  16. package/ci/test-optimization-validation/framework-adapters/vitest.js +0 -4
  17. package/ci/test-optimization-validation/generated-test-contract.js +0 -5
  18. package/ci/test-optimization-validation/generated-verifier.js +0 -1
  19. package/ci/test-optimization-validation/literal-environment.js +0 -1
  20. package/ci/test-optimization-validation/manifest-scaffold.js +0 -17
  21. package/ci/test-optimization-validation/manifest-schema.js +0 -21
  22. package/ci/test-optimization-validation/offline-fixtures.js +0 -4
  23. package/ci/test-optimization-validation/package-check.js +4 -1
  24. package/ci/test-optimization-validation/plan-writer.js +0 -11
  25. package/ci/test-optimization-validation/preflight-runner.js +0 -1
  26. package/ci/test-optimization-validation/redaction.js +0 -4
  27. package/ci/test-optimization-validation/report-writer.js +0 -16
  28. package/ci/test-optimization-validation/runner-command.js +0 -3
  29. package/ci/test-optimization-validation/runner-contract.js +0 -4
  30. package/ci/test-optimization-validation/safe-files.js +0 -1
  31. package/ci/test-optimization-validation/scenarios/basic-reporting.js +0 -1
  32. package/ci/test-optimization-validation/scenarios/ci-wiring.js +1 -2
  33. package/ci/test-optimization-validation/source-text.js +0 -3
  34. package/ci/vitest-no-worker-init-setup.mjs +41 -16
  35. package/index.d.ts +169 -0
  36. package/next.d.ts +27 -0
  37. package/next.js +3 -0
  38. package/package.json +28 -23
  39. package/packages/datadog-esbuild/index.js +14 -1
  40. package/packages/datadog-esbuild/src/resolver.js +284 -0
  41. package/packages/datadog-esbuild/src/utils.js +162 -120
  42. package/packages/datadog-instrumentations/src/aerospike.js +28 -6
  43. package/packages/datadog-instrumentations/src/ai.js +39 -97
  44. package/packages/datadog-instrumentations/src/anthropic.js +76 -134
  45. package/packages/datadog-instrumentations/src/aws-durable-execution-sdk-js.js +1 -3
  46. package/packages/datadog-instrumentations/src/aws-sdk.js +0 -2
  47. package/packages/datadog-instrumentations/src/azure-cosmos.js +1 -1
  48. package/packages/datadog-instrumentations/src/azure-durable-functions.js +23 -9
  49. package/packages/datadog-instrumentations/src/azure-functions.js +48 -0
  50. package/packages/datadog-instrumentations/src/bullmq.js +1 -1
  51. package/packages/datadog-instrumentations/src/claude-agent-sdk.js +1 -3
  52. package/packages/datadog-instrumentations/src/console.js +97 -0
  53. package/packages/datadog-instrumentations/src/cucumber.js +72 -12
  54. package/packages/datadog-instrumentations/src/cypress-config.js +0 -23
  55. package/packages/datadog-instrumentations/src/dd-trace-api.js +2 -2
  56. package/packages/datadog-instrumentations/src/graphql.js +1 -1
  57. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +39 -14
  58. package/packages/datadog-instrumentations/src/helpers/channel.js +0 -2
  59. package/packages/datadog-instrumentations/src/helpers/graphql-jit-runtime.js +0 -5
  60. package/packages/datadog-instrumentations/src/helpers/hooks.js +8 -0
  61. package/packages/datadog-instrumentations/src/helpers/instrument.js +25 -8
  62. package/packages/datadog-instrumentations/src/helpers/instrumentation-utils.js +69 -0
  63. package/packages/datadog-instrumentations/src/helpers/pool-acquire.js +0 -6
  64. package/packages/datadog-instrumentations/src/helpers/register.js +13 -64
  65. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +109 -29
  66. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentation-registry.js +39 -0
  67. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/azure-durable-functions.js +17 -0
  68. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +3 -16
  69. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/playwright.js +12 -0
  70. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/postgres.js +36 -0
  71. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/supabase.js +128 -0
  72. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +6 -7
  73. package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +17 -0
  74. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms/postgres.js +388 -0
  75. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +99 -75
  76. package/packages/datadog-instrumentations/src/helpers/router-helper.js +0 -1
  77. package/packages/datadog-instrumentations/src/jest.js +141 -51
  78. package/packages/datadog-instrumentations/src/knex.js +0 -1
  79. package/packages/datadog-instrumentations/src/langchain.js +1 -1
  80. package/packages/datadog-instrumentations/src/langgraph.js +1 -1
  81. package/packages/datadog-instrumentations/src/mariadb-bundle.js +0 -24
  82. package/packages/datadog-instrumentations/src/mariadb.js +0 -2
  83. package/packages/datadog-instrumentations/src/mercurius.js +1 -1
  84. package/packages/datadog-instrumentations/src/mocha/common.js +0 -1
  85. package/packages/datadog-instrumentations/src/mocha/main.js +22 -25
  86. package/packages/datadog-instrumentations/src/mocha/utils.js +119 -49
  87. package/packages/datadog-instrumentations/src/mocha/webdriverio-protocol.js +0 -6
  88. package/packages/datadog-instrumentations/src/mocha/worker.js +14 -17
  89. package/packages/datadog-instrumentations/src/modelcontextprotocol-sdk.js +1 -1
  90. package/packages/datadog-instrumentations/src/mysql2.js +0 -2
  91. package/packages/datadog-instrumentations/src/openai-agents.js +1 -1
  92. package/packages/datadog-instrumentations/src/openai-realtime/audio-accumulator.js +241 -0
  93. package/packages/datadog-instrumentations/src/openai-realtime/events.js +76 -0
  94. package/packages/datadog-instrumentations/src/openai-realtime/index.js +301 -0
  95. package/packages/datadog-instrumentations/src/openai-realtime/session.js +998 -0
  96. package/packages/datadog-instrumentations/src/openai-realtime/turns.js +211 -0
  97. package/packages/datadog-instrumentations/src/openai.js +97 -80
  98. package/packages/datadog-instrumentations/src/oracledb.js +9 -3
  99. package/packages/datadog-instrumentations/src/playwright-reporter.js +3 -16
  100. package/packages/datadog-instrumentations/src/playwright.js +238 -55
  101. package/packages/datadog-instrumentations/src/postgres.js +7 -0
  102. package/packages/datadog-instrumentations/src/router.js +0 -2
  103. package/packages/datadog-instrumentations/src/rum-browser-scripts.js +0 -2
  104. package/packages/datadog-instrumentations/src/sequelize.js +0 -1
  105. package/packages/datadog-instrumentations/src/supabase.js +15 -0
  106. package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +18 -18
  107. package/packages/datadog-instrumentations/src/vitest-main.js +37 -17
  108. package/packages/datadog-instrumentations/src/vitest-util.js +7 -1
  109. package/packages/datadog-instrumentations/src/vitest-worker.js +56 -23
  110. package/packages/datadog-instrumentations/src/webdriverio.js +23 -42
  111. package/packages/datadog-instrumentations/src/ws.js +0 -1
  112. package/packages/datadog-plugin-ai/src/utils.js +0 -2
  113. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/trace-checkpoint.js +0 -1
  114. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/util.js +0 -2
  115. package/packages/datadog-plugin-aws-sdk/src/base.js +0 -1
  116. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +7 -2
  117. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +0 -1
  118. package/packages/datadog-plugin-aws-sdk/src/util.js +0 -1
  119. package/packages/datadog-plugin-azure-cosmos/src/index.js +1 -1
  120. package/packages/datadog-plugin-azure-durable-functions/src/index.js +95 -1
  121. package/packages/datadog-plugin-cucumber/src/index.js +10 -0
  122. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +171 -75
  123. package/packages/datadog-plugin-cypress/src/finalization.js +0 -3
  124. package/packages/datadog-plugin-cypress/src/source-map-utils.js +0 -4
  125. package/packages/datadog-plugin-cypress/src/support.js +52 -7
  126. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +2 -24
  127. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +2 -36
  128. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-request-context.js +31 -0
  129. package/packages/datadog-plugin-graphql/src/resolve-error.js +32 -11
  130. package/packages/datadog-plugin-graphql/src/utils.js +0 -5
  131. package/packages/datadog-plugin-jest/src/index.js +13 -0
  132. package/packages/datadog-plugin-kafkajs/src/producer.js +0 -1
  133. package/packages/datadog-plugin-mocha/src/index.js +39 -11
  134. package/packages/datadog-plugin-mongodb-core/src/query.js +0 -1
  135. package/packages/datadog-plugin-openai/src/index.js +16 -1
  136. package/packages/datadog-plugin-openai/src/realtime.js +144 -0
  137. package/packages/datadog-plugin-openai-agents/src/integration.js +0 -4
  138. package/packages/datadog-plugin-openai-agents/src/util.js +0 -1
  139. package/packages/datadog-plugin-playwright/src/index.js +76 -9
  140. package/packages/datadog-plugin-postgres/src/index.js +167 -0
  141. package/packages/datadog-plugin-prisma/src/datadog-tracing-helper.js +0 -1
  142. package/packages/datadog-plugin-redis/src/index.js +15 -1
  143. package/packages/datadog-plugin-supabase/src/error.js +18 -0
  144. package/packages/datadog-plugin-supabase/src/index.js +21 -0
  145. package/packages/datadog-plugin-supabase/src/supabase-auth-js-gotrueclient-getuser.js +69 -0
  146. package/packages/datadog-plugin-supabase/src/supabase-functions-js-functionsclient-invoke.js +70 -0
  147. package/packages/datadog-plugin-supabase/src/supabase-postgrest-js-postgrestbuilder-then.js +122 -0
  148. package/packages/datadog-plugin-supabase/src/supabase-realtime-js-realtimechannel-send.js +66 -0
  149. package/packages/datadog-plugin-supabase/src/supabase-storage-js-handle-request.js +93 -0
  150. package/packages/datadog-plugin-supabase/src/url.js +17 -0
  151. package/packages/datadog-plugin-vitest/src/index.js +10 -0
  152. package/packages/datadog-plugin-ws/src/util.js +0 -4
  153. package/packages/datadog-turbopack/index.js +206 -0
  154. package/packages/datadog-turbopack/src/constants.js +5 -0
  155. package/packages/datadog-turbopack/src/loader.js +484 -0
  156. package/packages/datadog-webpack/src/loader.js +0 -1
  157. package/packages/dd-trace/src/aiguard/client.js +2 -3
  158. package/packages/dd-trace/src/aiguard/evaluation.js +6 -12
  159. package/packages/dd-trace/src/aiguard/index.js +3 -2
  160. package/packages/dd-trace/src/aiguard/integrations/anthropic.js +53 -25
  161. package/packages/dd-trace/src/aiguard/integrations/evaluate.js +49 -25
  162. package/packages/dd-trace/src/aiguard/integrations/index.js +4 -3
  163. package/packages/dd-trace/src/aiguard/integrations/openai.js +132 -29
  164. package/packages/dd-trace/src/aiguard/integrations/vercel-ai.js +116 -42
  165. package/packages/dd-trace/src/aiguard/messages/anthropic.js +0 -2
  166. package/packages/dd-trace/src/aiguard/messages/openai.js +64 -1
  167. package/packages/dd-trace/src/aiguard/messages/utils.js +29 -2
  168. package/packages/dd-trace/src/aiguard/messages/vercel-ai.js +25 -0
  169. package/packages/dd-trace/src/aiguard/redaction.js +0 -1
  170. package/packages/dd-trace/src/aiguard/sdk.js +1 -1
  171. package/packages/dd-trace/src/appsec/activation.js +1 -1
  172. package/packages/dd-trace/src/appsec/api_security/normalized-route.js +0 -5
  173. package/packages/dd-trace/src/appsec/api_security/sampler.js +0 -4
  174. package/packages/dd-trace/src/appsec/blocking/index.js +3 -3
  175. package/packages/dd-trace/src/appsec/downstream_requests.js +1 -4
  176. package/packages/dd-trace/src/appsec/iast/index.js +1 -1
  177. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +5 -5
  178. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -1
  179. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
  180. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +3 -3
  181. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +8 -10
  182. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/url-sensitive-analyzer.js +2 -2
  183. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +2 -2
  184. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +4 -1
  185. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +7 -7
  186. package/packages/dd-trace/src/appsec/index.js +2 -2
  187. package/packages/dd-trace/src/appsec/lambda.js +71 -2
  188. package/packages/dd-trace/src/appsec/rasp/utils.js +5 -1
  189. package/packages/dd-trace/src/appsec/remote_config.js +8 -6
  190. package/packages/dd-trace/src/appsec/reporter.js +10 -6
  191. package/packages/dd-trace/src/appsec/rule_manager.js +3 -3
  192. package/packages/dd-trace/src/appsec/sdk/track_event.js +0 -2
  193. package/packages/dd-trace/src/appsec/telemetry/api_security.js +1 -3
  194. package/packages/dd-trace/src/appsec/telemetry/common.js +4 -0
  195. package/packages/dd-trace/src/appsec/telemetry/index.js +23 -5
  196. package/packages/dd-trace/src/appsec/telemetry/rasp.js +1 -20
  197. package/packages/dd-trace/src/appsec/telemetry/user.js +1 -3
  198. package/packages/dd-trace/src/appsec/telemetry/waf.js +1 -20
  199. package/packages/dd-trace/src/appsec/waf/index.js +2 -2
  200. package/packages/dd-trace/src/appsec/waf/waf_manager.js +8 -5
  201. package/packages/dd-trace/src/carrier.js +0 -5
  202. package/packages/dd-trace/src/ci-visibility/dynamic-atr-retries.js +104 -0
  203. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +0 -2
  204. package/packages/dd-trace/src/ci-visibility/efd-retry-policy.js +34 -3
  205. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +0 -1
  206. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +0 -1
  207. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +0 -1
  208. package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/index.js +0 -4
  209. package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/msgpack-to-json.js +0 -1
  210. package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/sink.js +0 -2
  211. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +37 -15
  212. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +0 -3
  213. package/packages/dd-trace/src/ci-visibility/exporters/request.js +0 -11
  214. package/packages/dd-trace/src/ci-visibility/exporters/settings-cache-key.js +0 -1
  215. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +0 -1
  216. package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +0 -6
  217. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +2 -2
  218. package/packages/dd-trace/src/ci-visibility/requests/rate-limit.js +0 -1
  219. package/packages/dd-trace/src/ci-visibility/requests/upload-test-screenshot.js +0 -5
  220. package/packages/dd-trace/src/ci-visibility/requests/video-request.js +0 -1
  221. package/packages/dd-trace/src/ci-visibility/telemetry.js +13 -0
  222. package/packages/dd-trace/src/ci-visibility/test-optimization-cache.js +0 -1
  223. package/packages/dd-trace/src/ci-visibility/test-screenshot.js +0 -2
  224. package/packages/dd-trace/src/ci-visibility/test-video.js +0 -1
  225. package/packages/dd-trace/src/config/defaults.js +3 -2
  226. package/packages/dd-trace/src/config/generated-config-types.d.ts +74 -66
  227. package/packages/dd-trace/src/config/helper.js +9 -2
  228. package/packages/dd-trace/src/config/index.js +44 -29
  229. package/packages/dd-trace/src/config/parsers.js +34 -6
  230. package/packages/dd-trace/src/config/remote_config.js +25 -109
  231. package/packages/dd-trace/src/config/supported-configurations.json +146 -9
  232. package/packages/dd-trace/src/datastreams/encoding.js +0 -1
  233. package/packages/dd-trace/src/datastreams/pathway.js +0 -1
  234. package/packages/dd-trace/src/debugger/constants.js +10 -0
  235. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +76 -17
  236. package/packages/dd-trace/src/debugger/devtools_client/config.js +2 -0
  237. package/packages/dd-trace/src/debugger/devtools_client/guardrail-metrics.js +15 -0
  238. package/packages/dd-trace/src/debugger/devtools_client/index.js +103 -27
  239. package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +50 -7
  240. package/packages/dd-trace/src/debugger/devtools_client/log.js +3 -1
  241. package/packages/dd-trace/src/debugger/devtools_client/probe_sampler.js +34 -8
  242. package/packages/dd-trace/src/debugger/devtools_client/send.js +40 -14
  243. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +53 -13
  244. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +118 -71
  245. package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +0 -3
  246. package/packages/dd-trace/src/debugger/devtools_client/status.js +20 -6
  247. package/packages/dd-trace/src/debugger/guardrail-metrics.js +167 -0
  248. package/packages/dd-trace/src/debugger/index.js +50 -2
  249. package/packages/dd-trace/src/debugger/inspect-segment.js +0 -3
  250. package/packages/dd-trace/src/debugger/probe_sampler.js +133 -9
  251. package/packages/dd-trace/src/debugger/probe_sampler_constants.js +31 -1
  252. package/packages/dd-trace/src/dogstatsd.js +0 -23
  253. package/packages/dd-trace/src/encode/0.4-cross-payload.js +0 -3
  254. package/packages/dd-trace/src/encode/0.4.js +0 -7
  255. package/packages/dd-trace/src/encode/0.5.js +0 -2
  256. package/packages/dd-trace/src/encode/tags-processors.js +0 -1
  257. package/packages/dd-trace/src/evp_proxy/discovery.js +3 -5
  258. package/packages/dd-trace/src/evp_proxy/path.js +11 -4
  259. package/packages/dd-trace/src/exporters/agent/writer.js +0 -1
  260. package/packages/dd-trace/src/exporters/agentless/index.js +0 -1
  261. package/packages/dd-trace/src/exporters/agentless/intake.js +0 -1
  262. package/packages/dd-trace/src/exporters/agentless/writer.js +0 -3
  263. package/packages/dd-trace/src/exporters/common/docker.js +4 -1
  264. package/packages/dd-trace/src/exporters/common/final-flush-request-tracker.js +0 -6
  265. package/packages/dd-trace/src/exporters/common/proxy.js +3 -0
  266. package/packages/dd-trace/src/exporters/common/request.js +1 -0
  267. package/packages/dd-trace/src/exporters/common/url.js +0 -2
  268. package/packages/dd-trace/src/exporters/common/writer.js +0 -2
  269. package/packages/dd-trace/src/id.js +0 -11
  270. package/packages/dd-trace/src/llmobs/audio-codec.js +192 -0
  271. package/packages/dd-trace/src/llmobs/audio-utils.js +121 -0
  272. package/packages/dd-trace/src/llmobs/constants/audio.js +35 -0
  273. package/packages/dd-trace/src/llmobs/constants/prompts.js +14 -0
  274. package/packages/dd-trace/src/llmobs/constants/tags.js +17 -0
  275. package/packages/dd-trace/src/llmobs/eval-metric.js +0 -6
  276. package/packages/dd-trace/src/llmobs/experiments/dataset.js +0 -4
  277. package/packages/dd-trace/src/llmobs/experiments/experiment.js +0 -3
  278. package/packages/dd-trace/src/llmobs/experiments/index.js +7 -6
  279. package/packages/dd-trace/src/llmobs/experiments/util.js +1 -11
  280. package/packages/dd-trace/src/llmobs/index.js +1 -3
  281. package/packages/dd-trace/src/llmobs/noop.js +10 -0
  282. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +0 -4
  283. package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +0 -1
  284. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +0 -4
  285. package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/utils.js +0 -2
  286. package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +0 -2
  287. package/packages/dd-trace/src/llmobs/plugins/openai/index.js +4 -6
  288. package/packages/dd-trace/src/llmobs/plugins/openai/realtime.js +285 -0
  289. package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +16 -3
  290. package/packages/dd-trace/src/llmobs/prompts/cache.js +272 -0
  291. package/packages/dd-trace/src/llmobs/prompts/manager.js +639 -0
  292. package/packages/dd-trace/src/llmobs/prompts/noop.js +29 -0
  293. package/packages/dd-trace/src/llmobs/prompts/prompt.js +92 -0
  294. package/packages/dd-trace/src/llmobs/sdk.js +21 -6
  295. package/packages/dd-trace/src/llmobs/span_processor.js +81 -2
  296. package/packages/dd-trace/src/llmobs/tagger.js +30 -7
  297. package/packages/dd-trace/src/llmobs/telemetry.js +36 -4
  298. package/packages/dd-trace/src/llmobs/util.js +0 -34
  299. package/packages/dd-trace/src/llmobs/writers/base.js +0 -1
  300. package/packages/dd-trace/src/llmobs/writers/util.js +1 -2
  301. package/packages/dd-trace/src/log/channels.js +3 -0
  302. package/packages/dd-trace/src/log/index.js +23 -5
  303. package/packages/dd-trace/src/log-submission/log-submission-plugin.js +74 -6
  304. package/packages/dd-trace/src/msgpack/chunk.js +0 -1
  305. package/packages/dd-trace/src/openfeature/agentless_configuration_source.js +0 -12
  306. package/packages/dd-trace/src/openfeature/encoding.js +0 -2
  307. package/packages/dd-trace/src/openfeature/eval-metrics-hook.js +0 -1
  308. package/packages/dd-trace/src/openfeature/index.js +0 -4
  309. package/packages/dd-trace/src/openfeature/span-enrichment-hook.js +0 -1
  310. package/packages/dd-trace/src/openfeature/span-enrichment.js +0 -4
  311. package/packages/dd-trace/src/openfeature/writers/base.js +0 -6
  312. package/packages/dd-trace/src/openfeature/writers/exposures.js +0 -5
  313. package/packages/dd-trace/src/openfeature/writers/util.js +0 -4
  314. package/packages/dd-trace/src/opentelemetry/logs/logger.js +0 -1
  315. package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +0 -1
  316. package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +0 -1
  317. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +0 -2
  318. package/packages/dd-trace/src/opentelemetry/metrics/index.js +1 -1
  319. package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +4 -4
  320. package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_transformer.js +0 -1
  321. package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +0 -1
  322. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +103 -35
  323. package/packages/dd-trace/src/opentelemetry/metrics/time.js +0 -1
  324. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +36 -13
  325. package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +0 -1
  326. package/packages/dd-trace/src/opentelemetry/span-helpers.js +0 -1
  327. package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +0 -1
  328. package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +0 -3
  329. package/packages/dd-trace/src/opentracing/propagation/text_map.js +0 -6
  330. package/packages/dd-trace/src/opentracing/span_context.js +0 -1
  331. package/packages/dd-trace/src/otel-thread-ctx.js +38 -11
  332. package/packages/dd-trace/src/payload-tagging/tagging.js +15 -3
  333. package/packages/dd-trace/src/plugin_manager.js +9 -3
  334. package/packages/dd-trace/src/plugins/ci_plugin.js +0 -1
  335. package/packages/dd-trace/src/plugins/database.js +2 -6
  336. package/packages/dd-trace/src/plugins/index.js +8 -0
  337. package/packages/dd-trace/src/plugins/plugin.js +0 -4
  338. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  339. package/packages/dd-trace/src/plugins/util/git.js +1 -3
  340. package/packages/dd-trace/src/plugins/util/http-otel-semantics.js +0 -1
  341. package/packages/dd-trace/src/plugins/util/llm.js +0 -2
  342. package/packages/dd-trace/src/plugins/util/status-validator.js +0 -1
  343. package/packages/dd-trace/src/plugins/util/test.js +25 -21
  344. package/packages/dd-trace/src/plugins/util/url.js +0 -5
  345. package/packages/dd-trace/src/priority_sampler.js +0 -6
  346. package/packages/dd-trace/src/process-tags/index.js +0 -1
  347. package/packages/dd-trace/src/profiler.js +132 -35
  348. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +0 -1
  349. package/packages/dd-trace/src/profiling/profiler.js +101 -41
  350. package/packages/dd-trace/src/profiling/ssi-heuristics.js +29 -15
  351. package/packages/dd-trace/src/propagation-hash/index.js +0 -1
  352. package/packages/dd-trace/src/proxy.js +21 -45
  353. package/packages/dd-trace/src/random_sampler.js +0 -4
  354. package/packages/dd-trace/src/rate_limiter.js +0 -4
  355. package/packages/dd-trace/src/remote_config/capabilities.js +1 -9
  356. package/packages/dd-trace/src/remote_config/index.js +0 -1
  357. package/packages/dd-trace/src/runtime_metrics/otlp_runtime_metrics.js +0 -3
  358. package/packages/dd-trace/src/sampler.js +0 -4
  359. package/packages/dd-trace/src/sampling_rule.js +0 -7
  360. package/packages/dd-trace/src/serverless/vercel.js +0 -1
  361. package/packages/dd-trace/src/serverless.js +0 -1
  362. package/packages/dd-trace/src/service-naming/index.js +0 -1
  363. package/packages/dd-trace/src/service-naming/schemas/util.js +0 -1
  364. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +7 -0
  365. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +5 -0
  366. package/packages/dd-trace/src/span_processor.js +2 -2
  367. package/packages/dd-trace/src/span_sampler.js +0 -1
  368. package/packages/dd-trace/src/standalone/product.js +2 -2
  369. package/packages/dd-trace/src/standalone/tracesource.js +0 -1
  370. package/packages/dd-trace/src/startup-log.js +1 -1
  371. package/packages/dd-trace/src/telemetry/endpoints.js +0 -8
  372. package/packages/dd-trace/src/telemetry/logs/index.js +16 -5
  373. package/packages/dd-trace/src/telemetry/logs/log-collector.js +16 -6
  374. package/packages/dd-trace/src/telemetry/metrics.js +0 -2
  375. package/packages/dd-trace/src/telemetry/telemetry.js +4 -1
  376. package/packages/dd-trace/src/util.js +13 -1
  377. package/vendor/dist/@datadog/openfeature-node-server/index.js +1 -1
  378. package/packages/dd-trace/src/llmobs/plugins/claude-agent-sdk/utils.js +0 -10
@@ -0,0 +1,206 @@
1
+ 'use strict'
2
+
3
+ const fs = require('node:fs')
4
+ const Module = require('node:module')
5
+ const path = require('node:path')
6
+
7
+ const satisfies = require('../../vendor/dist/semifies')
8
+ const hooks = require('../datadog-instrumentations/src/helpers/hooks')
9
+ const { SYNTHETIC_EXTENSION } = require('./src/constants')
10
+
11
+ const BUILTIN_MODULES = new Set(Module.builtinModules)
12
+ const loader = path.join(__dirname, 'src/loader.js')
13
+ const EXTENSIONLESS_PATH_PATTERN = /(?:^|\/)[^/.]+$/
14
+ const PHASE_PRODUCTION_SERVER = 'phase-production-server'
15
+ const SOURCE_EXTENSIONS = ['*.js', '*.cjs', '*.mjs', '*.jsx', '*.ts', '*.cts', '*.mts', '*.tsx']
16
+ const SOURCE_PATH_PATTERN = /\.(?:cjs|cts|js|jsx|mjs|mts|ts|tsx)$/
17
+ const PACKAGE_PATH_PATTERN = createPackagePathPattern()
18
+
19
+ /**
20
+ * Adds Datadog instrumentation to a Next.js Turbopack configuration.
21
+ *
22
+ * @param {object|Promise<object>|Function} [nextConfig]
23
+ * @returns {Function}
24
+ */
25
+ function withDatadogTurbopack (nextConfig = {}) {
26
+ const nextMajor = getNextMajor()
27
+
28
+ return function datadogNextConfig (...args) {
29
+ const config = typeof nextConfig === 'function'
30
+ ? nextConfig.apply(this, args)
31
+ : nextConfig
32
+ if (config && typeof config.then === 'function') {
33
+ return config.then(config => configureTurbopack(config, args[0], nextMajor))
34
+ }
35
+ return configureTurbopack(config, args[0], nextMajor)
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param {object|undefined} config
41
+ * @param {unknown} phase
42
+ * @param {number} nextMajor
43
+ * @returns {object}
44
+ */
45
+ function configureTurbopack (config, phase, nextMajor) {
46
+ const normalized = normalizeConfig(config)
47
+ if (phase === PHASE_PRODUCTION_SERVER || hasDatadogLoader(normalized.turbopack?.rules)) return normalized
48
+
49
+ const turbopack = normalized.turbopack ?? {}
50
+ const configured = nextMajor === 15 ? addLegacyRule(turbopack) : addModernRules(turbopack)
51
+ return { ...normalized, turbopack: configured }
52
+ }
53
+
54
+ /**
55
+ * @param {object|undefined} config
56
+ * @returns {object}
57
+ */
58
+ function normalizeConfig (config) {
59
+ if (config === undefined) return {}
60
+ if (!isObject(config)) {
61
+ throw new TypeError('withDatadogTurbopack expects a Next.js configuration object, promise, or function')
62
+ }
63
+ if (config.turbopack !== undefined && !isObject(config.turbopack)) {
64
+ throw new TypeError('nextConfig.turbopack must be an object')
65
+ }
66
+ if (config.turbopack?.rules !== undefined && !isObject(config.turbopack.rules)) {
67
+ throw new TypeError('nextConfig.turbopack.rules must be an object')
68
+ }
69
+ if (config.turbopack?.conditions !== undefined && !isObject(config.turbopack.conditions)) {
70
+ throw new TypeError('nextConfig.turbopack.conditions must be an object')
71
+ }
72
+ return config
73
+ }
74
+
75
+ /**
76
+ * @param {unknown} value
77
+ */
78
+ function isObject (value) {
79
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value)
80
+ }
81
+
82
+ /**
83
+ * @param {object} turbopack
84
+ * @returns {object}
85
+ */
86
+ function addModernRules (turbopack) {
87
+ const rules = { ...turbopack.rules }
88
+ for (const extension of SOURCE_EXTENSIONS) {
89
+ appendRule(rules, extension, {
90
+ condition: { all: ['node', 'foreign', { path: PACKAGE_PATH_PATTERN }] },
91
+ loaders: [createLoader()],
92
+ })
93
+ }
94
+ appendRule(rules, '*', {
95
+ as: `*${SYNTHETIC_EXTENSION}`,
96
+ condition: {
97
+ all: ['node', 'foreign', { path: PACKAGE_PATH_PATTERN }, { path: EXTENSIONLESS_PATH_PATTERN }],
98
+ },
99
+ loaders: [createLoader()],
100
+ })
101
+ return { ...turbopack, rules }
102
+ }
103
+
104
+ /**
105
+ * @param {Record<string, object|object[]>} rules
106
+ * @param {string} extension
107
+ * @param {object} rule
108
+ */
109
+ function appendRule (rules, extension, rule) {
110
+ const existing = rules[extension]
111
+ if (existing === undefined) {
112
+ rules[extension] = rule
113
+ } else {
114
+ rules[extension] = Array.isArray(existing) ? [...existing, rule] : [existing, rule]
115
+ }
116
+ }
117
+
118
+ /**
119
+ * @param {object} turbopack
120
+ * @returns {object}
121
+ */
122
+ function addLegacyRule (turbopack) {
123
+ const name = '#dd-trace/modules'
124
+ const conditions = { ...turbopack.conditions }
125
+ const rules = { ...turbopack.rules }
126
+ if (Object.hasOwn(conditions, name) || Object.hasOwn(rules, name)) {
127
+ throw new Error(`Next.js Turbopack configuration already uses the reserved condition ${name}`)
128
+ }
129
+ conditions[name] = {
130
+ all: [
131
+ { path: PACKAGE_PATH_PATTERN },
132
+ { any: [{ path: SOURCE_PATH_PATTERN }, { path: EXTENSIONLESS_PATH_PATTERN }] },
133
+ ],
134
+ }
135
+ rules[name] = { node: { foreign: { loaders: [createLoader()] } } }
136
+ return { ...turbopack, conditions, rules }
137
+ }
138
+
139
+ /**
140
+ * @returns {{ loader: string, options: object }}
141
+ */
142
+ function createLoader () {
143
+ return { loader, options: {} }
144
+ }
145
+
146
+ /**
147
+ * @param {unknown} value
148
+ */
149
+ function hasDatadogLoader (value) {
150
+ if (Array.isArray(value)) return value.some(hasDatadogLoader)
151
+ if (!value || typeof value !== 'object') return false
152
+ if (/** @type {{ loader?: unknown }} */ (value).loader === loader) return true
153
+ return Object.values(value).some(hasDatadogLoader)
154
+ }
155
+
156
+ /**
157
+ * @returns {RegExp}
158
+ */
159
+ function createPackagePathPattern () {
160
+ const names = []
161
+ for (const name of Object.keys(hooks)) {
162
+ if (!name.startsWith('.') && !BUILTIN_MODULES.has(name)) names.push(escapeRegExp(name))
163
+ }
164
+ names.sort()
165
+ return new RegExp(`(?:^|/)(?:${names.join('|')})(?:/|$)`)
166
+ }
167
+
168
+ /**
169
+ * @param {string} value
170
+ */
171
+ function escapeRegExp (value) {
172
+ return value.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)
173
+ }
174
+
175
+ function getNextMajor () {
176
+ const entrypoints = []
177
+ if (require.main?.filename) entrypoints.push(require.main.filename)
178
+ entrypoints.push(path.join(process.cwd(), 'package.json'))
179
+
180
+ let version
181
+ let resolutionError
182
+ for (const entrypoint of entrypoints) {
183
+ try {
184
+ const appRequire = Module.createRequire(entrypoint)
185
+ version = JSON.parse(fs.readFileSync(appRequire.resolve('next/package.json'), 'utf8')).version
186
+ break
187
+ } catch (error) {
188
+ resolutionError = error
189
+ }
190
+ }
191
+ if (!version) {
192
+ throw new Error('withDatadogTurbopack could not resolve the active Next.js installation', {
193
+ cause: resolutionError,
194
+ })
195
+ }
196
+
197
+ if (!satisfies(version, '>=0')) {
198
+ throw new Error(`withDatadogTurbopack could not parse Next.js version ${version}`)
199
+ }
200
+ if (!satisfies(version, '>=15.5.0')) {
201
+ throw new RangeError(`withDatadogTurbopack requires Next.js 15.5 or newer; found ${version}`)
202
+ }
203
+ return Number.parseInt(version, 10)
204
+ }
205
+
206
+ module.exports = { withDatadogTurbopack }
@@ -0,0 +1,5 @@
1
+ 'use strict'
2
+
3
+ const SYNTHETIC_EXTENSION = '.__dd_trace_turbopack.js'
4
+
5
+ module.exports = { SYNTHETIC_EXTENSION }
@@ -0,0 +1,484 @@
1
+ 'use strict'
2
+
3
+ const fs = require('node:fs')
4
+ const Module = require('node:module')
5
+ const path = require('node:path')
6
+
7
+ const extractPackageAndModulePath = require(
8
+ '../../datadog-instrumentations/src/helpers/extract-package-and-module-path'
9
+ )
10
+ const hooks = require('../../datadog-instrumentations/src/helpers/hooks')
11
+ const instrumentations = require('../../datadog-instrumentations/src/helpers/instrumentations')
12
+ const { filename, matchesInstrumentation } = require('../../datadog-instrumentations/src/helpers/instrumentation-utils')
13
+ const { createBundlerRewriter } = require('../../datadog-instrumentations/src/helpers/rewriter')
14
+ const { getRewriteTarget } = require('../../datadog-instrumentations/src/helpers/rewriter/targets')
15
+ const { isESMFile } = require('../../datadog-esbuild/src/utils')
16
+ const { SYNTHETIC_EXTENSION } = require('./constants')
17
+
18
+ const CHANNEL = 'dd-trace:bundler:load'
19
+ const ARGUMENTS_BINDING = 1
20
+ const MODULE_BINDING = 2
21
+ const REQUIRE_BINDING = 4
22
+ const COMMONJS_BINDINGS = MODULE_BINDING | REQUIRE_BINDING
23
+ const targetPackages = new Set(Object.keys(hooks))
24
+ const entrypoints = new Map()
25
+ const loadedHooks = new Set()
26
+ const packageCache = new Map()
27
+ const rewriters = new Map()
28
+
29
+ /**
30
+ * @typedef {object} LoaderContext
31
+ * @property {(error: Error|undefined, code?: string, sourceMap?: string|object) => void} callback
32
+ * @property {(warning: Error) => void} [emitWarning]
33
+ * @property {string} resourcePath
34
+ */
35
+
36
+ /**
37
+ * @typedef {object} PackageInfo
38
+ * @property {string} [entrypoint]
39
+ * @property {boolean} esm
40
+ * @property {string} moduleName
41
+ * @property {string} name
42
+ * @property {string} packageJsonPath
43
+ * @property {string} version
44
+ */
45
+
46
+ /**
47
+ * Instruments a resolved foreign Node.js module.
48
+ *
49
+ * @this {LoaderContext}
50
+ * @param {string} source
51
+ * @param {string|object} [inputSourceMap]
52
+ */
53
+ module.exports = function loader (source, inputSourceMap) {
54
+ try {
55
+ const nativeResourcePath = fs.realpathSync(getResourcePath(this))
56
+ const resourcePath = nativeResourcePath.replaceAll('\\', '/')
57
+ const extracted = extractPackageAndModulePath(resourcePath)
58
+ if (!extracted.pkg || !targetPackages.has(extracted.pkg)) {
59
+ this.callback(undefined, source, inputSourceMap)
60
+ return
61
+ }
62
+
63
+ const rewriteTarget = getRewriteTarget(resourcePath)
64
+ const packageInfo = getPackageInfo(
65
+ nativeResourcePath,
66
+ extracted.pkg,
67
+ /** @type {string} */ (extracted.path),
68
+ path.normalize(/** @type {string} */ (extracted.pkgJson))
69
+ )
70
+ const esm = packageInfo.esm
71
+ const publications = esm ? [] : getPublications(resourcePath, packageInfo)
72
+ if (!rewriteTarget && publications.length === 0) {
73
+ this.callback(undefined, source, inputSourceMap)
74
+ return
75
+ }
76
+ if (publications.length > 0 && hasUnsafeCommonJsBindings(source)) {
77
+ this.emitWarning?.(new Error(`Skipped CommonJS publication for unsafe wrapper bindings in ${resourcePath}`))
78
+ this.callback(undefined, source, inputSourceMap)
79
+ return
80
+ }
81
+
82
+ const dcModule = relativeImport(path.dirname(nativeResourcePath), require.resolve('dc-polyfill'))
83
+ let code = source
84
+ let sourceMap = inputSourceMap
85
+ let rewritten = false
86
+ if (rewriteTarget) {
87
+ const rewrite = getRewriter(dcModule)
88
+ const result = rewrite(
89
+ source,
90
+ resourcePath,
91
+ esm ? 'module' : 'commonjs',
92
+ rewriteTarget,
93
+ inputSourceMap
94
+ )
95
+ code = /** @type {string} */ (result.code)
96
+ sourceMap = result.map
97
+ rewritten = code !== source
98
+ }
99
+
100
+ if (publications.length > 0) code = appendCommonJsPublications(code, publications, dcModule)
101
+ if (rewritten && publications.length === 0) {
102
+ if (!esm && hasUnsafeCommonJsBindings(code)) {
103
+ this.emitWarning?.(new Error(`Skipped CommonJS activation for unsafe wrapper bindings in ${resourcePath}`))
104
+ this.callback(undefined, source, inputSourceMap)
105
+ return
106
+ }
107
+ code = appendActivation(code, {
108
+ package: rewriteTarget.moduleName,
109
+ path: filename(rewriteTarget.moduleName, rewriteTarget.filePath),
110
+ version: packageInfo.version,
111
+ }, dcModule, esm)
112
+ }
113
+ this.callback(undefined, code, sourceMap)
114
+ } catch (error) {
115
+ const warning = error instanceof Error ? error : new Error(String(error))
116
+ this.emitWarning?.(warning)
117
+ this.callback(undefined, source, inputSourceMap)
118
+ }
119
+ }
120
+
121
+ /**
122
+ * @param {LoaderContext} context
123
+ */
124
+ function getResourcePath (context) {
125
+ const { resourcePath } = context
126
+ if (!resourcePath.endsWith(SYNTHETIC_EXTENSION) || fs.existsSync(resourcePath)) return resourcePath
127
+
128
+ const extensionlessPath = resourcePath.slice(0, -SYNTHETIC_EXTENSION.length)
129
+ return fs.existsSync(extensionlessPath) ? extensionlessPath : resourcePath
130
+ }
131
+
132
+ /**
133
+ * @param {string} nativeResourcePath
134
+ * @param {string} name
135
+ * @param {string} modulePath
136
+ * @param {string} packageJsonPath
137
+ * @returns {PackageInfo}
138
+ */
139
+ function getPackageInfo (nativeResourcePath, name, modulePath, packageJsonPath) {
140
+ let cached = packageCache.get(packageJsonPath)
141
+ if (!cached) {
142
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
143
+ cached = { packageJson, version: packageJson.version }
144
+ packageCache.set(packageJsonPath, cached)
145
+ }
146
+
147
+ return {
148
+ esm: isESMFile(nativeResourcePath, packageJsonPath, cached.packageJson),
149
+ moduleName: filename(name, modulePath),
150
+ name,
151
+ packageJsonPath,
152
+ version: cached.version,
153
+ }
154
+ }
155
+
156
+ /**
157
+ * @param {string} resourcePath
158
+ * @param {PackageInfo} packageInfo
159
+ * @returns {Array<{ package: string, path: string, version: string }>}
160
+ */
161
+ function getPublications (resourcePath, packageInfo) {
162
+ loadPackageHook(packageInfo.name)
163
+ const entries = instrumentations[packageInfo.name]
164
+ if (!entries) return []
165
+
166
+ const publications = []
167
+ const paths = new Set()
168
+ for (const entry of entries) {
169
+ if (!entry.file && !entry.filePattern) {
170
+ packageInfo.entrypoint ??= getCommonJsEntrypoint(packageInfo.name, packageInfo.packageJsonPath)
171
+ }
172
+ const moduleName = entry.file || entry.filePattern
173
+ ? packageInfo.moduleName
174
+ : resourcePath === packageInfo.entrypoint ? packageInfo.name : undefined
175
+ if (!moduleName || paths.has(moduleName) ||
176
+ !matchesInstrumentation(packageInfo.name, packageInfo.version, moduleName, entry)) continue
177
+
178
+ paths.add(moduleName)
179
+ publications.push({ package: packageInfo.name, path: moduleName, version: packageInfo.version })
180
+ }
181
+ return publications
182
+ }
183
+
184
+ /**
185
+ * @param {string} name
186
+ * @param {string} packageJsonPath
187
+ */
188
+ function getCommonJsEntrypoint (name, packageJsonPath) {
189
+ const cached = entrypoints.get(packageJsonPath)
190
+ if (cached) return cached
191
+
192
+ const packageRequire = Module.createRequire(packageJsonPath)
193
+ let entrypoint
194
+ try {
195
+ entrypoint = packageRequire.resolve(name)
196
+ } catch {
197
+ entrypoint = packageRequire.resolve(path.dirname(packageJsonPath))
198
+ }
199
+ const resolved = fs.realpathSync(entrypoint).replaceAll('\\', '/')
200
+ entrypoints.set(packageJsonPath, resolved)
201
+ return resolved
202
+ }
203
+
204
+ /**
205
+ * @param {string} name
206
+ */
207
+ function loadPackageHook (name) {
208
+ if (loadedHooks.has(name)) return
209
+ const hook = hooks[name]
210
+ const load = hook?.fn ?? hook
211
+ if (typeof load === 'function') load()
212
+ loadedHooks.add(name)
213
+ }
214
+
215
+ /**
216
+ * @param {string} dcModule
217
+ * @returns {ReturnType<typeof createBundlerRewriter>}
218
+ */
219
+ function getRewriter (dcModule) {
220
+ const cached = rewriters.get(dcModule)
221
+ if (cached) return cached
222
+ const rewrite = createBundlerRewriter(dcModule)
223
+ rewriters.set(dcModule, rewrite)
224
+ return rewrite
225
+ }
226
+
227
+ /**
228
+ * @param {string} source
229
+ */
230
+ function hasUnsafeCommonJsBindings (source) {
231
+ try {
232
+ const { parse } = require('../../datadog-instrumentations/src/helpers/rewriter/compiler')
233
+ if (source.startsWith('#!')) source = `//${source.slice(2)}`
234
+ const program = parse(Module.wrap(source))
235
+ const wrapper = program.body[0]?.expression
236
+ return wrapper?.type !== 'FunctionExpression' || hasUnsafeNode(wrapper.body, 0, 0)
237
+ } catch {
238
+ return true
239
+ }
240
+ }
241
+
242
+ /**
243
+ * @param {object} node
244
+ * @param {number} functionDepth
245
+ * @param {number} shadowedBindings
246
+ * @param {object} [parent]
247
+ * @param {string} [parentKey]
248
+ */
249
+ function hasUnsafeNode (node, functionDepth, shadowedBindings, parent, parentKey) {
250
+ if (functionDepth === 0 && hasCommonJsDeclaration(node, parent)) return true
251
+ if (node.type === 'AssignmentExpression' && mutatesCommonJsBinding(node.left, shadowedBindings)) return true
252
+ if (node.type === 'UpdateExpression' && mutatesCommonJsBinding(node.argument, shadowedBindings)) return true
253
+ if ((node.type === 'ForInStatement' || node.type === 'ForOfStatement') &&
254
+ mutatesCommonJsBinding(node.left, shadowedBindings)) return true
255
+ if (node.type === 'CallExpression' && node.callee?.type === 'Identifier' && node.callee.name === 'eval') return true
256
+ if (!(shadowedBindings & ARGUMENTS_BINDING) && node.type === 'Identifier' && node.name === 'arguments' &&
257
+ isReferencedIdentifier(parent, parentKey)) return true
258
+
259
+ const nestedFunction = node.type === 'ArrowFunctionExpression' || node.type === 'FunctionDeclaration' ||
260
+ node.type === 'FunctionExpression'
261
+ if (nestedFunction) {
262
+ functionDepth++
263
+ shadowedBindings |= getFunctionBindings(node)
264
+ }
265
+ shadowedBindings |= getLexicalBindings(node)
266
+
267
+ for (const key of Object.keys(node)) {
268
+ if ((node.type === 'VariableDeclarator' && key === 'id') ||
269
+ (node.type === 'CatchClause' && key === 'param')) continue
270
+ const value = node[key]
271
+ if (Array.isArray(value)) {
272
+ for (const child of value) {
273
+ if (child?.type && hasUnsafeNode(child, functionDepth, shadowedBindings, node, key)) return true
274
+ }
275
+ } else if (value?.type && hasUnsafeNode(value, functionDepth, shadowedBindings, node, key)) {
276
+ return true
277
+ }
278
+ }
279
+ return false
280
+ }
281
+
282
+ /**
283
+ * @param {object} node
284
+ * @param {object} [parent]
285
+ */
286
+ function hasCommonJsDeclaration (node, parent) {
287
+ if (node.type === 'VariableDeclarator') {
288
+ return parent?.kind === 'var' && Boolean(getBindingMask(node.id) & COMMONJS_BINDINGS)
289
+ }
290
+ if (node.type === 'FunctionDeclaration') {
291
+ return Boolean(getBindingMask(node.id) & COMMONJS_BINDINGS)
292
+ }
293
+ return false
294
+ }
295
+
296
+ /**
297
+ * @param {object} node
298
+ * @param {number} shadowedBindings
299
+ */
300
+ function mutatesCommonJsBinding (node, shadowedBindings) {
301
+ return Boolean(getBindingMask(node) & COMMONJS_BINDINGS & ~shadowedBindings)
302
+ }
303
+
304
+ /**
305
+ * @param {object} node
306
+ */
307
+ function getBindingMask (node) {
308
+ if (!node) return 0
309
+ if (node.type === 'Identifier') {
310
+ if (node.name === 'arguments') return ARGUMENTS_BINDING
311
+ if (node.name === 'module') return MODULE_BINDING
312
+ return node.name === 'require' ? REQUIRE_BINDING : 0
313
+ }
314
+ if (node.type === 'AssignmentPattern') return getBindingMask(node.left)
315
+ if (node.type === 'RestElement') return getBindingMask(node.argument)
316
+ if (node.type === 'ArrayPattern') {
317
+ let bindings = 0
318
+ for (const element of node.elements) bindings |= getBindingMask(element)
319
+ return bindings
320
+ }
321
+ if (node.type === 'ObjectPattern') {
322
+ let bindings = 0
323
+ for (const property of node.properties) {
324
+ bindings |= getBindingMask(property.type === 'RestElement' ? property.argument : property.value)
325
+ }
326
+ return bindings
327
+ }
328
+ return 0
329
+ }
330
+
331
+ /**
332
+ * @param {object} node
333
+ */
334
+ function getFunctionBindings (node) {
335
+ let bindings = node.type === 'ArrowFunctionExpression' ? 0 : ARGUMENTS_BINDING
336
+ bindings |= getBindingMask(node.id)
337
+ for (const param of node.params) bindings |= getBindingMask(param)
338
+ return bindings | getVarBindings(node.body)
339
+ }
340
+
341
+ /**
342
+ * @param {object} node
343
+ */
344
+ function getVarBindings (node) {
345
+ if (node.type === 'ArrowFunctionExpression' || node.type === 'FunctionDeclaration' ||
346
+ node.type === 'FunctionExpression' || node.type === 'ClassDeclaration' || node.type === 'ClassExpression') return 0
347
+
348
+ let bindings = 0
349
+ if (node.type === 'VariableDeclaration' && node.kind === 'var') {
350
+ for (const declaration of node.declarations) bindings |= getBindingMask(declaration.id)
351
+ }
352
+ for (const key of Object.keys(node)) {
353
+ const value = node[key]
354
+ if (Array.isArray(value)) {
355
+ for (const child of value) {
356
+ if (child?.type) bindings |= getVarBindings(child)
357
+ }
358
+ } else if (value?.type) {
359
+ bindings |= getVarBindings(value)
360
+ }
361
+ }
362
+ return bindings
363
+ }
364
+
365
+ /**
366
+ * @param {object} node
367
+ */
368
+ function getLexicalBindings (node) {
369
+ let bindings = 0
370
+ if (node.type === 'BlockStatement') {
371
+ for (const statement of node.body) bindings |= getStatementBindings(statement)
372
+ } else if (node.type === 'SwitchStatement') {
373
+ for (const switchCase of node.cases) {
374
+ for (const statement of switchCase.consequent) bindings |= getStatementBindings(statement)
375
+ }
376
+ } else if (node.type === 'CatchClause') {
377
+ bindings = getBindingMask(node.param)
378
+ } else if (node.type === 'ForStatement') {
379
+ bindings = getLexicalDeclarationBindings(node.init)
380
+ } else if (node.type === 'ForInStatement' || node.type === 'ForOfStatement') {
381
+ bindings = getLexicalDeclarationBindings(node.left)
382
+ } else if (node.type === 'ClassExpression') {
383
+ bindings = getBindingMask(node.id)
384
+ }
385
+ return bindings
386
+ }
387
+
388
+ /**
389
+ * @param {object} node
390
+ */
391
+ function getStatementBindings (node) {
392
+ if (node.type === 'VariableDeclaration') return getLexicalDeclarationBindings(node)
393
+ if (node.type === 'FunctionDeclaration' || node.type === 'ClassDeclaration') return getBindingMask(node.id)
394
+ return 0
395
+ }
396
+
397
+ /**
398
+ * @param {object} [node]
399
+ */
400
+ function getLexicalDeclarationBindings (node) {
401
+ if (node?.type !== 'VariableDeclaration' || node.kind === 'var') return 0
402
+ let bindings = 0
403
+ for (const declaration of node.declarations) bindings |= getBindingMask(declaration.id)
404
+ return bindings
405
+ }
406
+
407
+ /**
408
+ * @param {object} parent
409
+ * @param {string} parentKey
410
+ */
411
+ function isReferencedIdentifier (parent, parentKey) {
412
+ if (parent.type === 'MemberExpression' && parentKey === 'property' && !parent.computed) return false
413
+ if ((parent.type === 'Property' || parent.type === 'MethodDefinition' || parent.type === 'PropertyDefinition') &&
414
+ parentKey === 'key' && !parent.computed) {
415
+ return parent.type === 'Property' && parent.shorthand
416
+ }
417
+ return parentKey !== 'label'
418
+ }
419
+
420
+ /**
421
+ * @param {string} source
422
+ * @param {Array<{ package: string, path: string, version: string }>} payloads
423
+ * @param {string} dcModule
424
+ */
425
+ function appendCommonJsPublications (source, payloads, dcModule) {
426
+ let publications = ''
427
+ let index = 0
428
+ for (const payload of payloads) {
429
+ publications += ` const payload${index} = {
430
+ module: module.exports,
431
+ package: ${JSON.stringify(payload.package)},
432
+ path: ${JSON.stringify(payload.path)},
433
+ version: ${JSON.stringify(payload.version)},
434
+ }
435
+ channel.publish(payload${index})
436
+ module.exports = payload${index++}.module
437
+ `
438
+ }
439
+
440
+ return `${source}
441
+ {
442
+ const dc = require(${JSON.stringify(dcModule)})
443
+ const channel = dc.channel('${CHANNEL}')
444
+ if (channel.hasSubscribers) {
445
+ ${publications} }
446
+ }
447
+ `
448
+ }
449
+
450
+ /**
451
+ * @param {string} source
452
+ * @param {{ package: string, path: string, version: string }} payload
453
+ * @param {string} dcModule
454
+ * @param {boolean} esm
455
+ */
456
+ function appendActivation (source, payload, dcModule, esm) {
457
+ if (esm) {
458
+ return `${source}
459
+ import ddTraceTurbopackDc from ${JSON.stringify(dcModule)}
460
+ {
461
+ const channel = ddTraceTurbopackDc.channel('${CHANNEL}')
462
+ if (channel.hasSubscribers) channel.publish(${JSON.stringify({ activate: true, ...payload })})
463
+ }
464
+ `
465
+ }
466
+
467
+ return `${source}
468
+ {
469
+ const dc = require(${JSON.stringify(dcModule)})
470
+ const channel = dc.channel('${CHANNEL}')
471
+ if (channel.hasSubscribers) channel.publish(${JSON.stringify({ activate: true, ...payload })})
472
+ }
473
+ `
474
+ }
475
+
476
+ /**
477
+ * @param {string} from
478
+ * @param {string} to
479
+ */
480
+ function relativeImport (from, to) {
481
+ let value = path.relative(from, to).replaceAll('\\', '/')
482
+ if (!value.startsWith('.')) value = `./${value}`
483
+ return value
484
+ }
@@ -7,7 +7,6 @@ const CHANNEL = 'dd-trace:bundler:load'
7
7
  * Called for each module-of-interest identified by DatadogWebpackPlugin.
8
8
  *
9
9
  * @param {string} source
10
- * @returns {string}
11
10
  */
12
11
  module.exports = function loader (source) {
13
12
  this.cacheable(false)