UNPKG

@fababracx/ngx-console-logger

Version:

Logging library for Angular

490 lines (476 loc) 21.9 kB
import * as i0 from '@angular/core'; import { Component, Input, InjectionToken, APP_INITIALIZER, NgModule } from '@angular/core'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; import { CommonModule } from '@angular/common'; const ngxConsoleLoggerConfigDefaultPrefixMinPad = 5; const ngxConsoleLoggerConfigDefault = { debug: 'green', info: 'blue', error: 'red', warn: 'orange', // NG hooks ngOnChanges: ['orange', 'ngOnChange'], ngOnInit: ['orange', 'ngOnInit'], ngDoCheck: ['orange', 'ngDoCheck'], ngOnDestroy: ['orange', 'ngOnDestroy'], // Create create: ['lightgreen', 'CREATE'], createComponent: ['lightgreen', 'CREATE - Component'], createDirective: ['lightgreen', 'CREATE - Directive'], createService: ['lightgreen', 'CREATE - Service'], createPipe: ['lightgreen', 'CREATE - Pipe'], createGuard: ['lightgreen', 'CREATE - Guard'], createResolver: ['lightgreen', 'CREATE - Resolver'], // Performance logs perf: ['darkturquoise', 'PERF'], perfComponent: ['darkturquoise', 'PERF - Component'], perfCD: ['darkturquoise', 'PERF - CD'], perfDom: ['darkturquoise', 'PERF - Dom'], // Network logs network: ['blue', 'HTTP'], networkRequest: ['blue', 'HTTP - Request'], networkResponse: ['blue', 'HTTP - Response'], networkError: ['red', 'HTTP - Error'], networkCreate: ['green', 'HTTP - Create'], // NG types resolve: 'brown', guard: 'sandybrown', validator: 'plum', pipe: 'brown', callback: 'violet', state: 'blueviolet', // Specific logs for NGXS, Akita action: ['#8f72cf', '@ACTION'], select: ['#84467c', '@SELECT'], errorState: ['#cf3c04', '@ERROR'], effect: ['8F72CF', '@EFFECT'], // Tests tu: ['green', 'TU'], ti: ['green', 'TI'], te2e: ['green', 'E2E'], // Colors pink: ['#FF40BD;', '####'], red: ['red', '####'], orange: ['orange', '####'], green: ['springgreen', '####'], blue: ['cadetblue', '####'], violet: ['blueviolet', '####'] }; class NgxConsoleLogger { // eslint-disable-next-line @typescript-eslint/no-empty-function static fnConsoleLoggerNull(_message, ..._optionalParams) { } static init(ngxConsoleLoggerConfig = ngxConsoleLoggerConfigDefault, activatePerfsLogs = false, defaultPrefixMinPad = ngxConsoleLoggerConfigDefaultPrefixMinPad) { NgxConsoleLogger.config = ngxConsoleLoggerConfig; NgxConsoleLogger.prefixMinPad = defaultPrefixMinPad || NgxConsoleLogger.prefixMinPad; if (NgxConsoleLogger.config) { // Init all keys Object.keys(ngxConsoleLoggerConfig).forEach(key => { var _a; const configData = ((_a = NgxConsoleLogger.config) === null || _a === void 0 ? void 0 : _a[key]) || []; const { logPrefix, logColor } = NgxConsoleLogger.getConsoleData(key, configData) || {}; NgxConsoleLogger[key] = NgxConsoleLogger.initConsole(logPrefix, logColor); }); // deactivate or activate perfs logs NgxConsoleLogger.deactivatePerfLogs(); if (activatePerfsLogs) { NgxConsoleLogger.activatePerfLogs(); } } } static initLog(key, configData) { if (!!NgxConsoleLogger[key] && (!NgxConsoleLogger.config || !NgxConsoleLogger.config[key])) { NgxConsoleLogger.config = !NgxConsoleLogger.config ? {} : NgxConsoleLogger.config; NgxConsoleLogger.config[key] = configData; const { logPrefix, logColor } = NgxConsoleLogger.getConsoleData(key, configData) || {}; NgxConsoleLogger[key] = NgxConsoleLogger.initConsole(logPrefix, logColor); } } static activateLog(key) { var _a; if (!!NgxConsoleLogger.config && Object.keys(NgxConsoleLogger.config).find(k => key === k)) { const configData = ((_a = NgxConsoleLogger.config) === null || _a === void 0 ? void 0 : _a[key]) || []; const { logPrefix, logColor } = NgxConsoleLogger.getConsoleData(key, configData) || {}; NgxConsoleLogger[key] = NgxConsoleLogger.initConsole(logPrefix, logColor); } } static activateLogs(...keys) { keys.forEach(key => NgxConsoleLogger.activateLog(key)); } static activatePerfLogs() { NgxConsoleLogger.activateLogs('perf', 'perfCD', 'perfComponent', 'perfDom'); } static deactivateLog(key) { if (!!NgxConsoleLogger.config && Object.keys(NgxConsoleLogger.config).find(k => key === k)) { NgxConsoleLogger[key] = NgxConsoleLogger.fnConsoleLoggerNull; } } static deactivateLogs(...keys) { keys.forEach(key => NgxConsoleLogger.deactivateLog(key)); } static deactivatePerfLogs() { NgxConsoleLogger.deactivateLogs('perf', 'perfCD', 'perfComponent', 'perfDom'); } static getConsoleData(key, configData) { let logPrefix = key; let logColor; if (configData instanceof Array) { if (configData.length >= 2) { logPrefix = configData[1]; logColor = configData[0]; } else { console.error(`Bad configuration for key ${logPrefix}`); } } else { logColor = configData; } return { logPrefix, logColor }; } static initConsole(logPrefix, logColor) { if (!logPrefix || !logColor) { return console.log.bind(console); } // Capitalize prefix const logPrefixCapitalized = NgxConsoleLogger.prepareLogPrefix(logPrefix); const ua = window.navigator.userAgent; // Check if ie const msie = ua === null || ua === void 0 ? void 0 : ua.indexOf('MSIE '); if (msie > 0) { return console.info.bind(console, `${logPrefixCapitalized}:`); } else { return console.info.bind(console, `%c${logPrefixCapitalized}:`, `color: ${logColor}`); } } static prepareLogPrefix(logPrefix) { let logPrefixCapitalized = `${logPrefix.charAt(0).toUpperCase()}${logPrefix.slice(1)}`; // padEnd does not exits in IE11 // <=> logPrefixCapitalized.padEnd(NgxConsoleLogger.prefixLength, ' ') if (logPrefixCapitalized.length < NgxConsoleLogger.prefixMinPad) { while (logPrefixCapitalized.length < NgxConsoleLogger.prefixMinPad) { // Add space logPrefixCapitalized = `${logPrefixCapitalized} `; } } return logPrefixCapitalized; } } NgxConsoleLogger.prefixMinPad = ngxConsoleLoggerConfigDefaultPrefixMinPad; NgxConsoleLogger.config = {}; NgxConsoleLogger.debug = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.info = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.warn = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.error = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.ngOnChanges = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.ngOnInit = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.ngDoCheck = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.ngOnDestroy = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.create = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createComponent = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createDirective = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createService = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createPipe = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createGuard = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createResolver = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.perf = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.perfComponent = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.perfCD = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.perfDom = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.network = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.networkRequest = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.networkResponse = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.networkError = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.networkCreate = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.resolve = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.guard = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.validator = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.pipe = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.callback = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.state = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.action = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.select = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.errorState = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.effect = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.tu = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.ti = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.te2e = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.pink = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.red = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.orange = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.green = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.blue = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.violet = NgxConsoleLogger.fnConsoleLoggerNull; class PerfRefreshCountComponent { constructor() { this.counter = 1; /** * Component name */ this.name = ''; /** * Counter label */ this.counterLabel = 'Refresh'; } /** * Log number of angular component refresh */ onRefreshCounter() { NgxConsoleLogger.perfComponent(`${this.name} ${this.counter++} ${this.counterLabel}`); } } PerfRefreshCountComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: PerfRefreshCountComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); PerfRefreshCountComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: PerfRefreshCountComponent, selector: "ngx-cl-perf-refresh-count", inputs: { name: "name", counterLabel: "counterLabel" }, ngImport: i0, template: ` {{ onRefreshCounter() }} `, isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: PerfRefreshCountComponent, decorators: [{ type: Component, args: [{ // eslint-disable-next-line @angular-eslint/component-selector selector: 'ngx-cl-perf-refresh-count', template: ` {{ onRefreshCounter() }} ` }] }], propDecorators: { name: [{ type: Input }], counterLabel: [{ type: Input }] } }); class RootPerfRefreshCountComponent { constructor() { this.counterRefresh = 1; this.counterDomRefresh = 1; /** * Counter label */ this.counterLabel = 'Refresh'; } /** * Log number of angular do check */ ngDoCheck() { if (NgxConsoleLogger.config) { // Called at the beginning of every change detection run NgxConsoleLogger.perfCD(`${this.counterRefresh++} ${this.counterLabel}`); } } /** * Log number of angular dom refresh */ onRefreshDomCounter() { if (NgxConsoleLogger.config) { NgxConsoleLogger.perfDom(`${this.counterDomRefresh++} ${this.counterLabel}`); } } } RootPerfRefreshCountComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: RootPerfRefreshCountComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); RootPerfRefreshCountComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: RootPerfRefreshCountComponent, selector: "ngx-cl-root-perf-refresh-count", inputs: { counterLabel: "counterLabel" }, ngImport: i0, template: ` {{ onRefreshDomCounter() }} `, isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: RootPerfRefreshCountComponent, decorators: [{ type: Component, args: [{ // eslint-disable-next-line @angular-eslint/component-selector selector: 'ngx-cl-root-perf-refresh-count', template: ` {{ onRefreshDomCounter() }} ` }] }], propDecorators: { counterLabel: [{ type: Input }] } }); const LifecycleLog = (type = 'debug', LIFECYCLE_HOOKS = ['ngOnInit', 'ngOnChanges', 'ngOnDestroy'], config = ngxConsoleLoggerConfigDefault) => { NgxConsoleLogger.init(config); console.log('constructor'); return (target) => { console.log('target', target); // if (!environment.production) { // You can add/remove events for your needs const component = target.name; LIFECYCLE_HOOKS.forEach(hook => { console.log('hook'); const original = target.prototype[hook]; target.prototype[hook] = (...args) => { if (NgxConsoleLogger === null || NgxConsoleLogger === void 0 ? void 0 : NgxConsoleLogger[hook]) { NgxConsoleLogger[hook](`${component}`, ...args); } else if (type) { NgxConsoleLogger[type](`${component} - ${hook}`, ...args); } else { console.log(`${component} - ${hook}`, ...args); } return original === null || original === void 0 ? void 0 : original.apply(this, args); }; // target.prototype[hook](); }); // } return target; }; }; const MethodConsoleLogger = (type = 'info', config = ngxConsoleLoggerConfigDefault) => { NgxConsoleLogger.init(config); return (target, propertyKey, descriptor) => { const targetMethod = descriptor.value; descriptor.value = (...args) => { if (type) { NgxConsoleLogger[type].apply(propertyKey, args); } else { console.log(propertyKey, args); } return targetMethod.apply(this, args); }; return descriptor; }; }; function PropertyConsoleLogger(type = 'info', logSetter = true, logGetter = false, config = ngxConsoleLoggerConfigDefault) { NgxConsoleLogger.init(config); // eslint-disable-next-line @typescript-eslint/ban-types return (target, propertyKey) => { let propertyValue; // eslint-disable-next-line @typescript-eslint/no-unused-vars function getter() { if (logGetter) { if (type) { NgxConsoleLogger[type](propertyValue); } else { console.log(propertyValue); } } return propertyValue; } // eslint-disable-next-line @typescript-eslint/no-unused-vars function setter(value) { if (value instanceof Observable) { if (logSetter) { propertyValue = value.pipe(tap(res => { const isArrayOfObjects = Array.isArray(res) && typeof res[0] === 'object'; const logType = isArrayOfObjects ? 'table' : 'log'; console.groupCollapsed(propertyKey === null || propertyKey === void 0 ? void 0 : propertyKey.toString()); console[logType](res); console.groupEnd(); })); } } else { if (logSetter) { if (type) { NgxConsoleLogger[type](value); } else { console.log(value); } } propertyValue = value; } } }; } const ngxConsoleLoggerConfigProd = { // only error and warn will output to the console. error: 'red', warn: 'orange', // Performance logs perf: ['darkturquoise', 'PERF'], perfComponent: ['darkturquoise', 'PERF - Component'], perfCD: ['darkturquoise', 'PERF - CD'], perfDom: ['darkturquoise', 'PERF - Dom'] }; let initialized = false; function ngxConsoleLoggerFactory(useDefaultConfig, environment, activatePerfsLogs, defaultPrefixLength) { // https://github.com/ng-packagr/ng-packagr/issues/696 const initConfig = () => { return new Promise((resolve, _reject) => { setTimeout(() => { if (!initialized) { if (!useDefaultConfig) { checkEnvironmentConfig(environment); } /** * Check if you have a Specific config defined, if so take it. */ const config = environment.production ? ngxConsoleLoggerConfigProd : ngxConsoleLoggerConfigDefault; let ngxConsoleLoggerConfig = useDefaultConfig ? config : {}; if (environment.ngxConsoleLogger) { ngxConsoleLoggerConfig = environment.ngxConsoleLogger; } NgxConsoleLogger.init(ngxConsoleLoggerConfig, activatePerfsLogs, defaultPrefixLength); initialized = true; } resolve(initialized); }, 2000); }); }; return initConfig; } /** * get the Default config for default or prod mode */ const checkEnvironmentConfig = (environment) => { if (!environment.ngxConsoleLogger) { console.warn('Please initialize NgxConsoleLogger environment configuration'); if (environment.production) { console.warn('Recommended configuration : node_module/@fababracx/ngx-console-logger/exemple/config/ngx-console-logger-config.prod.ts'); } else { console.warn('Recommended configuration : node_module/@fababracx/ngx-console-logger/exemple/config/ngx-console-logger-config.ts'); } } }; const USE_DEFAULT_CONFIG = new InjectionToken('USE_DEFAULT_CONFIG'); const ENV_CONFIG = new InjectionToken('LOGGER_CONFIG'); const ACTIVATE_PERF_LOGS = new InjectionToken('ACTIVATE_PERF_LOGS'); const PREFIX_LENGTH = new InjectionToken('PREFIX_LENGTH'); class NgxConsoleLoggerModule { static forRoot(useDefaultConfig = false, environment, activatePerfLogs = false, defaultPrefixMinPad = ngxConsoleLoggerConfigDefaultPrefixMinPad) { return { ngModule: NgxConsoleLoggerModule, providers: [ { provide: APP_INITIALIZER, useFactory: ngxConsoleLoggerFactory, multi: true, deps: [USE_DEFAULT_CONFIG, ENV_CONFIG, ACTIVATE_PERF_LOGS, PREFIX_LENGTH] }, { provide: USE_DEFAULT_CONFIG, useValue: useDefaultConfig }, { provide: ENV_CONFIG, useValue: environment }, { provide: ACTIVATE_PERF_LOGS, useValue: activatePerfLogs }, { provide: PREFIX_LENGTH, useValue: defaultPrefixMinPad } ] }; } static forChild() { return { ngModule: NgxConsoleLoggerModule, providers: [] }; } } NgxConsoleLoggerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: NgxConsoleLoggerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); NgxConsoleLoggerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.3", ngImport: i0, type: NgxConsoleLoggerModule, declarations: [RootPerfRefreshCountComponent, PerfRefreshCountComponent], imports: [CommonModule], exports: [RootPerfRefreshCountComponent, PerfRefreshCountComponent] }); NgxConsoleLoggerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: NgxConsoleLoggerModule, imports: [CommonModule] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: NgxConsoleLoggerModule, decorators: [{ type: NgModule, args: [{ declarations: [RootPerfRefreshCountComponent, PerfRefreshCountComponent], imports: [CommonModule], exports: [RootPerfRefreshCountComponent, PerfRefreshCountComponent] }] }] }); /* * Public API Surface of ngx-console-logger */ /** * Generated bundle index. Do not edit. */ export { LifecycleLog, MethodConsoleLogger, NgxConsoleLogger, NgxConsoleLoggerModule, PerfRefreshCountComponent, PropertyConsoleLogger, RootPerfRefreshCountComponent }; //# sourceMappingURL=fababracx-ngx-console-logger.mjs.map