53 lines
No EOL
2.2 KiB
TypeScript
53 lines
No EOL
2.2 KiB
TypeScript
import { existsSync, statSync } from 'fs';
|
|
import path from 'path';
|
|
import { Application } from 'express';
|
|
|
|
import { BaseTemplateInputs, BaseTemplateCreator } from './BaseTemplateCreator';
|
|
|
|
export class Renderer {
|
|
/** The default folder name for the views */
|
|
private readonly DEFAULT_VIEWS_FOLDER = 'pages';
|
|
|
|
/** The view engine to use (Ex. EJS, Pug, etc...) */
|
|
private engine: string;
|
|
|
|
/** The path to the folder/directory that contains the view files (Ex. EJS files) */
|
|
private viewsDir: string;
|
|
|
|
/**
|
|
* Creates a new instance of the Renderer class
|
|
*
|
|
* Note, that if the base template doesn't exist and the engine is `ejs`, then a base template will be created automatically.
|
|
*
|
|
* @param viewsDir The path to the folder/directory that contains the view files
|
|
* @param engine The view engine to use (Ex. EJS, Pug, etc...)
|
|
* @param baseTemplateInputs The inputs to use for the base template (if the template is generated)
|
|
* @throws Error if the pages path is not a valid directory
|
|
*/
|
|
constructor(viewsDir: string = path.join(process.cwd(), this.DEFAULT_VIEWS_FOLDER), engine: string = 'ejs', baseTemplateInputs?: BaseTemplateInputs) {
|
|
// Verify the views directory exists and is a directory
|
|
if(!existsSync(viewsDir) || !statSync(viewsDir).isDirectory()) {
|
|
throw new Error('The views directory must be a valid directory');
|
|
}
|
|
|
|
this.viewsDir = path.resolve(viewsDir);
|
|
this.engine = engine;
|
|
|
|
// We can only automatically generate a base template if the engine is `ejs`
|
|
// We also don't want to generate a base template if one already exists
|
|
if(this.engine === 'ejs' && !existsSync(path.resolve(this.viewsDir, 'base.ejs'))) {
|
|
BaseTemplateCreator.create(this.viewsDir, baseTemplateInputs);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sets up the views for the Express app
|
|
*
|
|
* @param app The Express app to setup the views for
|
|
*/
|
|
setup(app: Application) {
|
|
// Set the view engine to the appropriate value (ex. `ejs`) and to serve views from the view files directory
|
|
app.set('view engine', this.engine);
|
|
app.set('views', this.viewsDir);
|
|
}
|
|
} |