From cac27c783ed0c12011fa223825b6877dc6760825 Mon Sep 17 00:00:00 2001 From: Nic Polumeyv Date: Thu, 20 Aug 2026 16:51:54 -0400 Subject: [PATCH] feat: export RenderOutput, SyncRenderOutput, Csp and Sha256Source from svelte/server (#18648) `render` returns `RenderOutput` and takes `csp: Csp`, but both are declared in `src/internal/server/types.d.ts` and never exported. The generated `svelte/server` block has them without `export`, so nothing outside the repo can import them and the docs page names `RenderOutput` as the return type with nothing on the page defining it. Moves them into `src/server/public.d.ts` the way `svelte/motion` went in #17967, rather than re-exporting internals. --- .changeset/olive-jars-repeat.md | 5 +++++ packages/svelte/src/internal/server/index.js | 2 +- .../svelte/src/internal/server/renderer.js | 3 ++- packages/svelte/src/internal/server/types.d.ts | 18 ------------------ packages/svelte/src/legacy/legacy-server.js | 2 +- packages/svelte/src/server/index.d.ts | 4 +++- packages/svelte/src/server/public.d.ts | 17 +++++++++++++++++ .../svelte/tests/server-side-rendering/test.ts | 3 +-- packages/svelte/types/index.d.ts | 8 ++++---- 9 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 .changeset/olive-jars-repeat.md create mode 100644 packages/svelte/src/server/public.d.ts diff --git a/.changeset/olive-jars-repeat.md b/.changeset/olive-jars-repeat.md new file mode 100644 index 0000000000..815b5adf71 --- /dev/null +++ b/.changeset/olive-jars-repeat.md @@ -0,0 +1,5 @@ +--- +'svelte': minor +--- + +feat: export `RenderOutput`, `SyncRenderOutput`, `Csp` and `Sha256Source` from `svelte/server` diff --git a/packages/svelte/src/internal/server/index.js b/packages/svelte/src/internal/server/index.js index 12f76f188e..3d8ec5fe5e 100644 --- a/packages/svelte/src/internal/server/index.js +++ b/packages/svelte/src/internal/server/index.js @@ -1,5 +1,5 @@ /** @import { ComponentType, SvelteComponent, Component } from 'svelte' */ -/** @import { Csp, RenderOutput } from '#server' */ +/** @import { Csp, RenderOutput } from '../../server/public.js' */ /** @import { Store } from '#shared' */ export { FILENAME, HMR } from '../../constants.js'; import { attr, clsx, to_class, to_style } from '../shared/attributes.js'; diff --git a/packages/svelte/src/internal/server/renderer.js b/packages/svelte/src/internal/server/renderer.js index ba6a361a90..5fb0bb86d5 100644 --- a/packages/svelte/src/internal/server/renderer.js +++ b/packages/svelte/src/internal/server/renderer.js @@ -1,5 +1,6 @@ /** @import { Component } from 'svelte' */ -/** @import { Csp, HydratableContext, RenderOutput, SSRContext, SyncRenderOutput, Sha256Source } from './types.js' */ +/** @import { HydratableContext, SSRContext } from './types.js' */ +/** @import { Csp, RenderOutput, SyncRenderOutput, Sha256Source } from '../../server/public.js' */ /** @import { MaybePromise } from '#shared' */ import { async_mode_flag } from '../flags/index.js'; import { abort } from './abort-signal.js'; diff --git a/packages/svelte/src/internal/server/types.d.ts b/packages/svelte/src/internal/server/types.d.ts index ea6282c176..899255d366 100644 --- a/packages/svelte/src/internal/server/types.d.ts +++ b/packages/svelte/src/internal/server/types.d.ts @@ -15,8 +15,6 @@ export interface SSRContext { element?: Element; } -export type Csp = { nonce?: string; hash?: boolean }; - export interface HydratableLookupEntry { value: unknown; serialized: string; @@ -34,19 +32,3 @@ export interface HydratableContext { export interface RenderContext { hydratable: HydratableContext; } - -export type Sha256Source = `sha256-${string}`; - -export interface SyncRenderOutput { - /** HTML that goes into the `` */ - head: string; - /** @deprecated use `body` instead */ - html: string; - /** HTML that goes somewhere into the `` */ - body: string; - hashes: { - script: Sha256Source[]; - }; -} - -export type RenderOutput = SyncRenderOutput & PromiseLike; diff --git a/packages/svelte/src/legacy/legacy-server.js b/packages/svelte/src/legacy/legacy-server.js index 2c43aab6ac..913f2dccb2 100644 --- a/packages/svelte/src/legacy/legacy-server.js +++ b/packages/svelte/src/legacy/legacy-server.js @@ -1,5 +1,5 @@ /** @import { SvelteComponent } from '../index.js' */ -/** @import { Csp } from '#server' */ +/** @import { Csp } from '../server/public.js' */ import { asClassComponent as as_class_component, createClassComponent } from './legacy-client.js'; import { render } from '../internal/server/index.js'; import { async_mode_flag } from '../internal/flags/index.js'; diff --git a/packages/svelte/src/server/index.d.ts b/packages/svelte/src/server/index.d.ts index db75afb9ed..7297c57490 100644 --- a/packages/svelte/src/server/index.d.ts +++ b/packages/svelte/src/server/index.d.ts @@ -1,6 +1,8 @@ -import type { Csp, RenderOutput } from '#server'; +import type { Csp, RenderOutput } from './public.js'; import type { ComponentProps, Component, SvelteComponent, ComponentType } from 'svelte'; +export type { Csp, RenderOutput, SyncRenderOutput, Sha256Source } from './public.js'; + /** * Only available on the server and when compiling with the `server` option. * Takes a component and returns an object with `body` and `head` properties on it, which you can use to populate the HTML when server-rendering your app. diff --git a/packages/svelte/src/server/public.d.ts b/packages/svelte/src/server/public.d.ts new file mode 100644 index 0000000000..8ef98aef9c --- /dev/null +++ b/packages/svelte/src/server/public.d.ts @@ -0,0 +1,17 @@ +export type Csp = { nonce?: string; hash?: boolean }; + +export type Sha256Source = `sha256-${string}`; + +export interface SyncRenderOutput { + /** HTML that goes into the `` */ + head: string; + /** @deprecated use `body` instead */ + html: string; + /** HTML that goes somewhere into the `` */ + body: string; + hashes: { + script: Sha256Source[]; + }; +} + +export type RenderOutput = SyncRenderOutput & PromiseLike; diff --git a/packages/svelte/tests/server-side-rendering/test.ts b/packages/svelte/tests/server-side-rendering/test.ts index 2dcaa85708..16f7c422b8 100644 --- a/packages/svelte/tests/server-side-rendering/test.ts +++ b/packages/svelte/tests/server-side-rendering/test.ts @@ -6,13 +6,12 @@ import * as fs from 'node:fs'; import { assert } from 'vitest'; -import { render } from 'svelte/server'; +import { render, type SyncRenderOutput } from 'svelte/server'; import { compile_directory, should_update_expected, try_read_file } from '../helpers.js'; import { assert_html_equal_with_options } from '../html_equal.js'; import { suite_with_variants, type BaseTest } from '../suite.js'; import type { CompileOptions } from '#compiler'; import { seen } from '../../src/internal/server/dev.js'; -import type { SyncRenderOutput } from '#server'; interface SSRTest extends BaseTest { mode?: ('sync' | 'async')[]; diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index b752ef5e07..5fcae1b2e0 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -2616,11 +2616,11 @@ declare module 'svelte/server' { } ] ): RenderOutput; - type Csp = { nonce?: string; hash?: boolean }; + export type Csp = { nonce?: string; hash?: boolean }; - type Sha256Source = `sha256-${string}`; + export type Sha256Source = `sha256-${string}`; - interface SyncRenderOutput { + export interface SyncRenderOutput { /** HTML that goes into the `` */ head: string; /** @deprecated use `body` instead */ @@ -2632,7 +2632,7 @@ declare module 'svelte/server' { }; } - type RenderOutput = SyncRenderOutput & PromiseLike; + export type RenderOutput = SyncRenderOutput & PromiseLike; export {}; }