firebase-admin-edge 1.0.25 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +45 -42
  2. package/dist/auth/auth-error-codes.d.ts +32 -0
  3. package/dist/auth/auth-error-codes.d.ts.map +1 -1
  4. package/dist/auth/auth-error-codes.js +32 -0
  5. package/dist/auth/auth-error-codes.js.map +1 -1
  6. package/dist/auth/email-action-request.d.ts +40 -0
  7. package/dist/auth/email-action-request.d.ts.map +1 -0
  8. package/dist/auth/email-action-request.js +80 -0
  9. package/dist/auth/email-action-request.js.map +1 -0
  10. package/dist/auth/email-action-request.test.d.ts +2 -0
  11. package/dist/auth/email-action-request.test.d.ts.map +1 -0
  12. package/dist/auth/email-action-request.test.js +128 -0
  13. package/dist/auth/email-action-request.test.js.map +1 -0
  14. package/dist/auth/firebase-admin-auth.d.ts +67 -9
  15. package/dist/auth/firebase-admin-auth.d.ts.map +1 -1
  16. package/dist/auth/firebase-admin-auth.js +491 -13
  17. package/dist/auth/firebase-admin-auth.js.map +1 -1
  18. package/dist/auth/firebase-admin-auth.test.js +1015 -6
  19. package/dist/auth/firebase-admin-auth.test.js.map +1 -1
  20. package/dist/auth/firebase-auth-endpoints.d.ts +84 -4
  21. package/dist/auth/firebase-auth-endpoints.d.ts.map +1 -1
  22. package/dist/auth/firebase-auth-endpoints.js +150 -8
  23. package/dist/auth/firebase-auth-endpoints.js.map +1 -1
  24. package/dist/auth/firebase-auth-endpoints.test.js +335 -3
  25. package/dist/auth/firebase-auth-endpoints.test.js.map +1 -1
  26. package/dist/auth/user-batch.d.ts +21 -0
  27. package/dist/auth/user-batch.d.ts.map +1 -0
  28. package/dist/auth/user-batch.js +49 -0
  29. package/dist/auth/user-batch.js.map +1 -0
  30. package/dist/auth/user-batch.test.d.ts +2 -0
  31. package/dist/auth/user-batch.test.d.ts.map +1 -0
  32. package/dist/auth/user-batch.test.js +73 -0
  33. package/dist/auth/user-batch.test.js.map +1 -0
  34. package/dist/auth/user-import.d.ts +55 -0
  35. package/dist/auth/user-import.d.ts.map +1 -0
  36. package/dist/auth/user-import.js +208 -0
  37. package/dist/auth/user-import.js.map +1 -0
  38. package/dist/auth/user-import.test.d.ts +2 -0
  39. package/dist/auth/user-import.test.d.ts.map +1 -0
  40. package/dist/auth/user-import.test.js +217 -0
  41. package/dist/auth/user-import.test.js.map +1 -0
  42. package/dist/auth/user-record.d.ts +69 -0
  43. package/dist/auth/user-record.d.ts.map +1 -0
  44. package/dist/auth/user-record.js +104 -0
  45. package/dist/auth/user-record.js.map +1 -0
  46. package/dist/auth/user-record.test.d.ts +2 -0
  47. package/dist/auth/user-record.test.d.ts.map +1 -0
  48. package/dist/auth/user-record.test.js +198 -0
  49. package/dist/auth/user-record.test.js.map +1 -0
  50. package/dist/auth/user-request.d.ts +98 -0
  51. package/dist/auth/user-request.d.ts.map +1 -0
  52. package/dist/auth/user-request.js +298 -0
  53. package/dist/auth/user-request.js.map +1 -0
  54. package/dist/auth/user-request.test.d.ts +2 -0
  55. package/dist/auth/user-request.test.d.ts.map +1 -0
  56. package/dist/auth/user-request.test.js +327 -0
  57. package/dist/auth/user-request.test.js.map +1 -0
  58. package/dist/firebase-edge-server.d.ts.map +1 -1
  59. package/dist/firebase-edge-server.js +6 -2
  60. package/dist/firebase-edge-server.js.map +1 -1
  61. package/dist/firebase-edge-server.test.js +29 -0
  62. package/dist/firebase-edge-server.test.js.map +1 -1
  63. package/package.json +1 -1
@@ -0,0 +1,69 @@
1
+ import type { UserInfo, UserMetadata } from './firebase-types.js';
2
+ import type { UserIdentifier } from './user-request.js';
3
+ export interface GetUsersResult {
4
+ users: UserRecord[];
5
+ notFound: UserIdentifier[];
6
+ }
7
+ /** Convert a batch lookup response and retain identifiers with no matching user. */
8
+ export declare function createGetUsersResult(identifiers: UserIdentifier[], response: ListUsersResponse): GetUsersResult;
9
+ type Serializable<T> = T & {
10
+ toJSON(): object;
11
+ };
12
+ export interface ListUsersResult {
13
+ users: UserRecord[];
14
+ pageToken?: string;
15
+ }
16
+ export interface UserRecord {
17
+ readonly uid: string;
18
+ readonly email?: string;
19
+ readonly emailVerified: boolean;
20
+ readonly displayName?: string;
21
+ readonly photoURL?: string;
22
+ readonly phoneNumber?: string;
23
+ readonly disabled: boolean;
24
+ readonly metadata: Serializable<UserMetadata>;
25
+ readonly providerData: Serializable<{
26
+ uid: string;
27
+ providerId: string;
28
+ email?: string;
29
+ displayName?: string;
30
+ photoURL?: string;
31
+ phoneNumber?: string;
32
+ }>[];
33
+ readonly passwordHash?: string;
34
+ readonly passwordSalt?: string;
35
+ readonly customClaims?: Record<string, any>;
36
+ readonly tokensValidAfterTime?: string;
37
+ readonly tenantId?: string;
38
+ readonly multiFactor?: Serializable<{
39
+ enrolledFactors: Serializable<{
40
+ uid: string;
41
+ displayName?: string;
42
+ factorId: string;
43
+ enrollmentTime?: string | null;
44
+ phoneNumber?: string;
45
+ totpInfo?: Record<string, unknown>;
46
+ }>[];
47
+ }>;
48
+ toJSON(): object;
49
+ }
50
+ export interface ListUsersResponse {
51
+ users?: (UserInfo & {
52
+ phoneNumber?: string;
53
+ passwordHash?: string;
54
+ salt?: string;
55
+ tenantId?: string;
56
+ mfaInfo?: {
57
+ mfaEnrollmentId: string;
58
+ displayName?: string;
59
+ enrolledAt?: string;
60
+ phoneInfo?: string;
61
+ totpInfo?: Record<string, unknown>;
62
+ }[];
63
+ })[];
64
+ nextPageToken?: string;
65
+ }
66
+ /** Convert the batchGet wire format to the Firebase Admin user record shape. */
67
+ export declare function createUserRecord(user: NonNullable<ListUsersResponse['users']>[number]): UserRecord;
68
+ export {};
69
+ //# sourceMappingURL=user-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-record.d.ts","sourceRoot":"","sources":["../../src/auth/user-record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /** Convert a batch lookup response and retain identifiers with no matching user. */
2
+ export function createGetUsersResult(identifiers, response) {
3
+ const users = (response.users ?? []).map(createUserRecord);
4
+ const notFound = identifiers.filter((id) => !users.some((user) => {
5
+ if ('uid' in id)
6
+ return id.uid === user.uid;
7
+ if ('email' in id)
8
+ return id.email === user.email;
9
+ if ('phoneNumber' in id)
10
+ return id.phoneNumber === user.phoneNumber;
11
+ return (user.providerData.find((provider) => provider.providerId === id.providerId)?.uid === id.providerUid);
12
+ }));
13
+ return { users, notFound };
14
+ }
15
+ /** Add SDK-style JSON snapshots without introducing Node.js dependencies. */
16
+ function withJSON(value) {
17
+ return Object.defineProperty(value, 'toJSON', {
18
+ value() {
19
+ // Non-enumerable methods are omitted, including on nested records.
20
+ return structuredClone(this);
21
+ }
22
+ });
23
+ }
24
+ function timestampToUTC(value) {
25
+ if (value === undefined)
26
+ return null;
27
+ const date = new Date(Number.parseInt(String(value), 10));
28
+ if (Number.isNaN(date.getTime()))
29
+ return null;
30
+ return date.toUTCString();
31
+ }
32
+ /** Convert the batchGet wire format to the Firebase Admin user record shape. */
33
+ export function createUserRecord(user) {
34
+ if (!user.localId)
35
+ throw new Error('Invalid user response: missing localId.');
36
+ const providerData = (user.providerUserInfo ?? []).map((provider) => {
37
+ if (!provider.rawId || !provider.providerId) {
38
+ throw new Error('Invalid provider response: missing user or provider ID.');
39
+ }
40
+ return withJSON({
41
+ uid: provider.rawId,
42
+ providerId: provider.providerId,
43
+ email: provider.email,
44
+ displayName: provider.displayName,
45
+ photoURL: provider.photoUrl,
46
+ phoneNumber: provider.phoneNumber
47
+ });
48
+ });
49
+ const enrolledFactors = [];
50
+ for (const factor of user.mfaInfo ?? []) {
51
+ if (!factor?.mfaEnrollmentId)
52
+ continue;
53
+ const isPhone = factor.phoneInfo !== undefined;
54
+ if (isPhone && !factor.phoneInfo)
55
+ continue;
56
+ if (!isPhone && !factor.totpInfo)
57
+ continue;
58
+ enrolledFactors.push(withJSON({
59
+ uid: factor.mfaEnrollmentId,
60
+ displayName: factor.displayName,
61
+ factorId: isPhone ? 'phone' : 'totp',
62
+ enrollmentTime: factor.enrolledAt
63
+ ? new Date(factor.enrolledAt).toUTCString()
64
+ : null,
65
+ ...(isPhone
66
+ ? { phoneNumber: factor.phoneInfo }
67
+ : { totpInfo: factor.totpInfo })
68
+ }));
69
+ }
70
+ return withJSON({
71
+ uid: user.localId,
72
+ email: user.email,
73
+ emailVerified: !!user.emailVerified,
74
+ displayName: user.displayName,
75
+ photoURL: user.photoUrl,
76
+ phoneNumber: user.phoneNumber,
77
+ disabled: user.disabled || false,
78
+ metadata: withJSON({
79
+ creationTime: timestampToUTC(user.createdAt),
80
+ lastSignInTime: timestampToUTC(user.lastLoginAt),
81
+ lastRefreshTime: user.lastRefreshAt
82
+ ? new Date(user.lastRefreshAt).toUTCString()
83
+ : null
84
+ }),
85
+ providerData,
86
+ passwordHash: user.passwordHash === 'UkVEQUNURUQ='
87
+ ? undefined
88
+ : user.passwordHash,
89
+ passwordSalt: user.salt,
90
+ ...(user.customAttributes && {
91
+ customClaims: JSON.parse(user.customAttributes)
92
+ }),
93
+ tokensValidAfterTime: user.validSince === undefined
94
+ ? undefined
95
+ : (timestampToUTC(Number.parseInt(user.validSince, 10) * 1000) ?? undefined),
96
+ tenantId: user.tenantId,
97
+ ...(enrolledFactors.length > 0 && {
98
+ multiFactor: withJSON({
99
+ enrolledFactors: Object.freeze(enrolledFactors)
100
+ })
101
+ })
102
+ });
103
+ }
104
+ //# sourceMappingURL=user-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-record.js","sourceRoot":"","sources":["../../src/auth/user-record.ts"],"names":[],"mappings":"AAQA,oFAAoF;AACpF,MAAM,UAAU,oBAAoB,CAChC,WAA6B,EAC7B,QAA2B;IAE3B,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAC/B,CAAC,EAAE,EAAE,EAAE,CACH,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACjB,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;QAC5C,IAAI,OAAO,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;QAClD,IAAI,aAAa,IAAI,EAAE;YACnB,OAAO,EAAE,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,CAAC;QAC/C,OAAO,CACH,IAAI,CAAC,YAAY,CAAC,IAAI,CAClB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,KAAK,EAAE,CAAC,UAAU,CACtD,EAAE,GAAG,KAAK,EAAE,CAAC,WAAW,CAC5B,CAAC;IACN,CAAC,CAAC,CACT,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC;AA6DD,6EAA6E;AAC7E,SAAS,QAAQ,CAAmB,KAAQ;IACxC,OAAO,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE;QAC1C,KAAK;YACD,mEAAmE;YACnE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;KACJ,CAAoB,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,KAAkC;IACtD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC9B,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAC5B,IAAqD;IAErD,IAAI,CAAC,IAAI,CAAC,OAAO;QACb,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAE/D,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChE,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACX,yDAAyD,CAC5D,CAAC;QACN,CAAC;QACD,OAAO,QAAQ,CAAC;YACZ,GAAG,EAAE,QAAQ,CAAC,KAAK;YACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;SACpC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,MAAM,eAAe,GAEE,EAAE,CAAC;IAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,eAAe;YAAE,SAAS;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC;QAC/C,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,SAAS;QAC3C,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,SAAS;QAC3C,eAAe,CAAC,IAAI,CAChB,QAAQ,CAAC;YACL,GAAG,EAAE,MAAM,CAAC,eAAe;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YACpC,cAAc,EAAE,MAAM,CAAC,UAAU;gBAC7B,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE;gBAC3C,CAAC,CAAC,IAAI;YACV,GAAG,CAAC,OAAO;gBACP,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE;gBACnC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;SACvC,CAAC,CACL,CAAC;IACN,CAAC;IAED,OAAO,QAAQ,CAAC;QACZ,GAAG,EAAE,IAAI,CAAC,OAAO;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;QAChC,QAAQ,EAAE,QAAQ,CAAC;YACf,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;YAC5C,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;YAChD,eAAe,EAAE,IAAI,CAAC,aAAa;gBAC/B,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE;gBAC5C,CAAC,CAAC,IAAI;SACb,CAAC;QACF,YAAY;QACZ,YAAY,EACR,IAAI,CAAC,YAAY,KAAK,cAAc;YAChC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,YAAY;QAC3B,YAAY,EAAE,IAAI,CAAC,IAAI;QACvB,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI;YACzB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;SAClD,CAAC;QACF,oBAAoB,EAChB,IAAI,CAAC,UAAU,KAAK,SAAS;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,cAAc,CACX,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAC9C,IAAI,SAAS,CAAC;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI;YAC9B,WAAW,EAAE,QAAQ,CAAC;gBAClB,eAAe,EAAE,MAAM,CAAC,MAAM,CAC1B,eAAe,CACQ;aAC9B,CAAC;SACL,CAAC;KACL,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=user-record.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-record.test.d.ts","sourceRoot":"","sources":["../../src/auth/user-record.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,198 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createUserRecord, createGetUsersResult } from './user-record.js';
3
+ describe('createGetUsersResult', () => {
4
+ it('matches primary identifiers and provider UIDs independently of result order', () => {
5
+ const missing = { uid: 'missing' };
6
+ const ids = [
7
+ { uid: 'one' },
8
+ { email: 'user@example.com' },
9
+ { phoneNumber: '+15555550100' },
10
+ { providerId: 'google.com', providerUid: 'external' },
11
+ missing
12
+ ];
13
+ const result = createGetUsersResult(ids, {
14
+ users: [
15
+ { localId: 'two', phoneNumber: '+15555550100' },
16
+ {
17
+ localId: 'one',
18
+ email: 'user@example.com',
19
+ providerUserInfo: [
20
+ { providerId: 'google.com', rawId: 'external' }
21
+ ]
22
+ }
23
+ ]
24
+ });
25
+ expect(result.users.map((user) => user.uid)).toEqual(['two', 'one']);
26
+ expect(result.notFound).toEqual([missing]);
27
+ expect(result.notFound[0]).toBe(missing);
28
+ expect(result.users[0]?.toJSON()).toMatchObject({ uid: 'two' });
29
+ });
30
+ it('keeps unmatched duplicates and does not match provider emails as primary emails', () => {
31
+ const ids = [
32
+ { email: 'linked@example.com' },
33
+ { uid: 'missing' },
34
+ { uid: 'missing' },
35
+ { providerId: 'github.com', providerUid: 'external' },
36
+ { providerId: 'google.com', providerUid: 'wrong' }
37
+ ];
38
+ const result = createGetUsersResult(ids, {
39
+ users: [
40
+ {
41
+ localId: 'one',
42
+ providerUserInfo: [
43
+ {
44
+ providerId: 'google.com',
45
+ rawId: 'external',
46
+ email: 'linked@example.com'
47
+ }
48
+ ]
49
+ }
50
+ ]
51
+ });
52
+ expect(result.notFound).toEqual(ids);
53
+ });
54
+ it('marks all identifiers missing when users are omitted', () => {
55
+ const ids = [{ uid: 'missing' }];
56
+ expect(createGetUsersResult(ids, {})).toEqual({
57
+ users: [],
58
+ notFound: ids
59
+ });
60
+ expect(createGetUsersResult([], {})).toEqual({
61
+ users: [],
62
+ notFound: []
63
+ });
64
+ });
65
+ it('does not duplicate a returned record for repeated identifiers', () => {
66
+ expect(createGetUsersResult([{ uid: 'one' }, { uid: 'one' }], {
67
+ users: [{ localId: 'one' }]
68
+ }).users).toHaveLength(1);
69
+ });
70
+ });
71
+ describe('createUserRecord', () => {
72
+ it('maps profile, metadata, providers, claims, password fields, and MFA', () => {
73
+ const user = createUserRecord({
74
+ localId: 'uid',
75
+ email: 'user@example.com',
76
+ emailVerified: true,
77
+ displayName: 'User',
78
+ photoUrl: 'https://example.com/photo',
79
+ phoneNumber: '+15555550100',
80
+ disabled: true,
81
+ createdAt: '1000',
82
+ lastLoginAt: '2000',
83
+ lastRefreshAt: '2025-01-01T00:00:00Z',
84
+ validSince: '3',
85
+ passwordHash: 'hash',
86
+ salt: 'salt',
87
+ customAttributes: '{"roles":["admin"]}',
88
+ tenantId: 'tenant',
89
+ providerUserInfo: [
90
+ {
91
+ rawId: 'provider-uid',
92
+ providerId: 'google.com',
93
+ photoUrl: 'https://example.com/provider'
94
+ }
95
+ ],
96
+ mfaInfo: [
97
+ {
98
+ mfaEnrollmentId: 'phone',
99
+ phoneInfo: '+15555550100',
100
+ enrolledAt: '2025-01-01T00:00:00Z',
101
+ displayName: 'Phone'
102
+ },
103
+ { mfaEnrollmentId: 'totp', totpInfo: {} },
104
+ { mfaEnrollmentId: 'unsupported' },
105
+ { mfaEnrollmentId: '', phoneInfo: '+15555550100' },
106
+ {
107
+ mfaEnrollmentId: 'invalid-date',
108
+ phoneInfo: '+15555550100',
109
+ enrolledAt: 'invalid'
110
+ }
111
+ ]
112
+ });
113
+ expect(user).toMatchObject({
114
+ uid: 'uid',
115
+ email: 'user@example.com',
116
+ emailVerified: true,
117
+ displayName: 'User',
118
+ photoURL: 'https://example.com/photo',
119
+ phoneNumber: '+15555550100',
120
+ disabled: true,
121
+ passwordHash: 'hash',
122
+ passwordSalt: 'salt',
123
+ tenantId: 'tenant',
124
+ customClaims: { roles: ['admin'] },
125
+ tokensValidAfterTime: 'Thu, 01 Jan 1970 00:00:03 GMT'
126
+ });
127
+ expect(user.metadata.toJSON()).toEqual({
128
+ creationTime: 'Thu, 01 Jan 1970 00:00:01 GMT',
129
+ lastSignInTime: 'Thu, 01 Jan 1970 00:00:02 GMT',
130
+ lastRefreshTime: 'Wed, 01 Jan 2025 00:00:00 GMT'
131
+ });
132
+ expect(user.providerData[0]?.toJSON()).toMatchObject({
133
+ uid: 'provider-uid',
134
+ providerId: 'google.com',
135
+ photoURL: 'https://example.com/provider'
136
+ });
137
+ expect(user.multiFactor?.enrolledFactors).toHaveLength(3);
138
+ expect(user.multiFactor?.enrolledFactors[0]?.toJSON()).toMatchObject({
139
+ uid: 'phone',
140
+ factorId: 'phone',
141
+ phoneNumber: '+15555550100',
142
+ enrollmentTime: 'Wed, 01 Jan 2025 00:00:00 GMT'
143
+ });
144
+ expect(user.multiFactor?.enrolledFactors[1]?.toJSON()).toMatchObject({
145
+ uid: 'totp',
146
+ factorId: 'totp',
147
+ totpInfo: {},
148
+ enrollmentTime: null
149
+ });
150
+ expect(user.multiFactor?.enrolledFactors[2]?.enrollmentTime).toBe('Invalid Date');
151
+ expect(user.multiFactor?.toJSON()).toEqual({
152
+ enrolledFactors: user.multiFactor?.enrolledFactors.map((factor) => factor.toJSON())
153
+ });
154
+ const json = user.toJSON();
155
+ expect(json).not.toHaveProperty('toJSON');
156
+ expect(json.metadata).not.toHaveProperty('toJSON');
157
+ json.customClaims.roles.push('editor');
158
+ expect(user.customClaims?.roles).toEqual(['admin']);
159
+ expect(JSON.parse(JSON.stringify(user))).toMatchObject({
160
+ uid: 'uid',
161
+ providerData: [{ uid: 'provider-uid' }]
162
+ });
163
+ });
164
+ it('normalizes missing and invalid dates and hides redacted password hashes', () => {
165
+ const user = createUserRecord({
166
+ localId: 'uid',
167
+ createdAt: 'invalid',
168
+ validSince: 'invalid',
169
+ passwordHash: 'UkVEQUNURUQ='
170
+ });
171
+ expect(user.metadata.toJSON()).toEqual({
172
+ creationTime: null,
173
+ lastSignInTime: null,
174
+ lastRefreshTime: null
175
+ });
176
+ expect(user.tokensValidAfterTime).toBeUndefined();
177
+ expect(user.passwordHash).toBeUndefined();
178
+ expect(user).not.toHaveProperty('multiFactor');
179
+ expect(user.providerData).toEqual([]);
180
+ });
181
+ it('preserves empty password hash and salt for imported accounts', () => {
182
+ const user = createUserRecord({
183
+ localId: 'uid',
184
+ passwordHash: '',
185
+ salt: ''
186
+ });
187
+ expect(user.passwordHash).toBe('');
188
+ expect(user.passwordSalt).toBe('');
189
+ });
190
+ it.each([
191
+ { localId: '' },
192
+ { localId: 'uid', providerUserInfo: [{ providerId: 'google.com' }] },
193
+ { localId: 'uid', providerUserInfo: [{ rawId: 'provider-uid' }] }
194
+ ])('rejects malformed user/provider records', (user) => {
195
+ expect(() => createUserRecord(user)).toThrow();
196
+ });
197
+ });
198
+ //# sourceMappingURL=user-record.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-record.test.js","sourceRoot":"","sources":["../../src/auth/user-record.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { FirebaseEdgeError } from './errors.js';
2
+ import type { UpdateAccountRequest } from './firebase-types.js';
3
+ /** Serialize stored claims; null clears them. Shared by updates and imports. */
4
+ export declare function buildCustomClaimsRequest(claims: object | null): {
5
+ data: {
6
+ customAttributes: string;
7
+ };
8
+ error: null;
9
+ } | {
10
+ data: null;
11
+ error: FirebaseEdgeError;
12
+ };
13
+ export interface UidIdentifier {
14
+ uid: string;
15
+ }
16
+ export interface EmailIdentifier {
17
+ email: string;
18
+ }
19
+ export interface PhoneIdentifier {
20
+ phoneNumber: string;
21
+ }
22
+ export interface ProviderIdentifier {
23
+ providerId: string;
24
+ providerUid: string;
25
+ }
26
+ export type UserIdentifier = UidIdentifier | EmailIdentifier | PhoneIdentifier | ProviderIdentifier;
27
+ export interface UsersLookupRequest {
28
+ localId?: string[];
29
+ email?: string[];
30
+ phoneNumber?: string[];
31
+ federatedUserId?: {
32
+ providerId: string;
33
+ rawId: string;
34
+ }[];
35
+ }
36
+ /** Validate a batch and group its identifiers for the accounts lookup endpoint. */
37
+ export declare function buildUsersLookupRequest(identifiers: UserIdentifier[]): {
38
+ data: UsersLookupRequest;
39
+ error: null;
40
+ } | {
41
+ data: null;
42
+ error: FirebaseEdgeError;
43
+ };
44
+ export interface CreatePhoneMultiFactorInfoRequest {
45
+ factorId: string;
46
+ phoneNumber: string;
47
+ displayName?: string;
48
+ }
49
+ export interface UpdatePhoneMultiFactorInfoRequest extends CreatePhoneMultiFactorInfoRequest {
50
+ uid?: string;
51
+ enrollmentTime?: string;
52
+ }
53
+ export interface UserProvider {
54
+ uid?: string;
55
+ providerId?: string;
56
+ displayName?: string;
57
+ email?: string;
58
+ phoneNumber?: string;
59
+ photoURL?: string;
60
+ }
61
+ export interface CreateRequest {
62
+ uid?: string;
63
+ email?: string;
64
+ emailVerified?: boolean;
65
+ password?: string;
66
+ displayName?: string;
67
+ photoURL?: string;
68
+ phoneNumber?: string;
69
+ disabled?: boolean;
70
+ multiFactor?: {
71
+ enrolledFactors: CreatePhoneMultiFactorInfoRequest[];
72
+ };
73
+ }
74
+ export interface UpdateRequest {
75
+ email?: string;
76
+ emailVerified?: boolean;
77
+ password?: string;
78
+ displayName?: string | null;
79
+ photoURL?: string | null;
80
+ phoneNumber?: string | null;
81
+ disabled?: boolean;
82
+ multiFactor?: {
83
+ enrolledFactors: UpdatePhoneMultiFactorInfoRequest[] | null;
84
+ };
85
+ providerToLink?: UserProvider;
86
+ providersToUnlink?: string[];
87
+ }
88
+ /** Validate a UID before any credential or API requests. */
89
+ export declare function validateUserUid(uid: string): FirebaseEdgeError | null;
90
+ /** Validate SDK properties and translate them into the admin API wire format. */
91
+ export declare function buildUserRequest(properties: CreateRequest | UpdateRequest, operation: 'create' | 'update'): {
92
+ data: UpdateAccountRequest;
93
+ error: null;
94
+ } | {
95
+ data: null;
96
+ error: FirebaseEdgeError;
97
+ };
98
+ //# sourceMappingURL=user-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-request.d.ts","sourceRoot":"","sources":["../../src/auth/user-request.ts"],"names":[],"mappings":"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"}