diff options
author | 2021-04-09 13:03:27 -0400 | |
---|---|---|
committer | 2021-04-09 13:03:27 -0400 | |
commit | 185a26713322f1a134c432e65b55b4b3325eea9b (patch) | |
tree | eb7e102e492a7b0d10afed8c55cd172739e1b651 | |
parent | 4ccf4196e31333b41e37259488f6fa0a81c3518b (diff) | |
download | astro-185a26713322f1a134c432e65b55b4b3325eea9b.tar.gz astro-185a26713322f1a134c432e65b55b4b3325eea9b.tar.zst astro-185a26713322f1a134c432e65b55b4b3325eea9b.zip |
Improve renderer types (#69)
* Improve renderer types
Looking at the render code I noticed that the Component rendering is not typed. This adds that, might help prevent a bug in the future.
* Create the supported renderer type
-rw-r--r-- | src/@types/renderer.ts | 12 | ||||
-rw-r--r-- | src/frontend/render/preact.ts | 4 | ||||
-rw-r--r-- | src/frontend/render/react.ts | 4 | ||||
-rw-r--r-- | src/frontend/render/renderer.ts | 4 | ||||
-rw-r--r-- | src/frontend/render/svelte.ts | 3 | ||||
-rw-r--r-- | src/frontend/render/vue.ts | 3 |
6 files changed, 20 insertions, 10 deletions
diff --git a/src/@types/renderer.ts b/src/@types/renderer.ts index 488a91130..39998ba24 100644 --- a/src/@types/renderer.ts +++ b/src/@types/renderer.ts @@ -1,11 +1,16 @@ +import type { Component as VueComponent } from 'vue'; +import type { ComponentType as PreactComponent } from 'preact'; +import type { ComponentType as ReactComponent } from 'react'; +import type { SvelteComponent } from 'svelte'; + export interface DynamicRenderContext { componentUrl: string; componentExport: string; frameworkUrls: string; } -export interface ComponentRenderer { - renderStatic: StaticRendererGenerator; +export interface ComponentRenderer<T> { + renderStatic: StaticRendererGenerator<T>; render(context: { root: string; Component: string; props: string; [key: string]: string }): string; imports?: Record<string, string[]>; } @@ -15,6 +20,9 @@ export interface ComponentContext { root: string; } +export type SupportedComponentRenderer = ComponentRenderer<VueComponent> | + ComponentRenderer<PreactComponent> | ComponentRenderer<ReactComponent> | + ComponentRenderer<SvelteComponent>; export type StaticRenderer = (props: Record<string, any>, ...children: any[]) => Promise<string>; export type StaticRendererGenerator<T = any> = (Component: T) => StaticRenderer; export type DynamicRenderer = (props: Record<string, any>, ...children: any[]) => Promise<string>; diff --git a/src/frontend/render/preact.ts b/src/frontend/render/preact.ts index 3bc266735..5f5c03f56 100644 --- a/src/frontend/render/preact.ts +++ b/src/frontend/render/preact.ts @@ -1,4 +1,4 @@ -import { h, render } from 'preact'; +import { h, render, ComponentType } from 'preact'; import { renderToString } from 'preact-render-to-string'; import type { ComponentRenderer } from '../../@types/renderer'; import { createRenderer } from './renderer'; @@ -6,7 +6,7 @@ import { createRenderer } from './renderer'; // This prevents tree-shaking of render. Function.prototype(render); -const Preact: ComponentRenderer = { +const Preact: ComponentRenderer<ComponentType> = { renderStatic(Component) { return async (props, ...children) => renderToString(h(Component, props, ...children)); }, diff --git a/src/frontend/render/react.ts b/src/frontend/render/react.ts index b9e55f1c9..56c6decb0 100644 --- a/src/frontend/render/react.ts +++ b/src/frontend/render/react.ts @@ -1,9 +1,9 @@ import type { ComponentRenderer } from '../../@types/renderer'; -import React from 'react'; +import React, { ComponentType } from 'react'; import ReactDOMServer from 'react-dom/server'; import { createRenderer } from './renderer'; -const ReactRenderer: ComponentRenderer = { +const ReactRenderer: ComponentRenderer<ComponentType> = { renderStatic(Component) { return async (props, ...children) => ReactDOMServer.renderToString(React.createElement(Component, props, children)); }, diff --git a/src/frontend/render/renderer.ts b/src/frontend/render/renderer.ts index f00569827..02caf145f 100644 --- a/src/frontend/render/renderer.ts +++ b/src/frontend/render/renderer.ts @@ -1,7 +1,7 @@ -import type { ComponentRenderer, DynamicRenderContext, DynamicRendererGenerator, StaticRendererGenerator } from '../../@types/renderer'; +import type { DynamicRenderContext, DynamicRendererGenerator, SupportedComponentRenderer, StaticRendererGenerator } from '../../@types/renderer'; /** Initialize Astro Component renderer for Static and Dynamic components */ -export function createRenderer(renderer: ComponentRenderer) { +export function createRenderer(renderer: SupportedComponentRenderer) { const _static: StaticRendererGenerator = (Component) => renderer.renderStatic(Component); const _imports = (context: DynamicRenderContext) => { const values = Object.values(renderer.imports ?? {}) diff --git a/src/frontend/render/svelte.ts b/src/frontend/render/svelte.ts index 6549d1dde..fcb4ff24b 100644 --- a/src/frontend/render/svelte.ts +++ b/src/frontend/render/svelte.ts @@ -1,7 +1,8 @@ import type { ComponentRenderer } from '../../@types/renderer'; +import type { SvelteComponent } from 'svelte'; import { createRenderer } from './renderer'; -const SvelteRenderer: ComponentRenderer = { +const SvelteRenderer: ComponentRenderer<SvelteComponent> = { renderStatic(Component) { return async (props, ...children) => { const { html } = Component.render(props); diff --git a/src/frontend/render/vue.ts b/src/frontend/render/vue.ts index e28729542..628544775 100644 --- a/src/frontend/render/vue.ts +++ b/src/frontend/render/vue.ts @@ -1,9 +1,10 @@ import type { ComponentRenderer } from '../../@types/renderer'; +import type { Component as VueComponent } from 'vue'; import { renderToString } from '@vue/server-renderer'; import { createSSRApp, h as createElement } from 'vue'; import { createRenderer } from './renderer'; -const Vue: ComponentRenderer = { +const Vue: ComponentRenderer<VueComponent> = { renderStatic(Component) { return async (props, ...children) => { const app = createSSRApp({ |