Skip to content

Commit

Permalink
fix(deno): Build Sentry dependencies for tests (#9312)
Browse files Browse the repository at this point in the history
Co-authored-by: Luca Forstner <luca.forstner@sentry.io>
  • Loading branch information
timfish and lforst authored Oct 25, 2023
1 parent 9b0abcd commit f0b0281
Show file tree
Hide file tree
Showing 10 changed files with 100 additions and 42 deletions.
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions packages/deno/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
build-types
build-test
lib.deno.d.ts
4 changes: 3 additions & 1 deletion packages/deno/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
42 changes: 42 additions & 0 deletions packages/deno/rollup.test.config.js
Original file line number Diff line number Diff line change
@@ -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: '/// <reference types="./index.d.ts" />',
},
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, '') };
},
},
],
}),
];
8 changes: 4 additions & 4 deletions packages/deno/test/__snapshots__/mod.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -82,15 +82,15 @@ snapshot[`captureException 1`] = `
filename: "app:///test/mod.test.ts",
function: "<anonymous>",
in_app: true,
lineno: 42,
lineno: 46,
post_context: [
"",
" await delay(200);",
" await assertSnapshot(t, ev);",
"});",
"",
"Deno.test('captureMessage', async t => {",
" let ev: Event | undefined;",
" let ev: sentryTypes.Event | undefined;",
],
pre_context: [
" ev = event;",
Expand All @@ -108,7 +108,7 @@ snapshot[`captureException 1`] = `
filename: "app:///test/mod.test.ts",
function: "something",
in_app: true,
lineno: 39,
lineno: 43,
post_context: [
" }",
"",
Expand All @@ -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;",
" });",
Expand Down
4 changes: 4 additions & 0 deletions packages/deno/test/build.ts
Original file line number Diff line number Diff line change
@@ -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';
16 changes: 10 additions & 6 deletions packages/deno/test/mod.test.ts
Original file line number Diff line number Diff line change
@@ -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();
Expand All @@ -30,7 +34,7 @@ function delay(time: number): Promise<void> {
}

Deno.test('captureException', async t => {
let ev: Event | undefined;
let ev: sentryTypes.Event | undefined;
const [hub] = getTestClient(event => {
ev = event;
});
Expand All @@ -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;
});
Expand Down
27 changes: 14 additions & 13 deletions packages/deno/test/normalize.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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;
}

/**
Expand All @@ -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}}';
}
Expand All @@ -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}}';
}
Expand Down Expand Up @@ -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:'),
);
}

Expand Down
27 changes: 11 additions & 16 deletions packages/deno/test/transport.ts
Original file line number Diff line number Diff line change
@@ -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<TransportMakeRequestResponse> {
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<sentryTypes.TransportMakeRequestResponse> {
await callback(sentryUtils.parseEnvelope(request.body, new TextEncoder(), new TextDecoder()));

return Promise.resolve({
statusCode: 200,
});
}

return createTransport(options, doCallback);
return sentryCore.createTransport(options, doCallback);
};
}
10 changes: 10 additions & 0 deletions packages/deno/tsconfig.test.types.json
Original file line number Diff line number Diff line change
@@ -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"
}
}

0 comments on commit f0b0281

Please sign in to comment.