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" + } +}