Skip to content

fix: improve type safety of ssrContext and createRenderer #73

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 8, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions src/runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@ export interface ModuleDependencies {
}

export interface SSRContext {
renderResourceHints?: Function
renderScripts?: Function
renderStyles?: Function
renderResourceHints?: (...args: unknown[]) => unknown
renderScripts?: (...args: unknown[]) => unknown
renderStyles?: (...args: unknown[]) => unknown
// @vitejs/plugin-vue: https://vitejs.dev/guide/ssr.html#generating-preload-directives
modules?: Set<string>
// vue-loader (webpack)
_registeredComponents?: Set<string>
// Cache
_requestDependencies?: ModuleDependencies
[key: string]: any
[key: string]: unknown
}

export interface RenderOptions {
Expand Down Expand Up @@ -237,17 +237,22 @@ export function renderScripts (ssrContext: SSRContext, rendererContext: Renderer
})).join('')
}

export type RenderFunction = (ssrContext: SSRContext, rendererContext: RendererContext) => any
export type RenderFunction = (ssrContext: SSRContext, rendererContext: RendererContext) => unknown

export function createRenderer (createApp: any, renderOptions: RenderOptions & { renderToString: Function }) {
type CreateApp<App> = (ssrContext: SSRContext) => App | Promise<App>
type ImportOf<T> = T | { default: T } | Promise<T> | Promise<{ default: T }>

type RenderToString<App> = (app: App, ssrContext: SSRContext) => string | Promise<string>

export function createRenderer<App> (createApp: ImportOf<CreateApp<App>>, renderOptions: RenderOptions & { renderToString: RenderToString<App> }) {
const rendererContext = createRendererContext(renderOptions)

return {
rendererContext,
async renderToString (ssrContext: SSRContext) {
ssrContext._registeredComponents = ssrContext._registeredComponents || new Set()

const _createApp = await Promise.resolve(createApp).then(r => r.default || r)
const _createApp = await Promise.resolve(createApp).then(r => 'default' in r ? r.default : r)
const app = await _createApp(ssrContext)
const html = await renderOptions.renderToString(app, ssrContext)

Expand Down
Loading