All files / src reporter.ts

88.57% Statements 31/35
78.57% Branches 11/14
92.31% Functions 12/13
87.88% Lines 29/33
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 1071x                                             1x       507x             6x 4x 4x 8x 3x 3x 1x   2x       4x       242x 196x   242x                                 507x     196x 196x     242x 242x               48x 8x     40x       40x 8x     32x 8x     24x     1x  
import { Config } from './config';
import { Context } from './context';
import { DOMNode } from 'dom';
import { Rule } from './rule';
 
export interface Message {
	ruleId: string;
	severity: number;
	message: string;
	line: number;
	column: number;
}
 
export interface Result {
	messages: Message[];
	filePath: string;
}
 
export interface Report {
	valid: boolean;
	results: Result[];
}
 
export class Reporter {
	result: { [filename: string]: Array<Message>; };
 
	constructor(){
		this.result = {};
	}
 
	/**
	 * Merge two or more reports into a single one.
	 */
	public static merge(reports: Report[]): Report {
		const valid = reports.every(report => report.valid);
		const merged: { [key: string]: Result } = {};
		reports.forEach((report: Report) => {
			report.results.forEach((result: Result) => {
				const key = result.filePath;
				if (merged.hasOwnProperty(key)){
					merged[key].messages = [].concat(merged[key].messages, result.messages);
				} else {
					merged[key] = Object.assign({}, result);
				}
			});
		});
		return {valid, results: Object.keys(merged).map(key => merged[key])};
	}
 
	add(node: DOMNode, rule: Rule, message: string, severity: number, context: Context){
		if (!this.result.hasOwnProperty(context.filename)){
			this.result[context.filename] = [];
		}
		this.result[context.filename].push({
			ruleId: rule.name,
			severity,
			message,
			line: context.line,
			column: context.column,
		});
	}
 
	addManual(filename: string, message: Message): void {
		if (!this.result.hasOwnProperty(filename)){
			this.result[filename] = [];
		}
		this.result[filename].push(message);
	}
 
	save(): Report {
		return {
			valid: Object.keys(this.result).length === 0,
			results: Object.keys(this.result).map(filePath => {
				const messages = [].concat(this.result[filePath]).sort(messageSort);
				return {
					filePath,
					messages,
					errorCount: messages.filter(m => m.severity === Config.SEVERITY_ERROR).length,
					warningCount: messages.filter(m => m.severity === Config.SEVERITY_WARN).length,
				};
			}),
		};
	}
}
 
function messageSort(a: Message, b: Message): number {
	if (a.line < b.line){
		return -1;
	}
 
	Iif (a.line > b.line){
		return 1;
	}
 
	if (a.column < b.column){
		return -1;
	}
 
	if (a.column > b.column){
		return 1;
	}
 
	return 0;
}
 
export default Reporter;