diff --git a/.gitignore b/.gitignore
index d6eee47e4eed..777b23658572 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,8 +21,6 @@ jest/transformers/*.js
# node tarballs
packages/*/sentry-*.tgz
.nxcache
-# The Deno types are downloaded before building
-packages/deno/lib.deno.d.ts
# logs
yarn-error.log
diff --git a/packages/deno/.gitignore b/packages/deno/.gitignore
index 299ae4a5c2fd..d2de144a353c 100644
--- a/packages/deno/.gitignore
+++ b/packages/deno/.gitignore
@@ -1 +1,3 @@
build-types
+build-test
+lib.deno.d.ts
diff --git a/packages/deno/package.json b/packages/deno/package.json
index 54c9d174f018..24878690baad 100644
--- a/packages/deno/package.json
+++ b/packages/deno/package.json
@@ -48,7 +48,9 @@
"lint:eslint": "eslint . --format stylish",
"lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"",
"install:deno": "node ./scripts/install-deno.mjs",
- "test": "run-s deno-types install:deno test:types test:unit",
+ "pretest": "run-s deno-types test:build",
+ "test": "run-s install:deno test:types test:unit",
+ "test:build": "tsc -p tsconfig.test.types.json && rollup -c rollup.test.config.js",
"test:types": "deno check ./build/index.js",
"test:unit": "deno test --allow-read --allow-run",
"test:unit:update": "deno test --allow-read --allow-write --allow-run -- --update",
diff --git a/packages/deno/rollup.test.config.js b/packages/deno/rollup.test.config.js
new file mode 100644
index 000000000000..3947d0e94b16
--- /dev/null
+++ b/packages/deno/rollup.test.config.js
@@ -0,0 +1,42 @@
+// @ts-check
+import dts from 'rollup-plugin-dts';
+import nodeResolve from '@rollup/plugin-node-resolve';
+import sucrase from '@rollup/plugin-sucrase';
+import { defineConfig } from 'rollup';
+
+export default [
+ defineConfig({
+ input: ['test/build.ts'],
+ output: {
+ file: 'build-test/index.js',
+ sourcemap: true,
+ preserveModules: false,
+ strict: false,
+ freeze: false,
+ interop: 'auto',
+ format: 'esm',
+ banner: '/// ',
+ },
+ plugins: [
+ nodeResolve({
+ extensions: ['.mjs', '.js', '.json', '.node', '.ts', '.tsx'],
+ }),
+ sucrase({ transforms: ['typescript'] }),
+ ],
+ }),
+ defineConfig({
+ input: './build-test/build.d.ts',
+ output: [{ file: 'build-test/index.d.ts', format: 'es' }],
+ plugins: [
+ dts({ respectExternal: true }),
+ // The bundled types contain a declaration for the __DEBUG_BUILD__ global
+ // This can result in errors about duplicate global declarations so we strip it out!
+ {
+ name: 'strip-global',
+ renderChunk(code) {
+ return { code: code.replace(/declare global \{\s*const __DEBUG_BUILD__: boolean;\s*\}/g, '') };
+ },
+ },
+ ],
+ }),
+];
diff --git a/packages/deno/test/__snapshots__/mod.test.ts.snap b/packages/deno/test/__snapshots__/mod.test.ts.snap
index 2cdb246a8e8b..501508e1a268 100644
--- a/packages/deno/test/__snapshots__/mod.test.ts.snap
+++ b/packages/deno/test/__snapshots__/mod.test.ts.snap
@@ -82,7 +82,7 @@ snapshot[`captureException 1`] = `
filename: "app:///test/mod.test.ts",
function: "",
in_app: true,
- lineno: 42,
+ lineno: 46,
post_context: [
"",
" await delay(200);",
@@ -90,7 +90,7 @@ snapshot[`captureException 1`] = `
"});",
"",
"Deno.test('captureMessage', async t => {",
- " let ev: Event | undefined;",
+ " let ev: sentryTypes.Event | undefined;",
],
pre_context: [
" ev = event;",
@@ -108,7 +108,7 @@ snapshot[`captureException 1`] = `
filename: "app:///test/mod.test.ts",
function: "something",
in_app: true,
- lineno: 39,
+ lineno: 43,
post_context: [
" }",
"",
@@ -120,7 +120,7 @@ snapshot[`captureException 1`] = `
],
pre_context: [
"Deno.test('captureException', async t => {",
- " let ev: Event | undefined;",
+ " let ev: sentryTypes.Event | undefined;",
" const [hub] = getTestClient(event => {",
" ev = event;",
" });",
diff --git a/packages/deno/test/build.ts b/packages/deno/test/build.ts
new file mode 100644
index 000000000000..b593fed2f4dd
--- /dev/null
+++ b/packages/deno/test/build.ts
@@ -0,0 +1,4 @@
+// We use this as the entry point to bundle Sentry dependencies that are used by the tests.
+export * as sentryTypes from '@sentry/types';
+export * as sentryUtils from '@sentry/utils';
+export * as sentryCore from '@sentry/core';
diff --git a/packages/deno/test/mod.test.ts b/packages/deno/test/mod.test.ts
index 7f57616816d5..f457033efe96 100644
--- a/packages/deno/test/mod.test.ts
+++ b/packages/deno/test/mod.test.ts
@@ -1,20 +1,24 @@
import { assertEquals } from 'https://deno.land/std@0.202.0/assert/assert_equals.ts';
import { assertSnapshot } from 'https://deno.land/std@0.202.0/testing/snapshot.ts';
-import { createStackParser, nodeStackLineParser } from '../../utils/build/esm/index.js';
+import type { sentryTypes } from '../build-test/index.js';
+import { sentryUtils } from '../build-test/index.js';
import { defaultIntegrations, DenoClient, Hub, Scope } from '../build/index.js';
import { getNormalizedEvent } from './normalize.ts';
import { makeTestTransport } from './transport.ts';
-function getTestClient(callback: (event?: Event) => void, integrations: any[] = []): [Hub, DenoClient] {
+function getTestClient(
+ callback: (event?: sentryTypes.Event) => void,
+ integrations: sentryTypes.Integration[] = [],
+): [Hub, DenoClient] {
const client = new DenoClient({
dsn: 'https://233a45e5efe34c47a3536797ce15dafa@nothing.here/5650507',
debug: true,
integrations: [...defaultIntegrations, ...integrations],
- stackParser: createStackParser(nodeStackLineParser()),
+ stackParser: sentryUtils.createStackParser(sentryUtils.nodeStackLineParser()),
transport: makeTestTransport(envelope => {
callback(getNormalizedEvent(envelope));
- }) as any,
+ }),
});
const scope = new Scope();
@@ -30,7 +34,7 @@ function delay(time: number): Promise {
}
Deno.test('captureException', async t => {
- let ev: Event | undefined;
+ let ev: sentryTypes.Event | undefined;
const [hub] = getTestClient(event => {
ev = event;
});
@@ -46,7 +50,7 @@ Deno.test('captureException', async t => {
});
Deno.test('captureMessage', async t => {
- let ev: Event | undefined;
+ let ev: sentryTypes.Event | undefined;
const [hub] = getTestClient(event => {
ev = event;
});
diff --git a/packages/deno/test/normalize.ts b/packages/deno/test/normalize.ts
index 45f631116955..64295932e00d 100644
--- a/packages/deno/test/normalize.ts
+++ b/packages/deno/test/normalize.ts
@@ -1,20 +1,21 @@
/* eslint-disable complexity */
-import { forEachEnvelopeItem } from '../../utils/build/esm/index.js';
+import type { sentryTypes } from '../build-test/index.js';
+import { sentryUtils } from '../build-test/index.js';
-type EventOrSession = any;
+type EventOrSession = sentryTypes.Event | sentryTypes.Transaction | sentryTypes.Session;
-export function getNormalizedEvent(envelope: any): any | undefined {
- let event: any | undefined;
+export function getNormalizedEvent(envelope: sentryTypes.Envelope): sentryTypes.Event | undefined {
+ let event: sentryTypes.Event | undefined;
- forEachEnvelopeItem(envelope, (item: any) => {
+ sentryUtils.forEachEnvelopeItem(envelope, item => {
const [headers, body] = item;
if (headers.type === 'event') {
- event = body;
+ event = body as sentryTypes.Event;
}
});
- return normalize(event) as any | undefined;
+ return normalize(event) as sentryTypes.Event | undefined;
}
export function normalize(event: EventOrSession | undefined): EventOrSession | undefined {
@@ -23,14 +24,14 @@ export function normalize(event: EventOrSession | undefined): EventOrSession | u
}
if (eventIsSession(event)) {
- return normalizeSession(event);
+ return normalizeSession(event as sentryTypes.Session);
} else {
- return normalizeEvent(event);
+ return normalizeEvent(event as sentryTypes.Event);
}
}
export function eventIsSession(data: EventOrSession): boolean {
- return !!data?.sid;
+ return !!(data as sentryTypes.Session)?.sid;
}
/**
@@ -39,7 +40,7 @@ export function eventIsSession(data: EventOrSession): boolean {
* All properties that are timestamps, versions, ids or variables that may vary
* by platform are replaced with placeholder strings
*/
-function normalizeSession(session: any): any {
+function normalizeSession(session: sentryTypes.Session): sentryTypes.Session {
if (session.sid) {
session.sid = '{{id}}';
}
@@ -65,7 +66,7 @@ function normalizeSession(session: any): any {
* All properties that are timestamps, versions, ids or variables that may vary
* by platform are replaced with placeholder strings
*/
-function normalizeEvent(event: any): any {
+function normalizeEvent(event: sentryTypes.Event): sentryTypes.Event {
if (event.sdk?.version) {
event.sdk.version = '{{version}}';
}
@@ -153,7 +154,7 @@ function normalizeEvent(event: any): any {
if (event.exception?.values?.[0].stacktrace?.frames) {
// Exlcude Deno frames since these may change between versions
event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames.filter(
- (frame: any) => !frame.filename?.includes('deno:'),
+ frame => !frame.filename?.includes('deno:'),
);
}
diff --git a/packages/deno/test/transport.ts b/packages/deno/test/transport.ts
index 2eaeed6eeef6..47cb86622cb7 100644
--- a/packages/deno/test/transport.ts
+++ b/packages/deno/test/transport.ts
@@ -1,30 +1,25 @@
-import { createTransport } from 'npm:@sentry/core';
-import type {
- BaseTransportOptions,
- Envelope,
- Transport,
- TransportMakeRequestResponse,
- TransportRequest,
-} from 'npm:@sentry/types';
-import { parseEnvelope } from 'npm:@sentry/utils';
+import type { sentryTypes } from '../build-test/index.js';
+import { sentryCore, sentryUtils } from '../build-test/index.js';
-export interface TestTransportOptions extends BaseTransportOptions {
- callback: (envelope: Envelope) => void;
+export interface TestTransportOptions extends sentryTypes.BaseTransportOptions {
+ callback: (envelope: sentryTypes.Envelope) => void;
}
/**
* Creates a Transport that uses the Fetch API to send events to Sentry.
*/
-export function makeTestTransport(callback: (envelope: Envelope) => void) {
- return (options: BaseTransportOptions): Transport => {
- async function doCallback(request: TransportRequest): Promise {
- await callback(parseEnvelope(request.body, new TextEncoder(), new TextDecoder()));
+export function makeTestTransport(callback: (envelope: sentryTypes.Envelope) => void) {
+ return (options: sentryTypes.BaseTransportOptions): sentryTypes.Transport => {
+ async function doCallback(
+ request: sentryTypes.TransportRequest,
+ ): Promise {
+ await callback(sentryUtils.parseEnvelope(request.body, new TextEncoder(), new TextDecoder()));
return Promise.resolve({
statusCode: 200,
});
}
- return createTransport(options, doCallback);
+ return sentryCore.createTransport(options, doCallback);
};
}
diff --git a/packages/deno/tsconfig.test.types.json b/packages/deno/tsconfig.test.types.json
new file mode 100644
index 000000000000..1cac4cb38a90
--- /dev/null
+++ b/packages/deno/tsconfig.test.types.json
@@ -0,0 +1,10 @@
+{
+ "extends": "./tsconfig.json",
+ "include": ["./lib.deno.d.ts", "test/build.ts"],
+ "compilerOptions": {
+ "declaration": true,
+ "declarationMap": false,
+ "emitDeclarationOnly": true,
+ "outDir": "build-test"
+ }
+}