Skip to content

Commit f1de10e

Browse files
authored
Expose additionalUserInfo in auth-exp and auth-compat-exp (#3595)
1 parent 3ff1898 commit f1de10e

File tree

5 files changed

+48
-44
lines changed

5 files changed

+48
-44
lines changed

packages-exp/auth-compat-exp/src/user_credential.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import * as compat from '@firebase/auth-types';
2020
import * as externs from '@firebase/auth-types-exp';
2121
import '@firebase/installations';
2222
import { User } from './user';
23-
import { FirebaseError } from '@firebase/util';
2423

2524
function credentialFromResponse(
2625
userCredential: impl.UserCredential
@@ -107,6 +106,9 @@ export async function convertCredential(
107106
return {
108107
operationType,
109108
credential: credentialFromResponse(credential as impl.UserCredential),
109+
additionalUserInfo: impl.getAdditionalUserInfo(
110+
credential as impl.UserCredential
111+
),
110112
user: user as User
111113
};
112114
}

packages-exp/auth-exp/src/core/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ export {
107107
} from './user/account_info';
108108
export { getIdToken, getIdTokenResult } from './user/id_token_result';
109109
export { unlink } from './user/link_unlink';
110+
export { getAdditionalUserInfo } from './user/additional_user_info';
110111

111112
// Non-optional user methods.
112113
export { reload } from './user/reload';

packages-exp/auth-exp/src/core/user/additional_user_info.ts

Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,21 @@
1414
* See the License for the specific language governing permissions and
1515
* limitations under the License.
1616
*/
17-
import {
18-
AdditionalUserInfo,
19-
UserProfile,
20-
ProviderId
21-
} from '@firebase/auth-types-exp';
17+
18+
import * as externs from '@firebase/auth-types-exp';
2219
import { IdTokenResponse, IdTokenResponseKind } from '../../model/id_token';
2320
import { _parseToken } from './id_token_result';
21+
import { UserCredential } from '../../model/user';
2422

2523
/**
2624
* Parse the `AdditionalUserInfo` from the ID token response.
2725
*/
2826
export function _fromIdTokenResponse(
29-
idTokenResponse: IdTokenResponse
30-
): AdditionalUserInfo | null {
27+
idTokenResponse?: IdTokenResponse
28+
): externs.AdditionalUserInfo | null {
29+
if (!idTokenResponse) {
30+
return null;
31+
}
3132
const { providerId } = idTokenResponse;
3233
const profile = idTokenResponse.rawUserInfo
3334
? JSON.parse(idTokenResponse.rawUserInfo)
@@ -41,8 +42,9 @@ export function _fromIdTokenResponse(
4142
];
4243
if (signInProvider) {
4344
const filteredProviderId =
44-
providerId !== ProviderId.ANONYMOUS && providerId !== ProviderId.CUSTOM
45-
? (signInProvider as ProviderId)
45+
providerId !== externs.ProviderId.ANONYMOUS &&
46+
providerId !== externs.ProviderId.CUSTOM
47+
? (signInProvider as externs.ProviderId)
4648
: null;
4749
// Uses generic class in accordance with the legacy SDK.
4850
return new GenericAdditionalUserInfo(isNewUser, filteredProviderId);
@@ -52,83 +54,82 @@ export function _fromIdTokenResponse(
5254
return null;
5355
}
5456
switch (providerId) {
55-
case ProviderId.FACEBOOK:
57+
case externs.ProviderId.FACEBOOK:
5658
return new FacebookAdditionalUserInfo(isNewUser, profile);
57-
case ProviderId.GITHUB:
59+
case externs.ProviderId.GITHUB:
5860
return new GithubAdditionalUserInfo(isNewUser, profile);
59-
case ProviderId.GOOGLE:
61+
case externs.ProviderId.GOOGLE:
6062
return new GoogleAdditionalUserInfo(isNewUser, profile);
61-
case ProviderId.TWITTER:
63+
case externs.ProviderId.TWITTER:
6264
return new TwitterAdditionalUserInfo(
6365
isNewUser,
6466
profile,
6567
idTokenResponse.screenName || null
6668
);
67-
case ProviderId.CUSTOM:
68-
case ProviderId.ANONYMOUS:
69+
case externs.ProviderId.CUSTOM:
70+
case externs.ProviderId.ANONYMOUS:
6971
return new GenericAdditionalUserInfo(isNewUser, null);
7072
default:
71-
return new FederatedAdditionalUserInfo(isNewUser, providerId, profile);
73+
return new GenericAdditionalUserInfo(isNewUser, providerId, profile);
7274
}
7375
}
7476

75-
class GenericAdditionalUserInfo implements AdditionalUserInfo {
77+
class GenericAdditionalUserInfo implements externs.AdditionalUserInfo {
7678
constructor(
7779
readonly isNewUser: boolean,
78-
readonly providerId: ProviderId | null
80+
readonly providerId: externs.ProviderId | null,
81+
readonly profile: externs.UserProfile = {}
7982
) {}
8083
}
8184

82-
class FederatedAdditionalUserInfo extends GenericAdditionalUserInfo {
85+
class FederatedAdditionalUserInfoWithUsername extends GenericAdditionalUserInfo {
8386
constructor(
8487
isNewUser: boolean,
85-
providerId: ProviderId,
86-
readonly profile: UserProfile
87-
) {
88-
super(isNewUser, providerId);
89-
}
90-
}
91-
92-
class FederatedAdditionalUserInfoWithUsername extends FederatedAdditionalUserInfo {
93-
constructor(
94-
isNewUser: boolean,
95-
providerId: ProviderId,
96-
profile: UserProfile,
88+
providerId: externs.ProviderId,
89+
profile: externs.UserProfile,
9790
readonly username: string | null
9891
) {
9992
super(isNewUser, providerId, profile);
10093
}
10194
}
10295

103-
class FacebookAdditionalUserInfo extends FederatedAdditionalUserInfo {
104-
constructor(isNewUser: boolean, profile: UserProfile) {
105-
super(isNewUser, ProviderId.FACEBOOK, profile);
96+
class FacebookAdditionalUserInfo extends GenericAdditionalUserInfo {
97+
constructor(isNewUser: boolean, profile: externs.UserProfile) {
98+
super(isNewUser, externs.ProviderId.FACEBOOK, profile);
10699
}
107100
}
108101

109102
class GithubAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {
110-
constructor(isNewUser: boolean, profile: UserProfile) {
103+
constructor(isNewUser: boolean, profile: externs.UserProfile) {
111104
super(
112105
isNewUser,
113-
ProviderId.GITHUB,
106+
externs.ProviderId.GITHUB,
114107
profile,
115108
typeof profile?.login === 'string' ? profile?.login : null
116109
);
117110
}
118111
}
119112

120-
class GoogleAdditionalUserInfo extends FederatedAdditionalUserInfo {
121-
constructor(isNewUser: boolean, profile: UserProfile) {
122-
super(isNewUser, ProviderId.GOOGLE, profile);
113+
class GoogleAdditionalUserInfo extends GenericAdditionalUserInfo {
114+
constructor(isNewUser: boolean, profile: externs.UserProfile) {
115+
super(isNewUser, externs.ProviderId.GOOGLE, profile);
123116
}
124117
}
125118

126119
class TwitterAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {
127120
constructor(
128121
isNewUser: boolean,
129-
profile: UserProfile,
122+
profile: externs.UserProfile,
130123
screenName: string | null
131124
) {
132-
super(isNewUser, ProviderId.TWITTER, profile, screenName);
125+
super(isNewUser, externs.ProviderId.TWITTER, profile, screenName);
133126
}
134127
}
128+
129+
export function getAdditionalUserInfo(
130+
userCredential: externs.UserCredential
131+
): externs.AdditionalUserInfo | null {
132+
return _fromIdTokenResponse(
133+
(userCredential as UserCredential)._tokenResponse
134+
);
135+
}

packages-exp/auth-types-exp/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ export interface UserMetadata {
474474
*/
475475
export interface AdditionalUserInfo {
476476
readonly isNewUser: boolean;
477-
readonly profile?: UserProfile;
477+
readonly profile: UserProfile | null;
478478
readonly providerId: ProviderId | null;
479479
readonly username?: string | null;
480480
}

packages/auth-types/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export type ActionCodeSettings = {
135135
export type AdditionalUserInfo = {
136136
isNewUser: boolean;
137137
profile: Object | null;
138-
providerId: string;
138+
providerId: string | null;
139139
username?: string | null;
140140
};
141141

0 commit comments

Comments
 (0)