/
renderer.ts
35 lines (33 loc) · 1.12 KB
/
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
28
29
30
31
32
33
34
35
import React, { ComponentType } from 'https://esm.sh/react'
import { renderToString } from 'https://esm.sh/react-dom/server'
import { DataContext, RouterContext } from './context.ts'
import { E501App, E501Page, ErrorBoundary } from './error.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>,
) {
if (!util.isLikelyReactComponent(Page)) {
Page = E501Page
}
const appEl = App ? (util.isLikelyReactComponent(App) ? React.createElement(App, { Page }) : React.createElement(E501App)) : React.createElement(Page)
return renderToString(
React.createElement(
ErrorBoundary,
null,
React.createElement(
DataContext.Provider,
{ value: data },
React.createElement(
RouterContext.Provider,
{ value: url },
appEl
)
)
)
)
}