diff --git a/_ide_helper.php b/_ide_helper.php index 04c64cd8..82638d37 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -5,7 +5,7 @@ /** * A helper file for Laravel, to provide autocomplete information to your IDE - * Generated for Laravel 10.48.8. + * Generated for Laravel 11.11.1. * * This file should not be included in your code, only analyzed by your IDE! * @@ -20,6 +20,25 @@ namespace Illuminate\Support\Facades { * @see \Illuminate\Foundation\Application */ class App { /** + * Begin configuring a new Laravel application instance. + * + * @param string|null $basePath + * @return \Illuminate\Foundation\Configuration\ApplicationBuilder + * @static + */ public static function configure($basePath = null) + { + return \Illuminate\Foundation\Application::configure($basePath); + } + /** + * Infer the application's base directory from the environment. + * + * @return string + * @static + */ public static function inferBasePath() + { + return \Illuminate\Foundation\Application::inferBasePath(); + } + /** * Get the version number of the application. * * @return string @@ -139,6 +158,16 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Foundation\Application $instance */ return $instance->bootstrapPath($path); + } + /** + * Get the path to the service provider list in the bootstrap directory. + * + * @return string + * @static + */ public static function getBootstrapProvidersPath() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getBootstrapProvidersPath(); } /** * Set the bootstrap file directory. @@ -431,6 +460,17 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Foundation\Application $instance */ return $instance->hasDebugModeEnabled(); + } + /** + * Register a new registered listener. + * + * @param callable $callback + * @return void + * @static + */ public static function registered($callback) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->registered($callback); } /** * Register all of the configured providers. @@ -594,6 +634,48 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Foundation\Application $instance */ return $instance->handle($request, $type, $catch); + } + /** + * Handle the incoming HTTP request and send the response to the browser. + * + * @param \Illuminate\Http\Request $request + * @return void + * @static + */ public static function handleRequest($request) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->handleRequest($request); + } + /** + * Handle the incoming Artisan command. + * + * @param \Symfony\Component\Console\Input\InputInterface $input + * @return int + * @static + */ public static function handleCommand($input) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->handleCommand($input); + } + /** + * Determine if the framework's base configuration should be merged. + * + * @return bool + * @static + */ public static function shouldMergeFrameworkConfiguration() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->shouldMergeFrameworkConfiguration(); + } + /** + * Indicate that the framework's base configuration should not be merged. + * + * @return \Illuminate\Foundation\Application + * @static + */ public static function dontMergeFrameworkConfiguration() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->dontMergeFrameworkConfiguration(); } /** * Determine if middleware has been disabled for the application. @@ -755,7 +837,7 @@ namespace Illuminate\Support\Facades { /** * Get the service providers that have been loaded. * - * @return array + * @return array * @static */ public static function getLoadedProviders() { @@ -1436,6 +1518,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -1535,6 +1618,16 @@ namespace Illuminate\Support\Facades { { //Method inherited from \Illuminate\Foundation\Console\Kernel /** @var \App\Console\Kernel $instance */ return $instance->commandStartedAt(); + } + /** + * Resolve a console schedule instance. + * + * @return \Illuminate\Console\Scheduling\Schedule + * @static + */ public static function resolveConsoleSchedule() + { //Method inherited from \Illuminate\Foundation\Console\Kernel + /** @var \App\Console\Kernel $instance */ + return $instance->resolveConsoleSchedule(); } /** * Register a Closure based command with the application. @@ -1635,6 +1728,39 @@ namespace Illuminate\Support\Facades { { //Method inherited from \Illuminate\Foundation\Console\Kernel /** @var \App\Console\Kernel $instance */ $instance->setArtisan($artisan); + } + /** + * Set the Artisan commands provided by the application. + * + * @param array $commands + * @return \App\Console\Kernel + * @static + */ public static function addCommands($commands) + { //Method inherited from \Illuminate\Foundation\Console\Kernel + /** @var \App\Console\Kernel $instance */ + return $instance->addCommands($commands); + } + /** + * Set the paths that should have their Artisan commands automatically discovered. + * + * @param array $paths + * @return \App\Console\Kernel + * @static + */ public static function addCommandPaths($paths) + { //Method inherited from \Illuminate\Foundation\Console\Kernel + /** @var \App\Console\Kernel $instance */ + return $instance->addCommandPaths($paths); + } + /** + * Set the paths that should have their Artisan "routes" automatically discovered. + * + * @param array $paths + * @return \App\Console\Kernel + * @static + */ public static function addCommandRoutePaths($paths) + { //Method inherited from \Illuminate\Foundation\Console\Kernel + /** @var \App\Console\Kernel $instance */ + return $instance->addCommandRoutePaths($paths); } } /** @@ -1976,14 +2102,13 @@ namespace Illuminate\Support\Facades { * The application must be using the AuthenticateSession middleware. * * @param string $password - * @param string $attribute * @return \App\Models\User|null * @throws \Illuminate\Auth\AuthenticationException * @static - */ public static function logoutOtherDevices($password, $attribute = 'password') + */ public static function logoutOtherDevices($password) { /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->logoutOtherDevices($password, $attribute); + return $instance->logoutOtherDevices($password); } /** * Register an authentication attempt event listener. @@ -2229,6 +2354,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -2785,6 +2911,33 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ return $instance->socket($request); + } + /** + * Begin sending an anonymous broadcast to the given channels. + * + * @static + */ public static function on($channels) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->on($channels); + } + /** + * Begin sending an anonymous broadcast to the given private channels. + * + * @static + */ public static function private($channel) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->private($channel); + } + /** + * Begin sending an anonymous broadcast to the given presence channels. + * + * @static + */ public static function presence($channel) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->presence($channel); } /** * Begin broadcasting an event. @@ -3425,12 +3578,13 @@ namespace Illuminate\Support\Facades { * Create a new cache repository with the given implementation. * * @param \Illuminate\Contracts\Cache\Store $store + * @param array $config * @return \Illuminate\Cache\Repository * @static - */ public static function repository($store) + */ public static function repository($store, $config = []) { /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->repository($store); + return $instance->repository($store, $config); } /** * Re-set the event dispatcher on all resolved cache repositories. @@ -3853,7 +4007,7 @@ namespace Illuminate\Support\Facades { /** * Get the event dispatcher instance. * - * @return \Illuminate\Contracts\Events\Dispatcher + * @return \Illuminate\Contracts\Events\Dispatcher|null * @static */ public static function getEventDispatcher() { @@ -3921,6 +4075,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -4036,6 +4191,17 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Cache\FileStore $instance */ return $instance->getDirectory(); + } + /** + * Set the working directory of the cache. + * + * @param string $directory + * @return \Illuminate\Cache\FileStore + * @static + */ public static function setDirectory($directory) + { + /** @var \Illuminate\Cache\FileStore $instance */ + return $instance->setDirectory($directory); } /** * Set the cache directory where locks should be stored. @@ -4097,6 +4263,66 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Config\Repository $instance */ return $instance->getMany($keys); + } + /** + * Get the specified string configuration value. + * + * @param string $key + * @param \Illuminate\Config\(\Closure():(string|\Illuminate\Config\null))|string|null $default + * @return string + * @static + */ public static function string($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->string($key, $default); + } + /** + * Get the specified integer configuration value. + * + * @param string $key + * @param \Illuminate\Config\(\Closure():(int|\Illuminate\Config\null))|int|null $default + * @return int + * @static + */ public static function integer($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->integer($key, $default); + } + /** + * Get the specified float configuration value. + * + * @param string $key + * @param \Illuminate\Config\(\Closure():(float|\Illuminate\Config\null))|float|null $default + * @return float + * @static + */ public static function float($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->float($key, $default); + } + /** + * Get the specified boolean configuration value. + * + * @param string $key + * @param \Illuminate\Config\(\Closure():(bool|\Illuminate\Config\null))|bool|null $default + * @return bool + * @static + */ public static function boolean($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->boolean($key, $default); + } + /** + * Get the specified array configuration value. + * + * @param string $key + * @param \Illuminate\Config\(\Closure():(array|\Illuminate\Config\null))|\Illuminate\Config\array|null $default + * @return array + * @static + */ public static function array($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->array($key, $default); } /** * Set a given configuration value. @@ -4194,6 +4420,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -4235,6 +4462,381 @@ namespace Illuminate\Support\Facades { /** * * + * @see \Illuminate\Log\Context\Repository + */ class Context { + /** + * Determine if the given key exists. + * + * @param string $key + * @return bool + * @static + */ public static function has($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->has($key); + } + /** + * Determine if the given key exists within the hidden context data. + * + * @param string $key + * @return bool + * @static + */ public static function hasHidden($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->hasHidden($key); + } + /** + * Retrieve all the context data. + * + * @return array + * @static + */ public static function all() + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->all(); + } + /** + * Retrieve all the hidden context data. + * + * @return array + * @static + */ public static function allHidden() + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->allHidden(); + } + /** + * Retrieve the given key's value. + * + * @param string $key + * @param mixed $default + * @return mixed + * @static + */ public static function get($key, $default = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->get($key, $default); + } + /** + * Retrieve the given key's hidden value. + * + * @param string $key + * @param mixed $default + * @return mixed + * @static + */ public static function getHidden($key, $default = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->getHidden($key, $default); + } + /** + * Retrieve the given key's value and then forget it. + * + * @param string $key + * @param mixed $default + * @return mixed + * @static + */ public static function pull($key, $default = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->pull($key, $default); + } + /** + * Retrieve the given key's hidden value and then forget it. + * + * @param string $key + * @param mixed $default + * @return mixed + * @static + */ public static function pullHidden($key, $default = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->pullHidden($key, $default); + } + /** + * Retrieve only the values of the given keys. + * + * @param array $keys + * @return array + * @static + */ public static function only($keys) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->only($keys); + } + /** + * Retrieve only the hidden values of the given keys. + * + * @param array $keys + * @return array + * @static + */ public static function onlyHidden($keys) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->onlyHidden($keys); + } + /** + * Add a context value. + * + * @param string|array $key + * @param mixed $value + * @return \Illuminate\Log\Context\Repository + * @static + */ public static function add($key, $value = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->add($key, $value); + } + /** + * Add a hidden context value. + * + * @param string|array $key + * @param mixed $value + * @return \Illuminate\Log\Context\Repository + * @static + */ public static function addHidden($key, $value = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->addHidden($key, $value); + } + /** + * Forget the given context key. + * + * @param string|array $key + * @return \Illuminate\Log\Context\Repository + * @static + */ public static function forget($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->forget($key); + } + /** + * Forget the given hidden context key. + * + * @param string|array $key + * @return \Illuminate\Log\Context\Repository + * @static + */ public static function forgetHidden($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->forgetHidden($key); + } + /** + * Add a context value if it does not exist yet. + * + * @param string $key + * @param mixed $value + * @return \Illuminate\Log\Context\Repository + * @static + */ public static function addIf($key, $value) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->addIf($key, $value); + } + /** + * Add a hidden context value if it does not exist yet. + * + * @param string $key + * @param mixed $value + * @return \Illuminate\Log\Context\Repository + * @static + */ public static function addHiddenIf($key, $value) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->addHiddenIf($key, $value); + } + /** + * Push the given values onto the key's stack. + * + * @param string $key + * @param mixed $values + * @return \Illuminate\Log\Context\Repository + * @throws \RuntimeException + * @static + */ public static function push($key, ...$values) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->push($key, ...$values); + } + /** + * Push the given hidden values onto the key's stack. + * + * @param string $key + * @param mixed $values + * @return \Illuminate\Log\Context\Repository + * @throws \RuntimeException + * @static + */ public static function pushHidden($key, ...$values) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->pushHidden($key, ...$values); + } + /** + * Determine if the repository is empty. + * + * @return bool + * @static + */ public static function isEmpty() + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->isEmpty(); + } + /** + * Execute the given callback when context is about to be dehydrated. + * + * @param callable $callback + * @return \Illuminate\Log\Context\Repository + * @static + */ public static function dehydrating($callback) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->dehydrating($callback); + } + /** + * Execute the given callback when context has been hydrated. + * + * @param callable $callback + * @return \Illuminate\Log\Context\Repository + * @static + */ public static function hydrated($callback) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->hydrated($callback); + } + /** + * Handle unserialize exceptions using the given callback. + * + * @param callable|null $callback + * @return static + * @static + */ public static function handleUnserializeExceptionsUsing($callback) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->handleUnserializeExceptionsUsing($callback); + } + /** + * Flush all context data. + * + * @return \Illuminate\Log\Context\Repository + * @static + */ public static function flush() + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->flush(); + } + /** + * Dehydrate the context data. + * + * @internal + * @return \Illuminate\Log\Context\?array + * @static + */ public static function dehydrate() + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->dehydrate(); + } + /** + * Hydrate the context instance. + * + * @internal + * @param \Illuminate\Log\Context\?array $context + * @return \Illuminate\Log\Context\Repository + * @throws \RuntimeException + * @static + */ public static function hydrate($context) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->hydrate($context); + } + /** + * Apply the callback if the given "value" is (or resolves to) truthy. + * + * @template TWhenParameter + * @template TWhenReturnType + * @param \Illuminate\Log\Context\(\Closure($this): TWhenParameter)|TWhenParameter|null $value + * @param \Illuminate\Log\Context\(callable($this, TWhenParameter): TWhenReturnType)|null $callback + * @param \Illuminate\Log\Context\(callable($this, TWhenParameter): TWhenReturnType)|null $default + * @return $this|\Illuminate\Log\Context\TWhenReturnType + * @static + */ public static function when($value = null, $callback = null, $default = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->when($value, $callback, $default); + } + /** + * Apply the callback if the given "value" is (or resolves to) falsy. + * + * @template TUnlessParameter + * @template TUnlessReturnType + * @param \Illuminate\Log\Context\(\Closure($this): TUnlessParameter)|TUnlessParameter|null $value + * @param \Illuminate\Log\Context\(callable($this, TUnlessParameter): TUnlessReturnType)|null $callback + * @param \Illuminate\Log\Context\(callable($this, TUnlessParameter): TUnlessReturnType)|null $default + * @return $this|\Illuminate\Log\Context\TUnlessReturnType + * @static + */ public static function unless($value = null, $callback = null, $default = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->unless($value, $callback, $default); + } + /** + * Register a custom macro. + * + * @param string $name + * @param object|callable $macro + * @param-closure-this static $macro + * @return void + * @static + */ public static function macro($name, $macro) + { + \Illuminate\Log\Context\Repository::macro($name, $macro); + } + /** + * Mix another object into the class. + * + * @param object $mixin + * @param bool $replace + * @return void + * @throws \ReflectionException + * @static + */ public static function mixin($mixin, $replace = true) + { + \Illuminate\Log\Context\Repository::mixin($mixin, $replace); + } + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ public static function hasMacro($name) + { + return \Illuminate\Log\Context\Repository::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ public static function flushMacros() + { + \Illuminate\Log\Context\Repository::flushMacros(); + } + /** + * Restore the model from the model identifier instance. + * + * @param \Illuminate\Contracts\Database\ModelIdentifier $value + * @return \Illuminate\Database\Eloquent\Model + * @static + */ public static function restoreModel($value) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->restoreModel($value); + } + } + /** + * + * * @see \Illuminate\Cookie\CookieJar */ class Cookie { /** @@ -4387,6 +4989,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -4510,6 +5113,37 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Encryption\Encrypter $instance */ return $instance->getKey(); + } + /** + * Get the current encryption key and all previous encryption keys. + * + * @return array + * @static + */ public static function getAllKeys() + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->getAllKeys(); + } + /** + * Get the previous encryption keys. + * + * @return array + * @static + */ public static function getPreviousKeys() + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->getPreviousKeys(); + } + /** + * Set the previous / legacy encryption keys that should be utilized if decryption fails. + * + * @param array $keys + * @return \Illuminate\Encryption\Encrypter + * @static + */ public static function previousKeys($keys) + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->previousKeys($keys); } } /** @@ -4669,21 +5303,6 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Database\DatabaseManager $instance */ return $instance->connectUsing($name, $config, $force); - } - /** - * Register a custom Doctrine type. - * - * @param string $class - * @param string $name - * @param string $type - * @return void - * @throws \Doctrine\DBAL\Exception - * @throws \RuntimeException - * @static - */ public static function registerDoctrineType($class, $name, $type) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->registerDoctrineType($class, $name, $type); } /** * Disconnect from the given database and remove from local cache. @@ -4752,7 +5371,7 @@ namespace Illuminate\Support\Facades { $instance->setDefaultConnection($name); } /** - * Get all of the support drivers. + * Get all of the supported drivers. * * @return string[] * @static @@ -4831,6 +5450,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -4890,6 +5510,16 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Database\MySqlConnection $instance */ return $instance->isMaria(); + } + /** + * Get the server version for the connection. + * + * @return string + * @static + */ public static function getServerVersion() + { + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getServerVersion(); } /** * Get a schema builder instance for the connection. @@ -5332,58 +5962,6 @@ namespace Illuminate\Support\Facades { { //Method inherited from \Illuminate\Database\Connection /** @var \Illuminate\Database\MySqlConnection $instance */ return $instance->useWriteConnectionWhenReading($value); - } - /** - * Is Doctrine available? - * - * @return bool - * @static - */ public static function isDoctrineAvailable() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->isDoctrineAvailable(); - } - /** - * Indicates whether native alter operations will be used when dropping, renaming, or modifying columns, even if Doctrine DBAL is installed. - * - * @return bool - * @static - */ public static function usingNativeSchemaOperations() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->usingNativeSchemaOperations(); - } - /** - * Get a Doctrine Schema Column instance. - * - * @param string $table - * @param string $column - * @return \Doctrine\DBAL\Schema\Column - * @static - */ public static function getDoctrineColumn($table, $column) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDoctrineColumn($table, $column); - } - /** - * Get the Doctrine DBAL schema manager for the connection. - * - * @return \Doctrine\DBAL\Schema\AbstractSchemaManager - * @static - */ public static function getDoctrineSchemaManager() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDoctrineSchemaManager(); - } - /** - * Get the Doctrine DBAL database connection instance. - * - * @return \Doctrine\DBAL\Connection - * @static - */ public static function getDoctrineConnection() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDoctrineConnection(); } /** * Get the current PDO connection. @@ -6020,6 +6598,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -6148,6 +6727,16 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ return $instance->hasDispatched($event); + } + /** + * Get the events that have been dispatched. + * + * @return array + * @static + */ public static function dispatchedEvents() + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + return $instance->dispatchedEvents(); } } /** @@ -6740,6 +7329,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -7300,7 +7890,7 @@ namespace Illuminate\Support\Facades { * @method static \Illuminate\Http\Client\PendingRequest withResponseMiddleware(callable $middleware) * @method static \Illuminate\Http\Client\PendingRequest beforeSending(callable $callback) * @method static \Illuminate\Http\Client\PendingRequest throw(callable|null $callback = null) - * @method static \Illuminate\Http\Client\PendingRequest throwIf(callable|bool $condition, callable|null $throwCallback = null) + * @method static \Illuminate\Http\Client\PendingRequest throwIf(callable|bool $condition) * @method static \Illuminate\Http\Client\PendingRequest throwUnless(bool $condition) * @method static \Illuminate\Http\Client\PendingRequest dump() * @method static \Illuminate\Http\Client\PendingRequest dd() @@ -7367,7 +7957,7 @@ namespace Illuminate\Support\Facades { /** * Set the options to apply to every request. * - * @param array $options + * @param \Closure|array $options * @return \Illuminate\Http\Client\Factory * @static */ public static function globalOptions($options) @@ -7539,6 +8129,16 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Http\Client\Factory $instance */ return $instance->recorded($callback); + } + /** + * Create a new pending request instance for this factory. + * + * @return \Illuminate\Http\Client\PendingRequest + * @static + */ public static function createPendingRequest() + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->createPendingRequest(); } /** * Get the current event dispatcher implementation. @@ -7565,6 +8165,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -7890,6 +8491,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -8200,6 +8802,17 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Log\LogManager $instance */ $instance->log($level, $message, $context); + } + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Log\LogManager + * @static + */ public static function setApplication($app) + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->setApplication($app); } } /** @@ -8219,7 +8832,7 @@ namespace Illuminate\Support\Facades { * @method static \Illuminate\Contracts\View\Factory getViewFactory() * @method static void setSymfonyTransport(\Symfony\Component\Mailer\Transport\TransportInterface $transport) * @method static \Illuminate\Mail\Mailer setQueue(\Illuminate\Contracts\Queue\Factory $queue) - * @method static void macro(string $name, object|callable $macro) + * @method static void macro(string $name, object|callable $macro, object|callable $macro = null) * @method static void mixin(object $mixin, bool $replace = true) * @method static bool hasMacro(string $name) * @method static void flushMacros() @@ -8555,15 +9168,28 @@ namespace Illuminate\Support\Facades { * @param \Illuminate\Contracts\Mail\Mailable|string|array $view * @param array $data * @param \Closure|string|null $callback - * @return void + * @return mixed|void * @static */ public static function send($view, $data = [], $callback = null) { /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->send($view, $data, $callback); + return $instance->send($view, $data, $callback); } /** - * Queue a new e-mail message for sending. + * Send a new message synchronously using a view. + * + * @param \Illuminate\Contracts\Mail\Mailable|string|array $mailable + * @param array $data + * @param \Closure|string|null $callback + * @return void + * @static + */ public static function sendNow($mailable, $data = [], $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->sendNow($mailable, $data, $callback); + } + /** + * Queue a new message for sending. * * @param \Illuminate\Contracts\Mail\Mailable|string|array $view * @param string|null $queue @@ -8899,6 +9525,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -9208,6 +9835,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -9724,6 +10352,77 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ return $instance->setConnectionName($name); + } + /** + * Release a reserved job back onto the queue after (n) seconds. + * + * @param string $queue + * @param \Illuminate\Queue\Jobs\DatabaseJobRecord $job + * @param int $delay + * @return mixed + * @static + */ public static function release($queue, $job, $delay) + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->release($queue, $job, $delay); + } + /** + * Delete a reserved job from the queue. + * + * @param string $queue + * @param string $id + * @return void + * @throws \Throwable + * @static + */ public static function deleteReserved($queue, $id) + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + $instance->deleteReserved($queue, $id); + } + /** + * Delete a reserved job from the reserved queue and release it. + * + * @param string $queue + * @param \Illuminate\Queue\Jobs\DatabaseJob $job + * @param int $delay + * @return void + * @static + */ public static function deleteAndRelease($queue, $job, $delay) + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + $instance->deleteAndRelease($queue, $job, $delay); + } + /** + * Delete all of the jobs from the queue. + * + * @param string $queue + * @return int + * @static + */ public static function clear($queue) + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->clear($queue); + } + /** + * Get the queue or return the default. + * + * @param string|null $queue + * @return string + * @static + */ public static function getQueue($queue) + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->getQueue($queue); + } + /** + * Get the underlying database instance. + * + * @return \Illuminate\Database\Connection + * @static + */ public static function getDatabase() + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->getDatabase(); } /** * Get the maximum number of attempts for an object-based queue handler. @@ -9733,7 +10432,7 @@ namespace Illuminate\Support\Facades { * @static */ public static function getJobTries($job) { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\SyncQueue $instance */ + /** @var \Illuminate\Queue\DatabaseQueue $instance */ return $instance->getJobTries($job); } /** @@ -9744,7 +10443,7 @@ namespace Illuminate\Support\Facades { * @static */ public static function getJobBackoff($job) { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\SyncQueue $instance */ + /** @var \Illuminate\Queue\DatabaseQueue $instance */ return $instance->getJobBackoff($job); } /** @@ -9755,7 +10454,7 @@ namespace Illuminate\Support\Facades { * @static */ public static function getJobExpiration($job) { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\SyncQueue $instance */ + /** @var \Illuminate\Queue\DatabaseQueue $instance */ return $instance->getJobExpiration($job); } /** @@ -9766,7 +10465,7 @@ namespace Illuminate\Support\Facades { * @static */ public static function createPayloadUsing($callback) { //Method inherited from \Illuminate\Queue\Queue - \Illuminate\Queue\SyncQueue::createPayloadUsing($callback); + \Illuminate\Queue\DatabaseQueue::createPayloadUsing($callback); } /** * Get the container instance being used by the connection. @@ -9775,7 +10474,7 @@ namespace Illuminate\Support\Facades { * @static */ public static function getContainer() { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\SyncQueue $instance */ + /** @var \Illuminate\Queue\DatabaseQueue $instance */ return $instance->getContainer(); } /** @@ -9786,7 +10485,7 @@ namespace Illuminate\Support\Facades { * @static */ public static function setContainer($container) { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\SyncQueue $instance */ + /** @var \Illuminate\Queue\DatabaseQueue $instance */ $instance->setContainer($container); } } @@ -9868,6 +10567,19 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Cache\RateLimiter $instance */ return $instance->increment($key, $decaySeconds, $amount); + } + /** + * Decrement the counter for a given key for a given decay time by a given amount. + * + * @param string $key + * @param int $decaySeconds + * @param int $amount + * @return int + * @static + */ public static function decrement($key, $decaySeconds = 60, $amount = 1) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->decrement($key, $decaySeconds, $amount); } /** * Get the number of attempts for the given key. @@ -10152,6 +10864,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -10474,7 +11187,7 @@ namespace Illuminate\Support\Facades { return $instance->mergeIfMissing($input); } /** - * Replace the input for the current request. + * Replace the input values for the current request. * * @param array $input * @return \Illuminate\Http\Request @@ -10769,12 +11482,11 @@ namespace Illuminate\Support\Facades { * @param array $files The FILES parameters * @param array $server The SERVER parameters * @param string|resource|null $content The raw body data - * @return void * @static */ public static function initialize($query = [], $request = [], $attributes = [], $cookies = [], $files = [], $server = [], $content = null) { //Method inherited from \Symfony\Component\HttpFoundation\Request /** @var \Illuminate\Http\Request $instance */ - $instance->initialize($query, $request, $attributes, $cookies, $files, $server, $content); + return $instance->initialize($query, $request, $attributes, $cookies, $files, $server, $content); } /** * Creates a new request with values from PHP's super globals. @@ -10809,11 +11521,10 @@ namespace Illuminate\Support\Facades { * to keep BC with an existing system. It should not be used for any * other purpose. * - * @return void * @static */ public static function setFactory($callable) { //Method inherited from \Symfony\Component\HttpFoundation\Request - \Illuminate\Http\Request::setFactory($callable); + return \Illuminate\Http\Request::setFactory($callable); } /** * Overrides the PHP global variables according to this request instance. @@ -10821,12 +11532,11 @@ namespace Illuminate\Support\Facades { * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE. * $_FILES is never overridden, see rfc1867 * - * @return void * @static */ public static function overrideGlobals() { //Method inherited from \Symfony\Component\HttpFoundation\Request /** @var \Illuminate\Http\Request $instance */ - $instance->overrideGlobals(); + return $instance->overrideGlobals(); } /** * Sets a list of trusted proxies. @@ -10835,11 +11545,10 @@ namespace Illuminate\Support\Facades { * * @param array $proxies A list of trusted proxies, the string 'REMOTE_ADDR' will be replaced with $_SERVER['REMOTE_ADDR'] * @param int $trustedHeaderSet A bit field of Request::HEADER_*, to set which headers to trust from your proxies - * @return void * @static */ public static function setTrustedProxies($proxies, $trustedHeaderSet) { //Method inherited from \Symfony\Component\HttpFoundation\Request - \Illuminate\Http\Request::setTrustedProxies($proxies, $trustedHeaderSet); + return \Illuminate\Http\Request::setTrustedProxies($proxies, $trustedHeaderSet); } /** * Gets the list of trusted proxies. @@ -10865,11 +11574,10 @@ namespace Illuminate\Support\Facades { * You should only list the hosts you manage using regexs. * * @param array $hostPatterns A list of trusted host patterns - * @return void * @static */ public static function setTrustedHosts($hostPatterns) { //Method inherited from \Symfony\Component\HttpFoundation\Request - \Illuminate\Http\Request::setTrustedHosts($hostPatterns); + return \Illuminate\Http\Request::setTrustedHosts($hostPatterns); } /** * Gets the list of trusted host patterns. @@ -10902,11 +11610,10 @@ namespace Illuminate\Support\Facades { * * The HTTP method can only be overridden when the real HTTP method is POST. * - * @return void * @static */ public static function enableHttpMethodParameterOverride() { //Method inherited from \Symfony\Component\HttpFoundation\Request - \Illuminate\Http\Request::enableHttpMethodParameterOverride(); + return \Illuminate\Http\Request::enableHttpMethodParameterOverride(); } /** * Checks whether support for the _method request parameter is enabled. @@ -10929,12 +11636,11 @@ namespace Illuminate\Support\Facades { /** * * - * @return void * @static */ public static function setSession($session) { //Method inherited from \Symfony\Component\HttpFoundation\Request /** @var \Illuminate\Http\Request $instance */ - $instance->setSession($session); + return $instance->setSession($session); } /** * @@ -11214,12 +11920,11 @@ namespace Illuminate\Support\Facades { /** * Sets the request method. * - * @return void * @static */ public static function setMethod($method) { //Method inherited from \Symfony\Component\HttpFoundation\Request /** @var \Illuminate\Http\Request $instance */ - $instance->setMethod($method); + return $instance->setMethod($method); } /** * Gets the request "intended" method. @@ -11280,12 +11985,11 @@ namespace Illuminate\Support\Facades { * Associates a format with mime types. * * @param string|string[] $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type) - * @return void * @static */ public static function setFormat($format, $mimeTypes) { //Method inherited from \Symfony\Component\HttpFoundation\Request /** @var \Illuminate\Http\Request $instance */ - $instance->setFormat($format, $mimeTypes); + return $instance->setFormat($format, $mimeTypes); } /** * Gets the request format. @@ -11306,22 +12010,11 @@ namespace Illuminate\Support\Facades { /** * Sets the request format. * - * @return void * @static */ public static function setRequestFormat($format) { //Method inherited from \Symfony\Component\HttpFoundation\Request /** @var \Illuminate\Http\Request $instance */ - $instance->setRequestFormat($format); - } - /** - * Gets the usual name of the format associated with the request's media type (provided in the Content-Type header). - * - * @deprecated since Symfony 6.2, use getContentTypeFormat() instead - * @static - */ public static function getContentType() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getContentType(); + return $instance->setRequestFormat($format); } /** * Gets the usual name of the format associated with the request's media type (provided in the Content-Type header). @@ -11336,12 +12029,11 @@ namespace Illuminate\Support\Facades { /** * Sets the default locale. * - * @return void * @static */ public static function setDefaultLocale($locale) { //Method inherited from \Symfony\Component\HttpFoundation\Request /** @var \Illuminate\Http\Request $instance */ - $instance->setDefaultLocale($locale); + return $instance->setDefaultLocale($locale); } /** * Get the default locale. @@ -11355,12 +12047,11 @@ namespace Illuminate\Support\Facades { /** * Sets the locale. * - * @return void * @static */ public static function setLocale($locale) { //Method inherited from \Symfony\Component\HttpFoundation\Request /** @var \Illuminate\Http\Request $instance */ - $instance->setLocale($locale); + return $instance->setLocale($locale); } /** * Get the locale. @@ -12148,17 +12839,6 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Http\Request $instance */ return $instance->file($key, $default); - } - /** - * Dump the request items and end the script. - * - * @param mixed $keys - * @return \Illuminate\Http\never - * @static - */ public static function dd(...$keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->dd(...$keys); } /** * Dump the items. @@ -12170,12 +12850,24 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Http\Request $instance */ return $instance->dump($keys); + } + /** + * Dump the given arguments and terminate execution. + * + * @param mixed $args + * @return \Illuminate\Http\never + * @static + */ public static function dd(...$args) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->dd(...$args); } /** * Register a custom macro. * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -12265,6 +12957,16 @@ namespace Illuminate\Support\Facades { */ public static function hasValidSignatureWhileIgnoring($ignoreQuery = [], $absolute = true) { return \Illuminate\Http\Request::hasValidSignatureWhileIgnoring($ignoreQuery, $absolute); + } + /** + * + * + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() + * @param mixed $ignoreQuery + * @static + */ public static function hasValidRelativeSignatureWhileIgnoring($ignoreQuery = []) + { + return \Illuminate\Http\Request::hasValidRelativeSignatureWhileIgnoring($ignoreQuery); } } /** @@ -12375,6 +13077,7 @@ namespace Illuminate\Support\Facades { * @param array $headers * @param string|null $disposition * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @throws \Illuminate\Routing\Exceptions\StreamedResponseException * @static */ public static function streamDownload($callback, $name = null, $headers = [], $disposition = 'attachment') { @@ -12482,6 +13185,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -12958,7 +13662,7 @@ namespace Illuminate\Support\Facades { $instance->substituteImplicitBindings($route); } /** - * Register a callback to to run after implicit bindings are substituted. + * Register a callback to run after implicit bindings are substituted. * * @param callable $callback * @return \Illuminate\Routing\Router @@ -13381,6 +14085,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -13472,6 +14177,160 @@ namespace Illuminate\Support\Facades { /** * * + * @see \Illuminate\Console\Scheduling\Schedule + */ class Schedule { + /** + * Add a new callback event to the schedule. + * + * @param string|callable $callback + * @param array $parameters + * @return \Illuminate\Console\Scheduling\CallbackEvent + * @static + */ public static function call($callback, $parameters = []) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->call($callback, $parameters); + } + /** + * Add a new Artisan command event to the schedule. + * + * @param string $command + * @param array $parameters + * @return \Illuminate\Console\Scheduling\Event + * @static + */ public static function command($command, $parameters = []) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->command($command, $parameters); + } + /** + * Add a new job callback event to the schedule. + * + * @param object|string $job + * @param string|null $queue + * @param string|null $connection + * @return \Illuminate\Console\Scheduling\CallbackEvent + * @static + */ public static function job($job, $queue = null, $connection = null) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->job($job, $queue, $connection); + } + /** + * Add a new command event to the schedule. + * + * @param string $command + * @param array $parameters + * @return \Illuminate\Console\Scheduling\Event + * @static + */ public static function exec($command, $parameters = []) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->exec($command, $parameters); + } + /** + * Compile array input for a command. + * + * @param string|int $key + * @param array $value + * @return string + * @static + */ public static function compileArrayInput($key, $value) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->compileArrayInput($key, $value); + } + /** + * Determine if the server is allowed to run this event. + * + * @param \Illuminate\Console\Scheduling\Event $event + * @param \DateTimeInterface $time + * @return bool + * @static + */ public static function serverShouldRun($event, $time) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->serverShouldRun($event, $time); + } + /** + * Get all of the events on the schedule that are due. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Support\Collection + * @static + */ public static function dueEvents($app) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->dueEvents($app); + } + /** + * Get all of the events on the schedule. + * + * @return \Illuminate\Console\Scheduling\Event[] + * @static + */ public static function events() + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->events(); + } + /** + * Specify the cache store that should be used to store mutexes. + * + * @param string $store + * @return \Illuminate\Console\Scheduling\Schedule + * @static + */ public static function useCache($store) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->useCache($store); + } + /** + * Register a custom macro. + * + * @param string $name + * @param object|callable $macro + * @param-closure-this static $macro + * @return void + * @static + */ public static function macro($name, $macro) + { + \Illuminate\Console\Scheduling\Schedule::macro($name, $macro); + } + /** + * Mix another object into the class. + * + * @param object $mixin + * @param bool $replace + * @return void + * @throws \ReflectionException + * @static + */ public static function mixin($mixin, $replace = true) + { + \Illuminate\Console\Scheduling\Schedule::mixin($mixin, $replace); + } + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ public static function hasMacro($name) + { + return \Illuminate\Console\Scheduling\Schedule::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ public static function flushMacros() + { + \Illuminate\Console\Scheduling\Schedule::flushMacros(); + } + } + /** + * + * * @see \Illuminate\Database\Schema\Builder */ class Schema { /** @@ -13515,28 +14374,6 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ return $instance->getViews(); - } - /** - * Get all of the table names for the database. - * - * @deprecated Will be removed in a future Laravel version. - * @return array - * @static - */ public static function getAllTables() - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getAllTables(); - } - /** - * Get all of the view names for the database. - * - * @deprecated Will be removed in a future Laravel version. - * @return array - * @static - */ public static function getAllViews() - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getAllViews(); } /** * Get the columns for a given table. @@ -13629,16 +14466,6 @@ namespace Illuminate\Support\Facades { */ public static function morphUsingUlids() { //Method inherited from \Illuminate\Database\Schema\Builder \Illuminate\Database\Schema\MySqlBuilder::morphUsingUlids(); - } - /** - * Attempt to use native schema operations for dropping, renaming, and modifying columns, even if Doctrine DBAL is installed. - * - * @param bool $value - * @return void - * @static - */ public static function useNativeSchemaOperationsIfPossible($value = true) - { //Method inherited from \Illuminate\Database\Schema\Builder - \Illuminate\Database\Schema\MySqlBuilder::useNativeSchemaOperationsIfPossible($value); } /** * Determine if the given table exists. @@ -13929,6 +14756,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -14193,7 +15021,7 @@ namespace Illuminate\Support\Facades { return $instance->missing($key); } /** - * Checks if a key is present and not null. + * Determine if a key is present and not null. * * @param string|array $key * @return bool @@ -14202,6 +15030,17 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Session\Store $instance */ return $instance->has($key); + } + /** + * Determine if any of the given keys are present and not null. + * + * @param string|array $key + * @return bool + * @static + */ public static function hasAny($key) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->hasAny($key); } /** * Get an item from the session. @@ -14471,6 +15310,16 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Session\Store $instance */ $instance->setName($name); + } + /** + * Get the current session ID. + * + * @return string + * @static + */ public static function id() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->id(); } /** * Get the current session ID. @@ -14613,6 +15462,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -14939,7 +15789,7 @@ namespace Illuminate\Support\Facades { return $instance->directoryMissing($path); } /** - * Get the full path for the file at the given "short" path. + * Get the full path to the file that exists at the given relative path. * * @param string $path * @return string @@ -15386,6 +16236,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -15496,6 +16347,20 @@ namespace Illuminate\Support\Facades { { /** @var \Illuminate\Routing\UrlGenerator $instance */ return $instance->to($path, $extra, $secure); + } + /** + * Generate an absolute URL with the given query parameters. + * + * @param string $path + * @param array $query + * @param mixed $extra + * @param bool|null $secure + * @return string + * @static + */ public static function query($path, $query = [], $extra = [], $secure = null) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->query($path, $query, $extra, $secure); } /** * Generate a secure, absolute URL to the given path. @@ -15900,6 +16765,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -16481,6 +17347,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -17044,7 +17911,7 @@ namespace Illuminate\Support\Facades { /** * Resolve asset paths using the provided resolver. * - * @param callable|null $urlResolver + * @param callable|null $resolver * @return \Illuminate\Foundation\Vite * @static */ public static function createAssetPathsUsing($resolver) @@ -17188,6 +18055,7 @@ namespace Illuminate\Support\Facades { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -17232,6 +18100,7 @@ namespace App\Facades { /** * * + * @see \App\Services\QrCodeService */ class QrCode { /** * Encode a string into a QR code image @@ -18141,6 +19010,10 @@ namespace Laravel\Socialite\Facades { /** * * + * @method array getScopes() + * @method \Laravel\Socialite\Contracts\Provider scopes(array|string $scopes) + * @method \Laravel\Socialite\Contracts\Provider setScopes(array|string $scopes) + * @method \Laravel\Socialite\Contracts\Provider redirectUrl(string $url) * @see \Laravel\Socialite\SocialiteManager */ class Socialite { /** @@ -18256,374 +19129,6 @@ namespace Laravel\Socialite\Facades { } } -namespace Spatie\LaravelIgnition\Facades { - /** - * - * - * @see \Spatie\FlareClient\Flare - */ class Flare { - /** - * - * - * @static - */ public static function make($apiKey = null, $contextDetector = null) - { - return \Spatie\FlareClient\Flare::make($apiKey, $contextDetector); - } - /** - * - * - * @static - */ public static function setApiToken($apiToken) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->setApiToken($apiToken); - } - /** - * - * - * @static - */ public static function apiTokenSet() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->apiTokenSet(); - } - /** - * - * - * @static - */ public static function setBaseUrl($baseUrl) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->setBaseUrl($baseUrl); - } - /** - * - * - * @static - */ public static function setStage($stage) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->setStage($stage); - } - /** - * - * - * @static - */ public static function sendReportsImmediately() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->sendReportsImmediately(); - } - /** - * - * - * @static - */ public static function determineVersionUsing($determineVersionCallable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->determineVersionUsing($determineVersionCallable); - } - /** - * - * - * @static - */ public static function reportErrorLevels($reportErrorLevels) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->reportErrorLevels($reportErrorLevels); - } - /** - * - * - * @static - */ public static function filterExceptionsUsing($filterExceptionsCallable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->filterExceptionsUsing($filterExceptionsCallable); - } - /** - * - * - * @static - */ public static function filterReportsUsing($filterReportsCallable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->filterReportsUsing($filterReportsCallable); - } - /** - * - * - * @param array|ArgumentReducer>|\Spatie\Backtrace\Arguments\ArgumentReducers|null $argumentReducers - * @static - */ public static function argumentReducers($argumentReducers) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->argumentReducers($argumentReducers); - } - /** - * - * - * @static - */ public static function withStackFrameArguments($withStackFrameArguments = true) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->withStackFrameArguments($withStackFrameArguments); - } - /** - * - * - * @static - */ public static function version() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->version(); - } - /** - * - * - * @return array> - * @static - */ public static function getMiddleware() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->getMiddleware(); - } - /** - * - * - * @static - */ public static function setContextProviderDetector($contextDetector) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->setContextProviderDetector($contextDetector); - } - /** - * - * - * @static - */ public static function setContainer($container) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->setContainer($container); - } - /** - * - * - * @static - */ public static function registerFlareHandlers() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->registerFlareHandlers(); - } - /** - * - * - * @static - */ public static function registerExceptionHandler() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->registerExceptionHandler(); - } - /** - * - * - * @static - */ public static function registerErrorHandler() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->registerErrorHandler(); - } - /** - * - * - * @param \Spatie\FlareClient\FlareMiddleware\FlareMiddleware|array|\Spatie\FlareClient\class-string|callable $middleware - * @return \Spatie\FlareClient\Flare - * @static - */ public static function registerMiddleware($middleware) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->registerMiddleware($middleware); - } - /** - * - * - * @return array> - * @static - */ public static function getMiddlewares() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->getMiddlewares(); - } - /** - * - * - * @param string $name - * @param string $messageLevel - * @param array $metaData - * @return \Spatie\FlareClient\Flare - * @static - */ public static function glow($name, $messageLevel = 'info', $metaData = []) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->glow($name, $messageLevel, $metaData); - } - /** - * - * - * @static - */ public static function handleException($throwable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->handleException($throwable); - } - /** - * - * - * @return mixed - * @static - */ public static function handleError($code, $message, $file = '', $line = 0) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->handleError($code, $message, $file, $line); - } - /** - * - * - * @static - */ public static function applicationPath($applicationPath) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->applicationPath($applicationPath); - } - /** - * - * - * @static - */ public static function report($throwable, $callback = null, $report = null) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->report($throwable, $callback, $report); - } - /** - * - * - * @static - */ public static function reportMessage($message, $logLevel, $callback = null) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->reportMessage($message, $logLevel, $callback); - } - /** - * - * - * @static - */ public static function sendTestReport($throwable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->sendTestReport($throwable); - } - /** - * - * - * @static - */ public static function reset() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->reset(); - } - /** - * - * - * @static - */ public static function anonymizeIp() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->anonymizeIp(); - } - /** - * - * - * @param array $fieldNames - * @return \Spatie\FlareClient\Flare - * @static - */ public static function censorRequestBodyFields($fieldNames) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->censorRequestBodyFields($fieldNames); - } - /** - * - * - * @static - */ public static function createReport($throwable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->createReport($throwable); - } - /** - * - * - * @static - */ public static function createReportFromMessage($message, $logLevel) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->createReportFromMessage($message, $logLevel); - } - /** - * - * - * @static - */ public static function stage($stage) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->stage($stage); - } - /** - * - * - * @static - */ public static function messageLevel($messageLevel) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->messageLevel($messageLevel); - } - /** - * - * - * @param string $groupName - * @param mixed $default - * @return array - * @static - */ public static function getGroup($groupName = 'context', $default = []) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->getGroup($groupName, $default); - } - /** - * - * - * @static - */ public static function context($key, $value) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->context($key, $value); - } - /** - * - * - * @param string $groupName - * @param array $properties - * @return \Spatie\FlareClient\Flare - * @static - */ public static function group($groupName, $properties) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->group($groupName, $properties); - } - } - } - namespace Illuminate\Http { /** * @@ -18681,6 +19186,16 @@ namespace Illuminate\Http { */ public static function hasValidSignatureWhileIgnoring($ignoreQuery = [], $absolute = true) { return \Illuminate\Http\Request::hasValidSignatureWhileIgnoring($ignoreQuery, $absolute); + } + /** + * + * + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() + * @param mixed $ignoreQuery + * @static + */ public static function hasValidRelativeSignatureWhileIgnoring($ignoreQuery = []) + { + return \Illuminate\Http\Request::hasValidRelativeSignatureWhileIgnoring($ignoreQuery); } } } @@ -18742,6 +19257,7 @@ namespace { class Bus extends \Illuminate\Support\Facades\Bus {} class Cache extends \Illuminate\Support\Facades\Cache {} class Config extends \Illuminate\Support\Facades\Config {} + class Context extends \Illuminate\Support\Facades\Context {} class Cookie extends \Illuminate\Support\Facades\Cookie {} class Crypt extends \Illuminate\Support\Facades\Crypt {} class Date extends \Illuminate\Support\Facades\Date {} @@ -19151,6 +19667,28 @@ namespace { { /** @var \Illuminate\Database\Eloquent\Builder $instance */ return $instance->eagerLoadRelations($models); + } + /** + * Register a closure to be invoked after the query is executed. + * + * @param \Closure $callback + * @return \Illuminate\Database\Eloquent\Builder|static + * @static + */ public static function afterQuery($callback) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->afterQuery($callback); + } + /** + * Invoke the "after query" modification callbacks. + * + * @param mixed $result + * @return mixed + * @static + */ public static function applyAfterQueryCallbacks($result) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->applyAfterQueryCallbacks($result); } /** * Get a lazy collection for the given query. @@ -19185,10 +19723,10 @@ namespace { * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator * @throws \InvalidArgumentException * @static - */ public static function paginate($perPage = null, $columns = [], $pageName = 'page', $page = null) + */ public static function paginate($perPage = null, $columns = [], $pageName = 'page', $page = null, $total = null) { /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->paginate($perPage, $columns, $pageName, $page); + return $instance->paginate($perPage, $columns, $pageName, $page, $total); } /** * Paginate the given query into a simple paginator. @@ -19572,6 +20110,7 @@ namespace { * @param string|null $alias * @param bool $descending * @return bool + * @throws \RuntimeException * @static */ public static function orderedChunkById($count, $callback, $column = null, $alias = null, $descending = false) { @@ -20242,7 +20781,7 @@ namespace { /** * Set the table which the query is targeting. * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $table + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|\Illuminate\Contracts\Database\Query\Expression|string $table * @param string|null $as * @return \Illuminate\Database\Query\Builder * @static @@ -21107,6 +21646,57 @@ namespace { { /** @var \Illuminate\Database\Query\Builder $instance */ return $instance->orWhereJsonDoesntContain($column, $value); + } + /** + * Add a "where JSON overlaps" clause to the query. + * + * @param string $column + * @param mixed $value + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Query\Builder + * @static + */ public static function whereJsonOverlaps($column, $value, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereJsonOverlaps($column, $value, $boolean, $not); + } + /** + * Add an "or where JSON overlaps" clause to the query. + * + * @param string $column + * @param mixed $value + * @return \Illuminate\Database\Query\Builder + * @static + */ public static function orWhereJsonOverlaps($column, $value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereJsonOverlaps($column, $value); + } + /** + * Add a "where JSON not overlap" clause to the query. + * + * @param string $column + * @param mixed $value + * @param string $boolean + * @return \Illuminate\Database\Query\Builder + * @static + */ public static function whereJsonDoesntOverlap($column, $value, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereJsonDoesntOverlap($column, $value, $boolean); + } + /** + * Add an "or where JSON not overlap" clause to the query. + * + * @param string $column + * @param mixed $value + * @return \Illuminate\Database\Query\Builder + * @static + */ public static function orWhereJsonDoesntOverlap($column, $value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereJsonDoesntOverlap($column, $value); } /** * Add a clause that determines if a JSON path exists to the query. @@ -21523,6 +22113,18 @@ namespace { { /** @var \Illuminate\Database\Query\Builder $instance */ return $instance->limit($value); + } + /** + * Add a "group limit" clause to the query. + * + * @param int $value + * @param string $column + * @return \Illuminate\Database\Query\Builder + * @static + */ public static function groupLimit($value, $column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->groupLimit($value, $column); } /** * Set the limit and offset for a given page. @@ -21909,7 +22511,7 @@ namespace { * Insert or update a record matching the attributes, and fill it with values. * * @param array $attributes - * @param array $values + * @param array|callable $values * @return bool * @static */ public static function updateOrInsert($attributes, $values = []) @@ -22108,12 +22710,13 @@ namespace { /** * Dump the current SQL and bindings. * + * @param mixed $args * @return \Illuminate\Database\Query\Builder * @static - */ public static function dump() + */ public static function dump(...$args) { /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->dump(); + return $instance->dump(...$args); } /** * Dump the raw current SQL with embedded bindings. @@ -22160,6 +22763,7 @@ namespace { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -22220,6 +22824,7 @@ namespace { class Request extends \Illuminate\Support\Facades\Request {} class Response extends \Illuminate\Support\Facades\Response {} class Route extends \Illuminate\Support\Facades\Route {} + class Schedule extends \Illuminate\Support\Facades\Schedule {} class Schema extends \Illuminate\Support\Facades\Schema {} class Session extends \Illuminate\Support\Facades\Session {} class Storage extends \Illuminate\Support\Facades\Storage {} @@ -22235,7 +22840,6 @@ namespace { class DotenvEditor extends \Jackiedo\DotenvEditor\Facades\DotenvEditor {} class Agent extends \Jenssegers\Agent\Facades\Agent {} class Socialite extends \Laravel\Socialite\Facades\Socialite {} - class Flare extends \Spatie\LaravelIgnition\Facades\Flare {} } diff --git a/app.json b/app.json index a3878e3e..67999f7b 100644 --- a/app.json +++ b/app.json @@ -15,7 +15,7 @@ "repository": "https://github.com/Bubka/2FAuth", "success_url": "/register", "scripts": { - "postdeploy": "php artisan passport:install;php artisan storage:link" + "postdeploy": "php artisan passport:install --no-interaction;php artisan storage:link" }, "env": { "APP_KEY": { diff --git a/app/Api/v1/Resources/UserAuthentication.php b/app/Api/v1/Resources/UserAuthentication.php index 522ba14f..2b29be83 100644 --- a/app/Api/v1/Resources/UserAuthentication.php +++ b/app/Api/v1/Resources/UserAuthentication.php @@ -51,7 +51,7 @@ class UserAuthentication extends JsonResource */ public function toArray($request) { - $tz = $request->user()->preferences['timezone']; + $tz = $request->user()?->preferences['timezone'] ?? config('app.timezone'); return [ 'id' => $this->id, diff --git a/app/Api/v1/Resources/UserManagerResource.php b/app/Api/v1/Resources/UserManagerResource.php index 8ccd5fd7..aa98eb40 100644 --- a/app/Api/v1/Resources/UserManagerResource.php +++ b/app/Api/v1/Resources/UserManagerResource.php @@ -85,7 +85,7 @@ class UserManagerResource extends UserResource */ public function toArray($request) { - $tz = $request->user()?->preferences['timezone']; + $tz = $request->user()?->preferences['timezone'] ?? config('app.timezone'); return array_merge( parent::toArray($request), diff --git a/app/Console/Commands/Install.php b/app/Console/Commands/Install.php index 39ca1dc8..77bafcaa 100644 --- a/app/Console/Commands/Install.php +++ b/app/Console/Commands/Install.php @@ -142,7 +142,7 @@ class Install extends Command protected function installPassport() : void { $this->components->task('Setting up Passport', function () : void { - $this->callSilently('passport:install'); + $this->callSilently('passport:install', ['--no-interaction' => true]); }); } diff --git a/app/Console/Commands/Utils/ResetTrait.php b/app/Console/Commands/Utils/ResetTrait.php index e8b19241..37dd4c50 100644 --- a/app/Console/Commands/Utils/ResetTrait.php +++ b/app/Console/Commands/Utils/ResetTrait.php @@ -82,6 +82,7 @@ trait ResetTrait { $this->callSilent('db:seed', [ '--class' => $seeder, + '--no-interaction' => 1 ]); $this->line('Database seeded'); diff --git a/app/Extensions/RemoteUserProvider.php b/app/Extensions/RemoteUserProvider.php index 46d516ac..82cc0541 100644 --- a/app/Extensions/RemoteUserProvider.php +++ b/app/Extensions/RemoteUserProvider.php @@ -129,4 +129,17 @@ class RemoteUserProvider implements UserProvider { throw new Exception(sprintf('No implementation for %s', __METHOD__)); } + + /** + * Rehash the user's password if required and supported. + * + * @param \Illuminate\Contracts\Auth\Authenticatable $user + * @param array $credentials + * @param bool $force + * @return void + */ + public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false) + { + throw new Exception(sprintf('No implementation for %s', __METHOD__)); + } } diff --git a/app/Http/Middleware/KickOutInactiveUser.php b/app/Http/Middleware/KickOutInactiveUser.php index 2d3f36d3..417b799d 100644 --- a/app/Http/Middleware/KickOutInactiveUser.php +++ b/app/Http/Middleware/KickOutInactiveUser.php @@ -29,7 +29,7 @@ class KickOutInactiveUser $user = Auth::user(); $now = Carbon::now(); - $inactiveFor = $now->diffInSeconds(Carbon::parse($user->last_seen_at)); + $inactiveFor = (int) $now->diffInSeconds(Carbon::parse($user->last_seen_at), true); // Fetch all setting values $kickUserAfterXSecond = intval($user->preferences['kickUserAfter']) * 60; diff --git a/app/Listeners/Authentication/LoginListener.php b/app/Listeners/Authentication/LoginListener.php index 3b60eb7a..8e67f364 100644 --- a/app/Listeners/Authentication/LoginListener.php +++ b/app/Listeners/Authentication/LoginListener.php @@ -46,7 +46,7 @@ class LoginListener extends AbstractAccessListener $ip = config('2fauth.proxy_headers.forIp') ?? $this->request->ip(); $userAgent = $this->request->userAgent(); $known = $user->authentications()->whereIpAddress($ip)->whereUserAgent($userAgent)->whereLoginSuccessful(true)->first(); - $newUser = Carbon::parse($user->{$user->getCreatedAtColumn()})->diffInMinutes(Carbon::now()) < 1; + $newUser = Carbon::parse($user->{$user->getCreatedAtColumn()})->diffInMinutes(Carbon::now(), true) < 1; $guard = $event->guard; $log = $user->authentications()->create([ diff --git a/app/Listeners/Authentication/VisitedByProxyUserListener.php b/app/Listeners/Authentication/VisitedByProxyUserListener.php index 6bf3695e..b7b556eb 100644 --- a/app/Listeners/Authentication/VisitedByProxyUserListener.php +++ b/app/Listeners/Authentication/VisitedByProxyUserListener.php @@ -25,7 +25,7 @@ class VisitedByProxyUserListener extends AbstractAccessListener $ip = config('2fauth.proxy_headers.forIp') ?? $this->request->ip(); $userAgent = $this->request->userAgent(); $known = $user->authentications()->whereIpAddress($ip)->whereUserAgent($userAgent)->whereLoginSuccessful(true)->first(); - $newUser = Carbon::parse($user->{$user->getCreatedAtColumn()})->diffInMinutes(Carbon::now()) < 1; + $newUser = Carbon::parse($user->{$user->getCreatedAtColumn()})->diffInMinutes(Carbon::now(), true) < 1; $guard = config('auth.defaults.guard'); $log = $user->authentications()->create([ diff --git a/app/Models/AuthLog.php b/app/Models/AuthLog.php index 4f8f3eba..1e1b82d4 100644 --- a/app/Models/AuthLog.php +++ b/app/Models/AuthLog.php @@ -29,6 +29,8 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\MorphTo; /** + * + * * @property int $id * @property string $authenticatable_type * @property int $authenticatable_id @@ -40,6 +42,24 @@ use Illuminate\Database\Eloquent\Relations\MorphTo; * @property bool $cleared_by_user * @property string|null $guard * @property string|null $method + * @property string|null $login_method + * @property-read Model|\Eloquent $authenticatable + * @method static \Database\Factories\AuthLogFactory factory($count = null, $state = []) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog query() + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereAuthenticatableId($value) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereAuthenticatableType($value) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereClearedByUser($value) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereGuard($value) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereIpAddress($value) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereLoginAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereLoginMethod($value) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereLoginSuccessful($value) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereLogoutAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|AuthLog whereUserAgent($value) + * @mixin \Eloquent */ class AuthLog extends Model { diff --git a/app/Models/Group.php b/app/Models/Group.php index e8e0006d..02637c76 100644 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -19,6 +19,17 @@ use Illuminate\Support\Facades\Log; * @property int|null $user_id * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\TwoFAccount[] $twofaccounts * @property-read \App\Models\User|null $user + * @method static \Database\Factories\GroupFactory factory($count = null, $state = []) + * @method static \Illuminate\Database\Eloquent\Builder|Group newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Group newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Group orphans() + * @method static \Illuminate\Database\Eloquent\Builder|Group query() + * @method static \Illuminate\Database\Eloquent\Builder|Group whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Group whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Group whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|Group whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Group whereUserId($value) + * @mixin \Eloquent */ class Group extends Model { diff --git a/app/Models/Option.php b/app/Models/Option.php index 69ba8c0d..ec20da66 100644 --- a/app/Models/Option.php +++ b/app/Models/Option.php @@ -10,6 +10,13 @@ use Illuminate\Database\Eloquent\Model; * @property int $id * @property string $key * @property string $value + * @method static \Illuminate\Database\Eloquent\Builder|Option newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Option newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Option query() + * @method static \Illuminate\Database\Eloquent\Builder|Option whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Option whereKey($value) + * @method static \Illuminate\Database\Eloquent\Builder|Option whereValue($value) + * @mixin \Eloquent */ class Option extends Model { diff --git a/app/Models/TwoFAccount.php b/app/Models/TwoFAccount.php index 54abb1a8..a8da476d 100644 --- a/app/Models/TwoFAccount.php +++ b/app/Models/TwoFAccount.php @@ -53,6 +53,29 @@ use SteamTotp\SteamTotp; * @property int|null $counter * @property int|null $user_id * @property-read \App\Models\User|null $user + * @method static \Database\Factories\TwoFAccountFactory factory($count = null, $state = []) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount ordered(string $direction = 'asc') + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount orphans() + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount query() + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereAccount($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereAlgorithm($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereCounter($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereDigits($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereGroupId($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereIcon($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereLegacyUri($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereOrderColumn($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereOtpType($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount wherePeriod($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereSecret($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereService($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|TwoFAccount whereUserId($value) + * @mixin \Eloquent */ class TwoFAccount extends Model implements Sortable { diff --git a/app/Models/User.php b/app/Models/User.php index 912cb29f..c81ae442 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -46,9 +46,24 @@ use Laravel\Passport\HasApiTokens; * @property-read \Illuminate\Database\Eloquent\Collection $authentications * @property-read int|null $authentications_count * @property-read \App\Models\AuthLog|null $latestAuthentication - * * @method static \Illuminate\Database\Eloquent\Builder|User admins() - * + * @method static \Database\Factories\UserFactory factory($count = null, $state = []) + * @method static \Illuminate\Database\Eloquent\Builder|User newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|User newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|User query() + * @method static \Illuminate\Database\Eloquent\Builder|User whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereEmail($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereEmailVerifiedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereIsAdmin($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereLastSeenAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereOauthId($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereOauthProvider($value) + * @method static \Illuminate\Database\Eloquent\Builder|User wherePassword($value) + * @method static \Illuminate\Database\Eloquent\Builder|User wherePreferences($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereRememberToken($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereUpdatedAt($value) * @mixin \Eloquent */ class User extends Authenticatable implements HasLocalePreference, WebAuthnAuthenticatable diff --git a/composer.json b/composer.json index d89cc849..e1767410 100644 --- a/composer.json +++ b/composer.json @@ -4,9 +4,15 @@ "description": "Two-Factor authentication generator", "keywords": [ "2fauth", - "two-actor authentication" + "two-factor authentication" ], "license": "MIT", + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/Bubka/Laravel-Dotenv-Editor.git" + } + ], "require": { "php": "^8.2", "ext-bcmath": "*", @@ -22,17 +28,15 @@ "ext-xml": "*", "chillerlan/php-qrcode": "^5.0", "doctormckay/steam-totp": "^1.0", - "doctrine/dbal": "^3.4", "google/protobuf": "^4.26", - "guzzlehttp/guzzle": "^7.2", - "jackiedo/dotenv-editor": "^2.1", + "jackiedo/dotenv-editor": "dev-master", "jenssegers/agent": "^2.6", "khanamiryan/qrcode-detector-decoder": "^2.0.2", "laragear/webauthn": "^2.0", - "laravel/framework": "^10.10", - "laravel/passport": "^11.2", + "laravel/framework": "^11.9", + "laravel/passport": "^12.0", "laravel/socialite": "^5.10", - "laravel/tinker": "^2.8", + "laravel/tinker": "^2.9", "laravel/ui": "^4.2", "paragonie/constant_time_encoding": "^2.6", "socialiteproviders/manager": "^4.4", @@ -40,21 +44,24 @@ "spomky-labs/otphp": "^11.0" }, "require-dev": { - "barryvdh/laravel-ide-helper": "^2.13", - "brianium/paratest": "^7.3", + "barryvdh/laravel-ide-helper": "^3.0", + "brianium/paratest": "^7.5", "fakerphp/faker": "^1.21", - "larastan/larastan": "^2.0", - "laravel/pint": "^1.6", - "mockery/mockery": "^1.5", - "nunomaduro/collision": "^7.0", + "larastan/larastan": "^2.9", + "laravel/pint": "^1.16", + "mockery/mockery": "^1.6", + "nunomaduro/collision": "^8.1", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.1", - "spatie/laravel-ignition": "^2.0" + "phpunit/phpunit": "^11.0.10" }, "config": { "optimize-autoloader": true, "preferred-install": "dist", - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true, + "php-http/discovery": true + } }, "extra": { "laravel": { diff --git a/composer.lock b/composer.lock index 639a25fb..a5250db5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "37f8918e71d36728aacef582fb83b503", + "content-hash": "bff445ed39877e4dfccfb5b451e0d96a", "packages": [ { "name": "brick/math", @@ -68,26 +68,26 @@ }, { "name": "carbonphp/carbon-doctrine-types", - "version": "2.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", - "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": "^8.1" }, "conflict": { - "doctrine/dbal": "<3.7.0 || >=4.0.0" + "doctrine/dbal": "<4.0.0 || >=5.0.0" }, "require-dev": { - "doctrine/dbal": "^3.7.0", + "doctrine/dbal": "^4.0.0", "nesbot/carbon": "^2.71.0 || ^3.0.0", "phpunit/phpunit": "^10.3" }, @@ -117,7 +117,7 @@ ], "support": { "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" }, "funding": [ { @@ -133,7 +133,7 @@ "type": "tidelift" } ], - "time": "2023-12-11T17:09:12+00:00" + "time": "2024-02-09T16:56:22+00:00" }, { "name": "chillerlan/php-qrcode", @@ -473,350 +473,6 @@ }, "time": "2016-09-13T12:59:10+00:00" }, - { - "name": "doctrine/cache", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2022-05-20T20:07:39+00:00" - }, - { - "name": "doctrine/dbal", - "version": "3.8.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "b05e48a745f722801f55408d0dbd8003b403dbbd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b05e48a745f722801f55408d0dbd8003b403dbbd", - "reference": "b05e48a745f722801f55408d0dbd8003b403dbbd", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2", - "doctrine/cache": "^1.11|^2.0", - "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1|^2", - "php": "^7.4 || ^8.0", - "psr/cache": "^1|^2|^3", - "psr/log": "^1|^2|^3" - }, - "require-dev": { - "doctrine/coding-standard": "12.0.0", - "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.58", - "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.16", - "psalm/plugin-phpunit": "0.18.4", - "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.9.0", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/console": "^4.4|^5.4|^6.0|^7.0", - "vimeo/psalm": "4.30.0" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.4" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", - "type": "tidelift" - } - ], - "time": "2024-04-25T07:04:44+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.3" - }, - "time": "2024-01-30T19:34:25+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.28" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2022-10-12T20:59:15+00:00" - }, { "name": "doctrine/inflector", "version": "2.0.10", @@ -1115,26 +771,26 @@ }, { "name": "firebase/php-jwt", - "version": "v6.10.0", + "version": "v6.10.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" + "reference": "500501c2ce893c824c801da135d02661199f60c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", - "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", + "reference": "500501c2ce893c824c801da135d02661199f60c5", "shasum": "" }, "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "require-dev": { - "guzzlehttp/guzzle": "^6.5||^7.4", + "guzzlehttp/guzzle": "^7.4", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "psr/cache": "^1.0||^2.0", + "psr/cache": "^2.0||^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0" }, @@ -1172,9 +828,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.10.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" }, - "time": "2023-12-01T16:26:39+00:00" + "time": "2024-05-18T18:05:11+00:00" }, { "name": "fruitcake/php-cors", @@ -1249,16 +905,16 @@ }, { "name": "google/protobuf", - "version": "v4.26.1", + "version": "v4.27.1", "source": { "type": "git", "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "5c46b0eb09e7ad3e6efef3c5a85e2a34108c52ae" + "reference": "c471e2b3afe61bf41f22d1ca926b24e7ce96c598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/5c46b0eb09e7ad3e6efef3c5a85e2a34108c52ae", - "reference": "5c46b0eb09e7ad3e6efef3c5a85e2a34108c52ae", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/c471e2b3afe61bf41f22d1ca926b24e7ce96c598", + "reference": "c471e2b3afe61bf41f22d1ca926b24e7ce96c598", "shasum": "" }, "require": { @@ -1287,9 +943,9 @@ "proto" ], "support": { - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.26.1" + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.27.1" }, - "time": "2024-03-27T19:56:50+00:00" + "time": "2024-06-05T16:59:28+00:00" }, { "name": "graham-campbell/result-type", @@ -1766,24 +1422,25 @@ }, { "name": "jackiedo/dotenv-editor", - "version": "2.1.0", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/JackieDo/Laravel-Dotenv-Editor.git", - "reference": "24667e3704b281e0d6c56de340bed1dc718072a1" + "url": "https://github.com/Bubka/Laravel-Dotenv-Editor.git", + "reference": "e8743b310e3f1d48c0461eab7546c2433604513f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JackieDo/Laravel-Dotenv-Editor/zipball/24667e3704b281e0d6c56de340bed1dc718072a1", - "reference": "24667e3704b281e0d6c56de340bed1dc718072a1", + "url": "https://api.github.com/repos/Bubka/Laravel-Dotenv-Editor/zipball/e8743b310e3f1d48c0461eab7546c2433604513f", + "reference": "e8743b310e3f1d48c0461eab7546c2433604513f", "shasum": "" }, "require": { - "illuminate/console": "^10.0|^9.0|^8.0|^7.0|^6.0|^5.8", - "illuminate/contracts": "^10.0|^9.0|^8.0|^7.0|^6.0|^5.8", - "illuminate/support": "^10.0|^9.0|^8.0|^7.0|^6.0|^5.8", + "illuminate/console": "^11.0|^10.0|^9.0|^8.0|^7.0|^6.0|^5.8", + "illuminate/contracts": "^11.0|^10.0|^9.0|^8.0|^7.0|^6.0|^5.8", + "illuminate/support": "^11.0|^10.0|^9.0|^8.0|^7.0|^6.0|^5.8", "jackiedo/path-helper": "^1.0" }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -1803,14 +1460,12 @@ "Jackiedo\\DotenvEditor\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Jackie Do", - "email": "anhvudo@gmail.com" + "name": "Bubka" } ], "description": "The .env file editor tool for Laravel 5.8+", @@ -1820,10 +1475,9 @@ "laravel" ], "support": { - "issues": "https://github.com/JackieDo/Laravel-Dotenv-Editor/issues", - "source": "https://github.com/JackieDo/Laravel-Dotenv-Editor/tree/2.1.0" + "source": "https://github.com/Bubka/Laravel-Dotenv-Editor/tree/master" }, - "time": "2023-02-19T00:32:40+00:00" + "time": "2024-06-24T07:25:23+00:00" }, { "name": "jackiedo/path-helper", @@ -1879,16 +1533,16 @@ }, { "name": "jaybizzle/crawler-detect", - "version": "v1.2.118", + "version": "v1.2.119", "source": { "type": "git", "url": "https://github.com/JayBizzle/Crawler-Detect.git", - "reference": "9b8912ac5b78b780a0ead552b4c3dc9ddfdea4fd" + "reference": "275002e22b0333c15a7c6792fdae5d5deefc9ef0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/9b8912ac5b78b780a0ead552b4c3dc9ddfdea4fd", - "reference": "9b8912ac5b78b780a0ead552b4c3dc9ddfdea4fd", + "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/275002e22b0333c15a7c6792fdae5d5deefc9ef0", + "reference": "275002e22b0333c15a7c6792fdae5d5deefc9ef0", "shasum": "" }, "require": { @@ -1925,9 +1579,9 @@ ], "support": { "issues": "https://github.com/JayBizzle/Crawler-Detect/issues", - "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.2.118" + "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.2.119" }, - "time": "2024-04-23T17:07:05+00:00" + "time": "2024-06-07T07:58:43+00:00" }, { "name": "jenssegers/agent", @@ -2225,16 +1879,16 @@ }, { "name": "laravel/framework", - "version": "v10.48.9", + "version": "v11.11.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "ad758500b47964d022addf119600a1b1b0230733" + "reference": "c9b52e84bd18f155e5ba59b948c7da3e7f37e87f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/ad758500b47964d022addf119600a1b1b0230733", - "reference": "ad758500b47964d022addf119600a1b1b0230733", + "url": "https://api.github.com/repos/laravel/framework/zipball/c9b52e84bd18f155e5ba59b948c7da3e7f37e87f", + "reference": "c9b52e84bd18f155e5ba59b948c7da3e7f37e87f", "shasum": "" }, "require": { @@ -2250,40 +1904,39 @@ "ext-openssl": "*", "ext-session": "*", "ext-tokenizer": "*", - "fruitcake/php-cors": "^1.2", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8", "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1.9", + "laravel/prompts": "^0.1.18", "laravel/serializable-closure": "^1.3", "league/commonmark": "^2.2.1", "league/flysystem": "^3.8.0", "monolog/monolog": "^3.0", - "nesbot/carbon": "^2.67", - "nunomaduro/termwind": "^1.13", - "php": "^8.1", + "nesbot/carbon": "^2.72.2|^3.0", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", "psr/container": "^1.1.1|^2.0.1", "psr/log": "^1.0|^2.0|^3.0", "psr/simple-cache": "^1.0|^2.0|^3.0", "ramsey/uuid": "^4.7", - "symfony/console": "^6.2", - "symfony/error-handler": "^6.2", - "symfony/finder": "^6.2", - "symfony/http-foundation": "^6.4", - "symfony/http-kernel": "^6.2", - "symfony/mailer": "^6.2", - "symfony/mime": "^6.2", - "symfony/process": "^6.2", - "symfony/routing": "^6.2", - "symfony/uid": "^6.2", - "symfony/var-dumper": "^6.2", + "symfony/console": "^7.0", + "symfony/error-handler": "^7.0", + "symfony/finder": "^7.0", + "symfony/http-foundation": "^7.0", + "symfony/http-kernel": "^7.0", + "symfony/mailer": "^7.0", + "symfony/mime": "^7.0", + "symfony/polyfill-php83": "^1.28", + "symfony/process": "^7.0", + "symfony/routing": "^7.0", + "symfony/uid": "^7.0", + "symfony/var-dumper": "^7.0", "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.4.1", "voku/portable-ascii": "^2.0" }, "conflict": { - "carbonphp/carbon-doctrine-types": ">=3.0", - "doctrine/dbal": ">=4.0", "mockery/mockery": "1.6.8", - "phpunit/phpunit": ">=11.0.0", "tightenco/collect": "<5.5.33" }, "provide": { @@ -2323,36 +1976,35 @@ "illuminate/testing": "self.version", "illuminate/translation": "self.version", "illuminate/validation": "self.version", - "illuminate/view": "self.version" + "illuminate/view": "self.version", + "spatie/once": "*" }, "require-dev": { "ably/ably-php": "^1.0", "aws/aws-sdk-php": "^3.235.5", - "doctrine/dbal": "^3.5.1", "ext-gmp": "*", - "fakerphp/faker": "^1.21", - "guzzlehttp/guzzle": "^7.5", + "fakerphp/faker": "^1.23", "league/flysystem-aws-s3-v3": "^3.0", "league/flysystem-ftp": "^3.0", "league/flysystem-path-prefixing": "^3.3", "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", - "mockery/mockery": "^1.5.1", + "mockery/mockery": "^1.6", "nyholm/psr7": "^1.2", - "orchestra/testbench-core": "^8.23.4", - "pda/pheanstalk": "^4.0", + "orchestra/testbench-core": "^9.1.5", + "pda/pheanstalk": "^5.0", "phpstan/phpstan": "^1.4.7", - "phpunit/phpunit": "^10.0.7", + "phpunit/phpunit": "^10.5|^11.0", "predis/predis": "^2.0.2", - "symfony/cache": "^6.2", - "symfony/http-client": "^6.2.4", - "symfony/psr-http-message-bridge": "^2.0" + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.0", + "symfony/http-client": "^7.0", + "symfony/psr-http-message-bridge": "^7.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", - "brianium/paratest": "Required to run tests in parallel (^6.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", "ext-apcu": "Required to use the APC cache driver.", "ext-fileinfo": "Required to use the Filesystem class.", "ext-ftp": "Required to use the Flysystem FTP driver.", @@ -2361,34 +2013,34 @@ "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", "ext-pdo": "Required to use all database features.", "ext-posix": "Required to use all features of the queue worker.", - "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", - "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", "laravel/tinker": "Required to use the tinker console command (^2.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", "league/flysystem-read-only": "Required to use read-only disks (^3.3)", "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", - "mockery/mockery": "Required to use mocking (^1.5.1).", + "mockery/mockery": "Required to use mocking (^1.6).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", - "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).", "predis/predis": "Required to use the predis connector (^2.0.2).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "10.x-dev" + "dev-master": "11.x-dev" } }, "autoload": { @@ -2428,52 +2080,50 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-04-23T15:01:33+00:00" + "time": "2024-06-20T10:54:53+00:00" }, { "name": "laravel/passport", - "version": "v11.10.6", + "version": "v12.2.0", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "2642f360c51dfde3a6ea60f86ae5d9a8c0caf3cf" + "reference": "b24c6462835a16163141fbe588533d16603212b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/2642f360c51dfde3a6ea60f86ae5d9a8c0caf3cf", - "reference": "2642f360c51dfde3a6ea60f86ae5d9a8c0caf3cf", + "url": "https://api.github.com/repos/laravel/passport/zipball/b24c6462835a16163141fbe588533d16603212b7", + "reference": "b24c6462835a16163141fbe588533d16603212b7", "shasum": "" }, "require": { "ext-json": "*", "firebase/php-jwt": "^6.4", - "illuminate/auth": "^9.0|^10.0", - "illuminate/console": "^9.0|^10.0", - "illuminate/container": "^9.0|^10.0", - "illuminate/contracts": "^9.0|^10.0", - "illuminate/cookie": "^9.0|^10.0", - "illuminate/database": "^9.0|^10.0", - "illuminate/encryption": "^9.0|^10.0", - "illuminate/http": "^9.0|^10.0", - "illuminate/support": "^9.0|^10.0", + "illuminate/auth": "^9.21|^10.0|^11.0", + "illuminate/console": "^9.21|^10.0|^11.0", + "illuminate/container": "^9.21|^10.0|^11.0", + "illuminate/contracts": "^9.21|^10.0|^11.0", + "illuminate/cookie": "^9.21|^10.0|^11.0", + "illuminate/database": "^9.21|^10.0|^11.0", + "illuminate/encryption": "^9.21|^10.0|^11.0", + "illuminate/http": "^9.21|^10.0|^11.0", + "illuminate/support": "^9.21|^10.0|^11.0", "lcobucci/jwt": "^4.3|^5.0", "league/oauth2-server": "^8.5.3", "nyholm/psr7": "^1.5", "php": "^8.0", "phpseclib/phpseclib": "^2.0|^3.0", - "symfony/psr-http-message-bridge": "^2.1" + "symfony/console": "^6.0|^7.0", + "symfony/psr-http-message-bridge": "^2.1|^6.0|^7.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^7.31|^8.11", + "orchestra/testbench": "^7.35|^8.14|^9.0", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.3|^10.5" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - }, "laravel": { "providers": [ "Laravel\\Passport\\PassportServiceProvider" @@ -2506,20 +2156,20 @@ "issues": "https://github.com/laravel/passport/issues", "source": "https://github.com/laravel/passport" }, - "time": "2024-03-01T11:11:18+00:00" + "time": "2024-04-17T17:56:14+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.20", + "version": "v0.1.24", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "bf9a360c484976692de0f3792f30066f4f4b34a2" + "reference": "409b0b4305273472f3754826e68f4edbd0150149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/bf9a360c484976692de0f3792f30066f4f4b34a2", - "reference": "bf9a360c484976692de0f3792f30066f4f4b34a2", + "url": "https://api.github.com/repos/laravel/prompts/zipball/409b0b4305273472f3754826e68f4edbd0150149", + "reference": "409b0b4305273472f3754826e68f4edbd0150149", "shasum": "" }, "require": { @@ -2559,11 +2209,12 @@ "license": [ "MIT" ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.20" + "source": "https://github.com/laravel/prompts/tree/v0.1.24" }, - "time": "2024-04-18T00:45:25+00:00" + "time": "2024-06-17T13:58:22+00:00" }, { "name": "laravel/serializable-closure", @@ -2627,16 +2278,16 @@ }, { "name": "laravel/socialite", - "version": "v5.13.1", + "version": "v5.15.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "feed1c1ccfd991bc12af59de4aa24f657d9c5cbe" + "reference": "c8234bfb286a8210df8d62f94562c71bfda4a446" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/feed1c1ccfd991bc12af59de4aa24f657d9c5cbe", - "reference": "feed1c1ccfd991bc12af59de4aa24f657d9c5cbe", + "url": "https://api.github.com/repos/laravel/socialite/zipball/c8234bfb286a8210df8d62f94562c71bfda4a446", + "reference": "c8234bfb286a8210df8d62f94562c71bfda4a446", "shasum": "" }, "require": { @@ -2695,7 +2346,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2024-04-24T20:36:50+00:00" + "time": "2024-06-11T13:33:20+00:00" }, { "name": "laravel/tinker", @@ -2765,16 +2416,16 @@ }, { "name": "laravel/ui", - "version": "v4.5.1", + "version": "v4.5.2", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "a3562953123946996a503159199d6742d5534e61" + "reference": "c75396f63268c95b053c8e4814eb70e0875e9628" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/a3562953123946996a503159199d6742d5534e61", - "reference": "a3562953123946996a503159199d6742d5534e61", + "url": "https://api.github.com/repos/laravel/ui/zipball/c75396f63268c95b053c8e4814eb70e0875e9628", + "reference": "c75396f63268c95b053c8e4814eb70e0875e9628", "shasum": "" }, "require": { @@ -2822,9 +2473,9 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v4.5.1" + "source": "https://github.com/laravel/ui/tree/v4.5.2" }, - "time": "2024-03-21T18:12:29+00:00" + "time": "2024-05-08T18:07:10+00:00" }, { "name": "lcobucci/clock", @@ -3207,16 +2858,16 @@ }, { "name": "league/flysystem", - "version": "3.27.0", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "4729745b1ab737908c7d055148c9a6b3e959832f" + "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f", - "reference": "4729745b1ab737908c7d055148c9a6b3e959832f", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", + "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", "shasum": "" }, "require": { @@ -3240,10 +2891,13 @@ "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", + "ext-mongodb": "^1.3", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", @@ -3281,32 +2935,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.27.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2024-04-07T19:17:50+00:00" + "time": "2024-05-22T10:09:12+00:00" }, { "name": "league/flysystem-local", - "version": "3.25.1", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92" + "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92", - "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40", + "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40", "shasum": "" }, "require": { @@ -3340,19 +2984,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2024-03-15T19:58:44+00:00" + "time": "2024-05-06T20:05:52+00:00" }, { "name": "league/mime-type-detection", @@ -3913,42 +3547,41 @@ }, { "name": "nesbot/carbon", - "version": "2.72.3", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83" + "reference": "39c8ef752db6865717cc3fba63970c16f057982c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0c6fd108360c562f6e4fd1dedb8233b423e91c83", - "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/39c8ef752db6865717cc3fba63970c16f057982c", + "reference": "39c8ef752db6865717cc3fba63970c16f057982c", "shasum": "" }, "require": { "carbonphp/carbon-doctrine-types": "*", "ext-json": "*", - "php": "^7.1.8 || ^8.0", + "php": "^8.1", "psr/clock": "^1.0", + "symfony/clock": "^6.3 || ^7.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" }, "provide": { "psr/clock-implementation": "1.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", - "doctrine/orm": "^2.7 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.0", - "kylekatarnls/multi-tester": "^2.0", - "ondrejmirtes/better-reflection": "*", - "phpmd/phpmd": "^2.9", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.99 || ^1.7.14", - "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", - "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", - "squizlabs/php_codesniffer": "^3.4" + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.57.2", + "kylekatarnls/multi-tester": "^2.5.3", + "ondrejmirtes/better-reflection": "^6.25.0.4", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.11.2", + "phpunit/phpunit": "^10.5.20", + "squizlabs/php_codesniffer": "^3.9.0" }, "bin": [ "bin/carbon" @@ -3956,8 +3589,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" }, "laravel": { "providers": [ @@ -4016,7 +3649,7 @@ "type": "tidelift" } ], - "time": "2024-01-25T10:35:09+00:00" + "time": "2024-06-20T15:52:59+00:00" }, { "name": "nette/schema", @@ -4226,33 +3859,32 @@ }, { "name": "nunomaduro/termwind", - "version": "v1.15.1", + "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/58c4c58cf23df7f498daeb97092e34f5259feb6a", + "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^8.0", - "symfony/console": "^5.3.0|^6.0.0" + "php": "^8.2", + "symfony/console": "^7.0.4" }, "require-dev": { - "ergebnis/phpstan-rules": "^1.0.", - "illuminate/console": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", - "laravel/pint": "^1.0.0", - "pestphp/pest": "^1.21.0", - "pestphp/pest-plugin-mock": "^1.0", - "phpstan/phpstan": "^1.4.6", - "phpstan/phpstan-strict-rules": "^1.1.0", - "symfony/var-dumper": "^5.2.7|^6.0.0", + "ergebnis/phpstan-rules": "^2.2.0", + "illuminate/console": "^11.0.0", + "laravel/pint": "^1.14.0", + "mockery/mockery": "^1.6.7", + "pestphp/pest": "^2.34.1", + "phpstan/phpstan": "^1.10.59", + "phpstan/phpstan-strict-rules": "^1.5.2", + "symfony/var-dumper": "^7.0.4", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -4261,6 +3893,9 @@ "providers": [ "Termwind\\Laravel\\TermwindServiceProvider" ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" } }, "autoload": { @@ -4292,7 +3927,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + "source": "https://github.com/nunomaduro/termwind/tree/v2.0.1" }, "funding": [ { @@ -4308,7 +3943,7 @@ "type": "github" } ], - "time": "2023-02-08T01:06:31+00:00" + "time": "2024-03-06T16:17:14+00:00" }, { "name": "nyholm/psr7", @@ -4390,16 +4025,16 @@ }, { "name": "paragonie/constant_time_encoding", - "version": "v2.6.3", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "58c3f47f650c94ec05a151692652a868995d2938" + "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", - "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/52a0d99e69f56b9ec27ace92ba56897fe6993105", + "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105", "shasum": "" }, "require": { @@ -4453,7 +4088,7 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2022-06-14T06:56:20+00:00" + "time": "2024-05-08T12:18:48+00:00" }, { "name": "paragonie/random_compat", @@ -4582,20 +4217,20 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.37", + "version": "3.0.39", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8" + "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cfa2013d0f68c062055180dd4328cc8b9d1f30b8", - "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/211ebc399c6e73c225a018435fe5ae209d1d1485", + "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "^1|^2", + "paragonie/constant_time_encoding": "^1|^2|^3", "paragonie/random_compat": "^1.4|^2.0|^9.99.99", "php": ">=5.6.1" }, @@ -4672,7 +4307,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.37" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.39" }, "funding": [ { @@ -4688,56 +4323,7 @@ "type": "tidelift" } ], - "time": "2024-03-03T02:14:58+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2024-06-24T06:27:33+00:00" }, { "name": "psr/clock", @@ -4944,20 +4530,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -4981,7 +4567,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -4993,9 +4579,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -5153,16 +4739,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.3", + "version": "v0.12.4", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73" + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", - "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", "shasum": "" }, "require": { @@ -5226,9 +4812,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.3" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" }, - "time": "2024-04-02T15:57:53+00:00" + "time": "2024-06-10T01:18:23+00:00" }, { "name": "ralouphie/getallheaders", @@ -5457,21 +5043,21 @@ }, { "name": "socialiteproviders/manager", - "version": "v4.5.1", + "version": "v4.6.0", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Manager.git", - "reference": "a67f194f0f4c4c7616c549afc697b78df9658d44" + "reference": "dea5190981c31b89e52259da9ab1ca4e2b258b21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/a67f194f0f4c4c7616c549afc697b78df9658d44", - "reference": "a67f194f0f4c4c7616c549afc697b78df9658d44", + "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/dea5190981c31b89e52259da9ab1ca4e2b258b21", + "reference": "dea5190981c31b89e52259da9ab1ca4e2b258b21", "shasum": "" }, "require": { "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0", - "laravel/socialite": "^5.2", + "laravel/socialite": "^5.5", "php": "^8.0" }, "require-dev": { @@ -5527,20 +5113,20 @@ "issues": "https://github.com/socialiteproviders/manager/issues", "source": "https://github.com/socialiteproviders/manager" }, - "time": "2024-02-17T08:58:03+00:00" + "time": "2024-05-04T07:57:39+00:00" }, { "name": "spatie/eloquent-sortable", - "version": "4.2.0", + "version": "4.4.0", "source": { "type": "git", "url": "https://github.com/spatie/eloquent-sortable.git", - "reference": "d7940cc59af939b27422a8e7a4020ac8c5d93a77" + "reference": "7a460c775d29741f42744bac52f993cb5b84be0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/eloquent-sortable/zipball/d7940cc59af939b27422a8e7a4020ac8c5d93a77", - "reference": "d7940cc59af939b27422a8e7a4020ac8c5d93a77", + "url": "https://api.github.com/repos/spatie/eloquent-sortable/zipball/7a460c775d29741f42744bac52f993cb5b84be0f", + "reference": "7a460c775d29741f42744bac52f993cb5b84be0f", "shasum": "" }, "require": { @@ -5589,7 +5175,7 @@ ], "support": { "issues": "https://github.com/spatie/eloquent-sortable/issues", - "source": "https://github.com/spatie/eloquent-sortable/tree/4.2.0" + "source": "https://github.com/spatie/eloquent-sortable/tree/4.4.0" }, "funding": [ { @@ -5601,7 +5187,7 @@ "type": "github" } ], - "time": "2024-02-26T11:54:22+00:00" + "time": "2024-06-04T11:09:54+00:00" }, { "name": "spatie/laravel-package-tools", @@ -5665,26 +5251,28 @@ }, { "name": "spomky-labs/otphp", - "version": "11.2.2", + "version": "11.3.0", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "b737d1c6330beae7c0bc225d3e848805b352fe42" + "reference": "2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/b737d1c6330beae7c0bc225d3e848805b352fe42", - "reference": "b737d1c6330beae7c0bc225d3e848805b352fe42", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33", + "reference": "2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33", "shasum": "" }, "require": { "ext-mbstring": "*", - "paragonie/constant_time_encoding": "^2.0", - "php": "^8.1" + "paragonie/constant_time_encoding": "^2.0 || ^3.0", + "php": ">=8.1", + "psr/clock": "^1.0", + "symfony/deprecation-contracts": "^3.2" }, "require-dev": { "ekino/phpstan-banned-code": "^1.0", - "infection/infection": "^0.26|^0.27|^0.28", + "infection/infection": "^0.26|^0.27|^0.28|^0.29", "php-parallel-lint/php-parallel-lint": "^1.3", "phpstan/phpstan": "^1.0", "phpstan/phpstan-deprecation-rules": "^1.0", @@ -5692,7 +5280,7 @@ "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5.26|^10.0|^11.0", "qossmic/deptrac-shim": "^1.0", - "rector/rector": "1.0", + "rector/rector": "^1.0", "symfony/phpunit-bridge": "^6.1|^7.0", "symplify/easy-coding-standard": "^12.0" }, @@ -5729,7 +5317,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/11.2.2" + "source": "https://github.com/Spomky-Labs/otphp/tree/11.3.0" }, "funding": [ { @@ -5741,51 +5329,124 @@ "type": "patreon" } ], - "time": "2024-04-15T07:35:15+00:00" + "time": "2024-06-12T11:22:32+00:00" }, { - "name": "symfony/console", - "version": "v6.4.7", + "name": "symfony/clock", + "version": "v7.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f" + "url": "https://github.com/symfony/clock.git", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", - "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", + "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/console", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/9b008f2d7b21c74ef4d0c3de6077a642bc55ece3", + "reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3", + "shasum": "" + }, + "require": { + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" + "symfony/string": "^6.4|^7.0" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -5819,7 +5480,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.7" + "source": "https://github.com/symfony/console/tree/v7.1.1" }, "funding": [ { @@ -5835,20 +5496,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/css-selector", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc" + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc", - "reference": "b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", "shasum": "" }, "require": { @@ -5884,7 +5545,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.0.7" + "source": "https://github.com/symfony/css-selector/tree/v7.1.1" }, "funding": [ { @@ -5900,20 +5561,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -5922,7 +5583,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5951,7 +5612,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -5967,26 +5628,26 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "667a072466c6a53827ed7b119af93806b884cbb3" + "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/667a072466c6a53827ed7b119af93806b884cbb3", - "reference": "667a072466c6a53827ed7b119af93806b884cbb3", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", + "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/var-dumper": "^6.4|^7.0" }, "conflict": { "symfony/deprecation-contracts": "<2.5", @@ -5995,7 +5656,7 @@ "require-dev": { "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^5.4|^6.0|^7.0" + "symfony/serializer": "^6.4|^7.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -6026,7 +5687,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.7" + "source": "https://github.com/symfony/error-handler/tree/v7.1.1" }, "funding": [ { @@ -6042,20 +5703,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "db2a7fab994d67d92356bb39c367db115d9d30f9" + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db2a7fab994d67d92356bb39c367db115d9d30f9", - "reference": "db2a7fab994d67d92356bb39c367db115d9d30f9", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", "shasum": "" }, "require": { @@ -6106,7 +5767,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.7" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" }, "funding": [ { @@ -6122,20 +5783,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "4e64b49bf370ade88e567de29465762e316e4224" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224", - "reference": "4e64b49bf370ade88e567de29465762e316e4224", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { @@ -6145,7 +5806,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6182,7 +5843,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -6198,27 +5859,27 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/finder", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "511c48990be17358c23bf45c5d71ab85d40fb764" + "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/511c48990be17358c23bf45c5d71ab85d40fb764", - "reference": "511c48990be17358c23bf45c5d71ab85d40fb764", + "url": "https://api.github.com/repos/symfony/finder/zipball/fbb0ba67688b780efbc886c1a0a0948dcf7205d6", + "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "symfony/filesystem": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -6246,7 +5907,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.7" + "source": "https://github.com/symfony/finder/tree/v7.1.1" }, "funding": [ { @@ -6262,40 +5923,40 @@ "type": "tidelift" } ], - "time": "2024-04-23T10:36:43+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "b4db6b833035477cb70e18d0ae33cb7c2b521759" + "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b4db6b833035477cb70e18d0ae33cb7c2b521759", - "reference": "b4db6b833035477cb70e18d0ae33cb7c2b521759", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/74d171d5b6a1d9e4bfee09a41937c17a7536acfa", + "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.3" + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" }, "require-dev": { - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.3|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -6323,7 +5984,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.7" + "source": "https://github.com/symfony/http-foundation/tree/v7.1.1" }, "funding": [ { @@ -6339,77 +6000,77 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98" + "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b7b5e6cdef670a0c82d015a966ffc7e855861a98", - "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fa8d1c75b5f33b1302afccf81811f93976c6e26f", + "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.4", - "symfony/config": "<6.1", - "symfony/console": "<5.4", + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<5.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4", - "symfony/translation": "<5.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<5.4", + "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", - "symfony/var-dumper": "<6.3", - "twig/twig": "<2.13" + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.0.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.2|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4.5|^6.0.5|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.4|^7.0.4", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.4|^7.0", - "symfony/var-exporter": "^6.2|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.0.4" }, "type": "library", "autoload": { @@ -6437,7 +6098,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.7" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.1" }, "funding": [ { @@ -6453,43 +6114,43 @@ "type": "tidelift" } ], - "time": "2024-04-29T11:24:44+00:00" + "time": "2024-06-04T06:52:15+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd" + "reference": "2eaad2e167cae930f25a3d731fec8b2ded5e751e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/2c446d4e446995bed983c0b5bb9ff837e8de7dbd", - "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd", + "url": "https://api.github.com/repos/symfony/mailer/zipball/2eaad2e167cae930f25a3d731fec8b2ded5e751e", + "reference": "2eaad2e167cae930f25a3d731fec8b2ded5e751e", "shasum": "" }, "require": { "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.1", + "php": ">=8.2", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/mime": "^6.2|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", - "symfony/messenger": "<6.2", - "symfony/mime": "<6.2", - "symfony/twig-bridge": "<6.2.1" + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.2|^7.0", - "symfony/twig-bridge": "^6.2|^7.0" + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -6517,7 +6178,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.7" + "source": "https://github.com/symfony/mailer/tree/v7.1.1" }, "funding": [ { @@ -6533,25 +6194,24 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/mime", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "decadcf3865918ecfcbfa90968553994ce935a5e" + "reference": "21027eaacc1a8a20f5e616c25c3580f5dd3a15df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/decadcf3865918ecfcbfa90968553994ce935a5e", - "reference": "decadcf3865918ecfcbfa90968553994ce935a5e", + "url": "https://api.github.com/repos/symfony/mime/zipball/21027eaacc1a8a20f5e616c25c3580f5dd3a15df", + "reference": "21027eaacc1a8a20f5e616c25c3580f5dd3a15df", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -6559,18 +6219,18 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<5.4", - "symfony/serializer": "<6.3.2" + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.4|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.3.2|^7.0" + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -6602,7 +6262,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.7" + "source": "https://github.com/symfony/mime/tree/v7.1.1" }, "funding": [ { @@ -6618,20 +6278,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-06-04T06:40:14+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", "shasum": "" }, "require": { @@ -6681,7 +6341,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" }, "funding": [ { @@ -6697,20 +6357,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", "shasum": "" }, "require": { @@ -6759,7 +6419,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" }, "funding": [ { @@ -6775,20 +6435,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "shasum": "" }, "require": { @@ -6843,7 +6503,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" }, "funding": [ { @@ -6859,20 +6519,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", "shasum": "" }, "require": { @@ -6924,7 +6584,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" }, "funding": [ { @@ -6940,20 +6600,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -7004,7 +6664,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -7020,20 +6680,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + "reference": "10112722600777e02d2745716b70c5db4ca70442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", + "reference": "10112722600777e02d2745716b70c5db4ca70442", "shasum": "" }, "require": { @@ -7077,7 +6737,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" }, "funding": [ { @@ -7093,20 +6753,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", "shasum": "" }, "require": { @@ -7157,7 +6817,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" }, "funding": [ { @@ -7173,25 +6833,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.1" }, "type": "library", "extra": { @@ -7234,7 +6893,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" }, "funding": [ { @@ -7250,20 +6909,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:35:24+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", - "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9", + "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9", "shasum": "" }, "require": { @@ -7313,7 +6972,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0" }, "funding": [ { @@ -7329,24 +6988,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/process", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "cdb1c81c145fd5aa9b0038bab694035020943381" + "reference": "febf90124323a093c7ee06fdb30e765ca3c20028" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/cdb1c81c145fd5aa9b0038bab694035020943381", - "reference": "cdb1c81c145fd5aa9b0038bab694035020943381", + "url": "https://api.github.com/repos/symfony/process/zipball/febf90124323a093c7ee06fdb30e765ca3c20028", + "reference": "febf90124323a093c7ee06fdb30e765ca3c20028", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -7374,7 +7033,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.7" + "source": "https://github.com/symfony/process/tree/v7.1.1" }, "funding": [ { @@ -7390,47 +7049,42 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v2.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e" + "reference": "9a5dbb606da711f5d40a7596ad577856f9402140" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/581ca6067eb62640de5ff08ee1ba6850a0ee472e", - "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/9a5dbb606da711f5d40a7596ad577856f9402140", + "reference": "9a5dbb606da711f5d40a7596ad577856f9402140", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/http-message": "^1.0 || ^2.0", - "symfony/deprecation-contracts": "^2.5 || ^3.0", - "symfony/http-foundation": "^5.4 || ^6.0" + "php": ">=8.2", + "psr/http-message": "^1.0|^2.0", + "symfony/http-foundation": "^6.4|^7.0" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-kernel": "<6.4" }, "require-dev": { "nyholm/psr7": "^1.1", - "psr/log": "^1.1 || ^2 || ^3", - "symfony/browser-kit": "^5.4 || ^6.0", - "symfony/config": "^5.4 || ^6.0", - "symfony/event-dispatcher": "^5.4 || ^6.0", - "symfony/framework-bundle": "^5.4 || ^6.0", - "symfony/http-kernel": "^5.4 || ^6.0", - "symfony/phpunit-bridge": "^6.2" - }, - "suggest": { - "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + "php-http/discovery": "^1.15", + "psr/log": "^1.1.4|^2|^3", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" }, "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-main": "2.3-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bridge\\PsrHttpMessage\\": "" @@ -7450,11 +7104,11 @@ }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" } ], "description": "PSR HTTP message bridge", - "homepage": "http://symfony.com", + "homepage": "https://symfony.com", "keywords": [ "http", "http-message", @@ -7462,8 +7116,7 @@ "psr-7" ], "support": { - "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.3.1" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.1.1" }, "funding": [ { @@ -7479,40 +7132,38 @@ "type": "tidelift" } ], - "time": "2023-07-26T11:53:26+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/routing", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "276e06398f71fa2a973264d94f28150f93cfb907" + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/276e06398f71fa2a973264d94f28150f93cfb907", - "reference": "276e06398f71fa2a973264d94f28150f93cfb907", + "url": "https://api.github.com/repos/symfony/routing/zipball/60c31bab5c45af7f13091b87deb708830f3c96c0", + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "doctrine/annotations": "<1.12", - "symfony/config": "<6.2", - "symfony/dependency-injection": "<5.4", - "symfony/yaml": "<5.4" + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^6.2|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7546,7 +7197,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.7" + "source": "https://github.com/symfony/routing/tree/v7.1.1" }, "funding": [ { @@ -7562,25 +7213,26 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "11bbf19a0fb7b36345861e85c5768844c552906e" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e", - "reference": "11bbf19a0fb7b36345861e85c5768844c552906e", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -7588,7 +7240,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -7628,7 +7280,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -7644,20 +7296,20 @@ "type": "tidelift" } ], - "time": "2023-12-19T21:51:00+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/string", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63" + "reference": "60bc311c74e0af215101235aa6f471bcbc032df2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/e405b5424dc2528e02e31ba26b83a79fd4eb8f63", - "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63", + "url": "https://api.github.com/repos/symfony/string/zipball/60bc311c74e0af215101235aa6f471bcbc032df2", + "reference": "60bc311c74e0af215101235aa6f471bcbc032df2", "shasum": "" }, "require": { @@ -7671,6 +7323,7 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { + "symfony/emoji": "^7.1", "symfony/error-handler": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", @@ -7714,7 +7367,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.0.7" + "source": "https://github.com/symfony/string/tree/v7.1.1" }, "funding": [ { @@ -7730,37 +7383,36 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-06-04T06:40:14+00:00" }, { "name": "symfony/translation", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "7495687c58bfd88b7883823747b0656d90679123" + "reference": "cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/7495687c58bfd88b7883823747b0656d90679123", - "reference": "7495687c58bfd88b7883823747b0656d90679123", + "url": "https://api.github.com/repos/symfony/translation/zipball/cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3", + "reference": "cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", + "symfony/http-kernel": "<6.4", "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4" + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" }, "provide": { "symfony/translation-implementation": "2.3|3.0" @@ -7768,17 +7420,17 @@ "require-dev": { "nikic/php-parser": "^4.18|^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/routing": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7809,7 +7461,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.7" + "source": "https://github.com/symfony/translation/tree/v7.1.1" }, "funding": [ { @@ -7825,20 +7477,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", - "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { @@ -7847,7 +7499,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -7887,7 +7539,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -7903,28 +7555,28 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/uid", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355" + "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/a66efcb71d8bc3a207d9d78e0bd67f3321510355", - "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355", + "url": "https://api.github.com/repos/symfony/uid/zipball/bb59febeecc81528ff672fad5dab7f06db8c8277", + "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7961,7 +7613,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.7" + "source": "https://github.com/symfony/uid/tree/v7.1.1" }, "funding": [ { @@ -7977,38 +7629,36 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7" + "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7a9cd977cd1c5fed3694bee52990866432af07d7", - "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/deb2c2b506ff6fdbb340e00b34e9901e1605f293", + "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" @@ -8046,7 +7696,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.7" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.1" }, "funding": [ { @@ -8062,7 +7712,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -8337,48 +7987,48 @@ "packages-dev": [ { "name": "barryvdh/laravel-ide-helper", - "version": "v2.15.1", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "77831852bb7bc54f287246d32eb91274eaf87f8b" + "reference": "bc1d67f01ce8c77e3f97d48ba51fa1d81874f622" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/77831852bb7bc54f287246d32eb91274eaf87f8b", - "reference": "77831852bb7bc54f287246d32eb91274eaf87f8b", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/bc1d67f01ce8c77e3f97d48ba51fa1d81874f622", + "reference": "bc1d67f01ce8c77e3f97d48ba51fa1d81874f622", "shasum": "" }, "require": { - "barryvdh/reflection-docblock": "^2.0.6", + "barryvdh/reflection-docblock": "^2.1.1", "composer/class-map-generator": "^1.0", - "doctrine/dbal": "^2.6 || ^3.1.4", "ext-json": "*", - "illuminate/console": "^9 || ^10", - "illuminate/filesystem": "^9 || ^10", - "illuminate/support": "^9 || ^10", + "illuminate/console": "^10 || ^11", + "illuminate/database": "^10.38 || ^11", + "illuminate/filesystem": "^10 || ^11", + "illuminate/support": "^10 || ^11", "nikic/php-parser": "^4.18 || ^5", - "php": "^8.0", + "php": "^8.1", "phpdocumentor/type-resolver": "^1.1.0" }, "require-dev": { "ext-pdo_sqlite": "*", "friendsofphp/php-cs-fixer": "^3", - "illuminate/config": "^9 || ^10", - "illuminate/view": "^9 || ^10", + "illuminate/config": "^9 || ^10 || ^11", + "illuminate/view": "^9 || ^10 || ^11", "mockery/mockery": "^1.4", - "orchestra/testbench": "^7 || ^8", - "phpunit/phpunit": "^9", - "spatie/phpunit-snapshot-assertions": "^4", + "orchestra/testbench": "^8 || ^9", + "phpunit/phpunit": "^10.5", + "spatie/phpunit-snapshot-assertions": "^4 || ^5", "vimeo/psalm": "^5.4" }, "suggest": { - "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10)." + "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10|^11)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.15-dev" + "dev-master": "3.0-dev" }, "laravel": { "providers": [ @@ -8415,7 +8065,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.15.1" + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.0.0" }, "funding": [ { @@ -8427,7 +8077,7 @@ "type": "github" } ], - "time": "2024-02-15T14:23:20+00:00" + "time": "2024-03-01T12:53:18+00:00" }, { "name": "barryvdh/reflection-docblock", @@ -8483,16 +8133,16 @@ }, { "name": "brianium/paratest", - "version": "v7.4.3", + "version": "v7.5.0", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "64fcfd0e28a6b8078a19dbf9127be2ee645b92ec" + "reference": "90a0ba27d1347e054d62fea30f3414f09fe9bad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/64fcfd0e28a6b8078a19dbf9127be2ee645b92ec", - "reference": "64fcfd0e28a6b8078a19dbf9127be2ee645b92ec", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/90a0ba27d1347e054d62fea30f3414f09fe9bad3", + "reference": "90a0ba27d1347e054d62fea30f3414f09fe9bad3", "shasum": "" }, "require": { @@ -8501,30 +8151,29 @@ "ext-reflection": "*", "ext-simplexml": "*", "fidry/cpu-core-counter": "^1.1.0", - "jean85/pretty-package-versions": "^2.0.5", + "jean85/pretty-package-versions": "^2.0.6", "php": "~8.2.0 || ~8.3.0", - "phpunit/php-code-coverage": "^10.1.11 || ^11.0.0", - "phpunit/php-file-iterator": "^4.1.0 || ^5.0.0", - "phpunit/php-timer": "^6.0.0 || ^7.0.0", - "phpunit/phpunit": "^10.5.9 || ^11.0.3", - "sebastian/environment": "^6.0.1 || ^7.0.0", - "symfony/console": "^6.4.3 || ^7.0.3", - "symfony/process": "^6.4.3 || ^7.0.3" + "phpunit/php-code-coverage": "^11.0.3", + "phpunit/php-file-iterator": "^5.0.0", + "phpunit/php-timer": "^7.0.0", + "phpunit/phpunit": "^11.2.1", + "sebastian/environment": "^7.1.0", + "symfony/console": "^6.4.8 || ^7.1.1", + "symfony/process": "^6.4.8 || ^7.1.1" }, "require-dev": { "doctrine/coding-standard": "^12.0.0", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^1.10.58", - "phpstan/phpstan-deprecation-rules": "^1.1.4", - "phpstan/phpstan-phpunit": "^1.3.15", - "phpstan/phpstan-strict-rules": "^1.5.2", - "squizlabs/php_codesniffer": "^3.9.0", - "symfony/filesystem": "^6.4.3 || ^7.0.3" + "phpstan/phpstan": "^1.11.4", + "phpstan/phpstan-deprecation-rules": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.0", + "squizlabs/php_codesniffer": "^3.10.1", + "symfony/filesystem": "^6.4.8 || ^7.1.1" }, "bin": [ "bin/paratest", - "bin/paratest.bat", "bin/paratest_for_phpstorm" ], "type": "library", @@ -8561,7 +8210,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.4.3" + "source": "https://github.com/paratestphp/paratest/tree/v7.5.0" }, "funding": [ { @@ -8573,20 +8222,20 @@ "type": "paypal" } ], - "time": "2024-02-20T07:24:02+00:00" + "time": "2024-06-12T13:02:43+00:00" }, { "name": "composer/class-map-generator", - "version": "1.1.1", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "8286a62d243312ed99b3eee20d5005c961adb311" + "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/8286a62d243312ed99b3eee20d5005c961adb311", - "reference": "8286a62d243312ed99b3eee20d5005c961adb311", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", + "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", "shasum": "" }, "require": { @@ -8630,7 +8279,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.1.1" + "source": "https://github.com/composer/class-map-generator/tree/1.3.4" }, "funding": [ { @@ -8646,20 +8295,20 @@ "type": "tidelift" } ], - "time": "2024-03-15T12:53:41+00:00" + "time": "2024-06-12T14:13:04+00:00" }, { "name": "composer/pcre", - "version": "3.1.3", + "version": "3.1.4", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8" + "reference": "04229f163664973f68f38f6f73d917799168ef24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", - "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", + "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", + "reference": "04229f163664973f68f38f6f73d917799168ef24", "shasum": "" }, "require": { @@ -8701,7 +8350,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.3" + "source": "https://github.com/composer/pcre/tree/3.1.4" }, "funding": [ { @@ -8717,7 +8366,54 @@ "type": "tidelift" } ], - "time": "2024-03-19T10:26:25+00:00" + "time": "2024-05-27T13:40:54+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" }, { "name": "fakerphp/faker", @@ -9026,16 +8722,16 @@ }, { "name": "larastan/larastan", - "version": "v2.9.5", + "version": "v2.9.7", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "101f1a4470f87326f4d3995411d28679d8800abe" + "reference": "5c805f636095cc2e0b659e3954775cf8f1dad1bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/101f1a4470f87326f4d3995411d28679d8800abe", - "reference": "101f1a4470f87326f4d3995411d28679d8800abe", + "url": "https://api.github.com/repos/larastan/larastan/zipball/5c805f636095cc2e0b659e3954775cf8f1dad1bb", + "reference": "5c805f636095cc2e0b659e3954775cf8f1dad1bb", "shasum": "" }, "require": { @@ -9049,7 +8745,7 @@ "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.0", "php": "^8.0.2", "phpmyadmin/sql-parser": "^5.9.0", - "phpstan/phpstan": "^1.10.66" + "phpstan/phpstan": "^1.11.1" }, "require-dev": { "doctrine/coding-standard": "^12.0", @@ -9104,7 +8800,7 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v2.9.5" + "source": "https://github.com/larastan/larastan/tree/v2.9.7" }, "funding": [ { @@ -9124,20 +8820,20 @@ "type": "patreon" } ], - "time": "2024-04-16T19:13:34+00:00" + "time": "2024-05-27T18:33:26+00:00" }, { "name": "laravel/pint", - "version": "v1.15.2", + "version": "v1.16.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "2c9f8004899815f3f0ee3cb28ef7281e2b589134" + "reference": "9266a47f1b9231b83e0cfd849009547329d871b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/2c9f8004899815f3f0ee3cb28ef7281e2b589134", - "reference": "2c9f8004899815f3f0ee3cb28ef7281e2b589134", + "url": "https://api.github.com/repos/laravel/pint/zipball/9266a47f1b9231b83e0cfd849009547329d871b1", + "reference": "9266a47f1b9231b83e0cfd849009547329d871b1", "shasum": "" }, "require": { @@ -9148,13 +8844,13 @@ "php": "^8.1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.54.0", - "illuminate/view": "^10.48.8", - "larastan/larastan": "^2.9.5", - "laravel-zero/framework": "^10.3.0", - "mockery/mockery": "^1.6.11", + "friendsofphp/php-cs-fixer": "^3.59.3", + "illuminate/view": "^10.48.12", + "larastan/larastan": "^2.9.7", + "laravel-zero/framework": "^10.4.0", + "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.34.7" + "pestphp/pest": "^2.34.8" }, "bin": [ "builds/pint" @@ -9190,20 +8886,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2024-04-23T15:42:34+00:00" + "time": "2024-06-18T16:50:05+00:00" }, { "name": "mockery/mockery", - "version": "1.6.11", + "version": "1.6.12", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "81a161d0b135df89951abd52296adf97deb0723d" + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/81a161d0b135df89951abd52296adf97deb0723d", - "reference": "81a161d0b135df89951abd52296adf97deb0723d", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", "shasum": "" }, "require": { @@ -9273,20 +8969,20 @@ "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, - "time": "2024-03-21T18:34:15+00:00" + "time": "2024-05-16T03:13:13+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -9294,11 +8990,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -9324,7 +9021,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -9332,44 +9029,42 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "nunomaduro/collision", - "version": "v7.10.0", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "49ec67fa7b002712da8526678abd651c09f375b2" + "reference": "13e5d538b95a744d85f447a321ce10adb28e9af9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2", - "reference": "49ec67fa7b002712da8526678abd651c09f375b2", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/13e5d538b95a744d85f447a321ce10adb28e9af9", + "reference": "13e5d538b95a744d85f447a321ce10adb28e9af9", "shasum": "" }, "require": { - "filp/whoops": "^2.15.3", - "nunomaduro/termwind": "^1.15.1", - "php": "^8.1.0", - "symfony/console": "^6.3.4" + "filp/whoops": "^2.15.4", + "nunomaduro/termwind": "^2.0.1", + "php": "^8.2.0", + "symfony/console": "^7.0.4" }, "conflict": { - "laravel/framework": ">=11.0.0" + "laravel/framework": "<11.0.0 || >=12.0.0", + "phpunit/phpunit": "<10.5.1 || >=12.0.0" }, "require-dev": { - "brianium/paratest": "^7.3.0", - "laravel/framework": "^10.28.0", - "laravel/pint": "^1.13.3", - "laravel/sail": "^1.25.0", - "laravel/sanctum": "^3.3.1", - "laravel/tinker": "^2.8.2", - "nunomaduro/larastan": "^2.6.4", - "orchestra/testbench-core": "^8.13.0", - "pestphp/pest": "^2.23.2", - "phpunit/phpunit": "^10.4.1", - "sebastian/environment": "^6.0.1", - "spatie/laravel-ignition": "^2.3.1" + "larastan/larastan": "^2.9.2", + "laravel/framework": "^11.0.0", + "laravel/pint": "^1.14.0", + "laravel/sail": "^1.28.2", + "laravel/sanctum": "^4.0.0", + "laravel/tinker": "^2.9.0", + "orchestra/testbench-core": "^9.0.0", + "pestphp/pest": "^2.34.1 || ^3.0.0", + "sebastian/environment": "^6.0.1 || ^7.0.0" }, "type": "library", "extra": { @@ -9377,6 +9072,9 @@ "providers": [ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" } }, "autoload": { @@ -9428,7 +9126,7 @@ "type": "patreon" } ], - "time": "2023-10-11T15:45:01+00:00" + "time": "2024-03-06T16:20:09+00:00" }, { "name": "phar-io/manifest", @@ -9749,16 +9447,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.28.0", + "version": "1.29.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb" + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb", - "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", "shasum": "" }, "require": { @@ -9790,22 +9488,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.28.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" }, - "time": "2024-04-03T18:51:33+00:00" + "time": "2024-05-31T08:52:43+00:00" }, { "name": "phpstan/phpstan", - "version": "1.10.67", + "version": "1.11.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493" + "reference": "490f0ae1c92b082f154681d7849aee776a7c1443" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/16ddbe776f10da6a95ebd25de7c1dbed397dc493", - "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/490f0ae1c92b082f154681d7849aee776a7c1443", + "reference": "490f0ae1c92b082f154681d7849aee776a7c1443", "shasum": "" }, "require": { @@ -9850,39 +9548,39 @@ "type": "github" } ], - "time": "2024-04-16T07:22:02+00:00" + "time": "2024-06-17T15:10:54+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.14", + "version": "11.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + "reference": "7e35a2cbcabac0e6865fd373742ea432a3c34f92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e35a2cbcabac0e6865fd373742ea432a3c34f92", + "reference": "7e35a2cbcabac0e6865fd373742ea432a3c34f92", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", + "nikic/php-parser": "^5.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.0", + "phpunit/php-text-template": "^4.0", + "sebastian/code-unit-reverse-lookup": "^4.0", + "sebastian/complexity": "^4.0", + "sebastian/environment": "^7.0", + "sebastian/lines-of-code": "^3.0", + "sebastian/version": "^5.0", "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^10.1" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -9891,7 +9589,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "11.0-dev" } }, "autoload": { @@ -9920,7 +9618,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.3" }, "funding": [ { @@ -9928,32 +9626,32 @@ "type": "github" } ], - "time": "2024-03-12T15:33:41+00:00" + "time": "2024-03-12T15:35:40+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.1.0", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + "reference": "99e95c94ad9500daca992354fa09d7b99abe2210" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/99e95c94ad9500daca992354fa09d7b99abe2210", + "reference": "99e95c94ad9500daca992354fa09d7b99abe2210", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -9981,7 +9679,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.0.0" }, "funding": [ { @@ -9989,28 +9687,28 @@ "type": "github" } ], - "time": "2023-08-31T06:24:48+00:00" + "time": "2024-02-02T06:05:04+00:00" }, { "name": "phpunit/php-invoker", - "version": "4.0.0", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + "reference": "5d8d9355a16d8cc5a1305b0a85342cfa420612be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5d8d9355a16d8cc5a1305b0a85342cfa420612be", + "reference": "5d8d9355a16d8cc5a1305b0a85342cfa420612be", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-pcntl": "*" @@ -10018,7 +9716,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -10044,7 +9742,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.0" }, "funding": [ { @@ -10052,32 +9751,32 @@ "type": "github" } ], - "time": "2023-02-03T06:56:09+00:00" + "time": "2024-02-02T06:05:50+00:00" }, { "name": "phpunit/php-text-template", - "version": "3.0.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + "reference": "d38f6cbff1cdb6f40b03c9811421561668cc133e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/d38f6cbff1cdb6f40b03c9811421561668cc133e", + "reference": "d38f6cbff1cdb6f40b03c9811421561668cc133e", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -10104,7 +9803,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.0" }, "funding": [ { @@ -10112,32 +9811,32 @@ "type": "github" } ], - "time": "2023-08-31T14:07:24+00:00" + "time": "2024-02-02T06:06:56+00:00" }, { "name": "phpunit/php-timer", - "version": "6.0.0", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + "reference": "8a59d9e25720482ee7fcdf296595e08795b84dc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8a59d9e25720482ee7fcdf296595e08795b84dc5", + "reference": "8a59d9e25720482ee7fcdf296595e08795b84dc5", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -10163,7 +9862,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.0" }, "funding": [ { @@ -10171,20 +9871,20 @@ "type": "github" } ], - "time": "2023-02-03T06:57:52+00:00" + "time": "2024-02-02T06:08:01+00:00" }, { "name": "phpunit/phpunit", - "version": "10.5.20", + "version": "11.2.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" + "reference": "be9e3ed32a1287a9bfda15936cc86fef4e4cf591" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", - "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/be9e3ed32a1287a9bfda15936cc86fef4e4cf591", + "reference": "be9e3ed32a1287a9bfda15936cc86fef4e4cf591", "shasum": "" }, "require": { @@ -10197,23 +9897,22 @@ "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.5", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-invoker": "^4.0", - "phpunit/php-text-template": "^3.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/code-unit": "^2.0", - "sebastian/comparator": "^5.0", - "sebastian/diff": "^5.0", - "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.1", - "sebastian/global-state": "^6.0.1", - "sebastian/object-enumerator": "^5.0", - "sebastian/recursion-context": "^5.0", - "sebastian/type": "^4.0", - "sebastian/version": "^4.0" + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0", + "phpunit/php-file-iterator": "^5.0", + "phpunit/php-invoker": "^5.0", + "phpunit/php-text-template": "^4.0", + "phpunit/php-timer": "^7.0", + "sebastian/cli-parser": "^3.0", + "sebastian/code-unit": "^3.0", + "sebastian/comparator": "^6.0", + "sebastian/diff": "^6.0", + "sebastian/environment": "^7.0", + "sebastian/exporter": "^6.1.2", + "sebastian/global-state": "^7.0", + "sebastian/object-enumerator": "^6.0", + "sebastian/type": "^5.0", + "sebastian/version": "^5.0" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -10224,7 +9923,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.5-dev" + "dev-main": "11.2-dev" } }, "autoload": { @@ -10256,7 +9955,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.2.5" }, "funding": [ { @@ -10272,32 +9971,32 @@ "type": "tidelift" } ], - "time": "2024-04-24T06:32:35+00:00" + "time": "2024-06-20T13:11:31+00:00" }, { "name": "sebastian/cli-parser", - "version": "2.0.1", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + "reference": "00a74d5568694711f0222e54fb281e1d15fdf04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/00a74d5568694711f0222e54fb281e1d15fdf04a", + "reference": "00a74d5568694711f0222e54fb281e1d15fdf04a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -10321,7 +10020,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.1" }, "funding": [ { @@ -10329,32 +10028,32 @@ "type": "github" } ], - "time": "2024-03-02T07:12:49+00:00" + "time": "2024-03-02T07:26:58+00:00" }, { "name": "sebastian/code-unit", - "version": "2.0.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + "reference": "6634549cb8d702282a04a774e36a7477d2bd9015" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/6634549cb8d702282a04a774e36a7477d2bd9015", + "reference": "6634549cb8d702282a04a774e36a7477d2bd9015", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -10377,7 +10076,8 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.0" }, "funding": [ { @@ -10385,32 +10085,32 @@ "type": "github" } ], - "time": "2023-02-03T06:58:43+00:00" + "time": "2024-02-02T05:50:41+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + "reference": "df80c875d3e459b45c6039e4d9b71d4fbccae25d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/df80c875d3e459b45c6039e4d9b71d4fbccae25d", + "reference": "df80c875d3e459b45c6039e4d9b71d4fbccae25d", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -10432,7 +10132,8 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.0" }, "funding": [ { @@ -10440,36 +10141,36 @@ "type": "github" } ], - "time": "2023-02-03T06:59:15+00:00" + "time": "2024-02-02T05:52:17+00:00" }, { "name": "sebastian/comparator", - "version": "5.0.1", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + "reference": "bd0f2fa5b9257c69903537b266ccb80fcf940db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/bd0f2fa5b9257c69903537b266ccb80fcf940db8", + "reference": "bd0f2fa5b9257c69903537b266ccb80fcf940db8", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -10509,7 +10210,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.0.0" }, "funding": [ { @@ -10517,33 +10218,33 @@ "type": "github" } ], - "time": "2023-08-14T13:18:12+00:00" + "time": "2024-02-02T05:53:45+00:00" }, { "name": "sebastian/complexity", - "version": "3.2.0", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" + "reference": "88a434ad86150e11a606ac4866b09130712671f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/88a434ad86150e11a606ac4866b09130712671f0", + "reference": "88a434ad86150e11a606ac4866b09130712671f0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.2-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -10567,7 +10268,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.0" }, "funding": [ { @@ -10575,33 +10276,33 @@ "type": "github" } ], - "time": "2023-12-21T08:37:17+00:00" + "time": "2024-02-02T05:55:19+00:00" }, { "name": "sebastian/diff", - "version": "5.1.1", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + "reference": "ab83243ecc233de5655b76f577711de9f842e712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ab83243ecc233de5655b76f577711de9f842e712", + "reference": "ab83243ecc233de5655b76f577711de9f842e712", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -10634,7 +10335,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.1" }, "funding": [ { @@ -10642,27 +10343,27 @@ "type": "github" } ], - "time": "2024-03-02T07:15:17+00:00" + "time": "2024-03-02T07:30:33+00:00" }, { "name": "sebastian/environment", - "version": "6.1.0", + "version": "7.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + "reference": "4eb3a442574d0e9d141aab209cd4aaf25701b09a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4eb3a442574d0e9d141aab209cd4aaf25701b09a", + "reference": "4eb3a442574d0e9d141aab209cd4aaf25701b09a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-posix": "*" @@ -10670,7 +10371,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -10698,7 +10399,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + "source": "https://github.com/sebastianbergmann/environment/tree/7.1.0" }, "funding": [ { @@ -10706,34 +10407,34 @@ "type": "github" } ], - "time": "2024-03-23T08:47:14+00:00" + "time": "2024-03-23T08:56:34+00:00" }, { "name": "sebastian/exporter", - "version": "5.1.2", + "version": "6.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + "reference": "507d2333cbc4e6ea248fbda2d45ee1511e03da13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/507d2333cbc4e6ea248fbda2d45ee1511e03da13", + "reference": "507d2333cbc4e6ea248fbda2d45ee1511e03da13", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -10776,7 +10477,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/6.1.2" }, "funding": [ { @@ -10784,35 +10485,35 @@ "type": "github" } ], - "time": "2024-03-02T07:17:12+00:00" + "time": "2024-06-18T11:19:56+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.2", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + "reference": "c3a307e832f2e69c7ef869e31fc644fde0e7cb3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c3a307e832f2e69c7ef869e31fc644fde0e7cb3e", + "reference": "c3a307e832f2e69c7ef869e31fc644fde0e7cb3e", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -10838,7 +10539,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.1" }, "funding": [ { @@ -10846,33 +10547,33 @@ "type": "github" } ], - "time": "2024-03-02T07:19:19+00:00" + "time": "2024-03-02T07:32:10+00:00" }, { "name": "sebastian/lines-of-code", - "version": "2.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + "reference": "376c5b3f6b43c78fdc049740bca76a7c846706c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/376c5b3f6b43c78fdc049740bca76a7c846706c0", + "reference": "376c5b3f6b43c78fdc049740bca76a7c846706c0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -10896,7 +10597,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.0" }, "funding": [ { @@ -10904,34 +10605,34 @@ "type": "github" } ], - "time": "2023-12-21T08:38:20+00:00" + "time": "2024-02-02T06:00:36+00:00" }, { "name": "sebastian/object-enumerator", - "version": "5.0.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + "reference": "f75f6c460da0bbd9668f43a3dde0ec0ba7faa678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f75f6c460da0bbd9668f43a3dde0ec0ba7faa678", + "reference": "f75f6c460da0bbd9668f43a3dde0ec0ba7faa678", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -10953,7 +10654,8 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.0" }, "funding": [ { @@ -10961,32 +10663,32 @@ "type": "github" } ], - "time": "2023-02-03T07:08:32+00:00" + "time": "2024-02-02T06:01:29+00:00" }, { "name": "sebastian/object-reflector", - "version": "3.0.0", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + "reference": "bb2a6255d30853425fd38f032eb64ced9f7f132d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/bb2a6255d30853425fd38f032eb64ced9f7f132d", + "reference": "bb2a6255d30853425fd38f032eb64ced9f7f132d", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -11008,7 +10710,8 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.0" }, "funding": [ { @@ -11016,32 +10719,32 @@ "type": "github" } ], - "time": "2023-02-03T07:06:18+00:00" + "time": "2024-02-02T06:02:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "5.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + "reference": "2f15508e17af4ea35129bbc32ce28a814d9c7426" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2f15508e17af4ea35129bbc32ce28a814d9c7426", + "reference": "2f15508e17af4ea35129bbc32ce28a814d9c7426", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -11071,7 +10774,8 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.1" }, "funding": [ { @@ -11079,32 +10783,32 @@ "type": "github" } ], - "time": "2023-02-03T07:05:40+00:00" + "time": "2024-06-17T05:22:57+00:00" }, { "name": "sebastian/type", - "version": "4.0.0", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + "reference": "b8502785eb3523ca0dd4afe9ca62235590020f3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8502785eb3523ca0dd4afe9ca62235590020f3f", + "reference": "b8502785eb3523ca0dd4afe9ca62235590020f3f", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -11127,7 +10831,8 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.0.0" }, "funding": [ { @@ -11135,29 +10840,29 @@ "type": "github" } ], - "time": "2023-02-03T07:10:45+00:00" + "time": "2024-02-02T06:09:34+00:00" }, { "name": "sebastian/version", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + "reference": "13999475d2cb1ab33cb73403ba356a814fdbb001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/13999475d2cb1ab33cb73403ba356a814fdbb001", + "reference": "13999475d2cb1ab33cb73403ba356a814fdbb001", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -11180,7 +10885,8 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.0" }, "funding": [ { @@ -11188,314 +10894,7 @@ "type": "github" } ], - "time": "2023-02-07T11:34:05+00:00" - }, - { - "name": "spatie/backtrace", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/backtrace.git", - "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", - "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", - "shasum": "" - }, - "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "ext-json": "*", - "laravel/serializable-closure": "^1.3", - "phpunit/phpunit": "^9.3", - "spatie/phpunit-snapshot-assertions": "^4.2", - "symfony/var-dumper": "^5.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Backtrace\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van de Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "A better backtrace", - "homepage": "https://github.com/spatie/backtrace", - "keywords": [ - "Backtrace", - "spatie" - ], - "support": { - "source": "https://github.com/spatie/backtrace/tree/1.6.1" - }, - "funding": [ - { - "url": "https://github.com/sponsors/spatie", - "type": "github" - }, - { - "url": "https://spatie.be/open-source/support-us", - "type": "other" - } - ], - "time": "2024-04-24T13:22:11+00:00" - }, - { - "name": "spatie/flare-client-php", - "version": "1.4.4", - "source": { - "type": "git", - "url": "https://github.com/spatie/flare-client-php.git", - "reference": "17082e780752d346c2db12ef5d6bee8e835e399c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/17082e780752d346c2db12ef5d6bee8e835e399c", - "reference": "17082e780752d346c2db12ef5d6bee8e835e399c", - "shasum": "" - }, - "require": { - "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", - "php": "^8.0", - "spatie/backtrace": "^1.5.2", - "symfony/http-foundation": "^5.2|^6.0|^7.0", - "symfony/mime": "^5.2|^6.0|^7.0", - "symfony/process": "^5.2|^6.0|^7.0", - "symfony/var-dumper": "^5.2|^6.0|^7.0" - }, - "require-dev": { - "dms/phpunit-arraysubset-asserts": "^0.5.0", - "pestphp/pest": "^1.20|^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.3.x-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Spatie\\FlareClient\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Send PHP errors to Flare", - "homepage": "https://github.com/spatie/flare-client-php", - "keywords": [ - "exception", - "flare", - "reporting", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.4.4" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-01-31T14:18:45+00:00" - }, - { - "name": "spatie/ignition", - "version": "1.14.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/ignition.git", - "reference": "80385994caed328f6f9c9952926932e65b9b774c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/80385994caed328f6f9c9952926932e65b9b774c", - "reference": "80385994caed328f6f9c9952926932e65b9b774c", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "php": "^8.0", - "spatie/backtrace": "^1.5.3", - "spatie/flare-client-php": "^1.4.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "require-dev": { - "illuminate/cache": "^9.52|^10.0|^11.0", - "mockery/mockery": "^1.4", - "pestphp/pest": "^1.20|^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "psr/simple-cache-implementation": "*", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "simple-cache-implementation": "To cache solutions from OpenAI" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.5.x-dev" - } - }, - "autoload": { - "psr-4": { - "Spatie\\Ignition\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Spatie", - "email": "info@spatie.be", - "role": "Developer" - } - ], - "description": "A beautiful error page for PHP applications.", - "homepage": "https://flareapp.io/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/spatie/ignition/issues", - "source": "https://github.com/spatie/ignition" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-04-26T08:45:51+00:00" - }, - { - "name": "spatie/laravel-ignition", - "version": "2.5.2", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "c93fcadcc4629775c839ac9a90916f07a660266f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/c93fcadcc4629775c839ac9a90916f07a660266f", - "reference": "c93fcadcc4629775c839ac9a90916f07a660266f", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "illuminate/support": "^10.0|^11.0", - "php": "^8.1", - "spatie/flare-client-php": "^1.3.5", - "spatie/ignition": "^1.13.2", - "symfony/console": "^6.2.3|^7.0", - "symfony/var-dumper": "^6.2.3|^7.0" - }, - "require-dev": { - "livewire/livewire": "^2.11|^3.3.5", - "mockery/mockery": "^1.5.1", - "openai-php/client": "^0.8.1", - "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^2.30", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan-deprecation-rules": "^1.1.1", - "phpstan/phpstan-phpunit": "^1.3.3", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\LaravelIgnition\\IgnitionServiceProvider" - ], - "aliases": { - "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" - } - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Spatie\\LaravelIgnition\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Spatie", - "email": "info@spatie.be", - "role": "Developer" - } - ], - "description": "A beautiful error page for Laravel applications.", - "homepage": "https://flareapp.io/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/spatie/laravel-ignition/issues", - "source": "https://github.com/spatie/laravel-ignition" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-04-16T08:57:16+00:00" + "time": "2024-02-02T06:10:47+00:00" }, { "name": "theseer/tokenizer", @@ -11550,7 +10949,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "jackiedo/dotenv-editor": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { diff --git a/config/app.php b/config/app.php index 2df6388a..f3668014 100644 --- a/config/app.php +++ b/config/app.php @@ -12,9 +12,9 @@ return [ | Application Name |-------------------------------------------------------------------------- | - | This value is the name of your application. This value is used when the + | This value is the name of your application, which will be used when the | framework needs to place the application's name in a notification or - | any other location as required by the application or its packages. + | other UI elements where an application name needs to be displayed. | */ @@ -53,7 +53,7 @@ return [ | | This URL is used by the console to properly generate URLs when using | the Artisan command line tool. You should set this to the root of - | your application so that it is used when running Artisan tasks. + | the application so that it's available within Artisan commands. | */ @@ -67,8 +67,8 @@ return [ |-------------------------------------------------------------------------- | | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. We have gone - | ahead and set this to a sensible default for you out of the box. + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. | */ @@ -80,53 +80,37 @@ return [ |-------------------------------------------------------------------------- | | The application locale determines the default locale that will be used - | by the translation service provider. You are free to set this value - | to any of the locales which will be supported by the application. + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. | */ - 'locale' => 'en', + 'locale' => env('APP_LOCALE', 'en'), - /* - |-------------------------------------------------------------------------- - | Application Fallback Locale - |-------------------------------------------------------------------------- - | - | The fallback locale determines the locale to use when the current one - | is not available. You may change the value to correspond to any of - | the language folders that are provided through your application. - | - */ + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), - 'fallback_locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Faker Locale - |-------------------------------------------------------------------------- - | - | This locale will be used by the Faker PHP library when generating fake - | data for your database seeds. For example, this will be used to get - | localized telephone numbers, street address information and more. - | - */ - - 'faker_locale' => 'en_US', + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), /* |-------------------------------------------------------------------------- | Encryption Key |-------------------------------------------------------------------------- | - | This key is used by the Illuminate encrypter service and should be set - | to a random, 32 character string, otherwise these encrypted strings - | will not be safe. Please do this before deploying an application! + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. | */ + 'cipher' => 'AES-256-CBC', + 'key' => str_starts_with(env('APP_KEY')??'', 'base64:') ? env('APP_KEY') : substr(env('APP_KEY')??'', 0, 32), - 'cipher' => 'AES-256-CBC', + 'previous_keys' => [ + ...array_filter( + explode(',', env('APP_PREVIOUS_KEYS', '')) + ), + ], /* |-------------------------------------------------------------------------- @@ -142,8 +126,8 @@ return [ */ 'maintenance' => [ - 'driver' => 'file', - // 'store' => 'redis', + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), ], /* @@ -151,9 +135,9 @@ return [ | Autoloaded Service Providers |-------------------------------------------------------------------------- | - | The service providers listed here will be automatically loaded on the - | request to your application. Feel free to add your own services to - | this array to grant expanded functionality to your applications. + | The service providers listed here will be automatically loaded on any + | requests to your application. You may add your own services to the + | arrays below to provide additional features to this application. | */ @@ -180,8 +164,8 @@ return [ |-------------------------------------------------------------------------- | | This array of class aliases will be registered when this application - | is started. However, feel free to register as many as you wish as - | the aliases are "lazy" loaded so they don't hinder performance. + | is started. You may add any additional class aliases which should + | be loaded to the array. For speed, all aliases are lazy loaded. | */ diff --git a/config/auth.php b/config/auth.php index 1ae4c45a..f50ce519 100644 --- a/config/auth.php +++ b/config/auth.php @@ -11,15 +11,15 @@ return [ | Authentication Defaults |-------------------------------------------------------------------------- | - | This option controls the default authentication "guard" and password - | reset options for your application. You may change these defaults + | This option defines the default authentication "guard" and password + | reset "broker" for your application. You may change these values | as required, but they're a perfect start for most applications. | */ 'defaults' => [ - 'guard' => env('AUTHENTICATION_GUARD', 'web-guard'), - 'passwords' => 'users', + 'guard' => env('AUTH_GUARD', env('AUTHENTICATION_GUARD', 'web-guard')), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), ], /* @@ -44,11 +44,11 @@ return [ | | Next, you may define every authentication guard for your application. | Of course, a great default configuration has been defined for you - | here which uses session storage and the Eloquent user provider. + | which utilizes session storage plus the Eloquent user provider. | - | All authentication drivers have a user provider. This defines how the + | All authentication guards have a user provider, which defines how the | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. + | system used by the application. Typically, Eloquent is utilized. | | Supported: "session" | @@ -77,12 +77,12 @@ return [ | User Providers |-------------------------------------------------------------------------- | - | All authentication drivers have a user provider. This defines how the + | All authentication guards have a user provider, which defines how the | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. + | system used by the application. Typically, Eloquent is utilized. | | If you have multiple user tables or models you may configure multiple - | sources which represent each model / table. These sources may then + | providers to represent the model / table. These providers may then | be assigned to any extra authentication guards you have defined. | | Supported: "database", "eloquent" @@ -92,7 +92,7 @@ return [ 'providers' => [ 'users' => [ 'driver' => 'eloquent-webauthn', - 'model' => App\Models\User::class, + 'model' => env('AUTH_MODEL', App\Models\User::class), // 'password_fallback' => true, ], 'remote-user' => [ @@ -106,9 +106,9 @@ return [ | Resetting Passwords |-------------------------------------------------------------------------- | - | You may specify multiple password reset configurations if you have more - | than one user table or model in the application and you want to have - | separate password reset settings based on the specific user types. + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. | | The expiry time is the number of minutes that each reset token will be | considered valid. This security feature keeps tokens short-lived so @@ -123,7 +123,7 @@ return [ 'passwords' => [ 'users' => [ 'provider' => 'users', - 'table' => 'password_resets', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_resets'), 'expire' => 60, 'throttle' => 60, ], @@ -143,11 +143,11 @@ return [ |-------------------------------------------------------------------------- | | Here you may define the amount of seconds before a password confirmation - | times out and the user is prompted to re-enter their password via the + | window expires and users are asked to re-enter their password via the | confirmation screen. By default, the timeout lasts for three hours. | */ - 'password_timeout' => 10800, + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), ]; diff --git a/config/broadcasting.php b/config/broadcasting.php index 24104853..ebc3fb9c 100644 --- a/config/broadcasting.php +++ b/config/broadcasting.php @@ -11,11 +11,11 @@ return [ | framework when an event needs to be broadcast. You may set this to | any of the connections defined in the "connections" array below. | - | Supported: "pusher", "ably", "redis", "log", "null" + | Supported: "reverb", "pusher", "ably", "redis", "log", "null" | */ - 'default' => env('BROADCAST_DRIVER', 'null'), + 'default' => env('BROADCAST_CONNECTION', 'null'), /* |-------------------------------------------------------------------------- @@ -23,13 +23,29 @@ return [ |-------------------------------------------------------------------------- | | Here you may define all of the broadcast connections that will be used - | to broadcast events to other systems or over websockets. Samples of + | to broadcast events to other systems or over WebSockets. Samples of | each available type of connection are provided inside this array. | */ 'connections' => [ + 'reverb' => [ + 'driver' => 'reverb', + 'key' => env('REVERB_APP_KEY'), + 'secret' => env('REVERB_APP_SECRET'), + 'app_id' => env('REVERB_APP_ID'), + 'options' => [ + 'host' => env('REVERB_HOST'), + 'port' => env('REVERB_PORT', 443), + 'scheme' => env('REVERB_SCHEME', 'https'), + 'useTLS' => env('REVERB_SCHEME', 'https') === 'https', + ], + 'client_options' => [ + // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html + ], + ], + 'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), @@ -53,11 +69,6 @@ return [ 'key' => env('ABLY_KEY'), ], - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - ], - 'log' => [ 'driver' => 'log', ], diff --git a/config/cache.php b/config/cache.php index d4171e22..c9a1fe70 100644 --- a/config/cache.php +++ b/config/cache.php @@ -9,13 +9,13 @@ return [ | Default Cache Store |-------------------------------------------------------------------------- | - | This option controls the default cache connection that gets used while - | using this caching library. This connection is used when another is - | not explicitly specified when executing a given caching function. + | This option controls the default cache store that will be used by the + | framework. This connection is utilized if another isn't explicitly + | specified when running a cache operation inside the application. | */ - 'default' => env('CACHE_DRIVER', 'file'), + 'default' => env('CACHE_STORE', env('CACHE_DRIVER', 'file')), /* |-------------------------------------------------------------------------- @@ -26,17 +26,13 @@ return [ | well as their drivers. You may even define multiple stores for the | same cache driver to group types of items stored in your caches. | - | Supported drivers: "apc", "array", "database", "file", - | "memcached", "redis", "dynamodb", "octane", "null" + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", "null" | */ 'stores' => [ - 'apc' => [ - 'driver' => 'apc', - ], - 'array' => [ 'driver' => 'array', 'serialize' => false, @@ -44,9 +40,10 @@ return [ 'database' => [ 'driver' => 'database', - 'table' => 'cache', - 'connection' => null, - 'lock_connection' => null, + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), ], 'file' => [ @@ -76,8 +73,8 @@ return [ 'redis' => [ 'driver' => 'redis', - 'connection' => 'cache', - 'lock_connection' => 'default', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), ], 'dynamodb' => [ @@ -100,8 +97,8 @@ return [ | Cache Key Prefix |-------------------------------------------------------------------------- | - | When utilizing the APC, database, memcached, Redis, or DynamoDB cache - | stores there might be other applications using the same cache. For + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For | that reason, you may prefix every cache key to avoid collisions. | */ diff --git a/config/database.php b/config/database.php index 5fe023cf..b8dd2f66 100644 --- a/config/database.php +++ b/config/database.php @@ -10,8 +10,9 @@ return [ |-------------------------------------------------------------------------- | | Here you may specify which of the database connections below you wish - | to use as your default connection for all database work. Of course - | you may use many connections at once using the Database library. + | to use as your default connection for database operations. This is + | the connection which will be utilized unless another connection + | is explicitly specified when you execute a query / statement. | */ @@ -22,14 +23,9 @@ return [ | Database Connections |-------------------------------------------------------------------------- | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. | */ @@ -37,30 +33,23 @@ return [ 'sqlite' => [ 'driver' => 'sqlite', - 'url' => env('DATABASE_URL'), + 'url' => env('DB_URL', env('DATABASE_URL')), 'database' => envUnlessEmpty('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ], - 'testing' => [ - 'driver' => 'sqlite', - 'database' => ':memory:', - 'prefix' => '', - 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), - ], - 'mysql' => [ 'driver' => 'mysql', - 'url' => env('DATABASE_URL'), + 'url' => env('DB_URL', env('DATABASE_URL')), 'host' => envUnlessEmpty('DB_HOST', '127.0.0.1'), 'port' => envUnlessEmpty('DB_PORT', '3306'), 'database' => envUnlessEmpty('DB_DATABASE', '2fauth'), 'username' => envUnlessEmpty('DB_USERNAME', '2fauth'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, @@ -70,15 +59,36 @@ return [ ]) : [], ], + // Disabled until + // 'mariadb' => [ + // 'driver' => 'mariadb', + // 'url' => env('DB_URL', env('DATABASE_URL')), + // 'host' => envUnlessEmpty('DB_HOST', '127.0.0.1'), + // 'port' => envUnlessEmpty('DB_PORT', '3306'), + // 'database' => envUnlessEmpty('DB_DATABASE', '2fauth'), + // 'username' => envUnlessEmpty('DB_USERNAME', '2fauth'), + // 'password' => env('DB_PASSWORD', ''), + // 'unix_socket' => env('DB_SOCKET', ''), + // 'charset' => env('DB_CHARSET', 'utf8mb4'), + // 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + // 'prefix' => '', + // 'prefix_indexes' => true, + // 'strict' => true, + // 'engine' => null, + // 'options' => extension_loaded('pdo_mysql') ? array_filter([ + // PDO::MYSQL_ATTR_SSL_CA => envUnlessEmpty('MYSQL_ATTR_SSL_CA', null), + // ]) : [], + // ], + 'pgsql' => [ 'driver' => 'pgsql', - 'url' => env('DATABASE_URL'), + 'url' => env('DB_URL', env('DATABASE_URL')), 'host' => envUnlessEmpty('DB_HOST', '127.0.0.1'), 'port' => envUnlessEmpty('DB_PORT', '5432'), 'database' => envUnlessEmpty('DB_DATABASE', '2fauth'), 'username' => envUnlessEmpty('DB_USERNAME', '2fauth'), 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', + 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, 'search_path' => 'public', @@ -87,19 +97,26 @@ return [ 'sqlsrv' => [ 'driver' => 'sqlsrv', - 'url' => env('DATABASE_URL'), + 'url' => env('DB_URL', env('DATABASE_URL')), 'host' => envUnlessEmpty('DB_HOST', 'localhost'), 'port' => envUnlessEmpty('DB_PORT', '1433'), 'database' => envUnlessEmpty('DB_DATABASE', '2fauth'), 'username' => envUnlessEmpty('DB_USERNAME', '2fauth'), 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', + 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, // 'encrypt' => env('DB_ENCRYPT', 'yes'), // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), ], + 'testing' => [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + ], /* @@ -109,11 +126,14 @@ return [ | | This table keeps track of all the migrations that have already run for | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. + | the migrations on disk haven't actually been run on the database. | */ - 'migrations' => 'migrations', + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], /* |-------------------------------------------------------------------------- @@ -122,7 +142,7 @@ return [ | | Redis is an open source, fast, and advanced key-value store that also | provides a richer body of commands than a typical key-value system - | such as APC or Memcached. Laravel makes it easy to dig right in. + | such as Memcached. You may define your connection settings here. | */ diff --git a/config/filesystems.php b/config/filesystems.php index 8ce2f33f..51ac99ae 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -9,22 +9,22 @@ return [ | | Here you may specify the default filesystem disk that should be used | by the framework. The "local" disk, as well as a variety of cloud - | based disks are available to your application. Just store away! + | based disks are available to your application for file storage. | */ - 'default' => env('FILESYSTEM_DRIVER', 'local'), + 'default' => env('FILESYSTEM_DISK', env('FILESYSTEM_DRIVER', 'local')), /* |-------------------------------------------------------------------------- | Filesystem Disks |-------------------------------------------------------------------------- | - | Here you may configure as many filesystem "disks" as you wish, and you - | may even configure multiple disks of the same driver. Defaults have - | been set up for each driver as an example of the required values. + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. | - | Supported Drivers: "local", "ftp", "sftp", "s3" + | Supported drivers: "local", "ftp", "sftp", "s3" | */ diff --git a/config/hashing.php b/config/hashing.php index bcd3be4c..6ae68ad9 100644 --- a/config/hashing.php +++ b/config/hashing.php @@ -15,7 +15,7 @@ return [ | */ - 'driver' => 'bcrypt', + 'driver' => env('HASH_DRIVER', 'bcrypt'), /* |-------------------------------------------------------------------------- @@ -30,6 +30,7 @@ return [ 'bcrypt' => [ 'rounds' => env('BCRYPT_ROUNDS', 10), + 'verify' => env('HASH_VERIFY', true), ], /* @@ -44,9 +45,23 @@ return [ */ 'argon' => [ - 'memory' => 65536, - 'threads' => 1, - 'time' => 4, + 'memory' => env('ARGON_MEMORY', 65536), + 'threads' => env('ARGON_THREADS', 1), + 'time' => env('ARGON_TIME', 4), + 'verify' => env('HASH_VERIFY', true), ], + /* + |-------------------------------------------------------------------------- + | Rehash On Login + |-------------------------------------------------------------------------- + | + | Setting this option to true will tell Laravel to automatically rehash + | the user's password during login if the configured work factor for + | the algorithm has changed, allowing graceful upgrades of hashes. + | + */ + + 'rehash_on_login' => true, + ]; diff --git a/config/logging.php b/config/logging.php index 6cf3baa7..acf62d24 100644 --- a/config/logging.php +++ b/config/logging.php @@ -12,9 +12,9 @@ return [ | Default Log Channel |-------------------------------------------------------------------------- | - | This option defines the default log channel that gets used when writing - | messages to the logs. The name specified in this option should match - | one of the channels defined in the "channels" configuration array. + | This option defines the default log channel that is utilized to write + | messages to your logs. The value provided here should match one of + | the channels present in the list of "channels" configured below. | */ @@ -33,7 +33,7 @@ return [ 'deprecations' => [ 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), - 'trace' => false, + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), ], /* @@ -41,20 +41,19 @@ return [ | Log Channels |-------------------------------------------------------------------------- | - | Here you may configure the log channels for your application. Out of - | the box, Laravel uses the Monolog PHP logging library. This gives - | you a variety of powerful log handlers / formatters to utilize. + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. | - | Available Drivers: "single", "daily", "slack", "syslog", - | "errorlog", "monolog", - | "custom", "stack" + | Available drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" | */ 'channels' => [ 'stack' => [ 'driver' => 'stack', - 'channels' => ['daily'], + 'channels' => explode(',', env('LOG_STACK', 'daily')), 'ignore_exceptions' => false, ], @@ -69,15 +68,15 @@ return [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), - 'days' => 7, + 'days' => env('LOG_DAILY_DAYS', 7), 'replace_placeholders' => true, ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => 'Laravel Log', - 'emoji' => ':boom:', + 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), 'level' => env('LOG_LEVEL', 'critical'), 'replace_placeholders' => true, ], @@ -108,7 +107,7 @@ return [ 'syslog' => [ 'driver' => 'syslog', 'level' => env('LOG_LEVEL', 'debug'), - 'facility' => LOG_USER, + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), 'replace_placeholders' => true, ], diff --git a/config/mail.php b/config/mail.php index cae41b52..8ba9e50e 100644 --- a/config/mail.php +++ b/config/mail.php @@ -7,9 +7,10 @@ return [ | Default Mailer |-------------------------------------------------------------------------- | - | This option controls the default mailer that is used to send any email - | messages sent by your application. Alternative mailers may be setup - | and used as needed; however, this mailer will be used by default. + | This option controls the default mailer that is used to send all email + | messages unless another mailer is explicitly specified when sending + | the message. All additional mailers can be configured within the + | "mailers" array. Examples of each type of mailer are provided. | */ @@ -24,12 +25,13 @@ return [ | their respective settings. Several examples have been configured for | you and you are free to add your own as your application requires. | - | Laravel supports a variety of mail "transport" drivers to be used while - | sending an e-mail. You will specify which one you are using for your - | mailers below. You are free to add additional mailers as required. + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. | | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", - | "postmark", "log", "array", "failover" + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" | */ @@ -43,7 +45,7 @@ return [ 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'timeout' => null, - 'local_domain' => env('MAIL_EHLO_DOMAIN'), + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(env('APP_URL', 'http://localhost'), PHP_URL_HOST)), 'verify_peer' => env('MAIL_VERIFY_SSL_PEER', true), ], @@ -60,11 +62,16 @@ return [ 'postmark' => [ 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), // 'client' => [ // 'timeout' => 5, // ], ], + 'resend' => [ + 'transport' => 'resend', + ], + 'sendmail' => [ 'transport' => 'sendmail', 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), @@ -94,6 +101,7 @@ return [ 'postmark', ], ], + ], /* @@ -101,9 +109,9 @@ return [ | Global "From" Address |-------------------------------------------------------------------------- | - | You may wish for all e-mails sent by your application to be sent from - | the same address. Here, you may specify a name and address that is - | used globally for all e-mails that are sent by your application. + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. | */ @@ -124,7 +132,7 @@ return [ */ 'markdown' => [ - 'theme' => 'default', + 'theme' => env('MAIL_MARKDOWN_THEME', 'default'), 'paths' => [ resource_path('views/vendor/mail'), diff --git a/config/queue.php b/config/queue.php index 01c6b054..62c59052 100644 --- a/config/queue.php +++ b/config/queue.php @@ -7,22 +7,22 @@ return [ | Default Queue Connection Name |-------------------------------------------------------------------------- | - | Laravel's queue API supports an assortment of back-ends via a single - | API, giving you convenient access to each back-end using the same - | syntax for every one. Here you may define a default connection. + | Laravel's queue supports a variety of backends via a single, unified + | API, giving you convenient access to each backend using identical + | syntax for each. The default queue connection is defined below. | */ - 'default' => env('QUEUE_CONNECTION', 'sync'), + 'default' => env('QUEUE_CONNECTION', 'database'), /* |-------------------------------------------------------------------------- | Queue Connections |-------------------------------------------------------------------------- | - | Here you may configure the connection information for each server that - | is used by your application. A default configuration has been added - | for each back-end shipped with Laravel. You are free to add more. + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" | @@ -36,17 +36,18 @@ return [ 'database' => [ 'driver' => 'database', - 'table' => 'jobs', - 'queue' => 'default', - 'retry_after' => 90, + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), 'after_commit' => false, ], 'beanstalkd' => [ 'driver' => 'beanstalkd', - 'host' => 'localhost', - 'queue' => 'default', - 'retry_after' => 90, + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), 'block_for' => 0, 'after_commit' => false, ], @@ -64,9 +65,9 @@ return [ 'redis' => [ 'driver' => 'redis', - 'connection' => 'default', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), 'queue' => env('REDIS_QUEUE', 'default'), - 'retry_after' => 90, + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), 'block_for' => null, 'after_commit' => false, ], @@ -95,8 +96,10 @@ return [ |-------------------------------------------------------------------------- | | These options configure the behavior of failed queue job logging so you - | can control which database and table are used to store the jobs that - | have failed. You may change them to any database / table you wish. + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" | */ diff --git a/config/services.php b/config/services.php index 5dfae0bd..b7597190 100644 --- a/config/services.php +++ b/config/services.php @@ -52,4 +52,15 @@ return [ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], + 'resend' => [ + 'key' => env('RESEND_KEY'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + ]; diff --git a/config/session.php b/config/session.php index aa8c851b..1457ef72 100644 --- a/config/session.php +++ b/config/session.php @@ -9,9 +9,9 @@ return [ | Default Session Driver |-------------------------------------------------------------------------- | - | This option controls the default session "driver" that will be used on - | requests. By default, we will use the lightweight native driver but - | you may specify any of the other wonderful drivers provided here. + | This option determines the default session driver that is utilized for + | incoming requests. Laravel supports a variety of storage options to + | persist session data. Database storage is a great default choice. | | Supported: "file", "cookie", "database", "apc", | "memcached", "redis", "dynamodb", "array" @@ -27,13 +27,14 @@ return [ | | Here you may specify the number of minutes that you wish the session | to be allowed to remain idle before it expires. If you want them - | to immediately expire on the browser closing, set that option. + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. | */ - 'lifetime' => 1 * (60 * 24 * 90), + 'lifetime' => env('SESSION_LIFETIME', 1 * (60 * 24 * 90)), - 'expire_on_close' => false, + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), /* |-------------------------------------------------------------------------- @@ -41,21 +42,21 @@ return [ |-------------------------------------------------------------------------- | | This option allows you to easily specify that all of your session data - | should be encrypted before it is stored. All encryption will be run - | automatically by Laravel and you can use the Session like normal. + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. | */ - 'encrypt' => false, + 'encrypt' => env('SESSION_ENCRYPT', false), /* |-------------------------------------------------------------------------- | Session File Location |-------------------------------------------------------------------------- | - | When using the native session driver, we need a location where session - | files may be stored. A default has been set for you but a different - | location may be specified. This is only needed for file sessions. + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. | */ @@ -79,22 +80,22 @@ return [ | Session Database Table |-------------------------------------------------------------------------- | - | When using the "database" session driver, you may specify the table we - | should use to manage the sessions. Of course, a sensible default is - | provided for you; however, you are free to change this as needed. + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. | */ - 'table' => 'sessions', + 'table' => env('SESSION_TABLE', 'sessions'), /* |-------------------------------------------------------------------------- | Session Cache Store |-------------------------------------------------------------------------- | - | While using one of the framework's cache driven session backends you may - | list a cache store that should be used for these sessions. This value - | must match with one of the application's configured cache "stores". + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. | | Affects: "apc", "dynamodb", "memcached", "redis" | @@ -120,9 +121,9 @@ return [ | Session Cookie Name |-------------------------------------------------------------------------- | - | Here you may change the name of the cookie used to identify a session - | instance by ID. The name specified here will get used every time a - | new session cookie is created by the framework for every driver. + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. | */ @@ -138,20 +139,20 @@ return [ | | The session cookie path determines the path for which the cookie will | be regarded as available. Typically, this will be the root path of - | your application but you are free to change this when necessary. + | your application, but you're free to change this when necessary. | */ - 'path' => '/', + 'path' => env('SESSION_PATH', '/'), /* |-------------------------------------------------------------------------- | Session Cookie Domain |-------------------------------------------------------------------------- | - | Here you may change the domain of the cookie used to identify a session - | in your application. This will determine which domains the cookie is - | available to in your application. A sensible default has been set. + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain and all subdomains. Typically, this shouldn't be changed. | */ @@ -177,11 +178,11 @@ return [ | | Setting this value to true will prevent JavaScript from accessing the | value of the cookie and the cookie will only be accessible through - | the HTTP protocol. You are free to modify this option if needed. + | the HTTP protocol. It's unlikely you should disable this option. | */ - 'http_only' => true, + 'http_only' => env('SESSION_HTTP_ONLY', true), /* |-------------------------------------------------------------------------- @@ -190,12 +191,27 @@ return [ | | This option determines how your cookies behave when cross-site requests | take place, and can be used to mitigate CSRF attacks. By default, we - | will set this value to "lax" since this is a secure default value. + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value | | Supported: "lax", "strict", "none", null | */ - 'same_site' => 'lax', + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), ]; diff --git a/database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php b/database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php new file mode 100644 index 00000000..7b93b406 --- /dev/null +++ b/database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php @@ -0,0 +1,31 @@ +string('id', 100)->primary(); + $table->unsignedBigInteger('user_id')->index(); + $table->unsignedBigInteger('client_id'); + $table->text('scopes')->nullable(); + $table->boolean('revoked'); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_auth_codes'); + } +}; diff --git a/database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php b/database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php new file mode 100644 index 00000000..598798ee --- /dev/null +++ b/database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php @@ -0,0 +1,33 @@ +string('id', 100)->primary(); + $table->unsignedBigInteger('user_id')->nullable()->index(); + $table->unsignedBigInteger('client_id'); + $table->string('name')->nullable(); + $table->text('scopes')->nullable(); + $table->boolean('revoked'); + $table->timestamps(); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_access_tokens'); + } +}; diff --git a/database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php b/database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php new file mode 100644 index 00000000..b007904c --- /dev/null +++ b/database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php @@ -0,0 +1,29 @@ +string('id', 100)->primary(); + $table->string('access_token_id', 100)->index(); + $table->boolean('revoked'); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_refresh_tokens'); + } +}; diff --git a/database/migrations/2016_06_01_000004_create_oauth_clients_table.php b/database/migrations/2016_06_01_000004_create_oauth_clients_table.php new file mode 100644 index 00000000..776ccfab --- /dev/null +++ b/database/migrations/2016_06_01_000004_create_oauth_clients_table.php @@ -0,0 +1,35 @@ +bigIncrements('id'); + $table->unsignedBigInteger('user_id')->nullable()->index(); + $table->string('name'); + $table->string('secret', 100)->nullable(); + $table->string('provider')->nullable(); + $table->text('redirect'); + $table->boolean('personal_access_client'); + $table->boolean('password_client'); + $table->boolean('revoked'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_clients'); + } +}; diff --git a/database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php b/database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php new file mode 100644 index 00000000..7c9d1e8f --- /dev/null +++ b/database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php @@ -0,0 +1,28 @@ +bigIncrements('id'); + $table->unsignedBigInteger('client_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_personal_access_clients'); + } +}; diff --git a/database/migrations/2020_12_04_073604_alter_encrypted_columns_to_text.php b/database/migrations/2020_12_04_073604_alter_encrypted_columns_to_text.php index a01cbc58..538c8762 100644 --- a/database/migrations/2020_12_04_073604_alter_encrypted_columns_to_text.php +++ b/database/migrations/2020_12_04_073604_alter_encrypted_columns_to_text.php @@ -18,7 +18,7 @@ class AlterEncryptedColumnsToText extends Migration if ('sqlite' !== $driver) { Schema::table('twofaccounts', function (Blueprint $table) { - $table->text('account')->change(); + $table->text('account')->nullable()->change(); }); Schema::table('twofaccounts', function (Blueprint $table) { diff --git a/database/migrations/2020_12_04_073605_alter_encrypted_columns_to_text_for_sqlite.php b/database/migrations/2020_12_04_073605_alter_encrypted_columns_to_text_for_sqlite.php index ed874574..e4099114 100644 --- a/database/migrations/2020_12_04_073605_alter_encrypted_columns_to_text_for_sqlite.php +++ b/database/migrations/2020_12_04_073605_alter_encrypted_columns_to_text_for_sqlite.php @@ -18,7 +18,7 @@ class AlterEncryptedColumnsToTextForSqlite extends Migration if ('sqlite' === $driver) { Schema::table('twofaccounts', function (Blueprint $table) { - $table->text('account')->change(); + $table->text('account')->nullable()->change(); }); } } diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index bc3af00b..c4c26c15 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -55,7 +55,7 @@ if [ -f /2fauth/installed ]; then fi else php artisan migrate:refresh --force - php artisan passport:install + php artisan passport:install --no-interaction fi echo "${COMMIT}" > /2fauth/installed diff --git a/phpunit-mysql.xml b/phpunit-mysql.xml index 299534d7..0ae55f52 100644 --- a/phpunit-mysql.xml +++ b/phpunit-mysql.xml @@ -1,5 +1,6 @@ + beStrictAboutTestsThatDoNotTestAnything="false"> app @@ -34,6 +34,7 @@ + diff --git a/phpunit.xml b/phpunit.xml index a4a687a3..39530056 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,5 +1,6 @@ + beStrictAboutTestsThatDoNotTestAnything="false"> app @@ -34,7 +34,7 @@ - + diff --git a/tests/Api/v1/Controllers/Auth/UserControllerTest.php b/tests/Api/v1/Controllers/Auth/UserControllerTest.php index 6cb0fa36..e7190d77 100644 --- a/tests/Api/v1/Controllers/Auth/UserControllerTest.php +++ b/tests/Api/v1/Controllers/Auth/UserControllerTest.php @@ -6,6 +6,7 @@ use App\Api\v1\Controllers\UserController; use App\Api\v1\Resources\UserResource; use App\Models\User; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -25,9 +26,6 @@ class UserControllerTest extends FeatureTestCase 'value', ]; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -35,9 +33,7 @@ class UserControllerTest extends FeatureTestCase $this->user = User::factory()->create(); } - /** - * @test - */ + #[Test] public function test_show_existing_user_when_authenticated_returns_success() { $response = $this->actingAs($this->user, 'api-guard') @@ -54,9 +50,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_allPreferences_returns_consistent_json_structure() { $response = $this->actingAs($this->user, 'api-guard') @@ -67,9 +61,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_allPreferences_returns_preferences_with_default_values() { $response = $this->actingAs($this->user, 'api-guard') @@ -84,9 +76,7 @@ class UserControllerTest extends FeatureTestCase } } - /** - * @test - */ + #[Test] public function test_allPreferences_returns_preferences_with_user_values() { $userPrefs = []; @@ -117,9 +107,7 @@ class UserControllerTest extends FeatureTestCase } } - /** - * @test - */ + #[Test] public function test_showPreference_returns_preference_with_default_value() { /** @@ -136,9 +124,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_showPreference_returns_preference_with_custom_value() { $showOtpAsDot = ! config('2fauth.preferences.showOtpAsDot'); @@ -153,9 +139,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_showPreference_for_missing_preference_returns_not_found() { $response = $this->actingAs($this->user, 'api-guard') @@ -163,9 +147,7 @@ class UserControllerTest extends FeatureTestCase ->assertNotFound(); } - /** - * @test - */ + #[Test] public function test_setPreference_returns_updated_preference() { /** @@ -187,9 +169,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_setPreference_for_missing_preference_returns_not_found() { $response = $this->actingAs($this->user, 'api-guard') @@ -200,9 +180,7 @@ class UserControllerTest extends FeatureTestCase ->assertNotFound(); } - /** - * @test - */ + #[Test] public function test_setPreference_with_invalid_data_returns_validation_error() { $response = $this->actingAs($this->user, 'api-guard') diff --git a/tests/Api/v1/Controllers/GroupControllerTest.php b/tests/Api/v1/Controllers/GroupControllerTest.php index ad33aa6f..d284774e 100644 --- a/tests/Api/v1/Controllers/GroupControllerTest.php +++ b/tests/Api/v1/Controllers/GroupControllerTest.php @@ -10,6 +10,7 @@ use App\Models\TwoFAccount; use App\Models\User; use App\Policies\GroupPolicy; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; #[CoversClass(GroupController::class)] @@ -50,9 +51,6 @@ class GroupControllerTest extends FeatureTestCase private const NEW_GROUP_NAME = 'MyNewGroup'; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -80,9 +78,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_index_returns_user_groups_only_with_pseudo_group() { $this->actingAs($this->user, 'api-guard') @@ -107,9 +103,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_store_returns_created_group_resource() { $this->actingAs($this->user, 'api-guard') @@ -128,9 +122,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_store_invalid_data_returns_validation_error() { $this->actingAs($this->user, 'api-guard') @@ -140,9 +132,7 @@ class GroupControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_show_returns_group_resource() { $group = Group::factory()->for($this->user)->create([ @@ -158,9 +148,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_show_missing_group_returns_not_found() { $response = $this->actingAs($this->user, 'api-guard') @@ -171,9 +159,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_show_group_of_another_user_is_forbidden() { $response = $this->actingAs($this->anotherUser, 'api-guard') @@ -184,9 +170,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_returns_updated_group_resource() { $group = Group::factory()->for($this->user)->create(); @@ -202,9 +186,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_missing_group_returns_not_found() { $response = $this->actingAs($this->user, 'api-guard') @@ -217,9 +199,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_with_invalid_data_returns_validation_error() { $group = Group::factory()->for($this->user)->create(); @@ -231,9 +211,7 @@ class GroupControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_update_group_of_another_user_is_forbidden() { $response = $this->actingAs($this->anotherUser, 'api-guard') @@ -246,9 +224,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_assign_accounts_returns_updated_group_resource() { $group = Group::factory()->for($this->user)->create(); @@ -266,9 +242,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_assign_accounts_to_missing_group_returns_not_found() { $accounts = TwoFAccount::factory()->count(2)->for($this->user)->create(); @@ -283,9 +257,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_assign_invalid_accounts_returns_validation_error() { $group = Group::factory()->for($this->user)->create(); @@ -298,9 +270,7 @@ class GroupControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_assign_to_group_of_another_user_is_forbidden() { $response = $this->actingAs($this->anotherUser, 'api-guard') @@ -313,9 +283,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_assign_accounts_of_another_user_is_forbidden() { $response = $this->actingAs($this->user, 'api-guard') @@ -328,9 +296,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_accounts_returns_twofaccounts_collection() { $response = $this->actingAs($this->user, 'api-guard') @@ -358,9 +324,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_accounts_returns_twofaccounts_collection_with_secret() { $response = $this->actingAs($this->user, 'api-guard') @@ -383,9 +347,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_accounts_of_missing_group_returns_not_found() { $response = $this->actingAs($this->user, 'api-guard') @@ -396,9 +358,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_accounts_of_another_user_group_is_forbidden() { $response = $this->actingAs($this->anotherUser, 'api-guard') @@ -411,9 +371,8 @@ class GroupControllerTest extends FeatureTestCase /** * test Group deletion via API - * - * @test */ + #[Test] public function test_destroy_group_returns_success() { $group = Group::factory()->for($this->user)->create(); @@ -425,9 +384,8 @@ class GroupControllerTest extends FeatureTestCase /** * test Group deletion via API - * - * @test */ + #[Test] public function test_destroy_missing_group_returns_not_found() { $this->actingAs($this->user, 'api-guard') @@ -438,9 +396,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_destroy_group_of_another_user_is_forbidden() { $response = $this->actingAs($this->anotherUser, 'api-guard') @@ -451,9 +407,7 @@ class GroupControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_destroy_group_resets_user_preferences() { // Set the default group to a specific one @@ -474,9 +428,7 @@ class GroupControllerTest extends FeatureTestCase $this->assertEquals(0, $this->user->preferences['activeGroup']); } - /** - * @test - */ + #[Test] public function test_twofaccount_is_released_on_group_destroy() { $this->actingAs($this->user, 'api-guard') diff --git a/tests/Api/v1/Controllers/IconControllerTest.php b/tests/Api/v1/Controllers/IconControllerTest.php index 836ebd98..8f20685f 100644 --- a/tests/Api/v1/Controllers/IconControllerTest.php +++ b/tests/Api/v1/Controllers/IconControllerTest.php @@ -7,6 +7,7 @@ use App\Models\TwoFAccount; use App\Models\User; use Illuminate\Http\UploadedFile; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -27,9 +28,7 @@ class IconControllerTest extends FeatureTestCase $this->user = User::factory()->create(); } - /** - * @test - */ + #[Test] public function test_upload_icon_returns_filename() { $file = UploadedFile::fake()->image('testIcon.jpg'); @@ -44,9 +43,7 @@ class IconControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_upload_with_invalid_data_returns_validation_error() { $response = $this->actingAs($this->user, 'api-guard') @@ -56,9 +53,7 @@ class IconControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_fetch_logo_returns_filename() { $response = $this->actingAs($this->user, 'api-guard') @@ -71,9 +66,7 @@ class IconControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_fetch_unknown_logo_returns_nothing() { $response = $this->actingAs($this->user, 'api-guard') @@ -83,9 +76,7 @@ class IconControllerTest extends FeatureTestCase ->assertNoContent(); } - /** - * @test - */ + #[Test] public function test_delete_icon_returns_success() { $response = $this->actingAs($this->user, 'api-guard') @@ -93,9 +84,7 @@ class IconControllerTest extends FeatureTestCase ->assertNoContent(204); } - /** - * @test - */ + #[Test] public function test_delete_invalid_icon_returns_success() { $response = $this->actingAs($this->user, 'api-guard') @@ -103,9 +92,7 @@ class IconControllerTest extends FeatureTestCase ->assertNoContent(204); } - /** - * @test - */ + #[Test] public function test_delete_icon_of_another_user_is_forbidden() { $anotherUser = User::factory()->create(); diff --git a/tests/Api/v1/Controllers/QrCodeControllerTest.php b/tests/Api/v1/Controllers/QrCodeControllerTest.php index 38f687a4..4d43da6a 100644 --- a/tests/Api/v1/Controllers/QrCodeControllerTest.php +++ b/tests/Api/v1/Controllers/QrCodeControllerTest.php @@ -6,6 +6,7 @@ use App\Api\v1\Controllers\QrCodeController; use App\Models\TwoFAccount; use App\Models\User; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\Classes\LocalFile; use Tests\FeatureTestCase; @@ -27,9 +28,6 @@ class QrCodeControllerTest extends FeatureTestCase */ protected $twofaccount; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -49,9 +47,7 @@ class QrCodeControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_show_qrcode_returns_base64_image() { $response = $this->actingAs($this->user, 'api-guard') @@ -64,9 +60,7 @@ class QrCodeControllerTest extends FeatureTestCase $this->assertStringStartsWith('data:image/svg+xml;base64', $response->getData()->qrcode); } - /** - * @test - */ + #[Test] public function test_show_missing_qrcode_returns_not_found() { $response = $this->actingAs($this->user, 'api-guard') @@ -77,9 +71,7 @@ class QrCodeControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_show_qrcode_of_another_user_is_forbidden() { $response = $this->actingAs($this->anotherUser, 'api-guard') @@ -90,9 +82,7 @@ class QrCodeControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_decode_qrcode_return_success() { $file = LocalFile::fake()->validQrcode(); @@ -109,9 +99,7 @@ class QrCodeControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_decode_missing_qrcode_return_validation_error() { $response = $this->actingAs($this->user, 'api-guard') @@ -121,9 +109,7 @@ class QrCodeControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_decode_invalid_qrcode_return_bad_request() { $file = LocalFile::fake()->invalidQrcode(); diff --git a/tests/Api/v1/Controllers/SettingControllerTest.php b/tests/Api/v1/Controllers/SettingControllerTest.php index 60ae1316..5ab72f10 100644 --- a/tests/Api/v1/Controllers/SettingControllerTest.php +++ b/tests/Api/v1/Controllers/SettingControllerTest.php @@ -9,6 +9,7 @@ use Illuminate\Support\Arr; use Illuminate\Support\Facades\Route; use Illuminate\Support\Str; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -41,9 +42,6 @@ class SettingControllerTest extends FeatureTestCase private const USER_DEFINED_SETTING_CHANGED_VALUE = 'mySetting'; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -52,9 +50,7 @@ class SettingControllerTest extends FeatureTestCase $this->admin = User::factory()->administrator()->create(); } - /** - * @test - */ + #[Test] public function test_all_controller_routes_are_protected_by_admin_middleware() { $routes = Route::getRoutes()->getRoutes(); @@ -70,9 +66,7 @@ class SettingControllerTest extends FeatureTestCase } } - /** - * @test - */ + #[Test] public function test_index_returns_setting_collection() { $response = $this->actingAs($this->admin, 'api-guard') @@ -83,9 +77,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_index_is_forbidden_to_users() { $response = $this->actingAs($this->user, 'api-guard') @@ -96,9 +88,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_show_native_unchanged_setting_returns_consistent_value() { $response = $this->actingAs($this->admin, 'api-guard') @@ -110,9 +100,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_show_native_changed_setting_returns_consistent_value() { Settings::set(self::TWOFAUTH_NATIVE_SETTING, self::TWOFAUTH_NATIVE_SETTING_CHANGED_VALUE); @@ -126,9 +114,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_show_custom_user_setting_returns_consistent_value() { Settings::set(self::USER_DEFINED_SETTING, self::USER_DEFINED_SETTING_VALUE); @@ -142,9 +128,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_show_missing_setting_returns_not_found() { $response = $this->actingAs($this->admin, 'api-guard') @@ -152,9 +136,7 @@ class SettingControllerTest extends FeatureTestCase ->assertNotFound(); } - /** - * @test - */ + #[Test] public function test_show_setting_is_forbidden_to_users() { $response = $this->actingAs($this->user, 'api-guard') @@ -165,9 +147,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_store_custom_user_setting_returns_success() { $response = $this->actingAs($this->admin, 'api-guard') @@ -182,9 +162,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_store_invalid_custom_user_setting_returns_validation_error() { $response = $this->actingAs($this->admin, 'api-guard') @@ -195,9 +173,7 @@ class SettingControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_store_existing_custom_user_setting_returns_validation_error() { Settings::set(self::USER_DEFINED_SETTING, self::USER_DEFINED_SETTING_VALUE); @@ -210,9 +186,7 @@ class SettingControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_update_unchanged_native_setting_returns_updated_setting() { $response = $this->actingAs($this->admin, 'api-guard') @@ -226,9 +200,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_custom_user_setting_returns_updated_setting() { Settings::set(self::USER_DEFINED_SETTING, self::USER_DEFINED_SETTING_VALUE); @@ -244,9 +216,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_missing_user_setting_returns_created_setting() { $response = $this->actingAs($this->admin, 'api-guard') @@ -260,9 +230,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_destroy_user_setting_returns_success() { Settings::set(self::USER_DEFINED_SETTING, self::USER_DEFINED_SETTING_VALUE); @@ -272,9 +240,7 @@ class SettingControllerTest extends FeatureTestCase ->assertNoContent(); } - /** - * @test - */ + #[Test] public function test_destroy_native_setting_returns_bad_request() { $response = $this->actingAs($this->admin, 'api-guard') @@ -286,9 +252,7 @@ class SettingControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_destroy_missing_user_setting_returns_not_found() { $response = $this->actingAs($this->admin, 'api-guard') @@ -296,9 +260,7 @@ class SettingControllerTest extends FeatureTestCase ->assertNotFound(); } - /** - * @test - */ + #[Test] public function test_destroy_is_forbidden_to_users() { Settings::set(self::USER_DEFINED_SETTING, self::USER_DEFINED_SETTING_VALUE); diff --git a/tests/Api/v1/Controllers/TwoFAccountControllerTest.php b/tests/Api/v1/Controllers/TwoFAccountControllerTest.php index f1a8a91b..b022ea52 100644 --- a/tests/Api/v1/Controllers/TwoFAccountControllerTest.php +++ b/tests/Api/v1/Controllers/TwoFAccountControllerTest.php @@ -19,6 +19,7 @@ use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\Classes\LocalFile; use Tests\Data\MigrationTestData; use Tests\Data\OtpTestData; @@ -178,9 +179,6 @@ class TwoFAccountControllerTest extends FeatureTestCase 'secret' => OtpTestData::SECRET, ]; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -208,9 +206,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] #[DataProvider('indexUrlParameterProvider')] public function test_index_returns_user_twofaccounts_only($urlParameter, $expected) { @@ -252,9 +248,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] public function test_show_returns_twofaccount_resource_with_secret() { $response = $this->actingAs($this->user, 'api-guard') @@ -263,9 +257,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertJsonStructure(self::VALID_RESOURCE_STRUCTURE_WITH_SECRET); } - /** - * @test - */ + #[Test] public function test_show_returns_twofaccount_resource_without_secret() { $response = $this->actingAs($this->user, 'api-guard') @@ -274,9 +266,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertJsonStructure(self::VALID_RESOURCE_STRUCTURE_WITHOUT_SECRET); } - /** - * @test - */ + //#[Test] // public function test_show_twofaccount_with_indeciphered_data_returns_replaced_data() // { // $dbEncryptionService = resolve('App\Services\DbEncryptionService'); @@ -299,9 +289,7 @@ class TwoFAccountControllerTest extends FeatureTestCase // ]); // } - /** - * @test - */ + #[Test] public function test_show_missing_twofaccount_returns_not_found() { $response = $this->actingAs($this->user, 'api-guard') @@ -312,9 +300,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_show_twofaccount_of_another_user_is_forbidden() { $response = $this->actingAs($this->user, 'api-guard') @@ -325,9 +311,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] #[DataProvider('accountCreationProvider')] public function test_store_without_encryption_returns_success_with_consistent_resource_structure($payload, $expected) { @@ -341,9 +325,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertJsonFragment($expected); } - /** - * @test - */ + #[Test] #[DataProvider('accountCreationProvider')] public function test_store_with_encryption_returns_success_with_consistent_resource_structure($payload, $expected) { @@ -406,9 +388,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] public function test_store_with_invalid_uri_returns_validation_error() { $response = $this->actingAs($this->user, 'api-guard') @@ -418,9 +398,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_store_assigns_created_account_when_default_group_is_a_specific_one() { // Set the default group to a specific one @@ -436,9 +414,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_store_assigns_created_account_when_default_group_is_the_active_one() { // Set the default group to be the active one @@ -456,9 +432,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_store_assigns_created_account_when_default_group_is_no_group() { // Set the default group to No group @@ -474,9 +448,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_store_assigns_created_account_when_default_group_does_not_exist() { // Set the default group to a non-existing one @@ -492,9 +464,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_totp_returns_success_with_updated_resource() { $response = $this->actingAs($this->user, 'api-guard') @@ -503,9 +473,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertJsonFragment(self::JSON_FRAGMENTS_FOR_CUSTOM_TOTP); } - /** - * @test - */ + #[Test] public function test_update_hotp_returns_success_with_updated_resource() { $response = $this->actingAs($this->user, 'api-guard') @@ -514,9 +482,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertJsonFragment(self::JSON_FRAGMENTS_FOR_CUSTOM_HOTP); } - /** - * @test - */ + #[Test] public function test_update_missing_twofaccount_returns_not_found() { $response = $this->actingAs($this->user, 'api-guard') @@ -524,9 +490,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertNotFound(); } - /** - * @test - */ + #[Test] public function test_update_twofaccount_with_invalid_data_returns_validation_error() { $twofaccount = TwoFAccount::factory()->create(); @@ -536,9 +500,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_update_twofaccount_of_another_user_is_forbidden() { $response = $this->actingAs($this->user, 'api-guard') @@ -549,9 +511,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_migrate_valid_gauth_payload_returns_success_with_consistent_resources() { $response = $this->actingAs($this->user, 'api-guard') @@ -585,9 +545,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_migrate_with_invalid_gauth_payload_returns_validation_error() { $response = $this->actingAs($this->user, 'api-guard') @@ -597,9 +555,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_migrate_payload_with_duplicates_returns_negative_ids() { $twofaccount = TwoFAccount::factory()->for($this->user)->create([ @@ -643,9 +599,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_migrate_identify_duplicates_in_authenticated_user_twofaccounts_only() { $twofaccount = TwoFAccount::factory()->for($this->anotherUser)->create([ @@ -689,9 +643,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_migrate_invalid_gauth_payload_returns_bad_request() { $response = $this->actingAs($this->user, 'api-guard') @@ -704,9 +656,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_migrate_valid_aegis_json_file_returns_success() { $file = LocalFile::fake()->validAegisJsonFile(); @@ -754,9 +704,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] #[DataProvider('invalidAegisJsonFileProvider')] public function test_migrate_invalid_aegis_json_file_returns_bad_request($file) { @@ -783,9 +731,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('validPlainTextFileProvider')] public function test_migrate_valid_plain_text_file_returns_success($file) { @@ -847,9 +793,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('invalidPlainTextFileProvider')] public function test_migrate_invalid_plain_text_file_returns_bad_request($file) { @@ -882,9 +826,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] public function test_reorder_returns_success() { $response = $this->actingAs($this->user, 'api-guard') @@ -897,9 +839,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_reorder_with_invalid_data_returns_validation_error() { $response = $this->actingAs($this->user, 'api-guard') @@ -909,9 +849,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_reorder_twofaccounts_of_another_user_is_forbidden() { $response = $this->actingAs($this->user, 'api-guard') @@ -924,9 +862,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_preview_returns_success_with_resource() { $response = $this->actingAs($this->user, 'api-guard') @@ -937,9 +873,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertJsonFragment(self::JSON_FRAGMENTS_FOR_CUSTOM_TOTP); } - /** - * @test - */ + #[Test] public function test_preview_with_invalid_data_returns_validation_error() { $response = $this->actingAs($this->user, 'api-guard') @@ -949,9 +883,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_preview_with_unreachable_image_returns_success() { $response = $this->actingAs($this->user, 'api-guard') @@ -964,9 +896,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_export_returns_json_migration_resource() { $this->twofaccountA = TwoFAccount::factory()->for($this->user)->create(self::JSON_FRAGMENTS_FOR_DEFAULT_TOTP); @@ -980,9 +910,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertJsonFragment(self::JSON_FRAGMENTS_FOR_DEFAULT_HOTP); } - /** - * @test - */ + #[Test] public function test_export_too_many_ids_returns_bad_request() { TwoFAccount::factory()->count(102)->for($this->user)->create(); @@ -998,9 +926,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_export_missing_twofaccount_returns_existing_ones_only() { $this->twofaccountA = TwoFAccount::factory()->for($this->user)->create(self::JSON_FRAGMENTS_FOR_DEFAULT_TOTP); @@ -1010,9 +936,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertJsonFragment(self::JSON_FRAGMENTS_FOR_DEFAULT_TOTP); } - /** - * @test - */ + #[Test] public function test_export_twofaccount_of_another_user_is_forbidden() { $response = $this->actingAs($this->user, 'api-guard') @@ -1023,9 +947,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_otp_using_totp_twofaccount_id_returns_consistent_resource() { $twofaccount = TwoFAccount::factory()->for($this->user)->create([ @@ -1050,9 +972,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_otp_by_posting_totp_uri_returns_consistent_resource() { $response = $this->actingAs($this->user, 'api-guard') @@ -1067,9 +987,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_otp_by_posting_totp_parameters_returns_consistent_resource() { $response = $this->actingAs($this->user, 'api-guard') @@ -1082,9 +1000,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_otp_using_hotp_twofaccount_id_returns_consistent_resource() { $twofaccount = TwoFAccount::factory()->for($this->user)->create([ @@ -1109,9 +1025,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_otp_by_posting_hotp_uri_returns_consistent_resource() { $response = $this->actingAs($this->user, 'api-guard') @@ -1126,9 +1040,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_otp_by_posting_hotp_parameters_returns_consistent_resource() { $response = $this->actingAs($this->user, 'api-guard') @@ -1141,9 +1053,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_otp_by_posting_multiple_inputs_returns_bad_request() { $response = $this->actingAs($this->user, 'api-guard') @@ -1158,9 +1068,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_otp_using_indecipherable_twofaccount_id_returns_bad_request() { Settings::set('useEncryption', true); @@ -1181,9 +1089,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_otp_using_missing_twofaccount_id_returns_not_found() { $response = $this->actingAs($this->user, 'api-guard') @@ -1191,9 +1097,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertNotFound(); } - /** - * @test - */ + #[Test] public function test_get_otp_by_posting_invalid_uri_returns_validation_error() { $response = $this->actingAs($this->user, 'api-guard') @@ -1203,9 +1107,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_get_otp_by_posting_invalid_parameters_returns_validation_error() { $response = $this->actingAs($this->user, 'api-guard') @@ -1213,9 +1115,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_get_otp_of_another_user_twofaccount_is_forbidden() { $response = $this->actingAs($this->user, 'api-guard') @@ -1226,9 +1126,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_count_returns_right_number_of_twofaccounts() { $response = $this->actingAs($this->user, 'api-guard') @@ -1239,9 +1137,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_withdraw_returns_success() { $response = $this->actingAs($this->user, 'api-guard') @@ -1252,9 +1148,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_withdraw_too_many_ids_returns_bad_request() { TwoFAccount::factory()->count(102)->for($this->user)->create(); @@ -1270,9 +1164,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_destroy_twofaccount_returns_success() { $response = $this->actingAs($this->user, 'api-guard') @@ -1280,9 +1172,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertNoContent(); } - /** - * @test - */ + #[Test] public function test_destroy_missing_twofaccount_returns_not_found() { $response = $this->actingAs($this->user, 'api-guard') @@ -1290,9 +1180,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertNotFound(); } - /** - * @test - */ + #[Test] public function test_destroy_twofaccount_of_another_user_is_forbidden() { $response = $this->actingAs($this->user, 'api-guard') @@ -1303,9 +1191,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_batch_destroy_twofaccount_returns_success() { TwoFAccount::factory()->count(3)->for($this->user)->create(); @@ -1315,9 +1201,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ->assertNoContent(); } - /** - * @test - */ + #[Test] public function test_batch_destroy_too_many_twofaccounts_returns_bad_request() { TwoFAccount::factory()->count(102)->for($this->user)->create(); @@ -1333,9 +1217,7 @@ class TwoFAccountControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_batch_destroy_twofaccount_of_another_user_is_forbidden() { TwoFAccount::factory()->count(2)->for($this->anotherUser)->create(); diff --git a/tests/Api/v1/Controllers/UserManagerControllerTest.php b/tests/Api/v1/Controllers/UserManagerControllerTest.php index d6c0ce08..1566c34c 100644 --- a/tests/Api/v1/Controllers/UserManagerControllerTest.php +++ b/tests/Api/v1/Controllers/UserManagerControllerTest.php @@ -13,6 +13,7 @@ use Illuminate\Auth\Notifications\ResetPassword; use Illuminate\Http\Request; use Illuminate\Support\Arr; use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Notification; @@ -23,6 +24,7 @@ use Laravel\Passport\TokenRepository; use Mockery\MockInterface; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; #[CoversClass(UserManagerController::class)] @@ -51,9 +53,6 @@ class UserManagerControllerTest extends FeatureTestCase private const PASSWORD = 'password'; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -68,9 +67,7 @@ class UserManagerControllerTest extends FeatureTestCase } } - /** - * @test - */ + #[Test] public function test_all_controller_routes_are_protected_by_admin_middleware() { $routes = Route::getRoutes()->getRoutes(); @@ -86,9 +83,7 @@ class UserManagerControllerTest extends FeatureTestCase } } - /** - * @test - */ + #[Test] public function test_index_returns_all_users_with_expected_UserManagerResources() : void { $response = $this->actingAs($this->admin, 'api-guard') @@ -129,9 +124,7 @@ class UserManagerControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_show_returns_the_expected_UserManagerResource() : void { $this->actingAs($this->admin, 'api-guard') @@ -145,8 +138,8 @@ class UserManagerControllerTest extends FeatureTestCase 'preferences' => $this->defaultPreferences, 'is_admin' => false, 'twofaccounts_count' => 0, - 'last_seen_at' => '1 second ago', - 'created_at' => '1 second ago', + 'last_seen_at' => '0 seconds ago', + 'created_at' => '0 seconds ago', ], 'password_reset' => null, 'valid_personal_access_tokens' => 0, @@ -154,9 +147,7 @@ class UserManagerControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_resetPassword_resets_password_and_sends_password_reset_to_user() { Notification::fake(); @@ -180,9 +171,7 @@ class UserManagerControllerTest extends FeatureTestCase }); } - /** - * @test - */ + #[Test] public function test_resetPassword_returns_UserManagerResource() { Notification::fake(); @@ -198,9 +187,7 @@ class UserManagerControllerTest extends FeatureTestCase $response->assertExactJson($resources->response($request)->getData(true)); } - /** - * @test - */ + #[Test] public function test_resetPassword_does_not_notify_when_reset_failed_and_returns_error() { Notification::fake(); @@ -227,9 +214,7 @@ class UserManagerControllerTest extends FeatureTestCase Notification::assertNothingSent(); } - /** - * @test - */ + #[Test] public function test_resetPassword_returns_error_when_notify_send_failed() { Notification::fake(); @@ -258,9 +243,7 @@ class UserManagerControllerTest extends FeatureTestCase Notification::assertNothingSent(); } - /** - * @test - */ + #[Test] public function test_store_creates_the_user_and_returns_success() { $this->actingAs($this->admin, 'api-guard') @@ -279,9 +262,7 @@ class UserManagerControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_store_returns_UserManagerResource_of_created_user() : void { $path = '/api/v1/users'; @@ -299,9 +280,7 @@ class UserManagerControllerTest extends FeatureTestCase $response->assertExactJson($resource->response($request)->getData(true)); } - /** - * @test - */ + #[Test] public function test_store_returns_UserManagerResource_of_created_admin() : void { $path = '/api/v1/users'; @@ -320,11 +299,14 @@ class UserManagerControllerTest extends FeatureTestCase $response->assertExactJson($resource->response($request)->getData(true)); } - /** - * @test - */ + #[Test] public function test_revokePATs_flushes_pats() { + Artisan::call('passport:install', [ + '--verbose' => 2, + '--no-interaction' => 1 + ]); + $tokenRepository = app(TokenRepository::class); $this->actingAs($this->user, 'api-guard') @@ -344,9 +326,7 @@ class UserManagerControllerTest extends FeatureTestCase $this->assertCount(0, $tokens); } - /** - * @test - */ + #[Test] public function test_revokePATs_returns_no_content() { $this->actingAs($this->admin, 'api-guard') @@ -354,9 +334,7 @@ class UserManagerControllerTest extends FeatureTestCase ->assertNoContent(); } - /** - * @test - */ + #[Test] public function test_revokePATs_always_returns_no_content() { // a fresh user has no token @@ -367,9 +345,7 @@ class UserManagerControllerTest extends FeatureTestCase ->assertNoContent(); } - /** - * @test - */ + #[Test] public function test_revokeWebauthnCredentials_flushes_credentials() { DB::table('webauthn_credentials')->insert([ @@ -395,9 +371,7 @@ class UserManagerControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_revokeWebauthnCredentials_returns_no_content() { DB::table('webauthn_credentials')->insert([ @@ -420,9 +394,7 @@ class UserManagerControllerTest extends FeatureTestCase ->assertNoContent(); } - /** - * @test - */ + #[Test] public function test_revokeWebauthnCredentials_always_returns_no_content() { DB::table('webauthn_credentials')->delete(); @@ -432,9 +404,7 @@ class UserManagerControllerTest extends FeatureTestCase ->assertNoContent(); } - /** - * @test - */ + #[Test] public function test_revokeWebauthnCredentials_resets_useWebauthnOnly_user_preference() { $this->user['preferences->useWebauthnOnly'] = true; @@ -449,9 +419,7 @@ class UserManagerControllerTest extends FeatureTestCase $this->assertFalse($this->user->preferences['useWebauthnOnly']); } - /** - * @test - */ + #[Test] public function test_destroy_returns_no_content() { $user = User::factory()->create(); @@ -461,9 +429,7 @@ class UserManagerControllerTest extends FeatureTestCase ->assertNoContent(); } - /** - * @test - */ + #[Test] public function test_destroy_the_only_admin_returns_forbidden() { $this->actingAs($this->admin, 'api-guard') @@ -471,9 +437,7 @@ class UserManagerControllerTest extends FeatureTestCase ->assertForbidden(); } - /** - * @test - */ + #[Test] public function test_promote_changes_admin_status() : void { $this->actingAs($this->admin, 'api-guard') @@ -487,9 +451,7 @@ class UserManagerControllerTest extends FeatureTestCase $this->assertTrue($this->user->isAdministrator()); } - /** - * @test - */ + #[Test] public function test_promote_returns_UserManagerResource() : void { $path = '/api/v1/users/' . $this->user->id . '/promote'; @@ -506,9 +468,7 @@ class UserManagerControllerTest extends FeatureTestCase $response->assertExactJson($resources->response($request)->getData(true)); } - /** - * @test - */ + #[Test] public function test_demote_returns_UserManagerResource() : void { $anotherAdmin = User::factory()->administrator()->create(); @@ -527,9 +487,7 @@ class UserManagerControllerTest extends FeatureTestCase $response->assertExactJson($resources->response($request)->getData(true)); } - /** - * @test - */ + #[Test] public function test_demote_the_only_admin_returns_forbidden() : void { $this->assertTrue(User::admins()->count() == 1); @@ -541,9 +499,7 @@ class UserManagerControllerTest extends FeatureTestCase ->assertForbidden(); } - /** - * @test - */ + #[Test] public function test_authentications_returns_all_preserved_entries() : void { AuthLog::factory()->for($this->user, 'authenticatable')->duringLastYear()->create(); @@ -560,9 +516,7 @@ class UserManagerControllerTest extends FeatureTestCase ->assertJsonCount(7); } - /** - * @test - */ + #[Test] public function test_authentications_does_not_return_old_entries() : void { AuthLog::factory()->for($this->user, 'authenticatable')->beforeLastYear()->create(); @@ -573,9 +527,7 @@ class UserManagerControllerTest extends FeatureTestCase ->assertJsonCount(0); } - /** - * @test - */ + #[Test] public function test_authentications_returns_user_entries_only() : void { AuthLog::factory()->for($this->admin, 'authenticatable')->create(); @@ -588,9 +540,7 @@ class UserManagerControllerTest extends FeatureTestCase $this->assertEquals($response->getData()[0]->id, $this->user->id); } - /** - * @test - */ + #[Test] public function test_authentications_returns_expected_resource() : void { AuthLog::factory()->for($this->user, 'authenticatable')->create(); @@ -614,9 +564,7 @@ class UserManagerControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_authentications_returns_resource_with_timezoned_dates() : void { $timezone = 'Europe/Paris'; @@ -643,9 +591,7 @@ class UserManagerControllerTest extends FeatureTestCase $this->assertTrue($logout_at->isSameMinute($timezonedNow)); } - /** - * @test - */ + #[Test] public function test_authentications_returns_loginless_entries() : void { $this->logUserOut(); @@ -658,9 +604,7 @@ class UserManagerControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_authentications_returns_logoutless_entries() : void { $this->logUserIn(); @@ -673,9 +617,7 @@ class UserManagerControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_authentications_returns_failed_entry() : void { $this->json('POST', '/user/login', [ @@ -691,9 +633,7 @@ class UserManagerControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_authentications_returns_last_month_entries() : void { $this->travel(-2)->months(); @@ -708,9 +648,7 @@ class UserManagerControllerTest extends FeatureTestCase $this->assertTrue(Carbon::parse($response->getData()[0]->login_at)->isSameDay(now())); } - /** - * @test - */ + #[Test] public function test_authentications_returns_last_three_months_entries() : void { $this->travel(-100)->days(); @@ -727,9 +665,7 @@ class UserManagerControllerTest extends FeatureTestCase $this->assertTrue(Carbon::parse($response->getData()[0]->login_at)->isSameDay(now()->subDays(80))); } - /** - * @test - */ + #[Test] public function test_authentications_returns_last_six_months_entries() : void { $this->travel(-7)->months(); @@ -746,9 +682,7 @@ class UserManagerControllerTest extends FeatureTestCase $this->assertTrue(Carbon::parse($response->getData()[0]->login_at)->isSameDay(now()->subMonths(5))); } - /** - * @test - */ + #[Test] public function test_authentications_returns_last_year_entries() : void { $this->travel(-13)->months(); @@ -765,9 +699,7 @@ class UserManagerControllerTest extends FeatureTestCase $this->assertTrue(Carbon::parse($response->getData()[0]->login_at)->isSameDay(now()->subMonths(11))); } - /** - * @test - */ + #[Test] #[DataProvider('LimitProvider')] public function test_authentications_returns_limited_entries($limit) : void { @@ -795,9 +727,7 @@ class UserManagerControllerTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] public function test_authentications_returns_expected_ip_and_useragent_chunks() : void { AuthLog::factory()->for($this->user, 'authenticatable')->create([ @@ -815,9 +745,7 @@ class UserManagerControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] #[DataProvider('invalidQueryParameterProvider')] public function test_authentications_with_invalid_limit_returns_validation_error($limit) : void { @@ -826,9 +754,7 @@ class UserManagerControllerTest extends FeatureTestCase ->assertInvalid(['limit']); } - /** - * @test - */ + #[Test] #[DataProvider('invalidQueryParameterProvider')] public function test_authentications_with_invalid_period_returns_validation_error($period) : void { diff --git a/tests/Api/v1/Requests/GroupAssignRequestTest.php b/tests/Api/v1/Requests/GroupAssignRequestTest.php index c5db52f1..9af2d8d5 100644 --- a/tests/Api/v1/Requests/GroupAssignRequestTest.php +++ b/tests/Api/v1/Requests/GroupAssignRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -18,9 +19,7 @@ class GroupAssignRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -32,9 +31,7 @@ class GroupAssignRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -58,9 +55,7 @@ class GroupAssignRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/Requests/GroupStoreRequestTest.php b/tests/Api/v1/Requests/GroupStoreRequestTest.php index 38114a40..450baf88 100644 --- a/tests/Api/v1/Requests/GroupStoreRequestTest.php +++ b/tests/Api/v1/Requests/GroupStoreRequestTest.php @@ -11,6 +11,7 @@ use Illuminate\Support\Facades\Validator; use Mockery; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -28,9 +29,6 @@ class GroupStoreRequestTest extends FeatureTestCase const UNIQUE_GROUP_NAME = 'MyGroup'; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -38,9 +36,7 @@ class GroupStoreRequestTest extends FeatureTestCase $this->user = User::factory()->create(); } - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -52,9 +48,7 @@ class GroupStoreRequestTest extends FeatureTestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -79,9 +73,7 @@ class GroupStoreRequestTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/Requests/QrCodeDecodeRequestTest.php b/tests/Api/v1/Requests/QrCodeDecodeRequestTest.php index e419141a..fb9dfddc 100644 --- a/tests/Api/v1/Requests/QrCodeDecodeRequestTest.php +++ b/tests/Api/v1/Requests/QrCodeDecodeRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\Classes\LocalFile; use Tests\TestCase; @@ -19,9 +20,7 @@ class QrCodeDecodeRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -33,9 +32,7 @@ class QrCodeDecodeRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -59,9 +56,7 @@ class QrCodeDecodeRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/Requests/SettingStoreRequestTest.php b/tests/Api/v1/Requests/SettingStoreRequestTest.php index 133c069b..957ba178 100644 --- a/tests/Api/v1/Requests/SettingStoreRequestTest.php +++ b/tests/Api/v1/Requests/SettingStoreRequestTest.php @@ -9,6 +9,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -21,9 +22,7 @@ class SettingStoreRequestTest extends FeatureTestCase const UNIQUE_KEY = 'UniqueKey'; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -35,9 +34,7 @@ class SettingStoreRequestTest extends FeatureTestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -68,9 +65,7 @@ class SettingStoreRequestTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/Requests/SettingUpdateRequestTest.php b/tests/Api/v1/Requests/SettingUpdateRequestTest.php index 154ef945..6b07fe2e 100644 --- a/tests/Api/v1/Requests/SettingUpdateRequestTest.php +++ b/tests/Api/v1/Requests/SettingUpdateRequestTest.php @@ -9,6 +9,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -19,9 +20,7 @@ class SettingUpdateRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -33,9 +32,7 @@ class SettingUpdateRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -63,9 +60,7 @@ class SettingUpdateRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/Requests/TwoFAccountBatchRequestTest.php b/tests/Api/v1/Requests/TwoFAccountBatchRequestTest.php index 42aea008..a6b708d9 100644 --- a/tests/Api/v1/Requests/TwoFAccountBatchRequestTest.php +++ b/tests/Api/v1/Requests/TwoFAccountBatchRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -18,9 +19,7 @@ class TwoFAccountBatchRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -32,9 +31,7 @@ class TwoFAccountBatchRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -59,9 +56,7 @@ class TwoFAccountBatchRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/Requests/TwoFAccountDynamicRequestTest.php b/tests/Api/v1/Requests/TwoFAccountDynamicRequestTest.php index 0c8e71b1..d88d5bb8 100644 --- a/tests/Api/v1/Requests/TwoFAccountDynamicRequestTest.php +++ b/tests/Api/v1/Requests/TwoFAccountDynamicRequestTest.php @@ -8,6 +8,7 @@ use App\Api\v1\Requests\TwoFAccountUriRequest; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Support\Facades\Auth; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -18,9 +19,7 @@ class TwoFAccountDynamicRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -32,9 +31,7 @@ class TwoFAccountDynamicRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] public function test_returns_TwoFAccountUriRequest_rules_when_has_uri_input() { $twofaccountUriRequest = new TwoFAccountUriRequest(); @@ -44,9 +41,7 @@ class TwoFAccountDynamicRequestTest extends TestCase $this->assertEquals($twofaccountUriRequest->rules(), $request->rules()); } - /** - * @test - */ + #[Test] public function test_returns_TwoFAccountStoreRequest_rules_otherwise() { $twofaccountStoreRequest = new TwoFAccountStoreRequest(); diff --git a/tests/Api/v1/Requests/TwoFAccountImportRequestTest.php b/tests/Api/v1/Requests/TwoFAccountImportRequestTest.php index 3113b13a..d3adaf1f 100644 --- a/tests/Api/v1/Requests/TwoFAccountImportRequestTest.php +++ b/tests/Api/v1/Requests/TwoFAccountImportRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -18,9 +19,7 @@ class TwoFAccountImportRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -32,9 +31,7 @@ class TwoFAccountImportRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -56,9 +53,7 @@ class TwoFAccountImportRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/Requests/TwoFAccountReorderRequestTest.php b/tests/Api/v1/Requests/TwoFAccountReorderRequestTest.php index a7576b45..71220191 100644 --- a/tests/Api/v1/Requests/TwoFAccountReorderRequestTest.php +++ b/tests/Api/v1/Requests/TwoFAccountReorderRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -18,9 +19,7 @@ class TwoFAccountReorderRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -32,9 +31,7 @@ class TwoFAccountReorderRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -59,9 +56,7 @@ class TwoFAccountReorderRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/Requests/TwoFAccountStoreRequestTest.php b/tests/Api/v1/Requests/TwoFAccountStoreRequestTest.php index f18ba23e..0f986c14 100644 --- a/tests/Api/v1/Requests/TwoFAccountStoreRequestTest.php +++ b/tests/Api/v1/Requests/TwoFAccountStoreRequestTest.php @@ -9,6 +9,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -20,9 +21,7 @@ class TwoFAccountStoreRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -34,9 +33,7 @@ class TwoFAccountStoreRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -110,9 +107,7 @@ class TwoFAccountStoreRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/Requests/TwoFAccountUpdateRequestTest.php b/tests/Api/v1/Requests/TwoFAccountUpdateRequestTest.php index ee2bc468..0ef2224a 100644 --- a/tests/Api/v1/Requests/TwoFAccountUpdateRequestTest.php +++ b/tests/Api/v1/Requests/TwoFAccountUpdateRequestTest.php @@ -9,6 +9,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -20,9 +21,7 @@ class TwoFAccountUpdateRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -34,9 +33,7 @@ class TwoFAccountUpdateRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -86,9 +83,7 @@ class TwoFAccountUpdateRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/Requests/TwoFAccountUriRequestTest.php b/tests/Api/v1/Requests/TwoFAccountUriRequestTest.php index 3f480215..57aba71b 100644 --- a/tests/Api/v1/Requests/TwoFAccountUriRequestTest.php +++ b/tests/Api/v1/Requests/TwoFAccountUriRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -18,9 +19,7 @@ class TwoFAccountUriRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -32,9 +31,7 @@ class TwoFAccountUriRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -63,9 +60,7 @@ class TwoFAccountUriRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Api/v1/ThrottlingTest.php b/tests/Api/v1/ThrottlingTest.php index 507a98e2..8ca8f3ac 100644 --- a/tests/Api/v1/ThrottlingTest.php +++ b/tests/Api/v1/ThrottlingTest.php @@ -6,6 +6,7 @@ use App\Models\User; use App\Providers\RouteServiceProvider; use Illuminate\Support\Facades\Config; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -14,9 +15,7 @@ use Tests\FeatureTestCase; #[CoversClass(RouteServiceProvider::class)] class ThrottlingTest extends FeatureTestCase { - /** - * @test - */ + #[Test] public function test_api_calls_are_throttled_using_config() { /** diff --git a/tests/Feature/Console/CheckDbConnectionTest.php b/tests/Feature/Console/CheckDbConnectionTest.php index 16497215..fb5da0c5 100644 --- a/tests/Feature/Console/CheckDbConnectionTest.php +++ b/tests/Feature/Console/CheckDbConnectionTest.php @@ -5,6 +5,7 @@ namespace Tests\Feature\Console; use App\Console\Commands\CheckDbConnection; use Illuminate\Support\Facades\DB; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -13,18 +14,14 @@ use Tests\FeatureTestCase; #[CoversClass(CheckDbConnection::class)] class CheckDbConnectionTest extends FeatureTestCase { - /** - * @test - */ + #[Test] public function test_CheckDbConnection_ends_successfully() { $this->artisan('2fauth:check-db-connection') ->assertExitCode(1); } - /** - * @test - */ + // #[Test] // public function test_CheckDbConnection_without_db_returns_false() // { // DB::shouldReceive('connection', 'getPDO') diff --git a/tests/Feature/Console/InstallTest.php b/tests/Feature/Console/InstallTest.php index bef79823..7cfc7886 100644 --- a/tests/Feature/Console/InstallTest.php +++ b/tests/Feature/Console/InstallTest.php @@ -3,8 +3,10 @@ namespace Tests\Feature\Console; use App\Console\Commands\Install; +use Illuminate\Support\Facades\Artisan; use Jackiedo\DotenvEditor\DotenvEditor; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -13,30 +15,37 @@ use Tests\FeatureTestCase; #[CoversClass(Install::class)] class InstallTest extends FeatureTestCase { - /** - * @test - */ + const PASSPORT_PENDING_MIGRATIONS_CONFIRMATION = 'Would you like to run all pending database migrations?'; + + const PASSPORT_CREATE_CLIENTS_CONFIRMATION = 'Would you like to create the "personal access" and "password grant" clients?'; + + const TWOFAUTH_REVIEW_ENV_VAR_CONFIRMATION = 'Existing .env file found. Do you wish to review its vars?'; + + #[Test] public function test_install_completes() { $this->artisan('2fauth:install') - ->expectsConfirmation('Existing .env file found. Do you wish to review its vars?', 'no') + ->expectsConfirmation(self::TWOFAUTH_REVIEW_ENV_VAR_CONFIRMATION, 'no') + // 2 following confirmations have been introduced with Passport v12 and its auto-publishing + // migrations feature. Even if the '2fauth:install' command runs 'passport:install' + // silently, the 2 confirmations are triggered and needs to be handled in tests. + ->expectsConfirmation(self::PASSPORT_PENDING_MIGRATIONS_CONFIRMATION, 'yes') + ->expectsConfirmation(self::PASSPORT_CREATE_CLIENTS_CONFIRMATION, 'yes') ->assertSuccessful(); } - /** - * @test - */ + #[Test] public function test_install_informs_about_no_interaction() { $this->artisan('2fauth:install', ['--no-interaction' => true]) ->expectsOutput('(Running in no-interaction mode)') - ->expectsConfirmation('Existing .env file found. Do you wish to review its vars?', 'no') + ->expectsConfirmation(self::TWOFAUTH_REVIEW_ENV_VAR_CONFIRMATION, 'no') + ->expectsConfirmation(self::PASSPORT_PENDING_MIGRATIONS_CONFIRMATION, 'yes') + ->expectsConfirmation(self::PASSPORT_CREATE_CLIENTS_CONFIRMATION, 'yes') ->assertSuccessful(); } - /** - * @test - */ + #[Test] public function test_install_generates_an_app_key() { config(['app.key' => '']); @@ -44,38 +53,38 @@ class InstallTest extends FeatureTestCase $this->assertEquals('', config('app.key')); $this->artisan('2fauth:install') - ->expectsConfirmation('Existing .env file found. Do you wish to review its vars?', 'no') + ->expectsConfirmation(self::TWOFAUTH_REVIEW_ENV_VAR_CONFIRMATION, 'no') + ->expectsConfirmation(self::PASSPORT_PENDING_MIGRATIONS_CONFIRMATION, 'yes') + ->expectsConfirmation(self::PASSPORT_CREATE_CLIENTS_CONFIRMATION, 'yes') ->assertSuccessful(); $this->assertNotEquals('', config('app.key')); } - /** - * @test - */ + #[Test] public function test_install_gives_2fauth_address() { $this->artisan('2fauth:install') - ->expectsConfirmation('Existing .env file found. Do you wish to review its vars?', 'no') + ->expectsConfirmation(self::TWOFAUTH_REVIEW_ENV_VAR_CONFIRMATION, 'no') + ->expectsConfirmation(self::PASSPORT_PENDING_MIGRATIONS_CONFIRMATION, 'yes') + ->expectsConfirmation(self::PASSPORT_CREATE_CLIENTS_CONFIRMATION, 'yes') ->expectsOutputToContain(config('app.url')) ->assertSuccessful(); } - /** - * @test - */ + #[Test] public function test_install_informs_about_sponsoring() { $this->artisan('2fauth:install') - ->expectsConfirmation('Existing .env file found. Do you wish to review its vars?', 'no') + ->expectsConfirmation(self::TWOFAUTH_REVIEW_ENV_VAR_CONFIRMATION, 'no') + ->expectsConfirmation(self::PASSPORT_PENDING_MIGRATIONS_CONFIRMATION, 'yes') + ->expectsConfirmation(self::PASSPORT_CREATE_CLIENTS_CONFIRMATION, 'yes') ->expectsOutputToContain('https://ko-fi.com/bubka') ->expectsOutputToContain('https://github.com/sponsors/Bubka') ->assertSuccessful(); } - /** - * @test - */ + #[Test] public function test_install_fails_with_exception_message() { $mock = $this->mock(DotenvEditor::class); @@ -87,9 +96,7 @@ class InstallTest extends FeatureTestCase ->assertFailed(); } - /** - * @test - */ + #[Test] public function test_install_fails_with_link_to_online_help() { $mock = $this->mock(DotenvEditor::class); diff --git a/tests/Feature/Console/PurgeLogTest.php b/tests/Feature/Console/PurgeLogTest.php index 96ecfc4b..e72ed5cf 100644 --- a/tests/Feature/Console/PurgeLogTest.php +++ b/tests/Feature/Console/PurgeLogTest.php @@ -6,6 +6,7 @@ use App\Models\AuthLog; use App\Models\User; use Illuminate\Support\Carbon; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; class PurgeLogTest extends FeatureTestCase @@ -15,9 +16,6 @@ class PurgeLogTest extends FeatureTestCase */ protected $user; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -25,18 +23,14 @@ class PurgeLogTest extends FeatureTestCase $this->user = User::factory()->create(); } - /** - * @test - */ + #[Test] public function test_purgeLog_completes() { $this->artisan('2fauth:purge-log') ->assertSuccessful(); } - /** - * @test - */ + #[Test] public function test_purgeLog_defaults_to_one_year() { $oneYearOldLog = AuthLog::factory()->daysAgo(366)->for($this->user, 'authenticatable')->create(); @@ -52,9 +46,7 @@ class PurgeLogTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_purgeLog_deletes_records_older_than_retention_time() { $retention = 180; @@ -68,9 +60,7 @@ class PurgeLogTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_purgeLog_deletes_logout_only_records_older_than_retention_time() { $retention = 180; @@ -85,9 +75,7 @@ class PurgeLogTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_purgeLog_does_not_delete_records_younger_than_retention_time() { $retention = 180; @@ -101,9 +89,7 @@ class PurgeLogTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidConfig')] public function test_purgeLog_with_invalid_config_defaults_to_one_year($config) { diff --git a/tests/Feature/Console/ResetDemoTest.php b/tests/Feature/Console/ResetDemoTest.php index ca727b0d..96434ac6 100644 --- a/tests/Feature/Console/ResetDemoTest.php +++ b/tests/Feature/Console/ResetDemoTest.php @@ -2,14 +2,14 @@ namespace Tests\Feature\Console; +use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Config; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; class ResetDemoTest extends FeatureTestCase { - /** - * @test - */ + #[Test] public function test_reset_demo_without_demo_mode_succeeded() { $this->artisan('2fauth:reset-demo') @@ -17,11 +17,14 @@ class ResetDemoTest extends FeatureTestCase ->assertSuccessful(); } - /** - * @test - */ + #[Test] public function test_reset_demo_succeeded() { + Artisan::call('passport:install', [ + '--verbose' => 2, + '--no-interaction' => 1 + ]); + Config::set('2fauth.config.isDemoApp', true); $this->artisan('2fauth:reset-demo') @@ -132,9 +135,7 @@ class ResetDemoTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_reset_demo_with_invalid_confirmation_succeeded() { Config::set('2fauth.config.isDemoApp', true); @@ -145,9 +146,7 @@ class ResetDemoTest extends FeatureTestCase ->assertSuccessful(); } - /** - * @test - */ + #[Test] public function test_reset_demo_with_no_confirm_option_succeeded() { Config::set('2fauth.config.isDemoApp', true); diff --git a/tests/Feature/Console/ResetTestingTest.php b/tests/Feature/Console/ResetTestingTest.php index 0509d3d3..2103857e 100644 --- a/tests/Feature/Console/ResetTestingTest.php +++ b/tests/Feature/Console/ResetTestingTest.php @@ -3,13 +3,12 @@ namespace Tests\Feature\Console; use Illuminate\Support\Facades\Config; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; class ResetTestingTest extends FeatureTestCase { - /** - * @test - */ + #[Test] public function test_reset_testing_without_testing_mode_succeeded() { $this->artisan('2fauth:reset-testing') @@ -17,9 +16,7 @@ class ResetTestingTest extends FeatureTestCase ->assertSuccessful(); } - /** - * @test - */ + #[Test] public function test_reset_testing_succeeded() { Config::set('2fauth.config.isTestingApp', true); @@ -132,9 +129,7 @@ class ResetTestingTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_reset_testing_with_invalid_confirmation_succeeded() { Config::set('2fauth.config.isTestingApp', true); @@ -145,9 +140,7 @@ class ResetTestingTest extends FeatureTestCase ->assertSuccessful(); } - /** - * @test - */ + #[Test] public function test_reset_testing_with_no_confirm_option_succeeded() { Config::set('2fauth.config.isTestingApp', true); diff --git a/tests/Feature/Extensions/RemoteUserProviderTest.php b/tests/Feature/Extensions/RemoteUserProviderTest.php index cb69dc39..ed0cae11 100644 --- a/tests/Feature/Extensions/RemoteUserProviderTest.php +++ b/tests/Feature/Extensions/RemoteUserProviderTest.php @@ -7,6 +7,7 @@ use App\Models\User; use App\Services\Auth\ReverseProxyGuard; use Illuminate\Support\Facades\Config; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -37,9 +38,7 @@ class RemoteUserProviderTest extends FeatureTestCase $this->assertEquals($dbUser->id, $user->id); } - /** - * @test - */ + #[Test] public function test_user_is_set_from_proxy_headers() { Config::set('auth.auth_proxy_headers.user', 'HTTP_REMOTE_USER'); @@ -61,9 +60,7 @@ class RemoteUserProviderTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_user_is_set_from_proxy_headers_with_an_email() { Config::set('auth.auth_proxy_headers.user', 'HTTP_REMOTE_USER'); @@ -87,9 +84,7 @@ class RemoteUserProviderTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_user_is_set_from_proxy_headers_even_if_name_is_long() { Config::set('auth.auth_proxy_headers.user', 'HTTP_REMOTE_USER'); @@ -116,9 +111,7 @@ class RemoteUserProviderTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_user_is_not_set_from_proxy_headers_when_name_is_missing() { Config::set('auth.auth_proxy_headers.user', 'HTTP_REMOTE_USER'); @@ -137,9 +130,7 @@ class RemoteUserProviderTest extends FeatureTestCase $this->assertDatabaseCount('users', 0); } - /** - * @test - */ + #[Test] public function test_user_email_is_synced_with_email_from_proxy_headers() { Config::set('auth.auth_proxy_headers.user', 'HTTP_REMOTE_USER'); @@ -164,9 +155,7 @@ class RemoteUserProviderTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_user_email_is_not_synced_when_email_from_proxy_headers_is_missing() { Config::set('auth.auth_proxy_headers.user', 'HTTP_REMOTE_USER'); @@ -191,9 +180,7 @@ class RemoteUserProviderTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_user_email_is_not_synced_when_email_from_proxy_headers_is_invalid() { Config::set('auth.auth_proxy_headers.user', 'HTTP_REMOTE_USER'); @@ -218,9 +205,7 @@ class RemoteUserProviderTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_user_email_is_not_sync_when_email_from_proxy_headers_is_already_in_use() { Config::set('auth.auth_proxy_headers.user', 'HTTP_REMOTE_USER'); diff --git a/tests/Feature/Http/Auth/ForgotPasswordControllerTest.php b/tests/Feature/Http/Auth/ForgotPasswordControllerTest.php index ec86057a..339e94a7 100644 --- a/tests/Feature/Http/Auth/ForgotPasswordControllerTest.php +++ b/tests/Feature/Http/Auth/ForgotPasswordControllerTest.php @@ -11,6 +11,7 @@ use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Notification; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -27,9 +28,7 @@ class ForgotPasswordControllerTest extends FeatureTestCase */ protected $user; - /** - * @test - */ + #[Test] public function test_submit_email_password_request_without_email_returns_validation_error() { $response = $this->json('POST', '/user/password/lost', [ @@ -40,9 +39,7 @@ class ForgotPasswordControllerTest extends FeatureTestCase ->assertJsonValidationErrors(['email']); } - /** - * @test - */ + #[Test] public function test_submit_email_password_request_with_invalid_email_returns_validation_error() { $response = $this->json('POST', '/user/password/lost', [ @@ -53,9 +50,7 @@ class ForgotPasswordControllerTest extends FeatureTestCase ->assertJsonValidationErrors(['email']); } - /** - * @test - */ + #[Test] public function test_submit_email_password_request_with_unknown_email_returns_validation_error() { $response = $this->json('POST', '/user/password/lost', [ @@ -66,9 +61,7 @@ class ForgotPasswordControllerTest extends FeatureTestCase ->assertJsonValidationErrors(['email']); } - /** - * @test - */ + #[Test] public function test_submit_email_password_request_returns_success() { Notification::fake(); @@ -89,9 +82,7 @@ class ForgotPasswordControllerTest extends FeatureTestCase }); } - /** - * @test - */ + #[Test] public function test_submit_email_password_request_in_demo_mode_returns_unauthorized() { Config::set('2fauth.config.isDemoApp', true); @@ -103,9 +94,7 @@ class ForgotPasswordControllerTest extends FeatureTestCase $response->assertStatus(401); } - /** - * @test - */ + #[Test] public function test_submit_email_password_request_when_authenticated_returns_bad_request() { /** diff --git a/tests/Feature/Http/Auth/LoginTest.php b/tests/Feature/Http/Auth/LoginTest.php index 35df48c5..348beba9 100644 --- a/tests/Feature/Http/Auth/LoginTest.php +++ b/tests/Feature/Http/Auth/LoginTest.php @@ -2,7 +2,10 @@ namespace Tests\Feature\Http\Auth; +use App\Exceptions\Handler; use App\Http\Controllers\Auth\LoginController; +use App\Http\Middleware\KickOutInactiveUser; +use App\Http\Middleware\LogUserLastSeen; use App\Http\Middleware\RejectIfAuthenticated; use App\Http\Middleware\RejectIfDemoMode; use App\Http\Middleware\RejectIfReverseProxy; @@ -12,10 +15,13 @@ use App\Listeners\Authentication\LoginListener; use App\Models\User; use App\Notifications\FailedLogin; use App\Notifications\SignedInWithNewDevice; +use App\Rules\CaseInsensitiveEmailExists; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Notification; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\CoversMethod; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -25,9 +31,13 @@ use Tests\FeatureTestCase; #[CoversClass(RejectIfAuthenticated::class)] #[CoversClass(RejectIfReverseProxy::class)] #[CoversClass(RejectIfDemoMode::class)] -#[CoversClass(SkipIfAuthenticated::class)] #[CoversClass(LoginListener::class)] #[CoversClass(FailedLoginListener::class)] +#[CoversMethod(CaseInsensitiveEmailExists::class, 'handle')] +#[CoversMethod(SkipIfAuthenticated::class, 'handle')] +#[CoversMethod(Handler::class, 'register')] +#[CoversMethod(KickOutInactiveUser::class, 'handle')] +#[CoversMethod(LogUserLastSeen::class, 'handle')] class LoginTest extends FeatureTestCase { /** @@ -44,9 +54,6 @@ class LoginTest extends FeatureTestCase private const WRONG_PASSWORD = 'wrong_password'; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -55,9 +62,7 @@ class LoginTest extends FeatureTestCase $this->admin = User::factory()->administrator()->create(); } - /** - * @test - */ + #[Test] public function test_user_login_returns_success() { $response = $this->json('POST', '/user/login', [ @@ -77,9 +82,7 @@ class LoginTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_login_send_new_device_notification() { Notification::fake(); @@ -107,9 +110,7 @@ class LoginTest extends FeatureTestCase Notification::assertSentTo($this->user, SignedInWithNewDevice::class); } - /** - * @test - */ + #[Test] public function test_login_does_not_send_new_device_notification() { Notification::fake(); @@ -137,9 +138,7 @@ class LoginTest extends FeatureTestCase Notification::assertNothingSentTo($this->user); } - /** - * @test - */ + #[Test] public function test_admin_login_returns_admin_role() { $response = $this->json('POST', '/user/login', [ @@ -152,11 +151,7 @@ class LoginTest extends FeatureTestCase ]); } - /** - * @test - * - * @covers \App\Rules\CaseInsensitiveEmailExists - */ + #[Test] public function test_user_login_with_uppercased_email_returns_success() { $response = $this->json('POST', '/user/login', [ @@ -175,11 +170,7 @@ class LoginTest extends FeatureTestCase ]); } - /** - * @test - * - * @covers \App\Http\Middleware\SkipIfAuthenticated - */ + #[Test] public function test_user_login_already_authenticated_is_rejected() { $response = $this->json('POST', '/user/login', [ @@ -198,9 +189,7 @@ class LoginTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_user_login_with_missing_data_returns_validation_error() { $response = $this->json('POST', '/user/login', [ @@ -214,11 +203,7 @@ class LoginTest extends FeatureTestCase ]); } - /** - * @test - * - * @covers \App\Exceptions\Handler - */ + #[Test] public function test_user_login_with_invalid_credentials_returns_unauthorized() { $response = $this->json('POST', '/user/login', [ @@ -231,9 +216,7 @@ class LoginTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_login_with_invalid_credentials_send_failed_login_notification() { Notification::fake(); @@ -249,9 +232,7 @@ class LoginTest extends FeatureTestCase Notification::assertSentTo($this->user, FailedLogin::class); } - /** - * @test - */ + #[Test] public function test_login_with_invalid_credentials_does_not_send_new_device_notification() { Notification::fake(); @@ -267,9 +248,7 @@ class LoginTest extends FeatureTestCase Notification::assertNothingSentTo($this->user); } - /** - * @test - */ + #[Test] public function test_too_many_login_attempts_with_invalid_credentials_returns_too_many_request_error() { $throttle = 8; @@ -291,9 +270,7 @@ class LoginTest extends FeatureTestCase ->assertStatus(429); } - /** - * @test - */ + #[Test] public function test_user_logout_returns_validation_success() { $response = $this->json('POST', '/user/login', [ @@ -309,12 +286,7 @@ class LoginTest extends FeatureTestCase ]); } - /** - * @test - * - * @covers \App\Http\Middleware\KickOutInactiveUser - * @covers \App\Http\Middleware\LogUserLastSeen - */ + #[Test] public function test_user_logout_after_inactivity_returns_teapot() { // Set the autolock period to 1 minute diff --git a/tests/Feature/Http/Auth/PasswordControllerTest.php b/tests/Feature/Http/Auth/PasswordControllerTest.php index 01083da9..addf53e2 100644 --- a/tests/Feature/Http/Auth/PasswordControllerTest.php +++ b/tests/Feature/Http/Auth/PasswordControllerTest.php @@ -5,6 +5,7 @@ namespace Tests\Feature\Http\Auth; use App\Http\Controllers\Auth\PasswordController; use App\Models\User; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -22,9 +23,6 @@ class PasswordControllerTest extends FeatureTestCase private const NEW_PASSWORD = 'newPassword'; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -32,9 +30,7 @@ class PasswordControllerTest extends FeatureTestCase $this->user = User::factory()->create(); } - /** - * @test - */ + #[Test] public function test_update_return_success() { $response = $this->actingAs($this->user, 'web-guard') @@ -49,9 +45,7 @@ class PasswordControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_passing_bad_current_pwd_return_bad_request() { $response = $this->actingAs($this->user, 'web-guard') @@ -66,9 +60,7 @@ class PasswordControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_passing_invalid_data_return_validation_error() { $response = $this->actingAs($this->user, 'web-guard') diff --git a/tests/Feature/Http/Auth/RegisterControllerTest.php b/tests/Feature/Http/Auth/RegisterControllerTest.php index f8978e40..e55132ae 100644 --- a/tests/Feature/Http/Auth/RegisterControllerTest.php +++ b/tests/Feature/Http/Auth/RegisterControllerTest.php @@ -9,6 +9,7 @@ use App\Models\User; use App\Rules\ComplyWithEmailRestrictionPolicy; use Illuminate\Support\Facades\DB; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -33,17 +34,12 @@ class RegisterControllerTest extends FeatureTestCase private const EMAIL_FILTERING_RULE = '^[A-Za-z0-9._%+-]+@example\.org'; - /** - * @test - */ public function setUp() : void { parent::setUp(); } - /** - * @test - */ + #[Test] public function test_register_returns_success() { DB::table('users')->delete(); @@ -69,9 +65,7 @@ class RegisterControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_register_with_uppercased_email_returns_success() { DB::table('users')->delete(); @@ -97,9 +91,7 @@ class RegisterControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_register_with_invalid_data_returns_validation_error() { $response = $this->json('POST', '/user', [ @@ -111,9 +103,7 @@ class RegisterControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_register_first_user_only_as_admin() { $this->assertDatabaseCount('users', 0); @@ -142,9 +132,7 @@ class RegisterControllerTest extends FeatureTestCase $this->assertEquals(1, User::admins()->count()); } - /** - * @test - */ + #[Test] public function test_register_is_forbidden_when_registration_is_disabled() { Settings::set('disableRegistration', true); @@ -158,9 +146,7 @@ class RegisterControllerTest extends FeatureTestCase ->assertStatus(403); } - /** - * @test - */ + #[Test] public function test_register_succeeds_when_email_is_in_restricted_list() { Settings::set('restrictRegistration', true); @@ -176,9 +162,7 @@ class RegisterControllerTest extends FeatureTestCase ->assertStatus(201); } - /** - * @test - */ + #[Test] public function test_register_fails_when_email_is_not_in_restricted_list() { Settings::set('restrictRegistration', true); @@ -194,9 +178,7 @@ class RegisterControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_register_succeeds_when_email_matchs_filtering_rule() { Settings::set('restrictRegistration', true); @@ -212,9 +194,7 @@ class RegisterControllerTest extends FeatureTestCase ->assertStatus(201); } - /** - * @test - */ + #[Test] public function test_register_fails_when_email_does_not_match_filtering_rule() { Settings::set('restrictRegistration', true); @@ -230,9 +210,7 @@ class RegisterControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_register_succeeds_when_email_is_allowed_by_list_over_regex() { Settings::set('restrictRegistration', true); @@ -248,9 +226,7 @@ class RegisterControllerTest extends FeatureTestCase ->assertStatus(201); } - /** - * @test - */ + #[Test] public function test_register_succeeds_when_email_is_allowed_by_regex_over_list() { Settings::set('restrictRegistration', true); diff --git a/tests/Feature/Http/Auth/ResetPasswordControllerTest.php b/tests/Feature/Http/Auth/ResetPasswordControllerTest.php index 27210ca1..384c36d2 100644 --- a/tests/Feature/Http/Auth/ResetPasswordControllerTest.php +++ b/tests/Feature/Http/Auth/ResetPasswordControllerTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Password; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -22,9 +23,7 @@ class ResetPasswordControllerTest extends FeatureTestCase */ protected $user; - /** - * @test - */ + #[Test] public function test_submit_reset_password_without_input_returns_validation_error() { $response = $this->json('POST', '/user/password/reset', [ @@ -38,9 +37,7 @@ class ResetPasswordControllerTest extends FeatureTestCase ->assertJsonValidationErrors(['email', 'password', 'token']); } - /** - * @test - */ + #[Test] public function test_submit_reset_password_with_invalid_data_returns_validation_error() { $response = $this->json('POST', '/user/password/reset', [ @@ -54,9 +51,7 @@ class ResetPasswordControllerTest extends FeatureTestCase ->assertJsonValidationErrors(['email', 'password']); } - /** - * @test - */ + #[Test] public function test_submit_reset_password_with_too_short_pwd_returns_validation_error() { $response = $this->json('POST', '/user/password/reset', [ @@ -70,9 +65,7 @@ class ResetPasswordControllerTest extends FeatureTestCase ->assertJsonValidationErrors(['password']); } - /** - * @test - */ + #[Test] public function test_submit_reset_password_returns_success() { Notification::fake(); diff --git a/tests/Feature/Http/Auth/SocialiteControllerTest.php b/tests/Feature/Http/Auth/SocialiteControllerTest.php index 97567ab3..7483f64c 100644 --- a/tests/Feature/Http/Auth/SocialiteControllerTest.php +++ b/tests/Feature/Http/Auth/SocialiteControllerTest.php @@ -8,6 +8,7 @@ use App\Models\User; use Illuminate\Support\Facades\DB; use Laravel\Socialite\Facades\Socialite; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -36,9 +37,6 @@ class SocialiteControllerTest extends FeatureTestCase private const USER_EMAIL = 'john@provider.com'; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -60,9 +58,7 @@ class SocialiteControllerTest extends FeatureTestCase $this->socialiteUser->nickname = self::USER_NICKNAME; } - /** - * @test - */ + #[Test] public function test_redirect_redirects_to_provider_url() { Settings::set('enableSso', true); @@ -72,9 +68,7 @@ class SocialiteControllerTest extends FeatureTestCase $response->assertRedirectContains('https://github.com/login/oauth/authorize'); } - /** - * @test - */ + #[Test] public function test_redirect_returns_error_when_registrations_are_disabled() { Settings::set('enableSso', false); @@ -84,9 +78,7 @@ class SocialiteControllerTest extends FeatureTestCase $response->assertRedirect('/error?err=sso_disabled'); } - /** - * @test - */ + #[Test] public function test_callback_authenticates_the_user() { Socialite::shouldReceive('driver->user') @@ -97,9 +89,7 @@ class SocialiteControllerTest extends FeatureTestCase $this->assertAuthenticatedAs($this->user, 'web-guard'); } - /** - * @test - */ + #[Test] public function test_callback_redirects_authenticated_user_to_accounts() { Socialite::shouldReceive('driver->user') @@ -110,9 +100,7 @@ class SocialiteControllerTest extends FeatureTestCase $response->assertRedirect('/accounts'); } - /** - * @test - */ + #[Test] public function test_callback_updates_user_informations() { $socialiteUpdatedUser = new \Laravel\Socialite\Two\User; @@ -132,9 +120,7 @@ class SocialiteControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_callback_updates_username_with_fallback_value() { $socialiteUpdatedUser = new \Laravel\Socialite\Two\User; @@ -154,9 +140,7 @@ class SocialiteControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_callback_registers_new_user() { $newSocialiteUser = new \Laravel\Socialite\Two\User; @@ -177,9 +161,7 @@ class SocialiteControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_callback_registers_new_user_with_existing_name() { $socialiteUserWithSameName = new \Laravel\Socialite\Two\User; @@ -200,9 +182,7 @@ class SocialiteControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_callback_always_registers_first_user_as_admin() { DB::table('users')->delete(); @@ -221,9 +201,7 @@ class SocialiteControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_callback_returns_error_when_email_is_already_used() { $userWithSameEmail = User::factory()->create([ @@ -250,9 +228,7 @@ class SocialiteControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_callback_redirects_to_error_when_registrations_are_closed() { Settings::set('disableRegistration', true); @@ -271,9 +247,7 @@ class SocialiteControllerTest extends FeatureTestCase $response->assertRedirect('/error?err=sso_no_register'); } - /** - * @test - */ + #[Test] public function test_callback_skips_registration_when_all_registrations_are_closed() { Settings::set('disableRegistration', true); @@ -295,9 +269,7 @@ class SocialiteControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_callback_registers_new_user_when_sso_registrations_are_enabled() { Settings::set('disableRegistration', true); diff --git a/tests/Feature/Http/Auth/UserControllerTest.php b/tests/Feature/Http/Auth/UserControllerTest.php index d393c7a2..b1c839e7 100644 --- a/tests/Feature/Http/Auth/UserControllerTest.php +++ b/tests/Feature/Http/Auth/UserControllerTest.php @@ -10,6 +10,7 @@ use App\Observers\UserObserver; use App\Policies\UserPolicy; use Illuminate\Support\Facades\Config; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -33,9 +34,6 @@ class UserControllerTest extends FeatureTestCase private const PASSWORD = 'password'; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -43,9 +41,7 @@ class UserControllerTest extends FeatureTestCase $this->user = User::factory()->create(); } - /** - * @test - */ + #[Test] public function test_update_user_returns_success() { $response = $this->actingAs($this->user, 'web-guard') @@ -73,9 +69,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_user_without_changing_email_returns_success() { $response = $this->actingAs($this->user, 'web-guard') @@ -100,9 +94,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_user_without_changing_name_returns_success() { $response = $this->actingAs($this->user, 'web-guard') @@ -127,9 +119,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_user_with_uppercased_email_returns_success() { $response = $this->actingAs($this->user, 'web-guard') @@ -154,9 +144,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_user_in_demo_mode_returns_unchanged_user() { Config::set('2fauth.config.isDemoApp', true); @@ -185,9 +173,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_user_passing_wrong_password_returns_bad_request() { $response = $this->actingAs($this->user, 'web-guard') @@ -199,9 +185,7 @@ class UserControllerTest extends FeatureTestCase ->assertStatus(400); } - /** - * @test - */ + #[Test] public function test_update_user_with_invalid_data_returns_validation_error() { $response = $this->actingAs($this->user, 'web-guard') @@ -213,9 +197,7 @@ class UserControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_delete_user_returns_success() { $this->actingAs($this->user, 'web-guard') @@ -225,9 +207,7 @@ class UserControllerTest extends FeatureTestCase ->assertNoContent(); } - /** - * @test - */ + #[Test] public function test_delete_user_in_demo_mode_returns_unauthorized() { Config::set('2fauth.config.isDemoApp', true); @@ -246,9 +226,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_delete_user_passing_wrong_password_returns_bad_request() { $response = $this->actingAs($this->user, 'web-guard') @@ -262,9 +240,7 @@ class UserControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_delete_the_only_admin_returns_bad_request() { /** diff --git a/tests/Feature/Http/Auth/WebAuthnDeviceLostControllerTest.php b/tests/Feature/Http/Auth/WebAuthnDeviceLostControllerTest.php index 3920fda7..ddd86fdd 100644 --- a/tests/Feature/Http/Auth/WebAuthnDeviceLostControllerTest.php +++ b/tests/Feature/Http/Auth/WebAuthnDeviceLostControllerTest.php @@ -8,9 +8,12 @@ use App\Http\Requests\WebauthnDeviceLostRequest; use App\Models\User; use App\Notifications\WebauthnRecoveryNotification; use App\Providers\AuthServiceProvider; +use App\Rules\CaseInsensitiveEmailExists; use Illuminate\Support\Facades\Lang; use Illuminate\Support\Facades\Notification; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\CoversMethod; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -21,6 +24,7 @@ use Tests\FeatureTestCase; #[CoversClass(WebauthnCredentialBroker::class)] #[CoversClass(WebauthnDeviceLostRequest::class)] #[CoversClass(AuthServiceProvider::class)] +#[CoversMethod(CaseInsensitiveEmailExists::class, 'validate')] class WebAuthnDeviceLostControllerTest extends FeatureTestCase { /** @@ -28,9 +32,6 @@ class WebAuthnDeviceLostControllerTest extends FeatureTestCase */ protected $user; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -38,11 +39,7 @@ class WebAuthnDeviceLostControllerTest extends FeatureTestCase $this->user = User::factory()->create(); } - /** - * @test - * - * @covers \App\Models\Traits\WebAuthnManageCredentials - */ + #[Test] public function test_sendRecoveryEmail_sends_notification_on_success() { Notification::fake(); @@ -63,9 +60,7 @@ class WebAuthnDeviceLostControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_WebauthnRecoveryNotification_renders_to_email() { $mail = (new WebauthnRecoveryNotification('test_token'))->toMail($this->user)->render(); @@ -101,9 +96,7 @@ class WebAuthnDeviceLostControllerTest extends FeatureTestCase ); } - /** - * @test - */ + #[Test] public function test_sendRecoveryEmail_does_not_send_anything_to_unknown_email() { Notification::fake(); @@ -124,9 +117,7 @@ class WebAuthnDeviceLostControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_sendRecoveryEmail_does_not_send_anything_to_invalid_email() { Notification::fake(); @@ -147,9 +138,7 @@ class WebAuthnDeviceLostControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_sendRecoveryEmail_does_not_send_anything_to_not_WebAuthnAuthenticatable() { $mock = $this->mock(\App\Extensions\WebauthnCredentialBroker::class)->makePartial(); @@ -170,9 +159,7 @@ class WebAuthnDeviceLostControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_sendRecoveryEmail_is_throttled() { Notification::fake(); @@ -202,9 +189,7 @@ class WebAuthnDeviceLostControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_error_if_no_broker_is_set() { $this->app['config']->set('auth.passwords.webauthn', null); diff --git a/tests/Feature/Http/Auth/WebAuthnLoginControllerTest.php b/tests/Feature/Http/Auth/WebAuthnLoginControllerTest.php index 7a019d08..9612d50b 100644 --- a/tests/Feature/Http/Auth/WebAuthnLoginControllerTest.php +++ b/tests/Feature/Http/Auth/WebAuthnLoginControllerTest.php @@ -4,12 +4,15 @@ namespace Tests\Feature\Http\Auth; use App\Extensions\WebauthnTwoFAuthUserProvider; use App\Http\Controllers\Auth\WebAuthnLoginController; +use App\Http\Middleware\SkipIfAuthenticated; use App\Models\User; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\DB; use Laragear\WebAuthn\Assertion\Validator\AssertionValidator; use Laragear\WebAuthn\Enums\UserVerification; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\CoversMethod; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -18,6 +21,7 @@ use Tests\FeatureTestCase; #[CoversClass(WebAuthnLoginController::class)] #[CoversClass(User::class)] #[CoversClass(WebauthnTwoFAuthUserProvider::class)] +#[CoversMethod(SkipIfAuthenticated::class, 'handle')] class WebAuthnLoginControllerTest extends FeatureTestCase { /** @@ -85,9 +89,6 @@ class WebAuthnLoginControllerTest extends FeatureTestCase const ASSERTION_CHALLENGE = 'iXozmynKi+YD2iRvKNbSPA=='; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -95,9 +96,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase DB::table('users')->delete(); } - /** - * @test - */ + #[Test] public function test_webauthn_login_returns_success() { $this->user = User::factory()->create(['email' => self::EMAIL]); @@ -141,9 +140,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_webauthn_admin_login_returns_admin_role() { $this->admin = User::factory()->administrator()->create(['email' => self::EMAIL]); @@ -180,9 +177,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_webauthn_login_merge_handle_if_missing() { $this->user = User::factory()->create(['email' => self::EMAIL]); @@ -225,9 +220,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_legacy_login_is_rejected_when_webauthn_only_is_enable() { $this->user = User::factory()->create([ @@ -245,11 +238,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ->assertUnauthorized(); } - /** - * @test - * - * @covers \App\Http\Middleware\SkipIfAuthenticated - */ + #[Test] public function test_webauthn_login_already_authenticated_is_rejected() { $this->user = User::factory()->create(['email' => self::EMAIL]); @@ -289,9 +278,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_webauthn_login_with_missing_data_returns_validation_error() { $this->user = User::factory()->create(['email' => self::EMAIL]); @@ -320,9 +307,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_webauthn_invalid_login_returns_unauthorized() { $this->user = User::factory()->create(['email' => self::EMAIL]); @@ -337,9 +322,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ->assertUnauthorized(); } - /** - * @test - */ + #[Test] public function test_too_many_invalid_login_attempts_returns_too_many_request_error() { $throttle = 8; @@ -364,9 +347,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ->assertStatus(429); } - /** - * @test - */ + #[Test] public function test_get_options_returns_success() { Config::set('webauthn.user_verification', UserVerification::PREFERRED); @@ -404,9 +385,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_options_for_securelogin_returns_required_userVerification() { Config::set('webauthn.user_verification', UserVerification::REQUIRED); @@ -446,9 +425,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_options_for_fastlogin_returns_discouraged_userVerification() { Config::set('webauthn.user_verification', UserVerification::DISCOURAGED); @@ -488,9 +465,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_options_with_capitalized_email_returns_success() { $this->user = User::factory()->create(['email' => self::EMAIL]); @@ -501,9 +476,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ->assertOk(); } - /** - * @test - */ + #[Test] public function test_get_options_with_missing_email_returns_validation_errors() { $this->json('POST', '/webauthn/login/options', [ @@ -515,9 +488,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_options_with_invalid_email_returns_validation_errors() { $this->json('POST', '/webauthn/login/options', [ @@ -529,9 +500,7 @@ class WebAuthnLoginControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_get_options_with_unknown_email_returns_validation_errors() { $this->json('POST', '/webauthn/login/options', [ diff --git a/tests/Feature/Http/Auth/WebAuthnManageControllerTest.php b/tests/Feature/Http/Auth/WebAuthnManageControllerTest.php index 45202316..916464ef 100644 --- a/tests/Feature/Http/Auth/WebAuthnManageControllerTest.php +++ b/tests/Feature/Http/Auth/WebAuthnManageControllerTest.php @@ -9,6 +9,7 @@ use App\Models\User; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Support\Facades\DB; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -30,9 +31,6 @@ class WebAuthnManageControllerTest extends FeatureTestCase public const CREDENTIAL_ID_RAW = '+VOLFKPY+/FuMI/sJ7gMllK76L3VoRUINj6lL/Z3qDg='; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -40,9 +38,7 @@ class WebAuthnManageControllerTest extends FeatureTestCase $this->user = User::factory()->create(); } - /** - * @test - */ + #[Test] public function test_index_returns_success_with_credentials() { DB::table('webauthn_credentials')->insert([ @@ -71,9 +67,7 @@ class WebAuthnManageControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_rename_returns_success_with_new_name() { DB::table('webauthn_credentials')->insert([ @@ -102,9 +96,7 @@ class WebAuthnManageControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_rename_invalid_data_returns_validation_error() { $response = $this->actingAs($this->user, 'web-guard') @@ -114,9 +106,7 @@ class WebAuthnManageControllerTest extends FeatureTestCase ->assertStatus(422); } - /** - * @test - */ + #[Test] public function test_rename_missing_credential_returns_not_found() { $response = $this->actingAs($this->user, 'web-guard') @@ -129,9 +119,7 @@ class WebAuthnManageControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_index_as_reverse_proxy_returns_error() { $response = $this->actingAs($this->user, 'reverse-proxy-guard') @@ -139,9 +127,7 @@ class WebAuthnManageControllerTest extends FeatureTestCase ->assertStatus(405); } - /** - * @test - */ + #[Test] public function test_rename_as_reverse_proxy_returns_error() { $response = $this->actingAs($this->user, 'reverse-proxy-guard') @@ -149,9 +135,7 @@ class WebAuthnManageControllerTest extends FeatureTestCase ->assertStatus(405); } - /** - * @test - */ + #[Test] public function test_delete_as_reverse_proxy_returns_error() { $response = $this->actingAs($this->user, 'reverse-proxy-guard') @@ -159,9 +143,7 @@ class WebAuthnManageControllerTest extends FeatureTestCase ->assertStatus(405); } - /** - * @test - */ + #[Test] public function test_delete_returns_no_content() { $response = $this->actingAs($this->user, 'web-guard') diff --git a/tests/Feature/Http/Auth/WebAuthnRecoveryControllerTest.php b/tests/Feature/Http/Auth/WebAuthnRecoveryControllerTest.php index b96889c5..276ab2a0 100644 --- a/tests/Feature/Http/Auth/WebAuthnRecoveryControllerTest.php +++ b/tests/Feature/Http/Auth/WebAuthnRecoveryControllerTest.php @@ -11,6 +11,7 @@ use Database\Factories\UserFactory; use Illuminate\Support\Facades\Date; use Illuminate\Support\Facades\DB; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -35,9 +36,6 @@ class WebAuthnRecoveryControllerTest extends FeatureTestCase const CREDENTIAL_ID = '-VOLFKPY-_FuMI_sJ7gMllK76L3VoRUINj6lL_Z3qDg'; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -53,9 +51,7 @@ class WebAuthnRecoveryControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_recover_fails_if_no_recovery_is_set() { DB::table(config('auth.passwords.webauthn.table'))->delete(); @@ -69,9 +65,7 @@ class WebAuthnRecoveryControllerTest extends FeatureTestCase ->assertJsonValidationErrors('token'); } - /** - * @test - */ + #[Test] public function test_recover_with_wrong_token_returns_validation_error() { $response = $this->json('POST', '/webauthn/recover', [ @@ -84,9 +78,7 @@ class WebAuthnRecoveryControllerTest extends FeatureTestCase ->assertJsonValidationErrors('token'); } - /** - * @test - */ + #[Test] public function test_recover_with_expired_token_returns_validation_error() { Date::setTestNow($now = Date::create(2020, 01, 01, 16, 30)); @@ -107,9 +99,7 @@ class WebAuthnRecoveryControllerTest extends FeatureTestCase ->assertJsonValidationErrors('token'); } - /** - * @test - */ + #[Test] public function test_recover_with_invalid_password_returns_authentication_error() { $this->json('POST', '/webauthn/recover', [ @@ -120,9 +110,7 @@ class WebAuthnRecoveryControllerTest extends FeatureTestCase ->assertStatus(401); } - /** - * @test - */ + #[Test] public function test_recover_returns_validation_error_when_no_user_exists() { $this->json('POST', '/webauthn/recover', [ @@ -136,9 +124,7 @@ class WebAuthnRecoveryControllerTest extends FeatureTestCase ->assertJsonValidationErrors('email'); } - /** - * @test - */ + #[Test] public function test_recover_returns_success() { $response = $this->json('POST', '/webauthn/recover', [ @@ -153,9 +139,7 @@ class WebAuthnRecoveryControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_recover_resets_useWebauthnOnly_user_preference() { $this->user['preferences->useWebauthnOnly'] = true; @@ -173,9 +157,7 @@ class WebAuthnRecoveryControllerTest extends FeatureTestCase $this->assertFalse($this->user->preferences['useWebauthnOnly']); } - /** - * @test - */ + #[Test] public function test_revoke_all_credentials_clear_registered_credentials() { DB::table('webauthn_credentials')->insert([ diff --git a/tests/Feature/Http/Auth/WebAuthnRegisterControllerTest.php b/tests/Feature/Http/Auth/WebAuthnRegisterControllerTest.php index 75320e80..f297689e 100644 --- a/tests/Feature/Http/Auth/WebAuthnRegisterControllerTest.php +++ b/tests/Feature/Http/Auth/WebAuthnRegisterControllerTest.php @@ -10,6 +10,7 @@ use Laragear\WebAuthn\Http\Requests\AttestationRequest; use Laragear\WebAuthn\Http\Requests\AttestedRequest; use Laragear\WebAuthn\JsonTransport; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -23,9 +24,6 @@ class WebAuthnRegisterControllerTest extends FeatureTestCase */ protected $user; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -33,9 +31,7 @@ class WebAuthnRegisterControllerTest extends FeatureTestCase $this->user = User::factory()->create(); } - /** - * @test - */ + #[Test] public function test_uses_attestation_with_fastRegistration_request() : void { Config::set('webauthn.user_verification', UserVerification::DISCOURAGED); @@ -50,9 +46,7 @@ class WebAuthnRegisterControllerTest extends FeatureTestCase ->assertOk(); } - /** - * @test - */ + #[Test] public function test_uses_attestation_with_secureRegistration_request() : void { Config::set('webauthn.user_verification', UserVerification::REQUIRED); @@ -67,9 +61,7 @@ class WebAuthnRegisterControllerTest extends FeatureTestCase ->assertOk(); } - /** - * @test - */ + #[Test] public function test_register_uses_attested_request() : void { $request = $this->mock(AttestedRequest::class); diff --git a/tests/Feature/Http/Middlewares/AdminOnlyMiddlewareTest.php b/tests/Feature/Http/Middlewares/AdminOnlyMiddlewareTest.php index a132342b..32cbda03 100644 --- a/tests/Feature/Http/Middlewares/AdminOnlyMiddlewareTest.php +++ b/tests/Feature/Http/Middlewares/AdminOnlyMiddlewareTest.php @@ -6,13 +6,12 @@ use App\Http\Middleware\AdminOnly; use App\Models\User; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\Request; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; class AdminOnlyMiddlewareTest extends FeatureTestCase { - /** - * @test - */ + #[Test] public function test_users_are_rejected() { $this->expectException(AuthorizationException::class); @@ -31,9 +30,7 @@ class AdminOnlyMiddlewareTest extends FeatureTestCase }); } - /** - * @test - */ + #[Test] public function test_admins_pass() { /** diff --git a/tests/Feature/Http/Middlewares/AuthenticateMiddlewareTest.php b/tests/Feature/Http/Middlewares/AuthenticateMiddlewareTest.php index 38a12f5d..b99bfc70 100644 --- a/tests/Feature/Http/Middlewares/AuthenticateMiddlewareTest.php +++ b/tests/Feature/Http/Middlewares/AuthenticateMiddlewareTest.php @@ -3,6 +3,7 @@ namespace Tests\Feature\Http\Middlewares; use Illuminate\Support\Facades\Config; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; class AuthenticateMiddlewareTest extends FeatureTestCase @@ -11,9 +12,7 @@ class AuthenticateMiddlewareTest extends FeatureTestCase private const USER_EMAIL = 'john@example.com'; - /** - * @test - */ + #[Test] public function test_it_always_authenticates_with_reverse_proxy_guard() { Config::set('auth.auth_proxy_headers.user', 'HTTP_REMOTE_USER'); @@ -24,9 +23,7 @@ class AuthenticateMiddlewareTest extends FeatureTestCase $this->assertAuthenticated('reverse-proxy-guard'); } - /** - * @test - */ + #[Test] public function test_it_does_not_authenticate_with_empty_header() { Config::set('auth.auth_proxy_headers.user', 'HTTP_REMOTE_USER'); @@ -40,9 +37,7 @@ class AuthenticateMiddlewareTest extends FeatureTestCase ])->assertStatus(407); } - /** - * @test - */ + #[Test] public function test_it_does_not_authenticate_with_missing_header() { $this->app['auth']->shouldUse('reverse-proxy-guard'); diff --git a/tests/Feature/Http/Requests/LoginRequestTest.php b/tests/Feature/Http/Requests/LoginRequestTest.php index 62d3cf81..69eb567e 100644 --- a/tests/Feature/Http/Requests/LoginRequestTest.php +++ b/tests/Feature/Http/Requests/LoginRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -18,9 +19,7 @@ class LoginRequestTest extends FeatureTestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { $request = new LoginRequest(); @@ -28,9 +27,7 @@ class LoginRequestTest extends FeatureTestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -61,9 +58,7 @@ class LoginRequestTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Feature/Http/Requests/UserDeleteRequestTest.php b/tests/Feature/Http/Requests/UserDeleteRequestTest.php index 0b0faa5f..f5dba089 100644 --- a/tests/Feature/Http/Requests/UserDeleteRequestTest.php +++ b/tests/Feature/Http/Requests/UserDeleteRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -18,9 +19,7 @@ class UserDeleteRequestTest extends FeatureTestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -32,9 +31,7 @@ class UserDeleteRequestTest extends FeatureTestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -56,9 +53,7 @@ class UserDeleteRequestTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Feature/Http/Requests/UserPatchPwdRequestTest.php b/tests/Feature/Http/Requests/UserPatchPwdRequestTest.php index fc0a0dc2..d60ae1cc 100644 --- a/tests/Feature/Http/Requests/UserPatchPwdRequestTest.php +++ b/tests/Feature/Http/Requests/UserPatchPwdRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -18,9 +19,7 @@ class UserPatchPwdRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -32,9 +31,7 @@ class UserPatchPwdRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -58,9 +55,7 @@ class UserPatchPwdRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Feature/Http/Requests/UserStoreRequestTest.php b/tests/Feature/Http/Requests/UserStoreRequestTest.php index a05f9d3d..42c4caa4 100644 --- a/tests/Feature/Http/Requests/UserStoreRequestTest.php +++ b/tests/Feature/Http/Requests/UserStoreRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -18,9 +19,7 @@ class UserStoreRequestTest extends FeatureTestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { $request = new UserStoreRequest(); @@ -28,9 +27,7 @@ class UserStoreRequestTest extends FeatureTestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -66,9 +63,7 @@ class UserStoreRequestTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Feature/Http/Requests/UserUpdateRequestTest.php b/tests/Feature/Http/Requests/UserUpdateRequestTest.php index a0ddfd60..729b63a1 100644 --- a/tests/Feature/Http/Requests/UserUpdateRequestTest.php +++ b/tests/Feature/Http/Requests/UserUpdateRequestTest.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Validator; use Mockery; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -20,9 +21,7 @@ class UserUpdateRequestTest extends FeatureTestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -34,9 +33,7 @@ class UserUpdateRequestTest extends FeatureTestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -81,9 +78,7 @@ class UserUpdateRequestTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Feature/Http/Requests/WebauthnAssertedRequestTest.php b/tests/Feature/Http/Requests/WebauthnAssertedRequestTest.php index d5492a20..2135cf82 100644 --- a/tests/Feature/Http/Requests/WebauthnAssertedRequestTest.php +++ b/tests/Feature/Http/Requests/WebauthnAssertedRequestTest.php @@ -7,6 +7,7 @@ use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -17,9 +18,7 @@ class WebauthnAssertedRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -50,9 +49,7 @@ class WebauthnAssertedRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Feature/Http/Requests/WebauthnRenameRequestTest.php b/tests/Feature/Http/Requests/WebauthnRenameRequestTest.php index e026bb4b..fd594504 100644 --- a/tests/Feature/Http/Requests/WebauthnRenameRequestTest.php +++ b/tests/Feature/Http/Requests/WebauthnRenameRequestTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -18,9 +19,7 @@ class WebauthnRenameRequestTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_user_is_authorized() { Auth::shouldReceive('check') @@ -32,9 +31,7 @@ class WebauthnRenameRequestTest extends TestCase $this->assertTrue($request->authorize()); } - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -56,9 +53,7 @@ class WebauthnRenameRequestTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Feature/Http/SystemControllerTest.php b/tests/Feature/Http/SystemControllerTest.php index 5fe0fdb5..0a1f2de2 100644 --- a/tests/Feature/Http/SystemControllerTest.php +++ b/tests/Feature/Http/SystemControllerTest.php @@ -9,6 +9,7 @@ use App\Services\ReleaseRadarService; use Illuminate\Support\Facades\Lang; use Illuminate\Support\Facades\Notification; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -26,9 +27,6 @@ class SystemControllerTest extends FeatureTestCase protected $admin; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -37,18 +35,14 @@ class SystemControllerTest extends FeatureTestCase $this->admin = User::factory()->administrator()->create(); } - /** - * @test - */ + #[Test] public function test_infos_returns_unauthorized() { $response = $this->json('GET', '/system/infos') ->assertUnauthorized(); } - /** - * @test - */ + #[Test] public function test_infos_returns_forbidden() { $response = $this->actingAs($this->user, 'api-guard') @@ -56,9 +50,7 @@ class SystemControllerTest extends FeatureTestCase ->assertForbidden(); } - /** - * @test - */ + #[Test] public function test_infos_returns_only_base_collection() { $response = $this->actingAs($this->admin, 'api-guard') @@ -87,9 +79,7 @@ class SystemControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_infos_returns_proxy_collection_when_signed_in_behind_proxy() { $response = $this->actingAs($this->admin, 'reverse-proxy-guard') @@ -104,9 +94,7 @@ class SystemControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_latestrelease_runs_manual_scan() { $releaseRadarService = $this->mock(ReleaseRadarService::class)->makePartial(); @@ -121,9 +109,7 @@ class SystemControllerTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_testEmail_sends_a_notification() { Notification::fake(); @@ -136,9 +122,7 @@ class SystemControllerTest extends FeatureTestCase Notification::assertSentTo($this->admin, TestEmailSettingNotification::class); } - /** - * @test - */ + #[Test] public function test_testEmail_renders_to_email() { $mail = (new TestEmailSettingNotification('test_token'))->toMail($this->user)->render(); @@ -149,18 +133,14 @@ class SystemControllerTest extends FeatureTestCase ); } - /** - * @test - */ + #[Test] public function test_testEmail_returns_unauthorized() { $response = $this->json('GET', '/system/infos') ->assertUnauthorized(); } - /** - * @test - */ + #[Test] public function test_testEmail_returns_forbidden() { $response = $this->actingAs($this->user, 'api-guard') @@ -168,9 +148,7 @@ class SystemControllerTest extends FeatureTestCase ->assertForbidden(); } - /** - * @test - */ + #[Test] public function test_clearCache_returns_success() { $response = $this->json('GET', '/system/clear-cache'); @@ -178,9 +156,7 @@ class SystemControllerTest extends FeatureTestCase $response->assertStatus(200); } - /** - * @test - */ + #[Test] public function test_optimize_returns_success() { $response = $this->json('GET', '/system/optimize'); diff --git a/tests/Feature/Models/TwoFAccountModelTest.php b/tests/Feature/Models/TwoFAccountModelTest.php index 63cf357d..4e6110f2 100644 --- a/tests/Feature/Models/TwoFAccountModelTest.php +++ b/tests/Feature/Models/TwoFAccountModelTest.php @@ -11,6 +11,7 @@ use Illuminate\Support\Facades\Storage; use Mockery\MockInterface; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\Data\HttpRequestTestData; use Tests\Data\OtpTestData; use Tests\FeatureTestCase; @@ -42,9 +43,6 @@ class TwoFAccountModelTest extends FeatureTestCase */ protected $helpers; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -92,9 +90,7 @@ class TwoFAccountModelTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_fill_with_custom_totp_uri_returns_correct_value() { $file = (new FileFactory)->image('file.png', 10, 10); @@ -125,9 +121,7 @@ class TwoFAccountModelTest extends FeatureTestCase Storage::disk('imagesLink')->assertMissing($twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_fill_with_basic_totp_uri_returns_default_value() { $twofaccount = new TwoFAccount; @@ -145,9 +139,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertEquals(null, $twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_fill_with_ms_corporate_totp_uri_returns_correct_value() { $twofaccount = new TwoFAccount; @@ -164,9 +156,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertEquals(OtpTestData::ALGORITHM_DEFAULT, $twofaccount->algorithm); } - /** - * @test - */ + #[Test] public function test_fill_with_custom_hotp_uri_returns_correct_value() { $file = (new FileFactory)->image('file.png', 10, 10); @@ -197,9 +187,7 @@ class TwoFAccountModelTest extends FeatureTestCase Storage::disk('imagesLink')->assertMissing($twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_fill_with_basic_hotp_uri_returns_default_value() { $twofaccount = new TwoFAccount; @@ -217,9 +205,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertEquals(null, $twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_filled_with_uri_persists_correct_values_to_db() { $twofaccount = new TwoFAccount; @@ -240,9 +226,7 @@ class TwoFAccountModelTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_fill_with_invalid_uri_returns_ValidationException() { $this->expectException(\Illuminate\Validation\ValidationException::class); @@ -250,9 +234,7 @@ class TwoFAccountModelTest extends FeatureTestCase $twofaccount->fillWithURI(OtpTestData::INVALID_OTPAUTH_URI); } - /** - * @test - */ + #[Test] public function test_fill_with_invalid_uri_with_mismatching_issuer_returns_ValidationException() { $this->expectException(\Illuminate\Validation\ValidationException::class); @@ -260,9 +242,7 @@ class TwoFAccountModelTest extends FeatureTestCase $twofaccount->fillWithURI(OtpTestData::INVALID_OTPAUTH_URI_MISMATCHING_ISSUER); } - /** - * @test - */ + #[Test] public function test_fill_with_uri_without_label_returns_ValidationException() { $this->expectException(\Illuminate\Validation\ValidationException::class); @@ -270,9 +250,7 @@ class TwoFAccountModelTest extends FeatureTestCase $twofaccount->fillWithURI('otpauth://totp/?secret=' . OtpTestData::SECRET); } - /** - * @test - */ + #[Test] public function test_fill_with_getOfficialIcons_On_triggers_icon_fetching() { // Set the getOfficialIcons preference On @@ -291,9 +269,7 @@ class TwoFAccountModelTest extends FeatureTestCase $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_FULL_VALID_PARAMETERS_FOR_CUSTOM_TOTP_NO_ICON); } - /** - * @test - */ + #[Test] public function test_fill_with_getOfficialIcons_Off_skips_icon_fetching() { // Set the getOfficialIcons preference Off @@ -311,9 +287,7 @@ class TwoFAccountModelTest extends FeatureTestCase $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_FULL_VALID_PARAMETERS_FOR_CUSTOM_TOTP); } - /** - * @test - */ + #[Test] public function test_create_custom_totp_from_parameters_returns_correct_value() { $twofaccount = new TwoFAccount; @@ -330,9 +304,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertStringEndsWith('.png', $twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_create_basic_totp_from_parameters_returns_correct_value() { $twofaccount = new TwoFAccount; @@ -349,9 +321,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertEquals(null, $twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_create_custom_hotp_from_parameters_returns_correct_value() { $twofaccount = new TwoFAccount; @@ -368,9 +338,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertStringEndsWith('.png', $twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_create_basic_hotp_from_parameters_returns_correct_value() { $twofaccount = new TwoFAccount; @@ -387,9 +355,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertEquals(null, $twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_create_from_parameters_persists_correct_values_to_db() { $twofaccount = new TwoFAccount; @@ -410,9 +376,7 @@ class TwoFAccountModelTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_create_from_unsupported_parameters_returns_unsupportedOtpTypeException() { $this->expectException(\App\Exceptions\UnsupportedOtpTypeException::class); @@ -420,9 +384,7 @@ class TwoFAccountModelTest extends FeatureTestCase $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_PARAMETERS_FOR_UNSUPPORTED_OTP_TYPE); } - /** - * @test - */ + #[Test] public function test_create_from_invalid_parameters_type_returns_InvalidOtpParameterException() { $this->expectException(\App\Exceptions\InvalidOtpParameterException::class); @@ -434,9 +396,7 @@ class TwoFAccountModelTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_create_from_invalid_parameters_returns_InvalidOtpParameterException() { $this->expectException(\App\Exceptions\InvalidOtpParameterException::class); @@ -448,9 +408,7 @@ class TwoFAccountModelTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_update_totp_returns_updated_model() { $twofaccount = $this->customTotpTwofaccount; @@ -468,9 +426,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertEquals(null, $twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_update_hotp_returns_updated_model() { $twofaccount = $this->customTotpTwofaccount; @@ -488,9 +444,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertEquals(null, $twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_update_totp_persists_updated_model() { $twofaccount = $this->customTotpTwofaccount; @@ -510,9 +464,7 @@ class TwoFAccountModelTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_getOTP_for_totp_returns_the_same_password() { Http::preventStrayRequests(); @@ -540,9 +492,7 @@ class TwoFAccountModelTest extends FeatureTestCase } } - /** - * @test - */ + #[Test] public function test_getOTP_for_hotp_returns_the_same_password() { Http::preventStrayRequests(); @@ -565,9 +515,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertEquals($otp_from_model, $otp_from_parameters); } - /** - * @test - */ + #[Test] public function test_getOTP_for_steamtotp_returns_the_same_password() { $twofaccount = new TwoFAccount; @@ -587,9 +535,7 @@ class TwoFAccountModelTest extends FeatureTestCase } } - /** - * @test - */ + #[Test] public function test_getOTP_for_totp_with_invalid_secret_returns_InvalidSecretException() { $twofaccount = new TwoFAccount; @@ -598,9 +544,7 @@ class TwoFAccountModelTest extends FeatureTestCase $otp_from_uri = $twofaccount->fillWithURI('otpauth://totp/' . OtpTestData::ACCOUNT . '?secret=1.0')->getOTP(); } - /** - * @test - */ + #[Test] public function test_getOTP_for_totp_with_undecipherable_secret_returns_UndecipherableException() { $twofaccount = new TwoFAccount; @@ -613,9 +557,7 @@ class TwoFAccountModelTest extends FeatureTestCase ])->getOTP(); } - /** - * @test - */ + #[Test] public function test_getURI_for_custom_totp_model_returns_uri() { $uri = $this->customTotpTwofaccount->getURI(); @@ -629,9 +571,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertStringContainsString('algorithm=' . OtpTestData::ALGORITHM_CUSTOM, $uri); } - /** - * @test - */ + #[Test] public function test_getURI_for_custom_hotp_model_returns_uri() { $uri = $this->customHotpTwofaccount->getURI(); @@ -645,9 +585,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertStringContainsString('algorithm=' . OtpTestData::ALGORITHM_CUSTOM, $uri); } - /** - * @test - */ + #[Test] public function test_fill_succeed_when_image_fetching_fails() { Http::preventStrayRequests(); @@ -662,9 +600,7 @@ class TwoFAccountModelTest extends FeatureTestCase Storage::disk('imagesLink')->assertDirectoryEmpty('/'); } - /** - * @test - */ + #[Test] public function test_saving_totp_without_period_set_default_one() { $twofaccount = new TwoFAccount; @@ -680,9 +616,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertEquals(TwoFAccount::DEFAULT_PERIOD, $account->period); } - /** - * @test - */ + #[Test] public function test_saving_hotp_without_counter_set_default_one() { $twofaccount = new TwoFAccount; @@ -698,9 +632,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertEquals(TwoFAccount::DEFAULT_COUNTER, $account->counter); } - /** - * @test - */ + #[Test] public function test_equals_returns_true() { $twofaccount = new TwoFAccount; @@ -719,9 +651,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertTrue($twofaccount->equals($this->customTotpTwofaccount)); } - /** - * @test - */ + #[Test] public function test_equals_returns_false() { $twofaccount = new TwoFAccount; @@ -740,9 +670,7 @@ class TwoFAccountModelTest extends FeatureTestCase $this->assertFalse($twofaccount->equals($this->customHotpTwofaccount)); } - /** - * @test - */ + #[Test] #[DataProvider('iconResourceProvider')] public function test_set_icon_stores_and_set_the_icon($res, $ext) { @@ -787,9 +715,7 @@ class TwoFAccountModelTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('invalidIconResourceProvider')] public function test_set_invalid_icon_ends_without_error($res, $ext) { diff --git a/tests/Feature/Models/UserModelTest.php b/tests/Feature/Models/UserModelTest.php index 5b78bcdf..25053329 100644 --- a/tests/Feature/Models/UserModelTest.php +++ b/tests/Feature/Models/UserModelTest.php @@ -7,11 +7,13 @@ use App\Models\Group; use App\Models\TwoFAccount; use App\Models\User; use Illuminate\Auth\Events\PasswordReset; +use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Password; use Illuminate\Support\Facades\Storage; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\Data\OtpTestData; use Tests\FeatureTestCase; @@ -21,9 +23,7 @@ use Tests\FeatureTestCase; #[CoversClass(User::class)] class UserModelTest extends FeatureTestCase { - /** - * @test - */ + #[Test] public function test_admin_scope_returns_only_admin() { User::factory()->count(4)->create(); @@ -44,9 +44,7 @@ class UserModelTest extends FeatureTestCase $this->assertEquals($admins[1]->name, $secondAdmin->name); } - /** - * @test - */ + #[Test] public function test_isAdministrator_returns_correct_state() { $user = User::factory()->create(); @@ -56,9 +54,7 @@ class UserModelTest extends FeatureTestCase $this->assertEquals($admin->isAdministrator(), true); } - /** - * @test - */ + #[Test] public function test_promoteToAdministrator_sets_administrator_status() { $user = User::factory()->create(); @@ -68,9 +64,7 @@ class UserModelTest extends FeatureTestCase $this->assertEquals($user->isAdministrator(), true); } - /** - * @test - */ + #[Test] public function test_promoteToAdministrator_demote_administrator_status() { $admin = User::factory()->administrator()->create(); @@ -84,9 +78,7 @@ class UserModelTest extends FeatureTestCase $this->assertFalse($admin->isAdministrator()); } - /** - * @test - */ + #[Test] public function test_resetPassword_resets_password_with_success() { $user = User::factory()->create(); @@ -97,9 +89,7 @@ class UserModelTest extends FeatureTestCase $this->assertNotEquals($user->password, $oldPassword); } - /** - * @test - */ + #[Test] public function test_resetPassword_dispatch_event() { Event::fake(); @@ -111,11 +101,14 @@ class UserModelTest extends FeatureTestCase ); } - /** - * @test - */ + #[Test] public function test_delete_removes_user_data() { + Artisan::call('passport:install', [ + '--verbose' => 2, + '--no-interaction' => 1 + ]); + $user = User::factory()->create(); TwoFAccount::factory()->for($user)->create(); AuthLog::factory()->for($user, 'authenticatable')->create(); @@ -165,9 +158,7 @@ class UserModelTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_delete_flushes_icons_of_user_twofaccounts() { Storage::fake('icons'); @@ -184,9 +175,7 @@ class UserModelTest extends FeatureTestCase Storage::disk('icons')->assertMissing($twofaccount->icon); } - /** - * @test - */ + #[Test] public function test_delete_does_not_delete_the_only_admin() { $admin = User::factory()->administrator()->create(); diff --git a/tests/Feature/RouteTest.php b/tests/Feature/RouteTest.php index 0cb98b31..143ff4c0 100644 --- a/tests/Feature/RouteTest.php +++ b/tests/Feature/RouteTest.php @@ -2,15 +2,12 @@ namespace Tests\Feature; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; class RouteTest extends FeatureTestCase { - /** - * test return main web view - * - * @test - */ + #[Test] public function test_landing_view_is_returned() { $response = $this->get(route('landing', ['any' => '/'])); @@ -19,11 +16,7 @@ class RouteTest extends FeatureTestCase ->assertViewIs('landing'); } - /** - * test return main web view - * - * @test - */ + #[Test] public function test_exception_handler_with_web_route() { $response = $this->post('/'); diff --git a/tests/Feature/Services/GroupServiceTest.php b/tests/Feature/Services/GroupServiceTest.php index e5b97dd0..b7b45024 100644 --- a/tests/Feature/Services/GroupServiceTest.php +++ b/tests/Feature/Services/GroupServiceTest.php @@ -9,6 +9,7 @@ use App\Models\User; use App\Services\GroupService; use Illuminate\Auth\Access\AuthorizationException; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -48,9 +49,6 @@ class GroupServiceTest extends FeatureTestCase private const NEW_GROUP_NAME = 'MyNewGroup'; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -76,9 +74,7 @@ class GroupServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_assign_a_twofaccount_to_a_group_persists_the_relation() { Groups::assign($this->twofaccountOne->id, $this->user, $this->groupTwo); @@ -89,9 +85,7 @@ class GroupServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_assign_multiple_twofaccounts_to_group_persists_the_relation() { Groups::assign([$this->twofaccountOne->id, $this->twofaccountTwo->id], $this->user, $this->groupTwo); @@ -106,9 +100,7 @@ class GroupServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_assign_a_twofaccount_to_no_group_assigns_to_user_default_group() { $this->user['preferences->defaultGroup'] = $this->groupTwo->id; @@ -122,9 +114,7 @@ class GroupServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_assign_a_twofaccount_to_no_group_assigns_to_user_active_group() { $this->user['preferences->defaultGroup'] = -1; @@ -139,9 +129,7 @@ class GroupServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_assign_a_twofaccount_to_missing_active_group_returns_not_found() { $orginalGroup = $this->twofaccountOne->group_id; @@ -158,9 +146,7 @@ class GroupServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_user_can_assign_an_account() { $this->expectException(AuthorizationException::class); @@ -168,9 +154,7 @@ class GroupServiceTest extends FeatureTestCase Groups::assign($this->twofaccountThree->id, $this->user, $this->user->groups()->first()); } - /** - * @test - */ + #[Test] public function test_user_can_assign_multiple_accounts() { $this->expectException(AuthorizationException::class); @@ -178,9 +162,7 @@ class GroupServiceTest extends FeatureTestCase Groups::assign([$this->twofaccountOne->id, $this->twofaccountThree->id], $this->user, $this->user->groups()->first()); } - /** - * @test - */ + #[Test] public function test_prependTheAllGroup_add_the_group_on_top_of_groups() { $groups = Groups::prependTheAllGroup($this->user->groups, $this->user); diff --git a/tests/Feature/Services/LogoServiceTest.php b/tests/Feature/Services/LogoServiceTest.php index c4e9c282..92d05972 100644 --- a/tests/Feature/Services/LogoServiceTest.php +++ b/tests/Feature/Services/LogoServiceTest.php @@ -7,6 +7,7 @@ use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Storage; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\Data\HttpRequestTestData; use Tests\TestCase; @@ -18,17 +19,12 @@ class LogoServiceTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ public function setUp() : void { parent::setUp(); } - /** - * @test - */ + #[Test] public function test_getIcon_returns_stored_icon_file_when_logo_exists() { $svgLogo = HttpRequestTestData::SVG_LOGO_BODY; @@ -50,9 +46,7 @@ class LogoServiceTest extends TestCase Storage::disk('icons')->assertExists($icon); } - /** - * @test - */ + #[Test] public function test_getIcon_returns_null_when_github_request_fails() { Http::preventStrayRequests(); @@ -69,9 +63,7 @@ class LogoServiceTest extends TestCase $this->assertEquals(null, $icon); } - /** - * @test - */ + #[Test] public function test_getIcon_returns_null_when_logo_fetching_fails() { $tfaJsonBody = HttpRequestTestData::TFA_JSON_BODY; @@ -90,9 +82,7 @@ class LogoServiceTest extends TestCase $this->assertEquals(null, $icon); } - /** - * @test - */ + #[Test] public function test_getIcon_returns_null_when_no_logo_exists() { $logoService = new LogoService(); @@ -102,9 +92,7 @@ class LogoServiceTest extends TestCase $this->assertEquals(null, $icon); } - /** - * @test - */ + #[Test] public function test_logoService_loads_empty_collection_when_tfajson_fetching_fails() { $svgLogo = HttpRequestTestData::SVG_LOGO_BODY; diff --git a/tests/Feature/Services/QrCodeServiceTest.php b/tests/Feature/Services/QrCodeServiceTest.php index 28c7f4ca..96786327 100644 --- a/tests/Feature/Services/QrCodeServiceTest.php +++ b/tests/Feature/Services/QrCodeServiceTest.php @@ -5,6 +5,7 @@ namespace Tests\Feature\Services; use App\Facades\QrCode; use App\Services\QrCodeService; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\Classes\LocalFile; use Tests\FeatureTestCase; @@ -21,25 +22,18 @@ class QrCodeServiceTest extends FeatureTestCase private const DECODED_IMAGE = 'otpauth://totp/test@test.com?secret=A4GRFHVIRBGY7UIW'; - /** - * @test - */ public function setUp() : void { parent::setUp(); } - /** - * @test - */ + #[Test] public function test_encode_returns_correct_value() { $this->assertEquals(self::STRING_ENCODED, QrCode::encode(self::STRING_TO_ENCODE)); } - /** - * @test - */ + #[Test] public function test_decode_valid_image_returns_correct_value() { $file = LocalFile::fake()->validQrcode(); @@ -47,9 +41,7 @@ class QrCodeServiceTest extends FeatureTestCase $this->assertEquals(self::DECODED_IMAGE, QrCode::decode($file)); } - /** - * @test - */ + #[Test] public function test_decode_invalid_image_returns_correct_value() { $this->expectException(\App\Exceptions\InvalidQrCodeException::class); diff --git a/tests/Feature/Services/ReleaseRadarServiceTest.php b/tests/Feature/Services/ReleaseRadarServiceTest.php index b12a77a1..f4cdaa80 100644 --- a/tests/Feature/Services/ReleaseRadarServiceTest.php +++ b/tests/Feature/Services/ReleaseRadarServiceTest.php @@ -8,6 +8,7 @@ use Facades\App\Services\ReleaseRadarService; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Support\Facades\Http; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\Data\HttpRequestTestData; use Tests\FeatureTestCase; @@ -19,9 +20,7 @@ class ReleaseRadarServiceTest extends FeatureTestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] public function test_manualScan_returns_no_new_release() { $url = config('2fauth.latestReleaseUrl'); @@ -41,9 +40,7 @@ class ReleaseRadarServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_manualScan_returns_new_release() { $url = config('2fauth.latestReleaseUrl'); @@ -63,9 +60,7 @@ class ReleaseRadarServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_manualScan_complete_when_http_call_fails() { // We do not fake the http request so an exception will be thrown @@ -74,9 +69,7 @@ class ReleaseRadarServiceTest extends FeatureTestCase $this->assertNull(ReleaseRadarService::manualScan()); } - /** - * @test - */ + #[Test] public function test_manualScan_succeed_when_github_is_unreachable() { $url = config('2fauth.latestReleaseUrl'); @@ -89,9 +82,7 @@ class ReleaseRadarServiceTest extends FeatureTestCase $this->assertNull(ReleaseRadarService::manualScan()); } - /** - * @test - */ + #[Test] public function test_scheduleScan_runs_after_one_week() { $url = config('2fauth.latestReleaseUrl'); @@ -119,9 +110,7 @@ class ReleaseRadarServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_scheduleScan_does_not_run_before_one_week() { $url = config('2fauth.latestReleaseUrl'); @@ -149,9 +138,7 @@ class ReleaseRadarServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_scheduleScan_complete_when_http_call_fails() { // We do not fake the http request so an exception will be thrown diff --git a/tests/Feature/Services/SettingServiceTest.php b/tests/Feature/Services/SettingServiceTest.php index d0600390..87508f2e 100644 --- a/tests/Feature/Services/SettingServiceTest.php +++ b/tests/Feature/Services/SettingServiceTest.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\DB; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\FeatureTestCase; /** @@ -62,9 +63,6 @@ class SettingServiceTest extends FeatureTestCase private const TOTP_FULL_CUSTOM_URI = 'otpauth://totp/' . self::SERVICE . ':' . self::ACCOUNT . '?secret=' . self::SECRET . '&issuer=' . self::SERVICE . '&digits=' . self::DIGITS_CUSTOM . '&period=' . self::PERIOD_CUSTOM . '&algorithm=' . self::ALGORITHM_CUSTOM . '&image=' . self::IMAGE; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -96,9 +94,7 @@ class SettingServiceTest extends FeatureTestCase $this->twofaccountTwo->save(); } - /** - * @test - */ + #[Test] public function test_get_string_setting_returns_correct_value() { Settings::set(self::SETTING_NAME, self::SETTING_VALUE_STRING); @@ -106,9 +102,7 @@ class SettingServiceTest extends FeatureTestCase $this->assertEquals(self::SETTING_VALUE_STRING, Settings::get(self::SETTING_NAME)); } - /** - * @test - */ + #[Test] public function test_get_boolean_setting_returns_true() { Settings::set(self::SETTING_NAME, self::SETTING_VALUE_TRUE_TRANSFORMED); @@ -116,9 +110,7 @@ class SettingServiceTest extends FeatureTestCase $this->assertEquals(true, Settings::get(self::SETTING_NAME)); } - /** - * @test - */ + #[Test] public function test_get_boolean_setting_returns_false() { Settings::set(self::SETTING_NAME, self::SETTING_VALUE_FALSE_TRANSFORMED); @@ -126,9 +118,7 @@ class SettingServiceTest extends FeatureTestCase $this->assertEquals(false, Settings::get(self::SETTING_NAME)); } - /** - * @test - */ + #[Test] public function test_get_int_setting_returns_int() { Settings::set(self::SETTING_NAME, self::SETTING_VALUE_INT); @@ -139,9 +129,7 @@ class SettingServiceTest extends FeatureTestCase $this->assertIsInt($value); } - /** - * @test - */ + #[Test] public function test_get_float_setting_returns_float() { Settings::set(self::SETTING_NAME, self::SETTING_VALUE_FLOAT); @@ -152,9 +140,7 @@ class SettingServiceTest extends FeatureTestCase $this->assertIsFloat($value); } - /** - * @test - */ + #[Test] public function test_all_returns_default_and_overloaded_settings() { $default_options = config('2fauth.settings'); @@ -172,9 +158,7 @@ class SettingServiceTest extends FeatureTestCase } } - /** - * @test - */ + #[Test] public function test_set_setting_persist_correct_value_in_db_and_cache() { $value = Settings::set(self::SETTING_NAME, self::SETTING_VALUE_STRING); @@ -188,9 +172,7 @@ class SettingServiceTest extends FeatureTestCase $this->assertEquals($cached->get(self::SETTING_NAME), self::SETTING_VALUE_STRING); } - /** - * @test - */ + #[Test] public function test_set_useEncryption_on_encrypts_all_accounts() { Settings::set('useEncryption', true); @@ -204,9 +186,7 @@ class SettingServiceTest extends FeatureTestCase }); } - /** - * @test - */ + #[Test] public function test_set_useEncryption_on_twice_prevents_successive_encryption() { Settings::set('useEncryption', true); @@ -221,9 +201,7 @@ class SettingServiceTest extends FeatureTestCase }); } - /** - * @test - */ + #[Test] public function test_set_useEncryption_off_decrypts_all_accounts() { Settings::set('useEncryption', true); @@ -238,9 +216,7 @@ class SettingServiceTest extends FeatureTestCase }); } - /** - * @test - */ + #[Test] #[DataProvider('provideUndecipherableData')] public function test_set_useEncryption_off_returns_exception_when_data_are_undecipherable(array $data) { @@ -275,9 +251,7 @@ class SettingServiceTest extends FeatureTestCase ]; } - /** - * @test - */ + #[Test] public function test_set_array_of_settings_persist_correct_values() { $value = Settings::set([ @@ -300,9 +274,7 @@ class SettingServiceTest extends FeatureTestCase $this->assertEquals($cached->get(self::SETTING_NAME_ALT), self::SETTING_VALUE_INT); } - /** - * @test - */ + #[Test] public function test_set_true_setting_persist_transformed_boolean() { $value = Settings::set(self::SETTING_NAME, true); @@ -313,9 +285,7 @@ class SettingServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_set_false_setting_persist_transformed_boolean() { $value = Settings::set(self::SETTING_NAME, false); @@ -326,9 +296,7 @@ class SettingServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_del_remove_setting_from_db_and_cache() { DB::table('options')->insert( @@ -345,9 +313,7 @@ class SettingServiceTest extends FeatureTestCase $this->assertFalse($cached->has(self::SETTING_NAME)); } - /** - * @test - */ + #[Test] public function test_isEdited_returns_true() { DB::table('options')->insert( @@ -357,9 +323,7 @@ class SettingServiceTest extends FeatureTestCase $this->assertTrue(Settings::isEdited('showOtpAsDot')); } - /** - * @test - */ + #[Test] public function test_isEdited_returns_false() { DB::table('options')->where(self::KEY, 'showOtpAsDot')->delete(); @@ -367,9 +331,7 @@ class SettingServiceTest extends FeatureTestCase $this->assertFalse(Settings::isEdited('showOtpAsDot')); } - /** - * @test - */ + #[Test] public function test_cache_is_requested_at_instanciation() { Cache::shouldReceive('remember') @@ -380,9 +342,7 @@ class SettingServiceTest extends FeatureTestCase Cache::shouldHaveReceived('remember'); } - /** - * @test - */ + #[Test] public function test_cache_is_updated_when_setting_is_set() { Cache::shouldReceive('remember', 'put') @@ -394,9 +354,7 @@ class SettingServiceTest extends FeatureTestCase Cache::shouldHaveReceived('put'); } - /** - * @test - */ + #[Test] public function test_cache_is_updated_when_setting_is_deleted() { Cache::shouldReceive('remember', 'put') diff --git a/tests/Feature/Services/TwoFAccountServiceTest.php b/tests/Feature/Services/TwoFAccountServiceTest.php index bcdf4af2..64a3a8c4 100644 --- a/tests/Feature/Services/TwoFAccountServiceTest.php +++ b/tests/Feature/Services/TwoFAccountServiceTest.php @@ -8,6 +8,7 @@ use App\Models\TwoFAccount; use App\Models\User; use App\Services\TwoFAccountService; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\Data\MigrationTestData; use Tests\Data\OtpTestData; use Tests\FeatureTestCase; @@ -38,9 +39,6 @@ class TwoFAccountServiceTest extends FeatureTestCase protected $userGroupB; - /** - * @test - */ public function setUp() : void { parent::setUp(); @@ -76,9 +74,7 @@ class TwoFAccountServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_withdraw_comma_separated_ids_deletes_relation() { $twofaccounts = collect([$this->customHotpTwofaccount, $this->customTotpTwofaccount]); @@ -107,9 +103,7 @@ class TwoFAccountServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_withdraw_array_of_ids_deletes_relation() { $twofaccounts = collect([$this->customHotpTwofaccount, $this->customTotpTwofaccount]); @@ -137,9 +131,7 @@ class TwoFAccountServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_withdraw_single_id_deletes_relation() { $twofaccounts = collect([$this->customHotpTwofaccount, $this->customTotpTwofaccount]); @@ -158,17 +150,13 @@ class TwoFAccountServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_withdraw_missing_ids_returns_void() { $this->assertNull(TwoFAccounts::withdraw(null)); } - /** - * @test - */ + #[Test] public function test_migrate_from_gauth_returns_correct_accounts() { $this->actingAs($this->user); @@ -196,9 +184,7 @@ class TwoFAccountServiceTest extends FeatureTestCase $this->assertEquals(OtpTestData::ALGORITHM_DEFAULT, $twofaccounts->last()->algorithm); } - /** - * @test - */ + #[Test] public function test_migrate_from_gauth_returns_flagged_duplicates() { $this->actingAs($this->user, 'api-guard'); @@ -227,18 +213,14 @@ class TwoFAccountServiceTest extends FeatureTestCase $this->assertEquals(-1, $twofaccounts->last()->id); } - /** - * @test - */ + #[Test] public function test_migrate_invalid_migration_from_gauth_returns_InvalidMigrationData_exception() { $this->expectException(\App\Exceptions\InvalidMigrationDataException::class); $twofaccounts = TwoFAccounts::migrate(MigrationTestData::GOOGLE_AUTH_MIGRATION_URI_WITH_INVALID_DATA); } - /** - * @test - */ + #[Test] public function test_export_single_id_returns_collection() { $twofaccounts = TwoFAccounts::export($this->customTotpTwofaccount->id); @@ -247,9 +229,7 @@ class TwoFAccountServiceTest extends FeatureTestCase $this->assertObjectEquals($this->customTotpTwofaccount, $twofaccounts->first()); } - /** - * @test - */ + #[Test] public function test_export_comma_separated_ids_returns_collection() { $twofaccounts = TwoFAccounts::export($this->customTotpTwofaccount->id . ',' . $this->customHotpTwofaccount->id); @@ -259,9 +239,7 @@ class TwoFAccountServiceTest extends FeatureTestCase $this->assertObjectEquals($this->customHotpTwofaccount, $twofaccounts->last()); } - /** - * @test - */ + #[Test] public function test_export_array_of_ids_returns_collection() { $twofaccounts = TwoFAccounts::export([$this->customTotpTwofaccount->id, $this->customHotpTwofaccount->id]); @@ -271,9 +249,7 @@ class TwoFAccountServiceTest extends FeatureTestCase $this->assertObjectEquals($this->customHotpTwofaccount, $twofaccounts->last()); } - /** - * @test - */ + #[Test] public function test_delete_comma_separated_ids() { $twofaccounts = TwoFAccount::factory()->count(2)->for($this->user)->create(); @@ -295,9 +271,7 @@ class TwoFAccountServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_delete_array_of_ids() { $twofaccounts = TwoFAccount::factory()->count(2)->for($this->user)->create(); @@ -319,9 +293,7 @@ class TwoFAccountServiceTest extends FeatureTestCase ]); } - /** - * @test - */ + #[Test] public function test_delete_single_id() { $twofaccount = TwoFAccount::factory()->for($this->user)->create(); diff --git a/tests/FeatureTestCase.php b/tests/FeatureTestCase.php index 478a6059..888e3263 100644 --- a/tests/FeatureTestCase.php +++ b/tests/FeatureTestCase.php @@ -22,6 +22,6 @@ abstract class FeatureTestCase extends BaseTestCase */ protected function afterRefreshingDatabase() { - Artisan::call('passport:install', ['--verbose' => 2]); + // } } diff --git a/tests/Unit/Api/v1/Controllers/GroupControllerTest.php b/tests/Unit/Api/v1/Controllers/GroupControllerTest.php index 98d891da..40d4ff5b 100644 --- a/tests/Unit/Api/v1/Controllers/GroupControllerTest.php +++ b/tests/Unit/Api/v1/Controllers/GroupControllerTest.php @@ -14,6 +14,7 @@ use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Http\Request; use Mockery; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -41,9 +42,7 @@ class GroupControllerTest extends TestCase $this->app['auth']->shouldUse(null); } - /** - * @test - */ + #[Test] public function test_index_returns_api_resources() { $user = Mockery::mock(User::class); @@ -67,9 +66,7 @@ class GroupControllerTest extends TestCase $this->assertContainsOnlyInstancesOf(GroupResource::class, $response->collection); } - /** - * @test - */ + #[Test] public function test_store_uses_validated_data_and_returns_api_resource() { $request = Mockery::mock(GroupStoreRequest::class); @@ -88,9 +85,7 @@ class GroupControllerTest extends TestCase // $this->assertInstanceOf(GroupResource::class, $response); } - /** - * @test - */ + #[Test] public function test_show_returns_api_resource() { $controller = Mockery::mock(GroupController::class)->makePartial(); @@ -101,9 +96,7 @@ class GroupControllerTest extends TestCase $this->assertInstanceOf(GroupResource::class, $response); } - /** - * @test - */ + #[Test] public function test_update_validates_data_and_returns_api_resource() { $request = Mockery::mock(GroupStoreRequest::class); @@ -120,9 +113,7 @@ class GroupControllerTest extends TestCase $this->assertInstanceOf(GroupResource::class, $response); } - /** - * @test - */ + #[Test] public function test_assignAccounts_returns_api_resource_assigned_using_groupService() { $request = Mockery::mock(GroupAssignRequest::class); @@ -144,9 +135,7 @@ class GroupControllerTest extends TestCase $this->assertInstanceOf(GroupResource::class, $response); } - /** - * @test - */ + #[Test] public function test_accounts_returns_api_resources() { $controller = Mockery::mock(GroupController::class)->makePartial(); @@ -157,9 +146,7 @@ class GroupControllerTest extends TestCase $this->assertContainsOnlyInstancesOf(TwoFAccountReadResource::class, $response->collection); } - /** - * @test - */ + #[Test] public function test_destroy_uses_group_service() { $controller = Mockery::mock(GroupController::class)->makePartial(); diff --git a/tests/Unit/Events/GroupDeletedTest.php b/tests/Unit/Events/GroupDeletedTest.php index 6a358d24..385cfd45 100644 --- a/tests/Unit/Events/GroupDeletedTest.php +++ b/tests/Unit/Events/GroupDeletedTest.php @@ -5,6 +5,7 @@ namespace Tests\Unit\Events; use App\Events\GroupDeleted; use App\Models\Group; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -13,9 +14,7 @@ use Tests\TestCase; #[CoversClass(GroupDeleted::class)] class GroupDeletedTest extends TestCase { - /** - * @test - */ + #[Test] public function test_event_constructor() { $group = Group::factory()->make(); diff --git a/tests/Unit/Events/GroupDeletingTest.php b/tests/Unit/Events/GroupDeletingTest.php index 57b61cf5..fe907de2 100644 --- a/tests/Unit/Events/GroupDeletingTest.php +++ b/tests/Unit/Events/GroupDeletingTest.php @@ -5,6 +5,7 @@ namespace Tests\Unit\Events; use App\Events\GroupDeleting; use App\Models\Group; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -13,9 +14,7 @@ use Tests\TestCase; #[CoversClass(GroupDeleting::class)] class GroupDeletingTest extends TestCase { - /** - * @test - */ + #[Test] public function test_event_constructor() { $group = Group::factory()->make(); diff --git a/tests/Unit/Events/TwoFAccountDeletedTest.php b/tests/Unit/Events/TwoFAccountDeletedTest.php index 234e7da7..24d0b086 100644 --- a/tests/Unit/Events/TwoFAccountDeletedTest.php +++ b/tests/Unit/Events/TwoFAccountDeletedTest.php @@ -7,6 +7,7 @@ use App\Models\TwoFAccount; use App\Services\SettingService; use Mockery\MockInterface; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -15,9 +16,7 @@ use Tests\TestCase; #[CoversClass(TwoFAccountDeleted::class)] class TwoFAccountDeletedTest extends TestCase { - /** - * @test - */ + #[Test] public function test_event_constructor() { $settingService = $this->mock(SettingService::class, function (MockInterface $settingService) { diff --git a/tests/Unit/Exceptions/HandlerTest.php b/tests/Unit/Exceptions/HandlerTest.php index 8ff5876f..37b74073 100644 --- a/tests/Unit/Exceptions/HandlerTest.php +++ b/tests/Unit/Exceptions/HandlerTest.php @@ -17,6 +17,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -25,9 +26,7 @@ use Tests\TestCase; #[CoversClass(Handler::class)] class HandlerTest extends TestCase { - /** - * @test - */ + #[Test] #[DataProvider('provideExceptionsforBadRequest')] public function test_exceptions_returns_badRequest_json_response($exception) { @@ -85,9 +84,7 @@ class HandlerTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideExceptionsforNotFound')] public function test_exceptions_returns_notFound_json_response($exception) { @@ -124,9 +121,7 @@ class HandlerTest extends TestCase ]; } - /** - * @test - */ + #[Test] public function test_authenticationException_returns_unauthorized_json_response() { $request = $this->createMock(Request::class); @@ -150,9 +145,7 @@ class HandlerTest extends TestCase ]); } - /** - * @test - */ + #[Test] public function test_authenticationException_returns_proxyAuthRequired_json_response_with_proxy_guard() { $request = $this->createMock(Request::class); @@ -176,9 +169,7 @@ class HandlerTest extends TestCase ]); } - /** - * @test - */ + #[Test] public function test_AccessDeniedException_returns_forbidden_json_response() { $request = $this->createMock(Request::class); diff --git a/tests/Unit/GroupModelTest.php b/tests/Unit/GroupModelTest.php index 3ebb8e4c..a7ca585d 100644 --- a/tests/Unit/GroupModelTest.php +++ b/tests/Unit/GroupModelTest.php @@ -8,6 +8,7 @@ use App\Models\Group; use App\Models\TwoFAccount; use Illuminate\Database\Eloquent\Relations\BelongsTo; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\ModelTestCase; /** @@ -16,9 +17,7 @@ use Tests\ModelTestCase; #[CoversClass(Group::class)] class GroupModelTest extends ModelTestCase { - /** - * @test - */ + #[Test] public function test_model_configuration() { $this->runConfigurationAssertions( @@ -39,9 +38,7 @@ class GroupModelTest extends ModelTestCase ); } - /** - * @test - */ + #[Test] public function test_twofaccounts_relation() { $group = new Group(); @@ -49,9 +46,7 @@ class GroupModelTest extends ModelTestCase $this->assertHasManyRelation($accounts, $group, new TwoFAccount()); } - /** - * @test - */ + #[Test] public function test_user_relation() { $model = new Group; diff --git a/tests/Unit/HelpersTest.php b/tests/Unit/HelpersTest.php index ad261aff..f713d821 100644 --- a/tests/Unit/HelpersTest.php +++ b/tests/Unit/HelpersTest.php @@ -5,6 +5,7 @@ namespace Tests\Unit; use App\Helpers\Helpers; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -13,9 +14,7 @@ use Tests\TestCase; #[CoversClass(Helpers::class)] class HelpersTest extends TestCase { - /** - * @test - */ + #[Test] #[DataProvider('versionNumberProvider')] public function test_cleanVersionNumber_returns_cleaned_version($dirtyVersion, $expected) { @@ -49,9 +48,7 @@ class HelpersTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('invalidVersionNumberProvider')] public function test_cleanVersionNumber_returns_false_with_invalid_semver($dirtyVersion) { @@ -84,9 +81,7 @@ class HelpersTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('toBase32PaddedStringProvider')] public function test_toBase32Format_returns_base32_formated_string($str, $expected) { @@ -136,9 +131,7 @@ class HelpersTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('commaSeparatedToArrayProvider')] public function test_commaSeparatedToArray_returns_ids_in_array($str, $expected) { @@ -164,9 +157,7 @@ class HelpersTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('invalidCommaSeparatedToArrayProvider')] public function test_commaSeparatedToArray_returns_unchanged_ids($str, $expected) { diff --git a/tests/Unit/Listeners/Authentication/FailedLoginListenerTest.php b/tests/Unit/Listeners/Authentication/FailedLoginListenerTest.php index 9d6df3e2..42025cc2 100644 --- a/tests/Unit/Listeners/Authentication/FailedLoginListenerTest.php +++ b/tests/Unit/Listeners/Authentication/FailedLoginListenerTest.php @@ -6,6 +6,7 @@ use App\Listeners\Authentication\FailedLoginListener; use Illuminate\Auth\Events\Failed; use Illuminate\Support\Facades\Event; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -14,9 +15,7 @@ use Tests\TestCase; #[CoversClass(FailedLoginListener::class)] class FailedLoginListenerTest extends TestCase { - /** - * @test - */ + #[Test] public function test_FailedLoginListener_listen_to_Failed_event() { Event::fake(); diff --git a/tests/Unit/Listeners/Authentication/LoginListenerTest.php b/tests/Unit/Listeners/Authentication/LoginListenerTest.php index 790e37b8..790cd5dc 100644 --- a/tests/Unit/Listeners/Authentication/LoginListenerTest.php +++ b/tests/Unit/Listeners/Authentication/LoginListenerTest.php @@ -6,6 +6,7 @@ use App\Listeners\Authentication\LoginListener; use Illuminate\Auth\Events\Login; use Illuminate\Support\Facades\Event; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -14,9 +15,7 @@ use Tests\TestCase; #[CoversClass(LoginListener::class)] class LoginListenerTest extends TestCase { - /** - * @test - */ + #[Test] public function test_LoginListener_listen_to_Login_event() { Event::fake(); diff --git a/tests/Unit/Listeners/Authentication/LogoutListenerTest.php b/tests/Unit/Listeners/Authentication/LogoutListenerTest.php index d95b1474..74016f6e 100644 --- a/tests/Unit/Listeners/Authentication/LogoutListenerTest.php +++ b/tests/Unit/Listeners/Authentication/LogoutListenerTest.php @@ -6,6 +6,7 @@ use App\Listeners\Authentication\LogoutListener; use Illuminate\Auth\Events\Logout; use Illuminate\Support\Facades\Event; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -14,9 +15,7 @@ use Tests\TestCase; #[CoversClass(LogoutListener::class)] class LogoutListenerTest extends TestCase { - /** - * @test - */ + #[Test] public function test_LogoutListener_listen_to_Logout_event() { Event::fake(); diff --git a/tests/Unit/Listeners/Authentication/VisitedByProxyUserListenerTest.php b/tests/Unit/Listeners/Authentication/VisitedByProxyUserListenerTest.php index 2669c1e5..c48bfc29 100644 --- a/tests/Unit/Listeners/Authentication/VisitedByProxyUserListenerTest.php +++ b/tests/Unit/Listeners/Authentication/VisitedByProxyUserListenerTest.php @@ -6,6 +6,7 @@ use App\Events\VisitedByProxyUser; use App\Listeners\Authentication\VisitedByProxyUserListener; use Illuminate\Support\Facades\Event; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -14,9 +15,7 @@ use Tests\TestCase; #[CoversClass(VisitedByProxyUserListener::class)] class VisitedByProxyUserListenerTest extends TestCase { - /** - * @test - */ + #[Test] public function test_VisitedByProxyUserListener_listen_to_VisitedByProxyUser_event() { Event::fake(); diff --git a/tests/Unit/Listeners/CleanIconStorageTest.php b/tests/Unit/Listeners/CleanIconStorageTest.php index 426486e9..a8cb85b9 100644 --- a/tests/Unit/Listeners/CleanIconStorageTest.php +++ b/tests/Unit/Listeners/CleanIconStorageTest.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Storage; use Mockery\MockInterface; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -18,9 +19,7 @@ use Tests\TestCase; #[CoversClass(CleanIconStorage::class)] class CleanIconStorageTest extends TestCase { - /** - * @test - */ + #[Test] public function test_it_deletes_icon_file_using_storage_facade() { $settingService = $this->mock(SettingService::class, function (MockInterface $settingService) { @@ -39,9 +38,7 @@ class CleanIconStorageTest extends TestCase $this->assertNull($listener->handle($event)); } - /** - * @test - */ + #[Test] public function test_CleanIconStorage_listen_to_TwoFAccountDeleted_event() { Event::fake(); diff --git a/tests/Unit/Listeners/DissociateTwofaccountFromGroupTest.php b/tests/Unit/Listeners/DissociateTwofaccountFromGroupTest.php index 55e96ff5..829494fa 100644 --- a/tests/Unit/Listeners/DissociateTwofaccountFromGroupTest.php +++ b/tests/Unit/Listeners/DissociateTwofaccountFromGroupTest.php @@ -6,6 +6,7 @@ use App\Events\GroupDeleting; use App\Listeners\DissociateTwofaccountFromGroup; use Illuminate\Support\Facades\Event; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -14,9 +15,7 @@ use Tests\TestCase; #[CoversClass(DissociateTwofaccountFromGroup::class)] class DissociateTwofaccountFromGroupTest extends TestCase { - /** - * @test - */ + #[Test] public function test_DissociateTwofaccountFromGroup_listen_to_groupDeleting_event() { Event::fake(); diff --git a/tests/Unit/Listeners/LogNotificationTest.php b/tests/Unit/Listeners/LogNotificationTest.php index a9553c5f..7d3acb1e 100644 --- a/tests/Unit/Listeners/LogNotificationTest.php +++ b/tests/Unit/Listeners/LogNotificationTest.php @@ -6,6 +6,7 @@ use App\Listeners\LogNotification; use Illuminate\Notifications\Events\NotificationSent; use Illuminate\Support\Facades\Event; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -14,9 +15,7 @@ use Tests\TestCase; #[CoversClass(LogNotification::class)] class LogNotificationTest extends TestCase { - /** - * @test - */ + #[Test] public function test_LogNotificationTest_listen_to_NotificationSent_event() { Event::fake(); diff --git a/tests/Unit/Listeners/RegisterOpenIdTest.php b/tests/Unit/Listeners/RegisterOpenIdTest.php index da9f38f7..573ddfe7 100644 --- a/tests/Unit/Listeners/RegisterOpenIdTest.php +++ b/tests/Unit/Listeners/RegisterOpenIdTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Event; use Laravel\Socialite\Contracts\Factory as SocialiteFactory; use Laravel\Socialite\SocialiteManager; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use SocialiteProviders\Manager\SocialiteWasCalled; use Tests\TestCase; @@ -17,9 +18,7 @@ use Tests\TestCase; #[CoversClass(RegisterOpenId::class)] class RegisterOpenIdTest extends TestCase { - /** - * @test - */ + #[Test] public function test_it_registers_openId_driver() { /** @var SocialiteManager $socialite */ @@ -30,9 +29,7 @@ class RegisterOpenIdTest extends TestCase $this->assertInstanceOf(OpenId::class, $driver); } - /** - * @test - */ + #[Test] public function test_RegisterOpenId_listen_to_SocialiteWasCalled_event() { Event::fake(); diff --git a/tests/Unit/Listeners/ReleaseRadarTest.php b/tests/Unit/Listeners/ReleaseRadarTest.php index b1b08254..05b6b694 100644 --- a/tests/Unit/Listeners/ReleaseRadarTest.php +++ b/tests/Unit/Listeners/ReleaseRadarTest.php @@ -8,6 +8,7 @@ use App\Services\ReleaseRadarService; use Illuminate\Support\Facades\Event; use Mockery\MockInterface; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -16,9 +17,7 @@ use Tests\TestCase; #[CoversClass(ReleaseRadar::class)] class ReleaseRadarTest extends TestCase { - /** - * @test - */ + #[Test] public function test_it_starts_release_scan() { $this->mock(ReleaseRadarService::class, function (MockInterface $releaseRadarService) { @@ -31,9 +30,7 @@ class ReleaseRadarTest extends TestCase $this->assertNull($listener->handle($event)); } - /** - * @test - */ + #[Test] public function test_ReleaseRadar_listen_to_ScanForNewReleaseCalled_event() { Event::fake(); diff --git a/tests/Unit/Listeners/ResetUsersPreferenceTest.php b/tests/Unit/Listeners/ResetUsersPreferenceTest.php index c3e83ac6..7f0d7b95 100644 --- a/tests/Unit/Listeners/ResetUsersPreferenceTest.php +++ b/tests/Unit/Listeners/ResetUsersPreferenceTest.php @@ -6,6 +6,7 @@ use App\Events\GroupDeleted; use App\Listeners\ResetUsersPreference; use Illuminate\Support\Facades\Event; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -14,9 +15,7 @@ use Tests\TestCase; #[CoversClass(ResetUsersPreference::class)] class ResetUsersPreferenceTest extends TestCase { - /** - * @test - */ + #[Test] public function test_ResetUsersPreference_listen_to_GroupDeleted_event() { Event::fake(); diff --git a/tests/Unit/MigratorTest.php b/tests/Unit/MigratorTest.php index 75832205..e859800e 100644 --- a/tests/Unit/MigratorTest.php +++ b/tests/Unit/MigratorTest.php @@ -20,6 +20,7 @@ use Mockery\MockInterface; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\UsesClass; +use PHPUnit\Framework\Attributes\Test; use Tests\Data\MigrationTestData; use Tests\Data\OtpTestData; use Tests\TestCase; @@ -150,9 +151,7 @@ class MigratorTest extends TestCase parent::tearDown(); } - /** - * @test - */ + #[Test] #[DataProvider('validMigrationsProvider')] public function test_migrate_returns_consistent_accounts(Migrator $migrator, mixed $payload, string $expected, bool $hasSteam) { @@ -226,9 +225,7 @@ class MigratorTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('invalidMigrationsProvider')] public function test_migrate_with_invalid_payload_returns_InvalidMigrationDataException(Migrator $migrator, mixed $payload) { @@ -295,9 +292,7 @@ class MigratorTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('migrationWithInvalidAccountsProvider')] public function test_migrate_returns_fake_accounts(Migrator $migrator, mixed $payload) { @@ -337,9 +332,7 @@ class MigratorTest extends TestCase ]; } - /** - * @test - */ + #[Test] public function test_migrate_gauth_returns_fake_accounts() { $migrator = $this->partialMock(GoogleAuthMigrator::class, function (MockInterface $migrator) { @@ -361,9 +354,7 @@ class MigratorTest extends TestCase $this->forgetMock(GoogleAuthMigrator::class); } - /** - * @test - */ + #[Test] #[DataProvider('AegisWithIconMigrationProvider')] public function test_migrate_aegis_payload_with_icon_sets_and_stores_the_icon($migration) { @@ -396,9 +387,7 @@ class MigratorTest extends TestCase ]; } - /** - * @test - */ + #[Test] public function test_migrate_aegis_payload_with_unsupported_icon_does_not_fail() { Storage::fake('icons'); @@ -413,9 +402,7 @@ class MigratorTest extends TestCase Storage::disk('icons')->assertDirectoryEmpty('/'); } - /** - * @test - */ + #[Test] #[DataProvider('TwoFAuthWithIconMigrationProvider')] public function test_migrate_2fauth_payload_with_icon_sets_and_stores_the_icon($migration) { @@ -454,9 +441,7 @@ class MigratorTest extends TestCase ]; } - /** - * @test - */ + #[Test] public function test_migrate_2fauth_payload_with_unsupported_icon_does_not_fail() { Storage::fake('icons'); @@ -471,9 +456,7 @@ class MigratorTest extends TestCase Storage::disk('icons')->assertDirectoryEmpty('/'); } - /** - * @test - */ + #[Test] #[DataProvider('factoryProvider')] public function test_factory_returns_relevant_migrator($payload, $migratorClass) { @@ -517,9 +500,7 @@ class MigratorTest extends TestCase ]; } - /** - * @test - */ + #[Test] public function test_factory_throw_UnsupportedMigrationException() { $this->expectException(UnsupportedMigrationException::class); @@ -528,9 +509,7 @@ class MigratorTest extends TestCase $migrator = $factory->create('not_a_valid_payload'); } - /** - * @test - */ + #[Test] #[DataProvider('encryptedMigrationDataProvider')] public function test_factory_throw_EncryptedMigrationException($payload) { diff --git a/tests/Unit/Rules/IsValidEmailListTest.php b/tests/Unit/Rules/IsValidEmailListTest.php index afa0b1de..abc55d8f 100644 --- a/tests/Unit/Rules/IsValidEmailListTest.php +++ b/tests/Unit/Rules/IsValidEmailListTest.php @@ -7,6 +7,7 @@ use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Support\Facades\Validator; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\TestCase; /** @@ -17,9 +18,7 @@ class IsValidEmailListTest extends TestCase { use WithoutMiddleware; - /** - * @test - */ + #[Test] #[DataProvider('provideValidData')] public function test_valid_data(array $data) : void { @@ -49,9 +48,7 @@ class IsValidEmailListTest extends TestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideInvalidData')] public function test_invalid_data(array $data) : void { diff --git a/tests/Unit/TwoFAccountModelTest.php b/tests/Unit/TwoFAccountModelTest.php index c3501b61..adda61d1 100644 --- a/tests/Unit/TwoFAccountModelTest.php +++ b/tests/Unit/TwoFAccountModelTest.php @@ -11,6 +11,7 @@ use Illuminate\Support\Facades\Crypt; use Mockery\MockInterface; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Tests\ModelTestCase; /** @@ -19,9 +20,7 @@ use Tests\ModelTestCase; #[CoversClass(TwoFAccount::class)] class TwoFAccountModelTest extends ModelTestCase { - /** - * @test - */ + #[Test] public function test_model_configuration() { $this->runConfigurationAssertions( @@ -43,9 +42,7 @@ class TwoFAccountModelTest extends ModelTestCase ); } - /** - * @test - */ + #[Test] #[DataProvider('provideSensitiveAttributes')] public function test_sensitive_attributes_are_stored_encrypted(string $attribute) { @@ -81,9 +78,7 @@ class TwoFAccountModelTest extends ModelTestCase ]; } - /** - * @test - */ + #[Test] #[DataProvider('provideSensitiveAttributes')] public function test_sensitive_attributes_are_returned_clear(string $attribute) { @@ -99,9 +94,7 @@ class TwoFAccountModelTest extends ModelTestCase $this->forgetMock(SettingService::class); } - /** - * @test - */ + #[Test] #[DataProvider('provideSensitiveAttributes')] public function test_indecipherable_attributes_returns_masked_value(string $attribute) { @@ -120,9 +113,7 @@ class TwoFAccountModelTest extends ModelTestCase $this->forgetMock(SettingService::class); } - /** - * @test - */ + #[Test] public function test_secret_is_uppercased_and_padded_at_setup() { $settingService = $this->mock(SettingService::class, function (MockInterface $settingService) { @@ -144,9 +135,7 @@ class TwoFAccountModelTest extends ModelTestCase $this->forgetMock(SettingService::class); } - /** - * @test - */ + #[Test] public function test_user_relation() { $model = new TwoFAccount(); diff --git a/tests/Unit/UserModelTest.php b/tests/Unit/UserModelTest.php index 747a72d4..8c5ff87b 100644 --- a/tests/Unit/UserModelTest.php +++ b/tests/Unit/UserModelTest.php @@ -6,6 +6,7 @@ use App\Models\Group; use App\Models\TwoFAccount; use App\Models\User; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Test; use Tests\ModelTestCase; /** @@ -14,9 +15,7 @@ use Tests\ModelTestCase; #[CoversClass(User::class)] class UserModelTest extends ModelTestCase { - /** - * @test - */ + #[Test] public function test_model_configuration() { $this->runConfigurationAssertions(new User(), @@ -35,9 +34,7 @@ class UserModelTest extends ModelTestCase ); } - /** - * @test - */ + #[Test] public function test_email_is_set_lowercased() { $user = User::factory()->make([ @@ -47,9 +44,7 @@ class UserModelTest extends ModelTestCase $this->assertEquals(strtolower('UPPERCASE@example.COM'), $user->email); } - /** - * @test - */ + #[Test] public function test_twofaccounts_relation() { $user = new User(); @@ -57,9 +52,7 @@ class UserModelTest extends ModelTestCase $this->assertHasManyRelation($accounts, $user, new TwoFAccount()); } - /** - * @test - */ + #[Test] public function test_groups_relation() { $user = new User();