forked from mgechev/codelyzer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtemplate_validator.ts
More file actions
73 lines (71 loc) · 2.78 KB
/
template_validator.ts
File metadata and controls
73 lines (71 loc) · 2.78 KB
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
import 'reflect-metadata';
import {
ComponentMetadata,
PLATFORM_COMMON_PROVIDERS,
Injector,
APPLICATION_COMMON_PROVIDERS
} from 'angular2/core';
import {
COMMON_DIRECTIVES,
COMMON_PIPES
} from 'angular2/common';
import {CompileDirectiveMetadata, CompilePipeMetadata, CompileTypeMetadata} from 'angular2/src/compiler/directive_metadata';
import {TemplateParser} from 'angular2/src/compiler/template_parser';
import {COMPILER_PROVIDERS, TemplateAst, templateVisitAll} from 'angular2/src/compiler/compiler';
import {Parse5DomAdapter} from 'angular2/src/platform/server/parse5_adapter'
import {DirectiveInfo} from './walkers/ts/collect_component_metadata_walker';
import {ComponentMetadataCollector} from './component_metadata_collector';
import {TemplateValidationWalker} from './walkers/template/template_validation_walker';
Parse5DomAdapter.makeCurrent();
export class TemplateValidator {
private injector: Injector;
private parser: TemplateParser;
constructor() {
this.injector = Injector.resolveAndCreate([PLATFORM_COMMON_PROVIDERS, APPLICATION_COMMON_PROVIDERS, COMPILER_PROVIDERS]);
this.parser = this.injector.get(TemplateParser);
}
validate(rootFile: string) {
let collector = new ComponentMetadataCollector();
let tree = collector.getComponentTree(rootFile) || [];
return tree.map(c => this._validateDirectivesInTemplate(c)).filter(e => !!e).concat(
tree.map(c => this._validateExpressionsInTemplate(c)).filter(e => !!e));
}
private _validateDirectivesInTemplate(component: any, _directives = COMMON_DIRECTIVES, _pipes = COMMON_PIPES) {
let meta = component.metadata;
if (meta instanceof ComponentMetadata) {
let directives: any[] = (meta.directives || []).map(this._getDirective.bind(this)).concat(_directives);
let pipes: any[] = (meta.pipes || []).map(this._getPipe.bind(this)).concat(_pipes);
try {
let ast = this.parser.parse(meta.template, directives, pipes, '');
this._validateDirectives(ast);
} catch (e) {
return e;
}
return (meta.directives || []).map(c => this._validateDirectivesInTemplate(c, directives, pipes));
} else {
return null;
}
}
private _validateDirectives(ast: TemplateAst[]) {
templateVisitAll(new TemplateValidationWalker(), ast);
}
private _getDirective(dir) {
let m = dir.metadata;
return CompileDirectiveMetadata.create({
selector: m.selector,
type: new CompileTypeMetadata({ name: dir.classDeclaration.name.text }),
inputs: m.inputs,
outputs: m.outputs
});
}
private _getPipe(pipe) {
let m = pipe.metadata;
return new CompilePipeMetadata({
name: m.name,
type: new CompileTypeMetadata({ name: pipe.classDeclaration.name.text })
});
}
_validateExpressionsInTemplate(c) {
return [];
}
}