WIP fix more hydration stuff

pull/16806/head
Rich Harris 4 days ago
parent ded13b825d
commit 395bb67fd1

@ -40,11 +40,7 @@ import { TitleElement } from './visitors/TitleElement.js';
import { UpdateExpression } from './visitors/UpdateExpression.js';
import { VariableDeclaration } from './visitors/VariableDeclaration.js';
import { SvelteBoundary } from './visitors/SvelteBoundary.js';
import {
create_child_block,
call_component_renderer,
create_async_block
} from './visitors/shared/utils.js';
import { call_component_renderer, create_async_block } from './visitors/shared/utils.js';
/** @type {Visitors} */
const global_visitors = {
@ -248,7 +244,7 @@ export function server_component(analysis, options) {
]);
if (analysis.instance.has_await) {
component_block = b.block([create_child_block(component_block, true)]);
component_block = b.block([create_async_block(component_block)]);
}
// trick esrap into including comments

@ -20,6 +20,14 @@ import {
set_from_async_derived
} from './deriveds.js';
import { aborted } from './effects.js';
import {
hydrate_next,
hydrate_node,
hydrating,
set_hydrate_node,
set_hydrating,
skip_nodes
} from '../dom/hydration.js';
/**
*
@ -74,12 +82,23 @@ function capture() {
var previous_component_context = component_context;
var previous_batch = current_batch;
var was_hydrating = hydrating;
if (was_hydrating) {
var previous_hydrate_node = hydrate_node;
}
return function restore() {
set_active_effect(previous_effect);
set_active_reaction(previous_reaction);
set_component_context(previous_component_context);
previous_batch?.activate();
if (was_hydrating) {
set_hydrating(true);
set_hydrate_node(previous_hydrate_node);
}
if (DEV) {
set_from_async_derived(null);
}
@ -186,8 +205,25 @@ export async function async_body(fn) {
var active = /** @type {Effect} */ (active_effect);
var was_hydrating = hydrating;
if (was_hydrating) {
hydrate_next();
var previous_hydrate_node = hydrate_node;
var end = skip_nodes(false);
}
try {
var promise = fn();
} finally {
if (was_hydrating) {
set_hydrate_node(end);
}
}
try {
await fn();
await promise;
} catch (error) {
if (!aborted(active)) {
invoke_error_boundary(error, active);
@ -202,6 +238,10 @@ export async function async_body(fn) {
batch.decrement();
}
if (was_hydrating) {
set_hydrating(false);
}
unset_context();
}
}

@ -0,0 +1,13 @@
import { tick } from 'svelte';
import { test } from '../../test';
export default test({
skip_mode: ['server'],
ssrHtml: '<p>hello</p>',
async test({ assert, target }) {
await tick();
assert.htmlEqual(target.innerHTML, '<p>hello</p>');
}
});

@ -0,0 +1,7 @@
<script lang="ts">
await 1;
</script>
{#if true}
<p>hello</p>
{/if}
Loading…
Cancel
Save