UNPKG

2.33 kBJavaScriptView Raw
1import global from 'global';
2const {
3 LOGLEVEL,
4 console
5} = global;
6const levels = {
7 trace: 1,
8 debug: 2,
9 info: 3,
10 warn: 4,
11 error: 5,
12 silent: 10
13};
14const currentLogLevelString = LOGLEVEL;
15const currentLogLevelNumber = levels[currentLogLevelString] || levels.info;
16export const logger = {
17 trace: (message, ...rest) => currentLogLevelNumber <= levels.trace && console.trace(message, ...rest),
18 debug: (message, ...rest) => currentLogLevelNumber <= levels.debug && console.debug(message, ...rest),
19 info: (message, ...rest) => currentLogLevelNumber <= levels.info && console.info(message, ...rest),
20 warn: (message, ...rest) => currentLogLevelNumber <= levels.warn && console.warn(message, ...rest),
21 error: (message, ...rest) => currentLogLevelNumber <= levels.error && console.error(message, ...rest),
22 log: (message, ...rest) => currentLogLevelNumber < levels.silent && console.log(message, ...rest)
23};
24const logged = new Set();
25export const once = type => (message, ...rest) => {
26 if (logged.has(message)) return undefined;
27 logged.add(message);
28 return logger[type](message, ...rest);
29};
30
31once.clear = () => logged.clear();
32
33once.trace = once('trace');
34once.debug = once('debug');
35once.info = once('info');
36once.warn = once('warn');
37once.error = once('error');
38once.log = once('log');
39export const pretty = type => (...args) => {
40 const argArray = [];
41
42 if (args.length) {
43 const startTagRe = /<span\s+style=(['"])([^'"]*)\1\s*>/gi;
44 const endTagRe = /<\/span>/gi;
45 let reResultArray;
46 argArray.push(args[0].replace(startTagRe, '%c').replace(endTagRe, '%c')); // eslint-disable-next-line no-cond-assign
47
48 while (reResultArray = startTagRe.exec(args[0])) {
49 argArray.push(reResultArray[2]);
50 argArray.push('');
51 } // pass through subsequent args since chrome dev tools does not (yet) support console.log styling of the following form: console.log('%cBlue!', 'color: blue;', '%cRed!', 'color: red;');
52 // eslint-disable-next-line no-plusplus
53
54
55 for (let j = 1; j < args.length; j++) {
56 argArray.push(args[j]);
57 }
58 } // eslint-disable-next-line prefer-spread
59
60
61 logger[type].apply(logger, argArray);
62};
63pretty.trace = pretty('trace');
64pretty.debug = pretty('debug');
65pretty.info = pretty('info');
66pretty.warn = pretty('warn');
67pretty.error = pretty('error');
\No newline at end of file