vike-ripple 0.4.5 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike-ripple",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "description": "Vike extension for Ripple TS — SSR, streaming, Layout, Head, SEO configs, hooks",
5
5
  "type": "module",
6
6
  "exports": {
@@ -3,16 +3,71 @@ export { onRenderClient }
3
3
  import { setPageContext } from '../hooks/usePageContext.js'
4
4
  import { setHydrated } from '../hooks/useHydrated.js'
5
5
 
6
+ // tsrx_element — wraps a component fn as a Ripple TSRX element (matches ripple/internal)
7
+ const tsrx_element = (fn) => ({
8
+ render: fn,
9
+ [Symbol.for('ripple.element')]: true
10
+ })
11
+
12
+ /** @type {(() => void) | null} */
13
+ let dispose = null
14
+
6
15
  const onRenderClient = async (pageContext) => {
7
- const { Page } = pageContext
16
+ console.log('[vike-ripple] onRenderClient', {
17
+ isHydration: pageContext.isHydration,
18
+ url: pageContext.urlOriginal,
19
+ hasPage: !!pageContext.Page,
20
+ hasLayout: !!pageContext.config?.Layout,
21
+ hasWrapper: !!pageContext.config?.Wrapper,
22
+ })
23
+
24
+ const { Page, config } = pageContext
8
25
  if (!Page) return
9
26
 
10
27
  setPageContext(pageContext)
11
28
  const container = document.getElementById('root')
12
29
  if (!container) return
13
30
 
14
- // mount() clears container (target.textContent = '') and renders fresh
15
- const { mount } = await import('ripple')
16
- mount(Page, { target: container, props: {} })
31
+ console.log('[vike-ripple] container child count before:', container.childElementCount)
32
+
33
+ // ── Build same component tree as SSR ──
34
+ // Apply Layouts (innermost first → outermost last)
35
+ const Layout = config.Layout ?? config.layout
36
+ const Wrapper = config.Wrapper ?? config.wrapper
37
+ let component = Page
38
+ if (Layout) {
39
+ const layouts = Array.isArray(Layout) ? Layout : [Layout]
40
+ for (let i = 0; i < layouts.length; i++) {
41
+ const L = layouts[i]
42
+ const prev = component
43
+ component = (props) => L({ ...props, children: tsrx_element(prev) })
44
+ }
45
+ }
46
+ if (Wrapper) {
47
+ const wrappers = Array.isArray(Wrapper) ? Wrapper : [Wrapper]
48
+ for (const W of wrappers) {
49
+ const prev = component
50
+ component = (props) => W({ ...props, children: tsrx_element(prev) })
51
+ }
52
+ }
53
+
54
+ // ── Clean up previous root ──
55
+ if (dispose) {
56
+ console.log('[vike-ripple] disposing previous root')
57
+ dispose()
58
+ dispose = null
59
+ }
60
+
61
+ // ── Hydrate or mount ──
62
+ if (pageContext.isHydration && container.innerHTML !== '') {
63
+ const { hydrate } = await import('ripple')
64
+ console.log('[vike-ripple] using hydrate')
65
+ dispose = hydrate(component, { target: container, props: {} })
66
+ } else {
67
+ const { mount } = await import('ripple')
68
+ console.log('[vike-ripple] using mount')
69
+ dispose = mount(component, { target: container, props: {} })
70
+ }
17
71
  setHydrated()
72
+ console.log('[vike-ripple] container child count after:', container.childElementCount)
18
73
  }
@@ -26,7 +26,7 @@ const onRenderHtml = async (pageContext) => {
26
26
  const Wrapper = pageContext.config.Wrapper
27
27
  if (Layout) {
28
28
  const layouts = Array.isArray(Layout) ? Layout : [Layout]
29
- for (let i = layouts.length - 1; i >= 0; i--) {
29
+ for (let i = 0; i < layouts.length; i++) {
30
30
  const L = layouts[i]
31
31
  const prev = wrappedPage
32
32
  wrappedPage = (props) => L({ ...props, children: tsrx_element(prev) })