-
-
Notifications
You must be signed in to change notification settings - Fork 60
/
Copy pathtemplate.manager.ts
80 lines (71 loc) · 2.44 KB
/
template.manager.ts
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import * as fs from 'fs';
import * as path from 'path';
import * as config from './config';
import {Logger, LogLevel} from './logger';
/**
* Template manager api interface.
*/
export interface ITemplateManager {
getTemplate(name: string): Template;
}
/**
* Template type for loading file templates and template file content.
*/
export class Template {
/**
* Creates new template
* @param name Template name.
* @param content Template file content.
*/
constructor(public name: string = '', public content: string = '') {
}
/**
* Injects template content params by replacing {} tokens with regex.
* @param params Template key/value pair params to inject.
*/
public replace(params: any): string {
let templateContent = this.content;
Object.keys(params).map(key => {
templateContent = templateContent.replace(RegExp(`{${key}}`, 'g'), params[key]);
});
return templateContent;
}
}
/**
* Template manager implementation for html and json files.
*/
export class TemplateManager implements ITemplateManager {
private templates: Array<Template>; // loaded templates
private logger: Logger = new Logger('template.manager:', config.logLevel);
/**
* Creates new template manager and loads templates
* from the specified template folder.
* @param templateFolder Template folder to inspect.
*/
public constructor(private templateFolder: string) {
this.templates = this.loadTemplates();
}
/**
* Loads .html and .json templates from the specified template folder.
* @param templateFolder Template folder to inspect.
*/
private loadTemplates(): Array<Template> {
this.logger.debug('loadTemplates(): loading file templates... \n templateFolder:', this.templateFolder);
const fileNames: string[] = fs.readdirSync(this.templateFolder)
.filter(fileName => fileName.endsWith('.html') || fileName.endsWith('.json'));
const templates: Array<Template> = [];
// TODO: change this to read file async ???
fileNames.forEach(fileName => templates.push(
new Template(fileName, fs.readFileSync(path.join(this.templateFolder, fileName), 'utf8')) // file content
));
this.logger.debug('loadTemplates(): templates:', fileNames);
return templates;
}
/**
* Gets file template with the specified name.
* @param name Template name to find.
*/
public getTemplate(name: string): Template {
return this.templates.find(template => template.name === name);
}
}