mirror of
https://github.com/withastro/astro.git
synced 2025-01-06 22:10:10 -05:00
e9a77d8619
* wip: fix nested islands
* fix: improve hydration for dynamic content
* chore: fix bundle-size script for new files
* chore: allow-list client:* directive files
* fix(#3362): fix client:only behavior for React, Vue, Solid
* test: add client-only e2e test
* chore: update lockfile
* test: fix e2e tests
* test: add framework nesting e2e tests
* Update packages/astro/src/runtime/client/events.ts
Co-authored-by: Matthew Phillips <matthew@skypack.dev>
* chore: add changeset
* fix(preact): ignore hydrate roots
* chore: remove `ssr` check in integrations
* Revert "chore: remove `ssr` check in integrations"
This reverts commit ba27eaae55
.
* chore: add changeset
Co-authored-by: Matthew Phillips <matthew@skypack.dev>
36 lines
901 B
JavaScript
36 lines
901 B
JavaScript
import { sharedConfig } from 'solid-js';
|
|
import { hydrate, render, createComponent } from 'solid-js/web';
|
|
|
|
export default (element) => (Component, props, childHTML, { 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;
|
|
|
|
// Perform actual hydration
|
|
let children;
|
|
fn(
|
|
() =>
|
|
createComponent(Component, {
|
|
...props,
|
|
get children() {
|
|
if (childHTML != null) {
|
|
// hydrating
|
|
if (sharedConfig.context) {
|
|
children = element.querySelector('astro-fragment');
|
|
}
|
|
|
|
if (children == null) {
|
|
children = document.createElement('astro-fragment');
|
|
children.innerHTML = childHTML;
|
|
}
|
|
}
|
|
return children;
|
|
},
|
|
}),
|
|
element
|
|
);
|
|
};
|