@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.
@@ -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.AbstractFirebaseServerNewUserService);
430
+ (firebaseServer.AbstractFirebaseServerUserPasswordResetService);
342
431
 
343
432
  exports.AbstractMailgunContentFirebaseServerNewUserService = AbstractMailgunContentFirebaseServerNewUserService;
433
+ exports.AbstractMailgunContentFirebaseServerUserPasswordResetService = AbstractMailgunContentFirebaseServerUserPasswordResetService;
@@ -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
- (AbstractFirebaseServerNewUserService);
428
+ (AbstractFirebaseServerUserPasswordResetService);
340
429
 
341
- export { AbstractMailgunContentFirebaseServerNewUserService };
430
+ export { AbstractMailgunContentFirebaseServerNewUserService, AbstractMailgunContentFirebaseServerUserPasswordResetService };
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/mailgun",
3
- "version": "13.7.0",
3
+ "version": "13.8.0",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.7.0",
6
- "@dereekb/firebase": "13.7.0",
7
- "@dereekb/firebase-server": "13.7.0",
8
- "@dereekb/date": "13.7.0",
9
- "@dereekb/nestjs": "13.7.0",
10
- "@dereekb/model": "13.7.0",
11
- "@dereekb/rxjs": "13.7.0",
12
- "@dereekb/util": "13.7.0"
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
+ }
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/model",
3
- "version": "13.7.0",
3
+ "version": "13.8.0",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.7.0",
6
- "@dereekb/date": "13.7.0",
7
- "@dereekb/firebase": "13.7.0",
8
- "@dereekb/firebase-server": "13.7.0",
9
- "@dereekb/model": "13.7.0",
10
- "@dereekb/nestjs": "13.7.0",
11
- "@dereekb/rxjs": "13.7.0",
12
- "@dereekb/util": "13.7.0",
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.3",
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.7.0",
3
+ "version": "13.8.0",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.7.0",
6
- "@dereekb/date": "13.7.0",
7
- "@dereekb/firebase": "13.7.0",
8
- "@dereekb/firebase-server": "13.7.0",
9
- "@dereekb/model": "13.7.0",
10
- "@dereekb/nestjs": "13.7.0",
11
- "@dereekb/rxjs": "13.7.0",
12
- "@dereekb/util": "13.7.0",
13
- "@dereekb/zoho": "13.7.0",
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.3",
15
+ "@nestjs/config": "^4.0.4",
16
16
  "express": "^5.0.0",
17
- "firebase-admin": "^13.0.0",
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.7.0",
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.7.0",
47
- "@dereekb/date": "13.7.0",
48
- "@dereekb/dbx-core": "13.7.0",
49
- "@dereekb/firebase": "13.7.0",
50
- "@dereekb/model": "13.7.0",
51
- "@dereekb/nestjs": "13.7.0",
52
- "@dereekb/rxjs": "13.7.0",
53
- "@dereekb/util": "13.7.0",
54
- "@dereekb/zoho": "13.7.0",
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.3",
59
- "@nestjs/core": "^11.1.17",
60
- "@nestjs/platform-express": "^11.1.17",
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.0.0",
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
  }