diff --git a/projects/logger/package.json b/projects/logger/package.json index 43b65e3..ce146ee 100644 --- a/projects/logger/package.json +++ b/projects/logger/package.json @@ -1,6 +1,6 @@ { "name": "@angular-ru/logger", - "version": "1.3.0", + "version": "1.4.0", "license": "MIT", "homepage": "https://github.com/Angular-RU/angular-logger", "repository": "https://github.com/Angular-RU/angular-logger", diff --git a/projects/logger/src/lib/decorators/debug.decorator.ts b/projects/logger/src/lib/decorators/debug.decorator.ts index f203a57..e2c86d9 100644 --- a/projects/logger/src/lib/decorators/debug.decorator.ts +++ b/projects/logger/src/lib/decorators/debug.decorator.ts @@ -1,14 +1,15 @@ import { Type } from '@angular/core'; import { LogFn } from './../logger.interfaces'; -import { LoggerModule } from '../logger.module'; +import { LoggerInjector } from '../logger.injector'; +import { LoggerService } from '../logger.service'; export function DebugLog(): PropertyDecorator { return (target: Type, propertyName: string): void => { Object.defineProperty(target, propertyName, { configurable: false, get(): LogFn { - return LoggerModule.logger().debug; + return LoggerInjector.getInjector().get(LoggerService).debug; } }); }; diff --git a/projects/logger/src/lib/decorators/error.decorator.ts b/projects/logger/src/lib/decorators/error.decorator.ts index 28d47ac..ff0f835 100644 --- a/projects/logger/src/lib/decorators/error.decorator.ts +++ b/projects/logger/src/lib/decorators/error.decorator.ts @@ -1,13 +1,14 @@ import { Type } from '@angular/core'; import { LogFn } from './../logger.interfaces'; -import { LoggerModule } from '../logger.module'; +import { LoggerInjector } from '../logger.injector'; +import { LoggerService } from '../logger.service'; export function ErrorLog(): PropertyDecorator { return (target: Type, propertyName: string): void => { Object.defineProperty(target, propertyName, { configurable: false, get(): LogFn { - return LoggerModule.logger().error; + return LoggerInjector.getInjector().get(LoggerService).error; } }); }; diff --git a/projects/logger/src/lib/decorators/groups/group.common.ts b/projects/logger/src/lib/decorators/groups/group.common.ts index 9e2c0cc..86c9d2b 100644 --- a/projects/logger/src/lib/decorators/groups/group.common.ts +++ b/projects/logger/src/lib/decorators/groups/group.common.ts @@ -3,7 +3,7 @@ import { LoggerService } from '../../logger.service'; import { GroupLevel, LoggerLevel } from '../../logger.config'; import { Any, Callback, Fn, GroupMethod } from '../../logger.interfaces'; import { GroupFactory } from '../../services/group-factory.service'; -import { LoggerModule } from '../../logger.module'; +import { LoggerInjector } from '../../logger.injector'; export function groupDecoratorFactory( level: LoggerLevel, @@ -14,8 +14,8 @@ export function groupDecoratorFactory( target: Type ): unknown { let result: unknown; - const logger: LoggerService = LoggerModule.logger(); - const groupFactory: GroupFactory = LoggerModule.groupFactory(); + const logger: LoggerService = LoggerInjector.getInjector().get(LoggerService); + const groupFactory: GroupFactory = LoggerInjector.getInjector().get(GroupFactory); const groupMethod: GroupMethod = groupFactory[groupType].bind(groupFactory); const label: string = typeof title === 'string' ? title : title(...args); diff --git a/projects/logger/src/lib/decorators/info.decorator.ts b/projects/logger/src/lib/decorators/info.decorator.ts index 67ae043..f8df1ab 100644 --- a/projects/logger/src/lib/decorators/info.decorator.ts +++ b/projects/logger/src/lib/decorators/info.decorator.ts @@ -1,14 +1,15 @@ import { Type } from '@angular/core'; import { LogFn } from './../logger.interfaces'; -import { LoggerModule } from '../logger.module'; +import { LoggerInjector } from '../logger.injector'; +import { LoggerService } from '../logger.service'; export function InfoLog(): PropertyDecorator { return (target: Type, propertyName: string): void => { Object.defineProperty(target, propertyName, { configurable: false, get(): LogFn { - return LoggerModule.logger().info; + return LoggerInjector.getInjector().get(LoggerService).info; } }); }; diff --git a/projects/logger/src/lib/decorators/log.decorator.ts b/projects/logger/src/lib/decorators/log.decorator.ts index 6361337..300d722 100644 --- a/projects/logger/src/lib/decorators/log.decorator.ts +++ b/projects/logger/src/lib/decorators/log.decorator.ts @@ -1,14 +1,15 @@ import { Type } from '@angular/core'; import { LogFn } from './../logger.interfaces'; -import { LoggerModule } from '../logger.module'; +import { LoggerInjector } from '../logger.injector'; +import { LoggerService } from '../logger.service'; export function Log(): PropertyDecorator { return (target: Type, propertyName: string): void => { Object.defineProperty(target, propertyName, { configurable: false, get(): LogFn { - return LoggerModule.logger().log; + return LoggerInjector.getInjector().get(LoggerService).log; } }); }; diff --git a/projects/logger/src/lib/decorators/logger.decorator.ts b/projects/logger/src/lib/decorators/logger.decorator.ts index 30e5c47..4c51715 100644 --- a/projects/logger/src/lib/decorators/logger.decorator.ts +++ b/projects/logger/src/lib/decorators/logger.decorator.ts @@ -1,14 +1,14 @@ import { Type } from '@angular/core'; import { LoggerService } from '../logger.service'; -import { LoggerModule } from '../logger.module'; +import { LoggerInjector } from '../logger.injector'; export function Logger(): PropertyDecorator { return (target: Type, propertyName: string): void => { Object.defineProperty(target, propertyName, { configurable: false, get(): LoggerService { - return LoggerModule.logger(); + return LoggerInjector.getInjector().get(LoggerService); } }); }; diff --git a/projects/logger/src/lib/decorators/timer.decorator.ts b/projects/logger/src/lib/decorators/timer.decorator.ts index 58a7529..61932d4 100644 --- a/projects/logger/src/lib/decorators/timer.decorator.ts +++ b/projects/logger/src/lib/decorators/timer.decorator.ts @@ -2,7 +2,8 @@ import { Type } from '@angular/core'; import { LoggerLevel } from '../logger.config'; import { Any, DecoratorMethod, Fn, TimerInfo, TimerLevels } from '../logger.interfaces'; -import { LoggerModule } from '../logger.module'; +import { LoggerInjector } from '../logger.injector'; +import { LoggerService } from '../logger.service'; export function TimerLog( title: string, @@ -13,9 +14,13 @@ export function TimerLog( let result: PropertyDescriptor; const method: Fn = descriptor.value; descriptor.value = function(...args: Any[]): PropertyDescriptor { - const info: TimerInfo | null = LoggerModule.logger().startTime(title, level); + const info: TimerInfo | null = LoggerInjector.getInjector() + .get(LoggerService) + .startTime(title, level); result = method.apply(this, args); - LoggerModule.logger().endTime(info, level, isMillisecond); + LoggerInjector.getInjector() + .get(LoggerService) + .endTime(info, level, isMillisecond); return result; }; return descriptor; diff --git a/projects/logger/src/lib/decorators/trace.decorator.ts b/projects/logger/src/lib/decorators/trace.decorator.ts index f748b5b..e4d048c 100644 --- a/projects/logger/src/lib/decorators/trace.decorator.ts +++ b/projects/logger/src/lib/decorators/trace.decorator.ts @@ -1,14 +1,15 @@ import { Type } from '@angular/core'; import { LogFn } from './../logger.interfaces'; -import { LoggerModule } from '../logger.module'; +import { LoggerInjector } from '../logger.injector'; +import { LoggerService } from '../logger.service'; export function TraceLog(): PropertyDecorator { return (target: Type, propertyName: string): void => { Object.defineProperty(target, propertyName, { configurable: false, get(): LogFn { - return LoggerModule.logger().trace; + return LoggerInjector.getInjector().get(LoggerService).trace; } }); }; diff --git a/projects/logger/src/lib/decorators/warn.decorator.ts b/projects/logger/src/lib/decorators/warn.decorator.ts index d497f0b..f85fe0e 100644 --- a/projects/logger/src/lib/decorators/warn.decorator.ts +++ b/projects/logger/src/lib/decorators/warn.decorator.ts @@ -1,14 +1,15 @@ import { Type } from '@angular/core'; import { LogFn } from './../logger.interfaces'; -import { LoggerModule } from '../logger.module'; +import { LoggerInjector } from '../logger.injector'; +import { LoggerService } from '../logger.service'; export function WarnLog(): PropertyDecorator { return (target: Type, propertyName: string): void => { Object.defineProperty(target, propertyName, { configurable: false, get(): LogFn { - return LoggerModule.logger().warn; + return LoggerInjector.getInjector().get(LoggerService).warn; } }); }; diff --git a/projects/logger/src/lib/logger.injector.ts b/projects/logger/src/lib/logger.injector.ts new file mode 100644 index 0000000..6b21afe --- /dev/null +++ b/projects/logger/src/lib/logger.injector.ts @@ -0,0 +1,18 @@ +import { Injectable, Injector } from '@angular/core'; + +@Injectable() +export class LoggerInjector { + private static injector: Injector | null = null; + + constructor(injector: Injector) { + LoggerInjector.injector = injector; + } + + public static getInjector(): never | Injector { + if (!LoggerInjector.injector) { + throw new Error(`You've forgotten to import \`LoggerModule\``); + } + + return LoggerInjector.injector; + } +} diff --git a/projects/logger/src/lib/logger.module.ts b/projects/logger/src/lib/logger.module.ts index c152b78..4ecafe8 100644 --- a/projects/logger/src/lib/logger.module.ts +++ b/projects/logger/src/lib/logger.module.ts @@ -1,4 +1,4 @@ -import { InjectionToken, Injector, ModuleWithProviders, NgModule } from '@angular/core'; +import { InjectionToken, ModuleWithProviders, NgModule, Self } from '@angular/core'; import { LoggerService } from './logger.service'; import { LoggerFactory } from './services/factory.service'; @@ -10,6 +10,7 @@ import { JsonFactory } from './services/json-factory.service'; import { ClipboardFactory } from './services/clipboard-factory.service'; import { TimerFactory } from './services/timer-factory.service'; import { LoggerOptionsImpl } from './logger.options'; +import { LoggerInjector } from './logger.injector'; @NgModule({ providers: [ @@ -20,24 +21,14 @@ import { LoggerOptionsImpl } from './logger.options'; CssFactory, JsonFactory, ClipboardFactory, - TimerFactory + TimerFactory, + LoggerInjector ] }) export class LoggerModule { - public static injector: Injector = undefined; private static readonly ROOT_OPTIONS: InjectionToken = new InjectionToken('ROOT_OPTIONS'); - constructor(injector: Injector) { - LoggerModule.injector = injector; - } - - public static logger(): LoggerService { - return LoggerModule.injector.get(LoggerService); - } - - public static groupFactory(): GroupFactory { - return LoggerModule.injector.get(GroupFactory); - } + constructor(@Self() public loggerInjector: LoggerInjector) {} public static forRoot(config: Partial = {}): ModuleWithProviders { return { @@ -56,7 +47,7 @@ export class LoggerModule { }; } - private static loggerConfigFactory(config: Partial): unknown { - return new LoggerOptionsImpl().options(config); + private static loggerConfigFactory(config: Partial): LoggerOptionsImpl { + return Object.assign(new LoggerOptionsImpl(), config); } } diff --git a/projects/logger/src/lib/logger.options.ts b/projects/logger/src/lib/logger.options.ts index 2512afa..3f302d0 100644 --- a/projects/logger/src/lib/logger.options.ts +++ b/projects/logger/src/lib/logger.options.ts @@ -24,8 +24,4 @@ export class LoggerOptionsImpl implements LoggerOptions { [LoggerLevel.WARN]: LABELS.WARN, [LoggerLevel.ERROR]: LABELS.ERROR }; - - public options(config: Partial): LoggerOptions { - return Object.assign(new LoggerOptionsImpl(), config); - } } diff --git a/projects/logger/src/public-api.ts b/projects/logger/src/public-api.ts index 12b2a0c..8f63732 100644 --- a/projects/logger/src/public-api.ts +++ b/projects/logger/src/public-api.ts @@ -9,8 +9,9 @@ export * from './lib/logger.interfaces'; export * from './lib/decorators/logger.decorator'; export * from './lib/decorators/trace.decorator'; export * from './lib/decorators/debug.decorator'; -export * from './lib/decorators/info.decorator'; export * from './lib/decorators/error.decorator'; +export * from './lib/decorators/log.decorator'; +export * from './lib/decorators/info.decorator'; export * from './lib/decorators/warn.decorator'; export * from './lib/decorators/groups/group.decorator'; export * from './lib/decorators/timer.decorator'; diff --git a/projects/logger/tests/decorators.spec.ts b/projects/logger/tests/decorators.spec.ts index 8ad35c7..e115b92 100644 --- a/projects/logger/tests/decorators.spec.ts +++ b/projects/logger/tests/decorators.spec.ts @@ -4,7 +4,7 @@ import { LoggerService } from '../src/lib/logger.service'; import { MyTestComponent } from '../../../helpers/test.component'; import { LoggerLevel } from '../src/lib/logger.config'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { Fn } from '@angular-ru/logger'; +import { Fn } from '../src/lib/logger.interfaces'; describe('[TEST]: Decorator API', () => { let logger: LoggerService; diff --git a/projects/logger/tsconfig.lib.json b/projects/logger/tsconfig.lib.json index 656264a..7e62d1f 100644 --- a/projects/logger/tsconfig.lib.json +++ b/projects/logger/tsconfig.lib.json @@ -17,12 +17,12 @@ "lib": ["dom", "es2018"] }, "angularCompilerOptions": { - "annotateForClosureCompiler": true, - "skipTemplateCodegen": true, - "strictMetadataEmit": true, "fullTemplateTypeCheck": true, + "annotateForClosureCompiler": true, "strictInjectionParameters": true, - "enableResourceInlining": true + "skipTemplateCodegen": true, + "preserveWhitespaces": true, + "skipMetadataEmit": true }, "exclude": ["**/*.spec.ts"] } diff --git a/src/app/app.component.ts b/src/app/app.component.ts index f0e2b42..70594b5 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -8,13 +8,13 @@ import { LogFn, Logger, LoggerLevel, + Log, LoggerService, TimerLog, TraceLog, WarnLog } from '@angular-ru/logger'; import * as devtools from 'devtools-detect'; -import { Log } from '../../projects/logger/src/lib/decorators/log.decorator'; @Component({ selector: 'app-root', diff --git a/tsconfig.json b/tsconfig.json index dc3bc3b..cb51624 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,7 @@ "typeRoots": ["node_modules/@types"], "lib": ["es2018", "dom"], "paths": { - "@angular-ru/logger": ["./projects/logger/src/public-api"] + "@angular-ru/logger": ["./dist/logger"] } } }