Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
171 commits
Select commit Hold shift + click to select a range
3aaac64
chore(deps): Bump @sentry/conventions to 0.30.0 (#25837)
msonnb Oct 28, 2026
b382e30
fix(server-utils): Require a parent span for Tedious queries (#25822)
nicohrubec Oct 28, 2026
c31c197
chore: Merge master into develop
andreiborza Oct 28, 2026
a33cba8
ref(core): Deprecate the released `handleTunnelRequest` form and rewo…
logaretm Oct 28, 2026
02d3290
Merge pull request #25845 from getsentry/ab/manual-develop-sync
andreiborza Oct 28, 2026
de10e52
fix(replay): Skip buffered replays for captureMessage stacks from the…
logaretm Oct 28, 2026
2b1607d
fix(server-utils): Read the pi-durable session id in every phase outs…
JPeer264 Oct 28, 2026
b722d3c
feat(node): Add BullMQ integration (#21777)
JPeer264 Oct 28, 2026
fa13bed
ci: Drop dead matrix reference in Deno unit tests job (#25852)
lazerg Oct 29, 2026
eaa9997
chore: Add external contributor to CHANGELOG.md (#25862)
javascript-sdk-gitflow[bot] Oct 29, 2026
fddeafc
test(e2e): Remove node-flue-send-to-sentry (#25839)
mydea Oct 29, 2026
61d2b26
ref(cloudflare): Simplify shared SDK initialization (#25864)
nicohrubec Oct 29, 2026
379346e
test(e2e): Move canary variants into `canaryVariants` (#25865)
sentry-junior[bot] Oct 29, 2026
9543b71
ci(canary): Build the canary test matrix from `canaryVariants` (#25866)
sentry-junior[bot] Oct 29, 2026
6bc31a6
fix(server-utils): Require a parent span for Firestore operations (#2…
lazerg Oct 29, 2026
7f3d560
feat(server-utils): Support @mistralai/mistralai v3 (#25827)
chargome Oct 29, 2026
67c633f
chore: Add external contributor to CHANGELOG.md (#25870)
javascript-sdk-gitflow[bot] Oct 29, 2026
b364030
test(e2e): Check node-openai-decisions through the event proxy (#25840)
mydea Oct 29, 2026
e0d6c88
fix(core): Only create Supabase db spans when there is a parent span …
chiliec Oct 29, 2026
c521633
chore: Add external contributor to CHANGELOG.md (#25872)
javascript-sdk-gitflow[bot] Oct 29, 2026
90c1ebb
fix(core): Respect header collection for session user agents (#25871)
msonnb Oct 29, 2026
1e3ef41
fix(core): Enforce linked error limits for aggregate and suppressed e…
msonnb Oct 29, 2026
ab1bc56
fix(server-utils): Use onlyIfParent for Tedious spans (#25876)
nicohrubec Oct 29, 2026
2c5b8f8
fix(server-utils): Use onlyIfParent for Firestore spans (#25877)
nicohrubec Oct 29, 2026
0f28207
feat(bundler-plugins): Add `sourcemaps.deleteSourcemapsAfterUpload` a…
timfish Oct 29, 2026
51248d4
fix(solidstart): Serve the managed tunnel under Vite's base on SolidS…
logaretm Oct 29, 2026
f7b6364
fix(nextjs): Strip source map comments before trailing debug IDs (#25…
msonnb Oct 29, 2026
46a1fd7
ref(astro): Use convention constants for attribute keys (#25894)
msonnb Oct 29, 2026
52ea34a
ref(react-router): Use convention constants for attribute keys (#25906)
msonnb Oct 29, 2026
d0e4b27
ref(nuxt): Use convention constants for attribute keys (#25904)
msonnb Oct 29, 2026
11abeaa
ref(nextjs): Use convention constants for attribute keys (#25902)
msonnb Oct 29, 2026
1c73883
ref(google-cloud-serverless): Use convention constants for attribute …
msonnb Oct 29, 2026
59fc614
ref(node): Use convention constants for attribute keys (#25903)
msonnb Oct 29, 2026
b85e0a6
ref(cloudflare): Use convention constants for attribute keys (#25898)
msonnb Oct 29, 2026
023cbc6
ref(sveltekit): Use convention constants for attribute keys (#25909)
msonnb Oct 29, 2026
6b2cf3d
ref(server-utils): Use convention constants for attribute keys (#25908)
msonnb Oct 29, 2026
1cd91ed
ref(replay-internal): Use convention constants for attribute keys (#2…
msonnb Oct 29, 2026
c88a958
ref(browser): Use convention constants for attribute keys (#25895)
msonnb Oct 29, 2026
efe1e26
ref(browser-utils): Use convention constants for attribute keys (#25896)
msonnb Oct 29, 2026
632cbfe
ref(bun): Use convention constants for attribute keys (#25897)
msonnb Oct 29, 2026
53daa00
ref(deno): Use convention constants for attribute keys (#25900)
msonnb Oct 29, 2026
176da4a
ci: Split the E2E test matrix into two jobs (#25913)
andreiborza Oct 29, 2026
68e5c95
ref(core): Use convention constants for attribute keys (#25899)
msonnb Oct 29, 2026
60d6dc1
ref(profiling-node): Use convention constants for attribute keys (#25…
msonnb Oct 29, 2026
9c93bbd
chore(deps): Bump webpack from 5.104.1 to 5.112.2 (#25910)
dependabot[bot] Oct 29, 2026
a36d4b7
fix(server-utils): Fix orchestrion source maps of instrumented module…
JPeer264 Oct 29, 2026
30cfb4c
fix(cloudflare): Run build-time instrumentation in vite dev (#25777)
JPeer264 Oct 29, 2026
cbab405
feat(nestjs): Derive SentryCron monitor config from @Cron (#25013)
wedamija Oct 29, 2026
9310b4d
feat(node): Add nodeCronIntegration to monitor node-cron tasks (#25473)
wedamija Oct 29, 2026
6d48bfa
feat(deps): Bump dataloader from 2.2.2 to 2.2.3 (#25891)
dependabot[bot] Oct 30, 2026
9896575
test(e2e): Rename nuxt-5 middleware files to avoid Nitro's dotted suf…
logaretm Oct 30, 2026
fb53f31
chore(deps-dev): Bump @rollup/plugin-terser from 0.4.4 to 1.0.2 (#25890)
dependabot[bot] Oct 30, 2026
365e761
ref(server-utils): Remove `requiresParentSpan` in favor of `onlyIfPar…
nicohrubec Oct 30, 2026
b0560b7
ref: Pass optional span attributes directly instead of conditional sp…
sentry-junior[bot] Oct 30, 2026
8e61e32
test(node-integration-tests): Install single-version suite dependenci…
mydea Oct 30, 2026
8592e7e
test(e2e): Move OpenAI and Anthropic send-to-sentry cases into gen-ai…
mydea Oct 30, 2026
9bc2086
test(node-integration-tests): Install Flue and pi-durable as package …
mydea Oct 30, 2026
e1daae7
chore: Remove unused test and build dependencies (#25945)
nicohrubec Oct 30, 2026
2f5a2f9
chore(node-integration-tests): Remove unused dependencies (#25942)
nicohrubec Oct 30, 2026
446679d
chore: Remove unused eslint-plugin-regexp dependencies (#25944)
nicohrubec Oct 30, 2026
f948bcf
test(node-integration-tests): Install Prisma suite dependencies as pa…
nicohrubec Oct 30, 2026
b52901e
feat(server-utils): Set `db.operation.name` on SQL spans (#25850)
mydea Oct 30, 2026
7aca628
feat(server-utils): Move to new `getSqlQueryAttributes` helper for co…
mydea Oct 30, 2026
0041bc6
feat(node): Add `awsLambdaWebIntegration` for Lambda Web Functions (#…
msonnb Oct 30, 2026
1ed55d2
feat(nextjs): Mark pageloads of cached pages (#25318)
chargome Oct 30, 2026
214ac9a
chore: Prune unused regexp dependencies from lockfile (#25948)
nicohrubec Oct 30, 2026
bcd4805
feat(nextjs): Add `applicationKeyExcludeDependencies` option (#25818)
msonnb Oct 30, 2026
24313af
chore(dependabot): Ignore major react-router updates (#25892)
andreiborza Oct 30, 2026
bc8fdf1
ci(deps): Dedupe lockfile on Dependabot PRs (#25911)
sentry-junior[bot] Oct 30, 2026
299a3c3
fix(core): Call native toString without page-replaceable lookups in F…
logaretm Oct 30, 2026
de967f7
ci(deps): Bump anthropics/claude-code-action from 1.0.236 to 1.0.264 …
dependabot[bot] Oct 30, 2026
7c60519
ci(deps): Bump getsentry/github-workflows/validate-pr from 36c729264d…
dependabot[bot] Oct 30, 2026
dcf06e9
chore(deps): Enable pnpm autoDedupe (#25961)
sentry-junior[bot] Oct 30, 2026
a3dae70
chore(deps-dev): Bump tsx from 4.23.0 to 4.23.15 (#25958)
dependabot[bot] Oct 30, 2026
9ea3abf
feat(node): Add nodeScheduleIntegration to monitor node-schedule jobs…
wedamija Oct 30, 2026
b63640b
Revert "ci(deps): Dedupe lockfile on Dependabot PRs (#25911)" (#25962)
sentry-junior[bot] Oct 30, 2026
c16633e
ref(cloudflare): Use the shared request handler wrapper (#25588)
isaacs Oct 30, 2026
ef23ed5
feat(server-utils): Record AI SDK v7 runtime and tool context on Verc…
isaacs Oct 30, 2026
e201b4f
feat(deps): Bump valibot from 1.4.2 to 1.5.0 (#25957)
dependabot[bot] Oct 30, 2026
c9b4058
chore(deps-dev): Bump the react-router group across 1 directory with …
dependabot[bot] Oct 30, 2026
73b7bb2
chore(ci): Remove nightly sentry-lighthouse upload workflow (#25966)
Lms24 Oct 30, 2026
d045e1c
test(bundler-tests): Guard server runtime entries against build-time …
isaacs Oct 30, 2026
3e24a70
feat(solidstart): Export `withSentry` from `@sentry/solidstart/vite` …
isaacs Oct 30, 2026
f74a45d
feat(astro): Add `@sentry/astro/integration` entry for the Astro inte…
isaacs Oct 30, 2026
34dfa4d
ci(node): Add optional Node 27 alpha tests (#25984)
JPeer264 Oct 31, 2026
fd69ba2
feat(nestjs): Add an option to monitor every @Cron method (#25471)
wedamija Nov 2, 2026
5018473
docs(changelog): Add monitorCronJobs to Unreleased (#25996)
wedamija Nov 2, 2026
bbb59b4
test(nuxt): cover the client plugin's pages-router instrumentation (#…
61465 Nov 2, 2026
36e3e9e
chore: Refresh Smithy deprecation metadata in lockfile (#25971)
nicohrubec Nov 2, 2026
4a6b7c3
ci: Include v10 in base-branch metadata (#25977)
nicohrubec Nov 2, 2026
bbb6c11
test(bundler-plugins): Stabilize missing-parser test setup (#25972)
nicohrubec Nov 2, 2026
e6ecc73
chore: Add Bugbot guidance for cold imports in tests (#25976)
nicohrubec Nov 2, 2026
e6a7a4c
test(browser): Stabilize long animation frame tests (#25974)
nicohrubec Nov 2, 2026
dd9903c
test(nuxt): Make the `nuxt-5 (tunnel-dev)` e2e variant optional (#26004)
logaretm Nov 2, 2026
41894d9
ci(deps): Bump getsentry/craft from 2.31.2 to 3.4.0 (#25987)
dependabot[bot] Nov 3, 2026
b61bd60
fix(core): preserve span links through beforeSendSpan (#25566)
chiliec Nov 3, 2026
590d58c
docs(changelog): Restore order of unreleased section in changelog (#2…
nicohrubec Nov 3, 2026
441f49d
chore(dependabot): Remove obsolete update rules (#26007)
nicohrubec Nov 3, 2026
a0ff8ad
ci(deps): Bump anthropics/claude-code-action from 1.0.264 to 1.0.266 …
dependabot[bot] Nov 3, 2026
db1e22f
ci(deps): Bump getsentry/craft from 3.4.0 to 3.5.0 (#26011)
dependabot[bot] Nov 3, 2026
21ca39b
chore(deps-dev): Bump wrangler from 4.61.0 to 4.156.0 (#26009)
dependabot[bot] Nov 3, 2026
bcb43ea
chore(deps-dev): Bump redux from 4.0.5 to 5.0.1 (#25959)
dependabot[bot] Nov 3, 2026
9403d91
fix(deps): Bump glob to 14 and drop the direct dependency from react-…
chargome Nov 3, 2026
883abb5
test(aws-serverless): Move Lambda extension setup outside test timeou…
nicohrubec Nov 3, 2026
3ced970
test(effect): Assert error severities without event ordering (#25973)
nicohrubec Nov 3, 2026
541a0d4
fix(bundler-plugins): upload literal artifact paths (#25356)
jpdefo Nov 3, 2026
8d6b875
chore: Add external contributor to CHANGELOG.md (#26017)
javascript-sdk-gitflow[bot] Nov 3, 2026
ec88aef
test(e2e): Point together-ai 1.x at OpenRouter's base URL in gen-ai-l…
mydea Nov 3, 2026
9ace99a
ref(server-utils): Clarify PostgreSQL instrumentation filenames (#25939)
nicohrubec Nov 3, 2026
afa3763
perf(ci): Speed up Next.js E2E tests by sharding into dev/prod (#25960)
nicohrubec Nov 3, 2026
958868b
test(e2e): Import Type from typebox in node-pi-durable (#26018)
andreiborza Nov 3, 2026
284e43f
feat(deps): Bump node-forge from 1.4.0 to 1.4.2 (#26020)
dependabot[bot] Nov 3, 2026
49998f3
feat(deps): Bump @hapi/content from 6.0.2 to 6.0.3 (#26021)
dependabot[bot] Nov 3, 2026
bbe907f
chore(ci): Ignore Dependabot bumps for deps that are also peer deps (…
andreiborza Nov 3, 2026
dd682cf
fix(wasm): Skip length prefix in 16-byte build IDs (#24857)
andreiborza Nov 3, 2026
ca17f00
perf(ci): Increase tarball packing concurrency (#25979)
nicohrubec Nov 3, 2026
b44e0a3
feat(deps): Bump @aws-sdk/client-lambda from 3.1068.0 to 3.1161.0 (#2…
dependabot[bot] Nov 3, 2026
692a8d3
chore(deps): Group AWS SDK Dependabot updates (#26030)
nicohrubec Nov 3, 2026
82bcbfa
chore(deps-dev): Bump @babel/plugin-transform-typescript from 7.29.7 …
dependabot[bot] Nov 3, 2026
420beaa
chore(deps): Align AWS SDK clients to 3.1161.0 (#26032)
nicohrubec Nov 3, 2026
250c9fb
feat(deps): Bump axios from 1.20.0 to 1.21.0 (#26033)
dependabot[bot] Nov 3, 2026
ad4c1ca
feat(deps): Bump proxy from 2.1.1 to 4.1.0 (#26029)
dependabot[bot] Nov 3, 2026
4846a85
fix(deps): Bump tar from 7.5.11 to 7.5.22 (#26025)
chargome Nov 3, 2026
74e9200
chore(deps-dev): Bump fake-indexeddb from 6.2.5 to 6.2.7 (#26034)
dependabot[bot] Nov 3, 2026
18fdceb
feat(deps): Bump yargs from 16.2.0 to 18.2.0 (#26031)
dependabot[bot] Nov 3, 2026
69269a8
perf(ci): Split Next.js application-key tests by environment (#26040)
nicohrubec Nov 3, 2026
b7eb5a2
feat(deps): Bump vite from 8.3.1 to 8.3.5 (#26045)
dependabot[bot] Nov 3, 2026
1cee973
ci(deps): Group langchain dependabot updates and skip majors (#26041)
andreiborza Nov 3, 2026
01f035e
feat(deps): Bump @embroider/addon-shim from 1.10.3 to 1.11.0 (#26048)
dependabot[bot] Nov 3, 2026
3a73996
feat(deps): Bump pg and @types/pg (#26042)
dependabot[bot] Nov 3, 2026
2944415
feat(deps): Bump @flue/runtime from 2.0.3 to 2.3.0 (#26044)
dependabot[bot] Nov 3, 2026
06ffeea
chore(dependabot): Preserve SDK compatibility baselines (#26013)
nicohrubec Nov 3, 2026
b063c31
fix(deps): Bump seroval to 1.6.12 and 1.7.7 (#26047)
chargome Nov 3, 2026
32c0261
feat(deps): Bump @hono/node-server from 2.0.10 to 2.1.3 (#26053)
dependabot[bot] Nov 3, 2026
34746aa
feat(deps): Bump lodash.omit from 4.5.0 to 4.18.0 (#26055)
dependabot[bot] Nov 3, 2026
0bb6a35
chore(dev-packages): Move dependencies to devDependencies (#26046)
andreiborza Nov 3, 2026
5b68948
ci(deps): Ignore langchain in dependabot (#26056)
andreiborza Nov 3, 2026
5a93f0b
chore(deps-dev): Bump @babel/parser from 7.29.9 to 8.0.10 (#26043)
dependabot[bot] Nov 3, 2026
11b278e
feat(deps): Bump @sveltejs/acorn-typescript from 1.0.9 to 1.0.13 (#26…
dependabot[bot] Nov 3, 2026
1b08ab8
chore(dependabot): Group related dependency updates (#26059)
nicohrubec Nov 3, 2026
0b4d12c
fix(astro): Initialize the server SDK on the first endpoint request (…
AyeshaWaseemAhmad Nov 3, 2026
ebf2f7b
chore: Add external contributor to CHANGELOG.md (#26062)
javascript-sdk-gitflow[bot] Nov 3, 2026
2fa4b3a
chore(deps-dev): Bump @hono/node-server from 2.1.3 to 2.1.5 (#26054)
dependabot[bot] Nov 3, 2026
9137f53
chore(deps-dev): Bump the nestjs group with 2 updates (#26060)
dependabot[bot] Nov 3, 2026
03a06ca
chore(deps-dev): Bump node-schedule and @types/node-schedule (#26058)
dependabot[bot] Nov 3, 2026
1a2a5e5
chore: Ignore major Prisma dependency updates (#26063)
nicohrubec Nov 3, 2026
73ef7ec
feat(deps): Bump @types/aws-lambda from 8.10.161 to 8.10.164 (#26066)
dependabot[bot] Nov 3, 2026
8a8a985
chore: Batch npm dependency updates daily (#26072)
nicohrubec Nov 3, 2026
19076c0
feat(node): Add cronJobIntegration to monitor cron jobs (#25477)
wedamija Nov 3, 2026
e1ec28b
chore(deps-dev): Bump @testing-library/user-event from 14.5.2 to 14.6…
dependabot[bot] Nov 3, 2026
5a05c55
chore: Exclude integration and bundler tests from Dependabot updates …
nicohrubec Nov 3, 2026
b9d0f82
chore(deps-dev): Bump markdown-table from 3.0.3 to 3.0.4 (#26074)
dependabot[bot] Nov 3, 2026
d138b7b
fix(build): Handle CRLF line endings in pnpm-workspace.yaml check (#2…
chargome Nov 4, 2026
23eca77
fix(nuxt): Keep storage instrumentation plugin synchronous (#25949)
sentry-junior[bot] Nov 4, 2026
2619fa4
fix(nitro): Capture errors thrown in tasks (#26089)
andreiborza Nov 4, 2026
7ae2cc3
fix(nextjs): Fork isolation scope for Next.request proxy root spans (…
chargome Nov 4, 2026
a57560f
fix(sveltekit): Resolve Handle and ResolveOptions types on SvelteKit …
chargome Nov 4, 2026
4d85171
feat(server-utils): Extract `getSqlSpanName` for SQL span names (#25929)
mydea Nov 4, 2026
bbec9a0
test(nuxt): Use Nuxt's own Nitro and add db0 in nuxt-5 E2E app (#26095)
sentry-junior[bot] Nov 4, 2026
8a102ea
fix(server-utils): Instrument @anthropic-ai/sdk 1.x and turn off its …
RulaKhaled Nov 4, 2026
069f36a
ref(server-utils): Share the postgres.js query settlement logic (#26094)
mydea Nov 4, 2026
930a4c8
chore(deps): Bump @nuxt/devtools from 3.4.1 to 3.4.4 (#26097)
chargome Nov 4, 2026
f2ee787
ci: run CI on GitHub-hosted runners again (#26057)
joshuarli Nov 4, 2026
77f71ea
fix(bundler-plugins): Inject debug IDs into every esbuild rebuild (#2…
timfish Nov 4, 2026
e4eff2c
fix(browser): Attribute long animation frame spans to the longest scr…
sentry-junior[bot] Nov 4, 2026
a1162e3
feat(node): Support postgres v4 through its native tracing channels (…
logaretm Nov 4, 2026
1bd5136
fix(nextjs): Don't abort Cache Components renders on Cloudflare Worke…
chargome Nov 4, 2026
b310704
chore(deps): Bump undici from 6.24.1 to 6.29.1 (#26108)
chargome Nov 4, 2026
88a5e3b
chore(deps): Bump @actions/core and @actions/github in internal GH ac…
chargome Nov 4, 2026
b765940
fix(nextjs): Drop tunnel requests under the Next.request proxy root s…
chargome Nov 5, 2026
3b15c56
meta(changelog): Update changelog for 11.11.0
chargome Nov 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .cursor/BUGBOT.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@ Keep reviews high-signal. Prefer actionable, high-confidence findings over specu
- Only waiting for a request, after an action is performed. Instead, start waiting, perform action, await request promise.
- Race conditions when waiting on multiple requests. Ensure that waiting checks are unique enough and don't depend on a hard order when there's a chance that telemetry can be sent in arbitrary order.
- Timeouts or sleeps in tests. Instead suggest concrete events or other signals to wait on.
- Flag cold module loading inside timed test callbacks or their helpers when
it can safely run during collection or setup. It can exhaust the timeout
before the behavior under test runs. Prefer static imports, narrower
modules, or setup hooks while preserving isolation and mock order.
Preserve imports whose evaluation timing is itself being tested.
Only flag concrete avoidable loading, not dynamic imports in general.
- Flag usage of `getFirstEnvelope*`, `getMultipleEnvelope*` or related test helpers in E2E tests. These are NOT reliable anymore. Instead suggest helpers like `waitForTransaction`, `waitForError`, `waitForSpans`, etc.
- Flag any new or modified `docker-compose.yml` under `dev-packages/node-integration-tests/suites/` where a service does not define a `healthcheck:`. The runner uses `docker compose up --wait` and relies on healthchecks to know when services are actually ready; without one the test will race the service's startup.
- Flag new Cloudflare tests that wrap the worker by hand with `withSentry`, `instrumentDurableObjectWithSentry`, `instrumentAgentWithSentry` or `instrumentWorkflowWithSentry`. This covers new suites under `dev-packages/cloudflare-integration-tests/suites/`, new E2E apps under `dev-packages/e2e-tests/test-applications/` that run on Cloudflare, and new Cloudflare variants of existing E2E apps (an entry in `sentryTest.variants` of the app's `package.json`, for example `hono-4 (cloudflare)`). App names do not always start with `cloudflare-`. Recommend the Sentry Cloudflare Vite plugin instead: `plugins: [cloudflare(), sentryCloudflareVitePlugin()]` in `vite.config.*` (`sentryCloudflareVitePlugin` from `@sentry/cloudflare/vite`), and the SDK options in an `instrument.server.ts` next to the worker entry that default-exports `defineCloudflareOptions(...)`. Do not flag tests whose purpose is to test one of these wrappers, or apps that do not build with Vite (for example Next.js on OpenNext).
Expand All @@ -112,6 +118,7 @@ Keep reviews high-signal. Prefer actionable, high-confidence findings over specu
- When any `setTimeout` or `setInterval` timers are started in a code path that can end up in server runtime packages (e.g. `@sentry/core` or `@sentry/node`), flag if neither `timeout.unref()` nor `safeUnref()` are called.
Not unref'ing a timer can keep CLI-like applications or node scripts from exiting immediately, due to the process waiting on timers started by the SDK.
- Flag Node-only imports (`fs`, `path`, `child_process`, `os`, `net`, `http`, `https`, `node:*`, etc.) in code paths that ship to non-Node runtimes (`@sentry/browser`, `@sentry/cloudflare`, `@sentry/deno`, `@sentry/bun`, or shared code in `@sentry/core` / `@sentry/browser-utils` reachable from those entry points). When the dependency is unavoidable, isolate it behind a runtime check, dynamic `import()`, or a Node-only entry point — never at the top level of a cross-runtime module.
- Flag a new package, or a new `exports` entry in a `package.json` under `packages/`, that can load on a server runtime (Node, Bun, Deno, Cloudflare Workers, Vercel Edge) when its package has no entry in `CASES` or `BUILD_TIME_CASES` in `dev-packages/bundler-tests/tests/runtime-entries.test.ts`. That test checks that server runtime entries do not reach build-time tooling (bundler plugins, Vite, Babel, WASM). For packages it already covers, the test fails on its own when an export is not classified, so do not flag those. Recommend adding the package to `devDependencies` in `dev-packages/bundler-tests/package.json`, and each export to `CASES` (runtime), `BUILD_TIME_CASES` (build-time), or `CLIENT_ENTRIES` (browser). Do not flag browser-only packages.

## What NOT to Flag

Expand Down
68 changes: 17 additions & 51 deletions .github/actions/install-dependencies/action.yml
Original file line number Diff line number Diff line change
@@ -1,64 +1,30 @@
name: 'Install pnpm dependencies'
description: 'Installs pnpm dependencies into node_modules folders on the Namespace cache volume.'
description: 'Installs pnpm dependencies and caches them.'

outputs:
cache_key:
description: 'The dependency cache key'
value: ${{ steps.compute_lockfile_hash.outputs.hash }}

runs:
using: 'composite'
steps:
- name: List dependency paths
id: paths
run: |
{
echo 'paths<<EOF'
node -e 'const { workspaces } = require("./package.json"); for (const dir of [".", ...workspaces]) console.log(require("path").resolve(dir, "node_modules"))'
echo '~/.cache/mongodb-binaries'
echo '~/.cache/prisma'
echo 'EOF'
} >> "$GITHUB_OUTPUT"
shell: bash

- name: Mount dependency cache
uses: ./.github/actions/mount-pnpm-store
with:
path: ${{ steps.paths.outputs.paths }}

- name: Install pnpm
uses: ./.github/actions/install-pnpm

# When the node_modules layout changes, `pnpm install` keeps the `.bin` scripts of the workspace packages, which
# then point into a folder that the new layout does not have. Branches that change `nodeLinker` share this cache
# volume, so start from empty node_modules folders when the layout on the volume differs, or when an earlier
# install already left such broken `.bin` scripts behind.
- name: Remove node_modules of another layout
run: |
mapfile -t dirs < <(grep '/node_modules$' <<< "$DEPENDENCY_PATHS")
expected=$(pnpm config get node-linker)
if [[ "$expected" == undefined ]]; then
expected=isolated
fi
actual=$(node -p 'try { JSON.parse(require("fs").readFileSync("node_modules/.modules.yaml", "utf8")).nodeLinker ?? "" } catch { "" }')
if [[ -n "$actual" && "$actual" != "$expected" ]]; then
reason="The node_modules folders use the $actual layout, but nodeLinker is $expected."
else
broken=$(node "$GITHUB_ACTION_PATH/find-broken-bin.mjs" "${dirs[@]}")
if [[ -n "$broken" ]]; then
reason="The target of $broken does not exist."
fi
fi
if [[ -n "$reason" ]]; then
echo "$reason Removing the node_modules folders."
for dir in "${dirs[@]}"; do
if [[ -d "$dir" ]]; then
# The folders are mounted from the cache volume, so empty them instead of removing them
find "$dir/" -mindepth 1 -maxdepth 1 -exec rm -rf {} +
fi
done
fi
env:
DEPENDENCY_PATHS: ${{ steps.paths.outputs.paths }}
- name: Compute dependency cache key
id: compute_lockfile_hash
run: node ./scripts/dependency-hash-key.js >> "$GITHUB_OUTPUT"
shell: bash

# The cache volume can hold node_modules of another commit or branch. This is a no-op when they match
# pnpm-lock.yaml.
- name: Check dependency cache
uses: actions/cache@v6.1.0
id: cache_dependencies
with:
path: ${{ env.CACHED_DEPENDENCY_PATHS }}
key: ${{ steps.compute_lockfile_hash.outputs.hash }}

- name: Install dependencies
if: steps.cache_dependencies.outputs.cache-hit != 'true'
run: pnpm install --frozen-lockfile
shell: bash
34 changes: 0 additions & 34 deletions .github/actions/install-dependencies/find-broken-bin.mjs

This file was deleted.

47 changes: 31 additions & 16 deletions .github/actions/install-playwright/action.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: 'Install Playwright dependencies'
description: 'Installs Playwright browsers and system dependencies, keeping both on the Namespace cache volume.'
description: 'Installs Playwright dependencies and caches them.'
inputs:
browsers:
description: 'What browsers to install.'
Expand All @@ -26,28 +26,43 @@ runs:
shell: bash
working-directory: ${{ inputs.cwd }}

- name: Mount Playwright cache
uses: namespacelabs/nscloud-cache-action@1124a6f3ce44e5cf84cc22111530961f4d2a15f9 # v1.7.0
- name: Restore cached playwright binaries
uses: actions/cache/restore@v6.1.0
id: playwright-cache
if: steps.playwright-version.outputs.version != ''
with:
cache: |
playwright
apt
path: |
~/.cache/ms-playwright
# Bump the iteration when bumping runner images to use a new cache
key: playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }}

# `--with-deps` names packages that the runner image already has (glib, mesa, nss, ...), and `apt-get install` would
# upgrade them to the latest Ubuntu update. That is half of the download on a cold cache, and the image versions work.
- name: Keep installed apt packages
if: steps.playwright-version.outputs.version != ''
run: echo 'APT::Get::Upgrade "false";' | sudo tee /etc/apt/apt.conf.d/99-no-upgrade > /dev/null
# We always install all browsers, if uncached
# `npx` runs outside the repo, so it can't pick up a `playwright` that a parallel `pnpm install` is still linking.
- name: Install Playwright dependencies (uncached)
env:
PLAYWRIGHT_VERSION: ${{ steps.playwright-version.outputs.version }}
run: npx -y "playwright@$PLAYWRIGHT_VERSION" install chromium webkit firefox --with-deps
if: steps.playwright-version.outputs.version != '' && steps.playwright-cache.outputs.cache-hit != 'true'
shell: bash
working-directory: ${{ runner.temp }}

# Downloads only the browsers and apt packages that are not on the cache volume yet. `npx` runs outside the repo,
# so it can't pick up a `playwright` that a parallel `pnpm install` is still linking.
- name: Install Playwright
if: steps.playwright-version.outputs.version != ''
- name: Install Playwright system dependencies only (cached)
env:
PLAYWRIGHT_BROWSERS: ${{ inputs.browsers || 'chromium webkit firefox' }}
PLAYWRIGHT_VERSION: ${{ steps.playwright-version.outputs.version }}
run: npx -y "playwright@$PLAYWRIGHT_VERSION" install --with-deps $PLAYWRIGHT_BROWSERS
run: npx -y "playwright@$PLAYWRIGHT_VERSION" install-deps $PLAYWRIGHT_BROWSERS
if: steps.playwright-version.outputs.version != '' && steps.playwright-cache.outputs.cache-hit == 'true'
shell: bash
working-directory: ${{ runner.temp }}

# Only store cache on develop branch
- name: Store cached playwright binaries
uses: actions/cache/save@v6.1.0
if:
steps.playwright-version.outputs.version != '' && github.event_name == 'push' && github.ref ==
'refs/heads/develop'
with:
path: |
~/.cache/ms-playwright
# Bump the iteration when bumping runner images to use a new cache
key: playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }}
33 changes: 0 additions & 33 deletions .github/actions/mount-pnpm-store/action.yml

This file was deleted.

3 changes: 0 additions & 3 deletions .github/actions/prepare-e2e-test/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,6 @@ runs:
uses: denoland/setup-deno@v2.0.5
with:
deno-version: ${{ inputs.deno-version || 'v2.8.3' }}
# Keeps the pnpm store on the cache volume for the `pnpm install` of the test application
- name: Mount pnpm store
uses: ./.github/actions/mount-pnpm-store
- name: Install pnpm
uses: ./.github/actions/install-pnpm

Expand Down
21 changes: 19 additions & 2 deletions .github/actions/restore-cache/action.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,30 @@
name: 'Restore dependency & build cache'
description: 'Installs dependencies from the Namespace cache volume and restores the build output.'
description: 'Restore the dependency & build cache.'

inputs:
dependency_cache_key:
description: 'The dependency cache key'
required: true

runs:
using: 'composite'
steps:
- name: Install pnpm
uses: ./.github/actions/install-pnpm

- name: Check dependency cache
id: dep-cache
uses: actions/cache/restore@v6.1.0
with:
path: ${{ env.CACHED_DEPENDENCY_PATHS }}
key: ${{ inputs.dependency_cache_key }}

- name: Restore build artifacts
uses: actions/download-artifact@v7
with:
name: build-output

- name: Install dependencies
uses: ./.github/actions/install-dependencies
if: steps.dep-cache.outputs.cache-hit != 'true'
run: pnpm install --frozen-lockfile
shell: bash
Loading
Loading