From 450b2e7058852044d6257dc98c92b3366cb7e2fc Mon Sep 17 00:00:00 2001 From: Brent Roose Date: Fri, 12 Dec 2025 09:08:56 +0100 Subject: [PATCH 1/5] fix(core): fix class guards not using the autoloader (#1808) --- packages/auth/src/Installer/AuthenticationInstaller.php | 2 +- packages/cache/src/Commands/CacheClearCommand.php | 2 +- packages/cache/src/Commands/CacheStatusCommand.php | 2 +- packages/command-bus/src/HandleAsyncCommand.php | 2 +- packages/command-bus/src/MonitorAsyncCommands.php | 2 +- packages/container/src/Commands/ContainerShowCommand.php | 2 +- packages/container/src/Commands/MakeInitializerCommand.php | 2 +- packages/core/src/Commands/DiscoveryClearCommand.php | 2 +- packages/core/src/Commands/DiscoveryGenerateCommand.php | 2 +- packages/core/src/Commands/DiscoveryStatusCommand.php | 2 +- packages/core/src/Commands/InstallCommand.php | 2 +- packages/core/src/FrameworkKernel.php | 4 ++-- packages/cryptography/src/GenerateSigningKeyCommand.php | 2 +- packages/discovery/src/Commands/MakeDiscoveryCommand.php | 2 +- packages/router/src/Commands/MakeControllerCommand.php | 2 +- packages/router/src/Commands/RoutesCommand.php | 2 +- packages/router/src/Commands/ServeCommand.php | 2 +- packages/view/src/Commands/ClearViewCacheCommand.php | 2 +- packages/view/src/Commands/MakeViewCommand.php | 2 +- 19 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/auth/src/Installer/AuthenticationInstaller.php b/packages/auth/src/Installer/AuthenticationInstaller.php index 547160c30b..d80395421b 100644 --- a/packages/auth/src/Installer/AuthenticationInstaller.php +++ b/packages/auth/src/Installer/AuthenticationInstaller.php @@ -15,7 +15,7 @@ use function Tempest\src_path; use function Tempest\Support\Namespace\to_fqcn; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final class AuthenticationInstaller implements Installer { use PublishesFiles; diff --git a/packages/cache/src/Commands/CacheClearCommand.php b/packages/cache/src/Commands/CacheClearCommand.php index e4022e28ab..f3ad69265e 100644 --- a/packages/cache/src/Commands/CacheClearCommand.php +++ b/packages/cache/src/Commands/CacheClearCommand.php @@ -22,7 +22,7 @@ use function Tempest\Support\arr; use function Tempest\Support\str; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class CacheClearCommand { use HasConsole; diff --git a/packages/cache/src/Commands/CacheStatusCommand.php b/packages/cache/src/Commands/CacheStatusCommand.php index 61e45da515..42158ecb69 100644 --- a/packages/cache/src/Commands/CacheStatusCommand.php +++ b/packages/cache/src/Commands/CacheStatusCommand.php @@ -22,7 +22,7 @@ use function Tempest\Support\arr; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class CacheStatusCommand { use HasConsole; diff --git a/packages/command-bus/src/HandleAsyncCommand.php b/packages/command-bus/src/HandleAsyncCommand.php index a9ea7d6ec9..ee4e9378f8 100644 --- a/packages/command-bus/src/HandleAsyncCommand.php +++ b/packages/command-bus/src/HandleAsyncCommand.php @@ -14,7 +14,7 @@ use function Tempest\Support\arr; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class HandleAsyncCommand { use HasConsole; diff --git a/packages/command-bus/src/MonitorAsyncCommands.php b/packages/command-bus/src/MonitorAsyncCommands.php index 90b44c61dc..03187e00b7 100644 --- a/packages/command-bus/src/MonitorAsyncCommands.php +++ b/packages/command-bus/src/MonitorAsyncCommands.php @@ -13,7 +13,7 @@ use function Tempest\Support\arr; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class MonitorAsyncCommands { use HasConsole; diff --git a/packages/container/src/Commands/ContainerShowCommand.php b/packages/container/src/Commands/ContainerShowCommand.php index a339298af8..0542e21c59 100644 --- a/packages/container/src/Commands/ContainerShowCommand.php +++ b/packages/container/src/Commands/ContainerShowCommand.php @@ -18,7 +18,7 @@ use function Tempest\Support\Str\before_last; use function Tempest\Support\Str\contains; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class ContainerShowCommand { public function __construct( diff --git a/packages/container/src/Commands/MakeInitializerCommand.php b/packages/container/src/Commands/MakeInitializerCommand.php index 81c492d32f..3cdb0eb996 100644 --- a/packages/container/src/Commands/MakeInitializerCommand.php +++ b/packages/container/src/Commands/MakeInitializerCommand.php @@ -13,7 +13,7 @@ use Tempest\Generation\ClassManipulator; use Tempest\Generation\DataObjects\StubFile; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final class MakeInitializerCommand { use PublishesFiles; diff --git a/packages/core/src/Commands/DiscoveryClearCommand.php b/packages/core/src/Commands/DiscoveryClearCommand.php index 34c7badbe0..3b2b4ce519 100644 --- a/packages/core/src/Commands/DiscoveryClearCommand.php +++ b/packages/core/src/Commands/DiscoveryClearCommand.php @@ -8,7 +8,7 @@ use Tempest\Console\ConsoleCommand; use Tempest\Core\DiscoveryCache; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class DiscoveryClearCommand { public function __construct( diff --git a/packages/core/src/Commands/DiscoveryGenerateCommand.php b/packages/core/src/Commands/DiscoveryGenerateCommand.php index e34c1843d8..f9f389a694 100644 --- a/packages/core/src/Commands/DiscoveryGenerateCommand.php +++ b/packages/core/src/Commands/DiscoveryGenerateCommand.php @@ -19,7 +19,7 @@ use function Tempest\env; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class DiscoveryGenerateCommand { use HasConsole; diff --git a/packages/core/src/Commands/DiscoveryStatusCommand.php b/packages/core/src/Commands/DiscoveryStatusCommand.php index 1ede32656e..1f037ff114 100644 --- a/packages/core/src/Commands/DiscoveryStatusCommand.php +++ b/packages/core/src/Commands/DiscoveryStatusCommand.php @@ -15,7 +15,7 @@ use function Tempest\root_path; use function Tempest\Support\str; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class DiscoveryStatusCommand { public function __construct( diff --git a/packages/core/src/Commands/InstallCommand.php b/packages/core/src/Commands/InstallCommand.php index 923112b059..1b49eea046 100644 --- a/packages/core/src/Commands/InstallCommand.php +++ b/packages/core/src/Commands/InstallCommand.php @@ -14,7 +14,7 @@ use function Tempest\Support\arr; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class InstallCommand { use HasConsole; diff --git a/packages/core/src/FrameworkKernel.php b/packages/core/src/FrameworkKernel.php index cfeed988c8..d7514b03bb 100644 --- a/packages/core/src/FrameworkKernel.php +++ b/packages/core/src/FrameworkKernel.php @@ -108,7 +108,7 @@ public function createContainer(): Container public function loadComposer(): self { - if (class_exists(GenericProcessExecutor::class, false)) { + if (class_exists(GenericProcessExecutor::class)) { $processExecutor = new GenericProcessExecutor(); } else { $processExecutor = null; @@ -249,7 +249,7 @@ public function registerExceptionHandler(): self } // TODO: refactor to not have a hard-coded dependency on these exception handlers - if (! class_exists(ConsoleExceptionHandler::class, false) || ! class_exists(HttpExceptionHandler::class, false)) { + if (! class_exists(ConsoleExceptionHandler::class) || ! class_exists(HttpExceptionHandler::class)) { return $this; } diff --git a/packages/cryptography/src/GenerateSigningKeyCommand.php b/packages/cryptography/src/GenerateSigningKeyCommand.php index 488143bf12..fb22a76594 100644 --- a/packages/cryptography/src/GenerateSigningKeyCommand.php +++ b/packages/cryptography/src/GenerateSigningKeyCommand.php @@ -13,7 +13,7 @@ use function Tempest\root_path; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class GenerateSigningKeyCommand { public function __construct( diff --git a/packages/discovery/src/Commands/MakeDiscoveryCommand.php b/packages/discovery/src/Commands/MakeDiscoveryCommand.php index b8379b4ce4..4513949d41 100644 --- a/packages/discovery/src/Commands/MakeDiscoveryCommand.php +++ b/packages/discovery/src/Commands/MakeDiscoveryCommand.php @@ -12,7 +12,7 @@ use Tempest\Generation\ClassManipulator; use Tempest\Generation\DataObjects\StubFile; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final class MakeDiscoveryCommand { use PublishesFiles; diff --git a/packages/router/src/Commands/MakeControllerCommand.php b/packages/router/src/Commands/MakeControllerCommand.php index 683f04fbf8..973f4770de 100644 --- a/packages/router/src/Commands/MakeControllerCommand.php +++ b/packages/router/src/Commands/MakeControllerCommand.php @@ -12,7 +12,7 @@ use Tempest\Generation\DataObjects\StubFile; use Tempest\Router\Stubs\ControllerStub; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final class MakeControllerCommand { use PublishesFiles; diff --git a/packages/router/src/Commands/RoutesCommand.php b/packages/router/src/Commands/RoutesCommand.php index a93d35b189..73e6c0a425 100644 --- a/packages/router/src/Commands/RoutesCommand.php +++ b/packages/router/src/Commands/RoutesCommand.php @@ -17,7 +17,7 @@ use function Tempest\Support\Str\after_last; use function Tempest\Support\Str\before_last; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class RoutesCommand { public function __construct( diff --git a/packages/router/src/Commands/ServeCommand.php b/packages/router/src/Commands/ServeCommand.php index ae3084fda1..76bf4b01d9 100644 --- a/packages/router/src/Commands/ServeCommand.php +++ b/packages/router/src/Commands/ServeCommand.php @@ -8,7 +8,7 @@ use Tempest\Intl\Number; use Tempest\Support\Str; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class ServeCommand { #[ConsoleCommand( diff --git a/packages/view/src/Commands/ClearViewCacheCommand.php b/packages/view/src/Commands/ClearViewCacheCommand.php index 25cbf3ff26..e293687b09 100644 --- a/packages/view/src/Commands/ClearViewCacheCommand.php +++ b/packages/view/src/Commands/ClearViewCacheCommand.php @@ -10,7 +10,7 @@ use Tempest\Container\Container; use Tempest\View\ViewCache; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final readonly class ClearViewCacheCommand { use HasConsole; diff --git a/packages/view/src/Commands/MakeViewCommand.php b/packages/view/src/Commands/MakeViewCommand.php index 6fc7bccd68..fe0e204e67 100644 --- a/packages/view/src/Commands/MakeViewCommand.php +++ b/packages/view/src/Commands/MakeViewCommand.php @@ -17,7 +17,7 @@ use function Tempest\Support\str; -if (class_exists(\Tempest\Console\ConsoleCommand::class, false)) { +if (class_exists(\Tempest\Console\ConsoleCommand::class)) { final class MakeViewCommand { use PublishesFiles; From 7afcdb378399d0d217268a1122f8418fc60a6d60 Mon Sep 17 00:00:00 2001 From: brendt Date: Fri, 12 Dec 2025 09:09:51 +0100 Subject: [PATCH 2/5] chore: release v2.14.0 --- CHANGELOG.md | 21 ++++++++++++++++++++- packages/auth/composer.json | 8 ++++---- packages/cache/composer.json | 10 +++++----- packages/clock/composer.json | 2 +- packages/command-bus/composer.json | 6 +++--- packages/console/composer.json | 18 +++++++++--------- packages/container/composer.json | 2 +- packages/core/composer.json | 8 ++++---- packages/core/src/Kernel.php | 2 +- packages/cryptography/composer.json | 6 +++--- packages/database/composer.json | 10 +++++----- packages/datetime/composer.json | 4 ++-- packages/discovery/composer.json | 4 ++-- packages/event-bus/composer.json | 6 +++--- packages/generation/composer.json | 2 +- packages/http-client/composer.json | 6 +++--- packages/http/composer.json | 12 ++++++------ packages/icon/composer.json | 6 +++--- packages/intl/composer.json | 6 +++--- packages/kv-store/composer.json | 6 +++--- packages/log/composer.json | 2 +- packages/mail/composer.json | 6 +++--- packages/mapper/composer.json | 4 ++-- packages/process/composer.json | 6 +++--- packages/router/composer.json | 4 ++-- packages/storage/composer.json | 4 ++-- packages/support/composer.json | 2 +- packages/validation/composer.json | 8 ++++---- packages/view/composer.json | 8 ++++---- packages/vite-plugin-tempest/package.json | 2 +- 30 files changed, 105 insertions(+), 86 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2f72fdac2..b1b963ef12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,26 @@ All notable changes to this project will be documented in this file. -## [2.13.0](https://github.com/tempestphp/tempest-framework/compare/v2.12.0..2.13.0) — 2025-12-04 +## [2.14.0](https://github.com/tempestphp/tempest-framework/compare/v2.13.0..2.14.0) — 2025-12-12 + +### 🚨 Breaking changes + +- **console**: [**breaking**] allow `--force` to bypass `CautionMiddleware` (#1804) ([bccf92f](https://github.com/tempestphp/tempest-framework/commit/bccf92fb3e88c8ba35b1f89a8f893031a072df96)) + +### 🚀 Features + +- **session**: add redis session manager (#1790) ([eb7150b](https://github.com/tempestphp/tempest-framework/commit/eb7150b8c4226397feee5311b0033c5f05fd9be1)) + +### 🐛 Bug fixes + +- **core**: fix class guards not using the autoloader (#1808) ([450b2e7](https://github.com/tempestphp/tempest-framework/commit/450b2e7058852044d6257dc98c92b3366cb7e2fc)) +- **database**: support route binding through `IsDatabaseModel` (#1794) ([3556acb](https://github.com/tempestphp/tempest-framework/commit/3556acb1538a26cb21b33fb0e0d15180b64527c9)) +- **database**: support pagination with joins and relations (#1801) ([0b52ffd](https://github.com/tempestphp/tempest-framework/commit/0b52ffd2cd18db89bb27fa3ace5b409e90f20f7e)) +- **router**: add null checks and fix route parameter handling (#1778) ([c89c345](https://github.com/tempestphp/tempest-framework/commit/c89c345da59a97612c4ac5807cafee0b5e1b1da9)) +- **view**: throw exception when parsing xml views with `short_open_tag` enabled (#1795) ([30b2a6f](https://github.com/tempestphp/tempest-framework/commit/30b2a6ff8f8d4d108b334109748c96fe56ad8bde)) + + +## [2.13.0](https://github.com/tempestphp/tempest-framework/compare/v2.12.0..v2.13.0) — 2025-12-04 ### 🚀 Features diff --git a/packages/auth/composer.json b/packages/auth/composer.json index f530ffa195..47b574f1f0 100644 --- a/packages/auth/composer.json +++ b/packages/auth/composer.json @@ -3,10 +3,10 @@ "description": "A flexible authentication package for Tempest, providing authentication and authorization.", "require": { "php": "^8.4", - "tempest/core": "dev-main", - "tempest/router": "dev-main", - "tempest/database": "dev-main", - "tempest/mapper": "dev-main", + "tempest/core": "2.14.0", + "tempest/router": "2.14.0", + "tempest/database": "2.14.0", + "tempest/mapper": "2.14.0", "league/oauth2-client": "^2.8" }, "require-dev": { diff --git a/packages/cache/composer.json b/packages/cache/composer.json index 60ae7d9059..bf78ef535d 100644 --- a/packages/cache/composer.json +++ b/packages/cache/composer.json @@ -5,13 +5,13 @@ "php": "^8.4", "psr/cache": "^3.0", "symfony/cache": "^7.3", - "tempest/core": "dev-main", - "tempest/clock": "dev-main", - "tempest/kv-store": "dev-main", - "tempest/container": "dev-main" + "tempest/core": "2.14.0", + "tempest/clock": "2.14.0", + "tempest/kv-store": "2.14.0", + "tempest/container": "2.14.0" }, "require-dev": { - "tempest/clock": "dev-main" + "tempest/clock": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/clock/composer.json b/packages/clock/composer.json index f2272e0734..0f2cbfefce 100644 --- a/packages/clock/composer.json +++ b/packages/clock/composer.json @@ -4,7 +4,7 @@ "require": { "php": "^8.4", "psr/clock": "^1.0.0", - "tempest/datetime": "dev-main" + "tempest/datetime": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/command-bus/composer.json b/packages/command-bus/composer.json index 5834601a09..bea476e792 100644 --- a/packages/command-bus/composer.json +++ b/packages/command-bus/composer.json @@ -3,9 +3,9 @@ "description": "A command bus component designed to dispatch commands to their respective handlers.", "require": { "php": "^8.4", - "tempest/core": "dev-main", - "tempest/console": "dev-main", - "tempest/container": "dev-main" + "tempest/core": "2.14.0", + "tempest/console": "2.14.0", + "tempest/container": "2.14.0" }, "autoload": { "files": [ diff --git a/packages/console/composer.json b/packages/console/composer.json index ce53de888c..214e4846b2 100644 --- a/packages/console/composer.json +++ b/packages/console/composer.json @@ -5,16 +5,16 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/cache": "dev-main", - "tempest/core": "dev-main", - "tempest/container": "dev-main", - "tempest/debug": "dev-main", - "tempest/generation": "dev-main", + "tempest/cache": "2.14.0", + "tempest/core": "2.14.0", + "tempest/container": "2.14.0", + "tempest/debug": "2.14.0", + "tempest/generation": "2.14.0", "tempest/highlight": "^2.11.4", - "tempest/log": "dev-main", - "tempest/reflection": "dev-main", - "tempest/support": "dev-main", - "tempest/validation": "dev-main", + "tempest/log": "2.14.0", + "tempest/reflection": "2.14.0", + "tempest/support": "2.14.0", + "tempest/validation": "2.14.0", "ext-readline": "*" }, "suggest": { diff --git a/packages/container/composer.json b/packages/container/composer.json index 3897d3cce5..995ed62ef0 100644 --- a/packages/container/composer.json +++ b/packages/container/composer.json @@ -5,7 +5,7 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/reflection": "dev-main" + "tempest/reflection": "2.14.0" }, "autoload": { "files": [ diff --git a/packages/core/composer.json b/packages/core/composer.json index 226b393e26..b4e5c350ce 100644 --- a/packages/core/composer.json +++ b/packages/core/composer.json @@ -5,10 +5,10 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/container": "dev-main", - "tempest/discovery": "dev-main", - "tempest/reflection": "dev-main", - "tempest/support": "dev-main", + "tempest/container": "2.14.0", + "tempest/discovery": "2.14.0", + "tempest/reflection": "2.14.0", + "tempest/support": "2.14.0", "vlucas/phpdotenv": "^5.6.1", "symfony/cache": "^7.3", "filp/whoops": "^2.15" diff --git a/packages/core/src/Kernel.php b/packages/core/src/Kernel.php index 1ce183e2f5..93d27adcfc 100644 --- a/packages/core/src/Kernel.php +++ b/packages/core/src/Kernel.php @@ -8,7 +8,7 @@ interface Kernel { - public const string VERSION = '2.13.0'; + public const string VERSION = '2.14.0'; public string $root { get; diff --git a/packages/cryptography/composer.json b/packages/cryptography/composer.json index 40b072222a..a1946d0042 100644 --- a/packages/cryptography/composer.json +++ b/packages/cryptography/composer.json @@ -5,9 +5,9 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/container": "dev-main", - "tempest/support": "dev-main", - "tempest/clock": "dev-main" + "tempest/container": "2.14.0", + "tempest/support": "2.14.0", + "tempest/clock": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/database/composer.json b/packages/database/composer.json index 3fe7e0ba3f..47288d8d63 100644 --- a/packages/database/composer.json +++ b/packages/database/composer.json @@ -6,11 +6,11 @@ "require": { "php": "^8.4", "ext-pdo": "*", - "tempest/container": "dev-main", - "tempest/event-bus": "dev-main", - "tempest/mapper": "dev-main", - "tempest/intl": "dev-main", - "tempest/support": "dev-main" + "tempest/container": "2.14.0", + "tempest/event-bus": "2.14.0", + "tempest/mapper": "2.14.0", + "tempest/intl": "2.14.0", + "tempest/support": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/datetime/composer.json b/packages/datetime/composer.json index 56661c1111..8bd1635e40 100644 --- a/packages/datetime/composer.json +++ b/packages/datetime/composer.json @@ -5,8 +5,8 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/intl": "dev-main", - "tempest/support": "dev-main" + "tempest/intl": "2.14.0", + "tempest/support": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/discovery/composer.json b/packages/discovery/composer.json index a8d380860b..9573717e68 100644 --- a/packages/discovery/composer.json +++ b/packages/discovery/composer.json @@ -5,8 +5,8 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/reflection": "dev-main", - "tempest/support": "dev-main" + "tempest/reflection": "2.14.0", + "tempest/support": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/event-bus/composer.json b/packages/event-bus/composer.json index b80a1d824f..9ddd2bf453 100644 --- a/packages/event-bus/composer.json +++ b/packages/event-bus/composer.json @@ -3,9 +3,9 @@ "description": "A lightweight event bus component designed to facilitate event-driven architecture and asynchronous message handling.", "require": { "php": "^8.4", - "tempest/core": "dev-main", - "tempest/container": "dev-main", - "tempest/reflection": "dev-main" + "tempest/core": "2.14.0", + "tempest/container": "2.14.0", + "tempest/reflection": "2.14.0" }, "autoload": { "files": [ diff --git a/packages/generation/composer.json b/packages/generation/composer.json index 549472d216..ca707b4fec 100644 --- a/packages/generation/composer.json +++ b/packages/generation/composer.json @@ -7,7 +7,7 @@ "php": "^8.4", "nette/php-generator": "^4.1.6", "nikic/php-parser": "^5.3", - "tempest/support": "dev-main" + "tempest/support": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/http-client/composer.json b/packages/http-client/composer.json index 578ce523ef..d012677934 100644 --- a/packages/http-client/composer.json +++ b/packages/http-client/composer.json @@ -7,9 +7,9 @@ "php": "^8.4", "psr/http-client": "^1.0.0", "psr/http-message": "^1.0|^2.0", - "tempest/container": "dev-main", - "tempest/http": "dev-main", - "tempest/router": "dev-main", + "tempest/container": "2.14.0", + "tempest/http": "2.14.0", + "tempest/router": "2.14.0", "psr-discovery/http-client-implementations": "^1.4", "psr-discovery/http-factory-implementations": "^1.2" }, diff --git a/packages/http/composer.json b/packages/http/composer.json index 17700a16e6..4624cc6b07 100644 --- a/packages/http/composer.json +++ b/packages/http/composer.json @@ -5,12 +5,12 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/core": "dev-main", - "tempest/clock": "dev-main", - "tempest/console": "dev-main", - "tempest/mapper": "dev-main", - "tempest/container": "dev-main", - "tempest/cryptography": "dev-main", + "tempest/core": "2.14.0", + "tempest/clock": "2.14.0", + "tempest/console": "2.14.0", + "tempest/mapper": "2.14.0", + "tempest/container": "2.14.0", + "tempest/cryptography": "2.14.0", "laminas/laminas-diactoros": "^3.3", "psr/http-factory": "^1.0", "psr/http-message": "^1.0|^2.0", diff --git a/packages/icon/composer.json b/packages/icon/composer.json index 1bf22c13a7..d41a3e2a60 100644 --- a/packages/icon/composer.json +++ b/packages/icon/composer.json @@ -5,9 +5,9 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/container": "dev-main", - "tempest/http-client": "dev-main", - "tempest/support": "dev-main", + "tempest/container": "2.14.0", + "tempest/http-client": "2.14.0", + "tempest/support": "2.14.0", "symfony/cache": "^7.3" }, "suggest": { diff --git a/packages/intl/composer.json b/packages/intl/composer.json index 4ff8ef7693..4deb069173 100644 --- a/packages/intl/composer.json +++ b/packages/intl/composer.json @@ -7,9 +7,9 @@ "php": "^8.4", "doctrine/inflector": "^2.0", "symfony/yaml": "^7.3", - "tempest/core": "dev-main", - "tempest/container": "dev-main", - "tempest/support": "dev-main" + "tempest/core": "2.14.0", + "tempest/container": "2.14.0", + "tempest/support": "2.14.0" }, "suggest": { "tempest/datetime": "In order to use the `datetime` function", diff --git a/packages/kv-store/composer.json b/packages/kv-store/composer.json index 629555509d..49e096808d 100644 --- a/packages/kv-store/composer.json +++ b/packages/kv-store/composer.json @@ -5,9 +5,9 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/support": "dev-main", - "tempest/datetime": "dev-main", - "tempest/event-bus": "dev-main" + "tempest/support": "2.14.0", + "tempest/datetime": "2.14.0", + "tempest/event-bus": "2.14.0" }, "require-dev": { "predis/predis": "^3.0.0" diff --git a/packages/log/composer.json b/packages/log/composer.json index bc0a48a29b..c5cf72b18f 100644 --- a/packages/log/composer.json +++ b/packages/log/composer.json @@ -7,7 +7,7 @@ "php": "^8.4", "monolog/monolog": "^3.7.0", "psr/log": "^3.0.0", - "tempest/container": "dev-main" + "tempest/container": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/mail/composer.json b/packages/mail/composer.json index b67757b3d8..6fd1850aa3 100644 --- a/packages/mail/composer.json +++ b/packages/mail/composer.json @@ -5,9 +5,9 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/reflection": "dev-main", - "tempest/support": "dev-main", - "tempest/event-bus": "dev-main", + "tempest/reflection": "2.14.0", + "tempest/support": "2.14.0", + "tempest/event-bus": "2.14.0", "symfony/mailer": "^7.2.6" }, "require-dev": { diff --git a/packages/mapper/composer.json b/packages/mapper/composer.json index 679e0d2512..7ca3430afa 100644 --- a/packages/mapper/composer.json +++ b/packages/mapper/composer.json @@ -5,8 +5,8 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/validation": "dev-main", - "tempest/core": "dev-main" + "tempest/validation": "2.14.0", + "tempest/core": "2.14.0" }, "autoload": { "files": [ diff --git a/packages/process/composer.json b/packages/process/composer.json index 97e073f3cc..c73d8b528e 100644 --- a/packages/process/composer.json +++ b/packages/process/composer.json @@ -6,9 +6,9 @@ "require": { "php": "^8.4", "symfony/process": "^7.3", - "tempest/container": "dev-main", - "tempest/support": "dev-main", - "tempest/datetime": "dev-main" + "tempest/container": "2.14.0", + "tempest/support": "2.14.0", + "tempest/datetime": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/router/composer.json b/packages/router/composer.json index cab9eb741b..1bb4a484a6 100644 --- a/packages/router/composer.json +++ b/packages/router/composer.json @@ -5,8 +5,8 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/http": "dev-main", - "tempest/view": "dev-main", + "tempest/http": "2.14.0", + "tempest/view": "2.14.0", "tempest/highlight": "^2.11.4", "symfony/var-exporter": "^7.1" }, diff --git a/packages/storage/composer.json b/packages/storage/composer.json index 5fc1f61ac2..e573cb35a9 100644 --- a/packages/storage/composer.json +++ b/packages/storage/composer.json @@ -6,7 +6,7 @@ "require": { "php": "^8.4", "league/flysystem": "^3.29.1", - "tempest/container": "dev-main" + "tempest/container": "2.14.0" }, "require-dev": { "aws/aws-sdk-php": "^3.338.0", @@ -20,7 +20,7 @@ "league/flysystem-google-cloud-storage": "^3.25.1", "league/mime-type-detection": "^1.16", "microsoft/azure-storage-blob": "^1.5", - "tempest/support": "dev-main" + "tempest/support": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/support/composer.json b/packages/support/composer.json index 1c377e3e15..a91d9d4abc 100644 --- a/packages/support/composer.json +++ b/packages/support/composer.json @@ -5,7 +5,7 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/container": "dev-main", + "tempest/container": "2.14.0", "voku/portable-ascii": "^2.0.3", "symfony/uid": "^7.1" }, diff --git a/packages/validation/composer.json b/packages/validation/composer.json index a04f34d076..411c50cfa0 100644 --- a/packages/validation/composer.json +++ b/packages/validation/composer.json @@ -7,10 +7,10 @@ "php": "^8.4", "egulias/email-validator": "^4.0.2", "giggsey/libphonenumber-for-php-lite": "^9.0", - "tempest/reflection": "dev-main", - "tempest/support": "dev-main", - "tempest/intl": "dev-main", - "tempest/datetime": "dev-main" + "tempest/reflection": "2.14.0", + "tempest/support": "2.14.0", + "tempest/intl": "2.14.0", + "tempest/datetime": "2.14.0" }, "autoload": { "psr-4": { diff --git a/packages/view/composer.json b/packages/view/composer.json index e43cbe96f8..c8ead91291 100644 --- a/packages/view/composer.json +++ b/packages/view/composer.json @@ -5,10 +5,10 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/core": "dev-main", - "tempest/container": "dev-main", - "tempest/validation": "dev-main", - "tempest/clock": "dev-main", + "tempest/core": "2.14.0", + "tempest/container": "2.14.0", + "tempest/validation": "2.14.0", + "tempest/clock": "2.14.0", "league/commonmark": "^2.7", "symfony/cache": "^7.3" }, diff --git a/packages/vite-plugin-tempest/package.json b/packages/vite-plugin-tempest/package.json index 025f0f8a7c..c6cedfbbd0 100644 --- a/packages/vite-plugin-tempest/package.json +++ b/packages/vite-plugin-tempest/package.json @@ -1,7 +1,7 @@ { "name": "vite-plugin-tempest", "type": "module", - "version": "2.13.0", + "version": "2.14.0", "author": "Enzo Innocenzi", "license": "MIT", "sideEffects": false, From 16655b418204efff9de7e3e0b789aba0080f5652 Mon Sep 17 00:00:00 2001 From: brendt Date: Fri, 12 Dec 2025 09:09:53 +0100 Subject: [PATCH 3/5] chore: post-release clean up --- packages/auth/composer.json | 8 ++++---- packages/cache/composer.json | 10 +++++----- packages/clock/composer.json | 2 +- packages/command-bus/composer.json | 6 +++--- packages/console/composer.json | 18 +++++++++--------- packages/container/composer.json | 2 +- packages/core/composer.json | 8 ++++---- packages/cryptography/composer.json | 6 +++--- packages/database/composer.json | 10 +++++----- packages/datetime/composer.json | 4 ++-- packages/discovery/composer.json | 4 ++-- packages/event-bus/composer.json | 6 +++--- packages/generation/composer.json | 2 +- packages/http-client/composer.json | 6 +++--- packages/http/composer.json | 12 ++++++------ packages/icon/composer.json | 6 +++--- packages/intl/composer.json | 6 +++--- packages/kv-store/composer.json | 6 +++--- packages/log/composer.json | 2 +- packages/mail/composer.json | 6 +++--- packages/mapper/composer.json | 4 ++-- packages/process/composer.json | 6 +++--- packages/router/composer.json | 4 ++-- packages/storage/composer.json | 4 ++-- packages/support/composer.json | 2 +- packages/validation/composer.json | 8 ++++---- packages/view/composer.json | 8 ++++---- 27 files changed, 83 insertions(+), 83 deletions(-) diff --git a/packages/auth/composer.json b/packages/auth/composer.json index 47b574f1f0..f530ffa195 100644 --- a/packages/auth/composer.json +++ b/packages/auth/composer.json @@ -3,10 +3,10 @@ "description": "A flexible authentication package for Tempest, providing authentication and authorization.", "require": { "php": "^8.4", - "tempest/core": "2.14.0", - "tempest/router": "2.14.0", - "tempest/database": "2.14.0", - "tempest/mapper": "2.14.0", + "tempest/core": "dev-main", + "tempest/router": "dev-main", + "tempest/database": "dev-main", + "tempest/mapper": "dev-main", "league/oauth2-client": "^2.8" }, "require-dev": { diff --git a/packages/cache/composer.json b/packages/cache/composer.json index bf78ef535d..60ae7d9059 100644 --- a/packages/cache/composer.json +++ b/packages/cache/composer.json @@ -5,13 +5,13 @@ "php": "^8.4", "psr/cache": "^3.0", "symfony/cache": "^7.3", - "tempest/core": "2.14.0", - "tempest/clock": "2.14.0", - "tempest/kv-store": "2.14.0", - "tempest/container": "2.14.0" + "tempest/core": "dev-main", + "tempest/clock": "dev-main", + "tempest/kv-store": "dev-main", + "tempest/container": "dev-main" }, "require-dev": { - "tempest/clock": "2.14.0" + "tempest/clock": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/clock/composer.json b/packages/clock/composer.json index 0f2cbfefce..f2272e0734 100644 --- a/packages/clock/composer.json +++ b/packages/clock/composer.json @@ -4,7 +4,7 @@ "require": { "php": "^8.4", "psr/clock": "^1.0.0", - "tempest/datetime": "2.14.0" + "tempest/datetime": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/command-bus/composer.json b/packages/command-bus/composer.json index bea476e792..5834601a09 100644 --- a/packages/command-bus/composer.json +++ b/packages/command-bus/composer.json @@ -3,9 +3,9 @@ "description": "A command bus component designed to dispatch commands to their respective handlers.", "require": { "php": "^8.4", - "tempest/core": "2.14.0", - "tempest/console": "2.14.0", - "tempest/container": "2.14.0" + "tempest/core": "dev-main", + "tempest/console": "dev-main", + "tempest/container": "dev-main" }, "autoload": { "files": [ diff --git a/packages/console/composer.json b/packages/console/composer.json index 214e4846b2..ce53de888c 100644 --- a/packages/console/composer.json +++ b/packages/console/composer.json @@ -5,16 +5,16 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/cache": "2.14.0", - "tempest/core": "2.14.0", - "tempest/container": "2.14.0", - "tempest/debug": "2.14.0", - "tempest/generation": "2.14.0", + "tempest/cache": "dev-main", + "tempest/core": "dev-main", + "tempest/container": "dev-main", + "tempest/debug": "dev-main", + "tempest/generation": "dev-main", "tempest/highlight": "^2.11.4", - "tempest/log": "2.14.0", - "tempest/reflection": "2.14.0", - "tempest/support": "2.14.0", - "tempest/validation": "2.14.0", + "tempest/log": "dev-main", + "tempest/reflection": "dev-main", + "tempest/support": "dev-main", + "tempest/validation": "dev-main", "ext-readline": "*" }, "suggest": { diff --git a/packages/container/composer.json b/packages/container/composer.json index 995ed62ef0..3897d3cce5 100644 --- a/packages/container/composer.json +++ b/packages/container/composer.json @@ -5,7 +5,7 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/reflection": "2.14.0" + "tempest/reflection": "dev-main" }, "autoload": { "files": [ diff --git a/packages/core/composer.json b/packages/core/composer.json index b4e5c350ce..226b393e26 100644 --- a/packages/core/composer.json +++ b/packages/core/composer.json @@ -5,10 +5,10 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/container": "2.14.0", - "tempest/discovery": "2.14.0", - "tempest/reflection": "2.14.0", - "tempest/support": "2.14.0", + "tempest/container": "dev-main", + "tempest/discovery": "dev-main", + "tempest/reflection": "dev-main", + "tempest/support": "dev-main", "vlucas/phpdotenv": "^5.6.1", "symfony/cache": "^7.3", "filp/whoops": "^2.15" diff --git a/packages/cryptography/composer.json b/packages/cryptography/composer.json index a1946d0042..40b072222a 100644 --- a/packages/cryptography/composer.json +++ b/packages/cryptography/composer.json @@ -5,9 +5,9 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/container": "2.14.0", - "tempest/support": "2.14.0", - "tempest/clock": "2.14.0" + "tempest/container": "dev-main", + "tempest/support": "dev-main", + "tempest/clock": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/database/composer.json b/packages/database/composer.json index 47288d8d63..3fe7e0ba3f 100644 --- a/packages/database/composer.json +++ b/packages/database/composer.json @@ -6,11 +6,11 @@ "require": { "php": "^8.4", "ext-pdo": "*", - "tempest/container": "2.14.0", - "tempest/event-bus": "2.14.0", - "tempest/mapper": "2.14.0", - "tempest/intl": "2.14.0", - "tempest/support": "2.14.0" + "tempest/container": "dev-main", + "tempest/event-bus": "dev-main", + "tempest/mapper": "dev-main", + "tempest/intl": "dev-main", + "tempest/support": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/datetime/composer.json b/packages/datetime/composer.json index 8bd1635e40..56661c1111 100644 --- a/packages/datetime/composer.json +++ b/packages/datetime/composer.json @@ -5,8 +5,8 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/intl": "2.14.0", - "tempest/support": "2.14.0" + "tempest/intl": "dev-main", + "tempest/support": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/discovery/composer.json b/packages/discovery/composer.json index 9573717e68..a8d380860b 100644 --- a/packages/discovery/composer.json +++ b/packages/discovery/composer.json @@ -5,8 +5,8 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/reflection": "2.14.0", - "tempest/support": "2.14.0" + "tempest/reflection": "dev-main", + "tempest/support": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/event-bus/composer.json b/packages/event-bus/composer.json index 9ddd2bf453..b80a1d824f 100644 --- a/packages/event-bus/composer.json +++ b/packages/event-bus/composer.json @@ -3,9 +3,9 @@ "description": "A lightweight event bus component designed to facilitate event-driven architecture and asynchronous message handling.", "require": { "php": "^8.4", - "tempest/core": "2.14.0", - "tempest/container": "2.14.0", - "tempest/reflection": "2.14.0" + "tempest/core": "dev-main", + "tempest/container": "dev-main", + "tempest/reflection": "dev-main" }, "autoload": { "files": [ diff --git a/packages/generation/composer.json b/packages/generation/composer.json index ca707b4fec..549472d216 100644 --- a/packages/generation/composer.json +++ b/packages/generation/composer.json @@ -7,7 +7,7 @@ "php": "^8.4", "nette/php-generator": "^4.1.6", "nikic/php-parser": "^5.3", - "tempest/support": "2.14.0" + "tempest/support": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/http-client/composer.json b/packages/http-client/composer.json index d012677934..578ce523ef 100644 --- a/packages/http-client/composer.json +++ b/packages/http-client/composer.json @@ -7,9 +7,9 @@ "php": "^8.4", "psr/http-client": "^1.0.0", "psr/http-message": "^1.0|^2.0", - "tempest/container": "2.14.0", - "tempest/http": "2.14.0", - "tempest/router": "2.14.0", + "tempest/container": "dev-main", + "tempest/http": "dev-main", + "tempest/router": "dev-main", "psr-discovery/http-client-implementations": "^1.4", "psr-discovery/http-factory-implementations": "^1.2" }, diff --git a/packages/http/composer.json b/packages/http/composer.json index 4624cc6b07..17700a16e6 100644 --- a/packages/http/composer.json +++ b/packages/http/composer.json @@ -5,12 +5,12 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/core": "2.14.0", - "tempest/clock": "2.14.0", - "tempest/console": "2.14.0", - "tempest/mapper": "2.14.0", - "tempest/container": "2.14.0", - "tempest/cryptography": "2.14.0", + "tempest/core": "dev-main", + "tempest/clock": "dev-main", + "tempest/console": "dev-main", + "tempest/mapper": "dev-main", + "tempest/container": "dev-main", + "tempest/cryptography": "dev-main", "laminas/laminas-diactoros": "^3.3", "psr/http-factory": "^1.0", "psr/http-message": "^1.0|^2.0", diff --git a/packages/icon/composer.json b/packages/icon/composer.json index d41a3e2a60..1bf22c13a7 100644 --- a/packages/icon/composer.json +++ b/packages/icon/composer.json @@ -5,9 +5,9 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/container": "2.14.0", - "tempest/http-client": "2.14.0", - "tempest/support": "2.14.0", + "tempest/container": "dev-main", + "tempest/http-client": "dev-main", + "tempest/support": "dev-main", "symfony/cache": "^7.3" }, "suggest": { diff --git a/packages/intl/composer.json b/packages/intl/composer.json index 4deb069173..4ff8ef7693 100644 --- a/packages/intl/composer.json +++ b/packages/intl/composer.json @@ -7,9 +7,9 @@ "php": "^8.4", "doctrine/inflector": "^2.0", "symfony/yaml": "^7.3", - "tempest/core": "2.14.0", - "tempest/container": "2.14.0", - "tempest/support": "2.14.0" + "tempest/core": "dev-main", + "tempest/container": "dev-main", + "tempest/support": "dev-main" }, "suggest": { "tempest/datetime": "In order to use the `datetime` function", diff --git a/packages/kv-store/composer.json b/packages/kv-store/composer.json index 49e096808d..629555509d 100644 --- a/packages/kv-store/composer.json +++ b/packages/kv-store/composer.json @@ -5,9 +5,9 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/support": "2.14.0", - "tempest/datetime": "2.14.0", - "tempest/event-bus": "2.14.0" + "tempest/support": "dev-main", + "tempest/datetime": "dev-main", + "tempest/event-bus": "dev-main" }, "require-dev": { "predis/predis": "^3.0.0" diff --git a/packages/log/composer.json b/packages/log/composer.json index c5cf72b18f..bc0a48a29b 100644 --- a/packages/log/composer.json +++ b/packages/log/composer.json @@ -7,7 +7,7 @@ "php": "^8.4", "monolog/monolog": "^3.7.0", "psr/log": "^3.0.0", - "tempest/container": "2.14.0" + "tempest/container": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/mail/composer.json b/packages/mail/composer.json index 6fd1850aa3..b67757b3d8 100644 --- a/packages/mail/composer.json +++ b/packages/mail/composer.json @@ -5,9 +5,9 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/reflection": "2.14.0", - "tempest/support": "2.14.0", - "tempest/event-bus": "2.14.0", + "tempest/reflection": "dev-main", + "tempest/support": "dev-main", + "tempest/event-bus": "dev-main", "symfony/mailer": "^7.2.6" }, "require-dev": { diff --git a/packages/mapper/composer.json b/packages/mapper/composer.json index 7ca3430afa..679e0d2512 100644 --- a/packages/mapper/composer.json +++ b/packages/mapper/composer.json @@ -5,8 +5,8 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/validation": "2.14.0", - "tempest/core": "2.14.0" + "tempest/validation": "dev-main", + "tempest/core": "dev-main" }, "autoload": { "files": [ diff --git a/packages/process/composer.json b/packages/process/composer.json index c73d8b528e..97e073f3cc 100644 --- a/packages/process/composer.json +++ b/packages/process/composer.json @@ -6,9 +6,9 @@ "require": { "php": "^8.4", "symfony/process": "^7.3", - "tempest/container": "2.14.0", - "tempest/support": "2.14.0", - "tempest/datetime": "2.14.0" + "tempest/container": "dev-main", + "tempest/support": "dev-main", + "tempest/datetime": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/router/composer.json b/packages/router/composer.json index 1bb4a484a6..cab9eb741b 100644 --- a/packages/router/composer.json +++ b/packages/router/composer.json @@ -5,8 +5,8 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/http": "2.14.0", - "tempest/view": "2.14.0", + "tempest/http": "dev-main", + "tempest/view": "dev-main", "tempest/highlight": "^2.11.4", "symfony/var-exporter": "^7.1" }, diff --git a/packages/storage/composer.json b/packages/storage/composer.json index e573cb35a9..5fc1f61ac2 100644 --- a/packages/storage/composer.json +++ b/packages/storage/composer.json @@ -6,7 +6,7 @@ "require": { "php": "^8.4", "league/flysystem": "^3.29.1", - "tempest/container": "2.14.0" + "tempest/container": "dev-main" }, "require-dev": { "aws/aws-sdk-php": "^3.338.0", @@ -20,7 +20,7 @@ "league/flysystem-google-cloud-storage": "^3.25.1", "league/mime-type-detection": "^1.16", "microsoft/azure-storage-blob": "^1.5", - "tempest/support": "2.14.0" + "tempest/support": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/support/composer.json b/packages/support/composer.json index a91d9d4abc..1c377e3e15 100644 --- a/packages/support/composer.json +++ b/packages/support/composer.json @@ -5,7 +5,7 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/container": "2.14.0", + "tempest/container": "dev-main", "voku/portable-ascii": "^2.0.3", "symfony/uid": "^7.1" }, diff --git a/packages/validation/composer.json b/packages/validation/composer.json index 411c50cfa0..a04f34d076 100644 --- a/packages/validation/composer.json +++ b/packages/validation/composer.json @@ -7,10 +7,10 @@ "php": "^8.4", "egulias/email-validator": "^4.0.2", "giggsey/libphonenumber-for-php-lite": "^9.0", - "tempest/reflection": "2.14.0", - "tempest/support": "2.14.0", - "tempest/intl": "2.14.0", - "tempest/datetime": "2.14.0" + "tempest/reflection": "dev-main", + "tempest/support": "dev-main", + "tempest/intl": "dev-main", + "tempest/datetime": "dev-main" }, "autoload": { "psr-4": { diff --git a/packages/view/composer.json b/packages/view/composer.json index c8ead91291..e43cbe96f8 100644 --- a/packages/view/composer.json +++ b/packages/view/composer.json @@ -5,10 +5,10 @@ "minimum-stability": "dev", "require": { "php": "^8.4", - "tempest/core": "2.14.0", - "tempest/container": "2.14.0", - "tempest/validation": "2.14.0", - "tempest/clock": "2.14.0", + "tempest/core": "dev-main", + "tempest/container": "dev-main", + "tempest/validation": "dev-main", + "tempest/clock": "dev-main", "league/commonmark": "^2.7", "symfony/cache": "^7.3" }, From 852f619f607f002b3f58573b766e94e03dbea8a6 Mon Sep 17 00:00:00 2001 From: Tresor kasenda Date: Fri, 6 Feb 2026 14:00:18 +0200 Subject: [PATCH 4/5] feat(router): add #[ValidSignature] attribute for automatic signed URL validation Add a route decorator attribute that automatically validates signed URLs, eliminating the need for manual validation in each controller method. Features: - New #[ValidSignature] attribute to enforce signature validation on routes - Returns 403 Forbidden when signature is missing, invalid, or expired - Works with both permanent and temporary signed URLs Usage: #[Get('/verify-email/{token}')] #[ValidSignature] public function verifyEmail(string $token): Response { // This code only executes if the signature is valid } Files added: - packages/router/src/ValidSignature.php - Route decorator attribute - packages/router/src/ValidSignatureMiddleware.php - Validation middleware - tests/Integration/Route/ValidSignatureMiddlewareTest.php - 8 integration tests - tests/Integration/Route/Fixtures/SignedUrlController.php - Test fixture --- packages/router/src/ValidSignature.php | 44 +++++ .../router/src/ValidSignatureMiddleware.php | 40 +++++ .../Route/Fixtures/SignedUrlController.php | 26 +++ .../Route/ValidSignatureMiddlewareTest.php | 154 ++++++++++++++++++ 4 files changed, 264 insertions(+) create mode 100644 packages/router/src/ValidSignature.php create mode 100644 packages/router/src/ValidSignatureMiddleware.php create mode 100644 tests/Integration/Route/Fixtures/SignedUrlController.php create mode 100644 tests/Integration/Route/ValidSignatureMiddlewareTest.php diff --git a/packages/router/src/ValidSignature.php b/packages/router/src/ValidSignature.php new file mode 100644 index 0000000000..57ad1b1ffe --- /dev/null +++ b/packages/router/src/ValidSignature.php @@ -0,0 +1,44 @@ +middleware = [ + ...$route->middleware, + ValidSignatureMiddleware::class, + ]; + + return $route; + } +} diff --git a/packages/router/src/ValidSignatureMiddleware.php b/packages/router/src/ValidSignatureMiddleware.php new file mode 100644 index 0000000000..04f06cf222 --- /dev/null +++ b/packages/router/src/ValidSignatureMiddleware.php @@ -0,0 +1,40 @@ +container->get(UriGenerator::class); + + if (! $uriGenerator->hasValidSignature($request)) { + return new Forbidden(); + } + + return $next($request); + } +} diff --git a/tests/Integration/Route/Fixtures/SignedUrlController.php b/tests/Integration/Route/Fixtures/SignedUrlController.php new file mode 100644 index 0000000000..79e93b146b --- /dev/null +++ b/tests/Integration/Route/Fixtures/SignedUrlController.php @@ -0,0 +1,26 @@ + $token, 'message' => 'Signature valid']); + } + + #[Get('/unsigned-action/{token}')] + public function unsignedAction(string $token): Response + { + return new Ok(['token' => $token]); + } +} diff --git a/tests/Integration/Route/ValidSignatureMiddlewareTest.php b/tests/Integration/Route/ValidSignatureMiddlewareTest.php new file mode 100644 index 0000000000..34aa594464 --- /dev/null +++ b/tests/Integration/Route/ValidSignatureMiddlewareTest.php @@ -0,0 +1,154 @@ + $this->container->get(UriGenerator::class); + } + + protected function setUp(): void + { + parent::setUp(); + + $this->registerRoute([SignedUrlController::class, 'signedAction']); + $this->registerRoute([SignedUrlController::class, 'unsignedAction']); + } + + #[Test] + public function valid_signature_allows_request(): void + { + $uri = $this->generator->createSignedUri( + action: [SignedUrlController::class, 'signedAction'], + token: 'abc123', + ); + + $response = $this->http->get($uri); + + $this->assertSame(Status::OK, $response->status); + $body = is_array($response->body) ? $response->body : json_decode($response->body, true); + $this->assertSame('abc123', $body['token']); + $this->assertSame('Signature valid', $body['message']); + } + + #[Test] + public function missing_signature_returns_forbidden(): void + { + $response = $this->http->get('/signed-action/abc123'); + + $this->assertSame(Status::FORBIDDEN, $response->status); + } + + #[Test] + public function invalid_signature_returns_forbidden(): void + { + $uri = $this->generator->createSignedUri( + action: [SignedUrlController::class, 'signedAction'], + token: 'abc123', + ); + + // Tamper with the signature + $tamperedUri = str_replace('signature=', 'signature=tampered', $uri); + + $response = $this->http->get($tamperedUri); + + $this->assertSame(Status::FORBIDDEN, $response->status); + } + + #[Test] + public function tampered_parameter_returns_forbidden(): void + { + $uri = $this->generator->createSignedUri( + action: [SignedUrlController::class, 'signedAction'], + token: 'abc123', + ); + + // Tamper with the token parameter + $tamperedUri = str_replace('abc123', 'tampered', $uri); + + $response = $this->http->get($tamperedUri); + + $this->assertSame(Status::FORBIDDEN, $response->status); + } + + #[Test] + public function expired_signature_returns_forbidden(): void + { + $clock = $this->clock(); + + $uri = $this->generator->createTemporarySignedUri( + action: [SignedUrlController::class, 'signedAction'], + duration: Duration::minutes(10), + token: 'abc123', + ); + + // Advance time past expiration + $clock->plus(Duration::minutes(15)); + + $response = $this->http->get($uri); + + $this->assertSame(Status::FORBIDDEN, $response->status); + } + + #[Test] + public function temporary_signature_valid_before_expiration(): void + { + $clock = $this->clock(); + + $uri = $this->generator->createTemporarySignedUri( + action: [SignedUrlController::class, 'signedAction'], + duration: Duration::minutes(10), + token: 'abc123', + ); + + // Advance time but stay within expiration + $clock->plus(Duration::minutes(5)); + + $response = $this->http->get($uri); + + $this->assertSame(Status::OK, $response->status); + } + + #[Test] + public function unsigned_route_works_without_signature(): void + { + // Routes without #[ValidSignature] should work normally + $response = $this->http->get('/unsigned-action/abc123'); + + $this->assertSame(Status::OK, $response->status); + } + + #[Test] + public function tampered_expiration_returns_forbidden(): void + { + $clock = $this->clock(); + + $uri = $this->generator->createTemporarySignedUri( + action: [SignedUrlController::class, 'signedAction'], + duration: Duration::minutes(10), + token: 'abc123', + ); + + // Get the current timestamp and extend it in the URL + $timestamp = $clock->now()->plusMinutes(10)->getTimestamp()->getSeconds(); + $tamperedUri = str_replace( + 'expires_at=' . $timestamp, + 'expires_at=' . ($timestamp + 3600), + $uri + ); + + $response = $this->http->get($tamperedUri); + + $this->assertSame(Status::FORBIDDEN, $response->status); + } +} From 1c8d0edf5dddb56cd1dc02e44d5767ca891622fe Mon Sep 17 00:00:00 2001 From: Tresor kasenda Date: Fri, 6 Feb 2026 15:29:33 +0200 Subject: [PATCH 5/5] refactor(router): update ValidSignatureMiddleware to use #[SkipDiscovery] for route-specific application --- packages/router/src/ValidSignature.php | 5 ++--- packages/router/src/ValidSignatureMiddleware.php | 16 +++++++--------- .../Route/ValidSignatureMiddlewareTest.php | 4 ++-- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/router/src/ValidSignature.php b/packages/router/src/ValidSignature.php index 57ad1b1ffe..e624d06c4d 100644 --- a/packages/router/src/ValidSignature.php +++ b/packages/router/src/ValidSignature.php @@ -31,9 +31,8 @@ final class ValidSignature implements RouteDecorator { public function decorate(Route $route): Route { - // ValidSignatureMiddleware intentionally doesn't implement HttpMiddleware to prevent - // auto-discovery as a global middleware. It follows the same callable signature - // and is invoked via HandleRouteSpecificMiddleware. + // ValidSignatureMiddleware uses #[SkipDiscovery] to prevent auto-discovery + // as a global middleware. It is only applied to routes with this attribute. $route->middleware = [ ...$route->middleware, ValidSignatureMiddleware::class, diff --git a/packages/router/src/ValidSignatureMiddleware.php b/packages/router/src/ValidSignatureMiddleware.php index 04f06cf222..1e1a7d5e18 100644 --- a/packages/router/src/ValidSignatureMiddleware.php +++ b/packages/router/src/ValidSignatureMiddleware.php @@ -4,7 +4,7 @@ namespace Tempest\Router; -use Tempest\Container\Container; +use Tempest\Discovery\SkipDiscovery; use Tempest\Http\Request; use Tempest\Http\Response; use Tempest\Http\Responses\Forbidden; @@ -17,21 +17,19 @@ * - The signature is invalid (tampered URL) * - The signature has expired (for temporary signed URLs) * - * Note: This class intentionally does NOT implement HttpMiddleware to prevent - * it from being auto-discovered as a global middleware. It should only run - * on routes that have the #[ValidSignature] attribute, via HandleRouteSpecificMiddleware. + * This middleware uses #[SkipDiscovery] to prevent auto-registration as a global middleware. + * It should only run on routes that have the #[ValidSignature] attribute. */ -final readonly class ValidSignatureMiddleware +#[SkipDiscovery] +final readonly class ValidSignatureMiddleware implements HttpMiddleware { public function __construct( - private Container $container, + private UriGenerator $uriGenerator, ) {} public function __invoke(Request $request, HttpMiddlewareCallable $next): Response { - $uriGenerator = $this->container->get(UriGenerator::class); - - if (! $uriGenerator->hasValidSignature($request)) { + if (! $this->uriGenerator->hasValidSignature($request)) { return new Forbidden(); } diff --git a/tests/Integration/Route/ValidSignatureMiddlewareTest.php b/tests/Integration/Route/ValidSignatureMiddlewareTest.php index 34aa594464..7bcc69c1b3 100644 --- a/tests/Integration/Route/ValidSignatureMiddlewareTest.php +++ b/tests/Integration/Route/ValidSignatureMiddlewareTest.php @@ -21,8 +21,8 @@ protected function setUp(): void { parent::setUp(); - $this->registerRoute([SignedUrlController::class, 'signedAction']); - $this->registerRoute([SignedUrlController::class, 'unsignedAction']); + $this->http->registerRoute([SignedUrlController::class, 'signedAction']); + $this->http->registerRoute([SignedUrlController::class, 'unsignedAction']); } #[Test]