diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 95d746229277..b81c3da2b777 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,6 +172,9 @@ jobs: changed_bun_integration: ${{ needs.job_get_metadata.outputs.changed_ci == 'true' || contains(steps.checkForAffected.outputs.affected, '@sentry-internal/bun-integration-tests') }} + changed_deno_integration: + ${{ needs.job_get_metadata.outputs.changed_ci == 'true' || contains(steps.checkForAffected.outputs.affected, + '@sentry-internal/deno-integration-tests') }} changed_browser_integration: ${{ needs.job_get_metadata.outputs.changed_ci == 'true' || contains(steps.checkForAffected.outputs.affected, '@sentry-internal/browser-integration-tests') }} @@ -953,6 +956,36 @@ jobs: working-directory: dev-packages/bun-integration-tests run: yarn test + job_deno_integration_tests: + name: Deno Integration Tests + needs: [job_get_metadata, job_build] + if: needs.job_build.outputs.changed_deno_integration == 'true' || github.event_name != 'pull_request' + runs-on: ubuntu-24.04 + timeout-minutes: 15 + steps: + - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) + uses: actions/checkout@v6 + with: + ref: ${{ env.HEAD_COMMIT }} + - name: Set up Node + uses: actions/setup-node@v6 + with: + node-version-file: 'package.json' + - name: Set up Deno + uses: denoland/setup-deno@v2.0.4 + with: + deno-version: 'v2.8.0' + - name: Restore caches + uses: ./.github/actions/restore-cache + with: + dependency_cache_key: ${{ needs.job_build.outputs.dependency_cache_key }} + - name: Build @sentry/deno + working-directory: packages/deno + run: yarn build + - name: Run integration tests + working-directory: dev-packages/deno-integration-tests + run: yarn test + job_build_tarballs: name: Build tarballs # We want to run this if: @@ -1252,6 +1285,7 @@ jobs: job_cloudflare_integration_tests, job_bundler_plugin_integration_tests, job_bun_integration_tests, + job_deno_integration_tests, job_browser_playwright_tests, job_browser_loader_tests, job_e2e_tests, diff --git a/.gitignore b/.gitignore index 8dcadcf57b91..722587ec72c0 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,7 @@ tmp.js packages/deno/build-types packages/deno/build-test packages/deno/lib.deno.d.ts +dev-packages/deno-integration-tests/lib.deno.d.ts deno.lock # gatsby diff --git a/dev-packages/deno-integration-tests/.oxlintrc.json b/dev-packages/deno-integration-tests/.oxlintrc.json new file mode 100644 index 000000000000..b3472f86b67a --- /dev/null +++ b/dev-packages/deno-integration-tests/.oxlintrc.json @@ -0,0 +1,25 @@ +{ + "$schema": "../../node_modules/oxlint/configuration_schema.json", + "extends": ["../.oxlintrc.json"], + "env": { + "node": true + }, + "overrides": [ + { + "files": ["suites/**/*.ts", "suites/**/*.mjs"], + "globals": { + "Deno": "readonly" + }, + "rules": { + "typescript/ban-ts-comment": [ + "error", + { + "ts-ignore": "allow-with-description", + "ts-expect-error": true + } + ], + "import/first": "off" + } + } + ] +} diff --git a/dev-packages/deno-integration-tests/package.json b/dev-packages/deno-integration-tests/package.json new file mode 100644 index 000000000000..63bf1d98a691 --- /dev/null +++ b/dev-packages/deno-integration-tests/package.json @@ -0,0 +1,25 @@ +{ + "name": "@sentry-internal/deno-integration-tests", + "version": "10.62.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "private": true, + "scripts": { + "deno-types": "node ./scripts/download-deno-types.mjs", + "install:deno": "node ./scripts/install-deno.mjs", + "lint": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --type-aware", + "lint:fix": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --fix --type-aware", + "test": "run-s install:deno deno-types test:unit", + "test:unit": "deno test --allow-net --allow-read --allow-run --allow-env --no-check" + }, + "dependencies": { + "@sentry/core": "10.62.0", + "@sentry/deno": "10.62.0", + "mysql": "^2.18.1" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/dev-packages/deno-integration-tests/scripts/download-deno-types.mjs b/dev-packages/deno-integration-tests/scripts/download-deno-types.mjs new file mode 100644 index 000000000000..96cd724fbf99 --- /dev/null +++ b/dev-packages/deno-integration-tests/scripts/download-deno-types.mjs @@ -0,0 +1,7 @@ +import { existsSync, writeFileSync } from 'fs'; +import { download } from './download.mjs'; + +if (!existsSync('lib.deno.d.ts')) { + const code = await download('https://github.com/denoland/deno/releases/download/v2.8.0/lib.deno.d.ts'); + writeFileSync('lib.deno.d.ts', code); +} diff --git a/dev-packages/deno-integration-tests/scripts/download.mjs b/dev-packages/deno-integration-tests/scripts/download.mjs new file mode 100644 index 000000000000..25bcc39f583a --- /dev/null +++ b/dev-packages/deno-integration-tests/scripts/download.mjs @@ -0,0 +1,10 @@ +/** Download a url to a string */ +export async function download(url) { + try { + return await fetch(url).then(res => res.text()); + } catch (e) { + // eslint-disable-next-line no-console + console.error('Failed to download', url, e); + process.exit(1); + } +} diff --git a/dev-packages/deno-integration-tests/scripts/install-deno.mjs b/dev-packages/deno-integration-tests/scripts/install-deno.mjs new file mode 100644 index 000000000000..ad962778af88 --- /dev/null +++ b/dev-packages/deno-integration-tests/scripts/install-deno.mjs @@ -0,0 +1,26 @@ +import { execSync } from 'child_process'; + +import { download } from './download.mjs'; + +try { + execSync('deno --version', { stdio: 'inherit' }); +} catch { + // eslint-disable-next-line no-console + console.error('Deno is not installed. Installing...'); + if (process.platform === 'win32') { + // TODO + // eslint-disable-next-line no-console + console.error('Please install Deno manually: https://docs.deno.com/runtime/manual/getting_started/installation'); + process.exit(1); + } else { + const script = await download('https://deno.land/x/install/install.sh'); + + try { + execSync(script, { stdio: 'inherit' }); + } catch (e) { + // eslint-disable-next-line no-console + console.error('Failed to install Deno', e); + process.exit(1); + } + } +} diff --git a/packages/deno/test/orchestrion-mysql/scenario.mjs b/dev-packages/deno-integration-tests/suites/orchestrion-mysql/scenario.mjs similarity index 95% rename from packages/deno/test/orchestrion-mysql/scenario.mjs rename to dev-packages/deno-integration-tests/suites/orchestrion-mysql/scenario.mjs index d0adf6b1ae7a..19d9e7cf82fe 100644 --- a/packages/deno/test/orchestrion-mysql/scenario.mjs +++ b/dev-packages/deno-integration-tests/suites/orchestrion-mysql/scenario.mjs @@ -1,4 +1,4 @@ -// Spawned by orchestrion-mysql.test.ts via `deno run`. +// Spawned by test.ts via `deno run`. // // Importing `@sentry/deno/import` FIRST registers the orchestrion module hook, // so the subsequent `mysql` import is transformed to publish to the diff --git a/packages/deno/test/orchestrion-mysql.test.ts b/dev-packages/deno-integration-tests/suites/orchestrion-mysql/test.ts similarity index 94% rename from packages/deno/test/orchestrion-mysql.test.ts rename to dev-packages/deno-integration-tests/suites/orchestrion-mysql/test.ts index eac5d7dad6cb..7fea18ae25e1 100644 --- a/packages/deno/test/orchestrion-mysql.test.ts +++ b/dev-packages/deno-integration-tests/suites/orchestrion-mysql/test.ts @@ -2,11 +2,11 @@ import { tracingChannel } from 'node:diagnostics_channel'; import type { TransactionEvent } from '@sentry/core'; +import type { DenoClient } from '@sentry/deno'; +import { getCurrentScope, getGlobalScope, getIsolationScope, init, startSpan } from '@sentry/deno'; import { assert } from 'https://deno.land/std@0.212.0/assert/assert.ts'; import { assertEquals } from 'https://deno.land/std@0.212.0/assert/assert_equals.ts'; import { assertExists } from 'https://deno.land/std@0.212.0/assert/assert_exists.ts'; -import type { DenoClient } from '../build/esm/index.js'; -import { getCurrentScope, getGlobalScope, getIsolationScope, init, startSpan } from '../build/esm/index.js'; function resetGlobals(): void { getCurrentScope().clear(); @@ -65,10 +65,11 @@ Deno.test('denoMysqlIntegration: included in default integrations (Deno 2.8.0+)' // import inside the entry graph in Deno 2.8.0 through 2.8.2. // TODO: revisit a `--import` or `--preload` approach once Deno 2.8.3 ships. Deno.test('@sentry/deno/import: transforms mysql so it publishes the orchestrion channel', async () => { - const scenario = new URL('./orchestrion-mysql/scenario.mjs', import.meta.url); + const scenario = new URL('./scenario.mjs', import.meta.url); - // packages/deno — where node_modules resolves - const cwd = new URL('../', import.meta.url); + // The package root — where `node_modules` (and thus `@sentry/deno` / `mysql`) + // resolves for the spawned `deno run`. + const cwd = new URL('../../', import.meta.url); const command = new Deno.Command('deno', { args: ['run', '--allow-all', scenario.pathname], diff --git a/dev-packages/deno-integration-tests/tsconfig.json b/dev-packages/deno-integration-tests/tsconfig.json new file mode 100644 index 000000000000..c4b6e58c7b59 --- /dev/null +++ b/dev-packages/deno-integration-tests/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "include": ["./lib.deno.d.ts", "suites/**/*"], + "compilerOptions": { + "lib": ["esnext"], + "target": "esnext" + } +} diff --git a/package.json b/package.json index 96afe5cc43f9..0ed1df51c77e 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,11 @@ "dedupe-deps:check": "yarn-deduplicate yarn.lock --list --fail", "dedupe-deps:fix": "yarn-deduplicate yarn.lock", "postpublish": "nx run-many -t postpublish --parallel=1", - "test": "nx run-many -t test --exclude \"@sentry-internal/{browser-integration-tests,bun-integration-tests,e2e-tests,integration-shims,node-integration-tests,node-core-integration-tests,cloudflare-integration-tests,bundler-plugin-integration-tests}\"", + "test": "nx run-many -t test --exclude \"@sentry-internal/{browser-integration-tests,bun-integration-tests,deno-integration-tests,e2e-tests,integration-shims,node-integration-tests,node-core-integration-tests,cloudflare-integration-tests,bundler-plugin-integration-tests}\"", "test:scripts": "vitest run scripts/*.test.ts", - "test:unit": "nx run-many -t test:unit --exclude \"@sentry-internal/{browser-integration-tests,bun-integration-tests,e2e-tests,integration-shims,node-integration-tests,node-core-integration-tests,cloudflare-integration-tests,bundler-plugin-integration-tests}\"", + "test:unit": "nx run-many -t test:unit --exclude \"@sentry-internal/{browser-integration-tests,bun-integration-tests,deno-integration-tests,e2e-tests,integration-shims,node-integration-tests,node-core-integration-tests,cloudflare-integration-tests,bundler-plugin-integration-tests}\"", "test:update-snapshots": "nx run-many -t test:update-snapshots", - "test:pr": "nx affected -t test --exclude \"@sentry-internal/{browser-integration-tests,bun-integration-tests,e2e-tests,integration-shims,node-integration-tests,node-core-integration-tests,cloudflare-integration-tests,bundler-plugin-integration-tests}\"", + "test:pr": "nx affected -t test --exclude \"@sentry-internal/{browser-integration-tests,bun-integration-tests,deno-integration-tests,e2e-tests,integration-shims,node-integration-tests,node-core-integration-tests,cloudflare-integration-tests,bundler-plugin-integration-tests}\"", "test:pr:browser": "UNIT_TEST_ENV=browser ts-node ./scripts/ci-unit-tests.ts --affected", "test:pr:node": "UNIT_TEST_ENV=node ts-node ./scripts/ci-unit-tests.ts --affected", "test:ci:browser": "UNIT_TEST_ENV=browser ts-node ./scripts/ci-unit-tests.ts", @@ -105,6 +105,7 @@ "dev-packages/e2e-tests", "dev-packages/node-integration-tests", "dev-packages/bun-integration-tests", + "dev-packages/deno-integration-tests", "dev-packages/cloudflare-integration-tests", "dev-packages/node-core-integration-tests", "dev-packages/test-utils", diff --git a/packages/deno/package.json b/packages/deno/package.json index 184b628adf21..69f963324955 100644 --- a/packages/deno/package.json +++ b/packages/deno/package.json @@ -31,9 +31,6 @@ "@sentry/core": "10.62.0", "@sentry/server-utils": "10.62.0" }, - "devDependencies": { - "mysql": "^2.18.1" - }, "scripts": { "deno-types": "node ./scripts/download-deno-types.mjs", "build": "run-s build:transpile build:types",