-
Notifications
You must be signed in to change notification settings - Fork 50
/
Copy pathvue-logger.ts
107 lines (96 loc) · 4.2 KB
/
vue-logger.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
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
107
import {LogLevels} from "./enum/log-levels";
import {ILogger} from "./interfaces/logger";
import {ILoggerOptions} from "./interfaces/logger-options";
class VueLogger implements ILogger {
private errorMessage: string = "Provided options for vuejs-logger are not valid.";
private logLevels: string[] = Object.keys(LogLevels).map((l) => l.toLowerCase());
public install(Vue: any, options: ILoggerOptions) {
options = Object.assign(this.getDefaultOptions(), options);
if (this.isValidOptions(options, this.logLevels)) {
Vue.$log = this.initLoggerInstance(options, this.logLevels);
Vue.prototype.$log = Vue.$log;
} else {
throw new Error(this.errorMessage);
}
}
public isValidOptions(options: ILoggerOptions, logLevels: string[]): boolean {
if (!(options.logLevel && typeof options.logLevel === "string" && logLevels.indexOf(options.logLevel) > -1)) {
return false;
}
if (options.stringifyArguments && typeof options.stringifyArguments !== "boolean") {
return false;
}
if (options.showLogLevel && typeof options.showLogLevel !== "boolean") {
return false;
}
if (options.showConsoleColors && typeof options.showConsoleColors !== "boolean") {
return false;
}
if (options.separator && (typeof options.separator !== "string" || (typeof options.separator === "string" && options.separator.length > 3))) {
return false;
}
if (typeof options.isEnabled !== "boolean") {
return false;
}
return !(options.showMethodName && typeof options.showMethodName !== "boolean");
}
private getMethodName(): string {
let error = {} as any;
try {
throw new Error("");
} catch (e) {
error = e;
}
// IE9 does not have .stack property
if (error.stack === undefined) {
return "";
}
let stackTrace = error.stack.split("\n")[3];
if (/ /.test(stackTrace)) {
stackTrace = stackTrace.trim().split(" ")[1];
}
if (stackTrace && stackTrace.indexOf(".") > -1) {
stackTrace = stackTrace.split(".")[1];
}
return stackTrace;
}
private initLoggerInstance(options: ILoggerOptions, logLevels: string[]) {
const logger = {};
logLevels.forEach((logLevel) => {
if (logLevels.indexOf(logLevel) >= logLevels.indexOf(options.logLevel) && options.isEnabled) {
logger[logLevel] = (...args) => {
const methodName = this.getMethodName();
const methodNamePrefix = options.showMethodName ? methodName + ` ${options.separator} ` : "";
const logLevelPrefix = options.showLogLevel ? logLevel + ` ${options.separator} ` : "";
const formattedArguments = options.stringifyArguments ? args.map((a) => JSON.stringify(a)) : args;
const logMessage = `${logLevelPrefix} ${methodNamePrefix}`;
this.printLogMessage(logLevel, logMessage, options.showConsoleColors, formattedArguments);
return `${logMessage} ${formattedArguments.toString()}`;
};
} else {
logger[logLevel] = () => undefined;
}
},
);
return logger;
}
private printLogMessage(logLevel: string, logMessage: string, showConsoleColors: boolean, formattedArguments: any) {
if (showConsoleColors && (logLevel === "warn" || logLevel === "error" || logLevel === "fatal")) {
console[logLevel === "fatal" ? "error" : logLevel](logMessage, ...formattedArguments);
} else {
console.log(logMessage, ...formattedArguments);
}
}
private getDefaultOptions(): ILoggerOptions {
return {
isEnabled: true,
logLevel: LogLevels.DEBUG,
separator: "|",
showConsoleColors: false,
showLogLevel: false,
showMethodName: false,
stringifyArguments: false,
};
}
}
export default new VueLogger();