1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | "use strict";
|
7 |
|
8 | const { LogType } = require("./Logger");
|
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 | const filterToFunction = item => {
|
46 | if (typeof item === "string") {
|
47 | const regExp = new RegExp(
|
48 | `[\\\\/]${item.replace(
|
49 | // eslint-disable-next-line no-useless-escape
|
50 | /[-[\]{}()*+?.\\^$|]/g,
|
51 | "\\$&"
|
52 | )}([\\\\/]|$|!|\\?)`
|
53 | );
|
54 | return ident => regExp.test(ident);
|
55 | }
|
56 | if (item && typeof item === "object" && typeof item.test === "function") {
|
57 | return ident => item.test(ident);
|
58 | }
|
59 | if (typeof item === "function") {
|
60 | return item;
|
61 | }
|
62 | if (typeof item === "boolean") {
|
63 | return () => item;
|
64 | }
|
65 | };
|
66 |
|
67 |
|
68 |
|
69 |
|
70 | const LogLevel = {
|
71 | none: 6,
|
72 | false: 6,
|
73 | error: 5,
|
74 | warn: 4,
|
75 | info: 3,
|
76 | log: 2,
|
77 | true: 2,
|
78 | verbose: 1
|
79 | };
|
80 |
|
81 |
|
82 |
|
83 |
|
84 |
|
85 | module.exports = ({ level = "info", debug = false, console }) => {
|
86 | const debugFilters =
|
87 | typeof debug === "boolean"
|
88 | ? [() => debug]
|
89 | : ([])
|
90 | .concat(debug)
|
91 | .map(filterToFunction);
|
92 |
|
93 | const loglevel = LogLevel[`${level}`] || 0;
|
94 |
|
95 | |
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 | const logger = (name, type, args) => {
|
102 | const labeledArgs = () => {
|
103 | if (Array.isArray(args)) {
|
104 | if (args.length > 0 && typeof args[0] === "string") {
|
105 | return [`[${name}] ${args[0]}`, ...args.slice(1)];
|
106 | } else {
|
107 | return [`[${name}]`, ...args];
|
108 | }
|
109 | } else {
|
110 | return [];
|
111 | }
|
112 | };
|
113 | const debug = debugFilters.some(f => f(name));
|
114 | switch (type) {
|
115 | case LogType.debug:
|
116 | if (!debug) return;
|
117 |
|
118 | if (typeof console.debug === "function") {
|
119 |
|
120 | console.debug(...labeledArgs());
|
121 | } else {
|
122 | console.log(...labeledArgs());
|
123 | }
|
124 | break;
|
125 | case LogType.log:
|
126 | if (!debug && loglevel > LogLevel.log) return;
|
127 | console.log(...labeledArgs());
|
128 | break;
|
129 | case LogType.info:
|
130 | if (!debug && loglevel > LogLevel.info) return;
|
131 | console.info(...labeledArgs());
|
132 | break;
|
133 | case LogType.warn:
|
134 | if (!debug && loglevel > LogLevel.warn) return;
|
135 | console.warn(...labeledArgs());
|
136 | break;
|
137 | case LogType.error:
|
138 | if (!debug && loglevel > LogLevel.error) return;
|
139 | console.error(...labeledArgs());
|
140 | break;
|
141 | case LogType.trace:
|
142 | if (!debug) return;
|
143 | console.trace();
|
144 | break;
|
145 | case LogType.groupCollapsed:
|
146 | if (!debug && loglevel > LogLevel.log) return;
|
147 | if (!debug && loglevel > LogLevel.verbose) {
|
148 |
|
149 | if (typeof console.groupCollapsed === "function") {
|
150 |
|
151 | console.groupCollapsed(...labeledArgs());
|
152 | } else {
|
153 | console.log(...labeledArgs());
|
154 | }
|
155 | break;
|
156 | }
|
157 |
|
158 | case LogType.group:
|
159 | if (!debug && loglevel > LogLevel.log) return;
|
160 |
|
161 | if (typeof console.group === "function") {
|
162 |
|
163 | console.group(...labeledArgs());
|
164 | } else {
|
165 | console.log(...labeledArgs());
|
166 | }
|
167 | break;
|
168 | case LogType.groupEnd:
|
169 | if (!debug && loglevel > LogLevel.log) return;
|
170 |
|
171 | if (typeof console.groupEnd === "function") {
|
172 |
|
173 | console.groupEnd();
|
174 | }
|
175 | break;
|
176 | case LogType.time: {
|
177 | if (!debug && loglevel > LogLevel.log) return;
|
178 | const ms = args[1] * 1000 + args[2] / 1000000;
|
179 | const msg = `[${name}] ${args[0]}: ${ms} ms`;
|
180 | if (typeof console.logTime === "function") {
|
181 | console.logTime(msg);
|
182 | } else {
|
183 | console.log(msg);
|
184 | }
|
185 | break;
|
186 | }
|
187 | case LogType.profile:
|
188 |
|
189 | if (typeof console.profile === "function") {
|
190 |
|
191 | console.profile(...labeledArgs());
|
192 | }
|
193 | break;
|
194 | case LogType.profileEnd:
|
195 |
|
196 | if (typeof console.profileEnd === "function") {
|
197 |
|
198 | console.profileEnd(...labeledArgs());
|
199 | }
|
200 | break;
|
201 | case LogType.clear:
|
202 | if (!debug && loglevel > LogLevel.log) return;
|
203 |
|
204 | if (typeof console.clear === "function") {
|
205 |
|
206 | console.clear();
|
207 | }
|
208 | break;
|
209 | case LogType.status:
|
210 | if (!debug && loglevel > LogLevel.info) return;
|
211 | if (typeof console.status === "function") {
|
212 | if (args.length === 0) {
|
213 | console.status();
|
214 | } else {
|
215 | console.status(...labeledArgs());
|
216 | }
|
217 | } else {
|
218 | if (args.length !== 0) {
|
219 | console.info(...labeledArgs());
|
220 | }
|
221 | }
|
222 | break;
|
223 | default:
|
224 | throw new Error(`Unexpected LogType ${type}`);
|
225 | }
|
226 | };
|
227 | return logger;
|
228 | };
|