diff --git a/packages/svelte/src/internal/server/index.js b/packages/svelte/src/internal/server/index.js index 1fca6070d7..e9b18cb87d 100644 --- a/packages/svelte/src/internal/server/index.js +++ b/packages/svelte/src/internal/server/index.js @@ -94,7 +94,7 @@ function close(head, body, payload) { cleanup(); } - head += payload.global.head.get_title(); + head += payload.global.get_title(); body = BLOCK_OPEN + body + BLOCK_CLOSE; // this inserts a fake boundary so hydration matches @@ -698,7 +698,7 @@ export function build_title(payload, children) { payload.compact({ start: i, fn: ({ head }) => { - payload.global.head.set_title(head, path); + payload.global.set_title(head, path); // since we can only ever render the title in this chunk, and title rendering is handled specially, // we can just ditch the results after we've saved them globally return { head: '', body: '' }; diff --git a/packages/svelte/src/internal/server/payload.js b/packages/svelte/src/internal/server/payload.js index 65dc7dd593..f21b35c432 100644 --- a/packages/svelte/src/internal/server/payload.js +++ b/packages/svelte/src/internal/server/payload.js @@ -368,28 +368,22 @@ export class TreeState { /** @readonly @type {() => string} */ uid; - /** @readonly @type {TreeHeadState} */ - head; - /** @readonly @type {Set<{ hash: string; code: string }>} */ css = new Set(); + /** @type {{ path: number[], value: string }} */ + #title = { path: [], value: '' }; + /** * @param {'sync' | 'async'} mode * @param {string} [id_prefix] */ constructor(mode, id_prefix = '') { this.mode = mode; - this.uid = props_id_generator(id_prefix); - this.head = new TreeHeadState(); - } -} -export class TreeHeadState { - /** - * @type {{ path: number[], value: string }} - */ - #title = { path: [], value: '' }; + let uid = 1; + this.uid = () => `${id_prefix}s${uid++}`; + } get_title() { return this.#title.value; @@ -421,13 +415,3 @@ export class TreeHeadState { } } } - -/** - * Creates an ID generator - * @param {string} prefix - * @returns {() => string} - */ -function props_id_generator(prefix) { - let uid = 1; - return () => `${prefix}s${uid++}`; -} diff --git a/packages/svelte/src/internal/server/payload.test.ts b/packages/svelte/src/internal/server/payload.test.ts index c0417af9bd..6908fb8c96 100644 --- a/packages/svelte/src/internal/server/payload.test.ts +++ b/packages/svelte/src/internal/server/payload.test.ts @@ -1,5 +1,5 @@ import { assert, expect, test } from 'vitest'; -import { Payload, TreeState, TreeHeadState } from './payload.js'; +import { Payload, TreeState } from './payload.js'; test('collects synchronous body content by default', () => { const payload = new Payload(new TreeState('sync')); @@ -170,7 +170,7 @@ test('subsume replaces tree content and state from other', () => { $$payload.push('body'); }); b.global.css.add({ hash: 'h', code: 'c' }); - b.global.head.set_title('Title', [1]); + b.global.set_title('Title', [1]); b.local.select_value = 'B'; b.promises.initial = Promise.resolve(); @@ -192,7 +192,7 @@ test('subsume refuses to switch modes', () => { $$payload.push('body'); }); b.global.css.add({ hash: 'h', code: 'c' }); - b.global.head.set_title('Title', [1]); + b.global.set_title('Title', [1]); b.local.select_value = 'B'; b.promises.initial = Promise.resolve(); @@ -206,31 +206,31 @@ test('TreeState uid generator uses prefix', () => { assert.equal(state.uid(), 'id-s1'); }); -test('TreeHeadState title ordering favors later lexicographic paths', () => { - const head = new TreeHeadState(() => ''); +test('TreeState title ordering favors later lexicographic paths', () => { + const state = new TreeState('sync'); - head.set_title('A', [1]); - assert.equal(head.get_title(), 'A'); + state.set_title('A', [1]); + assert.equal(state.get_title(), 'A'); // equal path -> unchanged - head.set_title('B', [1]); - assert.equal(head.get_title(), 'A'); + state.set_title('B', [1]); + assert.equal(state.get_title(), 'A'); // earlier -> unchanged - head.set_title('C', [0, 9]); - assert.equal(head.get_title(), 'A'); + state.set_title('C', [0, 9]); + assert.equal(state.get_title(), 'A'); // later -> update - head.set_title('D', [2]); - assert.equal(head.get_title(), 'D'); + state.set_title('D', [2]); + assert.equal(state.get_title(), 'D'); // longer but same prefix -> update - head.set_title('E', [2, 0]); - assert.equal(head.get_title(), 'E'); + state.set_title('E', [2, 0]); + assert.equal(state.get_title(), 'E'); // shorter (earlier) than current with same prefix -> unchanged - head.set_title('F', [2]); - assert.equal(head.get_title(), 'E'); + state.set_title('F', [2]); + assert.equal(state.get_title(), 'E'); }); test('push accepts async functions in async context', async () => {