Browse Source

feat: add LazyModuleFactory

pull/4377/head
Arman Ozak 6 years ago
parent
commit
e5634fcfa5
  1. 38
      npm/ng-packs/packages/core/src/lib/tests/factory-utils.spec.ts
  2. 31
      npm/ng-packs/packages/core/src/lib/utils/factory-utils.ts
  3. 1
      npm/ng-packs/packages/core/src/lib/utils/index.ts

38
npm/ng-packs/packages/core/src/lib/tests/factory-utils.spec.ts

@ -0,0 +1,38 @@
import { Injector, ModuleWithProviders, NgModule } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { LazyModuleFactory } from '../utils/factory-utils';
@NgModule()
class Module {
static forChild(): ModuleWithProviders<Module> {
return {
ngModule: Module,
providers: [{ provide: 'foo', useValue: 'bar' }],
};
}
}
describe('LazyModuleFactory', () => {
const factory = new LazyModuleFactory(Module.forChild());
describe('#moduleType', () => {
it('should return the ngModule property of given ModuleWithProviders', () => {
expect(factory.moduleType).toBe(Module);
});
});
describe('#create', () => {
it('should return an instance of NgModuleRef_', () => {
TestBed.configureTestingModule({});
const injector = TestBed.inject(Injector);
const moduleRef = factory.create(injector);
expect('componentFactoryResolver' in moduleRef).toBe(true);
expect('destroy' in moduleRef).toBe(true);
expect('injector' in moduleRef).toBe(true);
expect('instance' in moduleRef).toBe(true);
expect('onDestroy' in moduleRef).toBe(true);
});
});
});

31
npm/ng-packs/packages/core/src/lib/utils/factory-utils.ts

@ -0,0 +1,31 @@
import {
Compiler,
Injector,
ModuleWithProviders,
NgModuleFactory,
NgModuleRef,
StaticProvider,
Type,
} from '@angular/core';
export class LazyModuleFactory<T> extends NgModuleFactory<T> {
get moduleType(): Type<T> {
return this.moduleWithProviders.ngModule;
}
constructor(private moduleWithProviders: ModuleWithProviders<T>) {
super();
}
create(parentInjector: Injector | null): NgModuleRef<T> {
const injector = Injector.create({
parent: parentInjector,
providers: this.moduleWithProviders.providers as StaticProvider[],
});
const compiler = injector.get(Compiler);
const factory = compiler.compileModuleSync(this.moduleType);
return factory.create(injector);
}
}

1
npm/ng-packs/packages/core/src/lib/utils/index.ts

@ -1,4 +1,5 @@
export * from './common-utils';
export * from './factory-utils';
export * from './form-utils';
export * from './generator-utils';
export * from './initial-utils';

Loading…
Cancel
Save