From adbf7c6f5e818254a97b8d73b708d25d8573dac6 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 28 Jan 2023 11:15:24 +0100 Subject: [PATCH 1/8] Fix twitter badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e721d8a1..e86c5156 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Latest Stable Version](https://img.shields.io/github/release/shlinkio/shlink.svg?style=flat-square)](https://packagist.org/packages/shlinkio/shlink) [![Docker pulls](https://img.shields.io/docker/pulls/shlinkio/shlink.svg?logo=docker&style=flat-square)](https://hub.docker.com/r/shlinkio/shlink/) [![License](https://img.shields.io/github/license/shlinkio/shlink.svg?style=flat-square)](https://github.com/shlinkio/shlink/blob/main/LICENSE) -[![Twitter](https://img.shields.io/twitter/follow/shlinkio?color=blue&label=follow&logo=twitter&style=flat-square)](https://twitter.com/shlinkio) +[![Twitter](https://img.shields.io/badge/follow-shlinkio-blue.svg?style=flat-square&logo=twitter&color=blue)](https://twitter.com/shlinkio) [![Mastodon](https://img.shields.io/mastodon/follow/109329425426175098?color=%236364ff&domain=https%3A%2F%2Ffosstodon.org&label=follow&logo=mastodon&logoColor=white&style=flat-square)](https://fosstodon.org/@shlinkio) [![Paypal donate](https://img.shields.io/badge/Donate-paypal-blue.svg?style=flat-square&logo=paypal&colorA=aaaaaa)](https://slnk.to/donate) From c140db16d1d9c94f71cb151d60295a4364e0b9b0 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 29 Jan 2023 09:53:47 +0100 Subject: [PATCH 2/8] Improve issue templates requesting roadrunner when appropriate --- .github/ISSUE_TEMPLATE.md | 2 +- .github/ISSUE_TEMPLATE/Bug.md | 8 ++++---- .github/ISSUE_TEMPLATE/Feature_Request.md | 2 +- .github/ISSUE_TEMPLATE/Question_Support.md | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 36d052d5..9a7f121f 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,7 +1,7 @@ diff --git a/.github/ISSUE_TEMPLATE/Bug.md b/.github/ISSUE_TEMPLATE/Bug.md index 9999a699..9d8b644c 100644 --- a/.github/ISSUE_TEMPLATE/Bug.md +++ b/.github/ISSUE_TEMPLATE/Bug.md @@ -7,18 +7,18 @@ labels: bug -#### How Shlink is set-up +#### How Shlink is set up * Shlink Version: x.y.z * PHP Version: x.y.z -* How do you serve Shlink: Self-hosted Apache|Self-hosted nginx|Self-hosted openswoole|Docker image +* How do you serve Shlink: Self-hosted Apache|Self-hosted nginx|Self-hosted openswoole|Self-hosted RoadRunner|Openswoole Docker image|RoadRunner Docker image * Database engine used: MySQL|MariaDB|PostgreSQL|MicrosoftSQL|SQLite (x.y.z) #### Summary @@ -31,7 +31,7 @@ With that said, please fill in the information requested next. More information #### Expected behavior - + #### How to reproduce diff --git a/.github/ISSUE_TEMPLATE/Feature_Request.md b/.github/ISSUE_TEMPLATE/Feature_Request.md index 7aa11cd2..dcfc37ad 100644 --- a/.github/ISSUE_TEMPLATE/Feature_Request.md +++ b/.github/ISSUE_TEMPLATE/Feature_Request.md @@ -7,7 +7,7 @@ labels: feature -#### How Shlink is set-up +#### How Shlink is set up * Shlink Version: x.y.z * PHP Version: x.y.z -* How do you serve Shlink: Self-hosted Apache|Self-hosted nginx|Self-hosted openswoole|Docker image +* How do you serve Shlink: Self-hosted Apache|Self-hosted nginx|Self-hosted openswoole|Self-hosted RoadRunner|Openswoole Docker image|RoadRunner Docker image * Database engine used: MySQL|MariaDB|PostgreSQL|MicrosoftSQL|SQLite (x.y.z) #### Summary From d847c7648e2b925d97a84107b3b5e9d323d873fd Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 29 Jan 2023 10:29:26 +0100 Subject: [PATCH 3/8] Rename loosely mode to loose mode --- CHANGELOG.md | 21 +++++++++++++++++-- config/autoload/url-shortener.global.php | 2 +- .../Core/src/Options/UrlShortenerOptions.php | 4 ++-- .../Core/src/ShortUrl/Model/ShortUrlMode.php | 8 ++++++- .../Model/Validation/CustomSlugFilter.php | 2 +- .../Repository/ShortUrlRepositoryTest.php | 6 +++--- .../test/ShortUrl/Entity/ShortUrlTest.php | 4 ++-- .../ShortUrl/Model/ShortUrlCreationTest.php | 8 +++---- 8 files changed, 39 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd0c8222..265b419d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com), and this project adheres to [Semantic Versioning](https://semver.org). +## [Unreleased] +### Added +* *Nothing* + +### Changed +* [#1685](https://github.com/shlinkio/shlink/issues/1685) Changed `loosely` mode to `loose`, as it was a typo. The old one keeps working and maps to the new one, but it's considered deprecated. + +### Deprecated +* *Nothing* + +### Removed +* *Nothing* + +### Fixed +* *Nothing* + + ## [3.5.0] - 2023-01-28 ### Added * [#1557](https://github.com/shlinkio/shlink/issues/1557) Added support to dynamically redirect to different long URLs based on the visitor's device type. @@ -25,9 +42,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com), and this * [#1662](https://github.com/shlinkio/shlink/issues/1662) Added support to provide openswoole-specific config options via env vars prefixed with `OPENSWOOLE_`. * [#1389](https://github.com/shlinkio/shlink/issues/1389) and [#706](https://github.com/shlinkio/shlink/issues/706) Added support for case-insensitive short URLs. - In order to achieve this, a new env var/config option has been implemented (`SHORT_URL_MODE`), which allows either `strict` or `loosely`. + In order to achieve this, a new env var/config option has been implemented (`SHORT_URL_MODE`), which allows either `strict` or ~~`loosely`~~ `loose`. - Default value is `strict`, but if `loosely` is provided, then short URLs will be matched in a case-insensitive way, and new short URLs will be generated with short-codes in lowercase only. + Default value is `strict`, but if `loose` is provided, then short URLs will be matched in a case-insensitive way, and new short URLs will be generated with short-codes in lowercase only. ### Changed * *Nothing* diff --git a/config/autoload/url-shortener.global.php b/config/autoload/url-shortener.global.php index 2816577d..2a121bee 100644 --- a/config/autoload/url-shortener.global.php +++ b/config/autoload/url-shortener.global.php @@ -14,7 +14,7 @@ return (static function (): array { MIN_SHORT_CODES_LENGTH, ); $modeFromEnv = EnvVars::SHORT_URL_MODE->loadFromEnv(ShortUrlMode::STRICT->value); - $mode = ShortUrlMode::tryFrom($modeFromEnv) ?? ShortUrlMode::STRICT; + $mode = ShortUrlMode::tryDeprecated($modeFromEnv) ?? ShortUrlMode::STRICT; return [ diff --git a/module/Core/src/Options/UrlShortenerOptions.php b/module/Core/src/Options/UrlShortenerOptions.php index 98597bad..6e6ac087 100644 --- a/module/Core/src/Options/UrlShortenerOptions.php +++ b/module/Core/src/Options/UrlShortenerOptions.php @@ -22,8 +22,8 @@ final class UrlShortenerOptions ) { } - public function isLooselyMode(): bool + public function isLooseMode(): bool { - return $this->mode === ShortUrlMode::LOOSELY; + return $this->mode === ShortUrlMode::LOOSE; } } diff --git a/module/Core/src/ShortUrl/Model/ShortUrlMode.php b/module/Core/src/ShortUrl/Model/ShortUrlMode.php index 41698e18..d359e8cc 100644 --- a/module/Core/src/ShortUrl/Model/ShortUrlMode.php +++ b/module/Core/src/ShortUrl/Model/ShortUrlMode.php @@ -5,5 +5,11 @@ namespace Shlinkio\Shlink\Core\ShortUrl\Model; enum ShortUrlMode: string { case STRICT = 'strict'; - case LOOSELY = 'loosely'; + case LOOSE = 'loose'; + + /** @deprecated */ + public static function tryDeprecated(string $mode): ?self + { + return $mode === 'loosely' ? self::LOOSE : self::tryFrom($mode); + } } diff --git a/module/Core/src/ShortUrl/Model/Validation/CustomSlugFilter.php b/module/Core/src/ShortUrl/Model/Validation/CustomSlugFilter.php index ec0b30d3..d7012bf1 100644 --- a/module/Core/src/ShortUrl/Model/Validation/CustomSlugFilter.php +++ b/module/Core/src/ShortUrl/Model/Validation/CustomSlugFilter.php @@ -24,7 +24,7 @@ class CustomSlugFilter implements FilterInterface return $value; } - $value = $this->options->isLooselyMode() ? strtolower($value) : $value; + $value = $this->options->isLooseMode() ? strtolower($value) : $value; return (match ($this->options->multiSegmentSlugsEnabled) { true => trim(str_replace(' ', '-', $value), '/'), false => str_replace([' ', '/'], '-', $value), diff --git a/module/Core/test-db/ShortUrl/Repository/ShortUrlRepositoryTest.php b/module/Core/test-db/ShortUrl/Repository/ShortUrlRepositoryTest.php index dd0cc4f0..5f47ffb3 100644 --- a/module/Core/test-db/ShortUrl/Repository/ShortUrlRepositoryTest.php +++ b/module/Core/test-db/ShortUrl/Repository/ShortUrlRepositoryTest.php @@ -55,13 +55,13 @@ class ShortUrlRepositoryTest extends DatabaseTestCase )); self::assertSame($regularOne, $this->repo->findOneWithDomainFallback( ShortUrlIdentifier::fromShortCodeAndDomain('foo'), - ShortUrlMode::LOOSELY, + ShortUrlMode::LOOSE, )); self::assertSame($regularOne, $this->repo->findOneWithDomainFallback( ShortUrlIdentifier::fromShortCodeAndDomain('fOo'), - ShortUrlMode::LOOSELY, + ShortUrlMode::LOOSE, )); - // TODO MS is doing loosely checks always, making this fail. + // TODO MS is doing loose checks always, making this fail. if (! $this->getEntityManager()->getConnection()->getDatabasePlatform() instanceof SQLServerPlatform) { self::assertNull($this->repo->findOneWithDomainFallback( ShortUrlIdentifier::fromShortCodeAndDomain('foo'), diff --git a/module/Core/test/ShortUrl/Entity/ShortUrlTest.php b/module/Core/test/ShortUrl/Entity/ShortUrlTest.php index b69b369a..8b40baca 100644 --- a/module/Core/test/ShortUrl/Entity/ShortUrlTest.php +++ b/module/Core/test/ShortUrl/Entity/ShortUrlTest.php @@ -139,7 +139,7 @@ class ShortUrlTest extends TestCase } /** @test */ - public function generatesLowercaseOnlyShortCodesInLooselyMode(): void + public function generatesLowercaseOnlyShortCodesInLooseMode(): void { $range = range(1, 1000); // Use a "big" number to reduce false negatives $allFor = static fn (ShortUrlMode $mode): bool => every($range, static function () use ($mode): bool { @@ -152,7 +152,7 @@ class ShortUrlTest extends TestCase return $shortCode === strtolower($shortCode); }); - self::assertTrue($allFor(ShortUrlMode::LOOSELY)); + self::assertTrue($allFor(ShortUrlMode::LOOSE)); self::assertFalse($allFor(ShortUrlMode::STRICT)); } } diff --git a/module/Core/test/ShortUrl/Model/ShortUrlCreationTest.php b/module/Core/test/ShortUrl/Model/ShortUrlCreationTest.php index 9582180b..904dab01 100644 --- a/module/Core/test/ShortUrl/Model/ShortUrlCreationTest.php +++ b/module/Core/test/ShortUrl/Model/ShortUrlCreationTest.php @@ -140,20 +140,20 @@ class ShortUrlCreationTest extends TestCase { yield ['πŸ”₯', 'πŸ”₯']; yield ['🦣 πŸ…', '🦣-πŸ…']; - yield ['🦣 πŸ…', '🦣-πŸ…', false, ShortUrlMode::LOOSELY]; + yield ['🦣 πŸ…', '🦣-πŸ…', false, ShortUrlMode::LOOSE]; yield ['foobar', 'foobar']; yield ['foo bar', 'foo-bar']; yield ['foo bar baz', 'foo-bar-baz']; yield ['foo bar-baz', 'foo-bar-baz']; - yield ['foo BAR-baz', 'foo-bar-baz', false, ShortUrlMode::LOOSELY]; + yield ['foo BAR-baz', 'foo-bar-baz', false, ShortUrlMode::LOOSE]; yield ['foo/bar/baz', 'foo/bar/baz', true]; yield ['/foo/bar/baz', 'foo/bar/baz', true]; - yield ['/foo/baR/baZ', 'foo/bar/baz', true, ShortUrlMode::LOOSELY]; + yield ['/foo/baR/baZ', 'foo/bar/baz', true, ShortUrlMode::LOOSE]; yield ['foo/bar/baz', 'foo-bar-baz']; yield ['/foo/bar/baz', '-foo-bar-baz']; yield ['wp-admin.php', 'wp-admin.php']; yield ['UPPER_lower', 'UPPER_lower']; - yield ['UPPER_lower', 'upper_lower', false, ShortUrlMode::LOOSELY]; + yield ['UPPER_lower', 'upper_lower', false, ShortUrlMode::LOOSE]; yield ['more~url_special.chars', 'more~url_special.chars']; yield ['ꡬ글', 'ꡬ글']; yield ['グーグル', 'グーグル']; From 8afa582aa5ee869f041d6002bb58c57a94aeb6da Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 29 Jan 2023 11:32:13 +0100 Subject: [PATCH 4/8] Create ShortUrlModeTest --- .../test/ShortUrl/Model/ShortUrlModeTest.php | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 module/Core/test/ShortUrl/Model/ShortUrlModeTest.php diff --git a/module/Core/test/ShortUrl/Model/ShortUrlModeTest.php b/module/Core/test/ShortUrl/Model/ShortUrlModeTest.php new file mode 100644 index 00000000..18aa2d54 --- /dev/null +++ b/module/Core/test/ShortUrl/Model/ShortUrlModeTest.php @@ -0,0 +1,29 @@ + ['invalid', null]; + yield 'foo' => ['foo', null]; + yield 'loose' => ['loose', ShortUrlMode::LOOSE]; + yield 'loosely' => ['loosely', ShortUrlMode::LOOSE]; + yield 'strict' => ['strict', ShortUrlMode::STRICT]; + } +} From a52d0cd41951bca7a18ca12086d9c2567ad2aeeb Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Mon, 30 Jan 2023 10:49:47 +0100 Subject: [PATCH 5/8] Ensure short_code column is case sensitive in Microsoft SQL server --- data/migrations/Version20230130090946.php | 49 +++++++++++++++++++ module/Core/src/ShortUrl/Entity/ShortUrl.php | 16 +++--- .../Repository/ShortUrlRepositoryTest.php | 12 ++--- 3 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 data/migrations/Version20230130090946.php diff --git a/data/migrations/Version20230130090946.php b/data/migrations/Version20230130090946.php new file mode 100644 index 00000000..4c78788b --- /dev/null +++ b/data/migrations/Version20230130090946.php @@ -0,0 +1,49 @@ +skipIf(! $this->isMsSql(), 'This only sets MsSQL-specific database options'); + + $shortUrls = $schema->getTable('short_urls'); + $shortCode = $shortUrls->getColumn('short_code'); + // Drop the unique index before changing the collation, as the field is part of this index + $shortUrls->dropIndex('unique_short_code_plus_domain'); + $shortCode->setPlatformOption('collation', 'Latin1_General_CS_AS'); + } + + public function postUp(Schema $schema): void + { + if ($this->isMsSql()) { + // The index needs to be re-created in postUp, but here, we can only use statements run against the + // connection directly + $this->connection->executeStatement( + 'CREATE INDEX unique_short_code_plus_domain ON short_urls (domain_id, short_code);', + ); + } + } + + public function down(Schema $schema): void + { + // No down + } + + public function isTransactional(): bool + { + return false; + } + + private function isMsSql(): bool + { + return $this->connection->getDatabasePlatform() instanceof SQLServerPlatform; + } +} diff --git a/module/Core/src/ShortUrl/Entity/ShortUrl.php b/module/Core/src/ShortUrl/Entity/ShortUrl.php index 0328923a..15f1998c 100644 --- a/module/Core/src/ShortUrl/Entity/ShortUrl.php +++ b/module/Core/src/ShortUrl/Entity/ShortUrl.php @@ -39,8 +39,8 @@ class ShortUrl extends AbstractEntity private string $longUrl; private string $shortCode; private Chronos $dateCreated; - /** @var Collection */ - private Collection $visits; + /** @var Collection & Selectable */ + private Collection & Selectable $visits; /** @var Collection */ private Collection $deviceLongUrls; /** @var Collection */ @@ -255,23 +255,19 @@ class ShortUrl extends AbstractEntity public function mostRecentImportedVisitDate(): ?Chronos { - /** @var Selectable $visits */ - $visits = $this->visits; $criteria = Criteria::create()->where(Criteria::expr()->eq('type', VisitType::IMPORTED)) ->orderBy(['id' => 'DESC']) ->setMaxResults(1); + $visit = $this->visits->matching($criteria)->last(); - /** @var Visit|false $visit */ - $visit = $visits->matching($criteria)->last(); - - return $visit === false ? null : $visit->getDate(); + return $visit instanceof Visit ? $visit->getDate() : null; } /** - * @param Collection $visits + * @param Collection & Selectable $visits * @internal */ - public function setVisits(Collection $visits): self + public function setVisits(Collection & Selectable $visits): self { $this->visits = $visits; return $this; diff --git a/module/Core/test-db/ShortUrl/Repository/ShortUrlRepositoryTest.php b/module/Core/test-db/ShortUrl/Repository/ShortUrlRepositoryTest.php index 5f47ffb3..31cac3dc 100644 --- a/module/Core/test-db/ShortUrl/Repository/ShortUrlRepositoryTest.php +++ b/module/Core/test-db/ShortUrl/Repository/ShortUrlRepositoryTest.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace ShlinkioDbTest\Shlink\Core\ShortUrl\Repository; use Cake\Chronos\Chronos; -use Doctrine\DBAL\Platforms\SQLServerPlatform; use Shlinkio\Shlink\Core\Domain\Entity\Domain; use Shlinkio\Shlink\Core\ShortUrl\Entity\ShortUrl; use Shlinkio\Shlink\Core\ShortUrl\Model\ShortUrlCreation; @@ -61,13 +60,10 @@ class ShortUrlRepositoryTest extends DatabaseTestCase ShortUrlIdentifier::fromShortCodeAndDomain('fOo'), ShortUrlMode::LOOSE, )); - // TODO MS is doing loose checks always, making this fail. - if (! $this->getEntityManager()->getConnection()->getDatabasePlatform() instanceof SQLServerPlatform) { - self::assertNull($this->repo->findOneWithDomainFallback( - ShortUrlIdentifier::fromShortCodeAndDomain('foo'), - ShortUrlMode::STRICT, - )); - } + self::assertNull($this->repo->findOneWithDomainFallback( + ShortUrlIdentifier::fromShortCodeAndDomain('foo'), + ShortUrlMode::STRICT, + )); self::assertSame($regularOne, $this->repo->findOneWithDomainFallback( ShortUrlIdentifier::fromShortCodeAndDomain($withDomainDuplicatingRegular->getShortCode()), ShortUrlMode::STRICT, From 8fa4219b307e399a729fd35e2ce64a85fa939679 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Mon, 30 Jan 2023 10:50:47 +0100 Subject: [PATCH 6/8] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 265b419d..c03274f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com), and this * *Nothing* ### Fixed -* *Nothing* +* [#1682](https://github.com/shlinkio/shlink/issues/1682) Fixed incorrect case-insensitive checks in short URLs when using Microsoft SQL server. ## [3.5.0] - 2023-01-28 From fb572d5abbd1b74d7a697c77205678b43d434b81 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Mon, 30 Jan 2023 10:52:07 +0100 Subject: [PATCH 7/8] Fix accidentally removed statement in new migration --- data/migrations/Version20230130090946.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/migrations/Version20230130090946.php b/data/migrations/Version20230130090946.php index 4c78788b..49e6d9bb 100644 --- a/data/migrations/Version20230130090946.php +++ b/data/migrations/Version20230130090946.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace ShlinkMigrations; +use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\DBAL\Platforms\SQLServerPlatform; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -39,7 +40,7 @@ final class Version20230130090946 extends AbstractMigration public function isTransactional(): bool { - return false; + return ! ($this->connection->getDatabasePlatform() instanceof MySQLPlatform); } private function isMsSql(): bool From 0d7dc5067073a6254fd5e8bbe559a4e989c9be02 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 4 Feb 2023 17:40:38 +0100 Subject: [PATCH 8/8] Update to latest shlink-common including the cache clear fix for redis replication --- CHANGELOG.md | 3 ++- composer.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c03274f6..b0fc56c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com), and this project adheres to [Semantic Versioning](https://semver.org). -## [Unreleased] +## [3.5.1] - 2023-02-04 ### Added * *Nothing* @@ -19,6 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com), and this ### Fixed * [#1682](https://github.com/shlinkio/shlink/issues/1682) Fixed incorrect case-insensitive checks in short URLs when using Microsoft SQL server. +* [#1684](https://github.com/shlinkio/shlink/issues/1684) Fixed entities metadata cache not being cleared at docker container start-up when using redis with replication. ## [3.5.0] - 2023-01-28 diff --git a/composer.json b/composer.json index ef47eced..228a2c5f 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,7 @@ "php-middleware/request-id": "^4.1", "pugx/shortid-php": "^1.1", "ramsey/uuid": "^4.5", - "shlinkio/shlink-common": "^5.3", + "shlinkio/shlink-common": "^5.3.1", "shlinkio/shlink-config": "^2.4", "shlinkio/shlink-event-dispatcher": "^2.6", "shlinkio/shlink-importer": "^5.0",