Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(deno): Build Sentry dependencies for tests #9312

Merged
merged 3 commits into from
Oct 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
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"
}
}