feat(web-tanstack): Sentry instrumentation via @sentry/node + @sentry/react + R38 PII test

Adds initSentryServerNode + initSentryClientReact to core-shared
(Vite/non-Next variants of the existing init helpers — same R31/R32/R33
posture, R34/R35/R37 replay defaults). Extends no-sentry.ts to mock
@sentry/node + @sentry/react. Wires the web-tanstack server/client
instrumentation entry hooks and adds the R38 PII test.

Spec deviation: web-tanstack has no vite.config.ts yet (placeholder app
per its package.json). The @sentry/vite-plugin dep is added but unused
until the TanStack Start build is wired in a later plan. A minimal
src/vite-env.d.ts shims ImportMetaEnv for the client entry until the
full Vite types land.

@sentry/node and @sentry/react are added to core-shared as optional
peerDependencies so feature packages don't transitively pull them in;
they're also devDependencies of core-shared for typecheck/test runs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-07 20:25:14 +02:00
parent d348cb9179
commit e1b6ecf578
13 changed files with 548 additions and 0 deletions

206
pnpm-lock.yaml generated
View File

@@ -242,6 +242,9 @@ importers:
'@repo/core-api':
specifier: workspace:*
version: link:../../packages/core-api
'@repo/core-shared':
specifier: workspace:*
version: link:../../packages/core-shared
'@repo/core-trpc':
specifier: workspace:*
version: link:../../packages/core-trpc
@@ -254,6 +257,12 @@ importers:
'@repo/navigation':
specifier: workspace:*
version: link:../../packages/navigation
'@sentry/node':
specifier: ^10.52.0
version: 10.52.0
'@sentry/react':
specifier: ^10.52.0
version: 10.52.0(react@19.2.4)
'@tanstack/react-query':
specifier: ^5.66.0
version: 5.96.2(react@19.2.4)
@@ -279,6 +288,9 @@ importers:
'@repo/core-typescript':
specifier: workspace:*
version: link:../../packages/core-typescript
'@sentry/vite-plugin':
specifier: ^5.2.1
version: 5.2.1(rollup@4.60.1)
'@testing-library/jest-dom':
specifier: ^6.5.0
version: 6.9.1
@@ -521,6 +533,12 @@ importers:
'@repo/core-typescript':
specifier: workspace:*
version: link:../core-typescript
'@sentry/node':
specifier: ^10.51.0
version: 10.52.0
'@sentry/react':
specifier: ^10.51.0
version: 10.52.0(react@19.2.4)
'@types/node':
specifier: ^22.0.0
version: 22.19.17
@@ -2749,18 +2767,34 @@ packages:
resolution: {integrity: sha512-lNKBS4P7RUvf1niojXQWe9bU3gnBUCbST4Dj0pSiyat1N96cXVyHkeE+uGxowD0RrVWhs+kGHiVX3FcmRWF6sA==}
engines: {node: '>=18'}
'@sentry-internal/browser-utils@10.52.0':
resolution: {integrity: sha512-x/yEPZdpH6NGQeoeQnV9tj8reAH8twNttiltGZl2o8Rk7sQeUfe7E8yuYP2XbJ2RqyZK5qRS3COrNyMPzf6KFA==}
engines: {node: '>=18'}
'@sentry-internal/feedback@10.51.0':
resolution: {integrity: sha512-bCM95bcpphx28e6aU0bwRLxOgwosYsdNzezM1sM0pVOkb0TB3hDFRamramVDK+/Hp1o8qmRxS4c5w/A7YBZGkA==}
engines: {node: '>=18'}
'@sentry-internal/feedback@10.52.0':
resolution: {integrity: sha512-5kAn1W8ZvCuHtEHXpq6iRkUMdNCilwww+YxaN2yofVrCivAbB3Ha5JJUMqmWOPW0pC27zGYmoJMIDvG+PczUxA==}
engines: {node: '>=18'}
'@sentry-internal/replay-canvas@10.51.0':
resolution: {integrity: sha512-8PW1Pp+Yl3lPwYqhBCr5SgkuhDanu9ZLzUqD2bPKL/ElqbM2eDVIWxq4z4ZzePrmZa6IcCjTv6sVQJ7Z4dLyLA==}
engines: {node: '>=18'}
'@sentry-internal/replay-canvas@10.52.0':
resolution: {integrity: sha512-BI5ie4dxPuUJ344CXVSnAxY1xZCbghglPSCIlTOYODpR9so9yo5IZh+Mwspt0oWsUMaxWJiQSNYlbPWi7WDavg==}
engines: {node: '>=18'}
'@sentry-internal/replay@10.51.0':
resolution: {integrity: sha512-jCpI5HXSwK6ZT2HX70+mDRciAocHzSiDk4DTgvzV69Wvd+Ei5WLgE+d39eaEPsm8lUC0Ydntb5sJIB6uG9D4bw==}
engines: {node: '>=18'}
'@sentry-internal/replay@10.52.0':
resolution: {integrity: sha512-diywyuc/H7VTUR+W5ryVmLF+0X4UP1OskMqb6V8RSAvJHcj2JmIm7uP+Fc6ACTno+b6AUShwT/L4xVXzO6X9Cw==}
engines: {node: '>=18'}
'@sentry/babel-plugin-component-annotate@5.2.1':
resolution: {integrity: sha512-QQ9AL5EXIbSK26ObLVtiU6l3tCUdpGSJ/6VwDkPhC3qvtoksSlcoU9Yzm7XC0NBcvu1N2abL5R7gckKGZ4JewQ==}
engines: {node: '>= 18'}
@@ -2769,6 +2803,10 @@ packages:
resolution: {integrity: sha512-Zdc0sKfenxUtW/OGhtJ7xHFN44bXR7YqxJ1zBDzlZfW0nTbeTTUZBq9z5NUw6qdS0Vs/i3V4qzAKTbRKWfqSEA==}
engines: {node: '>=18'}
'@sentry/browser@10.52.0':
resolution: {integrity: sha512-ijL9jN86oXwXQWbwhPlEb70ODJSEmjxQEQdnZkC4gDWbjswcwvRsVJPYk+1xl2ir2iZixRIHipVxDcLwian35g==}
engines: {node: '>=18'}
'@sentry/bundler-plugin-core@5.2.1':
resolution: {integrity: sha512-uXb+TOZKXxm2STsP3iR70Jh/yYHwlHOvql7w/bUVYgDyiB/1Mv0D6oNGS0kelsgBsBwCq3ngyJYlyNy3oM1pPw==}
engines: {node: '>= 18'}
@@ -2829,6 +2867,10 @@ packages:
resolution: {integrity: sha512-Y45V/YXvVLEXmOdkbD1oG1gkRWFi9guCEGg3PlIlIpRjAbZUrvLGgjRJIc1E7XpSzmOnWbs5BbUxMv4PDaPj2w==}
engines: {node: '>=18'}
'@sentry/core@10.52.0':
resolution: {integrity: sha512-VA/kAqLhkMnRWY2RXdBLyTemR9D4m7MVRy/gyapoq9yvllVPx9WXbvKgnMP2LQp7mFgT/oLFvw58aQKaYTGn3A==}
engines: {node: '>=18'}
'@sentry/nextjs@10.51.0':
resolution: {integrity: sha512-Bh3DeieTnbOOfhFEWbT57vgxlCdoTU7+x5or8QLa8VGCmZEekIdt0rGd8exbG1msI4g6SusCiJzbF/8bucmY/A==}
engines: {node: '>=18'}
@@ -2859,10 +2901,38 @@ packages:
'@opentelemetry/semantic-conventions':
optional: true
'@sentry/node-core@10.52.0':
resolution: {integrity: sha512-IG7MBtLRPQ2LuU+kbD14AFZroZgAeUmJQTP1FI/F8n56O31+p+9R703LuBTpvZr6sm+eRYDMWcGYYkfLHRVjwg==}
engines: {node: '>=18'}
peerDependencies:
'@opentelemetry/api': ^1.9.0
'@opentelemetry/core': ^1.30.1 || ^2.1.0
'@opentelemetry/exporter-trace-otlp-http': '>=0.57.0 <1'
'@opentelemetry/instrumentation': '>=0.57.1 <1'
'@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0
'@opentelemetry/semantic-conventions': ^1.39.0
peerDependenciesMeta:
'@opentelemetry/api':
optional: true
'@opentelemetry/core':
optional: true
'@opentelemetry/exporter-trace-otlp-http':
optional: true
'@opentelemetry/instrumentation':
optional: true
'@opentelemetry/sdk-trace-base':
optional: true
'@opentelemetry/semantic-conventions':
optional: true
'@sentry/node@10.51.0':
resolution: {integrity: sha512-2yZLRZwS1dKG8/4eOTpGSo/gO/EgmT9aPj6lAzUkRa7bZCTTdW4BraaHU0leX5T94909Qfhbr3W5AVTfDOCKiQ==}
engines: {node: '>=18'}
'@sentry/node@10.52.0':
resolution: {integrity: sha512-9+p3KJUk3rHO1HOEZuSknP2RgKCJZONDm4HWgkVDtVBtocb66KLtVlMjc59d2/bWP7tM3wc877tpG30quFfU9g==}
engines: {node: '>=18'}
'@sentry/opentelemetry@10.51.0':
resolution: {integrity: sha512-Qc7AlCE4uhB+SvHLqah4RgR1WdY7wmmr/hx9g/prDP9R1ocshmUEMrZK9qjuwaklW7/fmkFCXI8ETxo5L1bHIA==}
engines: {node: '>=18'}
@@ -2872,16 +2942,44 @@ packages:
'@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0
'@opentelemetry/semantic-conventions': ^1.39.0
'@sentry/opentelemetry@10.52.0':
resolution: {integrity: sha512-Sc7StsvC0bwhMcgDfTRWUIexO5cNzzKUurvUwtpgQUnxO7AzexU3lkY3yHYDsCbWYAEQMXAgQYQtbcqoh+Ie7g==}
engines: {node: '>=18'}
peerDependencies:
'@opentelemetry/api': ^1.9.0
'@opentelemetry/core': ^1.30.1 || ^2.1.0
'@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0
'@opentelemetry/semantic-conventions': ^1.39.0
'@sentry/react@10.51.0':
resolution: {integrity: sha512-RRHHqjNvjji6ebIqdlAr453AkST8Vm4cxdu1vWm772IgbzTO7Jx46Cj6Bt2/GjMyH0YLE5euDaAOQhFMmpvAOw==}
engines: {node: '>=18'}
peerDependencies:
react: ^16.14.0 || 17.x || 18.x || 19.x
'@sentry/react@10.52.0':
resolution: {integrity: sha512-2m72QCsja2cJJHD0ALxRnVt0qMEC2FV4LSi6AAiEdEG4lTb6mgcxavx5pJrW90jE+6dMGPbUz4q8c9vi4jh1qQ==}
engines: {node: '>=18'}
peerDependencies:
react: ^16.14.0 || 17.x || 18.x || 19.x
'@sentry/rollup-plugin@5.2.1':
resolution: {integrity: sha512-LKJyL4fzcHnHExipVN0/QinhBNoGZt+UXg8xJaqc6MwOolOhxHW0ii2hu1OZsiOhX0+r9MK7T+a7Sx0F0bzdMQ==}
engines: {node: '>= 18'}
peerDependencies:
rollup: '>=3.2.0'
peerDependenciesMeta:
rollup:
optional: true
'@sentry/vercel-edge@10.51.0':
resolution: {integrity: sha512-tADUhv+S3gtAj/hSAih6FcYTRZQma+brI4dY6bue2RwgWQvaQoP5CF/PsTb4RhK82etPhqphsdJivY09/L7vWA==}
engines: {node: '>=18'}
'@sentry/vite-plugin@5.2.1':
resolution: {integrity: sha512-sSQzOhN8xvo/R70vqgyonnC/fwXpJ1kbkJ0g81Xy/OR+N89+v5tPN4VlKTAq3T2c5yAPE39XCbdgeEnI4kbWGg==}
engines: {node: '>= 18'}
'@sentry/webpack-plugin@5.2.1':
resolution: {integrity: sha512-ZGxwCkszFHdk9N11XIbAyTTsJsGUKHMYEXMRLUwPLi+iKi+b+YuXLBg7rlxe6Nd3M0i7xWy3gz6jcW7jeqEfIw==}
engines: {node: '>= 18'}
@@ -9364,20 +9462,38 @@ snapshots:
dependencies:
'@sentry/core': 10.51.0
'@sentry-internal/browser-utils@10.52.0':
dependencies:
'@sentry/core': 10.52.0
'@sentry-internal/feedback@10.51.0':
dependencies:
'@sentry/core': 10.51.0
'@sentry-internal/feedback@10.52.0':
dependencies:
'@sentry/core': 10.52.0
'@sentry-internal/replay-canvas@10.51.0':
dependencies:
'@sentry-internal/replay': 10.51.0
'@sentry/core': 10.51.0
'@sentry-internal/replay-canvas@10.52.0':
dependencies:
'@sentry-internal/replay': 10.52.0
'@sentry/core': 10.52.0
'@sentry-internal/replay@10.51.0':
dependencies:
'@sentry-internal/browser-utils': 10.51.0
'@sentry/core': 10.51.0
'@sentry-internal/replay@10.52.0':
dependencies:
'@sentry-internal/browser-utils': 10.52.0
'@sentry/core': 10.52.0
'@sentry/babel-plugin-component-annotate@5.2.1': {}
'@sentry/browser@10.51.0':
@@ -9388,6 +9504,14 @@ snapshots:
'@sentry-internal/replay-canvas': 10.51.0
'@sentry/core': 10.51.0
'@sentry/browser@10.52.0':
dependencies:
'@sentry-internal/browser-utils': 10.52.0
'@sentry-internal/feedback': 10.52.0
'@sentry-internal/replay': 10.52.0
'@sentry-internal/replay-canvas': 10.52.0
'@sentry/core': 10.52.0
'@sentry/bundler-plugin-core@5.2.1':
dependencies:
'@babel/core': 7.29.0
@@ -9447,6 +9571,8 @@ snapshots:
'@sentry/core@10.51.0': {}
'@sentry/core@10.52.0': {}
'@sentry/nextjs@10.51.0(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(next@15.5.14(@opentelemetry/api@1.9.1)(@playwright/test@1.59.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.99.0))(react@19.2.4)(webpack@5.106.2)':
dependencies:
'@opentelemetry/api': 1.9.1
@@ -9509,6 +9635,18 @@ snapshots:
'@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1)
'@opentelemetry/semantic-conventions': 1.40.0
'@sentry/node-core@10.52.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)':
dependencies:
'@sentry/core': 10.52.0
'@sentry/opentelemetry': 10.52.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)
import-in-the-middle: 3.0.1
optionalDependencies:
'@opentelemetry/api': 1.9.1
'@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1)
'@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1)
'@opentelemetry/semantic-conventions': 1.40.0
'@sentry/node@10.51.0':
dependencies:
'@fastify/otel': 0.18.0(@opentelemetry/api@1.9.1)
@@ -9546,6 +9684,41 @@ snapshots:
- '@opentelemetry/exporter-trace-otlp-http'
- supports-color
'@sentry/node@10.52.0':
dependencies:
'@fastify/otel': 0.18.0(@opentelemetry/api@1.9.1)
'@opentelemetry/api': 1.9.1
'@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-amqplib': 0.61.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-connect': 0.57.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-dataloader': 0.31.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-fs': 0.33.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-generic-pool': 0.57.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-graphql': 0.62.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-hapi': 0.60.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-http': 0.214.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-kafkajs': 0.23.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-knex': 0.58.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-koa': 0.62.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-lru-memoizer': 0.58.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-mongodb': 0.67.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-mongoose': 0.60.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-mysql': 0.60.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-mysql2': 0.60.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-pg': 0.66.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation-tedious': 0.33.0(@opentelemetry/api@1.9.1)
'@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1)
'@opentelemetry/semantic-conventions': 1.40.0
'@prisma/instrumentation': 7.6.0(@opentelemetry/api@1.9.1)
'@sentry/core': 10.52.0
'@sentry/node-core': 10.52.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)
'@sentry/opentelemetry': 10.52.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)
import-in-the-middle: 3.0.1
transitivePeerDependencies:
- '@opentelemetry/exporter-trace-otlp-http'
- supports-color
'@sentry/opentelemetry@10.51.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)':
dependencies:
'@opentelemetry/api': 1.9.1
@@ -9554,18 +9727,51 @@ snapshots:
'@opentelemetry/semantic-conventions': 1.40.0
'@sentry/core': 10.51.0
'@sentry/opentelemetry@10.52.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)':
dependencies:
'@opentelemetry/api': 1.9.1
'@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1)
'@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1)
'@opentelemetry/semantic-conventions': 1.40.0
'@sentry/core': 10.52.0
'@sentry/react@10.51.0(react@19.2.4)':
dependencies:
'@sentry/browser': 10.51.0
'@sentry/core': 10.51.0
react: 19.2.4
'@sentry/react@10.52.0(react@19.2.4)':
dependencies:
'@sentry/browser': 10.52.0
'@sentry/core': 10.52.0
react: 19.2.4
'@sentry/rollup-plugin@5.2.1(rollup@4.60.1)':
dependencies:
'@sentry/bundler-plugin-core': 5.2.1
magic-string: 0.30.21
optionalDependencies:
rollup: 4.60.1
transitivePeerDependencies:
- encoding
- supports-color
'@sentry/vercel-edge@10.51.0':
dependencies:
'@opentelemetry/api': 1.9.1
'@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1)
'@sentry/core': 10.51.0
'@sentry/vite-plugin@5.2.1(rollup@4.60.1)':
dependencies:
'@sentry/bundler-plugin-core': 5.2.1
'@sentry/rollup-plugin': 5.2.1(rollup@4.60.1)
transitivePeerDependencies:
- encoding
- rollup
- supports-color
'@sentry/webpack-plugin@5.2.1(webpack@5.106.2)':
dependencies:
'@sentry/bundler-plugin-core': 5.2.1