summaryrefslogtreecommitdiff
path: root/src/frontend/render/preact.ts
blob: 5c50b6fe33f77aafc93807120f21d832e717a1f9 (plain) (blame)
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
import { h, render, ComponentType } from 'preact';
import { renderToString } from 'preact-render-to-string';
import { childrenToVnodes } from './utils';
import type { ComponentRenderer } from '../../@types/renderer';
import { createRenderer } from './renderer';

// This prevents tree-shaking of render.
Function.prototype(render);

const Preact: ComponentRenderer<ComponentType> = {
  jsxPragma: h,
  jsxPragmaName: 'h',
  renderStatic(Component) {
    return async (props, ...children) => {
      return renderToString(h(Component, props, childrenToVnodes(h, children)));
    };
  },
  imports: {
    preact: ['render', 'Fragment', 'h'],
  },
  render({ Component, root, props, children }) {
    return `render(h(${Component}, ${props}, h(Fragment, null, ...${children})), ${root})`;
  },
};

const renderer = createRenderer(Preact);

export const __preact_static = renderer.static;
export const __preact_load = renderer.load;
export const __preact_idle = renderer.idle;
export const __preact_visible = renderer.visible;