41 lines
1.1 KiB
JavaScript
41 lines
1.1 KiB
JavaScript
import { sharedConfig } from 'solid-js';
|
|
import { hydrate, render, createComponent } from 'solid-js/web';
|
|
|
|
export default (element) =>
|
|
(Component, props, slotted, { client }) => {
|
|
// Prepare global object expected by Solid's hydration logic
|
|
if (!window._$HY) {
|
|
window._$HY = { events: [], completed: new WeakSet(), r: {} };
|
|
}
|
|
if (!element.hasAttribute('ssr')) return;
|
|
|
|
const fn = client === 'only' ? render : hydrate;
|
|
|
|
let _slots = {};
|
|
if (Object.keys(slotted).length > 0) {
|
|
// hydrating
|
|
if (sharedConfig.context) {
|
|
element.querySelectorAll('astro-slot').forEach((slot) => {
|
|
_slots[slot.getAttribute('name') || 'default'] = slot.cloneNode(true);
|
|
});
|
|
} else {
|
|
for (const [key, value] of Object.entries(slotted)) {
|
|
_slots[key] = document.createElement('astro-slot');
|
|
if (key !== 'default') _slots[key].setAttribute('name', key);
|
|
_slots[key].innerHTML = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
const { default: children, ...slots } = _slots;
|
|
|
|
fn(
|
|
() =>
|
|
createComponent(Component, {
|
|
...props,
|
|
...slots,
|
|
children,
|
|
}),
|
|
element
|
|
);
|
|
};
|