firebase-admin-edge 2.0.0 → 3.0.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.
- package/README.md +2 -0
- package/dist/app-check/app-check.d.ts +7 -2
- package/dist/app-check/app-check.d.ts.map +1 -1
- package/dist/app-check/app-check.js +6 -5
- package/dist/app-check/app-check.js.map +1 -1
- package/dist/auth/firebase-admin-auth.d.ts +38 -7
- package/dist/auth/firebase-admin-auth.d.ts.map +1 -1
- package/dist/auth/firebase-admin-auth.js +161 -11
- package/dist/auth/firebase-admin-auth.js.map +1 -1
- package/dist/auth/firebase-auth-endpoints.d.ts +37 -0
- package/dist/auth/firebase-auth-endpoints.d.ts.map +1 -1
- package/dist/auth/firebase-auth-endpoints.js +100 -0
- package/dist/auth/firebase-auth-endpoints.js.map +1 -1
- package/dist/auth/firebase-auth.d.ts +6 -4
- package/dist/auth/firebase-auth.d.ts.map +1 -1
- package/dist/auth/firebase-auth.js +5 -5
- package/dist/auth/firebase-auth.js.map +1 -1
- package/dist/auth/identity-builder-types.d.ts +36 -0
- package/dist/auth/identity-builder-types.d.ts.map +1 -0
- package/dist/auth/identity-builder-types.js +2 -0
- package/dist/auth/identity-builder-types.js.map +1 -0
- package/dist/auth/identity-count-query.d.ts +17 -0
- package/dist/auth/identity-count-query.d.ts.map +1 -0
- package/dist/auth/identity-count-query.js +51 -0
- package/dist/auth/identity-count-query.js.map +1 -0
- package/dist/auth/identity-filter.d.ts +9 -0
- package/dist/auth/identity-filter.d.ts.map +1 -0
- package/dist/auth/identity-filter.js +129 -0
- package/dist/auth/identity-filter.js.map +1 -0
- package/dist/auth/identity-query.d.ts +11 -0
- package/dist/auth/identity-query.d.ts.map +1 -0
- package/dist/auth/identity-query.js +122 -0
- package/dist/auth/identity-query.js.map +1 -0
- package/dist/auth/identity-reference.d.ts +150 -0
- package/dist/auth/identity-reference.d.ts.map +1 -0
- package/dist/auth/identity-reference.js +322 -0
- package/dist/auth/identity-reference.js.map +1 -0
- package/dist/auth/identity-types.d.ts +44 -0
- package/dist/auth/identity-types.d.ts.map +1 -0
- package/dist/auth/identity-types.js +2 -0
- package/dist/auth/identity-types.js.map +1 -0
- package/dist/auth/identity-write.d.ts +41 -0
- package/dist/auth/identity-write.d.ts.map +1 -0
- package/dist/auth/identity-write.js +146 -0
- package/dist/auth/identity-write.js.map +1 -0
- package/dist/auth/identity.d.ts +84 -0
- package/dist/auth/identity.d.ts.map +1 -0
- package/dist/auth/identity.js +319 -0
- package/dist/auth/identity.js.map +1 -0
- package/dist/auth/user-import.d.ts +7 -1
- package/dist/auth/user-import.d.ts.map +1 -1
- package/dist/auth/user-import.js +53 -15
- package/dist/auth/user-import.js.map +1 -1
- package/dist/auth/user-record.d.ts +1 -0
- package/dist/auth/user-record.d.ts.map +1 -1
- package/dist/auth/user-record.js +5 -0
- package/dist/auth/user-record.js.map +1 -1
- package/dist/auth/user-request.d.ts +4 -1
- package/dist/auth/user-request.d.ts.map +1 -1
- package/dist/auth/user-request.js +7 -4
- package/dist/auth/user-request.js.map +1 -1
- package/dist/db/firestore.d.ts +7 -1
- package/dist/db/firestore.d.ts.map +1 -1
- package/dist/db/firestore.js +16 -8
- package/dist/db/firestore.js.map +1 -1
- package/dist/firebase-edge-server.d.ts +2 -0
- package/dist/firebase-edge-server.d.ts.map +1 -1
- package/dist/firebase-edge-server.js +37 -5
- package/dist/firebase-edge-server.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/storage.d.ts +10 -3
- package/dist/storage/storage.d.ts.map +1 -1
- package/dist/storage/storage.js +17 -4
- package/dist/storage/storage.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { buildUsersLookupRequest, buildCustomClaimsRequest } from './user-request.js';
|
|
2
|
+
import { ensureError, FirebaseEdgeError } from './errors.js';
|
|
3
|
+
/** Exact lookup with no query modifiers or count operation. */
|
|
4
|
+
export class IdentityReference {
|
|
5
|
+
auth;
|
|
6
|
+
identifier;
|
|
7
|
+
multiple;
|
|
8
|
+
uidReference;
|
|
9
|
+
claimsResource;
|
|
10
|
+
metadataResource;
|
|
11
|
+
constructor(auth, identifier, options = {}) {
|
|
12
|
+
this.auth = auth;
|
|
13
|
+
if (!options ||
|
|
14
|
+
typeof options !== 'object' ||
|
|
15
|
+
Array.isArray(options) ||
|
|
16
|
+
(options.multiple !== undefined &&
|
|
17
|
+
typeof options.multiple !== 'boolean') ||
|
|
18
|
+
(options.uidReference !== undefined &&
|
|
19
|
+
typeof options.uidReference !== 'boolean')) {
|
|
20
|
+
throw new FirebaseEdgeError({
|
|
21
|
+
code: 'auth/invalid-argument',
|
|
22
|
+
message: 'IdentityReference options must be an object with boolean multiple and uidReference settings.'
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const { error } = buildUsersLookupRequest([identifier]);
|
|
26
|
+
if (error) {
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
this.identifier = { ...identifier };
|
|
30
|
+
this.multiple = options.multiple ?? false;
|
|
31
|
+
this.uidReference = options.uidReference ?? false;
|
|
32
|
+
}
|
|
33
|
+
update(data) {
|
|
34
|
+
const uid = this.requireUid();
|
|
35
|
+
return this.auth._writeIdentityUser(uid, data);
|
|
36
|
+
}
|
|
37
|
+
set(data) {
|
|
38
|
+
const uid = this.requireUid();
|
|
39
|
+
return this.auth._writeIdentityUser(uid, data, 'set');
|
|
40
|
+
}
|
|
41
|
+
/** Disable sign-in for this user. */
|
|
42
|
+
disable() {
|
|
43
|
+
return this.update({ disabled: true });
|
|
44
|
+
}
|
|
45
|
+
/** Enable sign-in for this user. */
|
|
46
|
+
enable() {
|
|
47
|
+
return this.update({ disabled: false });
|
|
48
|
+
}
|
|
49
|
+
/** Ask Firebase to send a password-reset email to this user. */
|
|
50
|
+
resetPassword(settings) {
|
|
51
|
+
const uid = this.requireUid();
|
|
52
|
+
return this.sendPasswordResetEmail(uid, settings);
|
|
53
|
+
}
|
|
54
|
+
async sendPasswordResetEmail(uid, settings) {
|
|
55
|
+
const { error, data } = await readIdentityUser(this.auth, uid);
|
|
56
|
+
if (error) {
|
|
57
|
+
return { error, data: null };
|
|
58
|
+
}
|
|
59
|
+
if (!data.email) {
|
|
60
|
+
return {
|
|
61
|
+
error: new FirebaseEdgeError({
|
|
62
|
+
code: 'auth/invalid-email',
|
|
63
|
+
message: 'Password reset requires a user with an email address.'
|
|
64
|
+
}),
|
|
65
|
+
data: null
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return identityWriteResult(uid, this.auth._sendPasswordResetEmail(data.email, settings));
|
|
69
|
+
}
|
|
70
|
+
/** Custom-claims operations for a UID reference; accessing this performs no I/O. */
|
|
71
|
+
get claims() {
|
|
72
|
+
const uid = this.requireUid();
|
|
73
|
+
this.claimsResource ??= new IdentityClaims(this.auth, uid);
|
|
74
|
+
return this.claimsResource;
|
|
75
|
+
}
|
|
76
|
+
/** Writable timestamps for a UID reference; accessing this performs no I/O. */
|
|
77
|
+
get metadata() {
|
|
78
|
+
const uid = this.requireUid();
|
|
79
|
+
this.metadataResource ??= new IdentityMetadata(this.auth, uid);
|
|
80
|
+
return this.metadataResource;
|
|
81
|
+
}
|
|
82
|
+
delete() {
|
|
83
|
+
const uid = this.requireUid();
|
|
84
|
+
return identityWriteResult(uid, this.auth.deleteUser(uid));
|
|
85
|
+
}
|
|
86
|
+
requireUid() {
|
|
87
|
+
if (this.multiple ||
|
|
88
|
+
!this.uidReference ||
|
|
89
|
+
!('uid' in this.identifier)) {
|
|
90
|
+
throw new FirebaseEdgeError({
|
|
91
|
+
code: 'auth/invalid-argument',
|
|
92
|
+
message: 'This mutation requires a UID reference.'
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return this.identifier.uid;
|
|
96
|
+
}
|
|
97
|
+
/** Check whether an exact single-user lookup matches an account. */
|
|
98
|
+
async exists() {
|
|
99
|
+
if (this.multiple) {
|
|
100
|
+
return {
|
|
101
|
+
error: new FirebaseEdgeError({
|
|
102
|
+
code: 'auth/invalid-argument',
|
|
103
|
+
message: 'exists requires a single-user lookup.'
|
|
104
|
+
}),
|
|
105
|
+
data: null
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const { error, data } = await this.get();
|
|
109
|
+
if (error) {
|
|
110
|
+
return { error, data: null };
|
|
111
|
+
}
|
|
112
|
+
return { error: null, data: data !== null };
|
|
113
|
+
}
|
|
114
|
+
async get() {
|
|
115
|
+
try {
|
|
116
|
+
const { error, data } = await this.auth.getUsers([this.identifier]);
|
|
117
|
+
if (error) {
|
|
118
|
+
return { error, data: null };
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
error: null,
|
|
122
|
+
data: (this.multiple
|
|
123
|
+
? data.users
|
|
124
|
+
: (data.users[0] ?? null))
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch (cause) {
|
|
128
|
+
return { error: ensureError(cause), data: null };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Update explicitly supplied account timestamps. Access through user.metadata. */
|
|
133
|
+
class IdentityMetadata {
|
|
134
|
+
auth;
|
|
135
|
+
uid;
|
|
136
|
+
constructor(auth, uid) {
|
|
137
|
+
this.auth = auth;
|
|
138
|
+
this.uid = uid;
|
|
139
|
+
}
|
|
140
|
+
update(metadata) {
|
|
141
|
+
return this.auth._writeIdentityUser(this.uid, metadata, 'metadata');
|
|
142
|
+
}
|
|
143
|
+
async get() {
|
|
144
|
+
const { error, data } = await readIdentityUser(this.auth, this.uid);
|
|
145
|
+
if (error) {
|
|
146
|
+
return { error, data: null };
|
|
147
|
+
}
|
|
148
|
+
return { error: null, data: data.metadata };
|
|
149
|
+
}
|
|
150
|
+
revokeTokens() {
|
|
151
|
+
return identityWriteResult(this.uid, this.auth.revokeRefreshTokens(this.uid));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** Claims stored on one existing UID. Access through user.claims. */
|
|
155
|
+
class IdentityClaims {
|
|
156
|
+
auth;
|
|
157
|
+
uid;
|
|
158
|
+
constructor(auth, uid) {
|
|
159
|
+
this.auth = auth;
|
|
160
|
+
this.uid = uid;
|
|
161
|
+
}
|
|
162
|
+
/** Replace all custom claims; null clears them. No read is required. */
|
|
163
|
+
set(claims) {
|
|
164
|
+
return identityWriteResult(this.uid, this.auth.setCustomUserClaims(this.uid, claims));
|
|
165
|
+
}
|
|
166
|
+
async get() {
|
|
167
|
+
const { error, data } = await readIdentityUser(this.auth, this.uid);
|
|
168
|
+
if (error) {
|
|
169
|
+
return { error, data: null };
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
error: null,
|
|
173
|
+
data: (data.customClaims ?? {})
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/** Select one literal top-level claim key, not a dotted path. */
|
|
177
|
+
byKey(key) {
|
|
178
|
+
if (typeof key !== 'string' || key.length === 0) {
|
|
179
|
+
throw new FirebaseEdgeError({
|
|
180
|
+
code: 'auth/invalid-argument',
|
|
181
|
+
message: 'A claim key must be a nonempty string.'
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
const { error } = buildCustomClaimsRequest({ [key]: null });
|
|
185
|
+
if (error) {
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
return new IdentityClaimKey(this, key);
|
|
189
|
+
}
|
|
190
|
+
/** Shallow-merge claims using a non-atomic read followed by a write. */
|
|
191
|
+
async update(claims) {
|
|
192
|
+
if (claims === null) {
|
|
193
|
+
return {
|
|
194
|
+
data: null,
|
|
195
|
+
error: new FirebaseEdgeError({
|
|
196
|
+
code: 'auth/invalid-argument',
|
|
197
|
+
message: 'claims.update requires an object; use claims.delete() to clear claims.'
|
|
198
|
+
})
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
const { error, data } = buildCustomClaimsRequest(claims);
|
|
202
|
+
if (error) {
|
|
203
|
+
return { data: null, error };
|
|
204
|
+
}
|
|
205
|
+
// Snapshot the patch before the read so caller mutations cannot change it.
|
|
206
|
+
const patch = JSON.parse(data.customAttributes);
|
|
207
|
+
try {
|
|
208
|
+
const { error: readError, data: claims } = await this.get();
|
|
209
|
+
if (readError) {
|
|
210
|
+
return { data: null, error: readError };
|
|
211
|
+
}
|
|
212
|
+
return await this.set({ ...claims, ...patch });
|
|
213
|
+
}
|
|
214
|
+
catch (cause) {
|
|
215
|
+
return { data: null, error: ensureError(cause) };
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/** Clear all custom claims without deleting the user. */
|
|
219
|
+
delete() {
|
|
220
|
+
return this.set(null);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/** One claim value. Updates and deletion preserve other top-level claims. */
|
|
224
|
+
class IdentityClaimKey {
|
|
225
|
+
claims;
|
|
226
|
+
key;
|
|
227
|
+
constructor(claims, key) {
|
|
228
|
+
this.claims = claims;
|
|
229
|
+
this.key = key;
|
|
230
|
+
}
|
|
231
|
+
/** Set or replace this key's value while preserving the other claims. */
|
|
232
|
+
set(value) {
|
|
233
|
+
return this.update(value);
|
|
234
|
+
}
|
|
235
|
+
/** Read one own claim value; an absent key returns undefined. */
|
|
236
|
+
async get() {
|
|
237
|
+
const { error, data } = await this.claims.get();
|
|
238
|
+
if (error) {
|
|
239
|
+
return { error, data: null };
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
error: null,
|
|
243
|
+
data: Object.hasOwn(data, this.key) ? data[this.key] : undefined
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
async update(value) {
|
|
247
|
+
if (value === undefined ||
|
|
248
|
+
typeof value === 'function' ||
|
|
249
|
+
typeof value === 'symbol') {
|
|
250
|
+
return {
|
|
251
|
+
data: null,
|
|
252
|
+
error: new FirebaseEdgeError({
|
|
253
|
+
code: 'auth/invalid-argument',
|
|
254
|
+
message: 'A claim value must be JSON-serializable. Use delete() to remove the field.'
|
|
255
|
+
})
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
const { error, data } = buildCustomClaimsRequest({
|
|
259
|
+
[this.key]: value
|
|
260
|
+
});
|
|
261
|
+
if (error) {
|
|
262
|
+
return { error, data: null };
|
|
263
|
+
}
|
|
264
|
+
const patch = JSON.parse(data.customAttributes);
|
|
265
|
+
if (!Object.hasOwn(patch, this.key)) {
|
|
266
|
+
return {
|
|
267
|
+
data: null,
|
|
268
|
+
error: new FirebaseEdgeError({
|
|
269
|
+
code: 'auth/invalid-argument',
|
|
270
|
+
message: 'The claim value was omitted during JSON serialization.'
|
|
271
|
+
})
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
return this.claims.update(patch);
|
|
275
|
+
}
|
|
276
|
+
async delete() {
|
|
277
|
+
const { error, data } = await this.claims.get();
|
|
278
|
+
if (error) {
|
|
279
|
+
return { error, data: null };
|
|
280
|
+
}
|
|
281
|
+
const remaining = { ...data };
|
|
282
|
+
delete remaining[this.key];
|
|
283
|
+
return this.claims.set(remaining);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/** Read one existing account for a UID reference operation. */
|
|
287
|
+
async function readIdentityUser(auth, uid) {
|
|
288
|
+
try {
|
|
289
|
+
const { error, data } = await auth.getUsers([{ uid }]);
|
|
290
|
+
if (error) {
|
|
291
|
+
return { error, data: null };
|
|
292
|
+
}
|
|
293
|
+
const user = data.users[0];
|
|
294
|
+
if (!user) {
|
|
295
|
+
return {
|
|
296
|
+
data: null,
|
|
297
|
+
error: new FirebaseEdgeError({
|
|
298
|
+
code: 'auth/user-not-found',
|
|
299
|
+
message: 'The requested user does not exist.'
|
|
300
|
+
})
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
return { error: null, data: user };
|
|
304
|
+
}
|
|
305
|
+
catch (cause) {
|
|
306
|
+
return { data: null, error: ensureError(cause) };
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/** Normalize successful single-user writes without reading the account back. */
|
|
310
|
+
async function identityWriteResult(uid, operation) {
|
|
311
|
+
try {
|
|
312
|
+
const { error } = await operation;
|
|
313
|
+
if (error) {
|
|
314
|
+
return { error, data: null };
|
|
315
|
+
}
|
|
316
|
+
return { error: null, data: { uid } };
|
|
317
|
+
}
|
|
318
|
+
catch (cause) {
|
|
319
|
+
return { error: ensureError(cause), data: null };
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=identity-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-reference.js","sourceRoot":"","sources":["../../src/auth/identity-reference.ts"],"names":[],"mappings":"AAUA,OAAO,EACH,uBAAuB,EACvB,wBAAwB,EAE3B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAsB7D,+DAA+D;AAC/D,MAAM,OAAO,iBAAiB;IAYL;IAPJ,UAAU,CAAiB;IAC3B,QAAQ,CAAW;IACnB,YAAY,CAAM;IAC3B,cAAc,CAA0B;IACxC,gBAAgB,CAAoB;IAE5C,YACqB,IAAuB,EACxC,UAA0B,EAC1B,UAAmD,EAAE;QAFpC,SAAI,GAAJ,IAAI,CAAmB;QAIxC,IACI,CAAC,OAAO;YACR,OAAO,OAAO,KAAK,QAAQ;YAC3B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACtB,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS;gBAC3B,OAAO,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC;YAC1C,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS;gBAC/B,OAAO,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,EAChD,CAAC;YACC,MAAM,IAAI,iBAAiB,CAAC;gBACxB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EACH,8FAA8F;aACrG,CAAC,CAAC;QACP,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,uBAAuB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACxD,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,KAAK,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAK,KAAkB,CAAC;QACxD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAK,KAAa,CAAC;IAC/D,CAAC;IAED,MAAM,CAEF,IAAgC;QAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,GAAG,CAEC,IAA6B;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,qCAAqC;IACrC,OAAO;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,oCAAoC;IACpC,MAAM;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,gEAAgE;IAChE,aAAa,CAET,QAA6B;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAChC,GAAW,EACX,QAA6B;QAE7B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACd,OAAO;gBACH,KAAK,EAAE,IAAI,iBAAiB,CAAC;oBACzB,IAAI,EAAE,oBAAoB;oBAC1B,OAAO,EACH,uDAAuD;iBAC9D,CAAC;gBACF,IAAI,EAAE,IAAI;aACb,CAAC;QACN,CAAC;QAED,OAAO,mBAAmB,CACtB,GAAG,EACH,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAC1D,CAAC;IACN,CAAC;IAED,oFAAoF;IACpF,IAAI,MAAM;QAKN,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,KAAK,IAAI,cAAc,CAAS,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,cAID,CAAC;IAChB,CAAC;IAED,+EAA+E;IAC/E,IAAI,QAAQ;QAKR,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,gBAAgB,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,gBAID,CAAC;IAChB,CAAC;IAED,MAAM;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,OAAO,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,UAAU;QACd,IACI,IAAI,CAAC,QAAQ;YACb,CAAC,IAAI,CAAC,YAAY;YAClB,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,EAC7B,CAAC;YACC,MAAM,IAAI,iBAAiB,CAAC;gBACxB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,yCAAyC;aACrD,CAAC,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;IAC/B,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,MAAM;QAGR,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;gBACH,KAAK,EAAE,IAAI,iBAAiB,CAAC;oBACzB,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,uCAAuC;iBACnD,CAAC;gBACF,IAAI,EAAE,IAAI;aACb,CAAC;QACN,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAG;QASL,IAAI,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACpE,IAAI,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACjC,CAAC;YACD,OAAO;gBACH,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ;oBAChB,CAAC,CAAC,IAAI,CAAC,KAAK;oBACZ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAEU;aAC1C,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACrD,CAAC;IACL,CAAC;CACJ;AAED,mFAAmF;AACnF,MAAM,gBAAgB;IAEG;IACA;IAFrB,YACqB,IAAuB,EACvB,GAAW;QADX,SAAI,GAAJ,IAAI,CAAmB;QACvB,QAAG,GAAH,GAAG,CAAQ;IAC7B,CAAC;IAEJ,MAAM,CAAC,QAA6B;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,GAAG;QACL,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAChD,CAAC;IAED,YAAY;QACR,OAAO,mBAAmB,CACtB,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAC1C,CAAC;IACN,CAAC;CACJ;AAED,qEAAqE;AACrE,MAAM,cAAc;IAEK;IACA;IAFrB,YACqB,IAAuB,EACvB,GAAW;QADX,SAAI,GAAJ,IAAI,CAAmB;QACvB,QAAG,GAAH,GAAG,CAAQ;IAC7B,CAAC;IAEJ,wEAAwE;IACxE,GAAG,CAAC,MAA8B;QAC9B,OAAO,mBAAmB,CACtB,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAClD,CAAC;IACN,CAAC;IAED,KAAK,CAAC,GAAG;QACL,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,OAAO;YACH,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAoB;SACrD,CAAC;IACN,CAAC;IAED,iEAAiE;IACjE,KAAK,CAA4C,GAAQ;QACrD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,iBAAiB,CAAC;gBACxB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,wCAAwC;aACpD,CAAC,CAAC;QACP,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,wBAAwB,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,KAAK,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,gBAAgB,CAAc,IAAI,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,MAAM,CAAC,MAAuB;QAChC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO;gBACH,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI,iBAAiB,CAAC;oBACzB,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EACH,wEAAwE;iBAC/E,CAAC;aACL,CAAC;QACN,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACjC,CAAC;QACD,2EAA2E;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAG7C,CAAC;QACF,IAAI,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5D,IAAI,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC5C,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,CAAC;IACL,CAAC;IAED,yDAAyD;IACzD,MAAM;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACJ;AAED,6EAA6E;AAC7E,MAAM,gBAAgB;IAKG;IACA;IAFrB,YACqB,MAA8B,EAC9B,GAAQ;QADR,WAAM,GAAN,MAAM,CAAwB;QAC9B,QAAG,GAAH,GAAG,CAAK;IAC1B,CAAC;IAEJ,yEAAyE;IACzE,GAAG,CAAC,KAAsC;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,GAAG;QAIL,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,OAAO;YACH,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;SACnE,CAAC;IACN,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAsC;QAC/C,IACI,KAAK,KAAK,SAAS;YACnB,OAAO,KAAK,KAAK,UAAU;YAC3B,OAAO,KAAK,KAAK,QAAQ,EAC3B,CAAC;YACC,OAAO;gBACH,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI,iBAAiB,CAAC;oBACzB,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EACH,4EAA4E;iBACnF,CAAC;aACL,CAAC;QACN,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,wBAAwB,CAAC;YAC7C,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAG7C,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO;gBACH,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI,iBAAiB,CAAC;oBACzB,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EACH,wDAAwD;iBAC/D,CAAC;aACL,CAAC;QACN,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAwB,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,MAAM;QACR,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;CACJ;AAED,+DAA+D;AAC/D,KAAK,UAAU,gBAAgB,CAC3B,IAAuB,EACvB,GAAW;IAEX,IAAI,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO;gBACH,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI,iBAAiB,CAAC;oBACzB,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,oCAAoC;iBAChD,CAAC;aACL,CAAC;QACN,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,KAAK,UAAU,mBAAmB,CAC9B,GAAW,EACX,SAA2C;IAE3C,IAAI,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ProviderIdentifier, UserIdentifier } from './user-request.js';
|
|
2
|
+
import type { IdentityUserRecord } from './identity-reference.js';
|
|
3
|
+
export type IdentityFilterField = IdentityStringFilterField | 'provider';
|
|
4
|
+
export type IdentityStringFilterField = 'uid' | 'email' | 'phoneNumber' | 'initialEmail';
|
|
5
|
+
export type IdentityOrderField = 'uid' | 'displayName' | 'createdAt' | 'lastLoginAt' | 'email';
|
|
6
|
+
export type IdentityDirection = 'asc' | 'desc';
|
|
7
|
+
/** One exact identity, never an implicit conjunction of several identifiers. */
|
|
8
|
+
export type IdentityIdentifier = {
|
|
9
|
+
[K in IdentityStringFilterField]: Record<K, string> & Partial<Record<Exclude<IdentityStringFilterField, K> | 'providerId' | 'providerUid', never>>;
|
|
10
|
+
}[IdentityStringFilterField] | (ProviderIdentifier & Partial<Record<IdentityStringFilterField, never>>);
|
|
11
|
+
/** @internal Validated options passed from the fluent query to the endpoint. */
|
|
12
|
+
export interface IdentityQueryOptions {
|
|
13
|
+
identifiers?: readonly UserIdentifier[];
|
|
14
|
+
filter?: {
|
|
15
|
+
field: IdentityStringFilterField;
|
|
16
|
+
operator?: '==';
|
|
17
|
+
value: string;
|
|
18
|
+
} | {
|
|
19
|
+
field: IdentityStringFilterField;
|
|
20
|
+
operator: 'in';
|
|
21
|
+
value: readonly string[];
|
|
22
|
+
} | {
|
|
23
|
+
field: 'provider';
|
|
24
|
+
operator: 'in';
|
|
25
|
+
value: readonly ProviderIdentifier[];
|
|
26
|
+
};
|
|
27
|
+
orderBy?: {
|
|
28
|
+
field: IdentityOrderField;
|
|
29
|
+
direction: IdentityDirection;
|
|
30
|
+
};
|
|
31
|
+
offset?: number;
|
|
32
|
+
limit?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface IdentityCountResult {
|
|
35
|
+
count: number;
|
|
36
|
+
}
|
|
37
|
+
export interface IdentityQueryResult<Claims extends object = Record<string, unknown>> {
|
|
38
|
+
users: IdentityUserRecord<Claims>[];
|
|
39
|
+
/** Continuation hint for offset queries; null for listings and limitToLast. */
|
|
40
|
+
nextOffset: number | null;
|
|
41
|
+
/** Opaque continuation token for UID-ascending listings; otherwise null. */
|
|
42
|
+
nextPageToken: string | null;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=identity-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-types.d.ts","sourceRoot":"","sources":["../../src/auth/identity-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG,yBAAyB,GAAG,UAAU,CAAC;AACzE,MAAM,MAAM,yBAAyB,GAC/B,KAAK,GACL,OAAO,GACP,aAAa,GACb,cAAc,CAAC;AACrB,MAAM,MAAM,kBAAkB,GACxB,KAAK,GACL,aAAa,GACb,WAAW,GACX,aAAa,GACb,OAAO,CAAC;AACd,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAE/C,gFAAgF;AAChF,MAAM,MAAM,kBAAkB,GACxB;KACK,CAAC,IAAI,yBAAyB,GAAG,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,GAC/C,OAAO,CACH,MAAM,CACA,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAC,GACrC,YAAY,GACZ,aAAa,EACf,KAAK,CACR,CACJ;CACR,CAAC,yBAAyB,CAAC,GAC5B,CAAC,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAE/E,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACjC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACxC,MAAM,CAAC,EACD;QAAE,KAAK,EAAE,yBAAyB,CAAC;QAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GACpE;QACI,KAAK,EAAE,yBAAyB,CAAC;QACjC,QAAQ,EAAE,IAAI,CAAC;QACf,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;KAC5B,GACD;QACI,KAAK,EAAE,UAAU,CAAC;QAClB,QAAQ,EAAE,IAAI,CAAC;QACf,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;KACxC,CAAC;IACR,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,kBAAkB,CAAC;QAAC,SAAS,EAAE,iBAAiB,CAAA;KAAE,CAAC;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB,CAChC,MAAM,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE/C,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;IACpC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,4EAA4E;IAC5E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-types.js","sourceRoot":"","sources":["../../src/auth/identity-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type UserImportRecord, type UserMetadataRequest } from './user-import.js';
|
|
2
|
+
import { type CreateRequest, type UpdateRequest } from './user-request.js';
|
|
3
|
+
import { FirebaseEdgeError } from './errors.js';
|
|
4
|
+
export type IdentityImportRecord<Claims extends object = Record<string, unknown>> = Omit<UserImportRecord, 'customClaims'> & {
|
|
5
|
+
customClaims?: Partial<Claims> | null;
|
|
6
|
+
};
|
|
7
|
+
export type IdentityCreateData<Claims extends object = Record<string, unknown>> = CreateRequest & {
|
|
8
|
+
customClaims?: Partial<Claims> | null;
|
|
9
|
+
};
|
|
10
|
+
export type IdentityUpdateData<Claims extends object = Record<string, unknown>> = Omit<UpdateRequest, 'password'> & {
|
|
11
|
+
password?: string | null;
|
|
12
|
+
customClaims?: Partial<Claims> | null;
|
|
13
|
+
metadata?: UserMetadataRequest;
|
|
14
|
+
};
|
|
15
|
+
export type IdentitySetData<Claims extends object = Record<string, unknown>> = Pick<IdentityUpdateData<Claims>, 'displayName' | 'photoURL' | 'phoneNumber' | 'disabled' | 'emailVerified' | 'customClaims'> & {
|
|
16
|
+
email?: string | null;
|
|
17
|
+
metadata?: {
|
|
18
|
+
creationTime?: string | null;
|
|
19
|
+
lastSignInTime?: string | null;
|
|
20
|
+
} | null;
|
|
21
|
+
};
|
|
22
|
+
export interface IdentityWriteResult {
|
|
23
|
+
uid: string;
|
|
24
|
+
}
|
|
25
|
+
/** Validate identity writes and combine supported fields in one request. @internal */
|
|
26
|
+
export declare function buildIdentityWriteRequest(data: IdentityCreateData | IdentityUpdateData | IdentitySetData, operation: 'create' | 'update' | 'set'): {
|
|
27
|
+
data: null;
|
|
28
|
+
error: FirebaseEdgeError;
|
|
29
|
+
} | {
|
|
30
|
+
error: null;
|
|
31
|
+
data: import("./firebase-types.js").UpdateAccountRequest;
|
|
32
|
+
};
|
|
33
|
+
/** Validate and serialize metadata for a dedicated UID update. @internal */
|
|
34
|
+
export declare function buildIdentityMetadataRequest(metadata: UserMetadataRequest | IdentitySetData['metadata'], reset?: boolean): {
|
|
35
|
+
error: null;
|
|
36
|
+
data: Record<string, string>;
|
|
37
|
+
} | {
|
|
38
|
+
data: null;
|
|
39
|
+
error: FirebaseEdgeError;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=identity-write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-write.d.ts","sourceRoot":"","sources":["../../src/auth/identity-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGH,KAAK,aAAa,EAClB,KAAK,aAAa,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAe,MAAM,aAAa,CAAC;AAE7D,MAAM,MAAM,oBAAoB,CAC5B,MAAM,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC/C,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,GAAG;IACzC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACzC,CAAC;AACF,MAAM,MAAM,kBAAkB,CAC1B,MAAM,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC/C,aAAa,GAAG;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACzC,CAAC;AACF,MAAM,MAAM,kBAAkB,CAC1B,MAAM,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC/C,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG;IAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAClC,CAAC;AACF,MAAM,MAAM,eAAe,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACvE,IAAI,CACA,kBAAkB,CAAC,MAAM,CAAC,EACxB,aAAa,GACb,UAAU,GACV,aAAa,GACb,UAAU,GACV,eAAe,GACf,cAAc,CACnB,GAAG;IACA,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE;QACP,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAClC,GAAG,IAAI,CAAC;CACZ,CAAC;AACN,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAE,MAAM,CAAC;CACf;AAED,sFAAsF;AACtF,wBAAgB,yBAAyB,CACrC,IAAI,EAAE,kBAAkB,GAAG,kBAAkB,GAAG,eAAe,EAC/D,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK;;;;;;EA2HzC;AAED,4EAA4E;AAC5E,wBAAgB,4BAA4B,CACxC,QAAQ,EAAE,mBAAmB,GAAG,eAAe,CAAC,UAAU,CAAC,EAC3D,KAAK,UAAQ;;;;;;EAkChB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { buildUserMetadata } from './user-import.js';
|
|
2
|
+
import { buildUserRequest, buildCustomClaimsRequest } from './user-request.js';
|
|
3
|
+
import { FirebaseEdgeError, ensureError } from './errors.js';
|
|
4
|
+
/** Validate identity writes and combine supported fields in one request. @internal */
|
|
5
|
+
export function buildIdentityWriteRequest(data, operation) {
|
|
6
|
+
if (!data || typeof data !== 'object' || Array.isArray(data)) {
|
|
7
|
+
return {
|
|
8
|
+
data: null,
|
|
9
|
+
error: new FirebaseEdgeError({
|
|
10
|
+
code: 'auth/invalid-argument',
|
|
11
|
+
message: 'User properties must be an object.'
|
|
12
|
+
})
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const allowed = new Set([
|
|
16
|
+
'email',
|
|
17
|
+
'emailVerified',
|
|
18
|
+
'displayName',
|
|
19
|
+
'photoURL',
|
|
20
|
+
'phoneNumber',
|
|
21
|
+
'disabled',
|
|
22
|
+
...(operation === 'set'
|
|
23
|
+
? ['customClaims', 'metadata']
|
|
24
|
+
: [
|
|
25
|
+
'password',
|
|
26
|
+
'multiFactor',
|
|
27
|
+
...(operation === 'create'
|
|
28
|
+
? ['uid', 'customClaims']
|
|
29
|
+
: [
|
|
30
|
+
'providerToLink',
|
|
31
|
+
'providersToUnlink',
|
|
32
|
+
'customClaims',
|
|
33
|
+
'metadata'
|
|
34
|
+
])
|
|
35
|
+
])
|
|
36
|
+
]);
|
|
37
|
+
if (Object.keys(data).some((key) => !allowed.has(key))) {
|
|
38
|
+
return {
|
|
39
|
+
data: null,
|
|
40
|
+
error: new FirebaseEdgeError({
|
|
41
|
+
code: 'auth/invalid-argument',
|
|
42
|
+
message: 'Unsupported identity write field.'
|
|
43
|
+
})
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (operation === 'set' &&
|
|
47
|
+
data.email == null &&
|
|
48
|
+
data.emailVerified === true) {
|
|
49
|
+
return {
|
|
50
|
+
data: null,
|
|
51
|
+
error: new FirebaseEdgeError({
|
|
52
|
+
code: 'auth/invalid-argument',
|
|
53
|
+
message: 'A verified email requires an email in the replacement.'
|
|
54
|
+
})
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const properties = operation === 'set'
|
|
58
|
+
? {
|
|
59
|
+
email: data.email ?? undefined,
|
|
60
|
+
displayName: data.displayName ?? null,
|
|
61
|
+
photoURL: data.photoURL ?? null,
|
|
62
|
+
phoneNumber: data.phoneNumber ?? null,
|
|
63
|
+
disabled: data.disabled === undefined ? false : data.disabled,
|
|
64
|
+
emailVerified: data.emailVerified === undefined
|
|
65
|
+
? false
|
|
66
|
+
: data.emailVerified
|
|
67
|
+
}
|
|
68
|
+
: operation === 'update'
|
|
69
|
+
? {
|
|
70
|
+
...data,
|
|
71
|
+
password: data.password ?? undefined
|
|
72
|
+
}
|
|
73
|
+
: data;
|
|
74
|
+
const { error, data: body } = buildUserRequest(properties, operation === 'create' ? 'create' : 'update');
|
|
75
|
+
if (error) {
|
|
76
|
+
return { error, data: null };
|
|
77
|
+
}
|
|
78
|
+
if (operation === 'update') {
|
|
79
|
+
const update = data;
|
|
80
|
+
if (update.password === null) {
|
|
81
|
+
body.deleteAttribute = [
|
|
82
|
+
...(body.deleteAttribute ?? []),
|
|
83
|
+
'PASSWORD'
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
if (update.metadata !== undefined) {
|
|
87
|
+
const { error: metadataError, data: metadataBody } = buildIdentityMetadataRequest(update.metadata);
|
|
88
|
+
if (metadataError) {
|
|
89
|
+
return { error: metadataError, data: null };
|
|
90
|
+
}
|
|
91
|
+
Object.assign(body, metadataBody);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (operation === 'set' && data.email == null) {
|
|
95
|
+
body.deleteAttribute = [...(body.deleteAttribute ?? []), 'EMAIL'];
|
|
96
|
+
}
|
|
97
|
+
if (operation === 'set') {
|
|
98
|
+
const { error: metadataError, data: metadataBody } = buildIdentityMetadataRequest(data.metadata ?? null, true);
|
|
99
|
+
if (metadataError) {
|
|
100
|
+
return { error: metadataError, data: null };
|
|
101
|
+
}
|
|
102
|
+
Object.assign(body, metadataBody);
|
|
103
|
+
}
|
|
104
|
+
const { customClaims } = data;
|
|
105
|
+
if (operation === 'set' || customClaims !== undefined) {
|
|
106
|
+
const { error: claimsError, data: claimsBody } = buildCustomClaimsRequest(customClaims ?? null);
|
|
107
|
+
if (claimsError) {
|
|
108
|
+
return { error: claimsError, data: null };
|
|
109
|
+
}
|
|
110
|
+
Object.assign(body, claimsBody);
|
|
111
|
+
}
|
|
112
|
+
return { error: null, data: body };
|
|
113
|
+
}
|
|
114
|
+
/** Validate and serialize metadata for a dedicated UID update. @internal */
|
|
115
|
+
export function buildIdentityMetadataRequest(metadata, reset = false) {
|
|
116
|
+
try {
|
|
117
|
+
if (reset &&
|
|
118
|
+
metadata != null &&
|
|
119
|
+
(typeof metadata !== 'object' || Array.isArray(metadata))) {
|
|
120
|
+
throw new Error('metadata must be an object or null.');
|
|
121
|
+
}
|
|
122
|
+
const properties = reset
|
|
123
|
+
? {
|
|
124
|
+
...metadata,
|
|
125
|
+
creationTime: metadata?.creationTime ?? '1970-01-01T00:00:00.000Z',
|
|
126
|
+
lastSignInTime: metadata?.lastSignInTime ?? '1970-01-01T00:00:00.000Z'
|
|
127
|
+
}
|
|
128
|
+
: metadata;
|
|
129
|
+
const timestamps = buildUserMetadata(properties);
|
|
130
|
+
const body = {};
|
|
131
|
+
for (const [field, value] of Object.entries(timestamps)) {
|
|
132
|
+
body[field] = String(value);
|
|
133
|
+
}
|
|
134
|
+
return { error: null, data: body };
|
|
135
|
+
}
|
|
136
|
+
catch (cause) {
|
|
137
|
+
return {
|
|
138
|
+
data: null,
|
|
139
|
+
error: new FirebaseEdgeError({
|
|
140
|
+
code: 'auth/invalid-argument',
|
|
141
|
+
message: ensureError(cause).message
|
|
142
|
+
})
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=identity-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-write.js","sourceRoot":"","sources":["../../src/auth/identity-write.ts"],"names":[],"mappings":"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"}
|