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
37 changes: 21 additions & 16 deletions common/api-review/auth-exp.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,10 @@ export class EmailAuthProvider implements AuthProvider {
readonly providerId = ProviderId.PASSWORD;
}

// Warning: (ae-forgotten-export) The symbol "BaseOAuthProvider" needs to be exported by the entry point index.d.ts
//
// @public
export class FacebookAuthProvider extends OAuthProvider {
export class FacebookAuthProvider extends BaseOAuthProvider {
constructor();
static credential(accessToken: string): OAuthCredential;
static credentialFromError(error: FirebaseError): OAuthCredential | null;
Expand Down Expand Up @@ -255,7 +257,7 @@ export function getMultiFactorResolver(auth: Auth, error: MultiFactorError_2): M
export function getRedirectResult(auth: Auth, resolver?: PopupRedirectResolver): Promise<UserCredential | null>;

// @public
export class GithubAuthProvider extends OAuthProvider {
export class GithubAuthProvider extends BaseOAuthProvider {
constructor();
static credential(accessToken: string): OAuthCredential;
static credentialFromError(error: FirebaseError): OAuthCredential | null;
Expand All @@ -265,7 +267,7 @@ export class GithubAuthProvider extends OAuthProvider {
}

// @public
export class GoogleAuthProvider extends OAuthProvider {
export class GoogleAuthProvider extends BaseOAuthProvider {
constructor();
static credential(idToken?: string | null, accessToken?: string | null): OAuthCredential;
static credentialFromError(error: FirebaseError): OAuthCredential | null;
Expand Down Expand Up @@ -380,23 +382,13 @@ export interface OAuthCredentialOptions {
}

// @public
export class OAuthProvider implements AuthProvider {
constructor(providerId: string);
addScope(scope: string): AuthProvider;
export class OAuthProvider extends BaseOAuthProvider {
credential(params: OAuthCredentialOptions): OAuthCredential;
static credentialFromError(error: FirebaseError): OAuthCredential | null;
// (undocumented)
static credentialFromJSON(json: object | string): OAuthCredential;
static credentialFromResult(userCredential: UserCredential): OAuthCredential | null;
// @internal (undocumented)
defaultLanguageCode: string | null;
getCustomParameters(): CustomParameters;
getScopes(): string[];
// (undocumented)
readonly providerId: string;
setCustomParameters(customOAuthParameters: CustomParameters): AuthProvider;
setDefaultLanguage(languageCode: string | null): void;
}
}

// @public
export function onAuthStateChanged(auth: Auth, nextOrObserver: NextOrObserver<User>, error?: ErrorFn, completed?: CompleteFn): Unsubscribe;
Expand Down Expand Up @@ -566,6 +558,19 @@ export class RecaptchaVerifier implements ApplicationVerifierInternal {
// @public
export function reload(user: User): Promise<void>;

// Warning: (ae-forgotten-export) The symbol "FederatedAuthProvider" needs to be exported by the entry point index.d.ts
//
// @public
export class SAMLAuthProvider extends FederatedAuthProvider {
constructor(providerId: string);
// (undocumented)
static credentialFromError(error: FirebaseError): AuthCredential | null;
// (undocumented)
static credentialFromJSON(json: string | object): AuthCredential;
// (undocumented)
static credentialFromResult(userCredential: UserCredential): AuthCredential | null;
}

// @public
export function sendEmailVerification(user: User, actionCodeSettings?: ActionCodeSettings | null): Promise<void>;

Expand Down Expand Up @@ -626,7 +631,7 @@ export function signInWithRedirect(auth: Auth, provider: AuthProvider, resolver?
export function signOut(auth: Auth): Promise<void>;

// @public
export class TwitterAuthProvider extends OAuthProvider {
export class TwitterAuthProvider extends BaseOAuthProvider {
constructor();
static credential(token: string, secret: string): OAuthCredential;
static credentialFromError(error: FirebaseError): OAuthCredential | null;
Expand Down
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
3 changes: 1 addition & 2 deletions packages-exp/analytics-compat/src/service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@
*/
import { expect, use } from 'chai';
import { AnalyticsService } from './service';
import { firebase } from '@firebase/app-compat';
import { FirebaseApp } from '@firebase/app-types';
import { firebase, FirebaseApp } from '@firebase/app-compat';
import * as analyticsExp from '@firebase/analytics-exp';
import { stub, match, SinonStub } from 'sinon';
import * as sinonChai from 'sinon-chai';
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
Loading