Implements so that slot defaults apply when forwarding

pull/8546/head
Nguyen Tran 3 years ago
parent 55b678a77b
commit da1cd90a30

@ -43,6 +43,7 @@ export default class Block {
binding_groups: Set<BindingGroup> = new Set(); binding_groups: Set<BindingGroup> = new Set();
chunks: { chunks: {
conditional_fragment: Array<Node | Node[]>;
declarations: Array<Node | Node[]>; declarations: Array<Node | Node[]>;
init: Array<Node | Node[]>; init: Array<Node | Node[]>;
create: Array<Node | Node[]>; create: Array<Node | Node[]>;
@ -92,6 +93,7 @@ export default class Block {
this.bindings = options.bindings; this.bindings = options.bindings;
this.chunks = { this.chunks = {
conditional_fragment: [],
declarations: [], declarations: [],
init: [], init: [],
create: [], create: [],
@ -381,7 +383,7 @@ export default class Block {
} }
} }
const return_value: any = x`{ const return_fragment: any = x`{
key: ${properties.key}, key: ${properties.key},
first: ${properties.first}, first: ${properties.first},
c: ${properties.create}, c: ${properties.create},
@ -399,6 +401,13 @@ export default class Block {
}`; }`;
const block = dev && this.get_unique_name('block'); const block = dev && this.get_unique_name('block');
const conditional_array = {
type: 'ArrayExpression',
elements: this.chunks.conditional_fragment
};
const conditional = this.chunks.conditional_fragment.length ? x`${conditional_array}.some(@identity)` : null;
const return_value = conditional ? x`${conditional} ? ${return_fragment} : null` : return_fragment;
const body = b` const body = b`
${this.chunks.declarations} ${this.chunks.declarations}

@ -128,6 +128,7 @@ export default class SlotWrapper extends Wrapper {
const slot_definition = block.get_unique_name(`${sanitize(slot_name)}_slot_template`); const slot_definition = block.get_unique_name(`${sanitize(slot_name)}_slot_template`);
const slot_or_fallback = has_fallback ? block.get_unique_name(`${sanitize(slot_name)}_slot_or_fallback`) : slot; const slot_or_fallback = has_fallback ? block.get_unique_name(`${sanitize(slot_name)}_slot_or_fallback`) : slot;
block.chunks.conditional_fragment.push(slot_or_fallback);
block.chunks.init.push(b` block.chunks.init.push(b`
const ${slot_definition} = ${renderer.reference('#slots')}.${slot_name}; const ${slot_definition} = ${renderer.reference('#slots')}.${slot_name};
const ${slot} = @create_slot(${slot_definition}, #ctx, ${renderer.reference('$$scope')}, ${get_slot_context_fn}); const ${slot} = @create_slot(${slot_definition}, #ctx, ${renderer.reference('$$scope')}, ${get_slot_context_fn});

@ -77,9 +77,11 @@ export default function(node: InlineComponent, renderer: Renderer, options: Rend
slot_scopes slot_scopes
})); }));
slot_scopes.forEach(({ input, output, statements }, name) => { slot_scopes.forEach(({ input, output, condition, default_value, statements }, name) => {
slot_fns.push( slot_fns.push(
p`${name}: (${input}) => { ${statements}; return ${output}; }` condition && default_value
? p`${name}: ${condition} || ${default_value} ? (${input}) => ${output} : null`
: p`${name}: (${input}) => { ${statements}; return ${output}; }`
); );
}); });
} }

@ -34,7 +34,9 @@ export default function(node: Slot, renderer: Renderer, options: RenderOptions &
}); });
options.slot_scopes.set(slot, { options.slot_scopes.set(slot, {
input: get_slot_scope(node.lets), input: get_slot_scope(node.lets),
output: renderer.pop() condition: x`#slots.${node.slot_name}`,
output: renderer.pop(),
default_value: result
}); });
} }
} }

Loading…
Cancel
Save