Skip to content

Require _delegate in compat classes #4662

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Mar 30, 2021
6 changes: 6 additions & 0 deletions common/api-review/firestore-exp.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ export class CollectionReference<T = DocumentData> extends Query<T> {
get path(): string;
// (undocumented)
readonly type = "collection";
withConverter(converter: null): CollectionReference<DocumentData>;
// (undocumented)
withConverter<U>(converter: FirestoreDataConverter<U>): CollectionReference<U>;
}

Expand Down Expand Up @@ -101,6 +103,8 @@ export class DocumentReference<T = DocumentData> {
get parent(): CollectionReference<T>;
get path(): string;
readonly type = "document";
withConverter(converter: null): DocumentReference<DocumentData>;
// (undocumented)
withConverter<U>(converter: FirestoreDataConverter<U>): DocumentReference<U>;
}

Expand Down Expand Up @@ -318,6 +322,8 @@ export class Query<T = DocumentData> {
protected constructor();
readonly firestore: FirebaseFirestore;
readonly type: 'query' | 'collection';
withConverter(converter: null): Query<DocumentData>;
// (undocumented)
withConverter<U>(converter: FirestoreDataConverter<U>): Query<U>;
}

Expand Down
6 changes: 6 additions & 0 deletions common/api-review/firestore-lite.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ export class CollectionReference<T = DocumentData> extends Query<T> {
get path(): string;
// (undocumented)
readonly type = "collection";
withConverter(converter: null): CollectionReference<DocumentData>;
// (undocumented)
withConverter<U>(converter: FirestoreDataConverter<U>): CollectionReference<U>;
}

Expand Down Expand Up @@ -81,6 +83,8 @@ export class DocumentReference<T = DocumentData> {
get parent(): CollectionReference<T>;
get path(): string;
readonly type = "document";
withConverter(converter: null): DocumentReference<DocumentData>;
// (undocumented)
withConverter<U>(converter: FirestoreDataConverter<U>): DocumentReference<U>;
}

Expand Down Expand Up @@ -195,6 +199,8 @@ export class Query<T = DocumentData> {
protected constructor();
readonly firestore: FirebaseFirestore;
readonly type: 'query' | 'collection';
withConverter(converter: null): Query<DocumentData>;
// (undocumented)
withConverter<U>(converter: FirestoreDataConverter<U>): Query<U>;
}

Expand Down
6 changes: 4 additions & 2 deletions packages-exp/analytics-compat/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@
* limitations under the License.
*/

import firebase, { _FirebaseNamespace } from '@firebase/app-compat';
import firebase, {
_FirebaseNamespace,
FirebaseApp
} from '@firebase/app-compat';
import { FirebaseAnalytics } from '@firebase/analytics-types';
import { name, version } from '../package.json';
import { AnalyticsService } from './service';
Expand All @@ -25,7 +28,6 @@ import {
ComponentType,
InstanceFactory
} from '@firebase/component';
import { FirebaseApp } from '@firebase/app-types';
import {
settings as settingsExp,
isSupported as isSupportedExp
Expand Down
21 changes: 8 additions & 13 deletions packages-exp/analytics-compat/src/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import {
EventParams,
FirebaseAnalytics
} from '@firebase/analytics-types';
import { FirebaseApp } from '@firebase/app-types';
import {
Analytics as AnalyticsServiceExp,
logEvent as logEventExp,
Expand All @@ -30,42 +29,38 @@ import {
setUserId as setUserIdExp,
setUserProperties as setUserPropertiesExp
} from '@firebase/analytics-exp';
import { _FirebaseService, FirebaseApp } from '@firebase/app-compat';

export class AnalyticsService implements FirebaseAnalytics {
export class AnalyticsService implements FirebaseAnalytics, _FirebaseService {
constructor(
public app: FirebaseApp,
private _analyticsServiceExp: AnalyticsServiceExp
readonly _delegate: AnalyticsServiceExp
) {}

logEvent(
eventName: string,
eventParams?: EventParams | CustomParams,
options?: AnalyticsCallOptions
): void {
logEventExp(
this._analyticsServiceExp,
eventName as '',
eventParams,
options
);
logEventExp(this._delegate, eventName as '', eventParams, options);
}

setCurrentScreen(screenName: string, options?: AnalyticsCallOptions): void {
setCurrentScreenExp(this._analyticsServiceExp, screenName, options);
setCurrentScreenExp(this._delegate, screenName, options);
}

setUserId(id: string, options?: AnalyticsCallOptions): void {
setUserIdExp(this._analyticsServiceExp, id, options);
setUserIdExp(this._delegate, id, options);
}

setUserProperties(
properties: CustomParams,
options?: AnalyticsCallOptions
): void {
setUserPropertiesExp(this._analyticsServiceExp, properties, options);
setUserPropertiesExp(this._delegate, properties, options);
}

setAnalyticsCollectionEnabled(enabled: boolean): void {
setAnalyticsCollectionEnabledExp(this._analyticsServiceExp, enabled);
setAnalyticsCollectionEnabledExp(this._delegate, enabled);
}
}
31 changes: 16 additions & 15 deletions packages-exp/app-compat/src/firebaseApp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ import {
_FirebaseAppInternal as _FirebaseAppExp
} from '@firebase/app-exp';
import { _FirebaseService, _FirebaseNamespace } from './types';
import { Compat } from '@firebase/util';

// eslint-disable-next-line @typescript-eslint/naming-convention
export interface _FirebaseApp {
export interface _FirebaseApp extends Compat<_FirebaseAppExp> {
/**
* The (read-only) name (identifier) for this App. '[DEFAULT]' is the default
* App.
Expand Down Expand Up @@ -62,41 +63,41 @@ export class FirebaseAppImpl implements _FirebaseApp {
private container: ComponentContainer;

constructor(
private readonly app: _FirebaseAppExp,
readonly _delegate: _FirebaseAppExp,
private readonly firebase: _FirebaseNamespace
) {
// add itself to container
_addComponent(
app,
_delegate,
new Component('app-compat', () => this, ComponentType.PUBLIC)
);

this.container = app.container;
this.container = _delegate.container;
}

get automaticDataCollectionEnabled(): boolean {
return this.app.automaticDataCollectionEnabled;
return this._delegate.automaticDataCollectionEnabled;
}

set automaticDataCollectionEnabled(val) {
this.app.automaticDataCollectionEnabled = val;
this._delegate.automaticDataCollectionEnabled = val;
}

get name(): string {
return this.app.name;
return this._delegate.name;
}

get options(): FirebaseOptions {
return this.app.options;
return this._delegate.options;
}

delete(): Promise<void> {
return new Promise<void>(resolve => {
this.app.checkDestroyed();
this._delegate.checkDestroyed();
resolve();
}).then(() => {
this.firebase.INTERNAL.removeApp(this.name);
return deleteApp(this.app);
return deleteApp(this._delegate);
});
}

Expand All @@ -118,10 +119,10 @@ export class FirebaseAppImpl implements _FirebaseApp {
name: string,
instanceIdentifier: string = _DEFAULT_ENTRY_NAME
): _FirebaseService {
this.app.checkDestroyed();
this._delegate.checkDestroyed();

// getImmediate will always succeed because _getService is only called for registered components.
return (this.app.container.getProvider(name as Name).getImmediate({
return (this._delegate.container.getProvider(name as Name).getImmediate({
identifier: instanceIdentifier
}) as unknown) as _FirebaseService;
}
Expand All @@ -140,7 +141,7 @@ export class FirebaseAppImpl implements _FirebaseApp {
name: string,
instanceIdentifier: string = _DEFAULT_ENTRY_NAME
): void {
this.app.container
this._delegate.container
// eslint-disable-next-line @typescript-eslint/no-explicit-any
.getProvider(name as any)
.clearInstance(instanceIdentifier);
Expand All @@ -151,11 +152,11 @@ export class FirebaseAppImpl implements _FirebaseApp {
* @internal
*/
_addComponent(component: Component): void {
_addComponent(this.app, component);
_addComponent(this._delegate, component);
}

_addOrOverwriteComponent(component: Component): void {
_addOrOverwriteComponent(this.app, component);
_addOrOverwriteComponent(this._delegate, component);
}

toJSON(): object {
Expand Down
20 changes: 11 additions & 9 deletions packages-exp/app-compat/src/lite/firebaseAppLite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,42 +24,44 @@ import {
_FirebaseAppInternal as FirebaseAppExp
} from '@firebase/app-exp';
import { Component, ComponentType, Name } from '@firebase/component';
import { Compat } from '@firebase/util';

/**
* Global context object for a collection of services using
* a shared authentication state.
*/
export class FirebaseAppLiteImpl implements FirebaseApp {
export class FirebaseAppLiteImpl
implements FirebaseApp, Compat<FirebaseAppExp> {
constructor(
private readonly app: FirebaseAppExp,
readonly _delegate: FirebaseAppExp,
private readonly firebase: _FirebaseNamespace
) {
// add itself to container
_addComponent(
app,
_delegate,
new Component('app-compat', () => this, ComponentType.PUBLIC)
);
}

get automaticDataCollectionEnabled(): boolean {
return this.app.automaticDataCollectionEnabled;
return this._delegate.automaticDataCollectionEnabled;
}

set automaticDataCollectionEnabled(val) {
this.automaticDataCollectionEnabled = val;
}

get name(): string {
return this.app.name;
return this._delegate.name;
}

get options(): FirebaseOptions {
return this.app.options;
return this._delegate.options;
}

delete(): Promise<void> {
this.firebase.INTERNAL.removeApp(this.name);
return deleteApp(this.app);
return deleteApp(this._delegate);
}

/**
Expand All @@ -80,10 +82,10 @@ export class FirebaseAppLiteImpl implements FirebaseApp {
name: string,
instanceIdentifier: string = _DEFAULT_ENTRY_NAME
): _FirebaseService {
this.app.checkDestroyed();
this._delegate.checkDestroyed();

// getImmediate will always succeed because _getService is only called for registered components.
return (this.app.container.getProvider(name as Name).getImmediate({
return (this._delegate.container.getProvider(name as Name).getImmediate({
identifier: instanceIdentifier
}) as unknown) as _FirebaseService;
}
Expand Down
3 changes: 2 additions & 1 deletion packages-exp/app-compat/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
*/

import { FirebaseApp, FirebaseNamespace } from './public-types';
import { Compat } from '@firebase/util';
import { Component, ComponentContainer } from '@firebase/component';

export interface FirebaseServiceInternals {
Expand All @@ -34,7 +35,7 @@ export interface FirebaseServiceInternals {
// Services are exposed through instances - each of which is associated with a
// FirebaseApp.
// eslint-disable-next-line @typescript-eslint/naming-convention
export interface _FirebaseService {
export interface _FirebaseService extends Compat<unknown> {
app: FirebaseApp;
INTERNAL?: FirebaseServiceInternals;
}
Expand Down
1 change: 1 addition & 0 deletions packages-exp/app-compat/test/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { FirebaseApp } from '../src/public-types';
import { ComponentType, Component } from '@firebase/component';

export class TestService implements _FirebaseService {
readonly _delegate = {};
constructor(private app_: FirebaseApp, public instanceIdentifier?: string) {}

get app(): FirebaseApp {
Expand Down
Loading