35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
import {Container} from "@extollo/di";
|
|
import {ResponseFactory} from "./ResponseFactory";
|
|
import {Request} from "../lifecycle/Request";
|
|
import {ViewEngine} from "../../views/ViewEngine";
|
|
|
|
/**
|
|
* Helper function that creates a new ViewResponseFactory to render the given view
|
|
* with the specified data.
|
|
* @param name
|
|
* @param data
|
|
*/
|
|
export function view(name: string, data?: {[key: string]: any}): ViewResponseFactory {
|
|
return new ViewResponseFactory(name, data)
|
|
}
|
|
|
|
/**
|
|
* HTTP response factory that uses the ViewEngine service to render a view
|
|
* and send it as HTML.
|
|
*/
|
|
export class ViewResponseFactory extends ResponseFactory {
|
|
constructor(
|
|
/** The name of the view to render. */
|
|
public readonly viewName: string,
|
|
/** Optional data that should be passed to the view engine as params. */
|
|
public readonly data?: {[key: string]: any}
|
|
) { super() }
|
|
|
|
public async write(request: Request) {
|
|
const viewEngine = <ViewEngine> Container.getContainer().make(ViewEngine)
|
|
request.response.body = await viewEngine.renderByName(this.viewName, this.data || {})
|
|
request.response.setHeader('Content-Type', 'text/html; charset=utf-8')
|
|
return request
|
|
}
|
|
}
|