pull/10922/head
Rich Harris 2 years ago
parent 13f5c21678
commit 3f687505a8

@ -32,10 +32,7 @@ export interface ComponentClientTransformState extends ClientTransformState {
/** Stuff that happens before the render effect(s) */ /** Stuff that happens before the render effect(s) */
readonly init: Statement[]; readonly init: Statement[];
/** Stuff that happens inside the render effect */ /** Stuff that happens inside the render effect */
readonly update: { readonly update: Statement[];
/** Used if condition for singular prop is false (see comment above) */
grouped: Statement;
}[];
/** Stuff that happens after the render effect (control blocks, dynamic elements, bindings, actions, etc) */ /** Stuff that happens after the render effect (control blocks, dynamic elements, bindings, actions, etc) */
readonly after_update: Statement[]; readonly after_update: Statement[];
/** The HTML template string */ /** The HTML template string */

@ -106,7 +106,7 @@ function serialize_style_directives(style_directives, element_id, context, is_at
if (!is_attributes_reactive && contains_call_expression) { if (!is_attributes_reactive && contains_call_expression) {
state.init.push(singular); state.init.push(singular);
} else if (is_attributes_reactive || directive.metadata.dynamic || contains_call_expression) { } else if (is_attributes_reactive || directive.metadata.dynamic || contains_call_expression) {
state.update.push({ grouped }); state.update.push(grouped);
} else { } else {
state.init.push(grouped); state.init.push(grouped);
} }
@ -155,7 +155,7 @@ function serialize_class_directives(class_directives, element_id, context, is_at
if (!is_attributes_reactive && contains_call_expression) { if (!is_attributes_reactive && contains_call_expression) {
state.init.push(singular); state.init.push(singular);
} else if (is_attributes_reactive || directive.metadata.dynamic || contains_call_expression) { } else if (is_attributes_reactive || directive.metadata.dynamic || contains_call_expression) {
state.update.push({ grouped }); state.update.push(grouped);
} else { } else {
state.init.push(grouped); state.init.push(grouped);
} }
@ -333,17 +333,15 @@ function serialize_element_spread_attributes(
context.state.init.push(standalone); context.state.init.push(standalone);
} }
} else { } else {
context.state.update.push({ context.state.update.push(inside_effect);
grouped: inside_effect
});
} }
if (needs_select_handling) { if (needs_select_handling) {
context.state.init.push( context.state.init.push(
b.stmt(b.call('$.init_select', element_id, b.thunk(b.member(b.id(id), b.id('value'))))) b.stmt(b.call('$.init_select', element_id, b.thunk(b.member(b.id(id), b.id('value')))))
); );
context.state.update.push({ context.state.update.push(
grouped: b.if( b.if(
b.binary('in', b.literal('value'), b.id(id)), b.binary('in', b.literal('value'), b.id(id)),
b.block([ b.block([
// This ensures a one-way street to the DOM in case it's <select {value}> // This ensures a one-way street to the DOM in case it's <select {value}>
@ -353,7 +351,7 @@ function serialize_element_spread_attributes(
b.stmt(b.call('$.select_option', element_id, b.member(b.id(id), b.id('value')))) b.stmt(b.call('$.select_option', element_id, b.member(b.id(id), b.id('value'))))
]) ])
) )
}); );
} }
} }
@ -412,8 +410,8 @@ function serialize_dynamic_element_attributes(attributes, context, element_id) {
} else if (is_reactive) { } else if (is_reactive) {
const id = context.state.scope.generate('spread_attributes'); const id = context.state.scope.generate('spread_attributes');
context.state.init.push(b.let(id)); context.state.init.push(b.let(id));
context.state.update.push({ context.state.update.push(
grouped: b.stmt( b.stmt(
b.assignment( b.assignment(
'=', '=',
b.id(id), b.id(id),
@ -426,7 +424,7 @@ function serialize_dynamic_element_attributes(attributes, context, element_id) {
) )
) )
) )
}); );
return true; return true;
} else { } else {
context.state.init.push( context.state.init.push(
@ -564,7 +562,7 @@ function serialize_element_attribute_update_assignment(element, node_id, attribu
if (contains_call_expression && singular) { if (contains_call_expression && singular) {
state.init.push(singular); state.init.push(singular);
} else { } else {
state.update.push({ grouped }); state.update.push(grouped);
} }
return true; return true;
} else { } else {
@ -707,26 +705,18 @@ function serialize_update_assignment(state, id, init, value, assignment, contain
} else { } else {
if (assignment.skip_condition) { if (assignment.skip_condition) {
if (assignment.singular) { if (assignment.singular) {
state.update.push({ state.update.push(assignment.grouped);
grouped: assignment.grouped
});
} else { } else {
state.init.push(b.var(id, init)); state.init.push(b.var(id, init));
state.update.push({ state.update.push(grouped);
grouped
});
} }
} else { } else {
if (assignment.singular) { if (assignment.singular) {
state.init.push(b.var(id, init)); state.init.push(b.var(id, init));
state.update.push({ state.update.push(grouped);
grouped
});
} else { } else {
state.init.push(b.var(id, init)); state.init.push(b.var(id, init));
state.update.push({ state.update.push(grouped);
grouped
});
} }
} }
} }
@ -1275,7 +1265,7 @@ function get_template_function(namespace, state) {
* @param {import('../types.js').ComponentClientTransformState} state * @param {import('../types.js').ComponentClientTransformState} state
*/ */
function serialize_render_stmt(state) { function serialize_render_stmt(state) {
return b.stmt(b.call('$.render_effect', b.thunk(b.block(state.update.map((n) => n.grouped))))); return b.stmt(b.call('$.render_effect', b.thunk(b.block(state.update))));
} }
/** /**
@ -1511,16 +1501,15 @@ function process_children(nodes, expression, is_element, { visit, state }) {
if (node.metadata.contains_call_expression && !within_bound_contenteditable) { if (node.metadata.contains_call_expression && !within_bound_contenteditable) {
state.init.push(singular); state.init.push(singular);
} else if (node.metadata.dynamic && !within_bound_contenteditable) { } else if (node.metadata.dynamic && !within_bound_contenteditable) {
state.update.push({ state.update.push(
singular, b.stmt(
grouped: b.stmt(
b.call( b.call(
'$.text', '$.text',
text_id, text_id,
/** @type {import('estree').Expression} */ (visit(node.expression)) /** @type {import('estree').Expression} */ (visit(node.expression))
) )
) )
}); );
} else { } else {
state.init.push( state.init.push(
b.stmt( b.stmt(
@ -1556,10 +1545,7 @@ function process_children(nodes, expression, is_element, { visit, state }) {
sequence.some((node) => node.type === 'ExpressionTag' && node.metadata.dynamic) && sequence.some((node) => node.type === 'ExpressionTag' && node.metadata.dynamic) &&
!within_bound_contenteditable !within_bound_contenteditable
) { ) {
state.update.push({ state.update.push(b.stmt(b.call('$.text', text_id, assignment)));
singular,
grouped: b.stmt(b.call('$.text', text_id, assignment))
});
} else { } else {
state.init.push(init); state.init.push(init);
} }
@ -3120,15 +3106,15 @@ export const template_visitors = {
) )
); );
} else { } else {
state.update.push({ state.update.push(
grouped: b.stmt( b.stmt(
b.assignment( b.assignment(
'=', '=',
b.member(b.id('$.document'), b.id('title')), b.member(b.id('$.document'), b.id('title')),
serialize_template_literal(/** @type {any} */ (node.fragment.nodes), visit, state)[1] serialize_template_literal(/** @type {any} */ (node.fragment.nodes), visit, state)[1]
) )
) )
}); );
} }
}, },
SvelteBody(node, context) { SvelteBody(node, context) {

Loading…
Cancel
Save