7373d61cdc
* feat: pass all slots to renderers * refactor: pass `slots` as top-level props * test: add named slot test for frameworks * fix: nested hydration, slots that are not initially rendered * test: add nested-recursive e2e test * fix: render unmatched custom element children * chore: update lockfile * fix: unrendered slots for client:only * fix(lit): ensure lit integration uses new slots API * chore: add changeset * chore: add changesets * fix: lit slots * feat: convert dash-case or snake_case slots to camelCase for JSX * feat: remove tmpl special logic * test: add slot components-in-markdown test * refactor: prefer Object.entries.map() to for/of loop Co-authored-by: Nate Moore <nate@astro.build>
43 lines
850 B
JavaScript
43 lines
850 B
JavaScript
const noop = () => {};
|
|
|
|
export default (target) => {
|
|
return (Component, props, slotted, { client }) => {
|
|
if (!target.hasAttribute('ssr')) return;
|
|
delete props['class'];
|
|
const slots = {};
|
|
for (const [key, value] of Object.entries(slotted)) {
|
|
slots[key] = createSlotDefinition(key, value);
|
|
}
|
|
try {
|
|
new Component({
|
|
target,
|
|
props: {
|
|
...props,
|
|
$$slots: slots,
|
|
$$scope: { ctx: [] }
|
|
},
|
|
hydrate: client !== 'only',
|
|
$$inline: true,
|
|
});
|
|
} catch (e) {}
|
|
};
|
|
};
|
|
|
|
function createSlotDefinition(key, children) {
|
|
return [
|
|
() => ({
|
|
// mount
|
|
m(target) {
|
|
target.insertAdjacentHTML('beforeend', `<astro-slot${key === 'default' ? '' : ` name="${key}"`}>${children}</astro-slot>`)
|
|
},
|
|
// create
|
|
c: noop,
|
|
// hydrate
|
|
l: noop,
|
|
// destroy
|
|
d: noop,
|
|
}),
|
|
noop,
|
|
noop,
|
|
]
|
|
}
|