Skip to content

Commit 88e1f88

Browse files
sam-gcFeiyang1
andauthored
Update auth compat polyfill to use composition instead of inheritance (#3900)
* Auth compat index * Go back to old way * Switch to compositional compat layer instead of inheritance-based * Formatting * Comment formatting * Fix linter issues * PR feedback * Pull auth from service instead of instantiating directly * Make compat script work (#3916) * expose modular APIs from compat * build compat script that works with exp packages * Fix linter issues Co-authored-by: Feiyang <[email protected]>
1 parent fe0ae19 commit 88e1f88

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+560
-411
lines changed

common/api-review/auth-exp.api.md

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { ErrorFn } from '@firebase/util';
1010
import * as externs from '@firebase/auth-types-exp';
1111
import { FirebaseApp } from '@firebase/app-types-exp';
1212
import { FirebaseError } from '@firebase/util';
13+
import { NextFn } from '@firebase/util';
1314
import { ProviderId } from '@firebase/auth-types-exp';
1415
import { Unsubscribe } from '@firebase/util';
1516
import { UserCredential } from '@firebase/auth-types-exp';
@@ -39,17 +40,17 @@ export function applyActionCode(auth: externs.Auth, oobCode: string): Promise<vo
3940
// @public (undocumented)
4041
export class AuthCredential {
4142
protected constructor(providerId: string, signInMethod: string);
42-
// Warning: (ae-forgotten-export) The symbol "AuthCore" needs to be exported by the entry point index.d.ts
43+
// Warning: (ae-forgotten-export) The symbol "Auth" needs to be exported by the entry point index.d.ts
4344
// Warning: (ae-forgotten-export) The symbol "PhoneOrOauthTokenResponse" needs to be exported by the entry point index.d.ts
4445
//
4546
// (undocumented)
46-
_getIdTokenResponse(_auth: AuthCore): Promise<PhoneOrOauthTokenResponse>;
47+
_getIdTokenResponse(_auth: Auth_2): Promise<PhoneOrOauthTokenResponse>;
4748
// (undocumented)
48-
_getReauthenticationResolver(_auth: AuthCore): Promise<IdTokenResponse>;
49+
_getReauthenticationResolver(_auth: Auth_2): Promise<IdTokenResponse>;
4950
// Warning: (ae-forgotten-export) The symbol "IdTokenResponse" needs to be exported by the entry point index.d.ts
5051
//
5152
// (undocumented)
52-
_linkToIdToken(_auth: AuthCore, _idToken: string): Promise<IdTokenResponse>;
53+
_linkToIdToken(_auth: Auth_2, _idToken: string): Promise<IdTokenResponse>;
5354
// (undocumented)
5455
readonly providerId: string;
5556
// (undocumented)
@@ -90,11 +91,11 @@ export class EmailAuthCredential extends AuthCredential implements externs.AuthC
9091
// (undocumented)
9192
static fromJSON(json: object | string): EmailAuthCredential | null;
9293
// (undocumented)
93-
_getIdTokenResponse(auth: AuthCore): Promise<IdTokenResponse>;
94+
_getIdTokenResponse(auth: Auth_2): Promise<IdTokenResponse>;
9495
// (undocumented)
95-
_getReauthenticationResolver(auth: AuthCore): Promise<IdTokenResponse>;
96+
_getReauthenticationResolver(auth: Auth_2): Promise<IdTokenResponse>;
9697
// (undocumented)
97-
_linkToIdToken(auth: AuthCore, idToken: string): Promise<IdTokenResponse>;
98+
_linkToIdToken(auth: Auth_2, idToken: string): Promise<IdTokenResponse>;
9899
// (undocumented)
99100
readonly password: string;
100101
// (undocumented)
@@ -154,7 +155,7 @@ export function getIdTokenResult(externUser: externs.User, forceRefresh?: boolea
154155
export function getMultiFactorResolver(auth: externs.Auth, errorExtern: externs.MultiFactorError): externs.MultiFactorResolver;
155156

156157
// @public (undocumented)
157-
export function getRedirectResult(authExtern: externs.Auth, resolverExtern: externs.PopupRedirectResolver): Promise<externs.UserCredential | null>;
158+
export function getRedirectResult(authExtern: externs.Auth, resolverExtern?: externs.PopupRedirectResolver): Promise<externs.UserCredential | null>;
158159

159160
// @public (undocumented)
160161
export class GithubAuthProvider extends OAuthProvider {
@@ -209,10 +210,10 @@ export function linkWithCredential(userExtern: externs.User, credentialExtern: e
209210
export function linkWithPhoneNumber(userExtern: externs.User, phoneNumber: string, appVerifier: externs.ApplicationVerifier): Promise<externs.ConfirmationResult>;
210211

211212
// @public (undocumented)
212-
export function linkWithPopup(userExtern: externs.User, provider: externs.AuthProvider, resolverExtern: externs.PopupRedirectResolver): Promise<externs.UserCredential>;
213+
export function linkWithPopup(userExtern: externs.User, provider: externs.AuthProvider, resolverExtern?: externs.PopupRedirectResolver): Promise<externs.UserCredential>;
213214

214215
// @public (undocumented)
215-
export function linkWithRedirect(userExtern: externs.User, provider: externs.AuthProvider, resolverExtern: externs.PopupRedirectResolver): Promise<never>;
216+
export function linkWithRedirect(userExtern: externs.User, provider: externs.AuthProvider, resolverExtern?: externs.PopupRedirectResolver): Promise<never>;
216217

217218
// @public (undocumented)
218219
export function multiFactor(user: externs.User): externs.MultiFactorUser;
@@ -228,13 +229,13 @@ export class OAuthCredential extends AuthCredential implements externs.OAuthCred
228229
// (undocumented)
229230
static _fromParams(params: OAuthCredentialParams): OAuthCredential;
230231
// (undocumented)
231-
_getIdTokenResponse(auth: AuthCore): Promise<IdTokenResponse>;
232+
_getIdTokenResponse(auth: Auth_2): Promise<IdTokenResponse>;
232233
// (undocumented)
233-
_getReauthenticationResolver(auth: AuthCore): Promise<IdTokenResponse>;
234+
_getReauthenticationResolver(auth: Auth_2): Promise<IdTokenResponse>;
234235
// (undocumented)
235236
idToken?: string;
236237
// (undocumented)
237-
_linkToIdToken(auth: AuthCore, idToken: string): Promise<IdTokenResponse>;
238+
_linkToIdToken(auth: Auth_2, idToken: string): Promise<IdTokenResponse>;
238239
// (undocumented)
239240
nonce?: string;
240241
// (undocumented)
@@ -288,11 +289,11 @@ export class PhoneAuthCredential extends AuthCredential implements externs.Phone
288289
// (undocumented)
289290
static _fromVerification(verificationId: string, verificationCode: string): PhoneAuthCredential;
290291
// (undocumented)
291-
_getIdTokenResponse(auth: AuthCore): Promise<PhoneOrOauthTokenResponse>;
292+
_getIdTokenResponse(auth: Auth_2): Promise<PhoneOrOauthTokenResponse>;
292293
// (undocumented)
293-
_getReauthenticationResolver(auth: AuthCore): Promise<IdTokenResponse>;
294+
_getReauthenticationResolver(auth: Auth_2): Promise<IdTokenResponse>;
294295
// (undocumented)
295-
_linkToIdToken(auth: AuthCore, idToken: string): Promise<IdTokenResponse>;
296+
_linkToIdToken(auth: Auth_2, idToken: string): Promise<IdTokenResponse>;
296297
// Warning: (ae-forgotten-export) The symbol "SignInWithPhoneNumberRequest" needs to be exported by the entry point index.d.ts
297298
//
298299
// (undocumented)
@@ -303,7 +304,7 @@ export class PhoneAuthCredential extends AuthCredential implements externs.Phone
303304

304305
// @public (undocumented)
305306
export class PhoneAuthProvider implements externs.PhoneAuthProvider {
306-
constructor(auth: AuthCore);
307+
constructor(auth: externs.Auth);
307308
// (undocumented)
308309
static credential(verificationId: string, verificationCode: string): PhoneAuthCredential;
309310
// (undocumented)
@@ -331,17 +332,17 @@ export function reauthenticateWithCredential(userExtern: externs.User, credentia
331332
export function reauthenticateWithPhoneNumber(userExtern: externs.User, phoneNumber: string, appVerifier: externs.ApplicationVerifier): Promise<externs.ConfirmationResult>;
332333

333334
// @public (undocumented)
334-
export function reauthenticateWithPopup(userExtern: externs.User, provider: externs.AuthProvider, resolverExtern: externs.PopupRedirectResolver): Promise<externs.UserCredential>;
335+
export function reauthenticateWithPopup(userExtern: externs.User, provider: externs.AuthProvider, resolverExtern?: externs.PopupRedirectResolver): Promise<externs.UserCredential>;
335336

336337
// @public (undocumented)
337-
export function reauthenticateWithRedirect(userExtern: externs.User, provider: externs.AuthProvider, resolverExtern: externs.PopupRedirectResolver): Promise<never>;
338+
export function reauthenticateWithRedirect(userExtern: externs.User, provider: externs.AuthProvider, resolverExtern?: externs.PopupRedirectResolver): Promise<never>;
338339

339340
// Warning: (ae-forgotten-export) The symbol "ApplicationVerifier" needs to be exported by the entry point index.d.ts
340341
//
341342
// @public (undocumented)
342343
export class RecaptchaVerifier implements externs.RecaptchaVerifier, ApplicationVerifier {
343344
// Warning: (ae-forgotten-export) The symbol "Parameters" needs to be exported by the entry point index.d.ts
344-
constructor(containerOrId: HTMLElement | string, parameters: Parameters_2, auth: AuthCore);
345+
constructor(containerOrId: HTMLElement | string, parameters: Parameters_2, authExtern: externs.Auth);
345346
// (undocumented)
346347
clear(): void;
347348
// Warning: (ae-forgotten-export) The symbol "ReCaptchaLoader" needs to be exported by the entry point index.d.ts
@@ -392,10 +393,10 @@ export function signInWithEmailLink(auth: externs.Auth, email: string, emailLink
392393
export function signInWithPhoneNumber(auth: externs.Auth, phoneNumber: string, appVerifier: externs.ApplicationVerifier): Promise<externs.ConfirmationResult>;
393394

394395
// @public (undocumented)
395-
export function signInWithPopup(auth: externs.Auth, provider: externs.AuthProvider, resolverExtern: externs.PopupRedirectResolver): Promise<externs.UserCredential>;
396+
export function signInWithPopup(authExtern: externs.Auth, provider: externs.AuthProvider, resolverExtern?: externs.PopupRedirectResolver): Promise<externs.UserCredential>;
396397

397398
// @public (undocumented)
398-
export function signInWithRedirect(auth: externs.Auth, provider: externs.AuthProvider, resolverExtern: externs.PopupRedirectResolver): Promise<never>;
399+
export function signInWithRedirect(authExtern: externs.Auth, provider: externs.AuthProvider, resolverExtern?: externs.PopupRedirectResolver): Promise<never>;
399400

400401
// @public (undocumented)
401402
export function signOut(auth: externs.Auth): Promise<void>;

packages-exp/app-compat/src/firebaseNamespaceCore.ts

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,7 @@ import {
2626
FirebaseService,
2727
FirebaseServiceNamespace
2828
} from '@firebase/app-types/private';
29-
import {
30-
SDK_VERSION,
31-
initializeApp,
32-
registerVersion,
33-
onLog,
34-
setLogLevel,
35-
_registerComponent,
36-
_DEFAULT_ENTRY_NAME
37-
} from '@firebase/app-exp';
29+
import * as modularAPIs from '@firebase/app-exp';
3830
import { _FirebaseAppInternal } from '@firebase/app-types-exp';
3931
import { Component, ComponentType } from '@firebase/component';
4032

@@ -66,16 +58,17 @@ export function createFirebaseNamespaceCore(
6658
initializeApp: initializeAppCompat,
6759
// @ts-ignore
6860
app,
69-
registerVersion,
70-
setLogLevel,
71-
onLog,
61+
registerVersion: modularAPIs.registerVersion,
62+
setLogLevel: modularAPIs.setLogLevel,
63+
onLog: modularAPIs.onLog,
7264
// @ts-ignore
7365
apps: null,
74-
SDK_VERSION,
66+
SDK_VERSION: modularAPIs.SDK_VERSION,
7567
INTERNAL: {
7668
registerComponent: registerComponentCompat,
7769
removeApp,
78-
useAsService
70+
useAsService,
71+
modularAPIs
7972
}
8073
};
8174

@@ -109,7 +102,7 @@ export function createFirebaseNamespaceCore(
109102
* Get the App object for a given name (or DEFAULT).
110103
*/
111104
function app(name?: string): FirebaseApp {
112-
name = name || _DEFAULT_ENTRY_NAME;
105+
name = name || modularAPIs._DEFAULT_ENTRY_NAME;
113106
if (!contains(apps, name)) {
114107
throw ERROR_FACTORY.create(AppError.NO_APP, { appName: name });
115108
}
@@ -126,7 +119,10 @@ export function createFirebaseNamespaceCore(
126119
options: FirebaseOptions,
127120
rawConfig = {}
128121
): FirebaseApp {
129-
const app = initializeApp(options, rawConfig) as _FirebaseAppInternal;
122+
const app = modularAPIs.initializeApp(
123+
options,
124+
rawConfig
125+
) as _FirebaseAppInternal;
130126
const appCompat = new firebaseAppImpl(app, namespace as _FirebaseNamespace);
131127
apps[app.name] = appCompat;
132128
return appCompat;
@@ -145,7 +141,7 @@ export function createFirebaseNamespaceCore(
145141
): FirebaseServiceNamespace<FirebaseService> | null {
146142
const componentName = component.name;
147143
if (
148-
_registerComponent(component) &&
144+
modularAPIs._registerComponent(component) &&
149145
component.type === ComponentType.PUBLIC
150146
) {
151147
// create service namespace for public components

packages-exp/auth-compat-exp/demo/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
"lint:fix": "eslint --fix -c .eslintrc.js '**/*.ts' --ignore-path '../../../.gitignore'",
1111
"demo": "rollup -c && firebase serve",
1212
"build": "rollup -c",
13-
"build:deps": "lerna run --scope @firebase/'{app-exp,auth-compat-exp}' --include-dependencies build",
13+
"build:deps": "lerna run --scope @firebase/'{app-compat,app-exp,auth-compat-exp}' --include-dependencies build",
1414
"dev": "rollup -c -w"
1515
},
1616
"peerDependencies": {
17-
"@firebase/app": "0.x",
17+
"@firebase/app-compat": "0.x",
1818
"@firebase/auth-types": "0.x",
1919
"@firebase/auth-exp": "0.x"
2020
},

packages-exp/auth-compat-exp/demo/rollup.config.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const umdBuilds = [
4141
* App UMD Builds
4242
*/
4343
{
44-
input: '../../../packages/firebase/app/index.ts',
44+
input: '../../firebase-exp/compat/app/index.ts',
4545
output: {
4646
file: 'public/dist/firebase-app.js',
4747
sourcemap: true,
@@ -59,7 +59,8 @@ const umdBuilds = [
5959
extend: true,
6060
name: 'firebase',
6161
globals: {
62-
'@firebase/app': 'firebase'
62+
'@firebase/app-compat': 'firebase',
63+
'@firebase/app-exp': 'firebase.INTERNAL.modularAPIs'
6364
},
6465
/**
6566
* use iife to avoid below error in the old Safari browser
@@ -81,7 +82,7 @@ const umdBuilds = [
8182
}`
8283
},
8384
plugins: [...plugins],
84-
external: ['@firebase/app']
85+
external: ['@firebase/app-compat', '@firebase/app-exp']
8586
}
8687
];
8788

packages-exp/auth-compat-exp/index.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* limitations under the License.
1616
*/
1717

18-
import firebase from '@firebase/app';
18+
import firebase from '@firebase/app-compat';
1919
import { _FirebaseNamespace } from '@firebase/app-types/private';
2020
import * as impl from '@firebase/auth-exp/internal';
2121
import * as externs from '@firebase/auth-types-exp';
@@ -28,20 +28,23 @@ import {
2828
import { version } from './package.json';
2929
import { Auth } from './src/auth';
3030
import { Persistence } from './src/persistence';
31+
import { PhoneAuthProvider } from './src/phone_auth_provider';
32+
import { _getClientPlatform } from './src/platform';
3133
import { RecaptchaVerifier } from './src/recaptcha_verifier';
3234

3335
const AUTH_TYPE = 'auth';
3436

3537
// Create auth components to register with firebase.
3638
// Provides Auth public APIs.
37-
function registerAuth(instance: _FirebaseNamespace): void {
39+
function registerAuthCompat(instance: _FirebaseNamespace): void {
3840
instance.INTERNAL.registerComponent(
3941
new Component(
4042
AUTH_TYPE,
4143
container => {
4244
// getImmediate for FirebaseApp will always succeed
4345
const app = container.getProvider('app').getImmediate();
44-
return new Auth(app);
46+
const auth = container.getProvider('auth-exp').getImmediate();
47+
return new Auth(app, auth as impl.AuthImpl);
4548
},
4649
ComponentType.PUBLIC
4750
)
@@ -63,7 +66,7 @@ function registerAuth(instance: _FirebaseNamespace): void {
6366
GoogleAuthProvider: impl.GoogleAuthProvider,
6467
OAuthProvider: impl.OAuthProvider,
6568
// SAMLAuthProvider,
66-
PhoneAuthProvider: impl.PhoneAuthProvider,
69+
PhoneAuthProvider,
6770
PhoneMultiFactorGenerator: impl.PhoneMultiFactorGenerator,
6871
RecaptchaVerifier,
6972
TwitterAuthProvider: impl.TwitterAuthProvider,
@@ -80,4 +83,5 @@ function registerAuth(instance: _FirebaseNamespace): void {
8083
instance.registerVersion('auth', version);
8184
}
8285

83-
registerAuth(firebase as _FirebaseNamespace);
86+
impl.registerAuth(_getClientPlatform());
87+
registerAuthCompat(firebase as _FirebaseNamespace);

packages-exp/auth-compat-exp/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"prepare": "yarn build"
2626
},
2727
"peerDependencies": {
28-
"@firebase/app": "0.x",
28+
"@firebase/app-compat": "0.x",
2929
"@firebase/app-types": "0.x"
3030
},
3131
"dependencies": {
@@ -38,7 +38,7 @@
3838
},
3939
"license": "Apache-2.0",
4040
"devDependencies": {
41-
"@firebase/app": "0.6.11",
41+
"@firebase/app-compat": "0.x",
4242
"rollup": "2.29.0",
4343
"rollup-plugin-json": "4.0.0",
4444
"rollup-plugin-replace": "2.2.0",

packages-exp/auth-compat-exp/rollup.config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ const es5Builds = [
7373
extend: true,
7474
name: 'firebase',
7575
globals: {
76-
'@firebase/app': 'firebase'
76+
'@firebase/app-compat': 'firebase'
7777
},
7878
/**
7979
* use iife to avoid below error in the old Safari browser
@@ -95,7 +95,7 @@ const es5Builds = [
9595
}`
9696
},
9797
plugins: [...es5BuildPlugins, uglify()],
98-
external: ['@firebase/app']
98+
external: ['@firebase/app-compat']
9999
}
100100
];
101101

0 commit comments

Comments
 (0)