From 1c7706b58cf964082568861327ea416a24381c47 Mon Sep 17 00:00:00 2001 From: Faizan Date: Wed, 14 Oct 2026 14:47:45 +0530 Subject: [PATCH 1/2] feat(browser): add LoaderSentry type --- packages/browser/src/exports.ts | 1 + packages/browser/src/loader.ts | 27 +++++++++++++++++++++ packages/browser/test/loader.test-d.ts | 33 ++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 packages/browser/src/loader.ts create mode 100644 packages/browser/test/loader.test-d.ts diff --git a/packages/browser/src/exports.ts b/packages/browser/src/exports.ts index 48b09d3c1acc..f7d96bb5f872 100644 --- a/packages/browser/src/exports.ts +++ b/packages/browser/src/exports.ts @@ -23,6 +23,7 @@ export type { } from '@sentry/core'; export type { BrowserOptions } from './client'; +export type { LoaderSentry } from './loader'; export { addEventProcessor, diff --git a/packages/browser/src/loader.ts b/packages/browser/src/loader.ts new file mode 100644 index 000000000000..654812b39d18 --- /dev/null +++ b/packages/browser/src/loader.ts @@ -0,0 +1,27 @@ + +type LoaderApi = typeof import('@sentry/core') & + typeof import('./sdk') & + typeof import('./report-dialog'); + +type VoidReturningFunction = T extends (...args: infer Args) => unknown + ? (...args: Args) => void + : never; + +type LoaderQueuedMethod = + | 'init' + | 'addBreadcrumb' + | 'captureMessage' + | 'captureException' + | 'captureEvent' + | 'withScope' + | 'showReportDialog'; + +/** + * The subset of the Sentry browser API supported by the CDN loader. + * + * Queued calls do not synchronously return the result of the underlying SDK + * method, so their return types are void. + */ +export type LoaderSentry = { + [Method in LoaderQueuedMethod]: VoidReturningFunction; +} & Pick; diff --git a/packages/browser/test/loader.test-d.ts b/packages/browser/test/loader.test-d.ts new file mode 100644 index 000000000000..c06eb393fa9b --- /dev/null +++ b/packages/browser/test/loader.test-d.ts @@ -0,0 +1,33 @@ +import { expectTypeOf, it, describe } from 'vitest'; +import type { LoaderSentry } from '../src/loader'; + +describe('LoaderSentry', () => { + it('exposes the APIs supported by the loader', () => { + expectTypeOf().toHaveProperty('init'); + expectTypeOf().toHaveProperty('addBreadcrumb'); + expectTypeOf().toHaveProperty('captureMessage'); + expectTypeOf().toHaveProperty('captureException'); + expectTypeOf().toHaveProperty('captureEvent'); + expectTypeOf().toHaveProperty('withScope'); + expectTypeOf().toHaveProperty('showReportDialog'); + expectTypeOf().toHaveProperty('onLoad'); + expectTypeOf().toHaveProperty('forceLoad'); + }); + + it('does not expose unsupported APIs', () => { + expectTypeOf().not.toHaveProperty('addIntegration'); + expectTypeOf().not.toHaveProperty('captureFeedback'); + expectTypeOf().not.toHaveProperty('flush'); + expectTypeOf().not.toHaveProperty('close'); + }); + + it('uses void return types for queued methods', () => { + expectTypeOf().returns.toBeVoid(); + expectTypeOf().returns.toBeVoid(); + expectTypeOf().returns.toBeVoid(); + expectTypeOf().returns.toBeVoid(); + expectTypeOf().returns.toBeVoid(); + expectTypeOf().returns.toBeVoid(); + expectTypeOf().returns.toBeVoid(); + }); +}); From 5b2cfb0563239d8230d81b2208e8ded22ff1d4cb Mon Sep 17 00:00:00 2001 From: Faizan Date: Wed, 14 Oct 2026 15:38:00 +0530 Subject: [PATCH 2/2] test(browser): enable loader type tests --- packages/browser/tsconfig.loader.test.json | 4 ++++ packages/browser/vite.config.ts | 6 ++++++ 2 files changed, 10 insertions(+) create mode 100644 packages/browser/tsconfig.loader.test.json diff --git a/packages/browser/tsconfig.loader.test.json b/packages/browser/tsconfig.loader.test.json new file mode 100644 index 000000000000..efe243dbdad2 --- /dev/null +++ b/packages/browser/tsconfig.loader.test.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.test.json", + "include": ["test/loader.test-d.ts"] +} diff --git a/packages/browser/vite.config.ts b/packages/browser/vite.config.ts index 0869faa66b74..f29f65d0a6a3 100644 --- a/packages/browser/vite.config.ts +++ b/packages/browser/vite.config.ts @@ -1,3 +1,4 @@ + import { defineConfig } from 'vitest/config'; import baseConfig from '../../vite/vite.config'; @@ -9,5 +10,10 @@ export default defineConfig({ fakeTimers: { toFake: ['setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'setImmediate', 'clearImmediate', 'Date'], }, + typecheck: { + enabled: true, + include: ['test/loader.test-d.ts'], + tsconfig: './tsconfig.loader.test.json', + }, }, });