Skip to content

Commit fa3dc84

Browse files
fix(rxformmappermodule): prevent multiple import (#110)
use forRoot pattern to prevent multiple import BREAKING CHANGE: simple module import no longer supports #101
1 parent 97e57c3 commit fa3dc84

File tree

5 files changed

+76
-19
lines changed

5 files changed

+76
-19
lines changed
Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
1-
import { NgModule } from '@angular/core';
2-
import { CustomMapperResolver } from './services/custom-mapper-resolver';
3-
import { RxFormMapper } from './services/rx-form-mapper.service';
4-
import { ValidatorResolver } from './services/validator-resolver';
5-
6-
@NgModule({
7-
providers: [
8-
RxFormMapper,
9-
CustomMapperResolver,
10-
ValidatorResolver
11-
]
12-
})
13-
export class RxFormMapperModule {}
1+
import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';
2+
import { RxFormMapper, ValidatorResolver, CustomMapperResolver } from './services';
3+
4+
@NgModule()
5+
export class RxFormMapperModule {
6+
7+
public static forRoot(): ModuleWithProviders<RxFormMapperModule> {
8+
return {
9+
ngModule: RxFormMapperModule,
10+
providers: [
11+
RxFormMapper,
12+
CustomMapperResolver,
13+
ValidatorResolver
14+
]
15+
};
16+
}
17+
18+
public constructor(@Optional() @SkipSelf() parentModule?: RxFormMapperModule) {
19+
if (parentModule) {
20+
throw new Error('RxFormMapperModule is already loaded. Import it in the AppModule only');
21+
}
22+
}
23+
24+
}

projects/rx-form-mapper/src/lib/tests/custom-mapper-resolver.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ class InstantiableCustomControlMapper extends UninstantiableCustomControlMapper
3030
}
3131
}
3232

33-
describe('RxFormMapper', () => {
33+
describe('CustomMapperResolver', () => {
3434
beforeEach(() => {
3535
TestBed.configureTestingModule({
36-
imports: [RxFormMapperModule],
36+
imports: [RxFormMapperModule.forRoot()],
3737
}).compileComponents();
3838
});
3939

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { Component, NgModule, NgModuleFactoryLoader } from '@angular/core';
2+
import { TestBed } from '@angular/core/testing';
3+
import { Router, RouterModule } from '@angular/router';
4+
import { RxFormMapperModule } from '..';
5+
import { RouterTestingModule } from '@angular/router/testing';
6+
7+
describe('RxFormMapperModule', () => {
8+
9+
@Component({ template: '' })
10+
class TestComponent { }
11+
12+
@NgModule({
13+
imports: [RxFormMapperModule.forRoot(), RouterModule.forChild([{ path: '', component: TestComponent }])]
14+
})
15+
class ChildModule { }
16+
17+
beforeEach(() => {
18+
TestBed.configureTestingModule({
19+
imports: [RxFormMapperModule.forRoot(), RouterTestingModule.withRoutes([{ path: '', loadChildren: './test/ChildModule#ChildModule' }])],
20+
}).compileComponents();
21+
22+
23+
});
24+
25+
it('Should not provide twice', async () => {
26+
// tslint:disable-next-line: deprecation
27+
const loader: any = TestBed.inject(NgModuleFactoryLoader);
28+
const router = TestBed.inject(Router);
29+
30+
loader.stubbedModules = {
31+
'./test/ChildModule#ChildModule': ChildModule,
32+
};
33+
34+
let error: Error = null;
35+
36+
try {
37+
await router.navigate([]);
38+
} catch (e) {
39+
error = e;
40+
}
41+
42+
expect(error.message).toEqual('RxFormMapperModule is already loaded. Import it in the AppModule only');
43+
});
44+
45+
});
46+

projects/rx-form-mapper/src/lib/tests/rx-form-mapper.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import {
1111
} from '@angular/forms';
1212
import { of } from 'rxjs';
1313

14-
describe('CustomMapperResolver', () => {
14+
describe('RxFormMapper', () => {
1515
beforeEach(() => {
1616
TestBed.configureTestingModule({
17-
imports: [RxFormMapperModule]
17+
imports: [RxFormMapperModule.forRoot()]
1818
}).compileComponents();
1919
});
2020

projects/rx-form-mapper/src/lib/tests/validator-resolver.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import { CustomControlMapper } from '../interfaces';
66
import { RxFormMapper, ValidatorResolver } from '../services';
77
import { CustomMapperResolver } from '../services/custom-mapper-resolver';
88

9-
describe('RxFormMapper', () => {
9+
describe('ValidatorResolver', () => {
1010
beforeEach(() => {
1111
TestBed.configureTestingModule({
12-
imports: [RxFormMapperModule],
12+
imports: [RxFormMapperModule.forRoot()],
1313
}).compileComponents();
1414
});
1515

0 commit comments

Comments
 (0)