From d7561a90ba3571f87e82d0343a4ce2196f1227b9 Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 15:45:18 -0500 Subject: [PATCH 01/12] fix: ignore missing @opentelemetry/api (#14774) --- packages/kit/src/exports/public.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 1ef333310326..c8e9f6cd224d 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -25,6 +25,7 @@ import { LayoutParams as AppLayoutParams, ResolvedPathname } from '$app/types'; +// @ts-ignore - some users might not have this installed. import { Span } from '@opentelemetry/api'; export { PrerenderOption } from '../types/private.js'; From 6dfa7546c8efe47a7e14f6afc15057e20b38b0f1 Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 15:56:00 -0500 Subject: [PATCH 02/12] Added changeset --- pnpm-lock.yaml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3be6351ffb43..eae19dbb96f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -633,27 +633,6 @@ importers: specifier: 'catalog:' version: 6.3.6(@types/node@18.19.119)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) - packages/kit/test/apps/async: - devDependencies: - '@sveltejs/kit': - specifier: workspace:^ - version: link:../../.. - '@sveltejs/vite-plugin-svelte': - specifier: 'catalog:' - version: 6.0.0-next.3(svelte@5.42.2)(vite@6.3.6(@types/node@18.19.119)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) - svelte: - specifier: 'catalog:' - version: 5.42.2 - svelte-check: - specifier: 'catalog:' - version: 4.1.1(picomatch@4.0.3)(svelte@5.42.2)(typescript@5.8.3) - typescript: - specifier: ^5.5.4 - version: 5.8.3 - vite: - specifier: 'catalog:' - version: 6.3.6(@types/node@18.19.119)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) - packages/kit/test/apps/basics: devDependencies: '@opentelemetry/api': From ee52ffcf998000f0e693ae36459d5d8257675b13 Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 15:57:52 -0500 Subject: [PATCH 03/12] Actually added changeset --- .changeset/fuzzy-lies-begin.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fuzzy-lies-begin.md diff --git a/.changeset/fuzzy-lies-begin.md b/.changeset/fuzzy-lies-begin.md new file mode 100644 index 000000000000..91bcd75f63e7 --- /dev/null +++ b/.changeset/fuzzy-lies-begin.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Fixed downstream TS errors due to missing @opentelemetry/api From cf731f42c90f4eeb57735ae218588939682e1fe2 Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 18:01:47 -0500 Subject: [PATCH 04/12] Update .changeset/fuzzy-lies-begin.md Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/fuzzy-lies-begin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/fuzzy-lies-begin.md b/.changeset/fuzzy-lies-begin.md index 91bcd75f63e7..762db0c2af6d 100644 --- a/.changeset/fuzzy-lies-begin.md +++ b/.changeset/fuzzy-lies-begin.md @@ -2,4 +2,4 @@ '@sveltejs/kit': patch --- -Fixed downstream TS errors due to missing @opentelemetry/api +fix: ignore TypeScript errors when `@opentelemetry/api` is not installed From 4e32ec0e11f751d6ea6721ecbbe9a5b1996aff5f Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 21:55:46 -0500 Subject: [PATCH 05/12] Bare minimum type stubs --- .../src/exports/internal/optional-deps.d.ts | 18 ++++++++++++++++++ packages/kit/src/exports/public.d.ts | 2 +- .../kit/src/runtime/telemetry/record_span.js | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 packages/kit/src/exports/internal/optional-deps.d.ts diff --git a/packages/kit/src/exports/internal/optional-deps.d.ts b/packages/kit/src/exports/internal/optional-deps.d.ts new file mode 100644 index 000000000000..1a34a4c72e07 --- /dev/null +++ b/packages/kit/src/exports/internal/optional-deps.d.ts @@ -0,0 +1,18 @@ + +/* Users may not have these packages installed, this prevents errors when using `tsc` without them. */ +/* eslint-disable @typescript-eslint/no-empty-object-type */ +declare module '@opentelemetry/api' { + type _ = any; + + export interface Span extends _ {} + export interface Tracer extends _ {} + export interface SpanContext extends _ {} + export enum SpanStatusCode { + ERROR = 2 + } + export interface PropagationAPI extends _ {} + export interface ContextAPI extends _ {} + export const trace: Tracer; + export const propagation: PropagationAPI; + export const context: ContextAPI; +} diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index c8e9f6cd224d..e59147ed3d81 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -25,7 +25,7 @@ import { LayoutParams as AppLayoutParams, ResolvedPathname } from '$app/types'; -// @ts-ignore - some users might not have this installed. + import { Span } from '@opentelemetry/api'; export { PrerenderOption } from '../types/private.js'; diff --git a/packages/kit/src/runtime/telemetry/record_span.js b/packages/kit/src/runtime/telemetry/record_span.js index eaabb1ea5e4c..1b20d624e5ec 100644 --- a/packages/kit/src/runtime/telemetry/record_span.js +++ b/packages/kit/src/runtime/telemetry/record_span.js @@ -11,7 +11,7 @@ export async function record_span({ name, attributes, fn }) { const { SpanStatusCode, tracer } = await otel; - return tracer.startActiveSpan(name, { attributes }, async (span) => { + return tracer.startActiveSpan(name, { attributes }, async (/** @type {import('@opentelemetry/api').Span} */ span) => { try { return await fn(span); } catch (error) { From 2f5aff050eacc206ec639bfd941cb5c441934a9c Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 21:58:17 -0500 Subject: [PATCH 06/12] Automatic formatting --- .../src/exports/internal/optional-deps.d.ts | 1 - .../kit/src/runtime/telemetry/record_span.js | 90 ++++++++++--------- 2 files changed, 47 insertions(+), 44 deletions(-) diff --git a/packages/kit/src/exports/internal/optional-deps.d.ts b/packages/kit/src/exports/internal/optional-deps.d.ts index 1a34a4c72e07..20766faa262a 100644 --- a/packages/kit/src/exports/internal/optional-deps.d.ts +++ b/packages/kit/src/exports/internal/optional-deps.d.ts @@ -1,4 +1,3 @@ - /* Users may not have these packages installed, this prevents errors when using `tsc` without them. */ /* eslint-disable @typescript-eslint/no-empty-object-type */ declare module '@opentelemetry/api' { diff --git a/packages/kit/src/runtime/telemetry/record_span.js b/packages/kit/src/runtime/telemetry/record_span.js index 1b20d624e5ec..5746d43f0b1a 100644 --- a/packages/kit/src/runtime/telemetry/record_span.js +++ b/packages/kit/src/runtime/telemetry/record_span.js @@ -11,55 +11,59 @@ export async function record_span({ name, attributes, fn }) { const { SpanStatusCode, tracer } = await otel; - return tracer.startActiveSpan(name, { attributes }, async (/** @type {import('@opentelemetry/api').Span} */ span) => { - try { - return await fn(span); - } catch (error) { - if (error instanceof HttpError) { - span.setAttributes({ - [`${name}.result.type`]: 'known_error', - [`${name}.result.status`]: error.status, - [`${name}.result.message`]: error.body.message - }); - if (error.status >= 500) { + return tracer.startActiveSpan( + name, + { attributes }, + async (/** @type {import('@opentelemetry/api').Span} */ span) => { + try { + return await fn(span); + } catch (error) { + if (error instanceof HttpError) { + span.setAttributes({ + [`${name}.result.type`]: 'known_error', + [`${name}.result.status`]: error.status, + [`${name}.result.message`]: error.body.message + }); + if (error.status >= 500) { + span.recordException({ + name: 'HttpError', + message: error.body.message + }); + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error.body.message + }); + } + } else if (error instanceof Redirect) { + span.setAttributes({ + [`${name}.result.type`]: 'redirect', + [`${name}.result.status`]: error.status, + [`${name}.result.location`]: error.location + }); + } else if (error instanceof Error) { + span.setAttributes({ + [`${name}.result.type`]: 'unknown_error' + }); span.recordException({ - name: 'HttpError', - message: error.body.message + name: error.name, + message: error.message, + stack: error.stack }); span.setStatus({ code: SpanStatusCode.ERROR, - message: error.body.message + message: error.message }); + } else { + span.setAttributes({ + [`${name}.result.type`]: 'unknown_error' + }); + span.setStatus({ code: SpanStatusCode.ERROR }); } - } else if (error instanceof Redirect) { - span.setAttributes({ - [`${name}.result.type`]: 'redirect', - [`${name}.result.status`]: error.status, - [`${name}.result.location`]: error.location - }); - } else if (error instanceof Error) { - span.setAttributes({ - [`${name}.result.type`]: 'unknown_error' - }); - span.recordException({ - name: error.name, - message: error.message, - stack: error.stack - }); - span.setStatus({ - code: SpanStatusCode.ERROR, - message: error.message - }); - } else { - span.setAttributes({ - [`${name}.result.type`]: 'unknown_error' - }); - span.setStatus({ code: SpanStatusCode.ERROR }); - } - throw error; - } finally { - span.end(); + throw error; + } finally { + span.end(); + } } - }); + ); } From aba412282783251d91730b01428d4ae58ffd1cbb Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 22:32:01 -0500 Subject: [PATCH 07/12] Fix missing @opentelemetry/api types, for real this time --- packages/kit/scripts/generate-dts.js | 3 ++- .../kit/src/exports/internal/optional-deps.d.ts | 17 ----------------- packages/kit/src/exports/internal/otel.d.ts | 12 ++++++++++++ packages/kit/src/runtime/telemetry/otel.js | 6 +++--- packages/kit/types/index.d.ts | 14 ++++++++++++++ 5 files changed, 31 insertions(+), 21 deletions(-) delete mode 100644 packages/kit/src/exports/internal/optional-deps.d.ts create mode 100644 packages/kit/src/exports/internal/otel.d.ts diff --git a/packages/kit/scripts/generate-dts.js b/packages/kit/scripts/generate-dts.js index b470d6d63494..6e8807755015 100644 --- a/packages/kit/scripts/generate-dts.js +++ b/packages/kit/scripts/generate-dts.js @@ -15,7 +15,8 @@ await createBundle({ '$app/paths': 'src/runtime/app/paths/public.d.ts', '$app/server': 'src/runtime/app/server/index.js', '$app/state': 'src/runtime/app/state/index.js', - '$app/stores': 'src/runtime/app/stores.js' + '$app/stores': 'src/runtime/app/stores.js', + '@opentelemetry/api': 'src/exports/internal/otel.d.ts' }, include: ['src'] }); diff --git a/packages/kit/src/exports/internal/optional-deps.d.ts b/packages/kit/src/exports/internal/optional-deps.d.ts deleted file mode 100644 index 20766faa262a..000000000000 --- a/packages/kit/src/exports/internal/optional-deps.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* Users may not have these packages installed, this prevents errors when using `tsc` without them. */ -/* eslint-disable @typescript-eslint/no-empty-object-type */ -declare module '@opentelemetry/api' { - type _ = any; - - export interface Span extends _ {} - export interface Tracer extends _ {} - export interface SpanContext extends _ {} - export enum SpanStatusCode { - ERROR = 2 - } - export interface PropagationAPI extends _ {} - export interface ContextAPI extends _ {} - export const trace: Tracer; - export const propagation: PropagationAPI; - export const context: ContextAPI; -} diff --git a/packages/kit/src/exports/internal/otel.d.ts b/packages/kit/src/exports/internal/otel.d.ts new file mode 100644 index 000000000000..4a73c776e4da --- /dev/null +++ b/packages/kit/src/exports/internal/otel.d.ts @@ -0,0 +1,12 @@ +/* Users may not have this package installed, this prevents errors when using `tsc` without it. */ +/* eslint-disable @typescript-eslint/no-empty-object-type */ + +export interface Span {} + +export interface Tracer {} + +export interface SpanContext {} + +export interface PropagationAPI {} + +export interface ContextAPI {} diff --git a/packages/kit/src/runtime/telemetry/otel.js b/packages/kit/src/runtime/telemetry/otel.js index 044f6db5a4f9..299865e0c2ed 100644 --- a/packages/kit/src/runtime/telemetry/otel.js +++ b/packages/kit/src/runtime/telemetry/otel.js @@ -1,11 +1,11 @@ -/** @import { Tracer, SpanStatusCode, PropagationAPI, ContextAPI } from '@opentelemetry/api' */ +/** @import { Tracer, PropagationAPI, ContextAPI } from '@opentelemetry/api' */ -/** @type {Promise<{ tracer: Tracer, SpanStatusCode: typeof SpanStatusCode, propagation: PropagationAPI, context: ContextAPI }> | null} */ +/** @type {Promise<{ tracer: Tracer, SpanStatusCode: { ERROR: number }, propagation: PropagationAPI, context: ContextAPI }> | null} */ export let otel = null; if (__SVELTEKIT_SERVER_TRACING_ENABLED__) { otel = import('@opentelemetry/api') - .then((module) => { + .then((/** @type {any} */ module) => { return { tracer: module.trace.getTracer('sveltekit'), propagation: module.propagation, diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 9705e4a0b9bd..39fc7df3abc0 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -3371,6 +3371,20 @@ declare module '$app/stores' { check(): Promise; }; + export {}; +} + +declare module '@opentelemetry/api' { + export interface Span {} + + export interface Tracer {} + + export interface SpanContext {} + + export interface PropagationAPI {} + + export interface ContextAPI {} + export {}; }/** * It's possible to tell SvelteKit how to type objects inside your app by declaring the `App` namespace. By default, a new project will have a file called `src/app.d.ts` containing the following: From e47e9d6c9e8a5809156cb1bbeccfac5670970454 Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 22:39:12 -0500 Subject: [PATCH 08/12] Automatic prepublishOnly --- packages/kit/types/index.d.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 39fc7df3abc0..7c36ff8f6aff 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -3375,6 +3375,9 @@ declare module '$app/stores' { } declare module '@opentelemetry/api' { + /* Users may not have this package installed, this prevents errors when using `tsc` without it. */ + /* eslint-disable @typescript-eslint/no-empty-object-type */ + export interface Span {} export interface Tracer {} From d40b81ac4418bc9ffda002ffa04dc4929d7c7452 Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 22:49:22 -0500 Subject: [PATCH 09/12] Ignore augmentation issues with otel --- packages/kit/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kit/tsconfig.json b/packages/kit/tsconfig.json index f94a6a9ec71c..df060a094523 100644 --- a/packages/kit/tsconfig.json +++ b/packages/kit/tsconfig.json @@ -8,6 +8,7 @@ "module": "node16", "moduleResolution": "node16", "allowSyntheticDefaultImports": true, + "skipLibCheck": true, "paths": { "@sveltejs/kit": ["./src/exports/public.d.ts"], "@sveltejs/kit/node": ["./src/exports/node/index.js"], From b1d2e879a057984e9e5edbc744964ef142933c76 Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 22:50:34 -0500 Subject: [PATCH 10/12] Hopefully fix missing property errors --- packages/kit/src/exports/internal/otel.d.ts | 12 +++++++----- packages/kit/types/index.d.ts | 14 ++++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/kit/src/exports/internal/otel.d.ts b/packages/kit/src/exports/internal/otel.d.ts index 4a73c776e4da..f1e8f252ef4f 100644 --- a/packages/kit/src/exports/internal/otel.d.ts +++ b/packages/kit/src/exports/internal/otel.d.ts @@ -1,12 +1,14 @@ /* Users may not have this package installed, this prevents errors when using `tsc` without it. */ /* eslint-disable @typescript-eslint/no-empty-object-type */ -export interface Span {} +type _any = any; -export interface Tracer {} +export interface Span extends _any {} -export interface SpanContext {} +export interface Tracer extends _any {} -export interface PropagationAPI {} +export interface SpanContext extends _any {} -export interface ContextAPI {} +export interface PropagationAPI extends _any {} + +export interface ContextAPI extends _any {} diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 7c36ff8f6aff..03288b47b18c 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2721,7 +2721,7 @@ declare module '@sveltejs/kit' { class Redirect_1 { constructor(status: 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308, location: string); - status: 301 | 302 | 303 | 307 | 308 | 300 | 304 | 305 | 306; + status: 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308; location: string; } @@ -3378,15 +3378,17 @@ declare module '@opentelemetry/api' { /* Users may not have this package installed, this prevents errors when using `tsc` without it. */ /* eslint-disable @typescript-eslint/no-empty-object-type */ - export interface Span {} + type _any = any; + + export interface Span extends _any {} - export interface Tracer {} + export interface Tracer extends _any {} - export interface SpanContext {} + export interface SpanContext extends _any {} - export interface PropagationAPI {} + export interface PropagationAPI extends _any {} - export interface ContextAPI {} + export interface ContextAPI extends _any {} export {}; }/** From 02ee92a9e3ca3420f43f423cf147fd1bd5d9ce3b Mon Sep 17 00:00:00 2001 From: James Prevett Date: Wed, 29 Oct 2025 23:01:10 -0500 Subject: [PATCH 11/12] Fix where otel is ignored --- packages/kit/test/apps/basics/tsconfig.json | 3 ++- packages/kit/tsconfig.json | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/test/apps/basics/tsconfig.json b/packages/kit/test/apps/basics/tsconfig.json index 1d665886266b..8236dd184898 100644 --- a/packages/kit/test/apps/basics/tsconfig.json +++ b/packages/kit/test/apps/basics/tsconfig.json @@ -4,7 +4,8 @@ "checkJs": true, "esModuleInterop": true, "noEmit": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "skipLibCheck": true }, "extends": "./.svelte-kit/tsconfig.json" } diff --git a/packages/kit/tsconfig.json b/packages/kit/tsconfig.json index df060a094523..f94a6a9ec71c 100644 --- a/packages/kit/tsconfig.json +++ b/packages/kit/tsconfig.json @@ -8,7 +8,6 @@ "module": "node16", "moduleResolution": "node16", "allowSyntheticDefaultImports": true, - "skipLibCheck": true, "paths": { "@sveltejs/kit": ["./src/exports/public.d.ts"], "@sveltejs/kit/node": ["./src/exports/node/index.js"], From c83f9f3772c19c3d8101ba54992f35d12127d8a3 Mon Sep 17 00:00:00 2001 From: James Prevett Date: Thu, 30 Oct 2025 23:29:28 -0500 Subject: [PATCH 12/12] Automatic prepublishOnly --- packages/kit/types/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 03288b47b18c..941177ee39e7 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2721,7 +2721,7 @@ declare module '@sveltejs/kit' { class Redirect_1 { constructor(status: 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308, location: string); - status: 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308; + status: 301 | 302 | 303 | 307 | 308 | 300 | 304 | 305 | 306; location: string; }