Skip to content

Commit 4d322f9

Browse files
authored
feat: provide real standalone providers (#3503)
* feat: provide real standalone providers usage before `importProvidersFrom(provideFirebaseApp(() => initializeApp(...)))` usage now `provideFirebaseApp(() => initializeApp(...))` * test: fixed failed tests * fix: update the missed lite.module.ts
1 parent 35ab9cc commit 4d322f9

25 files changed

+249
-103
lines changed

src/analytics/analytics.module.ts

+25-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
import { APP_INITIALIZER, InjectionToken, Injector, ModuleWithProviders, NgModule, NgZone, Optional } from '@angular/core';
1+
import {
2+
APP_INITIALIZER,
3+
EnvironmentProviders,
4+
InjectionToken,
5+
Injector,
6+
NgModule,
7+
NgZone,
8+
Optional,
9+
makeEnvironmentProviders,
10+
} from '@angular/core';
211
import { VERSION, ɵAngularFireSchedulers, ɵgetDefaultInstanceOf } from '@angular/fire';
312
import { FirebaseApp, FirebaseApps } from '@angular/fire/app';
413
import { Analytics as FirebaseAnalytics } from 'firebase/analytics';
@@ -60,10 +69,18 @@ export class AnalyticsModule {
6069
}
6170
}
6271

63-
export function provideAnalytics(fn: (injector: Injector) => FirebaseAnalytics, ...deps: any[]): ModuleWithProviders<AnalyticsModule> {
64-
return {
65-
ngModule: AnalyticsModule,
66-
providers: [{
72+
export function provideAnalytics(fn: (injector: Injector) => FirebaseAnalytics, ...deps: any[]): EnvironmentProviders {
73+
registerVersion('angularfire', VERSION.full, 'analytics');
74+
75+
return makeEnvironmentProviders([
76+
DEFAULT_ANALYTICS_INSTANCE_PROVIDER,
77+
ANALYTICS_INSTANCES_PROVIDER,
78+
{
79+
provide: APP_INITIALIZER,
80+
useValue: isAnalyticsSupportedFactory.async,
81+
multi: true,
82+
},
83+
{
6784
provide: PROVIDED_ANALYTICS_INSTANCES,
6885
useFactory: analyticsInstanceFactory(fn),
6986
multi: true,
@@ -73,7 +90,7 @@ export function provideAnalytics(fn: (injector: Injector) => FirebaseAnalytics,
7390
ɵAngularFireSchedulers,
7491
FirebaseApps,
7592
...deps,
76-
]
77-
}]
78-
};
93+
],
94+
},
95+
]);
7996
}

src/analytics/analytics.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ describe('Analytics', () => {
2323
beforeEach(() => {
2424
appName = rando();
2525
TestBed.configureTestingModule({
26-
imports: [
26+
providers: [
2727
provideFirebaseApp(() => initializeApp(COMMON_CONFIG_TOO, appName)),
2828
provideAnalytics(() => {
2929
providedAnalytics = getAnalytics(getApp(appName));

src/app-check/app-check.module.ts

+19-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
import { isPlatformServer } from '@angular/common';
2-
import { InjectionToken, Injector, ModuleWithProviders, NgModule, NgZone, Optional, PLATFORM_ID, isDevMode } from '@angular/core';
2+
import {
3+
EnvironmentProviders,
4+
InjectionToken,
5+
Injector,
6+
NgModule,
7+
NgZone,
8+
Optional,
9+
PLATFORM_ID,
10+
isDevMode,
11+
makeEnvironmentProviders,
12+
} from '@angular/core';
313
import { VERSION, ɵAPP_CHECK_PROVIDER_NAME, ɵAngularFireSchedulers, ɵAppCheckInstances, ɵgetDefaultInstanceOf } from '@angular/fire';
414
import { FirebaseApp, FirebaseApps } from '@angular/fire/app';
515
import { registerVersion } from 'firebase/app';
@@ -56,10 +66,12 @@ export class AppCheckModule {
5666
}
5767
}
5868

59-
export function provideAppCheck(fn: (injector: Injector) => FirebaseAppCheck, ...deps: any[]): ModuleWithProviders<AppCheckModule> {
60-
return {
61-
ngModule: AppCheckModule,
62-
providers: [{
69+
export function provideAppCheck(fn: (injector: Injector) => FirebaseAppCheck, ...deps: any[]): EnvironmentProviders {
70+
registerVersion('angularfire', VERSION.full, 'app-check');
71+
return makeEnvironmentProviders([
72+
DEFAULT_APP_CHECK_INSTANCE_PROVIDER,
73+
APP_CHECK_INSTANCES_PROVIDER,
74+
{
6375
provide: PROVIDED_APP_CHECK_INSTANCES,
6476
useFactory: appCheckInstanceFactory(fn),
6577
multi: true,
@@ -71,6 +83,6 @@ export function provideAppCheck(fn: (injector: Injector) => FirebaseAppCheck, ..
7183
FirebaseApps,
7284
...deps,
7385
]
74-
}]
75-
};
86+
}
87+
]);
7688
}

src/app-check/app-check.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('Auth', () => {
1515
beforeEach(() => {
1616
appName = rando();
1717
TestBed.configureTestingModule({
18-
imports: [
18+
providers: [
1919
provideFirebaseApp(() => initializeApp(COMMON_CONFIG, appName)),
2020
provideAuth(() => {
2121
providedAuth = getAuth(getApp(appName));

src/app/app.module.ts

+15-7
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import {
2+
EnvironmentProviders,
23
Inject,
34
InjectionToken,
45
Injector,
5-
ModuleWithProviders,
66
VERSION as NG_VERSION,
77
NgModule,
88
NgZone,
99
Optional,
1010
PLATFORM_ID,
11+
makeEnvironmentProviders,
1112
} from '@angular/core';
1213
import { VERSION, ɵAngularFireSchedulers } from '@angular/fire';
1314
import { FirebaseApp as IFirebaseApp, getApp, registerVersion } from 'firebase/app';
@@ -44,6 +45,12 @@ const FIREBASE_APPS_PROVIDER = {
4445

4546
export function firebaseAppFactory(fn: (injector: Injector) => IFirebaseApp) {
4647
return (zone: NgZone, injector: Injector) => {
48+
const platformId = injector.get(PLATFORM_ID);
49+
registerVersion('angularfire', VERSION.full, 'core');
50+
registerVersion('angularfire', VERSION.full, 'app');
51+
// eslint-disable-next-line @typescript-eslint/no-base-to-string
52+
registerVersion('angular', NG_VERSION.full, platformId.toString());
53+
4754
const app = zone.runOutsideAngular(() => fn(injector));
4855
return new FirebaseApp(app);
4956
};
@@ -68,10 +75,11 @@ export class FirebaseAppModule {
6875
// Calling initializeApp({ ... }, 'name') multiple times will add more FirebaseApps into the FIREBASE_APPS
6976
// injection scope. This allows developers to more easily work with multiple Firebase Applications. Downside
7077
// is that DI for app name and options doesn't really make sense anymore.
71-
export function provideFirebaseApp(fn: (injector: Injector) => IFirebaseApp, ...deps: any[]): ModuleWithProviders<FirebaseAppModule> {
72-
return {
73-
ngModule: FirebaseAppModule,
74-
providers: [{
78+
export function provideFirebaseApp(fn: (injector: Injector) => IFirebaseApp, ...deps: any[]): EnvironmentProviders {
79+
return makeEnvironmentProviders([
80+
DEFAULT_FIREBASE_APP_PROVIDER,
81+
FIREBASE_APPS_PROVIDER,
82+
{
7583
provide: PROVIDED_FIREBASE_APPS,
7684
useFactory: firebaseAppFactory(fn),
7785
multi: true,
@@ -81,6 +89,6 @@ export function provideFirebaseApp(fn: (injector: Injector) => IFirebaseApp, ...
8189
ɵAngularFireSchedulers,
8290
...deps,
8391
],
84-
}],
85-
};
92+
}
93+
])
8694
}

src/app/app.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ describe('FirebaseApp', () => {
1313
beforeEach(() => {
1414
appName = rando();
1515
TestBed.configureTestingModule({
16-
imports: [
16+
providers: [
1717
provideFirebaseApp(() => {
1818
providedApp = initializeApp(COMMON_CONFIG, appName);
1919
return providedApp;

src/auth-guard/auth-guard.spec.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ describe('AuthGuard', () => {
1717
appName = rando();
1818
TestBed.configureTestingModule({
1919
imports: [
20-
provideFirebaseApp(() => initializeApp(COMMON_CONFIG, appName)),
21-
provideAuth(() => {
22-
const auth = getAuth(getApp(appName));
23-
connectAuthEmulator(auth, 'http://localhost:9098');
24-
return auth;
25-
}),
2620
AuthGuardModule,
2721
RouterModule.forRoot([
2822
{ path: 'a', component: TestComponent, canActivate: [AuthGuard] }
2923
])
3024
],
3125
providers: [
26+
provideFirebaseApp(() => initializeApp(COMMON_CONFIG, appName)),
27+
provideAuth(() => {
28+
const auth = getAuth(getApp(appName));
29+
connectAuthEmulator(auth, 'http://localhost:9098');
30+
return auth;
31+
}),
3232
{ provide: APP_BASE_HREF, useValue: 'http://localhost:4200/' }
3333
]
3434
});

src/auth/auth.module.ts

+17-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { InjectionToken, Injector, ModuleWithProviders, NgModule, NgZone, Optional } from '@angular/core';
1+
import {
2+
EnvironmentProviders,
3+
InjectionToken,
4+
Injector,
5+
NgModule,
6+
NgZone,
7+
Optional,
8+
makeEnvironmentProviders,
9+
} from '@angular/core';
210
import { VERSION, ɵAngularFireSchedulers, ɵgetDefaultInstanceOf } from '@angular/fire';
311
import { ɵAppCheckInstances } from '@angular/fire';
412
import { FirebaseApp, FirebaseApps } from '@angular/fire/app';
@@ -48,10 +56,12 @@ export class AuthModule {
4856
}
4957
}
5058

51-
export function provideAuth(fn: (injector: Injector) => FirebaseAuth, ...deps: any[]): ModuleWithProviders<AuthModule> {
52-
return {
53-
ngModule: AuthModule,
54-
providers: [{
59+
export function provideAuth(fn: (injector: Injector) => FirebaseAuth, ...deps: any[]): EnvironmentProviders {
60+
registerVersion('angularfire', VERSION.full, 'auth');
61+
return makeEnvironmentProviders([
62+
DEFAULT_AUTH_INSTANCE_PROVIDER,
63+
AUTH_INSTANCES_PROVIDER,
64+
{
5565
provide: PROVIDED_AUTH_INSTANCES,
5666
useFactory: authInstanceFactory(fn),
5767
multi: true,
@@ -63,6 +73,6 @@ export function provideAuth(fn: (injector: Injector) => FirebaseAuth, ...deps: a
6373
[new Optional(), ɵAppCheckInstances ],
6474
...deps,
6575
]
66-
}]
67-
};
76+
}
77+
]);
6878
}

src/auth/auth.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('Auth', () => {
1515
beforeEach(() => {
1616
appName = rando();
1717
TestBed.configureTestingModule({
18-
imports: [
18+
providers: [
1919
provideFirebaseApp(() => initializeApp(COMMON_CONFIG, appName)),
2020
provideAuth(() => {
2121
providedAuth = getAuth(getApp(appName));

src/database/database.module.ts

+17-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { InjectionToken, Injector, ModuleWithProviders, NgModule, NgZone, Optional } from '@angular/core';
1+
import {
2+
EnvironmentProviders,
3+
InjectionToken,
4+
Injector,
5+
NgModule,
6+
NgZone,
7+
Optional,
8+
makeEnvironmentProviders,
9+
} from '@angular/core';
210
import { VERSION, ɵAngularFireSchedulers, ɵgetDefaultInstanceOf } from '@angular/fire';
311
import { ɵAppCheckInstances } from '@angular/fire';
412
import { FirebaseApp, FirebaseApps } from '@angular/fire/app';
@@ -49,10 +57,12 @@ export class DatabaseModule {
4957
}
5058
}
5159

52-
export function provideDatabase(fn: (injector: Injector) => FirebaseDatabase, ...deps: any[]): ModuleWithProviders<DatabaseModule> {
53-
return {
54-
ngModule: DatabaseModule,
55-
providers: [{
60+
export function provideDatabase(fn: (injector: Injector) => FirebaseDatabase, ...deps: any[]): EnvironmentProviders {
61+
registerVersion('angularfire', VERSION.full, 'rtdb');
62+
return makeEnvironmentProviders([
63+
DEFAULT_DATABASE_INSTANCE_PROVIDER,
64+
DATABASE_INSTANCES_PROVIDER,
65+
{
5666
provide: PROVIDED_DATABASE_INSTANCES,
5767
useFactory: databaseInstanceFactory(fn),
5868
multi: true,
@@ -66,6 +76,6 @@ export function provideDatabase(fn: (injector: Injector) => FirebaseDatabase, ..
6676
[new Optional(), ɵAppCheckInstances ],
6777
...deps,
6878
]
69-
}]
70-
};
79+
}
80+
]);
7181
}

src/database/database.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('Database', () => {
1515
beforeEach(() => {
1616
appName = rando();
1717
TestBed.configureTestingModule({
18-
imports: [
18+
providers: [
1919
provideFirebaseApp(() => initializeApp(COMMON_CONFIG, appName)),
2020
provideDatabase(() => {
2121
providedDatabase = getDatabase(getApp(appName));

src/firestore/firestore.module.ts

+18-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { InjectionToken, Injector, ModuleWithProviders, NgModule, NgZone, Optional } from '@angular/core';
1+
import {
2+
EnvironmentProviders,
3+
InjectionToken,
4+
Injector,
5+
NgModule,
6+
NgZone,
7+
Optional,
8+
makeEnvironmentProviders,
9+
} from '@angular/core';
210
import { VERSION, ɵAngularFireSchedulers, ɵgetDefaultInstanceOf } from '@angular/fire';
311
import { ɵAppCheckInstances } from '@angular/fire';
412
import { FirebaseApp, FirebaseApps } from '@angular/fire/app';
@@ -49,10 +57,13 @@ export class FirestoreModule {
4957
}
5058
}
5159

52-
export function provideFirestore(fn: (injector: Injector) => FirebaseFirestore, ...deps: any[]): ModuleWithProviders<FirestoreModule> {
53-
return {
54-
ngModule: FirestoreModule,
55-
providers: [{
60+
export function provideFirestore(fn: (injector: Injector) => FirebaseFirestore, ...deps: any[]): EnvironmentProviders {
61+
registerVersion('angularfire', VERSION.full, 'fst');
62+
63+
return makeEnvironmentProviders([
64+
DEFAULT_FIRESTORE_INSTANCE_PROVIDER,
65+
FIRESTORE_INSTANCES_PROVIDER,
66+
{
5667
provide: PROVIDED_FIRESTORE_INSTANCES,
5768
useFactory: firestoreInstanceFactory(fn),
5869
multi: true,
@@ -66,6 +77,6 @@ export function provideFirestore(fn: (injector: Injector) => FirebaseFirestore,
6677
[new Optional(), ɵAppCheckInstances ],
6778
...deps,
6879
]
69-
}]
70-
};
80+
}
81+
]);
7182
}

src/firestore/firestore.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('Firestore', () => {
1515
beforeEach(() => {
1616
appName = rando();
1717
TestBed.configureTestingModule({
18-
imports: [
18+
providers: [
1919
provideFirebaseApp(() => initializeApp(COMMON_CONFIG, appName)),
2020
provideFirestore(() => {
2121
providedFirestore = getFirestore(getApp(appName));

src/firestore/lite/lite.module.ts

+18-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { InjectionToken, Injector, ModuleWithProviders, NgModule, NgZone, Optional } from '@angular/core';
1+
import {
2+
EnvironmentProviders,
3+
InjectionToken,
4+
Injector,
5+
NgModule,
6+
NgZone,
7+
Optional,
8+
makeEnvironmentProviders,
9+
} from '@angular/core';
210
import { VERSION, ɵAngularFireSchedulers, ɵAppCheckInstances, ɵgetDefaultInstanceOf } from '@angular/fire';
311
import { FirebaseApp, FirebaseApps } from '@angular/fire/app';
412
import { AuthInstances } from '@angular/fire/auth';
@@ -48,10 +56,13 @@ export class FirestoreModule {
4856
}
4957
}
5058

51-
export function provideFirestore(fn: (injector: Injector) => FirebaseFirestore, ...deps: any[]): ModuleWithProviders<FirestoreModule> {
52-
return {
53-
ngModule: FirestoreModule,
54-
providers: [{
59+
export function provideFirestore(fn: (injector: Injector) => FirebaseFirestore, ...deps: any[]): EnvironmentProviders {
60+
registerVersion('angularfire', VERSION.full, 'lite');
61+
62+
return makeEnvironmentProviders([
63+
DEFAULT_FIRESTORE_INSTANCE_PROVIDER,
64+
FIRESTORE_INSTANCES_PROVIDER,
65+
{
5566
provide: PROVIDED_FIRESTORE_INSTANCES,
5667
useFactory: firestoreInstanceFactory(fn),
5768
multi: true,
@@ -65,6 +76,6 @@ export function provideFirestore(fn: (injector: Injector) => FirebaseFirestore,
6576
[new Optional(), ɵAppCheckInstances ],
6677
...deps,
6778
]
68-
}]
69-
};
79+
}
80+
]);
7081
}

src/firestore/lite/lite.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('Firestore-lite', () => {
1515
beforeEach(() => {
1616
appName = rando();
1717
TestBed.configureTestingModule({
18-
imports: [
18+
providers: [
1919
provideFirebaseApp(() => initializeApp(COMMON_CONFIG, appName)),
2020
provideFirestore(() => {
2121
providedFirestore = getFirestore(getApp(appName));

0 commit comments

Comments
 (0)