Skip to content

Instantly share code, notes, and snippets.

@LayZeeDK
Last active March 13, 2021 17:46
Show Gist options
  • Save LayZeeDK/3651c9f9d91696d67b635e4b03c14ff0 to your computer and use it in GitHub Desktop.
Save LayZeeDK/3651c9f9d91696d67b635e4b03c14ff0 to your computer and use it in GitHub Desktop.
Generate Lumberjack log driver with no custom options.
import { inject, InjectionToken } from '@angular/core';
import { LumberjackLogDriverConfig, lumberjackLogDriverConfigToken } from '@ngworker/lumberjack';
export const myLogDriverConfigToken = new InjectionToken<LumberjackLogDriverConfig>('__MY_LOG_DRIVER_CONFIG__', {
factory: () => inject(lumberjackLogDriverConfigToken),
});
import { MyLogDriverRootModule } from './my-log-driver-root.module';
const optionalAngularDependency = null;
describe(MyLogDriverRootModule.name, () => {
it('guards against being registered in multiple injectors', () => {
const rootInjectorInstance = new MyLogDriverRootModule(optionalAngularDependency as any);
expect(() => new MyLogDriverRootModule(rootInjectorInstance)).toThrowError(/multiple injectors/);
});
it('does not guard the first injector that registers it', () => {
expect(() => new MyLogDriverRootModule(optionalAngularDependency as any)).not.toThrow();
});
});
import { NgModule, Optional, SkipSelf } from '@angular/core';
import { lumberjackLogDriverToken } from '@ngworker/lumberjack';
import { MyLogDriver } from './my-log-driver.service';
@NgModule({
providers: [
{
provide: lumberjackLogDriverToken,
useClass: MyLogDriver,
multi: true,
},
],
})
export class MyLogDriverRootModule {
constructor(@Optional() @SkipSelf() maybeNgModuleFromParentInjector?: MyLogDriverRootModule) {
if (maybeNgModuleFromParentInjector) {
throw new Error(
'MyLogDriverModule.forRoot registered in multiple injectors. Only call it from your root injector such as in AppModule.'
);
}
}
}
import { TestBed } from '@angular/core/testing';
import { MyLogDriverModule } from './my-log-driver.module';
describe(MyLogDriverModule.name, () => {
it('is guarded against direct import', () => {
TestBed.configureTestingModule({
imports: [MyLogDriverModule],
});
expect(() => TestBed.inject(MyLogDriverModule))
.withContext(`${MyLogDriverModule.name} must guard against direct import`)
.toThrow();
});
});
import { ModuleWithProviders, NgModule } from '@angular/core';
import { LumberjackLogDriverConfig } from '@ngworker/lumberjack';
import { myLogDriverConfigToken } from './my-log-driver-config.token';
import { MyLogDriverRootModule } from './my-log-driver-root.module';
/**
* Service module for `MyLogDriver`.
*
* Use `MyLogDriverModule.forRoot` to import.
*/
@NgModule()
export class MyLogDriverModule {
static forRoot(config?: LumberjackLogDriverConfig): ModuleWithProviders<MyLogDriverRootModule> {
return {
ngModule: MyLogDriverRootModule,
providers: (config && [{ provide: myLogDriverConfigToken, useValue: config }]) || [],
};
}
constructor() {
throw new Error('Do not import MyLogDriverModule directly. Use MyLogDriverModule.forRoot.');
}
}
import { Inject, Injectable } from '@angular/core';
import { LumberjackLog, LumberjackLogDriver, LumberjackLogDriverConfig } from '@ngworker/lumberjack';
import { myLogDriverConfigToken } from './my-log-driver-config.token';
/**
* My log driver.
*/
@Injectable()
export class MyLogDriver implements LumberjackLogDriver<TLog extends LumberjackLog = LumberjackLog> {
constructor(@Inject(myLogDriverConfigToken) public config: LumberjackLogDriverConfig) {}
logCritical(logDriverLog: LumberjackLogDriverLog<TLog>): void {}
logDebug(logDriverLog: LumberjackLogDriverLog<TLog>): void {}
logError(logDriverLog: LumberjackLogDriverLog<TLog>): void {}
logInfo(logDriverLog: LumberjackLogDriverLog<TLog>): void {}
logTrace(logDriverLog: LumberjackLogDriverLog<TLog>): void {}
logWarning(logDriverLog: LumberjackLogDriverLog<TLog>): void {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment