@dereekb/firebase-server 13.7.0 → 13.8.0
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/index.cjs.js +1977 -1331
- package/index.esm.js +1967 -1333
- package/mailgun/index.cjs.js +91 -1
- package/mailgun/index.esm.js +92 -3
- package/mailgun/package.json +9 -9
- package/mailgun/src/lib/auth.mailgun.d.ts +37 -1
- package/model/package.json +10 -10
- package/oidc/package.json +12 -12
- package/package.json +14 -14
- package/src/lib/auth/auth.service.d.ts +233 -0
- package/src/lib/auth/auth.service.error.d.ts +29 -0
- package/src/lib/auth/auth.service.error.util.d.ts +40 -0
- package/src/lib/auth/index.d.ts +1 -0
- package/test/package.json +12 -12
- package/zoho/package.json +9 -9
package/mailgun/index.cjs.js
CHANGED
|
@@ -337,7 +337,97 @@ function _ts_generator(thisArg, body) {
|
|
|
337
337
|
}
|
|
338
338
|
]);
|
|
339
339
|
return AbstractMailgunContentFirebaseServerNewUserService;
|
|
340
|
+
}(firebaseServer.AbstractFirebaseServerNewUserService);
|
|
341
|
+
/**
|
|
342
|
+
* Abstract {@link FirebaseServerUserPasswordResetService} implementation that sends a password reset
|
|
343
|
+
* email to users via Mailgun templates.
|
|
344
|
+
*
|
|
345
|
+
* Subclasses implement `buildPasswordResetMailgunContentRequest` to define the template, subject,
|
|
346
|
+
* and any custom variables. The user's email, display name, UID, and reset password are
|
|
347
|
+
* automatically injected as Mailgun user variables.
|
|
348
|
+
*
|
|
349
|
+
* @example
|
|
350
|
+
* ```ts
|
|
351
|
+
* class PasswordResetEmailService extends AbstractMailgunContentFirebaseServerUserPasswordResetService {
|
|
352
|
+
* protected async buildPasswordResetMailgunContentRequest(details) {
|
|
353
|
+
* return {
|
|
354
|
+
* template: 'password-reset',
|
|
355
|
+
* subject: 'Reset Your Password',
|
|
356
|
+
* from: 'noreply@example.com'
|
|
357
|
+
* };
|
|
358
|
+
* }
|
|
359
|
+
* }
|
|
360
|
+
* ```
|
|
361
|
+
*/ var AbstractMailgunContentFirebaseServerUserPasswordResetService = /*#__PURE__*/ function(AbstractFirebaseServerUserPasswordResetService) {
|
|
362
|
+
_inherits(AbstractMailgunContentFirebaseServerUserPasswordResetService, AbstractFirebaseServerUserPasswordResetService);
|
|
363
|
+
function AbstractMailgunContentFirebaseServerUserPasswordResetService(authService, mailgunService) {
|
|
364
|
+
_class_call_check(this, AbstractMailgunContentFirebaseServerUserPasswordResetService);
|
|
365
|
+
var _this;
|
|
366
|
+
_this = _call_super(this, AbstractMailgunContentFirebaseServerUserPasswordResetService, [
|
|
367
|
+
authService
|
|
368
|
+
]), _define_property(_this, "mailgunService", void 0);
|
|
369
|
+
_this.mailgunService = mailgunService;
|
|
370
|
+
return _this;
|
|
371
|
+
}
|
|
372
|
+
_create_class(AbstractMailgunContentFirebaseServerUserPasswordResetService, [
|
|
373
|
+
{
|
|
374
|
+
key: "sendPasswordResetContentToUser",
|
|
375
|
+
value: function sendPasswordResetContentToUser(details) {
|
|
376
|
+
return _async_to_generator(function() {
|
|
377
|
+
var userRecord, resetPassword, uid, displayName, email, baseRequest, baseRequestTo;
|
|
378
|
+
return _ts_generator(this, function(_state) {
|
|
379
|
+
switch(_state.label){
|
|
380
|
+
case 0:
|
|
381
|
+
return [
|
|
382
|
+
4,
|
|
383
|
+
details.userContext.loadRecord()
|
|
384
|
+
];
|
|
385
|
+
case 1:
|
|
386
|
+
userRecord = _state.sent();
|
|
387
|
+
resetPassword = details.claims.resetPassword;
|
|
388
|
+
uid = userRecord.uid, displayName = userRecord.displayName, email = userRecord.email;
|
|
389
|
+
if (!email) {
|
|
390
|
+
throw new Error('Email is not present/available for the user record "'.concat(userRecord.uid, '"'));
|
|
391
|
+
}
|
|
392
|
+
return [
|
|
393
|
+
4,
|
|
394
|
+
this.buildPasswordResetMailgunContentRequest(details)
|
|
395
|
+
];
|
|
396
|
+
case 2:
|
|
397
|
+
baseRequest = _state.sent();
|
|
398
|
+
baseRequestTo = baseRequest.to;
|
|
399
|
+
return [
|
|
400
|
+
4,
|
|
401
|
+
this.mailgunService.sendTemplateEmail(_object_spread_props(_object_spread({
|
|
402
|
+
batchSend: false
|
|
403
|
+
}, baseRequest), {
|
|
404
|
+
to: {
|
|
405
|
+
name: baseRequestTo === null || baseRequestTo === void 0 ? void 0 : baseRequestTo.name,
|
|
406
|
+
email: email,
|
|
407
|
+
userVariables: _object_spread_props(_object_spread({
|
|
408
|
+
resetPassword: resetPassword
|
|
409
|
+
}, baseRequestTo === null || baseRequestTo === void 0 ? void 0 : baseRequestTo.userVariables), {
|
|
410
|
+
displayName: displayName,
|
|
411
|
+
uid: uid
|
|
412
|
+
})
|
|
413
|
+
},
|
|
414
|
+
sendTestEmails: baseRequest.sendTestEmails || details.sendDetailsInTestEnvironment || undefined
|
|
415
|
+
}))
|
|
416
|
+
];
|
|
417
|
+
case 3:
|
|
418
|
+
_state.sent();
|
|
419
|
+
return [
|
|
420
|
+
2
|
|
421
|
+
];
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
}).call(this);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
]);
|
|
428
|
+
return AbstractMailgunContentFirebaseServerUserPasswordResetService;
|
|
340
429
|
}
|
|
341
|
-
(firebaseServer.
|
|
430
|
+
(firebaseServer.AbstractFirebaseServerUserPasswordResetService);
|
|
342
431
|
|
|
343
432
|
exports.AbstractMailgunContentFirebaseServerNewUserService = AbstractMailgunContentFirebaseServerNewUserService;
|
|
433
|
+
exports.AbstractMailgunContentFirebaseServerUserPasswordResetService = AbstractMailgunContentFirebaseServerUserPasswordResetService;
|
package/mailgun/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AbstractFirebaseServerNewUserService } from '@dereekb/firebase-server';
|
|
1
|
+
import { AbstractFirebaseServerNewUserService, AbstractFirebaseServerUserPasswordResetService } from '@dereekb/firebase-server';
|
|
2
2
|
|
|
3
3
|
function _assert_this_initialized(self) {
|
|
4
4
|
if (self === void 0) {
|
|
@@ -335,7 +335,96 @@ function _ts_generator(thisArg, body) {
|
|
|
335
335
|
}
|
|
336
336
|
]);
|
|
337
337
|
return AbstractMailgunContentFirebaseServerNewUserService;
|
|
338
|
+
}(AbstractFirebaseServerNewUserService);
|
|
339
|
+
/**
|
|
340
|
+
* Abstract {@link FirebaseServerUserPasswordResetService} implementation that sends a password reset
|
|
341
|
+
* email to users via Mailgun templates.
|
|
342
|
+
*
|
|
343
|
+
* Subclasses implement `buildPasswordResetMailgunContentRequest` to define the template, subject,
|
|
344
|
+
* and any custom variables. The user's email, display name, UID, and reset password are
|
|
345
|
+
* automatically injected as Mailgun user variables.
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* ```ts
|
|
349
|
+
* class PasswordResetEmailService extends AbstractMailgunContentFirebaseServerUserPasswordResetService {
|
|
350
|
+
* protected async buildPasswordResetMailgunContentRequest(details) {
|
|
351
|
+
* return {
|
|
352
|
+
* template: 'password-reset',
|
|
353
|
+
* subject: 'Reset Your Password',
|
|
354
|
+
* from: 'noreply@example.com'
|
|
355
|
+
* };
|
|
356
|
+
* }
|
|
357
|
+
* }
|
|
358
|
+
* ```
|
|
359
|
+
*/ var AbstractMailgunContentFirebaseServerUserPasswordResetService = /*#__PURE__*/ function(AbstractFirebaseServerUserPasswordResetService) {
|
|
360
|
+
_inherits(AbstractMailgunContentFirebaseServerUserPasswordResetService, AbstractFirebaseServerUserPasswordResetService);
|
|
361
|
+
function AbstractMailgunContentFirebaseServerUserPasswordResetService(authService, mailgunService) {
|
|
362
|
+
_class_call_check(this, AbstractMailgunContentFirebaseServerUserPasswordResetService);
|
|
363
|
+
var _this;
|
|
364
|
+
_this = _call_super(this, AbstractMailgunContentFirebaseServerUserPasswordResetService, [
|
|
365
|
+
authService
|
|
366
|
+
]), _define_property(_this, "mailgunService", void 0);
|
|
367
|
+
_this.mailgunService = mailgunService;
|
|
368
|
+
return _this;
|
|
369
|
+
}
|
|
370
|
+
_create_class(AbstractMailgunContentFirebaseServerUserPasswordResetService, [
|
|
371
|
+
{
|
|
372
|
+
key: "sendPasswordResetContentToUser",
|
|
373
|
+
value: function sendPasswordResetContentToUser(details) {
|
|
374
|
+
return _async_to_generator(function() {
|
|
375
|
+
var userRecord, resetPassword, uid, displayName, email, baseRequest, baseRequestTo;
|
|
376
|
+
return _ts_generator(this, function(_state) {
|
|
377
|
+
switch(_state.label){
|
|
378
|
+
case 0:
|
|
379
|
+
return [
|
|
380
|
+
4,
|
|
381
|
+
details.userContext.loadRecord()
|
|
382
|
+
];
|
|
383
|
+
case 1:
|
|
384
|
+
userRecord = _state.sent();
|
|
385
|
+
resetPassword = details.claims.resetPassword;
|
|
386
|
+
uid = userRecord.uid, displayName = userRecord.displayName, email = userRecord.email;
|
|
387
|
+
if (!email) {
|
|
388
|
+
throw new Error('Email is not present/available for the user record "'.concat(userRecord.uid, '"'));
|
|
389
|
+
}
|
|
390
|
+
return [
|
|
391
|
+
4,
|
|
392
|
+
this.buildPasswordResetMailgunContentRequest(details)
|
|
393
|
+
];
|
|
394
|
+
case 2:
|
|
395
|
+
baseRequest = _state.sent();
|
|
396
|
+
baseRequestTo = baseRequest.to;
|
|
397
|
+
return [
|
|
398
|
+
4,
|
|
399
|
+
this.mailgunService.sendTemplateEmail(_object_spread_props(_object_spread({
|
|
400
|
+
batchSend: false
|
|
401
|
+
}, baseRequest), {
|
|
402
|
+
to: {
|
|
403
|
+
name: baseRequestTo === null || baseRequestTo === void 0 ? void 0 : baseRequestTo.name,
|
|
404
|
+
email: email,
|
|
405
|
+
userVariables: _object_spread_props(_object_spread({
|
|
406
|
+
resetPassword: resetPassword
|
|
407
|
+
}, baseRequestTo === null || baseRequestTo === void 0 ? void 0 : baseRequestTo.userVariables), {
|
|
408
|
+
displayName: displayName,
|
|
409
|
+
uid: uid
|
|
410
|
+
})
|
|
411
|
+
},
|
|
412
|
+
sendTestEmails: baseRequest.sendTestEmails || details.sendDetailsInTestEnvironment || undefined
|
|
413
|
+
}))
|
|
414
|
+
];
|
|
415
|
+
case 3:
|
|
416
|
+
_state.sent();
|
|
417
|
+
return [
|
|
418
|
+
2
|
|
419
|
+
];
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
}).call(this);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
]);
|
|
426
|
+
return AbstractMailgunContentFirebaseServerUserPasswordResetService;
|
|
338
427
|
}
|
|
339
|
-
(
|
|
428
|
+
(AbstractFirebaseServerUserPasswordResetService);
|
|
340
429
|
|
|
341
|
-
export { AbstractMailgunContentFirebaseServerNewUserService };
|
|
430
|
+
export { AbstractMailgunContentFirebaseServerNewUserService, AbstractMailgunContentFirebaseServerUserPasswordResetService };
|
package/mailgun/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/firebase-server/mailgun",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.8.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@dereekb/analytics": "13.
|
|
6
|
-
"@dereekb/firebase": "13.
|
|
7
|
-
"@dereekb/firebase-server": "13.
|
|
8
|
-
"@dereekb/date": "13.
|
|
9
|
-
"@dereekb/nestjs": "13.
|
|
10
|
-
"@dereekb/model": "13.
|
|
11
|
-
"@dereekb/rxjs": "13.
|
|
12
|
-
"@dereekb/util": "13.
|
|
5
|
+
"@dereekb/analytics": "13.8.0",
|
|
6
|
+
"@dereekb/firebase": "13.8.0",
|
|
7
|
+
"@dereekb/firebase-server": "13.8.0",
|
|
8
|
+
"@dereekb/date": "13.8.0",
|
|
9
|
+
"@dereekb/nestjs": "13.8.0",
|
|
10
|
+
"@dereekb/model": "13.8.0",
|
|
11
|
+
"@dereekb/rxjs": "13.8.0",
|
|
12
|
+
"@dereekb/util": "13.8.0"
|
|
13
13
|
},
|
|
14
14
|
"exports": {
|
|
15
15
|
"./package.json": "./package.json",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type MailgunRecipient, type MailgunService, type MailgunTemplateEmailRequest } from '@dereekb/nestjs/mailgun';
|
|
2
|
-
import { AbstractFirebaseServerNewUserService, type FirebaseServerAuthContext, type FirebaseServerAuthNewUserSetupDetails, type FirebaseServerAuthService, type FirebaseServerAuthUserContext } from '@dereekb/firebase-server';
|
|
2
|
+
import { AbstractFirebaseServerNewUserService, AbstractFirebaseServerUserPasswordResetService, type FirebaseServerAuthContext, type FirebaseServerAuthNewUserSetupDetails, type FirebaseServerAuthPasswordResetDetails, type FirebaseServerAuthService, type FirebaseServerAuthUserContext } from '@dereekb/firebase-server';
|
|
3
3
|
/**
|
|
4
4
|
* Partial {@link MailgunTemplateEmailRequest} for {@link AbstractMailgunContentFirebaseServerNewUserService}.
|
|
5
5
|
*
|
|
@@ -36,3 +36,39 @@ export declare abstract class AbstractMailgunContentFirebaseServerNewUserService
|
|
|
36
36
|
protected sendSetupContentToUser(user: FirebaseServerAuthNewUserSetupDetails<U, D>): Promise<void>;
|
|
37
37
|
protected abstract buildNewUserMailgunContentRequest(user: FirebaseServerAuthNewUserSetupDetails<U, D>): Promise<NewUserMailgunContentRequest>;
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Partial {@link MailgunTemplateEmailRequest} for {@link AbstractMailgunContentFirebaseServerUserPasswordResetService}.
|
|
41
|
+
*
|
|
42
|
+
* The `to` field is omitted because the user's email and details are automatically
|
|
43
|
+
* configured from the Firebase Auth user record during `sendPasswordResetContentToUser`.
|
|
44
|
+
*/
|
|
45
|
+
export interface ResetPasswordMailgunContentRequest extends Omit<MailgunTemplateEmailRequest, 'to'> {
|
|
46
|
+
to?: Partial<Omit<MailgunRecipient, 'email'>>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Abstract {@link FirebaseServerUserPasswordResetService} implementation that sends a password reset
|
|
50
|
+
* email to users via Mailgun templates.
|
|
51
|
+
*
|
|
52
|
+
* Subclasses implement `buildPasswordResetMailgunContentRequest` to define the template, subject,
|
|
53
|
+
* and any custom variables. The user's email, display name, UID, and reset password are
|
|
54
|
+
* automatically injected as Mailgun user variables.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* class PasswordResetEmailService extends AbstractMailgunContentFirebaseServerUserPasswordResetService {
|
|
59
|
+
* protected async buildPasswordResetMailgunContentRequest(details) {
|
|
60
|
+
* return {
|
|
61
|
+
* template: 'password-reset',
|
|
62
|
+
* subject: 'Reset Your Password',
|
|
63
|
+
* from: 'noreply@example.com'
|
|
64
|
+
* };
|
|
65
|
+
* }
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export declare abstract class AbstractMailgunContentFirebaseServerUserPasswordResetService<U extends FirebaseServerAuthUserContext = FirebaseServerAuthUserContext, C extends FirebaseServerAuthContext = FirebaseServerAuthContext, D = unknown> extends AbstractFirebaseServerUserPasswordResetService<U, C, D> {
|
|
70
|
+
readonly mailgunService: MailgunService;
|
|
71
|
+
constructor(authService: FirebaseServerAuthService<U, C>, mailgunService: MailgunService);
|
|
72
|
+
protected sendPasswordResetContentToUser(details: FirebaseServerAuthPasswordResetDetails<U, D>): Promise<void>;
|
|
73
|
+
protected abstract buildPasswordResetMailgunContentRequest(details: FirebaseServerAuthPasswordResetDetails<U, D>): Promise<ResetPasswordMailgunContentRequest>;
|
|
74
|
+
}
|
package/model/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/firebase-server/model",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.8.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@dereekb/analytics": "13.
|
|
6
|
-
"@dereekb/date": "13.
|
|
7
|
-
"@dereekb/firebase": "13.
|
|
8
|
-
"@dereekb/firebase-server": "13.
|
|
9
|
-
"@dereekb/model": "13.
|
|
10
|
-
"@dereekb/nestjs": "13.
|
|
11
|
-
"@dereekb/rxjs": "13.
|
|
12
|
-
"@dereekb/util": "13.
|
|
5
|
+
"@dereekb/analytics": "13.8.0",
|
|
6
|
+
"@dereekb/date": "13.8.0",
|
|
7
|
+
"@dereekb/firebase": "13.8.0",
|
|
8
|
+
"@dereekb/firebase-server": "13.8.0",
|
|
9
|
+
"@dereekb/model": "13.8.0",
|
|
10
|
+
"@dereekb/nestjs": "13.8.0",
|
|
11
|
+
"@dereekb/rxjs": "13.8.0",
|
|
12
|
+
"@dereekb/util": "13.8.0",
|
|
13
13
|
"@nestjs/common": "^11.1.17",
|
|
14
|
-
"@nestjs/config": "^4.0.
|
|
14
|
+
"@nestjs/config": "^4.0.4",
|
|
15
15
|
"archiver": "^7.0.0",
|
|
16
16
|
"date-fns": "^4.0.0",
|
|
17
17
|
"firebase-functions": "^7.0.0",
|
package/oidc/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/firebase-server/oidc",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.8.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@dereekb/analytics": "13.
|
|
6
|
-
"@dereekb/date": "13.
|
|
7
|
-
"@dereekb/firebase": "13.
|
|
8
|
-
"@dereekb/firebase-server": "13.
|
|
9
|
-
"@dereekb/model": "13.
|
|
10
|
-
"@dereekb/nestjs": "13.
|
|
11
|
-
"@dereekb/rxjs": "13.
|
|
12
|
-
"@dereekb/util": "13.
|
|
13
|
-
"@dereekb/zoho": "13.
|
|
5
|
+
"@dereekb/analytics": "13.8.0",
|
|
6
|
+
"@dereekb/date": "13.8.0",
|
|
7
|
+
"@dereekb/firebase": "13.8.0",
|
|
8
|
+
"@dereekb/firebase-server": "13.8.0",
|
|
9
|
+
"@dereekb/model": "13.8.0",
|
|
10
|
+
"@dereekb/nestjs": "13.8.0",
|
|
11
|
+
"@dereekb/rxjs": "13.8.0",
|
|
12
|
+
"@dereekb/util": "13.8.0",
|
|
13
|
+
"@dereekb/zoho": "13.8.0",
|
|
14
14
|
"@nestjs/common": "^11.1.17",
|
|
15
|
-
"@nestjs/config": "^4.0.
|
|
15
|
+
"@nestjs/config": "^4.0.4",
|
|
16
16
|
"express": "^5.0.0",
|
|
17
|
-
"firebase-admin": "^13.
|
|
17
|
+
"firebase-admin": "^13.8.0",
|
|
18
18
|
"nanoid": "^5.1.7",
|
|
19
19
|
"oidc-provider": "^9.7.0"
|
|
20
20
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/firebase-server",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.8.0",
|
|
4
4
|
"exports": {
|
|
5
5
|
"./test": {
|
|
6
6
|
"module": "./test/index.esm.js",
|
|
@@ -43,27 +43,27 @@
|
|
|
43
43
|
"main": "./index.cjs.js",
|
|
44
44
|
"types": "./src/index.d.ts",
|
|
45
45
|
"peerDependencies": {
|
|
46
|
-
"@dereekb/analytics": "13.
|
|
47
|
-
"@dereekb/date": "13.
|
|
48
|
-
"@dereekb/dbx-core": "13.
|
|
49
|
-
"@dereekb/firebase": "13.
|
|
50
|
-
"@dereekb/model": "13.
|
|
51
|
-
"@dereekb/nestjs": "13.
|
|
52
|
-
"@dereekb/rxjs": "13.
|
|
53
|
-
"@dereekb/util": "13.
|
|
54
|
-
"@dereekb/zoho": "13.
|
|
46
|
+
"@dereekb/analytics": "13.8.0",
|
|
47
|
+
"@dereekb/date": "13.8.0",
|
|
48
|
+
"@dereekb/dbx-core": "13.8.0",
|
|
49
|
+
"@dereekb/firebase": "13.8.0",
|
|
50
|
+
"@dereekb/model": "13.8.0",
|
|
51
|
+
"@dereekb/nestjs": "13.8.0",
|
|
52
|
+
"@dereekb/rxjs": "13.8.0",
|
|
53
|
+
"@dereekb/util": "13.8.0",
|
|
54
|
+
"@dereekb/zoho": "13.8.0",
|
|
55
55
|
"@google-cloud/firestore": "^7.11.6",
|
|
56
56
|
"@google-cloud/storage": "^7.19.0",
|
|
57
57
|
"@nestjs/common": "^11.1.17",
|
|
58
|
-
"@nestjs/config": "^4.0.
|
|
59
|
-
"@nestjs/core": "^11.1.
|
|
60
|
-
"@nestjs/platform-express": "^11.1.
|
|
58
|
+
"@nestjs/config": "^4.0.4",
|
|
59
|
+
"@nestjs/core": "^11.1.18",
|
|
60
|
+
"@nestjs/platform-express": "^11.1.18",
|
|
61
61
|
"@nestjs/testing": "^11.1.14",
|
|
62
62
|
"archiver": "^7.0.0",
|
|
63
63
|
"arktype": "^2.2.0",
|
|
64
64
|
"date-fns": "^4.0.0",
|
|
65
65
|
"express": "^5.0.0",
|
|
66
|
-
"firebase-admin": "^13.
|
|
66
|
+
"firebase-admin": "^13.8.0",
|
|
67
67
|
"firebase-functions": "^7.0.0",
|
|
68
68
|
"firebase-functions-test": "3.4.1",
|
|
69
69
|
"jsonwebtoken": "^9.0.0",
|
|
@@ -583,6 +583,234 @@ export declare abstract class AbstractFirebaseServerNewUserService<U extends Fir
|
|
|
583
583
|
export declare class NoSetupContentFirebaseServerNewUserService<U extends FirebaseServerAuthUserContext = FirebaseServerAuthUserContext> extends AbstractFirebaseServerNewUserService<U> {
|
|
584
584
|
protected sendSetupContentToUser(_details: FirebaseServerAuthNewUserSetupDetails<U>): Promise<void>;
|
|
585
585
|
}
|
|
586
|
+
/**
|
|
587
|
+
* Configuration for initiating a password reset flow for an existing Firebase Auth user.
|
|
588
|
+
*
|
|
589
|
+
* Supports identifying the user by UID or email, and optionally sending reset content
|
|
590
|
+
* (e.g., an email with the temporary password) immediately after initiation.
|
|
591
|
+
*
|
|
592
|
+
* @example
|
|
593
|
+
* ```typescript
|
|
594
|
+
* await passwordResetService.beginPasswordReset({
|
|
595
|
+
* uid: 'some-uid',
|
|
596
|
+
* sendResetContent: true,
|
|
597
|
+
* sendResetThrowErrors: true
|
|
598
|
+
* });
|
|
599
|
+
* ```
|
|
600
|
+
*/
|
|
601
|
+
export interface FirebaseServerAuthInitiatePasswordReset<D = unknown> {
|
|
602
|
+
/**
|
|
603
|
+
* Specific user identifier to use.
|
|
604
|
+
*/
|
|
605
|
+
readonly uid?: Maybe<FirebaseAuthUserId>;
|
|
606
|
+
/**
|
|
607
|
+
* Email for the user, if identifying by email.
|
|
608
|
+
*/
|
|
609
|
+
readonly email?: Maybe<EmailAddress>;
|
|
610
|
+
/**
|
|
611
|
+
* Whether or not to send a reset email. Is false by default.
|
|
612
|
+
*/
|
|
613
|
+
readonly sendResetContent?: Maybe<boolean>;
|
|
614
|
+
/**
|
|
615
|
+
* If true, and the reset content has been sent before, it will not be sent again.
|
|
616
|
+
*/
|
|
617
|
+
readonly sendResetDetailsOnce?: Maybe<boolean>;
|
|
618
|
+
/**
|
|
619
|
+
* If true, will ignore throttling when sending reset content.
|
|
620
|
+
*/
|
|
621
|
+
readonly sendResetIgnoreThrottle?: Maybe<boolean>;
|
|
622
|
+
/**
|
|
623
|
+
* Whether or not to throw an error if sending reset content fails. Is false by default.
|
|
624
|
+
*/
|
|
625
|
+
readonly sendResetThrowErrors?: Maybe<boolean>;
|
|
626
|
+
/**
|
|
627
|
+
* Whether or not to force sending the test details.
|
|
628
|
+
*/
|
|
629
|
+
readonly sendDetailsInTestEnvironment?: Maybe<boolean>;
|
|
630
|
+
/**
|
|
631
|
+
* Any additional reset context.
|
|
632
|
+
*/
|
|
633
|
+
readonly data?: Maybe<D>;
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Configuration options for sending password reset content (e.g., reset email) to a user.
|
|
637
|
+
*
|
|
638
|
+
* Controls throttling, send-once behavior, and error handling for the delivery process.
|
|
639
|
+
*/
|
|
640
|
+
export interface FirebaseServerAuthPasswordResetSendContentConfig<D = unknown> {
|
|
641
|
+
/**
|
|
642
|
+
* Whether or not to force sending the test details. Usage differs between providers.
|
|
643
|
+
*/
|
|
644
|
+
readonly sendDetailsInTestEnvironment?: Maybe<boolean>;
|
|
645
|
+
/**
|
|
646
|
+
* Whether or not to skip sending again if the reset content has already been sent once.
|
|
647
|
+
*/
|
|
648
|
+
readonly sendResetDetailsOnce?: Maybe<boolean>;
|
|
649
|
+
/**
|
|
650
|
+
* Whether or not to force sending again even if the send is being throttled.
|
|
651
|
+
*/
|
|
652
|
+
readonly ignoreSendThrottleTime?: Maybe<boolean>;
|
|
653
|
+
/**
|
|
654
|
+
* Whether or not to throw errors if the send fails, instead of returning false.
|
|
655
|
+
*
|
|
656
|
+
* @see FirebaseServerAuthPasswordResetNoResetConfigError
|
|
657
|
+
* @see FirebaseServerAuthPasswordResetThrottleError
|
|
658
|
+
*/
|
|
659
|
+
readonly throwErrors?: Maybe<boolean>;
|
|
660
|
+
/**
|
|
661
|
+
* Any additional reset context.
|
|
662
|
+
*/
|
|
663
|
+
readonly data?: Maybe<D>;
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Details about a user that is in the password reset phase, including their user context,
|
|
667
|
+
* reset claims data, and the send configuration that was used.
|
|
668
|
+
*/
|
|
669
|
+
export interface FirebaseServerAuthPasswordResetDetails<U extends FirebaseServerAuthUserContext = FirebaseServerAuthUserContext, D = unknown> extends FirebaseServerAuthPasswordResetSendContentConfig<D> {
|
|
670
|
+
readonly userContext: U;
|
|
671
|
+
readonly claims: FirebaseAuthResetUserPasswordClaimsData;
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Input for completing a password reset, containing the temporary reset code
|
|
675
|
+
* and the desired new password.
|
|
676
|
+
*/
|
|
677
|
+
export interface FirebaseServerAuthCompletePasswordResetInput {
|
|
678
|
+
/**
|
|
679
|
+
* The temporary reset code from the reset email, to be verified against claims.
|
|
680
|
+
*/
|
|
681
|
+
readonly resetPassword: string;
|
|
682
|
+
/**
|
|
683
|
+
* The new password to set after verification succeeds.
|
|
684
|
+
*/
|
|
685
|
+
readonly newPassword: PasswordString;
|
|
686
|
+
}
|
|
687
|
+
/**
|
|
688
|
+
* Service for managing password reset flows for existing Firebase Auth users.
|
|
689
|
+
*
|
|
690
|
+
* Handles initiating password resets (generating temporary passwords), sending reset content
|
|
691
|
+
* (with throttling), loading reset state, and completing the reset by setting a new password.
|
|
692
|
+
*
|
|
693
|
+
* @example
|
|
694
|
+
* ```typescript
|
|
695
|
+
* const resetSvc = authService.passwordReset();
|
|
696
|
+
* const claims = await resetSvc.beginPasswordReset({ uid: 'some-uid', sendResetContent: true });
|
|
697
|
+
* // Later, after user verifies identity:
|
|
698
|
+
* await resetSvc.completePasswordReset('some-uid', { resetPassword: '123456', newPassword: 'newSecure' });
|
|
699
|
+
* ```
|
|
700
|
+
*/
|
|
701
|
+
export interface FirebaseServerUserPasswordResetService<D = unknown, U extends FirebaseServerAuthUserContext = FirebaseServerAuthUserContext> {
|
|
702
|
+
/**
|
|
703
|
+
* Initiates a password reset for the identified user, generating a temporary password
|
|
704
|
+
* and storing reset claims. Optionally sends reset content (e.g., email) immediately.
|
|
705
|
+
*
|
|
706
|
+
* When `sendResetContent` is true, this method delegates to {@link sendResetContent} and
|
|
707
|
+
* may throw the same errors (throttle, send-once, no-config) depending on the configuration.
|
|
708
|
+
*
|
|
709
|
+
* @param input - Configuration for the reset, including user identification and send options.
|
|
710
|
+
* @throws Throws if neither uid nor email is provided.
|
|
711
|
+
* @throws {FirebaseServerAuthPasswordResetThrottleError} When send is throttled and `sendResetThrowErrors` is true.
|
|
712
|
+
* @throws {FirebaseServerAuthPasswordResetSendOnceError} When already sent and `sendResetDetailsOnce` + `sendResetThrowErrors` are true.
|
|
713
|
+
* @throws {FirebaseServerAuthPasswordResetNoResetConfigError} When no reset claims exist and `sendResetThrowErrors` is true.
|
|
714
|
+
*/
|
|
715
|
+
beginPasswordReset(input: FirebaseServerAuthInitiatePasswordReset<D>): Promise<FirebaseServerAuthResetUserPasswordClaims>;
|
|
716
|
+
/**
|
|
717
|
+
* Sends reset content (e.g., a reset email) to the user.
|
|
718
|
+
*
|
|
719
|
+
* Respects throttling and send-once constraints from the config. Returns `true` if
|
|
720
|
+
* content was actually sent, `false` if skipped due to throttling or send-once rules.
|
|
721
|
+
*
|
|
722
|
+
* @param uid - The target user's UID.
|
|
723
|
+
* @param config - Optional delivery configuration.
|
|
724
|
+
* @throws {FirebaseServerAuthPasswordResetThrottleError} When throttled and `throwErrors` is true.
|
|
725
|
+
* @throws {FirebaseServerAuthPasswordResetSendOnceError} When already sent and `sendResetDetailsOnce` + `throwErrors` are true.
|
|
726
|
+
* @throws {FirebaseServerAuthPasswordResetNoResetConfigError} When no reset claims exist and `throwErrors` is true.
|
|
727
|
+
*/
|
|
728
|
+
sendResetContent(uid: FirebaseAuthUserId, config?: FirebaseServerAuthPasswordResetSendContentConfig<D>): Promise<boolean>;
|
|
729
|
+
/**
|
|
730
|
+
* Loads the reset details for the user if they are in the reset phase.
|
|
731
|
+
*
|
|
732
|
+
* @param uid - The target user's UID.
|
|
733
|
+
* @param config - Optional config to forward to the details.
|
|
734
|
+
* @returns The reset details, or `undefined` if the user does not exist or has no reset claims.
|
|
735
|
+
*/
|
|
736
|
+
loadResetDetails(uid: FirebaseAuthUserId, config?: FirebaseServerAuthPasswordResetSendContentConfig<D>): Promise<Maybe<FirebaseServerAuthPasswordResetDetails<U, D>>>;
|
|
737
|
+
/**
|
|
738
|
+
* Loads the reset details for a user context that is already resolved.
|
|
739
|
+
*
|
|
740
|
+
* @param userContext - The resolved user context.
|
|
741
|
+
* @param config - Optional config to forward to the details.
|
|
742
|
+
* @returns The reset details, or `undefined` if the user has no reset claims.
|
|
743
|
+
*/
|
|
744
|
+
loadResetDetailsForUserContext(userContext: U, config?: FirebaseServerAuthPasswordResetSendContentConfig<D>): Promise<Maybe<FirebaseServerAuthPasswordResetDetails<U, D>>>;
|
|
745
|
+
/**
|
|
746
|
+
* Completes the password reset by verifying the temporary reset code against the user's
|
|
747
|
+
* claims and setting the new password. Clears reset claims on success.
|
|
748
|
+
*
|
|
749
|
+
* @param uid - The target user's UID.
|
|
750
|
+
* @param input - The reset code and new password.
|
|
751
|
+
* @throws {FirebaseServerAuthPasswordResetInvalidCodeError} When the reset code is invalid or no reset is active.
|
|
752
|
+
*/
|
|
753
|
+
completePasswordReset(uid: FirebaseAuthUserId, input: FirebaseServerAuthCompletePasswordResetInput): Promise<admin.auth.UserRecord>;
|
|
754
|
+
}
|
|
755
|
+
/**
|
|
756
|
+
* Default throttle duration (1 hour) between reset content sends to prevent spam.
|
|
757
|
+
*
|
|
758
|
+
* Used by {@link AbstractFirebaseServerUserPasswordResetService.sendResetContent} to rate-limit delivery.
|
|
759
|
+
*/
|
|
760
|
+
export declare const DEFAULT_RESET_COM_THROTTLE_TIME: number;
|
|
761
|
+
/**
|
|
762
|
+
* Base implementation of {@link FirebaseServerUserPasswordResetService} that handles reset initiation,
|
|
763
|
+
* claims management, throttled reset content delivery, and reset completion.
|
|
764
|
+
*
|
|
765
|
+
* Subclasses must implement {@link sendPasswordResetContentToUser} to define how reset content
|
|
766
|
+
* (e.g., reset email, SMS) is delivered to the user.
|
|
767
|
+
*
|
|
768
|
+
* @example
|
|
769
|
+
* ```typescript
|
|
770
|
+
* export class MyPasswordResetService extends AbstractFirebaseServerUserPasswordResetService<MyUserContext> {
|
|
771
|
+
* protected async sendPasswordResetContentToUser(details: FirebaseServerAuthPasswordResetDetails<MyUserContext>): Promise<void> {
|
|
772
|
+
* await this.emailService.sendResetEmail(details.userContext.uid, details.claims.resetPassword);
|
|
773
|
+
* }
|
|
774
|
+
* }
|
|
775
|
+
* ```
|
|
776
|
+
*/
|
|
777
|
+
export declare abstract class AbstractFirebaseServerUserPasswordResetService<U extends FirebaseServerAuthUserContext = FirebaseServerAuthUserContext, C extends FirebaseServerAuthContext = FirebaseServerAuthContext, D = unknown> implements FirebaseServerUserPasswordResetService<D, U> {
|
|
778
|
+
private readonly _authService;
|
|
779
|
+
/**
|
|
780
|
+
* Minimum time between reset content sends. Defaults to {@link DEFAULT_RESET_COM_THROTTLE_TIME} (1 hour).
|
|
781
|
+
* Override in subclasses to customize the throttle window.
|
|
782
|
+
*/
|
|
783
|
+
protected resetThrottleTime: Milliseconds;
|
|
784
|
+
constructor(authService: FirebaseServerAuthService<U, C>);
|
|
785
|
+
get authService(): FirebaseServerAuthService<U, C>;
|
|
786
|
+
beginPasswordReset(input: FirebaseServerAuthInitiatePasswordReset<D>): Promise<FirebaseServerAuthResetUserPasswordClaims>;
|
|
787
|
+
sendResetContent(uid: FirebaseAuthUserId, config?: FirebaseServerAuthPasswordResetSendContentConfig<D>): Promise<boolean>;
|
|
788
|
+
loadResetDetails(uid: FirebaseAuthUserId, config?: FirebaseServerAuthPasswordResetSendContentConfig<D>): Promise<Maybe<FirebaseServerAuthPasswordResetDetails<U, D>>>;
|
|
789
|
+
loadResetDetailsForUserContext(userContext: U, config?: FirebaseServerAuthPasswordResetSendContentConfig<D>): Promise<Maybe<FirebaseServerAuthPasswordResetDetails<U, D>>>;
|
|
790
|
+
/**
|
|
791
|
+
* Records the current timestamp as the last reset content communication date in the user's claims.
|
|
792
|
+
*
|
|
793
|
+
* @param details - The user's reset details containing the user context.
|
|
794
|
+
*/
|
|
795
|
+
protected updateResetContentSentTime(details: FirebaseServerAuthPasswordResetDetails<U, D>): Promise<void>;
|
|
796
|
+
completePasswordReset(uid: FirebaseAuthUserId, input: FirebaseServerAuthCompletePasswordResetInput): Promise<admin.auth.UserRecord>;
|
|
797
|
+
/**
|
|
798
|
+
* Delivers reset content (e.g., reset email, SMS) to the user.
|
|
799
|
+
*
|
|
800
|
+
* Subclasses must implement this to define the actual delivery mechanism.
|
|
801
|
+
*
|
|
802
|
+
* @param details - The user's reset details, including their context and reset claims.
|
|
803
|
+
*/
|
|
804
|
+
protected abstract sendPasswordResetContentToUser(details: FirebaseServerAuthPasswordResetDetails<U, D>): Promise<void>;
|
|
805
|
+
}
|
|
806
|
+
/**
|
|
807
|
+
* No-op implementation of {@link AbstractFirebaseServerUserPasswordResetService} that skips sending reset content.
|
|
808
|
+
*
|
|
809
|
+
* Used as the default {@link FirebaseServerUserPasswordResetService} when no custom delivery mechanism is configured.
|
|
810
|
+
*/
|
|
811
|
+
export declare class NoContentFirebaseServerUserPasswordResetService<U extends FirebaseServerAuthUserContext = FirebaseServerAuthUserContext> extends AbstractFirebaseServerUserPasswordResetService<U> {
|
|
812
|
+
protected sendPasswordResetContentToUser(_details: FirebaseServerAuthPasswordResetDetails<U>): Promise<void>;
|
|
813
|
+
}
|
|
586
814
|
/**
|
|
587
815
|
* Reference to a FirebaseServerAuthService
|
|
588
816
|
*/
|
|
@@ -686,6 +914,10 @@ export declare abstract class FirebaseServerAuthService<U extends FirebaseServer
|
|
|
686
914
|
* Returns a {@link FirebaseServerNewUserService} for programmatic user creation and setup management.
|
|
687
915
|
*/
|
|
688
916
|
abstract newUser(): FirebaseServerNewUserService;
|
|
917
|
+
/**
|
|
918
|
+
* Returns a {@link FirebaseServerUserPasswordResetService} for managing password reset flows.
|
|
919
|
+
*/
|
|
920
|
+
abstract passwordReset(): FirebaseServerUserPasswordResetService;
|
|
689
921
|
/**
|
|
690
922
|
* Converts a Firebase Admin {@link admin.auth.UserRecord} into a normalized {@link FirebaseAuthDetails} object.
|
|
691
923
|
*
|
|
@@ -735,6 +967,7 @@ export declare abstract class AbstractFirebaseServerAuthService<U extends Fireba
|
|
|
735
967
|
abstract readRoles(claims: AuthClaims): AuthRoleSet;
|
|
736
968
|
abstract claimsForRoles(roles: AuthRoleSet): AuthClaimsUpdate;
|
|
737
969
|
newUser(): FirebaseServerNewUserService;
|
|
970
|
+
passwordReset(): FirebaseServerUserPasswordResetService;
|
|
738
971
|
authContextInfo(context: AuthDataRef): Maybe<FirebaseAuthContextInfo>;
|
|
739
972
|
authDetailsForRecord(record: admin.auth.UserRecord): FirebaseAuthDetails;
|
|
740
973
|
}
|