vike-ripple 0.4.6 → 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.6",
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,31 +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
- console.log('[vike-ripple] onRenderClient called', {
16
+ console.log('[vike-ripple] onRenderClient', {
8
17
  isHydration: pageContext.isHydration,
9
- isFirstRender: 'isFirstRender' in pageContext,
10
- hasPage: !!pageContext.Page,
11
18
  url: pageContext.urlOriginal,
12
- location: window.location.href,
19
+ hasPage: !!pageContext.Page,
20
+ hasLayout: !!pageContext.config?.Layout,
21
+ hasWrapper: !!pageContext.config?.Wrapper,
13
22
  })
14
23
 
15
- const { Page } = pageContext
24
+ const { Page, config } = pageContext
16
25
  if (!Page) return
17
26
 
18
27
  setPageContext(pageContext)
19
28
  const container = document.getElementById('root')
20
- if (!container) {
21
- console.warn('[vike-ripple] no #root container')
22
- return
23
- }
29
+ if (!container) return
24
30
 
25
31
  console.log('[vike-ripple] container child count before:', container.childElementCount)
26
32
 
27
- // Just mount mount() clears container (target.textContent = '') and renders
28
- const { mount } = await import('ripple')
29
- mount(Page, { target: container, props: {} })
30
- setHydrated()
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
+ }
31
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
+ }
71
+ setHydrated()
32
72
  console.log('[vike-ripple] container child count after:', container.childElementCount)
33
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) })