de-waterfall awaits in separate elements

pull/16757/head
Rich Harris 1 week ago
parent 63e1571113
commit 8fb412f586

@ -1,4 +1,5 @@
/** @import { AST } from '#compiler' */ /** @import { AST } from '#compiler' */
/** @import { Statement } from 'estree' */
/** @import { ComponentContext, ComponentServerTransformState } from '../types.js' */ /** @import { ComponentContext, ComponentServerTransformState } from '../types.js' */
import { clean_nodes, infer_namespace } from '../../utils.js'; import { clean_nodes, infer_namespace } from '../../utils.js';
import * as b from '#compiler/builders'; import * as b from '#compiler/builders';
@ -47,12 +48,20 @@ export function Fragment(node, context) {
process_children(trimmed, { ...context, state }); process_children(trimmed, { ...context, state });
if (node.metadata.is_async) {
/** @type {Statement[]} */
const statements = [];
if (node.metadata.hoisted_promises.promises.length > 0) { if (node.metadata.hoisted_promises.promises.length > 0) {
return b.block([ statements.push(
b.const(node.metadata.hoisted_promises.id, b.array(node.metadata.hoisted_promises.promises)), b.const(node.metadata.hoisted_promises.id, b.array(node.metadata.hoisted_promises.promises))
...state.init, );
call_child_payload(b.block(build_template(state.template)), true) }
]);
statements.push(...state.init);
statements.push(...build_template(state.template));
return b.block([call_child_payload(b.block(statements), true)]);
} }
return b.block([...state.init, ...build_template(state.template)]); return b.block([...state.init, ...build_template(state.template)]);

@ -192,17 +192,12 @@ export function RegularElement(node, context) {
) )
); );
} else { } else {
if (node.fragment.metadata.hoisted_promises.promises.length > 0) { if (node.fragment.metadata.is_async) {
state.template.push( state.template.push(/** @type {Statement} */ (context.visit(node.fragment)));
b.const( } else {
node.fragment.metadata.hoisted_promises.id,
b.array(node.fragment.metadata.hoisted_promises.promises)
)
);
}
process_children(trimmed, { ...context, state }); process_children(trimmed, { ...context, state });
} }
}
if (select_with_value) { if (select_with_value) {
// we need to create a child scope so that the `select_value` only applies children of this select element // we need to create a child scope so that the `select_value` only applies children of this select element

Loading…
Cancel
Save