Skip to content

Commit 0964b18

Browse files
committed
1.5.4
1 parent ebc94ef commit 0964b18

File tree

6 files changed

+159
-1
lines changed

6 files changed

+159
-1
lines changed

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"tsc": "tsc --watch",
1515
"test": "tsc && jest",
1616
"upload-coverage": "codecov -t $CODECOV_TOKEN",
17-
"publish": "npm run build && npm test && npm publish"
17+
"publish": "npm run build && npm publish"
1818
},
1919
"devDependencies": {
2020
"@types/jest": "25.1.1",

Diff for: src/enum/log-levels.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export enum LogLevels {
2+
DEBUG = "debug",
3+
INFO = "info",
4+
WARN = "warn",
5+
ERROR = "error",
6+
FATAL = "fatal",
7+
}

Diff for: src/interfaces/logger-options.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import {LogLevels} from "../enum/log-levels";
2+
3+
export interface ILoggerOptions {
4+
isEnabled: boolean;
5+
logLevel: LogLevels;
6+
separator: string;
7+
showConsoleColors: boolean;
8+
showLogLevel: boolean;
9+
showMethodName: boolean;
10+
stringifyArguments: boolean;
11+
}

Diff for: src/interfaces/logger.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {ILoggerOptions} from "./logger-options";
2+
3+
export interface ILogger {
4+
install(Vue: any, options: ILoggerOptions);
5+
6+
isValidOptions(options: ILoggerOptions, logLevels: string[]): boolean;
7+
}

Diff for: src/lib/types/index.d.ts

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Augment the typings of Vue.js
3+
*/
4+
import Vue = require('vue');
5+
6+
import * as VueLogger from '../../index';
7+
8+
export interface Log {
9+
debug(...args: any[]): void;
10+
11+
info(...args: any[]): void;
12+
13+
warn(...args: any[]): void;
14+
15+
error(...args: any[]): void;
16+
17+
fatal(...args: any[]): void;
18+
}
19+
20+
declare module 'vue/types/vue' {
21+
interface Vue {
22+
$log: Log;
23+
}
24+
}
25+
26+
export default VueLogger;

Diff for: src/vue-logger.ts

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import {LogLevels} from "./enum/log-levels";
2+
import {ILogger} from "./interfaces/logger";
3+
import {ILoggerOptions} from "./interfaces/logger-options";
4+
5+
class VueLogger implements ILogger {
6+
7+
private errorMessage: string = "Provided options for vuejs-logger are not valid.";
8+
private logLevels: string[] = Object.keys(LogLevels).map((l) => l.toLowerCase());
9+
10+
public install(Vue: any, options: ILoggerOptions) {
11+
options = Object.assign(this.getDefaultOptions(), options);
12+
13+
if (this.isValidOptions(options, this.logLevels)) {
14+
Vue.$log = this.initLoggerInstance(options, this.logLevels);
15+
Vue.prototype.$log = Vue.$log;
16+
} else {
17+
throw new Error(this.errorMessage);
18+
}
19+
}
20+
21+
public isValidOptions(options: ILoggerOptions, logLevels: string[]): boolean {
22+
if (!(options.logLevel && typeof options.logLevel === "string" && logLevels.indexOf(options.logLevel) > -1)) {
23+
return false;
24+
}
25+
if (options.stringifyArguments && typeof options.stringifyArguments !== "boolean") {
26+
return false;
27+
}
28+
if (options.showLogLevel && typeof options.showLogLevel !== "boolean") {
29+
return false;
30+
}
31+
if (options.showConsoleColors && typeof options.showConsoleColors !== "boolean") {
32+
return false;
33+
}
34+
if (options.separator && (typeof options.separator !== "string" || (typeof options.separator === "string" && options.separator.length > 3))) {
35+
return false;
36+
}
37+
if (typeof options.isEnabled !== "boolean") {
38+
return false;
39+
}
40+
return !(options.showMethodName && typeof options.showMethodName !== "boolean");
41+
}
42+
43+
private getMethodName(): string {
44+
let error = {} as any;
45+
46+
try {
47+
throw new Error("");
48+
} catch (e) {
49+
error = e;
50+
}
51+
// IE9 does not have .stack property
52+
if (error.stack === undefined) {
53+
return "";
54+
}
55+
let stackTrace = error.stack.split("\n")[3];
56+
if (/ /.test(stackTrace)) {
57+
stackTrace = stackTrace.trim().split(" ")[1];
58+
}
59+
if (stackTrace && stackTrace.indexOf(".") > -1) {
60+
stackTrace = stackTrace.split(".")[1];
61+
}
62+
return stackTrace;
63+
}
64+
65+
private initLoggerInstance(options: ILoggerOptions, logLevels: string[]) {
66+
const logger = {};
67+
logLevels.forEach((logLevel) => {
68+
if (logLevels.indexOf(logLevel) >= logLevels.indexOf(options.logLevel) && options.isEnabled) {
69+
logger[logLevel] = (...args) => {
70+
const methodName = this.getMethodName();
71+
const methodNamePrefix = options.showMethodName ? methodName + ` ${options.separator} ` : "";
72+
const logLevelPrefix = options.showLogLevel ? logLevel + ` ${options.separator} ` : "";
73+
const formattedArguments = options.stringifyArguments ? args.map((a) => JSON.stringify(a)) : args;
74+
const logMessage = `${logLevelPrefix} ${methodNamePrefix}`;
75+
this.printLogMessage(logLevel, logMessage, options.showConsoleColors, formattedArguments);
76+
return `${logMessage} ${formattedArguments.toString()}`;
77+
};
78+
} else {
79+
logger[logLevel] = () => undefined;
80+
}
81+
},
82+
);
83+
return logger;
84+
}
85+
86+
private printLogMessage(logLevel: string, logMessage: string, showConsoleColors: boolean, formattedArguments: any) {
87+
if (showConsoleColors && (logLevel === "warn" || logLevel === "error" || logLevel === "fatal")) {
88+
console[logLevel === "fatal" ? "error" : logLevel](logMessage, ...formattedArguments);
89+
} else {
90+
console.log(logMessage, ...formattedArguments);
91+
}
92+
}
93+
94+
private getDefaultOptions(): ILoggerOptions {
95+
return {
96+
isEnabled: true,
97+
logLevel: LogLevels.DEBUG,
98+
separator: "|",
99+
showConsoleColors: false,
100+
showLogLevel: false,
101+
showMethodName: false,
102+
stringifyArguments: false,
103+
};
104+
}
105+
}
106+
107+
export default new VueLogger();

0 commit comments

Comments
 (0)