diff --git a/common/api-review/auth-exp.api.md b/common/api-review/auth-exp.api.md index 2507ad333dc..2e9f9356d14 100644 --- a/common/api-review/auth-exp.api.md +++ b/common/api-review/auth-exp.api.md @@ -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; @@ -255,7 +257,7 @@ export function getMultiFactorResolver(auth: Auth, error: MultiFactorError_2): M export function getRedirectResult(auth: Auth, resolver?: PopupRedirectResolver): Promise; // @public -export class GithubAuthProvider extends OAuthProvider { +export class GithubAuthProvider extends BaseOAuthProvider { constructor(); static credential(accessToken: string): OAuthCredential; static credentialFromError(error: FirebaseError): OAuthCredential | null; @@ -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; @@ -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, error?: ErrorFn, completed?: CompleteFn): Unsubscribe; @@ -566,6 +558,19 @@ export class RecaptchaVerifier implements ApplicationVerifierInternal { // @public export function reload(user: User): Promise; +// 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; @@ -626,7 +631,7 @@ export function signInWithRedirect(auth: Auth, provider: AuthProvider, resolver? export function signOut(auth: Auth): Promise; // @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; diff --git a/common/api-review/firestore-exp.api.md b/common/api-review/firestore-exp.api.md index f69545ebbf7..14562861520 100644 --- a/common/api-review/firestore-exp.api.md +++ b/common/api-review/firestore-exp.api.md @@ -53,6 +53,8 @@ export class CollectionReference extends Query { get path(): string; // (undocumented) readonly type = "collection"; + withConverter(converter: null): CollectionReference; + // (undocumented) withConverter(converter: FirestoreDataConverter): CollectionReference; } @@ -101,6 +103,8 @@ export class DocumentReference { get parent(): CollectionReference; get path(): string; readonly type = "document"; + withConverter(converter: null): DocumentReference; + // (undocumented) withConverter(converter: FirestoreDataConverter): DocumentReference; } @@ -318,6 +322,8 @@ export class Query { protected constructor(); readonly firestore: FirebaseFirestore; readonly type: 'query' | 'collection'; + withConverter(converter: null): Query; + // (undocumented) withConverter(converter: FirestoreDataConverter): Query; } diff --git a/common/api-review/firestore-lite.api.md b/common/api-review/firestore-lite.api.md index 27ae44e86c7..cc4cc9e57fe 100644 --- a/common/api-review/firestore-lite.api.md +++ b/common/api-review/firestore-lite.api.md @@ -47,6 +47,8 @@ export class CollectionReference extends Query { get path(): string; // (undocumented) readonly type = "collection"; + withConverter(converter: null): CollectionReference; + // (undocumented) withConverter(converter: FirestoreDataConverter): CollectionReference; } @@ -81,6 +83,8 @@ export class DocumentReference { get parent(): CollectionReference; get path(): string; readonly type = "document"; + withConverter(converter: null): DocumentReference; + // (undocumented) withConverter(converter: FirestoreDataConverter): DocumentReference; } @@ -195,6 +199,8 @@ export class Query { protected constructor(); readonly firestore: FirebaseFirestore; readonly type: 'query' | 'collection'; + withConverter(converter: null): Query; + // (undocumented) withConverter(converter: FirestoreDataConverter): Query; } diff --git a/packages-exp/analytics-compat/src/index.ts b/packages-exp/analytics-compat/src/index.ts index 9224c3869fa..eeb46e88f8e 100644 --- a/packages-exp/analytics-compat/src/index.ts +++ b/packages-exp/analytics-compat/src/index.ts @@ -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'; @@ -25,7 +28,6 @@ import { ComponentType, InstanceFactory } from '@firebase/component'; -import { FirebaseApp } from '@firebase/app-types'; import { settings as settingsExp, isSupported as isSupportedExp diff --git a/packages-exp/analytics-compat/src/service.test.ts b/packages-exp/analytics-compat/src/service.test.ts index 26cfe68e5cc..1817a0be314 100644 --- a/packages-exp/analytics-compat/src/service.test.ts +++ b/packages-exp/analytics-compat/src/service.test.ts @@ -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'; diff --git a/packages-exp/analytics-compat/src/service.ts b/packages-exp/analytics-compat/src/service.ts index 9a7e6f1e7a1..283c4478683 100644 --- a/packages-exp/analytics-compat/src/service.ts +++ b/packages-exp/analytics-compat/src/service.ts @@ -21,7 +21,6 @@ import { EventParams, FirebaseAnalytics } from '@firebase/analytics-types'; -import { FirebaseApp } from '@firebase/app-types'; import { Analytics as AnalyticsServiceExp, logEvent as logEventExp, @@ -30,11 +29,12 @@ 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( @@ -42,30 +42,25 @@ export class AnalyticsService implements FirebaseAnalytics { 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); } } diff --git a/packages-exp/app-compat/src/firebaseApp.ts b/packages-exp/app-compat/src/firebaseApp.ts index 3337dddf2d3..578ac572096 100644 --- a/packages-exp/app-compat/src/firebaseApp.ts +++ b/packages-exp/app-compat/src/firebaseApp.ts @@ -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. @@ -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 { return new Promise(resolve => { - this.app.checkDestroyed(); + this._delegate.checkDestroyed(); resolve(); }).then(() => { this.firebase.INTERNAL.removeApp(this.name); - return deleteApp(this.app); + return deleteApp(this._delegate); }); } @@ -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; } @@ -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); @@ -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 { diff --git a/packages-exp/app-compat/src/lite/firebaseAppLite.ts b/packages-exp/app-compat/src/lite/firebaseAppLite.ts index 5fd3a9a2c5f..4a0f2372051 100644 --- a/packages-exp/app-compat/src/lite/firebaseAppLite.ts +++ b/packages-exp/app-compat/src/lite/firebaseAppLite.ts @@ -24,25 +24,27 @@ 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 { 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) { @@ -50,16 +52,16 @@ export class FirebaseAppLiteImpl implements FirebaseApp { } get name(): string { - return this.app.name; + return this._delegate.name; } get options(): FirebaseOptions { - return this.app.options; + return this._delegate.options; } delete(): Promise { this.firebase.INTERNAL.removeApp(this.name); - return deleteApp(this.app); + return deleteApp(this._delegate); } /** @@ -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; } diff --git a/packages-exp/app-compat/src/types.ts b/packages-exp/app-compat/src/types.ts index f478918f000..a06988b73d0 100644 --- a/packages-exp/app-compat/src/types.ts +++ b/packages-exp/app-compat/src/types.ts @@ -21,6 +21,7 @@ */ import { FirebaseApp, FirebaseNamespace } from './public-types'; +import { Compat } from '@firebase/util'; import { Component, ComponentContainer } from '@firebase/component'; export interface FirebaseServiceInternals { @@ -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 { app: FirebaseApp; INTERNAL?: FirebaseServiceInternals; } diff --git a/packages-exp/app-compat/test/util.ts b/packages-exp/app-compat/test/util.ts index 63bad1eeda9..04afb4f1fb4 100644 --- a/packages-exp/app-compat/test/util.ts +++ b/packages-exp/app-compat/test/util.ts @@ -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 { diff --git a/packages-exp/auth-compat-exp/src/auth.ts b/packages-exp/auth-compat-exp/src/auth.ts index a35ca2d6005..6ef2b876df2 100644 --- a/packages-exp/auth-compat-exp/src/auth.ts +++ b/packages-exp/auth-compat-exp/src/auth.ts @@ -40,11 +40,11 @@ const _assert: typeof exp._assert = exp._assert; export class Auth implements compat.FirebaseAuth, Wrapper, _FirebaseService { - private readonly auth: exp.AuthImpl; + readonly _delegate: exp.AuthImpl; constructor(readonly app: FirebaseApp, provider: Provider<'auth-exp'>) { if (provider.isInitialized()) { - this.auth = provider.getImmediate() as exp.AuthImpl; + this._delegate = provider.getImmediate() as exp.AuthImpl; this.linkUnderlyingAuth(); return; } @@ -82,56 +82,56 @@ export class Auth // Only use a popup/redirect resolver in browser environments const resolver = typeof window !== 'undefined' ? CompatPopupRedirectResolver : undefined; - this.auth = provider.initialize({ + this._delegate = provider.initialize({ options: { persistence: persistences, popupRedirectResolver: resolver } }) as exp.AuthImpl; - this.auth._updateErrorMap(exp.debugErrorMap); + this._delegate._updateErrorMap(exp.debugErrorMap); this.linkUnderlyingAuth(); } get emulatorConfig(): compat.EmulatorConfig | null { - return this.auth.emulatorConfig; + return this._delegate.emulatorConfig; } get currentUser(): compat.User | null { - if (!this.auth.currentUser) { + if (!this._delegate.currentUser) { return null; } - return User.getOrCreate(this.auth.currentUser); + return User.getOrCreate(this._delegate.currentUser); } get languageCode(): string | null { - return this.auth.languageCode; + return this._delegate.languageCode; } get settings(): compat.AuthSettings { - return this.auth.settings; + return this._delegate.settings; } get tenantId(): string | null { - return this.auth.tenantId; + return this._delegate.tenantId; } useDeviceLanguage(): void { - this.auth.useDeviceLanguage(); + this._delegate.useDeviceLanguage(); } signOut(): Promise { - return this.auth.signOut(); + return this._delegate.signOut(); } useEmulator(url: string, options?: { disableWarnings: boolean }): void { - exp.useAuthEmulator(this.auth, url, options); + exp.useAuthEmulator(this._delegate, url, options); } applyActionCode(code: string): Promise { - return exp.applyActionCode(this.auth, code); + return exp.applyActionCode(this._delegate, code); } checkActionCode(code: string): Promise { - return exp.checkActionCode(this.auth, code); + return exp.checkActionCode(this._delegate, code); } confirmPasswordReset(code: string, newPassword: string): Promise { - return exp.confirmPasswordReset(this.auth, code, newPassword); + return exp.confirmPasswordReset(this._delegate, code, newPassword); } async createUserWithEmailAndPassword( @@ -139,27 +139,27 @@ export class Auth password: string ): Promise { return convertCredential( - this.auth, - exp.createUserWithEmailAndPassword(this.auth, email, password) + this._delegate, + exp.createUserWithEmailAndPassword(this._delegate, email, password) ); } fetchProvidersForEmail(email: string): Promise { return this.fetchSignInMethodsForEmail(email); } fetchSignInMethodsForEmail(email: string): Promise { - return exp.fetchSignInMethodsForEmail(this.auth, email); + return exp.fetchSignInMethodsForEmail(this._delegate, email); } isSignInWithEmailLink(emailLink: string): boolean { - return exp.isSignInWithEmailLink(this.auth, emailLink); + return exp.isSignInWithEmailLink(this._delegate, emailLink); } async getRedirectResult(): Promise { _assert( _isPopupRedirectSupported(), - this.auth, + this._delegate, exp.AuthErrorCode.OPERATION_NOT_SUPPORTED ); const credential = await exp.getRedirectResult( - this.auth, + this._delegate, CompatPopupRedirectResolver ); if (!credential) { @@ -168,7 +168,7 @@ export class Auth user: null }; } - return convertCredential(this.auth, Promise.resolve(credential)); + return convertCredential(this._delegate, Promise.resolve(credential)); } onAuthStateChanged( nextOrObserver: Observer | ((a: compat.User | null) => unknown), @@ -180,7 +180,7 @@ export class Auth errorFn, completed ); - return this.auth.onAuthStateChanged(next!, error, complete); + return this._delegate.onAuthStateChanged(next!, error, complete); } onIdTokenChanged( nextOrObserver: Observer | ((a: compat.User | null) => unknown), @@ -192,26 +192,26 @@ export class Auth errorFn, completed ); - return this.auth.onIdTokenChanged(next!, error, complete); + return this._delegate.onIdTokenChanged(next!, error, complete); } sendSignInLinkToEmail( email: string, actionCodeSettings: compat.ActionCodeSettings ): Promise { - return exp.sendSignInLinkToEmail(this.auth, email, actionCodeSettings); + return exp.sendSignInLinkToEmail(this._delegate, email, actionCodeSettings); } sendPasswordResetEmail( email: string, actionCodeSettings?: compat.ActionCodeSettings | null ): Promise { return exp.sendPasswordResetEmail( - this.auth, + this._delegate, email, actionCodeSettings || undefined ); } async setPersistence(persistence: string): Promise { - _validatePersistenceArgument(this.auth, persistence); + _validatePersistenceArgument(this._delegate, persistence); let converted; switch (persistence) { case Persistence.SESSION: @@ -231,11 +231,11 @@ export class Auth break; default: return exp._fail(exp.AuthErrorCode.ARGUMENT_ERROR, { - appName: this.auth.name + appName: this._delegate.name }); } - return this.auth.setPersistence(converted); + return this._delegate.setPersistence(converted); } signInAndRetrieveDataWithCredential( @@ -244,20 +244,23 @@ export class Auth return this.signInWithCredential(credential); } signInAnonymously(): Promise { - return convertCredential(this.auth, exp.signInAnonymously(this.auth)); + return convertCredential( + this._delegate, + exp.signInAnonymously(this._delegate) + ); } signInWithCredential( credential: compat.AuthCredential ): Promise { return convertCredential( - this.auth, - exp.signInWithCredential(this.auth, credential as exp.AuthCredential) + this._delegate, + exp.signInWithCredential(this._delegate, credential as exp.AuthCredential) ); } signInWithCustomToken(token: string): Promise { return convertCredential( - this.auth, - exp.signInWithCustomToken(this.auth, token) + this._delegate, + exp.signInWithCustomToken(this._delegate, token) ); } signInWithEmailAndPassword( @@ -265,8 +268,8 @@ export class Auth password: string ): Promise { return convertCredential( - this.auth, - exp.signInWithEmailAndPassword(this.auth, email, password) + this._delegate, + exp.signInWithEmailAndPassword(this._delegate, email, password) ); } signInWithEmailLink( @@ -274,8 +277,8 @@ export class Auth emailLink?: string ): Promise { return convertCredential( - this.auth, - exp.signInWithEmailLink(this.auth, email, emailLink) + this._delegate, + exp.signInWithEmailLink(this._delegate, email, emailLink) ); } signInWithPhoneNumber( @@ -283,9 +286,9 @@ export class Auth applicationVerifier: compat.ApplicationVerifier ): Promise { return convertConfirmationResult( - this.auth, + this._delegate, exp.signInWithPhoneNumber( - this.auth, + this._delegate, phoneNumber, unwrap(applicationVerifier) ) @@ -296,13 +299,13 @@ export class Auth ): Promise { _assert( _isPopupRedirectSupported(), - this.auth, + this._delegate, exp.AuthErrorCode.OPERATION_NOT_SUPPORTED ); return convertCredential( - this.auth, + this._delegate, exp.signInWithPopup( - this.auth, + this._delegate, provider as exp.AuthProvider, CompatPopupRedirectResolver ) @@ -311,31 +314,33 @@ export class Auth async signInWithRedirect(provider: compat.AuthProvider): Promise { _assert( _isPopupRedirectSupported(), - this.auth, + this._delegate, exp.AuthErrorCode.OPERATION_NOT_SUPPORTED ); - await _savePersistenceForRedirect(this.auth); + await _savePersistenceForRedirect(this._delegate); return exp.signInWithRedirect( - this.auth, + this._delegate, provider as exp.AuthProvider, CompatPopupRedirectResolver ); } updateCurrentUser(user: compat.User | null): Promise { - return this.auth.updateCurrentUser(unwrap(user)); + // remove ts-ignore once overloads are defined for exp functions to accept compat objects + // @ts-ignore + return this._delegate.updateCurrentUser(unwrap(user)); } verifyPasswordResetCode(code: string): Promise { - return exp.verifyPasswordResetCode(this.auth, code); + return exp.verifyPasswordResetCode(this._delegate, code); } unwrap(): exp.Auth { - return this.auth; + return this._delegate; } _delete(): Promise { - return this.auth._delete(); + return this._delegate._delete(); } private linkUnderlyingAuth(): void { - ((this.auth as unknown) as ReverseWrapper).wrapped = () => this; + ((this._delegate as unknown) as ReverseWrapper).wrapped = () => this; } } diff --git a/packages-exp/auth-compat-exp/src/phone_auth_provider.ts b/packages-exp/auth-compat-exp/src/phone_auth_provider.ts index d6564e2b88b..ec01862ad77 100644 --- a/packages-exp/auth-compat-exp/src/phone_auth_provider.ts +++ b/packages-exp/auth-compat-exp/src/phone_auth_provider.ts @@ -18,12 +18,12 @@ import * as exp from '@firebase/auth-exp/internal'; import * as compat from '@firebase/auth-types'; import firebase from '@firebase/app-compat'; -import { unwrap, Wrapper } from './wrap'; +import { Compat } from '@firebase/util'; export class PhoneAuthProvider - implements compat.PhoneAuthProvider, Wrapper { + implements compat.PhoneAuthProvider, Compat { providerId = 'phone'; - private readonly phoneProvider: exp.PhoneAuthProvider; + readonly _delegate: exp.PhoneAuthProvider; static PHONE_SIGN_IN_METHOD = exp.PhoneAuthProvider.PHONE_SIGN_IN_METHOD; static PROVIDER_ID = exp.PhoneAuthProvider.PROVIDER_ID; @@ -38,7 +38,7 @@ export class PhoneAuthProvider constructor() { // TODO: remove ts-ignore when moving types from auth-types to auth-compat // @ts-ignore - this.phoneProvider = new exp.PhoneAuthProvider(unwrap(firebase.auth!())); + this._delegate = new exp.PhoneAuthProvider(unwrap(firebase.auth!())); } verifyPhoneNumber( @@ -49,15 +49,15 @@ export class PhoneAuthProvider | compat.PhoneMultiFactorSignInInfoOptions, applicationVerifier: compat.ApplicationVerifier ): Promise { - return this.phoneProvider.verifyPhoneNumber( + return this._delegate.verifyPhoneNumber( // The implementation matches but the types are subtly incompatible // eslint-disable-next-line @typescript-eslint/no-explicit-any phoneInfoOptions as any, - unwrap(applicationVerifier) + applicationVerifier ); } unwrap(): exp.PhoneAuthProvider { - return this.phoneProvider; + return this._delegate; } } diff --git a/packages-exp/auth-compat-exp/src/recaptcha_verifier.ts b/packages-exp/auth-compat-exp/src/recaptcha_verifier.ts index 2b60d75f44e..9cde304ba6b 100644 --- a/packages-exp/auth-compat-exp/src/recaptcha_verifier.ts +++ b/packages-exp/auth-compat-exp/src/recaptcha_verifier.ts @@ -18,13 +18,13 @@ import firebase, { FirebaseApp } from '@firebase/app-compat'; import * as exp from '@firebase/auth-exp/internal'; import * as compat from '@firebase/auth-types'; -import { unwrap, Wrapper } from './wrap'; +import { Compat } from '@firebase/util'; const _assert: typeof exp._assert = exp._assert; export class RecaptchaVerifier - implements compat.RecaptchaVerifier, Wrapper { - readonly verifier: exp.RecaptchaVerifier; + implements compat.RecaptchaVerifier, Compat { + readonly _delegate: exp.RecaptchaVerifier; type: string; constructor( container: HTMLElement | string, @@ -35,27 +35,24 @@ export class RecaptchaVerifier _assert(app.options?.apiKey, exp.AuthErrorCode.INVALID_API_KEY, { appName: app.name }); - this.verifier = new exp.RecaptchaVerifier( + this._delegate = new exp.RecaptchaVerifier( container, // eslint-disable-next-line @typescript-eslint/no-explicit-any parameters as any, // TODO: remove ts-ignore when moving types from auth-types to auth-compat // @ts-ignore - unwrap(app.auth!()) + app.auth!() ); - this.type = this.verifier.type; + this.type = this._delegate.type; } clear(): void { - this.verifier.clear(); + this._delegate.clear(); } render(): Promise { - return this.verifier.render(); + return this._delegate.render(); } verify(): Promise { - return this.verifier.verify(); - } - unwrap(): exp.ApplicationVerifier { - return this.verifier; + return this._delegate.verify(); } } diff --git a/packages-exp/auth-compat-exp/src/user.ts b/packages-exp/auth-compat-exp/src/user.ts index b5962150724..62a00086ffa 100644 --- a/packages-exp/auth-compat-exp/src/user.ts +++ b/packages-exp/auth-compat-exp/src/user.ts @@ -17,23 +17,23 @@ import * as exp from '@firebase/auth-exp/internal'; import * as compat from '@firebase/auth-types'; +import { Compat } from '@firebase/util'; import { _savePersistenceForRedirect } from './persistence'; import { CompatPopupRedirectResolver } from './popup_redirect'; import { convertConfirmationResult, convertCredential } from './user_credential'; -import { unwrap, Wrapper } from './wrap'; -export class User implements compat.User, Wrapper { +export class User implements compat.User, Compat { // Maintain a map so that there's always a 1:1 mapping between new User and // legacy compat users private static readonly USER_MAP = new WeakMap(); readonly multiFactor: compat.MultiFactorUser; - private constructor(private readonly user: exp.User) { - this.multiFactor = exp.multiFactor(user); + private constructor(readonly _delegate: exp.User) { + this.multiFactor = exp.multiFactor(_delegate); } static getOrCreate(user: exp.User): User { @@ -45,19 +45,19 @@ export class User implements compat.User, Wrapper { } delete(): Promise { - return this.user.delete(); + return this._delegate.delete(); } reload(): Promise { - return this.user.reload(); + return this._delegate.reload(); } toJSON(): object { - return this.user.toJSON(); + return this._delegate.toJSON(); } getIdTokenResult(forceRefresh?: boolean): Promise { - return this.user.getIdTokenResult(forceRefresh); + return this._delegate.getIdTokenResult(forceRefresh); } getIdToken(forceRefresh?: boolean): Promise { - return this.user.getIdToken(forceRefresh); + return this._delegate.getIdToken(forceRefresh); } linkAndRetrieveDataWithCredential( credential: compat.AuthCredential @@ -69,7 +69,7 @@ export class User implements compat.User, Wrapper { ): Promise { return convertCredential( this.auth, - exp.linkWithCredential(this.user, credential as exp.AuthCredential) + exp.linkWithCredential(this._delegate, credential as exp.AuthCredential) ); } async linkWithPhoneNumber( @@ -78,11 +78,7 @@ export class User implements compat.User, Wrapper { ): Promise { return convertConfirmationResult( this.auth, - exp.linkWithPhoneNumber( - this.user, - phoneNumber, - unwrap(applicationVerifier) - ) + exp.linkWithPhoneNumber(this._delegate, phoneNumber, applicationVerifier) ); } async linkWithPopup( @@ -91,7 +87,7 @@ export class User implements compat.User, Wrapper { return convertCredential( this.auth, exp.linkWithPopup( - this.user, + this._delegate, provider as exp.AuthProvider, CompatPopupRedirectResolver ) @@ -100,7 +96,7 @@ export class User implements compat.User, Wrapper { async linkWithRedirect(provider: compat.AuthProvider): Promise { await _savePersistenceForRedirect(exp._castAuth(this.auth)); return exp.linkWithRedirect( - this.user, + this._delegate, provider as exp.AuthProvider, CompatPopupRedirectResolver ); @@ -116,7 +112,7 @@ export class User implements compat.User, Wrapper { return convertCredential( (this.auth as unknown) as exp.Auth, exp.reauthenticateWithCredential( - this.user, + this._delegate, credential as exp.AuthCredential ) ); @@ -128,9 +124,9 @@ export class User implements compat.User, Wrapper { return convertConfirmationResult( this.auth, exp.reauthenticateWithPhoneNumber( - this.user, + this._delegate, phoneNumber, - unwrap(applicationVerifier) + applicationVerifier ) ); } @@ -140,7 +136,7 @@ export class User implements compat.User, Wrapper { return convertCredential( this.auth, exp.reauthenticateWithPopup( - this.user, + this._delegate, provider as exp.AuthProvider, CompatPopupRedirectResolver ) @@ -151,7 +147,7 @@ export class User implements compat.User, Wrapper { ): Promise { await _savePersistenceForRedirect(exp._castAuth(this.auth)); return exp.reauthenticateWithRedirect( - this.user, + this._delegate, provider as exp.AuthProvider, CompatPopupRedirectResolver ); @@ -159,21 +155,21 @@ export class User implements compat.User, Wrapper { sendEmailVerification( actionCodeSettings?: compat.ActionCodeSettings | null ): Promise { - return exp.sendEmailVerification(this.user, actionCodeSettings); + return exp.sendEmailVerification(this._delegate, actionCodeSettings); } async unlink(providerId: string): Promise { - await exp.unlink(this.user, providerId as exp.ProviderId); + await exp.unlink(this._delegate, providerId as exp.ProviderId); return this; } updateEmail(newEmail: string): Promise { - return exp.updateEmail(this.user, newEmail); + return exp.updateEmail(this._delegate, newEmail); } updatePassword(newPassword: string): Promise { - return exp.updatePassword(this.user, newPassword); + return exp.updatePassword(this._delegate, newPassword); } updatePhoneNumber(phoneCredential: compat.AuthCredential): Promise { return exp.updatePhoneNumber( - this.user, + this._delegate, phoneCredential as exp.PhoneAuthCredential ); } @@ -181,54 +177,55 @@ export class User implements compat.User, Wrapper { displayName?: string | null; photoURL?: string | null; }): Promise { - return exp.updateProfile(this.user, profile); + return exp.updateProfile(this._delegate, profile); } verifyBeforeUpdateEmail( newEmail: string, actionCodeSettings?: compat.ActionCodeSettings | null ): Promise { - return exp.verifyBeforeUpdateEmail(this.user, newEmail, actionCodeSettings); - } - unwrap(): exp.User { - return this.user; + return exp.verifyBeforeUpdateEmail( + this._delegate, + newEmail, + actionCodeSettings + ); } get emailVerified(): boolean { - return this.user.emailVerified; + return this._delegate.emailVerified; } get isAnonymous(): boolean { - return this.user.isAnonymous; + return this._delegate.isAnonymous; } get metadata(): compat.UserMetadata { - return this.user.metadata; + return this._delegate.metadata; } get phoneNumber(): string | null { - return this.user.phoneNumber; + return this._delegate.phoneNumber; } get providerData(): Array { - return this.user.providerData; + return this._delegate.providerData; } get refreshToken(): string { - return this.user.refreshToken; + return this._delegate.refreshToken; } get tenantId(): string | null { - return this.user.tenantId; + return this._delegate.tenantId; } get displayName(): string | null { - return this.user.displayName; + return this._delegate.displayName; } get email(): string | null { - return this.user.email; + return this._delegate.email; } get photoURL(): string | null { - return this.user.photoURL; + return this._delegate.photoURL; } get providerId(): string { - return this.user.providerId; + return this._delegate.providerId; } get uid(): string { - return this.user.uid; + return this._delegate.uid; } private get auth(): exp.Auth { - return ((this.user as exp.UserImpl).auth as unknown) as exp.Auth; + return ((this._delegate as exp.UserImpl).auth as unknown) as exp.Auth; } } diff --git a/packages-exp/auth-compat-exp/test/integration/flows/custom.test.ts b/packages-exp/auth-compat-exp/test/integration/flows/custom.test.ts index fdeb1505905..3b2937b3bf6 100644 --- a/packages-exp/auth-compat-exp/test/integration/flows/custom.test.ts +++ b/packages-exp/auth-compat-exp/test/integration/flows/custom.test.ts @@ -18,6 +18,8 @@ import { FirebaseError } from '@firebase/util'; import { expect, use } from 'chai'; import firebase from '@firebase/app-compat'; +// eslint-disable-next-line import/no-extraneous-dependencies +import '@firebase/auth-compat'; import * as chaiAsPromised from 'chai-as-promised'; import { diff --git a/packages-exp/functions-compat/src/service.ts b/packages-exp/functions-compat/src/service.ts index d485c5a69ea..d72902dc62e 100644 --- a/packages-exp/functions-compat/src/service.ts +++ b/packages-exp/functions-compat/src/service.ts @@ -22,10 +22,10 @@ import { HttpsCallableOptions, Functions as FunctionsServiceExp } from '@firebase/functions-exp'; -import { FirebaseApp } from '@firebase/app-compat'; +import { FirebaseApp, _FirebaseService } from '@firebase/app-compat'; import { FirebaseError } from '@firebase/util'; -export class FunctionsService implements FirebaseFunctions { +export class FunctionsService implements FirebaseFunctions, _FirebaseService { /** * For testing. * @internal @@ -39,13 +39,13 @@ export class FunctionsService implements FirebaseFunctions { constructor( public app: FirebaseApp, - private _functionsInstance: FunctionsServiceExp + readonly _delegate: FunctionsServiceExp ) { - this._region = this._functionsInstance.region; - this._customDomain = this._functionsInstance.customDomain; + this._region = this._delegate.region; + this._customDomain = this._delegate.customDomain; } httpsCallable(name: string, options?: HttpsCallableOptions): HttpsCallable { - return httpsCallableExp(this._functionsInstance, name, options); + return httpsCallableExp(this._delegate, name, options); } /** * Deprecated in pre-modularized repo, does not exist in modularized @@ -67,13 +67,9 @@ export class FunctionsService implements FirebaseFunctions { 'Port missing in origin provided to useFunctionsEmulator()' ); } - return useFunctionsEmulatorExp( - this._functionsInstance, - match[1], - Number(match[2]) - ); + return useFunctionsEmulatorExp(this._delegate, match[1], Number(match[2])); } useEmulator(host: string, port: number): void { - return useFunctionsEmulatorExp(this._functionsInstance, host, port); + return useFunctionsEmulatorExp(this._delegate, host, port); } } diff --git a/packages-exp/installations-compat/src/installationsCompat.ts b/packages-exp/installations-compat/src/installationsCompat.ts index d05abd2fe43..600bf11c0bd 100644 --- a/packages-exp/installations-compat/src/installationsCompat.ts +++ b/packages-exp/installations-compat/src/installationsCompat.ts @@ -31,19 +31,19 @@ export class InstallationsCompat implements FirebaseInstallationsCompat, _FirebaseService { constructor( public app: FirebaseApp, - private _installations: FirebaseInstallations + readonly _delegate: FirebaseInstallations ) {} getId(): Promise { - return getId(this._installations); + return getId(this._delegate); } getToken(forceRefresh?: boolean): Promise { - return getToken(this._installations, forceRefresh); + return getToken(this._delegate, forceRefresh); } delete(): Promise { - return deleteInstallations(this._installations); + return deleteInstallations(this._delegate); } onIdChange(callback: IdChangeCallbackFn): IdChangeUnsubscribeFn { - return onIdChange(this._installations, callback); + return onIdChange(this._delegate, callback); } } diff --git a/packages-exp/installations-compat/src/testing/util.ts b/packages-exp/installations-compat/src/testing/util.ts index 2b57f444ce2..3b67cbef09a 100644 --- a/packages-exp/installations-compat/src/testing/util.ts +++ b/packages-exp/installations-compat/src/testing/util.ts @@ -37,7 +37,8 @@ export function getFakeApp(): FirebaseApp { }, automaticDataCollectionEnabled: true, delete: async () => {}, - installations: (() => null as unknown) as any + installations: (() => null as unknown) as any, + _delegate: {} as any }; } diff --git a/packages-exp/messaging-compat/src/messaging-compat.ts b/packages-exp/messaging-compat/src/messaging-compat.ts index 3fef9387578..b457f04a6a9 100644 --- a/packages-exp/messaging-compat/src/messaging-compat.ts +++ b/packages-exp/messaging-compat/src/messaging-compat.ts @@ -43,31 +43,31 @@ export class MessagingCompat implements _FirebaseService { | Observer | null = null; - constructor(readonly app: AppCompat, readonly messaging: FirebaseMessaging) { + constructor(readonly app: AppCompat, readonly _delegate: FirebaseMessaging) { this.app = app; - this.messaging = messaging; + this._delegate = _delegate; } async getToken(options?: { vapidKey?: string; serviceWorkerRegistration?: ServiceWorkerRegistration; }): Promise { - return getToken(this.messaging, options); + return getToken(this._delegate, options); } async deleteToken(): Promise { - return deleteToken(this.messaging); + return deleteToken(this._delegate); } onMessage( nextOrObserver: NextFn | Observer ): Unsubscribe { - return onMessage(this.messaging, nextOrObserver); + return onMessage(this._delegate, nextOrObserver); } onBackgroundMessage( nextOrObserver: NextFn | Observer ): Unsubscribe { - return onBackgroundMessage(this.messaging, nextOrObserver); + return onBackgroundMessage(this._delegate, nextOrObserver); } } diff --git a/packages-exp/messaging-compat/test/fakes.ts b/packages-exp/messaging-compat/test/fakes.ts index 4225fd5c0e1..76959abcc27 100644 --- a/packages-exp/messaging-compat/test/fakes.ts +++ b/packages-exp/messaging-compat/test/fakes.ts @@ -32,7 +32,8 @@ export function getFakeApp(): FirebaseApp { }, automaticDataCollectionEnabled: true, delete: async () => {}, - messaging: (() => null as unknown) as FirebaseApp['messaging'] + messaging: (() => null as unknown) as FirebaseApp['messaging'], + _delegate: {} as any }; } diff --git a/packages-exp/performance-compat/package.json b/packages-exp/performance-compat/package.json index 5844c5361e6..4a0c9befd19 100644 --- a/packages-exp/performance-compat/package.json +++ b/packages-exp/performance-compat/package.json @@ -27,8 +27,7 @@ }, "license": "Apache-2.0", "peerDependencies": { - "@firebase/app-compat": "0.x", - "@firebase/app-types": "0.x" + "@firebase/app-compat": "0.x" }, "dependencies": { "@firebase/performance-exp": "0.0.900", diff --git a/packages-exp/performance-compat/src/performance.ts b/packages-exp/performance-compat/src/performance.ts index 5ad44efc6ba..ddc82c88d5a 100644 --- a/packages-exp/performance-compat/src/performance.ts +++ b/packages-exp/performance-compat/src/performance.ts @@ -15,7 +15,6 @@ * limitations under the License. */ -import { FirebaseApp } from '@firebase/app-types'; import { trace, FirebasePerformance, @@ -23,32 +22,32 @@ import { PerformanceTrace } from '@firebase/performance-exp'; import { FirebasePerformance as FirebasePerformanceCompat } from '@firebase/performance-types'; -import { FirebaseService } from '@firebase/app-types/private'; +import { FirebaseApp, _FirebaseService } from '@firebase/app-compat'; export class PerformanceCompatImpl - implements FirebasePerformanceCompat, FirebaseService { + implements FirebasePerformanceCompat, _FirebaseService { constructor( public app: FirebaseApp, - private _performance: FirebasePerformance + readonly _delegate: FirebasePerformance ) {} get instrumentationEnabled(): boolean { - return this._performance.instrumentationEnabled; + return this._delegate.instrumentationEnabled; } set instrumentationEnabled(val: boolean) { - this._performance.instrumentationEnabled = val; + this._delegate.instrumentationEnabled = val; } get dataCollectionEnabled(): boolean { - return this._performance.dataCollectionEnabled; + return this._delegate.dataCollectionEnabled; } set dataCollectionEnabled(val: boolean) { - this._performance.dataCollectionEnabled = val; + this._delegate.dataCollectionEnabled = val; } trace(traceName: string): PerformanceTrace { - return trace(this._performance, traceName); + return trace(this._delegate, traceName); } } diff --git a/packages-exp/performance-compat/test/util.ts b/packages-exp/performance-compat/test/util.ts index 70b242bdc1b..52503b91d69 100644 --- a/packages-exp/performance-compat/test/util.ts +++ b/packages-exp/performance-compat/test/util.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { FirebaseApp } from '@firebase/app-types'; +import { FirebaseApp } from '@firebase/app-compat'; import { FirebasePerformance, PerformanceTrace @@ -34,7 +34,8 @@ export function getFakeApp(): FirebaseApp { appId: '1:777777777777:web:d93b5ca1475efe57' }, automaticDataCollectionEnabled: true, - delete: async () => {} + delete: async () => {}, + _delegate: {} as any }; } diff --git a/packages-exp/remote-config-compat/src/remoteConfig.ts b/packages-exp/remote-config-compat/src/remoteConfig.ts index 96d08a2501c..61b02ce62d8 100644 --- a/packages-exp/remote-config-compat/src/remoteConfig.ts +++ b/packages-exp/remote-config-compat/src/remoteConfig.ts @@ -39,38 +39,38 @@ import { export class RemoteConfigCompatImpl implements RemoteConfigCompat, _FirebaseService { - constructor(public app: FirebaseApp, private _remoteConfig: RemoteConfig) {} + constructor(public app: FirebaseApp, readonly _delegate: RemoteConfig) {} get defaultConfig(): { [key: string]: string | number | boolean } { - return this._remoteConfig.defaultConfig; + return this._delegate.defaultConfig; } set defaultConfig(value: { [key: string]: string | number | boolean }) { - this._remoteConfig.defaultConfig = value; + this._delegate.defaultConfig = value; } get fetchTimeMillis(): number { - return this._remoteConfig.fetchTimeMillis; + return this._delegate.fetchTimeMillis; } get lastFetchStatus(): FetchSTatusCompat { - return this._remoteConfig.lastFetchStatus; + return this._delegate.lastFetchStatus; } get settings(): SettingsCompat { - return this._remoteConfig.settings; + return this._delegate.settings; } set settings(value: SettingsCompat) { - this._remoteConfig.settings = value; + this._delegate.settings = value; } activate(): Promise { - return activate(this._remoteConfig); + return activate(this._delegate); } ensureInitialized(): Promise { - return ensureInitialized(this._remoteConfig); + return ensureInitialized(this._delegate); } /** @@ -79,36 +79,36 @@ export class RemoteConfigCompatImpl * {@link DEFAULT_FETCH_TIMEOUT_SECONDS}. */ fetch(): Promise { - return fetchConfig(this._remoteConfig); + return fetchConfig(this._delegate); } fetchAndActivate(): Promise { - return fetchAndActivate(this._remoteConfig); + return fetchAndActivate(this._delegate); } getAll(): { [key: string]: ValueCompat } { - return getAll(this._remoteConfig); + return getAll(this._delegate); } getBoolean(key: string): boolean { - return getBoolean(this._remoteConfig, key); + return getBoolean(this._delegate, key); } getNumber(key: string): number { - return getNumber(this._remoteConfig, key); + return getNumber(this._delegate, key); } getString(key: string): string { - return getString(this._remoteConfig, key); + return getString(this._delegate, key); } getValue(key: string): ValueCompat { - return getValue(this._remoteConfig, key); + return getValue(this._delegate, key); } // Based on packages/firestore/src/util/log.ts but not static because we need per-instance levels // to differentiate 2p and 3p use-cases. setLogLevel(logLevel: RemoteConfigLogLevel): void { - setLogLevel(this._remoteConfig, logLevel); + setLogLevel(this._delegate, logLevel); } } diff --git a/packages-exp/remote-config-compat/test/util.ts b/packages-exp/remote-config-compat/test/util.ts index c55386724c7..3fb5d7c58f2 100644 --- a/packages-exp/remote-config-compat/test/util.ts +++ b/packages-exp/remote-config-compat/test/util.ts @@ -31,7 +31,9 @@ export function getFakeApp(): FirebaseApp { appId: '1:777777777777:web:d93b5ca1475efe57' }, automaticDataCollectionEnabled: true, - delete: async () => {} + delete: async () => {}, + remoteConfig: (() => null as unknown) as FirebaseApp['remoteConfig'], + _delegate: {} as any }; } diff --git a/packages/firestore/exp/index.ts b/packages/firestore/exp/index.ts index 4dabb459178..1e75d751075 100644 --- a/packages/firestore/exp/index.ts +++ b/packages/firestore/exp/index.ts @@ -133,5 +133,3 @@ export { CACHE_SIZE_UNLIMITED } from '../src/exp/database'; export { FirestoreErrorCode, FirestoreError } from '../src/util/error'; export { AbstractUserDataWriter } from '../src/lite/user_data_writer'; - -export { Compat } from '../src/lite/compat'; diff --git a/packages/firestore/externs.json b/packages/firestore/externs.json index 64898f99651..de3847a83f9 100644 --- a/packages/firestore/externs.json +++ b/packages/firestore/externs.json @@ -27,6 +27,7 @@ "packages/webchannel-wrapper/src/index.d.ts", "packages/util/dist/src/crypt.d.ts", "packages/util/dist/src/environment.d.ts", + "packages/util/dist/src/compat.d.ts", "packages/firestore/export.ts", "packages/firestore/src/protos/firestore_bundle_proto.ts", "packages/firestore/src/protos/firestore_proto_api.ts", diff --git a/packages/firestore/src/api/blob.ts b/packages/firestore/src/api/blob.ts index 18ee929604b..37ee3f54411 100644 --- a/packages/firestore/src/api/blob.ts +++ b/packages/firestore/src/api/blob.ts @@ -15,7 +15,9 @@ * limitations under the License. */ -import { Bytes, Compat } from '../../exp/index'; +import { Compat } from '@firebase/util'; + +import { Bytes } from '../../exp/index'; import { isBase64Available } from '../platform/base64'; import { Code, FirestoreError } from '../util/error'; @@ -40,7 +42,8 @@ function assertBase64Available(): void { } /** Immutable class holding a blob (binary data) */ -export class Blob extends Compat { +export class Blob implements Compat { + constructor(readonly _delegate: Bytes) {} static fromBase64String(base64: string): Blob { assertBase64Available(); return new Blob(Bytes.fromBase64String(base64)); diff --git a/packages/firestore/src/api/database.ts b/packages/firestore/src/api/database.ts index 64a09715a7f..d3002c2ad51 100644 --- a/packages/firestore/src/api/database.ts +++ b/packages/firestore/src/api/database.ts @@ -44,6 +44,7 @@ import { WhereFilterOp as PublicWhereFilterOp, WriteBatch as PublicWriteBatch } from '@firebase/firestore-types'; +import { Compat, getModularInstance } from '@firebase/util'; import { LoadBundleTask, @@ -98,8 +99,7 @@ import { runTransaction, Transaction as ExpTransaction, WriteBatch as ExpWriteBatch, - AbstractUserDataWriter, - Compat + AbstractUserDataWriter } from '../../exp/index'; // import from the exp public API import { DatabaseId } from '../core/database_info'; import { UntypedFirestoreDataConverter } from '../lite/user_data_reader'; @@ -195,16 +195,13 @@ export class IndexedDbPersistenceProvider implements PersistenceProvider { * to the functional API of firestore-exp. */ export class Firestore - extends Compat - implements PublicFirestore, FirebaseService { + implements PublicFirestore, FirebaseService, Compat { _appCompat?: FirebaseApp; constructor( databaseIdOrApp: DatabaseId | FirebaseApp, - delegate: ExpFirebaseFirestore, + readonly _delegate: ExpFirebaseFirestore, private _persistenceProvider: PersistenceProvider ) { - super(delegate); - if (!(databaseIdOrApp instanceof DatabaseId)) { this._appCompat = databaseIdOrApp as FirebaseApp; } @@ -386,16 +383,13 @@ export function setLogLevel(level: PublicLogLevel): void { /** * A reference to a transaction. */ -export class Transaction - extends Compat - implements PublicTransaction { +export class Transaction implements PublicTransaction, Compat { private _userDataWriter: UserDataWriter; constructor( private readonly _firestore: Firestore, - delegate: ExpTransaction + readonly _delegate: ExpTransaction ) { - super(delegate); this._userDataWriter = new UserDataWriter(_firestore); } @@ -480,9 +474,8 @@ export class Transaction } } -export class WriteBatch - extends Compat - implements PublicWriteBatch { +export class WriteBatch implements PublicWriteBatch, Compat { + constructor(readonly _delegate: ExpWriteBatch) {} set( documentRef: DocumentReference, data: Partial, @@ -551,17 +544,16 @@ export class WriteBatch * them to the wrapped converter. */ class FirestoreDataConverter - extends Compat> - implements UntypedFirestoreDataConverter { + implements + UntypedFirestoreDataConverter, + Compat> { private static readonly INSTANCES = new WeakMap(); private constructor( private readonly _firestore: Firestore, private readonly _userDataWriter: UserDataWriter, - delegate: PublicFirestoreDataConverter - ) { - super(delegate); - } + readonly _delegate: PublicFirestoreDataConverter + ) {} fromFirestore( snapshot: ExpQueryDocumentSnapshot, @@ -629,15 +621,13 @@ class FirestoreDataConverter * A reference to a particular document in a collection in the database. */ export class DocumentReference - extends Compat> - implements PublicDocumentReference { + implements PublicDocumentReference, Compat> { private _userDataWriter: UserDataWriter; constructor( readonly firestore: Firestore, - delegate: ExpDocumentReference + readonly _delegate: ExpDocumentReference ) { - super(delegate); this._userDataWriter = new UserDataWriter(firestore); } @@ -705,9 +695,7 @@ export class DocumentReference } isEqual(other: PublicDocumentReference): boolean { - if (other instanceof Compat) { - other = other._delegate; - } + other = getModularInstance>(other); if (!(other instanceof ExpDocumentReference)) { return false; @@ -917,14 +905,11 @@ export function wrapObserver( export interface SnapshotOptions extends PublicSnapshotOptions {} export class DocumentSnapshot - extends Compat> - implements PublicDocumentSnapshot { + implements PublicDocumentSnapshot, Compat> { constructor( private readonly _firestore: Firestore, - delegate: ExpDocumentSnapshot - ) { - super(delegate); - } + readonly _delegate: ExpDocumentSnapshot + ) {} get ref(): DocumentReference { return new DocumentReference(this._firestore, this._delegate.ref); @@ -974,12 +959,10 @@ export class QueryDocumentSnapshot } export class Query - extends Compat> - implements PublicQuery { + implements PublicQuery, Compat> { private readonly _userDataWriter: UserDataWriter; - constructor(readonly firestore: Firestore, delegate: ExpQuery) { - super(delegate); + constructor(readonly firestore: Firestore, readonly _delegate: ExpQuery) { this._userDataWriter = new UserDataWriter(firestore); } @@ -1154,14 +1137,11 @@ export class Query } export class DocumentChange - extends Compat> - implements PublicDocumentChange { + implements PublicDocumentChange, Compat> { constructor( private readonly _firestore: Firestore, - delegate: ExpDocumentChange - ) { - super(delegate); - } + readonly _delegate: ExpDocumentChange + ) {} get type(): PublicDocumentChangeType { return this._delegate.type; @@ -1181,11 +1161,11 @@ export class DocumentChange } export class QuerySnapshot - extends Compat> - implements PublicQuerySnapshot { - constructor(readonly _firestore: Firestore, delegate: ExpQuerySnapshot) { - super(delegate); - } + implements PublicQuerySnapshot, Compat> { + constructor( + readonly _firestore: Firestore, + readonly _delegate: ExpQuerySnapshot + ) {} get query(): Query { return new Query(this._firestore, this._delegate.query); @@ -1306,8 +1286,5 @@ export class CollectionReference function castReference( documentRef: PublicDocumentReference ): ExpDocumentReference { - if (documentRef instanceof Compat) { - documentRef = documentRef._delegate; - } return cast>(documentRef, ExpDocumentReference); } diff --git a/packages/firestore/src/api/field_path.ts b/packages/firestore/src/api/field_path.ts index bf3a79c0789..2b1ef4442fc 100644 --- a/packages/firestore/src/api/field_path.ts +++ b/packages/firestore/src/api/field_path.ts @@ -16,8 +16,9 @@ */ import { FieldPath as PublicFieldPath } from '@firebase/firestore-types'; +import { Compat, getModularInstance } from '@firebase/util'; -import { FieldPath as ExpFieldPath, Compat } from '../../exp/index'; +import { FieldPath as ExpFieldPath } from '../../exp/index'; import { FieldPath as InternalFieldPath } from '../model/path'; // The objects that are a part of this API are exposed to third-parties as @@ -29,7 +30,8 @@ import { FieldPath as InternalFieldPath } from '../model/path'; * single field name (referring to a top-level field in the document), or a list * of field names (referring to a nested field in the document). */ -export class FieldPath extends Compat implements PublicFieldPath { +export class FieldPath implements PublicFieldPath, Compat { + readonly _delegate: ExpFieldPath; /** * Creates a FieldPath from the provided field names. If more than one field * name is provided, the path will point to a nested field in a document. @@ -37,7 +39,7 @@ export class FieldPath extends Compat implements PublicFieldPath { * @param fieldNames - A list of field names. */ constructor(...fieldNames: string[]) { - super(new ExpFieldPath(...fieldNames)); + this._delegate = new ExpFieldPath(...fieldNames); } static documentId(): FieldPath { @@ -51,9 +53,7 @@ export class FieldPath extends Compat implements PublicFieldPath { } isEqual(other: PublicFieldPath): boolean { - if (other instanceof Compat) { - other = other._delegate; - } + other = getModularInstance(other); if (!(other instanceof ExpFieldPath)) { return false; diff --git a/packages/firestore/src/api/field_value.ts b/packages/firestore/src/api/field_value.ts index 3ff38e7c590..6e13c0e438b 100644 --- a/packages/firestore/src/api/field_value.ts +++ b/packages/firestore/src/api/field_value.ts @@ -16,6 +16,7 @@ */ import { FieldValue as PublicFieldValue } from '@firebase/firestore-types'; +import { Compat } from '@firebase/util'; import { arrayRemove, @@ -23,13 +24,10 @@ import { deleteField, FieldValue as FieldValue1, increment, - serverTimestamp, - Compat + serverTimestamp } from '../../exp/index'; -export class FieldValue - extends Compat - implements PublicFieldValue { +export class FieldValue implements PublicFieldValue, Compat { static serverTimestamp(): FieldValue { const delegate = serverTimestamp(); delegate._methodName = 'FieldValue.serverTimestamp'; @@ -60,6 +58,8 @@ export class FieldValue return new FieldValue(delegate); } + constructor(readonly _delegate: FieldValue1) {} + isEqual(other: FieldValue): boolean { return this._delegate.isEqual(other._delegate); } diff --git a/packages/firestore/src/exp/reference_impl.ts b/packages/firestore/src/exp/reference_impl.ts index d3acf5411f7..468e297a7a8 100644 --- a/packages/firestore/src/exp/reference_impl.ts +++ b/packages/firestore/src/exp/reference_impl.ts @@ -15,6 +15,8 @@ * limitations under the License. */ +import { getModularInstance } from '@firebase/util'; + import { CompleteFn, ErrorFn, @@ -34,7 +36,6 @@ import { import { newQueryForPath, Query as InternalQuery } from '../core/query'; import { ViewSnapshot } from '../core/view_snapshot'; import { Bytes } from '../lite/bytes'; -import { Compat } from '../lite/compat'; import { FieldPath } from '../lite/field_path'; import { validateHasExplicitOrderByForLimitToLast } from '../lite/query'; import { @@ -337,9 +338,7 @@ export function updateDoc( // For Compat types, we have to "extract" the underlying types before // performing validation. - if (fieldOrUpdateData instanceof Compat) { - fieldOrUpdateData = fieldOrUpdateData._delegate; - } + fieldOrUpdateData = getModularInstance(fieldOrUpdateData); let parsed: ParsedUpdateData; if ( @@ -621,9 +620,7 @@ export function onSnapshot( reference: Query | DocumentReference, ...args: unknown[] ): Unsubscribe { - if (reference instanceof Compat) { - reference = reference._delegate; - } + reference = getModularInstance(reference); let options: SnapshotListenOptions = { includeMetadataChanges: false diff --git a/packages/firestore/src/lite/compat.ts b/packages/firestore/src/lite/compat.ts deleted file mode 100644 index 77e618c9095..00000000000 --- a/packages/firestore/src/lite/compat.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * A class implemented by all API types of the legacy Firestore API which - * contains a reference to the API type in the firestore-exp API. All internal - * code unwraps these references, which allows us to only use firestore-exp - * types in the SDK. - * - * @internal - */ -export abstract class Compat { - constructor(readonly _delegate: T) {} -} diff --git a/packages/firestore/src/lite/query.ts b/packages/firestore/src/lite/query.ts index c5dca6792d7..f162be5ed46 100644 --- a/packages/firestore/src/lite/query.ts +++ b/packages/firestore/src/lite/query.ts @@ -15,6 +15,8 @@ * limitations under the License. */ +import { getModularInstance } from '@firebase/util'; + import { DatabaseId } from '../core/database_info'; import { findFilterOperator, @@ -52,7 +54,6 @@ import { valueDescription } from '../util/input_validation'; -import { Compat } from './compat'; import { FieldPath } from './field_path'; import { DocumentReference, Query } from './reference'; import { DocumentSnapshot, fieldPathFromArgument } from './snapshot'; @@ -442,9 +443,7 @@ function newQueryBoundFromDocOrFields( docOrFields: Array>, before: boolean ): Bound { - if (docOrFields[0] instanceof Compat) { - docOrFields[0] = docOrFields[0]._delegate; - } + docOrFields[0] = getModularInstance(docOrFields[0]); if (docOrFields[0] instanceof DocumentSnapshot) { return newQueryBoundFromDocument( @@ -676,9 +675,7 @@ function parseDocumentIdValue( query: InternalQuery, documentIdValue: unknown ): ProtoValue { - if (documentIdValue instanceof Compat) { - documentIdValue = documentIdValue._delegate; - } + documentIdValue = getModularInstance(documentIdValue); if (typeof documentIdValue === 'string') { if (documentIdValue === '') { diff --git a/packages/firestore/src/lite/reference.ts b/packages/firestore/src/lite/reference.ts index e14c19f5c27..c87a77661ab 100644 --- a/packages/firestore/src/lite/reference.ts +++ b/packages/firestore/src/lite/reference.ts @@ -15,6 +15,8 @@ * limitations under the License. */ +import { getModularInstance } from '@firebase/util'; + import { newQueryForCollectionGroup, newQueryForPath, @@ -32,7 +34,6 @@ import { } from '../util/input_validation'; import { AutoId } from '../util/misc'; -import { Compat } from './compat'; import { FirebaseFirestore } from './database'; import { FieldPath } from './field_path'; import { FirestoreDataConverter } from './snapshot'; @@ -320,9 +321,7 @@ export function collection( path: string, ...pathSegments: string[] ): CollectionReference { - if (parent instanceof Compat) { - parent = parent._delegate; - } + parent = getModularInstance(parent); validateNonEmptyArgument('collection', 'path', path); if (parent instanceof FirebaseFirestore) { @@ -451,9 +450,7 @@ export function doc( path?: string, ...pathSegments: string[] ): DocumentReference { - if (parent instanceof Compat) { - parent = parent._delegate; - } + parent = getModularInstance(parent); // We allow omission of 'pathString' but explicitly prohibit passing in both // 'undefined' and 'null'. @@ -505,12 +502,8 @@ export function refEqual( left: DocumentReference | CollectionReference, right: DocumentReference | CollectionReference ): boolean { - if (left instanceof Compat) { - left = left._delegate; - } - if (right instanceof Compat) { - right = right._delegate; - } + left = getModularInstance(left); + right = getModularInstance(right); if ( (left instanceof DocumentReference || @@ -536,12 +529,8 @@ export function refEqual( * Firestore database. */ export function queryEqual(left: Query, right: Query): boolean { - if (left instanceof Compat) { - left = left._delegate; - } - if (right instanceof Compat) { - right = right._delegate; - } + left = getModularInstance(left); + right = getModularInstance(right); if (left instanceof Query && right instanceof Query) { return ( diff --git a/packages/firestore/src/lite/reference_impl.ts b/packages/firestore/src/lite/reference_impl.ts index 5d0e6eb2295..9385b0de363 100644 --- a/packages/firestore/src/lite/reference_impl.ts +++ b/packages/firestore/src/lite/reference_impl.ts @@ -19,6 +19,7 @@ import { DocumentData as PublicDocumentData, SetOptions as PublicSetOptions } from '@firebase/firestore-types'; +import { getModularInstance } from '@firebase/util'; import { hasLimitToLast } from '../core/query'; import { DeleteMutation, Precondition } from '../model/mutation'; @@ -32,7 +33,6 @@ import { ByteString } from '../util/byte_string'; import { cast } from '../util/input_validation'; import { Bytes } from './bytes'; -import { Compat } from './compat'; import { getDatastore } from './components'; import { FirebaseFirestore } from './database'; import { FieldPath } from './field_path'; @@ -305,9 +305,7 @@ export function updateDoc( // For Compat types, we have to "extract" the underlying types before // performing validation. - if (fieldOrUpdateData instanceof Compat) { - fieldOrUpdateData = fieldOrUpdateData._delegate; - } + fieldOrUpdateData = getModularInstance(fieldOrUpdateData); let parsed: ParsedUpdateData; if ( diff --git a/packages/firestore/src/lite/snapshot.ts b/packages/firestore/src/lite/snapshot.ts index aae0acb9d6c..ec5aae727bb 100644 --- a/packages/firestore/src/lite/snapshot.ts +++ b/packages/firestore/src/lite/snapshot.ts @@ -15,12 +15,13 @@ * limitations under the License. */ +import { Compat, getModularInstance } from '@firebase/util'; + import { Document } from '../model/document'; import { DocumentKey } from '../model/document_key'; import { FieldPath as InternalFieldPath } from '../model/path'; import { arrayEquals } from '../util/misc'; -import { Compat } from './compat'; import { FirebaseFirestore } from './database'; import { FieldPath } from './field_path'; import { @@ -291,12 +292,8 @@ export function snapshotEqual( left: DocumentSnapshot | QuerySnapshot, right: DocumentSnapshot | QuerySnapshot ): boolean { - if (left instanceof Compat) { - left = left._delegate; - } - if (right instanceof Compat) { - right = right._delegate; - } + left = getModularInstance(left); + right = getModularInstance(right); if (left instanceof DocumentSnapshot && right instanceof DocumentSnapshot) { return ( @@ -326,9 +323,9 @@ export function fieldPathFromArgument( ): InternalFieldPath { if (typeof arg === 'string') { return fieldPathFromDotSeparatedString(methodName, arg); - } else if (arg instanceof Compat) { - return arg._delegate._internalPath; - } else { + } else if (arg instanceof FieldPath) { return arg._internalPath; + } else { + return arg._delegate._internalPath; } } diff --git a/packages/firestore/src/lite/transaction.ts b/packages/firestore/src/lite/transaction.ts index 8f50a45478f..e1182410e51 100644 --- a/packages/firestore/src/lite/transaction.ts +++ b/packages/firestore/src/lite/transaction.ts @@ -15,6 +15,8 @@ * limitations under the License. */ +import { getModularInstance } from '@firebase/util'; + import { Transaction as InternalTransaction } from '../core/transaction'; import { TransactionRunner } from '../core/transaction_runner'; import { fail } from '../util/assert'; @@ -22,7 +24,6 @@ import { newAsyncQueue } from '../util/async_queue_impl'; import { cast } from '../util/input_validation'; import { Deferred } from '../util/promise'; -import { Compat } from './compat'; import { getDatastore } from './components'; import { FirebaseFirestore } from './database'; import { FieldPath } from './field_path'; @@ -195,9 +196,7 @@ export class Transaction { // For Compat types, we have to "extract" the underlying types before // performing validation. - if (fieldOrUpdateData instanceof Compat) { - fieldOrUpdateData = fieldOrUpdateData._delegate; - } + fieldOrUpdateData = getModularInstance(fieldOrUpdateData); let parsed; if ( diff --git a/packages/firestore/src/lite/user_data_reader.ts b/packages/firestore/src/lite/user_data_reader.ts index 3d5be01e2c4..0de09842a2a 100644 --- a/packages/firestore/src/lite/user_data_reader.ts +++ b/packages/firestore/src/lite/user_data_reader.ts @@ -20,6 +20,7 @@ import { FieldPath as PublicFieldPath, SetOptions } from '@firebase/firestore-types'; +import { Compat, getModularInstance } from '@firebase/util'; import { ParseContext } from '../api/parse_context'; import { DatabaseId } from '../core/database_info'; @@ -58,7 +59,6 @@ import { isPlainObject, valueDescription } from '../util/input_validation'; import { Dict, forEach, isEmpty } from '../util/obj'; import { Bytes } from './bytes'; -import { Compat } from './compat'; import { FirebaseFirestore } from './database'; import { FieldPath } from './field_path'; import { FieldValue } from './field_value'; @@ -584,9 +584,7 @@ export function parseUpdateData( // For Compat types, we have to "extract" the underlying types before // performing validation. - if (value instanceof Compat) { - value = value._delegate; - } + value = getModularInstance(value); const childContext = context.childContextForFieldPath(path); if (value instanceof DeleteFieldValueImpl) { @@ -652,9 +650,7 @@ export function parseUpdateVarargs( // For Compat types, we have to "extract" the underlying types before // performing validation. - if (value instanceof Compat) { - value = value._delegate; - } + value = getModularInstance(value); const childContext = context.childContextForFieldPath(path); if (value instanceof DeleteFieldValueImpl) { @@ -715,9 +711,7 @@ export function parseData( ): ProtoValue | null { // Unwrap the API type from the Compat SDK. This will return the API type // from firestore-exp. - if (input instanceof Compat) { - input = input._delegate; - } + input = getModularInstance(input); if (looksLikeJsonObject(input)) { validatePlainObject('Unsupported field value:', context, input); @@ -840,9 +834,7 @@ function parseScalarValue( value: unknown, context: ParseContextImpl ): ProtoValue | null { - if (value instanceof Compat) { - value = value._delegate; - } + value = getModularInstance(value); if (value === null) { return { nullValue: 'NULL_VALUE' }; @@ -947,9 +939,7 @@ export function fieldPathFromArgument( ): InternalFieldPath { // If required, replace the FieldPath Compat class with with the firestore-exp // FieldPath. - if (path instanceof Compat) { - path = path._delegate; - } + path = getModularInstance(path); if (path instanceof FieldPath) { return path._internalPath; diff --git a/packages/firestore/src/lite/write_batch.ts b/packages/firestore/src/lite/write_batch.ts index 8c60edf8650..fccb5bb54df 100644 --- a/packages/firestore/src/lite/write_batch.ts +++ b/packages/firestore/src/lite/write_batch.ts @@ -15,12 +15,13 @@ * limitations under the License. */ +import { Compat, getModularInstance } from '@firebase/util'; + import { DeleteMutation, Mutation, Precondition } from '../model/mutation'; import { invokeCommitRpc } from '../remote/datastore'; import { Code, FirestoreError } from '../util/error'; import { cast } from '../util/input_validation'; -import { Compat } from './compat'; import { getDatastore } from './components'; import { FirebaseFirestore } from './database'; import { FieldPath } from './field_path'; @@ -151,9 +152,7 @@ export class WriteBatch { // For Compat types, we have to "extract" the underlying types before // performing validation. - if (fieldOrUpdateData instanceof Compat) { - fieldOrUpdateData = fieldOrUpdateData._delegate; - } + fieldOrUpdateData = getModularInstance(fieldOrUpdateData); let parsed; if ( @@ -235,9 +234,8 @@ export function validateReference( documentRef: DocumentReference | Compat>, firestore: FirebaseFirestore ): DocumentReference { - if (documentRef instanceof Compat) { - documentRef = documentRef._delegate; - } + documentRef = getModularInstance(documentRef); + if (documentRef.firestore !== firestore) { throw new FirestoreError( Code.INVALID_ARGUMENT, diff --git a/packages/storage/compat/list.ts b/packages/storage/compat/list.ts index 805749a4eba..da394d20849 100644 --- a/packages/storage/compat/list.ts +++ b/packages/storage/compat/list.ts @@ -18,10 +18,11 @@ import { ListResult } from '../exp/api'; import * as types from '@firebase/storage-types'; import { ReferenceCompat } from './reference'; import { StorageServiceCompat } from './service'; +import { Compat } from '@firebase/util'; -export class ListResultCompat implements types.ListResult { +export class ListResultCompat implements types.ListResult, Compat { constructor( - private readonly _delegate: ListResult, + readonly _delegate: ListResult, private readonly _service: StorageServiceCompat ) {} diff --git a/packages/storage/compat/reference.ts b/packages/storage/compat/reference.ts index f91e38f470e..29deef4efcf 100644 --- a/packages/storage/compat/reference.ts +++ b/packages/storage/compat/reference.ts @@ -40,10 +40,12 @@ import * as types from '@firebase/storage-types'; import { Metadata } from '../src/metadata'; import { dataFromString } from '../src/implementation/string'; import { invalidRootOperation } from '../src/implementation/error'; +import { Compat } from '@firebase/util'; -export class ReferenceCompat implements types.Reference { +export class ReferenceCompat + implements types.Reference, Compat { constructor( - private readonly _delegate: StorageReference, + readonly _delegate: StorageReference, public storage: StorageServiceCompat ) {} diff --git a/packages/storage/compat/service.ts b/packages/storage/compat/service.ts index 25a1890bdd8..3f4c0dd6870 100644 --- a/packages/storage/compat/service.ts +++ b/packages/storage/compat/service.ts @@ -22,12 +22,14 @@ import { StorageService, ref, _Location } from '../exp/api'; // import from the import { ReferenceCompat } from './reference'; import { isUrl } from '../src/service'; import { invalidArgument } from '../src/implementation/error'; +import { Compat } from '@firebase/util'; /** * A service that provides firebaseStorage.Reference instances. * @param opt_url gs:// url to a custom Storage Bucket */ -export class StorageServiceCompat implements types.FirebaseStorage { +export class StorageServiceCompat + implements types.FirebaseStorage, Compat { constructor(public app: FirebaseApp, readonly _delegate: StorageService) {} INTERNAL = { diff --git a/packages/storage/compat/task.ts b/packages/storage/compat/task.ts index 10637782af4..a358c47c40a 100644 --- a/packages/storage/compat/task.ts +++ b/packages/storage/compat/task.ts @@ -25,10 +25,11 @@ import { import { UploadTaskSnapshotCompat } from './tasksnapshot'; import { ReferenceCompat } from './reference'; import * as types from '@firebase/storage-types'; +import { Compat } from '@firebase/util'; -export class UploadTaskCompat implements types.UploadTask { +export class UploadTaskCompat implements types.UploadTask, Compat { constructor( - private readonly _delegate: UploadTask, + readonly _delegate: UploadTask, private readonly _ref: ReferenceCompat ) {} diff --git a/packages/storage/compat/tasksnapshot.ts b/packages/storage/compat/tasksnapshot.ts index 71d3584da81..4d092994199 100644 --- a/packages/storage/compat/tasksnapshot.ts +++ b/packages/storage/compat/tasksnapshot.ts @@ -19,8 +19,10 @@ import { UploadTaskSnapshot } from '../exp/api'; import { ReferenceCompat } from './reference'; import { UploadTaskCompat } from './task'; import * as types from '@firebase/storage-types'; +import { Compat } from '@firebase/util'; -export class UploadTaskSnapshotCompat implements types.UploadTaskSnapshot { +export class UploadTaskSnapshotCompat + implements types.UploadTaskSnapshot, Compat { constructor( readonly _delegate: UploadTaskSnapshot, readonly task: UploadTaskCompat,