-
Notifications
You must be signed in to change notification settings - Fork 169
/
renderer.ts
27 lines (26 loc) · 976 Bytes
/
renderer.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import React, { ComponentType } from 'https://esm.sh/react'
import { renderToString } from 'https://esm.sh/react-dom/server'
import { DataContext } from './data.ts'
import { E501 } from './error.ts'
import { RouterContext } from './router.ts'
import type { RouterURL } from './types.ts'
import util from './util.ts'
export { renderHead } from './head.ts'
export function renderPage(
data: Record<string, any>,
url: RouterURL,
App: ComponentType<any> | undefined,
Page: ComponentType<any>,
) {
const pageEl = React.createElement(util.isLikelyReactComponent(Page) ? Page : E501.Page)
const appEl = App ? (util.isLikelyReactComponent(App) ? React.createElement(App, null, pageEl) : React.createElement(E501.App)) : pageEl
return renderToString(React.createElement(
DataContext.Provider,
{ value: data },
React.createElement(
RouterContext.Provider,
{ value: url },
appEl
)
))
}