Skip to content

Commit 4be2466

Browse files
committed
Improve type safety with strict union types
1 parent 08a3d3d commit 4be2466

6 files changed

Lines changed: 42 additions & 44 deletions

File tree

UPGRADE-8.0.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ The following list has been generated with [roave/backward-compatibility-check](
4141
[BC] CHANGED: Default parameter value for parameter $code of Kreait\Firebase\Exception\Database\TransactionFailed#__construct() changed from 0 to NULL
4242
[BC] CHANGED: Default parameter value for parameter $code of Kreait\Firebase\Exception\Database\UnsupportedQuery#__construct() changed from 0 to NULL
4343
[BC] CHANGED: The number of required arguments for Kreait\Firebase\Exception\Database\UnsupportedQuery#__construct() increased from 1 to 2
44+
[BC] CHANGED: The parameter $accessToken of Kreait\Firebase\Contract\Auth#signInWithIdpAccessToken() changed from string to Lcobucci\JWT\Token|string
4445
[BC] CHANGED: The parameter $clearTextPassword of Kreait\Firebase\Contract\Auth#signInWithEmailAndPassword() changed from Stringable|string to a non-contravariant string
4546
[BC] CHANGED: The parameter $clearTextPassword of Kreait\Firebase\Contract\Auth#signInWithEmailAndPassword() changed from Stringable|string to string
4647
[BC] CHANGED: The parameter $clearTextPassword of Kreait\Firebase\Request\EditUserTrait#withClearTextPassword() changed from Stringable|string to a non-contravariant string
@@ -110,6 +111,10 @@ The following list has been generated with [roave/backward-compatibility-check](
110111
[BC] CHANGED: The parameter $providerId of Kreait\Firebase\Contract\Transitional\FederatedUserFetcher#getUserByProviderUid() changed from Stringable|string to string
111112
[BC] CHANGED: The parameter $providerUid of Kreait\Firebase\Contract\Transitional\FederatedUserFetcher#getUserByProviderUid() changed from Stringable|string to a non-contravariant string
112113
[BC] CHANGED: The parameter $providerUid of Kreait\Firebase\Contract\Transitional\FederatedUserFetcher#getUserByProviderUid() changed from Stringable|string to string
114+
[BC] CHANGED: The parameter $redirectUrl of Kreait\Firebase\Contract\Auth#signInWithIdpAccessToken() changed from no type to a non-contravariant string|null
115+
[BC] CHANGED: The parameter $redirectUrl of Kreait\Firebase\Contract\Auth#signInWithIdpAccessToken() changed from no type to string|null
116+
[BC] CHANGED: The parameter $redirectUrl of Kreait\Firebase\Contract\Auth#signInWithIdpIdToken() changed from no type to a non-contravariant string|null
117+
[BC] CHANGED: The parameter $redirectUrl of Kreait\Firebase\Contract\Auth#signInWithIdpIdToken() changed from no type to string|null
113118
[BC] CHANGED: The parameter $uid of Kreait\Firebase\Contract\Auth#changeUserEmail() changed from Stringable|string to a non-contravariant string
114119
[BC] CHANGED: The parameter $uid of Kreait\Firebase\Contract\Auth#changeUserEmail() changed from Stringable|string to string
115120
[BC] CHANGED: The parameter $uid of Kreait\Firebase\Contract\Auth#changeUserPassword() changed from Stringable|string to a non-contravariant string

composer.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,17 @@
4949
"psr/http-message": "^1.1 || ^2.0"
5050
},
5151
"require-dev": {
52-
"php-cs-fixer/shim": "^3.91.2",
5352
"google/cloud-firestore": "^1.54.3",
53+
"php-cs-fixer/shim": "^3.91.2",
5454
"phpstan/extension-installer": "^1.4.3",
5555
"phpstan/phpstan": "^2.1.32",
5656
"phpstan/phpstan-deprecation-rules": "^2.0.3",
57-
"phpstan/phpstan-strict-rules": "^2.0.7",
5857
"phpstan/phpstan-phpunit": "^2.0.8",
58+
"phpstan/phpstan-strict-rules": "^2.0.7",
5959
"phpunit/phpunit": "^12.4.5",
6060
"psr/log": "^3.0.2",
6161
"rector/rector": "^2.2.11",
62+
"rector/type-perfect": "^2.1",
6263
"shipmonk/composer-dependency-analyser": "^1.8.4",
6364
"symfony/var-dumper": "^7.4.0",
6465
"vlucas/phpdotenv": "^5.6.2"

src/Firebase/Auth.php

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ public function setCustomUserClaims(string $uid, ?array $claims): void
362362
$this->client->setCustomUserClaims($uid, $claims);
363363
}
364364

365-
public function createCustomToken(string $uid, array $claims = [], $ttl = 3600): UnencryptedToken
365+
public function createCustomToken(string $uid, array $claims = [], int|DateInterval|string $ttl = 3600): UnencryptedToken
366366
{
367367
if ($this->tokenGenerator === null) {
368368
throw new AuthError('Custom Token Generation is disabled because the current credentials do not permit it');
@@ -395,7 +395,7 @@ public function parseToken(string $tokenString): UnencryptedToken
395395
return $parsedToken;
396396
}
397397

398-
public function verifyIdToken($idToken, bool $checkIfRevoked = false, ?int $leewayInSeconds = null): UnencryptedToken
398+
public function verifyIdToken(Token|string $idToken, bool $checkIfRevoked = false, ?int $leewayInSeconds = null): UnencryptedToken
399399
{
400400
$verifier = $this->idTokenVerifier;
401401

@@ -481,7 +481,7 @@ public function verifyPasswordResetCode(string $oobCode): string
481481
return $responseData['email'];
482482
}
483483

484-
public function confirmPasswordReset(string $oobCode, $newPassword, bool $invalidatePreviousSessions = true): string
484+
public function confirmPasswordReset(string $oobCode, string $newPassword, bool $invalidatePreviousSessions = true): string
485485
{
486486
$newPassword = ClearTextPassword::fromString($newPassword)->value;
487487

@@ -508,7 +508,7 @@ public function revokeRefreshTokens(string $uid): void
508508
$this->client->revokeRefreshTokens($uid);
509509
}
510510

511-
public function unlinkProvider($uid, $provider): UserRecord
511+
public function unlinkProvider(string $uid, array|string $provider): UserRecord
512512
{
513513
$uid = Uid::fromString($uid)->value;
514514

@@ -519,7 +519,7 @@ public function unlinkProvider($uid, $provider): UserRecord
519519
return $this->getUserRecordFromResponseAfterUserUpdate($response);
520520
}
521521

522-
public function signInAsUser($user, ?array $claims = null): SignInResult
522+
public function signInAsUser(UserRecord|string $user, ?array $claims = null): SignInResult
523523
{
524524
$claims ??= [];
525525
$uid = $user instanceof UserRecord ? $user->uid : $user;
@@ -533,7 +533,7 @@ public function signInAsUser($user, ?array $claims = null): SignInResult
533533
return $this->client->handleSignIn(SignInWithCustomToken::fromValue($customToken->toString()));
534534
}
535535

536-
public function signInWithCustomToken($token): SignInResult
536+
public function signInWithCustomToken(Token|string $token): SignInResult
537537
{
538538
$token = $token instanceof Token ? $token->toString() : $token;
539539

@@ -547,15 +547,15 @@ public function signInWithRefreshToken(string $refreshToken): SignInResult
547547
return $this->client->handleSignIn(SignInWithRefreshToken::fromValue($refreshToken));
548548
}
549549

550-
public function signInWithEmailAndPassword($email, $clearTextPassword): SignInResult
550+
public function signInWithEmailAndPassword(string $email, string $clearTextPassword): SignInResult
551551
{
552552
$email = Email::fromString($email)->value;
553553
$clearTextPassword = ClearTextPassword::fromString($clearTextPassword)->value;
554554

555555
return $this->client->handleSignIn(SignInWithEmailAndPassword::fromValues($email, $clearTextPassword));
556556
}
557557

558-
public function signInWithEmailAndOobCode($email, string $oobCode): SignInResult
558+
public function signInWithEmailAndOobCode(string $email, string $oobCode): SignInResult
559559
{
560560
$email = Email::fromString($email)->value;
561561

@@ -578,62 +578,54 @@ public function signInAnonymously(): SignInResult
578578
throw new FailedToSignIn('Failed to sign in anonymously: No ID token or UID available');
579579
}
580580

581-
public function signInWithIdpAccessToken($provider, string $accessToken, $redirectUrl = null, ?string $oauthTokenSecret = null, ?string $linkingIdToken = null, ?string $rawNonce = null): SignInResult
581+
public function signInWithIdpAccessToken(string $provider, Token|string $accessToken, ?string $redirectUrl = null, ?string $oauthTokenSecret = null, ?string $linkingIdToken = null, ?string $rawNonce = null): SignInResult
582582
{
583-
$redirectUrl = trim((string) ($redirectUrl ?? 'http://localhost'));
584-
$linkingIdToken = trim((string) $linkingIdToken);
585-
$oauthTokenSecret = trim((string) $oauthTokenSecret);
586-
$rawNonce = trim((string) $rawNonce);
583+
$accessToken = $accessToken instanceof Token ? $accessToken->toString() : $accessToken;
584+
$redirectUrl = trim($redirectUrl ?? 'http://localhost');
587585

588-
if ($oauthTokenSecret !== '') {
586+
if ($oauthTokenSecret !== null) {
589587
$action = SignInWithIdpCredentials::withAccessTokenAndOauthTokenSecret($provider, $accessToken, $oauthTokenSecret);
590588
} else {
591589
$action = SignInWithIdpCredentials::withAccessToken($provider, $accessToken);
592590
}
593591

594-
if ($linkingIdToken !== '') {
592+
if ($linkingIdToken !== null) {
595593
$action = $action->withLinkingIdToken($linkingIdToken);
596594
}
597595

598-
if ($rawNonce !== '') {
596+
if ($rawNonce !== null) {
599597
$action = $action->withRawNonce($rawNonce);
600598
}
601599

602-
if ($redirectUrl !== '') {
603-
$action = $action->withRequestUri($redirectUrl);
604-
}
600+
$action = $action->withRequestUri($redirectUrl);
605601

606602
return $this->client->handleSignIn($action);
607603
}
608604

609-
public function signInWithIdpIdToken($provider, $idToken, $redirectUrl = null, ?string $linkingIdToken = null, ?string $rawNonce = null): SignInResult
605+
public function signInWithIdpIdToken(string $provider, Token|string $idToken, ?string $redirectUrl = null, ?string $linkingIdToken = null, ?string $rawNonce = null): SignInResult
610606
{
611-
$redirectUrl = trim((string) ($redirectUrl ?? 'http://localhost'));
612-
$linkingIdToken = trim((string) $linkingIdToken);
613-
$rawNonce = trim((string) $rawNonce);
607+
$redirectUrl = trim(($redirectUrl ?? 'http://localhost'));
614608

615609
if ($idToken instanceof Token) {
616610
$idToken = $idToken->toString();
617611
}
618612

619613
$action = SignInWithIdpCredentials::withIdToken($provider, $idToken);
620614

621-
if ($rawNonce !== '') {
615+
if ($rawNonce !== null) {
622616
$action = $action->withRawNonce($rawNonce);
623617
}
624618

625-
if ($linkingIdToken !== '') {
619+
if ($linkingIdToken !== null) {
626620
$action = $action->withLinkingIdToken($linkingIdToken);
627621
}
628622

629-
if ($redirectUrl !== '') {
630-
$action = $action->withRequestUri($redirectUrl);
631-
}
623+
$action = $action->withRequestUri($redirectUrl);
632624

633625
return $this->client->handleSignIn($action);
634626
}
635627

636-
public function createSessionCookie($idToken, $ttl): string
628+
public function createSessionCookie(Token|string $idToken, DateInterval|int $ttl): string
637629
{
638630
if ($idToken instanceof Token) {
639631
$idToken = $idToken->toString();

src/Firebase/Contract/Auth.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
use Kreait\Firebase\Request\UpdateUser;
3030
use Lcobucci\JWT\Token;
3131
use Lcobucci\JWT\UnencryptedToken;
32-
use Psr\Http\Message\UriInterface;
3332
use Traversable;
3433

3534
/**
@@ -440,24 +439,24 @@ public function signInAnonymously(): SignInResult;
440439
* @see https://cloud.google.com/identity-platform/docs/reference/rest/v1/accounts/signInWithIdp
441440
*
442441
* @param non-empty-string $provider
443-
* @param non-empty-string $accessToken
444-
* @param UriInterface|non-empty-string|null $redirectUrl
442+
* @param Token|non-empty-string $accessToken
443+
* @param non-empty-string|null $redirectUrl
445444
* @param non-empty-string|null $oauthTokenSecret
446445
* @param non-empty-string|null $linkingIdToken
447446
* @param non-empty-string|null $rawNonce
448447
*
449448
* @throws FailedToSignIn
450449
*/
451-
public function signInWithIdpAccessToken(string $provider, string $accessToken, $redirectUrl = null, ?string $oauthTokenSecret = null, ?string $linkingIdToken = null, ?string $rawNonce = null): SignInResult;
450+
public function signInWithIdpAccessToken(string $provider, Token|string $accessToken, ?string $redirectUrl = null, ?string $oauthTokenSecret = null, ?string $linkingIdToken = null, ?string $rawNonce = null): SignInResult;
452451

453452
/**
454453
* @param non-empty-string $provider
455454
* @param Token|non-empty-string $idToken
456-
* @param UriInterface|non-empty-string|null $redirectUrl
455+
* @param non-empty-string|null $redirectUrl
457456
* @param non-empty-string|null $linkingIdToken
458457
* @param non-empty-string|null $rawNonce
459458
*
460459
* @throws FailedToSignIn
461460
*/
462-
public function signInWithIdpIdToken(string $provider, Token|string $idToken, $redirectUrl = null, ?string $linkingIdToken = null, ?string $rawNonce = null): SignInResult;
461+
public function signInWithIdpIdToken(string $provider, Token|string $idToken, ?string $redirectUrl = null, ?string $linkingIdToken = null, ?string $rawNonce = null): SignInResult;
463462
}

src/Firebase/Messaging.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Kreait\Firebase\Messaging\AppInstance;
1616
use Kreait\Firebase\Messaging\AppInstanceApiClient;
1717
use Kreait\Firebase\Messaging\Message;
18+
use Kreait\Firebase\Messaging\Messages;
1819
use Kreait\Firebase\Messaging\MessageTarget;
1920
use Kreait\Firebase\Messaging\MulticastSendReport;
2021
use Kreait\Firebase\Messaging\Processor\SetApnsContentAvailableIfNeeded;
@@ -66,7 +67,7 @@ public function send(Message|array $message, bool $validateOnly = false): array
6667
throw $error;
6768
}
6869

69-
public function sendMulticast($message, $registrationTokens, bool $validateOnly = false): MulticastSendReport
70+
public function sendMulticast(Message|array $message, RegistrationTokens|RegistrationToken|array|string $registrationTokens, bool $validateOnly = false): MulticastSendReport
7071
{
7172
$message = $message instanceof Message ? $message : new RawMessageFromArray($message);
7273
$registrationTokens = RegistrationTokens::fromValue($registrationTokens);
@@ -80,7 +81,7 @@ public function sendMulticast($message, $registrationTokens, bool $validateOnly
8081
return $this->sendAll($messages, $validateOnly);
8182
}
8283

83-
public function sendAll($messages, bool $validateOnly = false): MulticastSendReport
84+
public function sendAll(array|Messages $messages, bool $validateOnly = false): MulticastSendReport
8485
{
8586
$messages = $this->ensureMessages($messages);
8687
$requests = $this->createSendRequests($messages, $validateOnly);
@@ -113,12 +114,12 @@ public function sendAll($messages, bool $validateOnly = false): MulticastSendRep
113114
return MulticastSendReport::withItems($sendReports);
114115
}
115116

116-
public function validate($message): array
117+
public function validate(Message|array $message): array
117118
{
118119
return $this->send($message, true);
119120
}
120121

121-
public function validateRegistrationTokens($registrationTokenOrTokens): array
122+
public function validateRegistrationTokens(RegistrationTokens|RegistrationToken|array|string $registrationTokenOrTokens): array
122123
{
123124
$tokens = RegistrationTokens::fromValue($registrationTokenOrTokens);
124125

@@ -136,7 +137,7 @@ public function subscribeToTopic(string|Topic $topic, RegistrationTokens|Registr
136137
return $this->subscribeToTopics([$topic], $registrationTokenOrTokens);
137138
}
138139

139-
public function subscribeToTopics(iterable $topics, $registrationTokenOrTokens): array
140+
public function subscribeToTopics(iterable $topics, RegistrationTokens|RegistrationToken|array|string $registrationTokenOrTokens): array
140141
{
141142
$topicObjects = [];
142143

@@ -166,7 +167,7 @@ public function unsubscribeFromTopics(array $topics, RegistrationTokens|Registra
166167
return $this->appInstanceApi->unsubscribeFromTopics($topics, $tokens);
167168
}
168169

169-
public function unsubscribeFromAllTopics($registrationTokenOrTokens): array
170+
public function unsubscribeFromAllTopics(RegistrationTokens|RegistrationToken|array|string $registrationTokenOrTokens): array
170171
{
171172
$tokens = RegistrationTokens::fromValue($registrationTokenOrTokens);
172173

tests/Integration/AuthTestCase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,7 @@ public function signInWithIdpAccessToken(): void
865865
// I don't know how to retrieve a current user access token programmatically, so we'll
866866
// test the failure case only here
867867
$this->expectException(FailedToSignIn::class);
868-
$this->auth->signInWithIdpAccessToken('google.com', 'invalid', Utils::uriFor('http://localhost'));
868+
$this->auth->signInWithIdpAccessToken('google.com', 'invalid');
869869
}
870870

871871
#[Test]

0 commit comments

Comments
 (0)