123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
-
- "use strict";
-
- const { LogType } = require("./Logger");
-
- /** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */
- /** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */
- /** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */
-
- /** @typedef {function(string): boolean} FilterFunction */
-
- /**
- * @typedef {Object} LoggerOptions
- * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel
- * @property {FilterTypes|boolean} debug filter for debug logging
- * @property {Console & { status?: Function, logTime?: Function }} console the console to log to
- */
-
- /**
- * @param {FilterItemTypes} item an input item
- * @returns {FilterFunction} filter funtion
- */
- const filterToFunction = item => {
- if (typeof item === "string") {
- const regExp = new RegExp(
- `[\\\\/]${item.replace(
- // eslint-disable-next-line no-useless-escape
- /[-[\]{}()*+?.\\^$|]/g,
- "\\$&"
- )}([\\\\/]|$|!|\\?)`
- );
- return ident => regExp.test(ident);
- }
- if (item && typeof item === "object" && typeof item.test === "function") {
- return ident => item.test(ident);
- }
- if (typeof item === "function") {
- return item;
- }
- if (typeof item === "boolean") {
- return () => item;
- }
- };
-
- /**
- * @enum {number}
- */
- const LogLevel = {
- none: 6,
- false: 6,
- error: 5,
- warn: 4,
- info: 3,
- log: 2,
- true: 2,
- verbose: 1
- };
-
- /**
- * @param {LoggerOptions} options options object
- * @returns {function(string, LogTypeEnum, any[]): void} logging function
- */
- module.exports = ({ level = "info", debug = false, console }) => {
- const debugFilters =
- typeof debug === "boolean"
- ? [() => debug]
- : /** @type {FilterItemTypes[]} */ ([])
- .concat(debug)
- .map(filterToFunction);
- /** @type {number} */
- const loglevel = LogLevel[`${level}`] || 0;
-
- /**
- * @param {string} name name of the logger
- * @param {LogTypeEnum} type type of the log entry
- * @param {any[]} args arguments of the log entry
- * @returns {void}
- */
- const logger = (name, type, args) => {
- const labeledArgs = () => {
- if (Array.isArray(args)) {
- if (args.length > 0 && typeof args[0] === "string") {
- return [`[${name}] ${args[0]}`, ...args.slice(1)];
- } else {
- return [`[${name}]`, ...args];
- }
- } else {
- return [];
- }
- };
- const debug = debugFilters.some(f => f(name));
- switch (type) {
- case LogType.debug:
- if (!debug) return;
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- if (typeof console.debug === "function") {
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- console.debug(...labeledArgs());
- } else {
- console.log(...labeledArgs());
- }
- break;
- case LogType.log:
- if (!debug && loglevel > LogLevel.log) return;
- console.log(...labeledArgs());
- break;
- case LogType.info:
- if (!debug && loglevel > LogLevel.info) return;
- console.info(...labeledArgs());
- break;
- case LogType.warn:
- if (!debug && loglevel > LogLevel.warn) return;
- console.warn(...labeledArgs());
- break;
- case LogType.error:
- if (!debug && loglevel > LogLevel.error) return;
- console.error(...labeledArgs());
- break;
- case LogType.trace:
- if (!debug) return;
- console.trace();
- break;
- case LogType.groupCollapsed:
- if (!debug && loglevel > LogLevel.log) return;
- if (!debug && loglevel > LogLevel.verbose) {
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- if (typeof console.groupCollapsed === "function") {
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- console.groupCollapsed(...labeledArgs());
- } else {
- console.log(...labeledArgs());
- }
- break;
- }
- // falls through
- case LogType.group:
- if (!debug && loglevel > LogLevel.log) return;
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- if (typeof console.group === "function") {
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- console.group(...labeledArgs());
- } else {
- console.log(...labeledArgs());
- }
- break;
- case LogType.groupEnd:
- if (!debug && loglevel > LogLevel.log) return;
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- if (typeof console.groupEnd === "function") {
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- console.groupEnd();
- }
- break;
- case LogType.time: {
- if (!debug && loglevel > LogLevel.log) return;
- const ms = args[1] * 1000 + args[2] / 1000000;
- const msg = `[${name}] ${args[0]}: ${ms}ms`;
- if (typeof console.logTime === "function") {
- console.logTime(msg);
- } else {
- console.log(msg);
- }
- break;
- }
- case LogType.profile:
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- if (typeof console.profile === "function") {
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- console.profile(...labeledArgs());
- }
- break;
- case LogType.profileEnd:
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- if (typeof console.profileEnd === "function") {
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- console.profileEnd(...labeledArgs());
- }
- break;
- case LogType.clear:
- if (!debug && loglevel > LogLevel.log) return;
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- if (typeof console.clear === "function") {
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
- console.clear();
- }
- break;
- case LogType.status:
- if (!debug && loglevel > LogLevel.info) return;
- if (typeof console.status === "function") {
- if (args.length === 0) {
- console.status();
- } else {
- console.status(...labeledArgs());
- }
- } else {
- if (args.length !== 0) {
- console.info(...labeledArgs());
- }
- }
- break;
- default:
- throw new Error(`Unexpected LogType ${type}`);
- }
- };
- return logger;
- };
|