Skip to content

Commit df44160

Browse files
committed
Pending tasks and data-connect
1 parent a58b329 commit df44160

File tree

13 files changed

+197
-63
lines changed

13 files changed

+197
-63
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import {
2+
EnvironmentProviders,
3+
InjectionToken,
4+
Injector,
5+
NgModule,
6+
NgZone,
7+
Optional,
8+
makeEnvironmentProviders,
9+
} from '@angular/core';
10+
import { VERSION, ɵAngularFireSchedulers, ɵgetDefaultInstanceOf } from '@angular/fire';
11+
import { FirebaseApp, FirebaseApps } from '@angular/fire/app';
12+
import { registerVersion } from 'firebase/app';
13+
import { DATA_CONNECT_PROVIDER_NAME, DataConnect, DataConnectInstances } from './data-connect';
14+
15+
const PROVIDED_DATA_CONNECT_INSTANCES = new InjectionToken<DataConnect[]>('angularfire2.data-connect-instances');
16+
17+
export function defaultDataConnectInstanceFactory(provided: DataConnect[]|undefined, defaultApp: FirebaseApp) {
18+
return ɵgetDefaultInstanceOf<DataConnect>(DATA_CONNECT_PROVIDER_NAME, provided, defaultApp);
19+
}
20+
21+
export function dataConnectInstanceFactory(fn: (injector: Injector) => DataConnect) {
22+
return (zone: NgZone, injector: Injector) => {
23+
return zone.runOutsideAngular(() => fn(injector));
24+
};
25+
}
26+
27+
const DATA_CONNECT_INSTANCES_PROVIDER = {
28+
provide: DataConnectInstances,
29+
deps: [
30+
[new Optional(), PROVIDED_DATA_CONNECT_INSTANCES ],
31+
]
32+
};
33+
34+
const DEFAULT_DATA_CONNECT_INSTANCE_PROVIDER = {
35+
provide: DataConnect,
36+
useFactory: defaultDataConnectInstanceFactory,
37+
deps: [
38+
[new Optional(), PROVIDED_DATA_CONNECT_INSTANCES ],
39+
FirebaseApp,
40+
]
41+
};
42+
43+
@NgModule({
44+
providers: [
45+
DEFAULT_DATA_CONNECT_INSTANCE_PROVIDER,
46+
DATA_CONNECT_INSTANCES_PROVIDER,
47+
]
48+
})
49+
export class DataConnectModule {
50+
constructor() {
51+
registerVersion('angularfire', VERSION.full, 'fdc');
52+
}
53+
}
54+
55+
export function provideDataConnect(fn: (injector: Injector) => DataConnect, ...deps: any[]): EnvironmentProviders {
56+
registerVersion('angularfire', VERSION.full, 'fdc');
57+
58+
return makeEnvironmentProviders([
59+
DEFAULT_DATA_CONNECT_INSTANCE_PROVIDER,
60+
DATA_CONNECT_INSTANCES_PROVIDER,
61+
{
62+
provide: PROVIDED_DATA_CONNECT_INSTANCES,
63+
useFactory: dataConnectInstanceFactory(fn),
64+
multi: true,
65+
deps: [
66+
NgZone,
67+
Injector,
68+
ɵAngularFireSchedulers,
69+
FirebaseApps,
70+
...deps,
71+
],
72+
}
73+
]);
74+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
import { TestBed } from '@angular/core/testing';
3+
import { getApp, initializeApp, provideFirebaseApp } from '@angular/fire/app';
4+
import { DataConnect, getDataConnect, provideDataConnect } from '@angular/fire/data-connect';
5+
import { COMMON_CONFIG } from '../test-config';
6+
import { rando } from '../utils';
7+
8+
9+
describe('DataConnect', () => {
10+
let dataConnect: DataConnect;
11+
let providedDataConnect: DataConnect;
12+
let appName: string;
13+
14+
describe('single injection', () => {
15+
16+
beforeEach(() => {
17+
appName = rando();
18+
TestBed.configureTestingModule({
19+
providers: [
20+
provideFirebaseApp(() => initializeApp(COMMON_CONFIG, appName)),
21+
provideDataConnect(() => {
22+
providedDataConnect = getDataConnect(getApp(appName));
23+
return providedDataConnect;
24+
}),
25+
],
26+
});
27+
dataConnect = TestBed.inject(DataConnect);
28+
});
29+
30+
it('should be injectable', () => {
31+
expect(providedDataConnect).toBeTruthy();
32+
expect(dataConnect).toEqual(providedDataConnect);
33+
});
34+
35+
});
36+
37+
});
38+
*/

src/data-connect/data-connect.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { ɵgetAllInstancesOf } from '@angular/fire';
2+
import { DataConnect } from 'firebase/data-connect';
3+
import { from, timer } from 'rxjs';
4+
import { concatMap, distinct } from 'rxjs/operators';
5+
6+
export { DataConnect };
7+
8+
export const DATA_CONNECT_PROVIDER_NAME = 'data-connect';
9+
10+
// eslint-disable-next-line @typescript-eslint/no-empty-interface
11+
export interface DataConnectInstances extends Array<DataConnect> {}
12+
13+
export class DataConnectInstances {
14+
constructor() {
15+
return ɵgetAllInstancesOf<DataConnect>(DATA_CONNECT_PROVIDER_NAME);
16+
}
17+
}
18+
19+
export const dataConnectInstance$ = timer(0, 300).pipe(
20+
concatMap(() => from(ɵgetAllInstancesOf<DataConnect>(DATA_CONNECT_PROVIDER_NAME))),
21+
distinct(),
22+
);

src/data-connect/firebase.ts

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/data-connect/ng-package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
3+
"lib": {
4+
"entryFile": "public_api.ts"
5+
}
6+
}

src/data-connect/overrides.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { isMessagingSupportedFactory } from './is-messaging-supported-factory';
2+
3+
export const isSupported = isMessagingSupportedFactory.async;

src/data-connect/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"$schema": "../../node_modules/ng-packagr/package.schema.json"
3+
}

src/data-connect/public_api.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export { DataConnectInstances, DataConnect, dataConnectInstance$ } from './data-connect';
2+
export { provideDataConnect, DataConnectModule } from './data-connect.module';
3+
export * from './firebase';

src/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
"@angular/platform-server": { "optional": true }
3737
},
3838
"dependencies": {
39-
"firebase": "^11.0.0",
39+
"firebase": "^11.0.2",
4040
"rxfire": "^6.0.5",
4141
"@angular-devkit/schematics": "^19.0.0",
4242
"@schematics/angular": "^19.0.0",

src/schematics/interfaces.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export const enum FEATURES {
55
Analytics,
66
AppCheck,
77
Database,
8+
DataConnect,
89
Functions,
910
Messaging,
1011
Performance,
@@ -20,12 +21,13 @@ export const featureOptions = [
2021
{ name: 'App Check', value: FEATURES.AppCheck },
2122
{ name: 'Firestore', value: FEATURES.Firestore },
2223
{ name: 'Realtime Database', value: FEATURES.Database },
24+
// { name: 'Data Connect', value: FEATURES.DataConnect },
2325
{ name: 'Cloud Functions (callable)', value: FEATURES.Functions },
2426
{ name: 'Cloud Messaging', value: FEATURES.Messaging },
2527
{ name: 'Performance Monitoring', value: FEATURES.Performance },
2628
{ name: 'Cloud Storage', value: FEATURES.Storage },
2729
{ name: 'Remote Config', value: FEATURES.RemoteConfig },
28-
{ name: 'VertexAI (preview)', value: FEATURES.VertexAI },
30+
{ name: 'Vertex AI', value: FEATURES.VertexAI },
2931
];
3032

3133
export const enum PROJECT_TYPE { Static, CloudFunctions, CloudRun, WebFrameworks }

0 commit comments

Comments
 (0)