136 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
/* eslint-disable prefer-rest-params */
 | 
						|
Object.defineProperty(exports, "__esModule", { value: true });
 | 
						|
exports.getArrow = exports.getInstance = void 0;
 | 
						|
const util = require("util");
 | 
						|
let loggerInstance;
 | 
						|
const defaultProvider = {
 | 
						|
    // tslint:disable: no-console
 | 
						|
    log: console.log,
 | 
						|
    debug: console.log,
 | 
						|
    info: console.info,
 | 
						|
    warn: console.warn,
 | 
						|
    error: console.error,
 | 
						|
};
 | 
						|
// log level 'weight'
 | 
						|
var LEVELS;
 | 
						|
(function (LEVELS) {
 | 
						|
    LEVELS[LEVELS["debug"] = 10] = "debug";
 | 
						|
    LEVELS[LEVELS["info"] = 20] = "info";
 | 
						|
    LEVELS[LEVELS["warn"] = 30] = "warn";
 | 
						|
    LEVELS[LEVELS["error"] = 50] = "error";
 | 
						|
    LEVELS[LEVELS["silent"] = 80] = "silent";
 | 
						|
})(LEVELS || (LEVELS = {}));
 | 
						|
function getInstance() {
 | 
						|
    if (!loggerInstance) {
 | 
						|
        loggerInstance = new Logger();
 | 
						|
    }
 | 
						|
    return loggerInstance;
 | 
						|
}
 | 
						|
exports.getInstance = getInstance;
 | 
						|
class Logger {
 | 
						|
    constructor() {
 | 
						|
        this.setLevel('info');
 | 
						|
        this.setProvider(() => defaultProvider);
 | 
						|
    }
 | 
						|
    // log will log messages, regardless of logLevels
 | 
						|
    log() {
 | 
						|
        this.provider.log(this._interpolate.apply(null, arguments));
 | 
						|
    }
 | 
						|
    debug() {
 | 
						|
        if (this._showLevel('debug')) {
 | 
						|
            this.provider.debug(this._interpolate.apply(null, arguments));
 | 
						|
        }
 | 
						|
    }
 | 
						|
    info() {
 | 
						|
        if (this._showLevel('info')) {
 | 
						|
            this.provider.info(this._interpolate.apply(null, arguments));
 | 
						|
        }
 | 
						|
    }
 | 
						|
    warn() {
 | 
						|
        if (this._showLevel('warn')) {
 | 
						|
            this.provider.warn(this._interpolate.apply(null, arguments));
 | 
						|
        }
 | 
						|
    }
 | 
						|
    error() {
 | 
						|
        if (this._showLevel('error')) {
 | 
						|
            this.provider.error(this._interpolate.apply(null, arguments));
 | 
						|
        }
 | 
						|
    }
 | 
						|
    setLevel(v) {
 | 
						|
        if (this.isValidLevel(v)) {
 | 
						|
            this.logLevel = v;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    setProvider(fn) {
 | 
						|
        if (fn && this.isValidProvider(fn)) {
 | 
						|
            this.provider = fn(defaultProvider);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    isValidProvider(fnProvider) {
 | 
						|
        const result = true;
 | 
						|
        if (fnProvider && typeof fnProvider !== 'function') {
 | 
						|
            throw new Error('[HPM] Log provider config error. Expecting a function.');
 | 
						|
        }
 | 
						|
        return result;
 | 
						|
    }
 | 
						|
    isValidLevel(levelName) {
 | 
						|
        const validLevels = Object.keys(LEVELS);
 | 
						|
        const isValid = validLevels.includes(levelName);
 | 
						|
        if (!isValid) {
 | 
						|
            throw new Error('[HPM] Log level error. Invalid logLevel.');
 | 
						|
        }
 | 
						|
        return isValid;
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * Decide to log or not to log, based on the log levels 'weight'
 | 
						|
     * @param  {String}  showLevel [debug, info, warn, error, silent]
 | 
						|
     * @return {Boolean}
 | 
						|
     */
 | 
						|
    _showLevel(showLevel) {
 | 
						|
        let result = false;
 | 
						|
        const currentLogLevel = LEVELS[this.logLevel];
 | 
						|
        if (currentLogLevel && currentLogLevel <= LEVELS[showLevel]) {
 | 
						|
            result = true;
 | 
						|
        }
 | 
						|
        return result;
 | 
						|
    }
 | 
						|
    // make sure logged messages and its data are return interpolated
 | 
						|
    // make it possible for additional log data, such date/time or custom prefix.
 | 
						|
    _interpolate(format, ...args) {
 | 
						|
        const result = util.format(format, ...args);
 | 
						|
        return result;
 | 
						|
    }
 | 
						|
}
 | 
						|
/**
 | 
						|
 * -> normal proxy
 | 
						|
 * => router
 | 
						|
 * ~> pathRewrite
 | 
						|
 * ≈> router + pathRewrite
 | 
						|
 *
 | 
						|
 * @param  {String} originalPath
 | 
						|
 * @param  {String} newPath
 | 
						|
 * @param  {String} originalTarget
 | 
						|
 * @param  {String} newTarget
 | 
						|
 * @return {String}
 | 
						|
 */
 | 
						|
function getArrow(originalPath, newPath, originalTarget, newTarget) {
 | 
						|
    const arrow = ['>'];
 | 
						|
    const isNewTarget = originalTarget !== newTarget; // router
 | 
						|
    const isNewPath = originalPath !== newPath; // pathRewrite
 | 
						|
    if (isNewPath && !isNewTarget) {
 | 
						|
        arrow.unshift('~');
 | 
						|
    }
 | 
						|
    else if (!isNewPath && isNewTarget) {
 | 
						|
        arrow.unshift('=');
 | 
						|
    }
 | 
						|
    else if (isNewPath && isNewTarget) {
 | 
						|
        arrow.unshift('≈');
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        arrow.unshift('-');
 | 
						|
    }
 | 
						|
    return arrow.join('');
 | 
						|
}
 | 
						|
exports.getArrow = getArrow;
 |