Skip to content

Commit

Permalink
feat: 🎸 include required driver configuration identifier (#54)
Browse files Browse the repository at this point in the history
* feat: 🎸 add "identifier" as a default driver configuration

* fix: 🐛 remove cyclic dependencies

* feat: 🎸 make identifier opt in forRoot http and console drivers

* style: lint and format

* chore: apply PR suggestions

Co-authored-by: Lars Gyrup Brink Nielsen <larsbrinknielsen@gmail.com>

* fix: 🐛 clean previous commit issues

* feat: 🎸 extract driver identifiers into a separate file

* refactor: 💡 rename http-driver-config files for better dev-exp

* feat: 🎸 use the driver identifier when logging driver errors

* refactor: 💡 move default identifier to a static driver field

* refactor: 💡 move factory functions to driver root module

* test: 💍 fix circular dependencies that broke tests

* fix: 🐛 expect the right config in the forRoot method

* test: 💍 revert to createHttpConfig method name

Co-authored-by: Lars Gyrup Brink Nielsen <larsbrinknielsen@gmail.com>
  • Loading branch information
NachoVazquez and LayZeeDK committed Jan 18, 2021
1 parent 50f2b6e commit 7fc96eb
Show file tree
Hide file tree
Showing 39 changed files with 307 additions and 131 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ You must also import log driver modules for the log drivers that you want to ena
```ts
// ...
import { LumberjackModule } from '@ngworker/lumberjack';
import { LumberjackHttpDriverModule } from "@ngworker/lumberjack/http-driver";
import { LumberjackConsoleDriverModule } from "@ngworker/lumberjack/console-driver";
import { LumberjackHttpDriverModule } from '@ngworker/lumberjack/http-driver';
import { LumberjackConsoleDriverModule } from '@ngworker/lumberjack/console-driver';

@NgModule({
imports: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import { LumberjackLevel } from '@ngworker/lumberjack';

import { defaultErrorThrowingDriverOptions } from './default-error-throwing-driver-options';
import { ErrorThrowingDriverConfig } from './error-throwing-driver.config';
import { ErrorThrowingDriver } from './error-throwing.driver';

export const defaultErrorThrowingDriverConfig: ErrorThrowingDriverConfig = {
...defaultErrorThrowingDriverOptions,
levels: [LumberjackLevel.Verbose],
identifier: ErrorThrowingDriver.driverIdentifier,
};
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Inject, Injectable } from '@angular/core';

import { LumberjackLogDriver, LumberjackLogDriverConfig, LumberjackLogDriverLog } from '@ngworker/lumberjack';
import { LumberjackLogDriver, LumberjackLogDriverLog } from '@ngworker/lumberjack';

import { errorThrowingDriverConfigToken } from './error-throwing-driver-config.token';
import { ErrorThrowingDriverConfig } from './error-throwing-driver.config';
Expand All @@ -12,6 +12,7 @@ import { ErrorThrowingDriverConfig } from './error-throwing-driver.config';
*/
@Injectable()
export class ErrorThrowingDriver implements LumberjackLogDriver {
static driverIdentifier = 'ErrorThrowingDriver';
private logCount = 0;

constructor(@Inject(errorThrowingDriverConfigToken) public config: ErrorThrowingDriverConfig) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { inject, InjectionToken } from '@angular/core';
import { InjectionToken } from '@angular/core';

import { LumberjackLogDriverConfig, lumberjackLogDriverConfigToken } from '@ngworker/lumberjack';
export const noopDriverConfigToken = new InjectionToken<LumberjackLogDriverConfig>('__NO-OP_DRIVER_CONFIG__', {
factory: () => inject(lumberjackLogDriverConfigToken),
});
import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

export const noopDriverConfigToken = new InjectionToken<LumberjackLogDriverConfig>('__NO-OP_DRIVER_CONFIG__');
Original file line number Diff line number Diff line change
@@ -1,14 +1,31 @@
import { NgModule, Optional, SkipSelf } from '@angular/core';

import { lumberjackLogDriverToken } from '@ngworker/lumberjack';
import {
LumberjackLogDriverConfig,
lumberjackLogDriverConfigToken,
lumberjackLogDriverToken,
} from '@ngworker/lumberjack';

import { noopDriverConfigToken } from './noop-driver-config.token';
import { NoopDriverConfig } from './noop-driver.config';
import { NoopDriver } from './noop.driver';

export function noopDriverFactory(
logDriverConfig: LumberjackLogDriverConfig,
noopDriverConfig: NoopDriverConfig
): NoopDriver {
const baseConfig = { ...logDriverConfig, identifier: NoopDriver.driverIdentifier };
const fullConfig = { ...baseConfig, ...noopDriverConfig };

return new NoopDriver(fullConfig);
}

@NgModule({
providers: [
{
provide: lumberjackLogDriverToken,
useClass: NoopDriver,
useFactory: noopDriverFactory,
deps: [lumberjackLogDriverConfigToken, noopDriverConfigToken],
multi: true,
},
],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

export type NoopDriverConfig = Omit<LumberjackLogDriverConfig, 'identifier'> &
Partial<Pick<LumberjackLogDriverConfig, 'identifier'>>;
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { ModuleWithProviders, NgModule } from '@angular/core';

import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

import { noopDriverConfigToken } from './noop-driver-config.token';
import { NoopDriverRootModule } from './noop-driver-root.module';
import { NoopDriverConfig } from './noop-driver.config';

/**
* Service module for `NoopDriver`.
Expand All @@ -12,10 +11,15 @@ import { NoopDriverRootModule } from './noop-driver-root.module';
*/
@NgModule()
export class NoopDriverModule {
static forRoot(config?: LumberjackLogDriverConfig): ModuleWithProviders<NoopDriverRootModule> {
static forRoot(config?: NoopDriverConfig): ModuleWithProviders<NoopDriverRootModule> {
return {
ngModule: NoopDriverRootModule,
providers: (config && [{ provide: noopDriverConfigToken, useValue: config }]) || [],
providers: [
{
provide: noopDriverConfigToken,
useValue: config || {},
},
],
};
}

Expand Down
2 changes: 2 additions & 0 deletions libs/internal/test-util/src/lib/noop-driver/noop.driver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import { noopDriverConfigToken } from './noop-driver-config.token';
*/
@Injectable()
export class NoopDriver implements LumberjackLogDriver {
static driverIdentifier = 'NoopDriver';

constructor(@Inject(noopDriverConfigToken) public config: LumberjackLogDriverConfig) {}

logCritical({ formattedLog }: LumberjackLogDriverLog): void {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { inject, InjectionToken } from '@angular/core';
import { InjectionToken } from '@angular/core';

import { LumberjackLogDriverConfig, lumberjackLogDriverConfigToken } from '@ngworker/lumberjack';
export const objectDriverConfigToken = new InjectionToken<LumberjackLogDriverConfig>('__OBJECT_DRIVER_CONFIG__', {
factory: () => inject(lumberjackLogDriverConfigToken),
});
import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

export const objectDriverConfigToken = new InjectionToken<LumberjackLogDriverConfig>('__OBJECT_DRIVER_CONFIG__');
Original file line number Diff line number Diff line change
@@ -1,14 +1,33 @@
import { NgModule, Optional, SkipSelf } from '@angular/core';

import { lumberjackLogDriverToken } from '@ngworker/lumberjack';
import {
LumberjackLogDriverConfig,
lumberjackLogDriverConfigToken,
lumberjackLogDriverToken,
} from '@ngworker/lumberjack';

import { objectDriverConfigToken } from './object-driver-config.token';
import { ObjectDriverConfig } from './object-driver.config';
import { ObjectDriver } from './object.driver';
import { ObjectService } from './object.service';

export function objectDriverFactory(
logDriverConfig: LumberjackLogDriverConfig,
objectDriverConfig: ObjectDriverConfig,
objectService: ObjectService
): ObjectDriver {
const baseConfig = { ...logDriverConfig, identifier: ObjectDriver.driverIdentifier };
const fullConfig = { ...baseConfig, ...objectDriverConfig };

return new ObjectDriver(fullConfig, objectService);
}

@NgModule({
providers: [
{
provide: lumberjackLogDriverToken,
useClass: ObjectDriver,
useFactory: objectDriverFactory,
deps: [lumberjackLogDriverConfigToken, objectDriverConfigToken, ObjectService],
multi: true,
},
],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

export type ObjectDriverConfig = Omit<LumberjackLogDriverConfig, 'identifier'> &
Partial<Pick<LumberjackLogDriverConfig, 'identifier'>>;
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { ModuleWithProviders, NgModule } from '@angular/core';

import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

import { objectDriverConfigToken } from './object-driver-config.token';
import { ObjectDriverRootModule } from './object-driver-root.module';
import { ObjectDriverConfig } from './object-driver.config';

/**
* Service module for `ObjectDriver`.
Expand All @@ -12,10 +11,15 @@ import { ObjectDriverRootModule } from './object-driver-root.module';
*/
@NgModule()
export class ObjectDriverModule {
static forRoot(config?: LumberjackLogDriverConfig): ModuleWithProviders<ObjectDriverRootModule> {
static forRoot(config?: ObjectDriverConfig): ModuleWithProviders<ObjectDriverRootModule> {
return {
ngModule: ObjectDriverRootModule,
providers: (config && [{ provide: objectDriverConfigToken, useValue: config }]) || [],
providers: [
{
provide: objectDriverConfigToken,
useValue: config || {},
},
],
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import { ObjectService } from './object.service';
*/
@Injectable()
export class ObjectDriver implements LumberjackLogDriver<ObjectPayload> {
static driverIdentifier = 'ObjectDriver';

constructor(
@Inject(objectDriverConfigToken) public config: LumberjackLogDriverConfig,
private objectService: ObjectService
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { inject, InjectionToken } from '@angular/core';
import { InjectionToken } from '@angular/core';

import { LumberjackLogDriverConfig, lumberjackLogDriverConfigToken } from '@ngworker/lumberjack';
import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

export const spyDriverConfigToken = new InjectionToken<LumberjackLogDriverConfig>('__SPY_DRIVER_CONFIG__', {
factory: () => inject(lumberjackLogDriverConfigToken),
});
export const spyDriverConfigToken = new InjectionToken<LumberjackLogDriverConfig>('__SPY_DRIVER_CONFIG__');
Original file line number Diff line number Diff line change
@@ -1,14 +1,31 @@
import { NgModule, Optional, SkipSelf } from '@angular/core';

import { lumberjackLogDriverToken } from '@ngworker/lumberjack';
import {
LumberjackLogDriverConfig,
lumberjackLogDriverConfigToken,
lumberjackLogDriverToken,
} from '@ngworker/lumberjack';

import { spyDriverConfigToken } from './spy-driver-config.token';
import { SpyDriverConfig } from './spy-driver.config';
import { SpyDriver } from './spy.driver';

export function spyDriverFactory(
logDriverConfig: LumberjackLogDriverConfig,
spyDriverConfig: SpyDriverConfig
): SpyDriver {
const baseConfig = { ...logDriverConfig, identifier: SpyDriver.driverIdentifier };
const fullConfig = { ...baseConfig, ...spyDriverConfig };

return new SpyDriver(fullConfig);
}

@NgModule({
providers: [
{
provide: lumberjackLogDriverToken,
useClass: SpyDriver,
useFactory: spyDriverFactory,
deps: [lumberjackLogDriverConfigToken, spyDriverConfigToken],
multi: true,
},
],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

export type SpyDriverConfig = Omit<LumberjackLogDriverConfig, 'identifier'> &
Partial<Pick<LumberjackLogDriverConfig, 'identifier'>>;
12 changes: 8 additions & 4 deletions libs/internal/test-util/src/lib/spy-driver/spy-driver.module.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { ModuleWithProviders, NgModule } from '@angular/core';

import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

import { spyDriverConfigToken } from './spy-driver-config.token';
import { SpyDriverRootModule } from './spy-driver-root.module';
import { SpyDriverConfig } from './spy-driver.config';

/**
* Service module for `SpyDriver`.
Expand All @@ -12,10 +11,15 @@ import { SpyDriverRootModule } from './spy-driver-root.module';
*/
@NgModule()
export class SpyDriverModule {
static forRoot(config?: LumberjackLogDriverConfig): ModuleWithProviders<SpyDriverRootModule> {
static forRoot(config?: SpyDriverConfig): ModuleWithProviders<SpyDriverRootModule> {
return {
ngModule: SpyDriverRootModule,
providers: (config && [{ provide: spyDriverConfigToken, useValue: config }]) || [],
providers: [
{
provide: spyDriverConfigToken,
useValue: config || {},
},
],
};
}

Expand Down
2 changes: 2 additions & 0 deletions libs/internal/test-util/src/lib/spy-driver/spy.driver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import { spyDriverConfigToken } from './spy-driver-config.token';
*/
@Injectable()
export class SpyDriver implements LumberjackLogDriver, jasmine.SpyObj<LumberjackLogDriver> {
static driverIdentifier = 'SpyDriver';

constructor(@Inject(spyDriverConfigToken) public config: LumberjackLogDriverConfig) {}

logCritical = jasmine.createSpy('logCritical');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ import { lumberjackConsoleDriverConfigToken } from './lumberjack-console-driver-

const debugDriverConfig: LumberjackLogDriverConfig = {
levels: [LumberjackLevel.Debug],
identifier: 'TestConsoleDriver',
};
const verboseDriverConfig: LumberjackLogDriverConfig = {
const verboseDriverConfig: Partial<LumberjackLogDriverConfig> = {
levels: [LumberjackLevel.Verbose],
};

Expand All @@ -29,18 +30,4 @@ describe('consoleDriverConfigToken', () => {
expect(actualDriverConfig).toBe(debugDriverConfig);
});
});

describe('given no provided console log driver config', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [{ provide: lumberjackLogDriverConfigToken, useValue: verboseDriverConfig }],
});
});

it('then the value of the log driver config is resolved', () => {
const actualDriverConfig = resolveDependency(lumberjackConsoleDriverConfigToken);

expect(actualDriverConfig).toBe(verboseDriverConfig);
});
});
});
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import { inject, InjectionToken } from '@angular/core';
import { InjectionToken } from '@angular/core';

import { LumberjackLogDriverConfig, lumberjackLogDriverConfigToken } from '@ngworker/lumberjack';
import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

export const lumberjackConsoleDriverConfigToken = new InjectionToken<LumberjackLogDriverConfig>(
'__LUMBERJACK_CONSOLE_DRIVER_CONFIG__',
{
factory: () => inject(lumberjackLogDriverConfigToken),
}
'__LUMBERJACK_CONSOLE_DRIVER_CONFIG__'
);
Original file line number Diff line number Diff line change
@@ -1,14 +1,35 @@
import { Inject, NgModule, Optional, SkipSelf } from '@angular/core';

import { lumberjackLogDriverToken } from '@ngworker/lumberjack';
import {
LumberjackLogDriverConfig,
lumberjackLogDriverConfigToken,
lumberjackLogDriverToken,
} from '@ngworker/lumberjack';

import { LumberjackConsole } from '../console/lumberjack-console';
import { lumberjackConsoleToken } from '../console/lumberjack-console.token';
import { LumberjackConsoleDriver } from '../log-drivers/lumberjack-console.driver';

import { lumberjackConsoleDriverConfigToken } from './lumberjack-console-driver-config.token';
import { LumberjackConsoleDriverConfig } from './lumberjack-console-driver.config';

export function consoleDriverFactory(
logDriverConfig: LumberjackLogDriverConfig,
consoleDriverConfig: LumberjackConsoleDriverConfig,
console: LumberjackConsole
): LumberjackConsoleDriver {
const baseConfig = { ...logDriverConfig, identifier: LumberjackConsoleDriver.driverIdentifier };
const fullConfig = { ...baseConfig, ...consoleDriverConfig };

return new LumberjackConsoleDriver(fullConfig, console);
}

@NgModule({
providers: [
{
provide: lumberjackLogDriverToken,
useClass: LumberjackConsoleDriver,
useFactory: consoleDriverFactory,
deps: [lumberjackLogDriverConfigToken, lumberjackConsoleDriverConfigToken, lumberjackConsoleToken],
multi: true,
},
],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';

export type LumberjackConsoleDriverConfig = Omit<LumberjackLogDriverConfig, 'identifier'> &
Partial<Pick<LumberjackLogDriverConfig, 'identifier'>>;
Loading

0 comments on commit 7fc96eb

Please sign in to comment.