Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
86f5dc8
fix(serverless): Add node to metadata (#19878)
nicohrubec Mar 19, 2026
44fd627
Merge pull request #19882 from getsentry/master
github-actions[bot] Mar 19, 2026
399df7c
test(astro): Re-enable server island tracing e2e test in Astro 6 (#19…
Lms24 Mar 19, 2026
8d14dea
fix(nestjs): Add `node` to nest metadata (#19875)
chargome Mar 19, 2026
ccf337a
fix(deps): bump socket.io-parser to 4.2.6 to fix CVE-2026-33151 (#19880)
chargome Mar 19, 2026
02744f7
feat(deps): bump stacktrace-parser from 0.1.10 to 0.1.11 (#19887)
dependabot[bot] Mar 19, 2026
ffe7a6f
chore(deps): bump mongodb-memory-server-global from 10.1.4 to 11.0.1 …
dependabot[bot] Mar 19, 2026
ffe00a7
chore(node-integration-tests): Remove unnecessary `file-type` depende…
Lms24 Mar 19, 2026
0684e2d
handleCallbackErrors return type fix
s1gr1d Feb 11, 2026
da2ff20
with `has` object trap
s1gr1d Feb 11, 2026
b4c4bbf
remove proxy wrapping
s1gr1d Feb 12, 2026
bd451fc
add tracing unit tests
s1gr1d Feb 12, 2026
b978b79
clean up test cases
s1gr1d Feb 12, 2026
7531ac4
remove throw error
s1gr1d Feb 12, 2026
5e99593
fix: Copy properties onto Sentry-chained promises
isaacs Feb 13, 2026
e9bf658
chore(lint): resolve oxlint warnings
isaacs Mar 19, 2026
c167cf2
chore: avoid unnecessary sort to get smallest value
isaacs Mar 19, 2026
ddca82a
fix(cloudflare): Forward `ctx` argument to `Workflow.do` user callbac…
Lms24 Mar 20, 2026
c1a7b22
ref(sveltekit): Replace recast + @babel/parser with acorn (#19533)
roli-lpci Mar 20, 2026
587cc6c
fix(core): Do not overwrite user provided conversation id in Vercel (…
nicohrubec Mar 20, 2026
344b774
chore: Add external contributor to CHANGELOG.md (#19909)
javascript-sdk-gitflow[bot] Mar 20, 2026
ebcb517
chore(ci): Fix "Gatbsy" typo in issue package label workflow (#19905)
chargome Mar 20, 2026
0d4feb2
fix(craft): Add missing mainDocsUrl for @sentry/effect SDK (#19860)
bc-sentry Mar 20, 2026
94cb94f
fix(deps): bump next to 15.5.14 in nextjs-15 and nextjs-15-intl E2E t…
chargome Mar 20, 2026
ce11ba2
chore(deps-dev): bump @react-router/node from 7.13.0 to 7.13.1 (#19544)
dependabot[bot] Mar 20, 2026
cac4c46
chore(deps-dev): bump qunit-dom from 3.2.1 to 3.5.0 (#19546)
dependabot[bot] Mar 20, 2026
b4071ef
chore(remix): Replace glob with native recursive fs walk (#19531)
roli-lpci Mar 20, 2026
8808ea1
chore: Add external contributor to CHANGELOG.md (#19925)
javascript-sdk-gitflow[bot] Mar 20, 2026
70387b5
fix(cloudflare): Send correct events in local development (#19900)
JPeer264 Mar 23, 2026
8fc035a
fix(deps): bump fast-xml-parser to 5.5.8 in @azure/core-xml chain (#1…
chargome Mar 23, 2026
cf60d03
chore(claude): Enable Claude Code Intelligence (LSP) (#19930)
s1gr1d Mar 23, 2026
232317c
chore(deps-dev): bump effect from 3.19.19 to 3.20.0 (#19926)
dependabot[bot] Mar 23, 2026
3fafdb4
ref(nuxt): Extract handler patching to extra plugin for Nitro v2/v3 (…
s1gr1d Mar 23, 2026
b7f5d09
fix(core): Send `internal_error` as span status for Vercel error span…
nicohrubec Mar 23, 2026
907d06c
ref(nuxt): Extract core logic for storage/database to prepare for Nux…
s1gr1d Mar 23, 2026
66b48de
fix(deps): update lockfile to resolve h3@1.15.10 (#19933)
chargome Mar 23, 2026
51e2cee
fix(core): Truncate content array format in Vercel (#19911)
nicohrubec Mar 24, 2026
83cabf3
fix(core): Preserve .withResponse() on Anthropic instrumentation (#19…
nicohrubec Mar 24, 2026
c9812ae
test(cloudflare): Enable multi-worker tests for CF integration tests …
JPeer264 Mar 24, 2026
18a624e
feat(elysia): Elysia SDK (#19509)
logaretm Mar 24, 2026
0156846
feat(nuxt): Conditionally use plugins based on Nitro version (v2/v3) …
s1gr1d Mar 25, 2026
a54de04
ref(core): Remove duplicate `buildMethodPath` utility from openai (#1…
nicohrubec Mar 25, 2026
54abb35
refactor(elysia): drop @elysiajs/opentelemetry dependency (#19947)
logaretm Mar 25, 2026
6f48cc4
meta(changelog): Update changelog for 10.46.0
nicohrubec Mar 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"env": { "ENABLE_LSP_TOOL": "1" },
"permissions": {
"allow": [
"Bash(find:*)",
Expand Down
10 changes: 10 additions & 0 deletions .craft.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ targets:
- name: npm
id: '@sentry/bun'
includeNames: /^sentry-bun-\d.*\.tgz$/
- name: npm
id: '@sentry/elysia'
includeNames: /^sentry-elysia-\d.*\.tgz$/
- name: npm
id: '@sentry/hono'
includeNames: /^sentry-hono-\d.*\.tgz$/
Expand Down Expand Up @@ -245,4 +248,11 @@ targets:
name: 'Sentry Effect SDK'
sdkName: 'sentry.javascript.effect'
packageUrl: 'https://www.npmjs.com/package/@sentry/effect'
mainDocsUrl: 'https://docs.sentry.io/platforms/javascript/guides/effect/'
onlyIfPresent: /^sentry-effect-\d.*\.tgz$/
'npm:@sentry/elysia':
name: 'Sentry Elysia SDK'
sdkName: 'sentry.javascript.elysia'
packageUrl: 'https://www.npmjs.com/package/@sentry/elysia'
mainDocsUrl: 'https://docs.sentry.io/platforms/javascript/guides/elysia/'
onlyIfPresent: /^sentry-elysia-\d.*\.tgz$/
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ body:
- '@sentry/cloudflare - hono'
- '@sentry/deno'
- '@sentry/effect'
- '@sentry/elysia'
- '@sentry/ember'
- '@sentry/gatsby'
- '@sentry/google-cloud-serverless'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -961,7 +961,7 @@ jobs:
with:
node-version-file: 'dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/package.json'
- name: Set up Bun
if: contains(fromJSON('["node-exports-test-app","nextjs-16-bun"]'), matrix.test-application)
if: contains(fromJSON('["node-exports-test-app","nextjs-16-bun", "elysia-bun"]'), matrix.test-application)
uses: oven-sh/setup-bun@v2
- name: Set up AWS SAM
if: matrix.test-application == 'aws-serverless'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/issue-package-label.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ jobs:
"label": "Ember"
},
"@sentry.gatsby": {
"label": "Gatbsy"
"label": "Gatsby"
},
"@sentry.google-cloud-serverless": {
"label": "Google Cloud Functions"
Expand Down
2 changes: 1 addition & 1 deletion .oxlintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
"typescript/no-redundant-type-constituents": "off",
"typescript/restrict-template-expressions": "off",
"typescript/await-thenable": "warn",
"typescript/no-base-to-string": "warn"
"typescript/no-base-to-string": "off"
}
},
{
Expand Down
2 changes: 1 addition & 1 deletion .size-limit.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ module.exports = [
import: createImport('init', 'ErrorBoundary', 'reactRouterV6BrowserTracingIntegration'),
ignore: ['react/jsx-runtime'],
gzip: true,
limit: '45 KB',
limit: '45.1 KB',
},
// Vue SDK (ESM)
{
Expand Down
13 changes: 13 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,19 @@ Monorepo with 40+ packages in `@sentry/*`, managed with Yarn workspaces and Nx.
- After cloning: `yarn install && yarn build`
- Never change Volta, Yarn, or package manager versions unless explicitly asked

### Code Intelligence

Prefer LSP over Grep/Read for code navigation — it's faster, precise, and avoids reading entire files:

- `workspaceSymbol` to find where something is defined
- `findReferences` to see all usages across the codebase
- `goToDefinition` / `goToImplementation` to jump to source
- `hover` for type info without reading the file

Use Grep only when LSP isn't available or for text/pattern searches (comments, strings, config).

After writing or editing code, check LSP diagnostics and fix errors before proceeding.

## Package Manager

Use **yarn**: `yarn install`, `yarn build:dev`, `yarn test`, `yarn lint`
Expand Down
69 changes: 69 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,75 @@

- "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott

## 10.46.0

### Important Changes

- **feat(elysia): `@sentry/elysia` - Alpha Release ([#19509](https://github.com/getsentry/sentry-javascript/pull/19509))**

New Sentry SDK for the [Elysia](https://elysiajs.com/) web framework, supporting both Bun and Node.js runtimes.

> **Note:** This is an alpha release. Please report any issues or feedback on [GitHub](https://github.com/getsentry/sentry-javascript/issues).

**Features**
- **Automatic error capturing** — 5xx errors captured via global `onError` hook; 3xx/4xx ignored by default. Customizable with `shouldHandleError`.
- **Automatic tracing** — Lifecycle spans for every Elysia phase (Request, Parse, Transform, BeforeHandle, Handle, AfterHandle, MapResponse, AfterResponse, Error) with parameterized route names (e.g. `GET /users/:id`).
- **Distributed tracing** — `sentry-trace` and `baggage` headers propagated automatically on incoming/outgoing requests.

**Usage**

```javascript
import * as Sentry from '@sentry/elysia';
import { Elysia } from 'elysia';

Sentry.init({ dsn: '__DSN__', tracesSampleRate: 1.0 });

const app = Sentry.withElysia(new Elysia());
app.get('/', () => 'Hello World');
app.listen(3000);
```

### Other Changes

- feat(nuxt): Conditionally use plugins based on Nitro version (v2/v3) ([#19955](https://github.com/getsentry/sentry-javascript/pull/19955))
- fix(cloudflare): Forward `ctx` argument to `Workflow.do` user callback ([#19891](https://github.com/getsentry/sentry-javascript/pull/19891))
- fix(cloudflare): Send correct events in local development ([#19900](https://github.com/getsentry/sentry-javascript/pull/19900))
- fix(core): Do not overwrite user provided conversation id in Vercel ([#19903](https://github.com/getsentry/sentry-javascript/pull/19903))
- fix(core): Preserve `.withResponse()` on Anthropic instrumentation ([#19935](https://github.com/getsentry/sentry-javascript/pull/19935))
- fix(core): Send `internal_error` as span status for Vercel error spans ([#19921](https://github.com/getsentry/sentry-javascript/pull/19921))
- fix(core): Truncate content array format in Vercel ([#19911](https://github.com/getsentry/sentry-javascript/pull/19911))
- fix(deps): bump fast-xml-parser to 5.5.8 in @azure/core-xml chain ([#19918](https://github.com/getsentry/sentry-javascript/pull/19918))
- fix(deps): bump socket.io-parser to 4.2.6 to fix CVE-2026-33151 ([#19880](https://github.com/getsentry/sentry-javascript/pull/19880))
- fix(nestjs): Add `node` to nest metadata ([#19875](https://github.com/getsentry/sentry-javascript/pull/19875))
- fix(serverless): Add node to metadata ([#19878](https://github.com/getsentry/sentry-javascript/pull/19878))

<details>
<summary> <strong>Internal Changes</strong> </summary>

- chore(ci): Fix "Gatbsy" typo in issue package label workflow ([#19905](https://github.com/getsentry/sentry-javascript/pull/19905))
- chore(claude): Enable Claude Code Intelligence (LSP) ([#19930](https://github.com/getsentry/sentry-javascript/pull/19930))
- chore(deps): bump mongodb-memory-server-global from 10.1.4 to 11.0.1 ([#19888](https://github.com/getsentry/sentry-javascript/pull/19888))
- chore(deps-dev): bump @react-router/node from 7.13.0 to 7.13.1 ([#19544](https://github.com/getsentry/sentry-javascript/pull/19544))
- chore(deps-dev): bump effect from 3.19.19 to 3.20.0 ([#19926](https://github.com/getsentry/sentry-javascript/pull/19926))
- chore(deps-dev): bump qunit-dom from 3.2.1 to 3.5.0 ([#19546](https://github.com/getsentry/sentry-javascript/pull/19546))
- chore(node-integration-tests): Remove unnecessary `file-type` dependency ([#19824](https://github.com/getsentry/sentry-javascript/pull/19824))
- chore(remix): Replace glob with native recursive fs walk ([#19531](https://github.com/getsentry/sentry-javascript/pull/19531))
- feat(deps): bump stacktrace-parser from 0.1.10 to 0.1.11 ([#19887](https://github.com/getsentry/sentry-javascript/pull/19887))
- fix(craft): Add missing mainDocsUrl for @sentry/effect SDK ([#19860](https://github.com/getsentry/sentry-javascript/pull/19860))
- fix(deps): bump next to 15.5.14 in nextjs-15 and nextjs-15-intl E2E test apps ([#19917](https://github.com/getsentry/sentry-javascript/pull/19917))
- fix(deps): update lockfile to resolve h3@1.15.10 ([#19933](https://github.com/getsentry/sentry-javascript/pull/19933))
- ref(core): Remove duplicate `buildMethodPath` utility from openai ([#19969](https://github.com/getsentry/sentry-javascript/pull/19969))
- ref(elysia): Drop `@elysiajs/opentelemetry` dependency ([#19947](https://github.com/getsentry/sentry-javascript/pull/19947))
- ref(nuxt): Extract core logic for storage/database to prepare for Nuxt v5 ([#19920](https://github.com/getsentry/sentry-javascript/pull/19920))
- ref(nuxt): Extract handler patching to extra plugin for Nitro v2/v3 ([#19915](https://github.com/getsentry/sentry-javascript/pull/19915))
- ref(sveltekit): Replace recast + @babel/parser with acorn ([#19533](https://github.com/getsentry/sentry-javascript/pull/19533))
- test(astro): Re-enable server island tracing e2e test in Astro 6 ([#19872](https://github.com/getsentry/sentry-javascript/pull/19872))
- test(cloudflare): Enable multi-worker tests for CF integration tests ([#19938](https://github.com/getsentry/sentry-javascript/pull/19938))

</details>

Work in this release was contributed by @roli-lpci. Thank you for your contributions!

## 10.45.0

### Important Changes
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ package. Please refer to the README and instructions of those SDKs for more deta
for native crashes
- [`@sentry/effect`](https://github.com/getsentry/sentry-javascript/tree/master/packages/effect): SDK for Effect (Alpha)
- [`@sentry/bun`](https://github.com/getsentry/sentry-javascript/tree/master/packages/bun): SDK for Bun
- [`@sentry/elysia`](https://github.com/getsentry/sentry-javascript/tree/master/packages/elysia): SDK for Elysia
- [`@sentry/deno`](https://github.com/getsentry/sentry-javascript/tree/master/packages/deno): SDK for Deno
- [`@sentry/cloudflare`](https://github.com/getsentry/sentry-javascript/tree/master/packages/cloudflare): SDK for
Cloudflare
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/**
* Test that verifies thenable objects with extra methods (like jQuery's jqXHR)
* preserve those methods when returned from Sentry.startSpan().
*
* Example case:
* const jqXHR = Sentry.startSpan({ name: "test" }, () => $.ajax(...));
* jqXHR.abort(); // Should work and not throw an error because of missing abort() method
*/

// Load jQuery from CDN
const script = document.createElement('script');
script.src = 'https://code.jquery.com/jquery-3.7.1.min.js';
script.integrity = 'sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=';
script.crossOrigin = 'anonymous';

script.onload = function () {
runTest();
};

script.onerror = function () {
window.jqXHRTestError = 'Failed to load jQuery';
window.jqXHRMethodsPreserved = false;
};

document.head.appendChild(script);

async function runTest() {
window.jqXHRAbortCalled = false;
window.jqXHRAbortResult = null;
window.jqXHRTestError = null;

try {
if (!window.jQuery) {
throw new Error('jQuery not loaded');
}

const result = Sentry.startSpan({ name: 'test-jqxhr', op: 'http.client' }, () => {
// Make a real AJAX request with jQuery
return window.jQuery.ajax({
url: 'https://httpbin.org/status/200',
method: 'GET',
timeout: 5000,
});
});

const hasAbort = typeof result.abort === 'function';
const hasReadyState = 'readyState' in result;

if (hasAbort && hasReadyState) {
try {
result.abort();
window.jqXHRAbortCalled = true;
window.jqXHRAbortResult = 'abort-successful';
window.jqXHRMethodsPreserved = true;
} catch (e) {
console.log('abort() threw an error:', e);
window.jqXHRTestError = `abort() failed: ${e.message}`;
window.jqXHRMethodsPreserved = false;
}
} else {
window.jqXHRMethodsPreserved = false;
window.jqXHRTestError = 'jqXHR methods not preserved';
}

// Since we aborted the request, it should be rejected
try {
await result;
window.jqXHRPromiseResolved = true; // Unexpected
} catch (err) {
// Expected: aborted request rejects
window.jqXHRPromiseResolved = false;
window.jqXHRPromiseRejected = true;
}
} catch (error) {
console.error('Test error:', error);
window.jqXHRTestError = error.message;
window.jqXHRMethodsPreserved = false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { expect } from '@playwright/test';
import { sentryTest } from '../../../../utils/fixtures';
import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../utils/helpers';

sentryTest('preserves extra methods on real jQuery jqXHR objects', async ({ getLocalTestUrl, page }) => {
if (shouldSkipTracingTest()) {
sentryTest.skip();
}

const url = await getLocalTestUrl({ testDir: __dirname });
const transactionPromise = waitForTransactionRequest(page);

await page.goto(url);

// Wait for jQuery to load
await page.waitForTimeout(1000);

const methodsPreserved = await page.evaluate(() => (window as any).jqXHRMethodsPreserved);
expect(methodsPreserved).toBe(true);

const abortCalled = await page.evaluate(() => (window as any).jqXHRAbortCalled);
expect(abortCalled).toBe(true);

const abortReturnValue = await page.evaluate(() => (window as any).jqXHRAbortResult);
expect(abortReturnValue).toBe('abort-successful');

const testError = await page.evaluate(() => (window as any).jqXHRTestError);
expect(testError).toBeNull();

const transaction = envelopeRequestParser(await transactionPromise);
expect(transaction.transaction).toBe('test-jqxhr');
expect(transaction.spans).toBeDefined();
});

sentryTest('aborted request rejects promise correctly', async ({ getLocalTestUrl, page }) => {
if (shouldSkipTracingTest()) {
sentryTest.skip();
}

const url = await getLocalTestUrl({ testDir: __dirname });
await page.goto(url);

// Wait for jQuery to load
await page.waitForTimeout(1000);

const promiseRejected = await page.evaluate(() => (window as any).jqXHRPromiseRejected);
expect(promiseRejected).toBe(true);

const promiseResolved = await page.evaluate(() => (window as any).jqXHRPromiseResolved);
expect(promiseResolved).toBe(false);
});
Loading
Loading