Skip to content

Commit f402d01

Browse files
authored
fix: reset hydrate_node after hydrate(...) (#12512)
1 parent 30b143c commit f402d01

File tree

6 files changed

+59
-1
lines changed

6 files changed

+59
-1
lines changed

.changeset/four-papayas-turn.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: reset hydrate node after `hydrate(...)`

packages/svelte/src/internal/client/render.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ export function hydrate(component, options) {
119119
options.intro = options.intro ?? false;
120120
const target = options.target;
121121
const was_hydrating = hydrating;
122+
const previous_hydrate_node = hydrate_node;
122123

123124
try {
124125
// Don't flush previous effects to ensure order of outer effects stays consistent
@@ -175,6 +176,7 @@ export function hydrate(component, options) {
175176
throw error;
176177
} finally {
177178
set_hydrating(was_hydrating);
179+
set_hydrate_node(previous_hydrate_node);
178180
reset_head_anchor();
179181
}
180182
}

packages/svelte/tests/runtime-legacy/shared.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export interface RuntimeTest<Props extends Record<string, any> = Record<string,
3535
ssrHtml?: string;
3636
compileOptions?: Partial<CompileOptions>;
3737
props?: Props;
38+
server_props?: Props;
3839
before_test?: () => void;
3940
after_test?: () => void;
4041
test?: (args: {
@@ -256,7 +257,9 @@ async function run_test_variant(
256257
config.before_test?.();
257258
// ssr into target
258259
const SsrSvelteComponent = (await import(`${cwd}/_output/server/main.svelte.js`)).default;
259-
const { html, head } = render(SsrSvelteComponent, { props: config.props || {} });
260+
const { html, head } = render(SsrSvelteComponent, {
261+
props: config.server_props ?? config.props ?? {}
262+
});
260263

261264
fs.writeFileSync(`${cwd}/_output/rendered.html`, html);
262265
target.innerHTML = html;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script>
2+
let count = $state(0);
3+
</script>
4+
5+
<button onclick={() => (count += 1)}>
6+
clicks: {count}
7+
</button>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
props: {
6+
browser: true
7+
},
8+
9+
server_props: {
10+
browser: false
11+
},
12+
13+
html: `<div><button>clicks: 0</button></div>`,
14+
15+
test({ target, assert }) {
16+
const button = target.querySelector('button');
17+
18+
flushSync(() => button?.click());
19+
assert.htmlEqual(target.innerHTML, `<div><button>clicks: 1</button></div>`);
20+
}
21+
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<script>
2+
import { createRawSnippet, hydrate } from 'svelte';
3+
import { render } from 'svelte/server';
4+
import Child from './Child.svelte';
5+
6+
let { browser } = $props();
7+
8+
let count = $state(0);
9+
10+
const hello = createRawSnippet((count) => ({
11+
render: () => `
12+
<div>${browser ? '' : render(Child).body}</div>
13+
`,
14+
setup(target) {
15+
hydrate(Child, { target })
16+
}
17+
}));
18+
</script>
19+
20+
{@render hello()}

0 commit comments

Comments
 (0)