diff --git a/app/Http/CacheProfiles/SkipCacheWhenSessionHasFlash.php b/app/Http/CacheProfiles/SkipCacheWhenSessionHasFlash.php new file mode 100644 index 0000000..4da52df --- /dev/null +++ b/app/Http/CacheProfiles/SkipCacheWhenSessionHasFlash.php @@ -0,0 +1,50 @@ +. + */ + +namespace App\Http\CacheProfiles; + +use Illuminate\Http\Request; +use Spatie\ResponseCache\CacheProfiles\CacheAllSuccessfulGetRequests; + +/** + * Caches successful GET requests, except while the session carries flash data. + * + * Flash data (toast messages, validation errors, old input) is rendered into + * the page, so such a request must neither be served from the cache nor be + * stored in it. + */ +class SkipCacheWhenSessionHasFlash extends CacheAllSuccessfulGetRequests +{ + public function enabled(Request $request): bool + { + return parent::enabled($request) && ! $this->hasFlashData($request); + } + + protected function hasFlashData(Request $request): bool + { + if (! $request->hasSession()) { + return false; + } + + $session = $request->session(); + + return ! empty($session->get('_flash.old')) || ! empty($session->get('_flash.new')); + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index 39ef885..aba7142 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -3,6 +3,9 @@ use Illuminate\Foundation\Application; use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Foundation\Configuration\Middleware; +use RealRashid\SweetAlert\Http\Middleware\ToSweetAlert; +use Spatie\ResponseCache\Middlewares\CacheResponse; +use Spatie\ResponseCache\Middlewares\DoNotCacheResponse; return Application::configure(basePath: dirname(__DIR__)) ->withRouting( @@ -12,13 +15,13 @@ ) ->withMiddleware(function (Middleware $middleware) { $middleware->web(append: [ - \RealRashid\SweetAlert\ToSweetAlert::class, - \Spatie\ResponseCache\Middlewares\CacheResponse::class, + ToSweetAlert::class, + CacheResponse::class, ]); $middleware->alias([ - 'cacheResponse' => \Spatie\ResponseCache\Middlewares\CacheResponse::class, - 'doNotCacheResponse' => \Spatie\ResponseCache\Middlewares\DoNotCacheResponse::class, + 'cacheResponse' => CacheResponse::class, + 'doNotCacheResponse' => DoNotCacheResponse::class, ]); }) ->withExceptions(function (Exceptions $exceptions) { diff --git a/composer.json b/composer.json index 9168b3e..f717897 100644 --- a/composer.json +++ b/composer.json @@ -20,20 +20,20 @@ "laravel/framework": "^12.0", "laravel/horizon": "^5.48", "laravel/sanctum": "^v4.0.0", - "laravel/tinker": "^2.7", - "realrashid/sweet-alert": "^v7.3.0", + "laravel/tinker": "^3.0", + "realrashid/sweet-alert": "^8.0", "spatie/laravel-honeypot": "^4.6", - "spatie/laravel-permission": "^6.0", - "spatie/laravel-responsecache": "^7.7" + "spatie/laravel-permission": "^8.3", + "spatie/laravel-responsecache": "^8.6" }, "require-dev": { - "austinmastlab/deployer-recipes": "^1.0.1", - "barryvdh/laravel-debugbar": "^3.5", + "austinmastlab/deployer-recipes": "^1.2.0-rc1", + "barryvdh/laravel-debugbar": "^4.4", "barryvdh/laravel-ide-helper": "^v3.0.0", "deployer/deployer": "^8.0", "fakerphp/faker": "^1.23", "kitloong/laravel-migrations-generator": "^v7.0.1", - "laravel/boost": "^1.8", + "laravel/boost": "^2.10", "laravel/pail": "^1.2.2", "laravel/pint": "^1.24", "mockery/mockery": "^1.6", @@ -61,7 +61,7 @@ "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi", - "@php artisan sweetalert:publish --ansi" + "@php artisan alert:publish --assets --force --ansi" ], "post-update-cmd": [ "@php artisan vendor:publish --tag=laravel-assets --ansi --force", diff --git a/composer.lock b/composer.lock index 08e7129..2ebbc81 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": "6f296384221ea47be2b4267fdb5edbac", + "content-hash": "4746205b64fc9957f3e6a110e6e5fedd", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -1162,16 +1162,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v3.6.0", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013" + "reference": "4189372ffeff09bf14f731f67a9de90c7b413ebe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013", - "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/4189372ffeff09bf14f731f67a9de90c7b413ebe", + "reference": "4189372ffeff09bf14f731f67a9de90c7b413ebe", "shasum": "" }, "require": { @@ -1182,8 +1182,8 @@ }, "require-dev": { "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.32|^2.1.31", - "phpunit/phpunit": "^8.5.48|^9.0" + "phpstan/phpstan": "^2.1.31", + "phpunit/phpunit": "^11.5.43 || ^12.4" }, "type": "library", "extra": { @@ -1214,7 +1214,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.0" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.1" }, "funding": [ { @@ -1222,7 +1222,7 @@ "type": "github" } ], - "time": "2025-10-31T18:51:33+00:00" + "time": "2026-10-19T17:53:57+00:00" }, { "name": "egulias/email-validator", @@ -1293,16 +1293,16 @@ }, { "name": "filament/actions", - "version": "v5.10.1", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/filamentphp/actions.git", - "reference": "8955db05154dde548e5d8ccaa0b0fdb5a3cedab5" + "reference": "35a082b09d60b0910c2f6b43032a42936ba10483" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/actions/zipball/8955db05154dde548e5d8ccaa0b0fdb5a3cedab5", - "reference": "8955db05154dde548e5d8ccaa0b0fdb5a3cedab5", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/35a082b09d60b0910c2f6b43032a42936ba10483", + "reference": "35a082b09d60b0910c2f6b43032a42936ba10483", "shasum": "" }, "require": { @@ -1338,20 +1338,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-10-07T20:04:46+00:00" + "time": "2026-10-26T16:30:14+00:00" }, { "name": "filament/filament", - "version": "v5.10.1", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/filamentphp/panels.git", - "reference": "15d2478ebb2eeb70bd321daa0e2a721754e67001" + "reference": "fa538cd75c888133e497541d74768aaf430f90be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/panels/zipball/15d2478ebb2eeb70bd321daa0e2a721754e67001", - "reference": "15d2478ebb2eeb70bd321daa0e2a721754e67001", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/fa538cd75c888133e497541d74768aaf430f90be", + "reference": "fa538cd75c888133e497541d74768aaf430f90be", "shasum": "" }, "require": { @@ -1396,20 +1396,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-10-07T19:53:58+00:00" + "time": "2026-10-26T16:29:24+00:00" }, { "name": "filament/forms", - "version": "v5.10.1", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/filamentphp/forms.git", - "reference": "643d4f63dc7975832c07e3c12d206a7126375c47" + "reference": "9516ec5608e21e1136f17a25e535f30b94615ced" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/forms/zipball/643d4f63dc7975832c07e3c12d206a7126375c47", - "reference": "643d4f63dc7975832c07e3c12d206a7126375c47", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/9516ec5608e21e1136f17a25e535f30b94615ced", + "reference": "9516ec5608e21e1136f17a25e535f30b94615ced", "shasum": "" }, "require": { @@ -1449,20 +1449,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-10-07T20:06:07+00:00" + "time": "2026-10-26T16:30:02+00:00" }, { "name": "filament/infolists", - "version": "v5.10.1", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/filamentphp/infolists.git", - "reference": "fca1a820cbb600f0670911d0b1ceb0d0b4cc4918" + "reference": "3bcf42cf09d08ee2172d00bd3a2565cc4ae74ce2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/infolists/zipball/fca1a820cbb600f0670911d0b1ceb0d0b4cc4918", - "reference": "fca1a820cbb600f0670911d0b1ceb0d0b4cc4918", + "url": "https://api.github.com/repos/filamentphp/infolists/zipball/3bcf42cf09d08ee2172d00bd3a2565cc4ae74ce2", + "reference": "3bcf42cf09d08ee2172d00bd3a2565cc4ae74ce2", "shasum": "" }, "require": { @@ -1494,20 +1494,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-10-06T18:18:34+00:00" + "time": "2026-10-26T16:17:20+00:00" }, { "name": "filament/notifications", - "version": "v5.10.1", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/filamentphp/notifications.git", - "reference": "dfeac53a9efe2148e7a2c64c1de25057e1f7ec08" + "reference": "4f0e598feb7dd2809b249f1a69c2fb15b5a11d28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/notifications/zipball/dfeac53a9efe2148e7a2c64c1de25057e1f7ec08", - "reference": "dfeac53a9efe2148e7a2c64c1de25057e1f7ec08", + "url": "https://api.github.com/repos/filamentphp/notifications/zipball/4f0e598feb7dd2809b249f1a69c2fb15b5a11d28", + "reference": "4f0e598feb7dd2809b249f1a69c2fb15b5a11d28", "shasum": "" }, "require": { @@ -1541,20 +1541,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-10-06T18:17:21+00:00" + "time": "2026-10-26T16:22:53+00:00" }, { "name": "filament/query-builder", - "version": "v5.10.1", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/filamentphp/query-builder.git", - "reference": "699dd609f7c2d286bdc956abffb33cba8f6538ef" + "reference": "f6b34ae663109a01198f316971ac20102b5762f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/query-builder/zipball/699dd609f7c2d286bdc956abffb33cba8f6538ef", - "reference": "699dd609f7c2d286bdc956abffb33cba8f6538ef", + "url": "https://api.github.com/repos/filamentphp/query-builder/zipball/f6b34ae663109a01198f316971ac20102b5762f5", + "reference": "f6b34ae663109a01198f316971ac20102b5762f5", "shasum": "" }, "require": { @@ -1587,20 +1587,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-10-06T18:17:16+00:00" + "time": "2026-10-20T18:27:08+00:00" }, { "name": "filament/schemas", - "version": "v5.10.1", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/filamentphp/schemas.git", - "reference": "afd4b0d9be71dfbac83e100416f8704c8253a78b" + "reference": "d01d80aa2eb67508f31e33cfb4188e0257c24385" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/schemas/zipball/afd4b0d9be71dfbac83e100416f8704c8253a78b", - "reference": "afd4b0d9be71dfbac83e100416f8704c8253a78b", + "url": "https://api.github.com/repos/filamentphp/schemas/zipball/d01d80aa2eb67508f31e33cfb4188e0257c24385", + "reference": "d01d80aa2eb67508f31e33cfb4188e0257c24385", "shasum": "" }, "require": { @@ -1632,20 +1632,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-10-07T20:05:11+00:00" + "time": "2026-10-26T16:15:13+00:00" }, { "name": "filament/support", - "version": "v5.10.1", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/filamentphp/support.git", - "reference": "586a70360bf4e20f2f5f31af42b4a62cb3697518" + "reference": "f4057deedf4d29e12bbccb1fff3146046497a5d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/support/zipball/586a70360bf4e20f2f5f31af42b4a62cb3697518", - "reference": "586a70360bf4e20f2f5f31af42b4a62cb3697518", + "url": "https://api.github.com/repos/filamentphp/support/zipball/f4057deedf4d29e12bbccb1fff3146046497a5d8", + "reference": "f4057deedf4d29e12bbccb1fff3146046497a5d8", "shasum": "" }, "require": { @@ -1657,7 +1657,7 @@ "illuminate/contracts": "^11.28|^12.0|^13.0", "kirschbaum-development/eloquent-power-joins": "^4.0", "league/uri-components": "^7.0", - "livewire/livewire": "^4.4.7", + "livewire/livewire": "^4.4.8", "nette/php-generator": "^4.0", "php": "^8.2", "ryangjchandler/blade-capture-directive": "^1.0", @@ -1692,20 +1692,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-10-07T19:52:43+00:00" + "time": "2026-10-26T16:36:54+00:00" }, { "name": "filament/tables", - "version": "v5.10.1", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/filamentphp/tables.git", - "reference": "97c8ce63e8eb1d226be68e9b22360d6c7f3f8db2" + "reference": "d196e432e173f0d0d8c737cb87a2995552124dfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/tables/zipball/97c8ce63e8eb1d226be68e9b22360d6c7f3f8db2", - "reference": "97c8ce63e8eb1d226be68e9b22360d6c7f3f8db2", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/d196e432e173f0d0d8c737cb87a2995552124dfc", + "reference": "d196e432e173f0d0d8c737cb87a2995552124dfc", "shasum": "" }, "require": { @@ -1738,20 +1738,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-10-07T20:05:38+00:00" + "time": "2026-10-26T16:30:37+00:00" }, { "name": "filament/widgets", - "version": "v5.10.1", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/filamentphp/widgets.git", - "reference": "8d81b9b61a5e9280b169bf0f3c526465e8e675bd" + "reference": "4cfc070e73a23b16e51a536b283f88a4cee009b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/widgets/zipball/8d81b9b61a5e9280b169bf0f3c526465e8e675bd", - "reference": "8d81b9b61a5e9280b169bf0f3c526465e8e675bd", + "url": "https://api.github.com/repos/filamentphp/widgets/zipball/4cfc070e73a23b16e51a536b283f88a4cee009b9", + "reference": "4cfc070e73a23b16e51a536b283f88a4cee009b9", "shasum": "" }, "require": { @@ -1782,7 +1782,7 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-10-07T19:56:38+00:00" + "time": "2026-10-26T16:36:37+00:00" }, { "name": "firebase/php-jwt", @@ -2179,22 +2179,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.15.5", + "version": "7.16.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a" + "reference": "81755d989b3007ca7f88a069857553cd08e7dc2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee80339fd9177ba44c49cdb653ff02a4d1106b9a", - "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/81755d989b3007ca7f88a069857553cd08e7dc2e", + "reference": "81755d989b3007ca7f88a069857553cd08e7dc2e", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^2.5.3", - "guzzlehttp/psr7": "^2.13.1", + "guzzlehttp/promises": "^2.6", + "guzzlehttp/psr7": "^2.13.2", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.5 || ^3.0", @@ -2287,7 +2287,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.15.5" + "source": "https://github.com/guzzle/guzzle/tree/7.16.1" }, "funding": [ { @@ -2303,20 +2303,20 @@ "type": "tidelift" } ], - "time": "2026-08-24T09:21:06+00:00" + "time": "2026-10-25T21:35:21+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.5.3", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1" + "reference": "3d88c829bd5f13d13847b39067dbf09a60af2154" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/cde49999552d185d64715fe9c1f77a2aadd2f9f1", - "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1", + "url": "https://api.github.com/repos/guzzle/promises/zipball/3d88c829bd5f13d13847b39067dbf09a60af2154", + "reference": "3d88c829bd5f13d13847b39067dbf09a60af2154", "shasum": "" }, "require": { @@ -2371,7 +2371,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.5.3" + "source": "https://github.com/guzzle/promises/tree/2.6.0" }, "funding": [ { @@ -2387,20 +2387,20 @@ "type": "tidelift" } ], - "time": "2026-08-24T09:11:28+00:00" + "time": "2026-10-18T12:46:59+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.13.1", + "version": "2.13.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "95e7828100de18b4e269fb1703be530082d5166d" + "reference": "adee536f95101929f262b8c59e8a61472f347d58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/95e7828100de18b4e269fb1703be530082d5166d", - "reference": "95e7828100de18b4e269fb1703be530082d5166d", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/adee536f95101929f262b8c59e8a61472f347d58", + "reference": "adee536f95101929f262b8c59e8a61472f347d58", "shasum": "" }, "require": { @@ -2490,7 +2490,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.13.1" + "source": "https://github.com/guzzle/psr7/tree/2.13.2" }, "funding": [ { @@ -2506,7 +2506,7 @@ "type": "tidelift" } ], - "time": "2026-08-24T09:13:11+00:00" + "time": "2026-10-17T23:49:46+00:00" }, { "name": "guzzlehttp/uri-template", @@ -2596,16 +2596,16 @@ }, { "name": "kirschbaum-development/eloquent-power-joins", - "version": "4.3.4", + "version": "4.3.6", "source": { "type": "git", "url": "https://github.com/kirschbaum-development/eloquent-power-joins.git", - "reference": "a0e6c0420c381861e1830693c4b74bdac7f7fb5f" + "reference": "549b642c027719b34787246f2c0121cff10adf42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/a0e6c0420c381861e1830693c4b74bdac7f7fb5f", - "reference": "a0e6c0420c381861e1830693c4b74bdac7f7fb5f", + "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/549b642c027719b34787246f2c0121cff10adf42", + "reference": "549b642c027719b34787246f2c0121cff10adf42", "shasum": "" }, "require": { @@ -2653,9 +2653,9 @@ ], "support": { "issues": "https://github.com/kirschbaum-development/eloquent-power-joins/issues", - "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/4.3.4" + "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/4.3.6" }, - "time": "2026-09-25T11:10:42+00:00" + "time": "2026-10-24T14:38:24+00:00" }, { "name": "laravel/fortify", @@ -2724,16 +2724,16 @@ }, { "name": "laravel/framework", - "version": "v12.69.3", + "version": "v12.70.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "58ea544a2a80dc03c168e13a5dc9a1d176a88717" + "reference": "e09fc54263d1a56cfe1709958fcbb22a4159b1e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/58ea544a2a80dc03c168e13a5dc9a1d176a88717", - "reference": "58ea544a2a80dc03c168e13a5dc9a1d176a88717", + "url": "https://api.github.com/repos/laravel/framework/zipball/e09fc54263d1a56cfe1709958fcbb22a4159b1e3", + "reference": "e09fc54263d1a56cfe1709958fcbb22a4159b1e3", "shasum": "" }, "require": { @@ -2846,10 +2846,10 @@ "league/flysystem-sftp-v3": "^3.25.1", "mockery/mockery": "^1.6.10", "opis/json-schema": "^2.4.1", - "orchestra/testbench-core": "^10.9.0", + "orchestra/testbench-core": "^10.15.0", "pda/pheanstalk": "^5.0.6|^7.0.0", "php-http/discovery": "^1.15", - "phpstan/phpstan": "^2.1.41", + "phpstan/phpstan": "2.2.13", "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", "predis/predis": "^2.3|^3.0", "resend/resend-php": "^0.10.0|^1.0", @@ -2942,20 +2942,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-09-29T12:53:25+00:00" + "time": "2026-10-21T12:55:36+00:00" }, { "name": "laravel/horizon", - "version": "v5.50.0", + "version": "v5.50.1", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "009177cc3d0829c839c8ab573dd17d158fc0b71e" + "reference": "9d65cae809688179ce2c4ace64eb75e886e245c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/009177cc3d0829c839c8ab573dd17d158fc0b71e", - "reference": "009177cc3d0829c839c8ab573dd17d158fc0b71e", + "url": "https://api.github.com/repos/laravel/horizon/zipball/9d65cae809688179ce2c4ace64eb75e886e245c5", + "reference": "9d65cae809688179ce2c4ace64eb75e886e245c5", "shasum": "" }, "require": { @@ -3020,9 +3020,9 @@ ], "support": { "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.50.0" + "source": "https://github.com/laravel/horizon/tree/v5.50.1" }, - "time": "2026-09-15T13:59:54+00:00" + "time": "2026-10-13T06:25:19+00:00" }, { "name": "laravel/passkeys", @@ -3094,16 +3094,16 @@ }, { "name": "laravel/prompts", - "version": "v0.3.25", + "version": "v0.3.26", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "21b7b49d60fcb700016dd27b582ae739c75de816" + "reference": "2d1e9bf6bab8d3f383c254db7f2b4ea8816d55e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/21b7b49d60fcb700016dd27b582ae739c75de816", - "reference": "21b7b49d60fcb700016dd27b582ae739c75de816", + "url": "https://api.github.com/repos/laravel/prompts/zipball/2d1e9bf6bab8d3f383c254db7f2b4ea8816d55e0", + "reference": "2d1e9bf6bab8d3f383c254db7f2b4ea8816d55e0", "shasum": "" }, "require": { @@ -3146,9 +3146,9 @@ ], "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { - "source": "https://github.com/laravel/prompts/tree/v0.3.25" + "source": "https://github.com/laravel/prompts/tree/v0.3.26" }, - "time": "2026-10-06T02:25:49+00:00" + "time": "2026-10-09T14:45:13+00:00" }, { "name": "laravel/sanctum", @@ -3332,33 +3332,33 @@ }, { "name": "laravel/tinker", - "version": "v2.11.1", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741" + "reference": "4faba77764bd33411735936acdf30446d058c78b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741", - "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741", + "url": "https://api.github.com/repos/laravel/tinker/zipball/4faba77764bd33411735936acdf30446d058c78b", + "reference": "4faba77764bd33411735936acdf30446d058c78b", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "php": "^7.2.5|^8.0", - "psy/psysh": "^0.11.1|^0.12.0", - "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0|^8.0" + "illuminate/console": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^8.1", + "psy/psysh": "^0.12.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0" }, "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + "phpunit/phpunit": "^10.5|^11.5" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + "illuminate/database": "The Illuminate Database package (^8.0|^9.0|^10.0|^11.0|^12.0|^13.0)." }, "type": "library", "extra": { @@ -3366,6 +3366,9 @@ "providers": [ "Laravel\\Tinker\\TinkerServiceProvider" ] + }, + "branch-alias": { + "dev-master": "3.x-dev" } }, "autoload": { @@ -3392,22 +3395,22 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.11.1" + "source": "https://github.com/laravel/tinker/tree/v3.0.2" }, - "time": "2026-02-06T14:12:35+00:00" + "time": "2026-03-17T14:54:13+00:00" }, { "name": "league/commonmark", - "version": "2.10.3", + "version": "2.10.4", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "6efbd9c472b91db0a3350fcd601c8332c2382e1f" + "reference": "40821b7606d8d946bac57dbd2290076c722e3a65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/6efbd9c472b91db0a3350fcd601c8332c2382e1f", - "reference": "6efbd9c472b91db0a3350fcd601c8332c2382e1f", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/40821b7606d8d946bac57dbd2290076c722e3a65", + "reference": "40821b7606d8d946bac57dbd2290076c722e3a65", "shasum": "" }, "require": { @@ -3501,7 +3504,7 @@ "type": "tidelift" } ], - "time": "2026-09-21T13:07:34+00:00" + "time": "2026-10-17T19:59:50+00:00" }, { "name": "league/config", @@ -3866,20 +3869,21 @@ }, { "name": "league/uri", - "version": "7.8.1", + "version": "7.9.0", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" + "reference": "fcc872a3d872aa13f935e0cd1887b9abb06da07f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", - "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/fcc872a3d872aa13f935e0cd1887b9abb06da07f", + "reference": "fcc872a3d872aa13f935e0cd1887b9abb06da07f", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.8.1", + "ext-mbstring": "*", + "league/uri-interfaces": "^7.9.0", "php": "^8.1", "psr/http-factory": "^1" }, @@ -3952,7 +3956,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.8.1" + "source": "https://github.com/thephpleague/uri/tree/7.9.0" }, "funding": [ { @@ -3960,24 +3964,24 @@ "type": "github" } ], - "time": "2026-03-15T20:22:25+00:00" + "time": "2026-10-16T15:19:33+00:00" }, { "name": "league/uri-components", - "version": "7.8.1", + "version": "7.9.0", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-components.git", - "reference": "848ff9db2f0be06229d6034b7c2e33d41b4fd675" + "reference": "4e37c1663f7d0daebbab6b3d947631b0835b3943" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-components/zipball/848ff9db2f0be06229d6034b7c2e33d41b4fd675", - "reference": "848ff9db2f0be06229d6034b7c2e33d41b4fd675", + "url": "https://api.github.com/repos/thephpleague/uri-components/zipball/4e37c1663f7d0daebbab6b3d947631b0835b3943", + "reference": "4e37c1663f7d0daebbab6b3d947631b0835b3943", "shasum": "" }, "require": { - "league/uri": "^7.8.1", + "league/uri": "^7.9.0", "php": "^8.1" }, "suggest": { @@ -4036,7 +4040,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-components/tree/7.8.1" + "source": "https://github.com/thephpleague/uri-components/tree/7.9.0" }, "funding": [ { @@ -4044,20 +4048,20 @@ "type": "github" } ], - "time": "2026-03-15T20:22:25+00:00" + "time": "2026-10-16T15:19:33+00:00" }, { "name": "league/uri-interfaces", - "version": "7.8.1", + "version": "7.9.0", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" + "reference": "eb5f6d24e6a4fe0a8e9c78ded4eb1dfff1404f58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", - "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/eb5f6d24e6a4fe0a8e9c78ded4eb1dfff1404f58", + "reference": "eb5f6d24e6a4fe0a8e9c78ded4eb1dfff1404f58", "shasum": "" }, "require": { @@ -4120,7 +4124,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.9.0" }, "funding": [ { @@ -4128,20 +4132,20 @@ "type": "github" } ], - "time": "2026-03-08T20:05:35+00:00" + "time": "2026-10-16T15:19:33+00:00" }, { "name": "livewire/livewire", - "version": "v4.4.7", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "5976d18b1c808287017a17337d9e68dc1ca64ca2" + "reference": "8d7f8fc6138274a2f3384c9db354ca012215a259" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/5976d18b1c808287017a17337d9e68dc1ca64ca2", - "reference": "5976d18b1c808287017a17337d9e68dc1ca64ca2", + "url": "https://api.github.com/repos/livewire/livewire/zipball/8d7f8fc6138274a2f3384c9db354ca012215a259", + "reference": "8d7f8fc6138274a2f3384c9db354ca012215a259", "shasum": "" }, "require": { @@ -4196,7 +4200,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v4.4.7" + "source": "https://github.com/livewire/livewire/tree/v4.4.8" }, "funding": [ { @@ -4204,7 +4208,7 @@ "type": "github" } ], - "time": "2026-09-28T18:12:51+00:00" + "time": "2026-10-21T12:53:46+00:00" }, { "name": "monolog/monolog", @@ -4313,16 +4317,16 @@ }, { "name": "nesbot/carbon", - "version": "3.14.2", + "version": "3.15.1", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "94cfc34887f07ab5c0efa07914c8f527544e3224" + "reference": "ce0e5636fae7d1e99856eb70cae4c719a284aa08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/94cfc34887f07ab5c0efa07914c8f527544e3224", - "reference": "94cfc34887f07ab5c0efa07914c8f527544e3224", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ce0e5636fae7d1e99856eb70cae4c719a284aa08", + "reference": "ce0e5636fae7d1e99856eb70cae4c719a284aa08", "shasum": "" }, "require": { @@ -4332,6 +4336,7 @@ "psr/clock": "^1.0", "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-time": "^1.0", "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" }, "provide": { @@ -4414,25 +4419,25 @@ "type": "tidelift" } ], - "time": "2026-10-02T07:26:52+00:00" + "time": "2026-10-25T14:32:48+00:00" }, { "name": "nette/php-generator", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/nette/php-generator.git", - "reference": "0d7060926f5c3e8c488b9b9ced42d857f12a34b5" + "reference": "abdfd4c22f9077af10daa7391d14e83fc36ba809" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/0d7060926f5c3e8c488b9b9ced42d857f12a34b5", - "reference": "0d7060926f5c3e8c488b9b9ced42d857f12a34b5", + "url": "https://api.github.com/repos/nette/php-generator/zipball/abdfd4c22f9077af10daa7391d14e83fc36ba809", + "reference": "abdfd4c22f9077af10daa7391d14e83fc36ba809", "shasum": "" }, "require": { "nette/utils": "^4.0.6", - "php": "8.1 - 8.5" + "php": "8.1 - 8.6" }, "require-dev": { "jetbrains/phpstorm-attributes": "^1.2", @@ -4470,55 +4475,52 @@ { "name": "David Grudl", "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" } ], - "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.5 features.", - "homepage": "https://nette.org", + "description": "🐘 Nette PHP Generator: generates PHP code from objects. Classes, enums, functions and whole files, with namespaces resolved for you, and always up to date with the latest PHP.", + "homepage": "https://doc.nette.org/php-generator", "keywords": [ - "code", + "code generation", + "code generator", + "codegen", "nette", - "php", "scaffolding" ], "support": { "issues": "https://github.com/nette/php-generator/issues", - "source": "https://github.com/nette/php-generator/tree/v4.2.2" + "source": "https://github.com/nette/php-generator/tree/v4.2.3" }, - "time": "2026-02-26T00:58:33+00:00" + "time": "2026-10-22T01:12:52+00:00" }, { "name": "nette/schema", - "version": "v1.3.6", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "c54350438cd6914616f790a49cb424605f421562" + "reference": "af9fa8a86bfca9b02b10346220db26e62ef942ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/c54350438cd6914616f790a49cb424605f421562", - "reference": "c54350438cd6914616f790a49cb424605f421562", + "url": "https://api.github.com/repos/nette/schema/zipball/af9fa8a86bfca9b02b10346220db26e62ef942ec", + "reference": "af9fa8a86bfca9b02b10346220db26e62ef942ec", "shasum": "" }, "require": { "nette/utils": "^4.0", - "php": "8.1 - 8.5" + "php": "8.1 - 8.6" }, "require-dev": { - "nette/phpstan-rules": "^1.0", + "nette/phpstan-rules": "^1.0.7", "nette/tester": "^2.6", "phpstan/extension-installer": "^1.4@stable", - "phpstan/phpstan": "^2.1.39@stable", + "phpstan/phpstan": "^2.3@stable", "tracy/tracy": "^2.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.4-dev" } }, "autoload": { @@ -4539,40 +4541,40 @@ { "name": "David Grudl", "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" } ], - "description": "📐 Nette Schema: validating data structures against a given Schema.", - "homepage": "https://nette.org", + "description": "📐 Nette Schema: validates and normalizes data such as configuration or API input against a schema described in a few readable lines of PHP, with precise error messages.", + "homepage": "https://doc.nette.org/schema", "keywords": [ - "config", - "nette" + "configuration", + "data validation", + "nette", + "normalization", + "schema", + "validation" ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.6" + "source": "https://github.com/nette/schema/tree/v1.4.0" }, - "time": "2026-08-16T21:58:41+00:00" + "time": "2026-10-22T02:12:50+00:00" }, { "name": "nette/utils", - "version": "v4.1.5", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0" + "reference": "6bf24518accf32cf845bca305e0b92078700fd01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/b043439dbdf954e6c28b5ea7e34b0100f83165e0", - "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0", + "url": "https://api.github.com/repos/nette/utils/zipball/6bf24518accf32cf845bca305e0b92078700fd01", + "reference": "6bf24518accf32cf845bca305e0b92078700fd01", "shasum": "" }, "require": { - "php": "8.2 - 8.5" + "php": "8.2 - 8.6" }, "conflict": { "nette/finder": "<3", @@ -4644,9 +4646,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.5" + "source": "https://github.com/nette/utils/tree/v4.1.6" }, - "time": "2026-07-17T23:02:45+00:00" + "time": "2026-10-20T17:07:56+00:00" }, { "name": "nikic/php-parser", @@ -5212,16 +5214,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.6", + "version": "2.3.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "1427af4647235b4a73b13940b1f1258d3584f36e" + "reference": "3fcdcf021e840f1ec9383152e3603fc790c7c15b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1427af4647235b4a73b13940b1f1258d3584f36e", - "reference": "1427af4647235b4a73b13940b1f1258d3584f36e", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/3fcdcf021e840f1ec9383152e3603fc790c7c15b", + "reference": "3fcdcf021e840f1ec9383152e3603fc790c7c15b", "shasum": "" }, "require": { @@ -5253,9 +5255,9 @@ "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/2.3.6" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.7" }, - "time": "2026-09-27T20:07:45+00:00" + "time": "2026-10-26T17:24:37+00:00" }, { "name": "pragmarx/google2fa", @@ -6129,25 +6131,32 @@ }, { "name": "realrashid/sweet-alert", - "version": "v7.3.2", + "version": "v8.0.0", "source": { "type": "git", "url": "https://github.com/realrashid/sweet-alert.git", - "reference": "72754d27de400e5b177c4e066aca8484b9f8bbbe" + "reference": "c89e51836d6295ee20ef260b0670bef3f012b3a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/realrashid/sweet-alert/zipball/72754d27de400e5b177c4e066aca8484b9f8bbbe", - "reference": "72754d27de400e5b177c4e066aca8484b9f8bbbe", + "url": "https://api.github.com/repos/realrashid/sweet-alert/zipball/c89e51836d6295ee20ef260b0670bef3f012b3a5", + "reference": "c89e51836d6295ee20ef260b0670bef3f012b3a5", "shasum": "" }, "require": { - "laravel/framework": "^5.6|^6.0|^7.0|^8.0|^9.0|^9.11|9.14.*|^10.0|^11.0|^12.0|^13.0", - "php": "^7.2|^8.0|^8.1|^8.2|^8.3" + "laravel/framework": "^11.0|^12.0|^13.0", + "php": "^8.3" }, "require-dev": { - "phpunit/phpunit": "^12.5", - "symfony/thanks": "^1.0" + "inertiajs/inertia-laravel": "^2.0", + "laravel/pint": "^1.18", + "mockery/mockery": "^1.6", + "nunomaduro/collision": "^8.5.0", + "orchestra/testbench": "^9.0.0||^10.0||^11.0", + "pestphp/pest": "^3.0|^4.0", + "pestphp/pest-plugin-arch": "^3.0|^4.0", + "pestphp/pest-plugin-laravel": "^3.0|^4.0", + "phpstan/phpstan": "^2.0" }, "type": "library", "extra": { @@ -6176,18 +6185,18 @@ { "name": "Rashid Ali", "email": "realrashid05@gmail.com", - "homepage": "https://realrashid.com", "role": "Developer" } ], - "description": "Laravel Sweet Alert Is A Package For Laravel Provides An Easy Way To Display Alert Messages Using The SweetAlert2 Library.", + "description": "A beautiful, responsive, customizable, accessible (WAI-ARIA) replacement for JavaScript popup boxes for Laravel - rebuilt with a fluent, Laravel-native API.", "homepage": "https://github.com/realrashid/sweet-alert", "keywords": [ "alert", + "fluent", "laravel", "laravel-package", "notifier", - "noty", + "realrashid", "sweet-alert", "sweet-alert2", "toast" @@ -6200,23 +6209,31 @@ }, "funding": [ { - "url": "https://ko-fi.com/realrashid", + "url": "https://www.buymeacoffee.com/realrashid", "type": "custom" }, { - "url": "https://www.buymeacoffee.com/realrashid", - "type": "custom" + "url": "https://github.com/realrashid", + "type": "github" }, { "url": "https://issuehunt.io/r/realrashid", "type": "issuehunt" }, + { + "url": "https://ko-fi.com/realrashid", + "type": "ko_fi" + }, + { + "url": "https://www.patreon.com/realrashid", + "type": "patreon" + }, { "url": "https://tidelift.com/funding/github/packagist/realrashid/sweet-alert", "type": "tidelift" } ], - "time": "2026-03-29T14:20:34+00:00" + "time": "2026-09-07T22:06:26+00:00" }, { "name": "ryangjchandler/blade-capture-directive", @@ -6376,27 +6393,35 @@ }, { "name": "spatie/invade", - "version": "2.1.1", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/spatie/invade.git", - "reference": "f929c7b6e75fceeefa7b41a491e91274bafb17af" + "reference": "10eb682c480bc5f677a6f9f5c5a64da12590dd97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/invade/zipball/f929c7b6e75fceeefa7b41a491e91274bafb17af", - "reference": "f929c7b6e75fceeefa7b41a491e91274bafb17af", + "url": "https://api.github.com/repos/spatie/invade/zipball/10eb682c480bc5f677a6f9f5c5a64da12590dd97", + "reference": "10eb682c480bc5f677a6f9f5c5a64da12590dd97", "shasum": "" }, "require": { - "php": "^8.0" + "php": "^8.2" }, "require-dev": { - "pestphp/pest": "^1.20", - "phpstan/phpstan": "^1.4", + "friendsofphp/php-cs-fixer": "^3.0", + "pestphp/pest": "^3.8 || ^4.0", + "phpstan/phpstan": "^1.12 || ^2.0", "spatie/ray": "^1.28" }, "type": "library", + "extra": { + "phpstan": { + "includes": [ + "phpstan-extension.neon" + ] + } + }, "autoload": { "files": [ "src/functions.php" @@ -6423,7 +6448,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/invade/tree/2.1.1" + "source": "https://github.com/spatie/invade/tree/2.2.0" }, "funding": [ { @@ -6431,7 +6456,7 @@ "type": "github" } ], - "time": "2026-08-24T12:39:05+00:00" + "time": "2026-10-19T16:16:47+00:00" }, { "name": "spatie/laravel-honeypot", @@ -6572,31 +6597,35 @@ }, { "name": "spatie/laravel-permission", - "version": "6.25.0", + "version": "8.3.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "d7d4cb0d58616722f1afc90e0484e4825155b9b3" + "reference": "e4e906f8ca5fe10fbe4b6a81f6c4e544a01d8053" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/d7d4cb0d58616722f1afc90e0484e4825155b9b3", - "reference": "d7d4cb0d58616722f1afc90e0484e4825155b9b3", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/e4e906f8ca5fe10fbe4b6a81f6c4e544a01d8053", + "reference": "e4e906f8ca5fe10fbe4b6a81f6c4e544a01d8053", "shasum": "" }, "require": { - "illuminate/auth": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", - "illuminate/container": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", - "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", - "illuminate/database": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", - "php": "^8.0" + "illuminate/auth": "^12.0|^13.0", + "illuminate/container": "^12.0|^13.0", + "illuminate/contracts": "^12.0|^13.0", + "illuminate/database": "^12.0|^13.0", + "php": "^8.3", + "spatie/laravel-package-tools": "^1.0" }, "require-dev": { - "laravel/passport": "^11.0|^12.0|^13.0", + "larastan/larastan": "^3.9", + "laravel/octane": "^2.0", + "laravel/passport": "^13.0", "laravel/pint": "^1.0", - "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0|^11.0", - "pestphp/pest": "^2.0|^3.0|^4.0", - "pestphp/pest-plugin-laravel": "^2.0|^3.0|^4.0" + "orchestra/testbench": "^10.0|^11.0", + "pestphp/pest": "^4.7.8|^5.3.3", + "pestphp/pest-plugin-laravel": "^4.1|^5.0.1", + "phpstan/phpstan": "^2.1" }, "type": "library", "extra": { @@ -6606,8 +6635,8 @@ ] }, "branch-alias": { - "dev-main": "6.x-dev", - "dev-master": "6.x-dev" + "dev-main": "8.x-dev", + "dev-master": "8.x-dev" } }, "autoload": { @@ -6630,7 +6659,7 @@ "role": "Developer" } ], - "description": "Permission handling for Laravel 8.0 and up", + "description": "Permission handling for Laravel 12 and up", "homepage": "https://github.com/spatie/laravel-permission", "keywords": [ "acl", @@ -6644,7 +6673,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/6.25.0" + "source": "https://github.com/spatie/laravel-permission/tree/8.3.2" }, "funding": [ { @@ -6652,37 +6681,41 @@ "type": "github" } ], - "time": "2026-03-17T22:46:46+00:00" + "time": "2026-10-19T16:31:21+00:00" }, { "name": "spatie/laravel-responsecache", - "version": "7.7.2", + "version": "8.6.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-responsecache.git", - "reference": "039f8b9c2e2b2d838d0bfce32cfe52cf5d1cb8fc" + "reference": "b8861711a69f0c697898c8649d4d0def38760567" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-responsecache/zipball/039f8b9c2e2b2d838d0bfce32cfe52cf5d1cb8fc", - "reference": "039f8b9c2e2b2d838d0bfce32cfe52cf5d1cb8fc", + "url": "https://api.github.com/repos/spatie/laravel-responsecache/zipball/b8861711a69f0c697898c8649d4d0def38760567", + "reference": "b8861711a69f0c697898c8649d4d0def38760567", "shasum": "" }, "require": { - "illuminate/cache": "^10.0|^11.0|^12.0", - "illuminate/console": "^10.0|^11.0|^12.0", - "illuminate/container": "^10.0|^11.0|^12.0", - "illuminate/http": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "nesbot/carbon": "^2.63|^3.0", - "php": "^8.2", - "spatie/laravel-package-tools": "^1.9" + "illuminate/cache": "^12.0|^13.0", + "illuminate/console": "^12.0|^13.0", + "illuminate/container": "^12.0|^13.0", + "illuminate/http": "^12.0|^13.0", + "illuminate/support": "^12.0|^13.0", + "nesbot/carbon": "^3.0", + "php": "^8.4", + "spatie/laravel-package-tools": "^1.9", + "spatie/php-attribute-reader": "^1.0" }, "require-dev": { - "laravel/framework": "^10.0|^11.0|^12.0", - "mockery/mockery": "^1.4", - "orchestra/testbench": "^8.0|^9.0|^10.0", - "pestphp/pest": "^2.22|^3.0" + "jasonmccreary/double": "^1.0", + "larastan/larastan": "^3.9", + "laravel/framework": "^12.0|^13.0", + "laravel/pint": "^1.13.7", + "mockery/mockery": "^1.6", + "orchestra/testbench": "^10.0|^11.0", + "pestphp/pest": "^4.7.8|^5.3.3" }, "type": "library", "extra": { @@ -6723,7 +6756,8 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-responsecache/tree/7.7.2" + "issues": "https://github.com/spatie/laravel-responsecache/issues", + "source": "https://github.com/spatie/laravel-responsecache/tree/8.6.0" }, "funding": [ { @@ -6735,7 +6769,65 @@ "type": "github" } ], - "time": "2025-08-28T20:22:23+00:00" + "time": "2026-10-19T13:47:53+00:00" + }, + { + "name": "spatie/php-attribute-reader", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/php-attribute-reader.git", + "reference": "46e7484d7b51f5b22d672745c541e48c5a385404" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/php-attribute-reader/zipball/46e7484d7b51f5b22d672745c541e48c5a385404", + "reference": "46e7484d7b51f5b22d672745c541e48c5a385404", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.0|^2.0|^3.0|^4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Attributes\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A clean API for working with PHP attributes", + "homepage": "https://github.com/spatie/php-attribute-reader", + "keywords": [ + "attributes", + "php-attribute-reader", + "reflection", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/php-attribute-reader/issues", + "source": "https://github.com/spatie/php-attribute-reader/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-02-23T09:01:55+00:00" }, { "name": "spatie/shiki-php", @@ -6986,16 +7078,16 @@ }, { "name": "symfony/clock", - "version": "v8.1.0", + "version": "v8.1.9", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6" + "reference": "945ea3b64d6da9c1c2c354fe5c07b27455df6442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/701ef4de9705d6c32292ebee5e8044094a09fbf6", - "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6", + "url": "https://api.github.com/repos/symfony/clock/zipball/945ea3b64d6da9c1c2c354fe5c07b27455df6442", + "reference": "945ea3b64d6da9c1c2c354fe5c07b27455df6442", "shasum": "" }, "require": { @@ -7039,7 +7131,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v8.1.0" + "source": "https://github.com/symfony/clock/tree/v8.1.9" }, "funding": [ { @@ -7059,20 +7151,20 @@ "type": "tidelift" } ], - "time": "2026-05-29T05:06:50+00:00" + "time": "2026-10-12T14:32:04+00:00" }, { "name": "symfony/console", - "version": "v7.4.20", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "d7bca2fe05241dc7732d0c8b6d551b879f5d0a7d" + "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d7bca2fe05241dc7732d0c8b6d551b879f5d0a7d", - "reference": "d7bca2fe05241dc7732d0c8b6d551b879f5d0a7d", + "url": "https://api.github.com/repos/symfony/console/zipball/21f1bc2296f7ff6043241a8dcbc09559b3732820", + "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820", "shasum": "" }, "require": { @@ -7137,7 +7229,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.20" + "source": "https://github.com/symfony/console/tree/v7.4.21" }, "funding": [ { @@ -7157,7 +7249,7 @@ "type": "tidelift" } ], - "time": "2026-09-18T15:55:00+00:00" + "time": "2026-10-12T18:45:38+00:00" }, { "name": "symfony/css-selector", @@ -7689,16 +7781,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.4.20", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "9d0761c0da6bd5b801b401666834901a9a1ffc33" + "reference": "58c89144c7a36dd89c3d01917e9fa3a72d8aaf31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9d0761c0da6bd5b801b401666834901a9a1ffc33", - "reference": "9d0761c0da6bd5b801b401666834901a9a1ffc33", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/58c89144c7a36dd89c3d01917e9fa3a72d8aaf31", + "reference": "58c89144c7a36dd89c3d01917e9fa3a72d8aaf31", "shasum": "" }, "require": { @@ -7747,7 +7839,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.20" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.21" }, "funding": [ { @@ -7767,20 +7859,20 @@ "type": "tidelift" } ], - "time": "2026-09-24T07:12:44+00:00" + "time": "2026-10-08T16:56:12+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.20", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "392784b5d7b959b8d872542a2530c50c540a788f" + "reference": "4779fce7dedacb8801b2b61c703ef99159502331" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/392784b5d7b959b8d872542a2530c50c540a788f", - "reference": "392784b5d7b959b8d872542a2530c50c540a788f", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4779fce7dedacb8801b2b61c703ef99159502331", + "reference": "4779fce7dedacb8801b2b61c703ef99159502331", "shasum": "" }, "require": { @@ -7866,7 +7958,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/v7.4.20" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.21" }, "funding": [ { @@ -7886,7 +7978,7 @@ "type": "tidelift" } ], - "time": "2026-09-29T14:05:16+00:00" + "time": "2026-10-14T06:44:08+00:00" }, { "name": "symfony/mailer", @@ -7974,16 +8066,16 @@ }, { "name": "symfony/mime", - "version": "v7.4.19", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "f8ac7d0a800bcabbcd1f7de56594cf05e6cd5693" + "reference": "94a4c017435bc515f5ac80421a2c555fb9ca3676" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/f8ac7d0a800bcabbcd1f7de56594cf05e6cd5693", - "reference": "f8ac7d0a800bcabbcd1f7de56594cf05e6cd5693", + "url": "https://api.github.com/repos/symfony/mime/zipball/94a4c017435bc515f5ac80421a2c555fb9ca3676", + "reference": "94a4c017435bc515f5ac80421a2c555fb9ca3676", "shasum": "" }, "require": { @@ -8039,7 +8131,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.4.19" + "source": "https://github.com/symfony/mime/tree/v7.4.22" }, "funding": [ { @@ -8059,7 +8151,7 @@ "type": "tidelift" } ], - "time": "2026-09-04T10:45:44+00:00" + "time": "2026-10-28T17:57:58+00:00" }, { "name": "symfony/polyfill-ctype", @@ -8887,6 +8979,89 @@ ], "time": "2026-09-25T15:46:47+00:00" }, + { + "name": "symfony/polyfill-time", + "version": "v1.42.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-time.git", + "reference": "ac9f1ed802dd58f37e720388130c088434aa09fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-time/zipball/ac9f1ed802dd58f37e720388130c088434aa09fc", + "reference": "ac9f1ed802dd58f37e720388130c088434aa09fc", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Time\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Philippe Nyamagana Butera", + "email": "nyamsprod@gmail.com" + }, + { + "name": "Tim Düsterhus", + "email": "tim@tideways-gmbh.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Time API added to PHP 8.6", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "duration", + "polyfill", + "portable", + "shim", + "time" + ], + "support": { + "source": "https://github.com/symfony/polyfill-time/tree/v1.42.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-07T13:08:13+00:00" + }, { "name": "symfony/polyfill-uuid", "version": "v1.43.0", @@ -8972,16 +9147,16 @@ }, { "name": "symfony/process", - "version": "v7.4.19", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "ed0ae095b86994d370d5791612e55984f15aa30e" + "reference": "e5247f4a5e0797d232ad8e8e6803aeb341843c83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/ed0ae095b86994d370d5791612e55984f15aa30e", - "reference": "ed0ae095b86994d370d5791612e55984f15aa30e", + "url": "https://api.github.com/repos/symfony/process/zipball/e5247f4a5e0797d232ad8e8e6803aeb341843c83", + "reference": "e5247f4a5e0797d232ad8e8e6803aeb341843c83", "shasum": "" }, "require": { @@ -9013,7 +9188,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.19" + "source": "https://github.com/symfony/process/tree/v7.4.21" }, "funding": [ { @@ -9033,7 +9208,7 @@ "type": "tidelift" } ], - "time": "2026-09-02T12:38:34+00:00" + "time": "2026-10-08T16:56:12+00:00" }, { "name": "symfony/property-access", @@ -9204,16 +9379,16 @@ }, { "name": "symfony/routing", - "version": "v7.4.20", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "2bacb72be5eadeaf9874d5accb75bfb33d21c74b" + "reference": "7a344cf871532d081875bfdd18f3dff8dca36c5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/2bacb72be5eadeaf9874d5accb75bfb33d21c74b", - "reference": "2bacb72be5eadeaf9874d5accb75bfb33d21c74b", + "url": "https://api.github.com/repos/symfony/routing/zipball/7a344cf871532d081875bfdd18f3dff8dca36c5b", + "reference": "7a344cf871532d081875bfdd18f3dff8dca36c5b", "shasum": "" }, "require": { @@ -9265,7 +9440,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.20" + "source": "https://github.com/symfony/routing/tree/v7.4.21" }, "funding": [ { @@ -9285,20 +9460,20 @@ "type": "tidelift" } ], - "time": "2026-09-28T19:09:50+00:00" + "time": "2026-10-11T18:40:59+00:00" }, { "name": "symfony/serializer", - "version": "v8.1.8", + "version": "v8.1.9", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "df54c4fe859d945eb633d2c5e6a410ce535f21e4" + "reference": "bc6f84d67225d7a25d56af6d4bd52e9e34997a96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/df54c4fe859d945eb633d2c5e6a410ce535f21e4", - "reference": "df54c4fe859d945eb633d2c5e6a410ce535f21e4", + "url": "https://api.github.com/repos/symfony/serializer/zipball/bc6f84d67225d7a25d56af6d4bd52e9e34997a96", + "reference": "bc6f84d67225d7a25d56af6d4bd52e9e34997a96", "shasum": "" }, "require": { @@ -9364,7 +9539,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v8.1.8" + "source": "https://github.com/symfony/serializer/tree/v8.1.9" }, "funding": [ { @@ -9384,7 +9559,7 @@ "type": "tidelift" } ], - "time": "2026-09-28T09:40:25+00:00" + "time": "2026-10-12T19:11:16+00:00" }, { "name": "symfony/service-contracts", @@ -9475,16 +9650,16 @@ }, { "name": "symfony/string", - "version": "v8.1.7", + "version": "v8.1.9", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d950140b5f56f31901e5b7a0c04ffc3a3deb943c" + "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d950140b5f56f31901e5b7a0c04ffc3a3deb943c", - "reference": "d950140b5f56f31901e5b7a0c04ffc3a3deb943c", + "url": "https://api.github.com/repos/symfony/string/zipball/07fb208558f941eab50ec49c89c2a6a93fb11f01", + "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01", "shasum": "" }, "require": { @@ -9541,7 +9716,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.1.7" + "source": "https://github.com/symfony/string/tree/v8.1.9" }, "funding": [ { @@ -9561,7 +9736,7 @@ "type": "tidelift" } ], - "time": "2026-09-11T14:51:16+00:00" + "time": "2026-10-03T15:16:03+00:00" }, { "name": "symfony/translation", @@ -9822,16 +9997,16 @@ }, { "name": "symfony/uid", - "version": "v7.4.20", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "a96bbdb02a04ff3b5592cee6741b03edc78b56aa" + "reference": "3e706a245b5343ea93be9cafe84525bfb54e60fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/a96bbdb02a04ff3b5592cee6741b03edc78b56aa", - "reference": "a96bbdb02a04ff3b5592cee6741b03edc78b56aa", + "url": "https://api.github.com/repos/symfony/uid/zipball/3e706a245b5343ea93be9cafe84525bfb54e60fc", + "reference": "3e706a245b5343ea93be9cafe84525bfb54e60fc", "shasum": "" }, "require": { @@ -9876,7 +10051,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.4.20" + "source": "https://github.com/symfony/uid/tree/v7.4.21" }, "funding": [ { @@ -9896,20 +10071,20 @@ "type": "tidelift" } ], - "time": "2026-09-23T16:18:28+00:00" + "time": "2026-10-12T14:31:36+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.18", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "e088da50b813f32473a76871616cbb8fa54653a8" + "reference": "55d06b02f49eca9bff61828548988e6f8763e8a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e088da50b813f32473a76871616cbb8fa54653a8", - "reference": "e088da50b813f32473a76871616cbb8fa54653a8", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/55d06b02f49eca9bff61828548988e6f8763e8a6", + "reference": "55d06b02f49eca9bff61828548988e6f8763e8a6", "shasum": "" }, "require": { @@ -9963,7 +10138,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.18" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.21" }, "funding": [ { @@ -9983,7 +10158,7 @@ "type": "tidelift" } ], - "time": "2026-08-30T20:10:52+00:00" + "time": "2026-10-13T05:48:33+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -10042,16 +10217,16 @@ }, { "name": "ueberdosis/tiptap-php", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/ueberdosis/tiptap-php.git", - "reference": "5a2e8155c5b09c9ad4efd480550270a6924865b9" + "reference": "242a7a150c1233a01622e050152699382fb20bea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/5a2e8155c5b09c9ad4efd480550270a6924865b9", - "reference": "5a2e8155c5b09c9ad4efd480550270a6924865b9", + "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/242a7a150c1233a01622e050152699382fb20bea", + "reference": "242a7a150c1233a01622e050152699382fb20bea", "shasum": "" }, "require": { @@ -10091,7 +10266,7 @@ ], "support": { "issues": "https://github.com/ueberdosis/tiptap-php/issues", - "source": "https://github.com/ueberdosis/tiptap-php/tree/2.2.0" + "source": "https://github.com/ueberdosis/tiptap-php/tree/2.2.1" }, "funding": [ { @@ -10107,20 +10282,20 @@ "type": "open_collective" } ], - "time": "2026-08-31T07:00:09+00:00" + "time": "2026-10-19T10:48:00+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.7.0", + "version": "v5.8.0", "source": { "type": "git", "url": "https://github.com/phpdotenv/phpdotenv.git", - "reference": "301c07936b16d88628b126b01d082ba153cf4c40" + "reference": "96149103e62ac67e915f6d2ef59b72dee2e011e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpdotenv/phpdotenv/zipball/301c07936b16d88628b126b01d082ba153cf4c40", - "reference": "301c07936b16d88628b126b01d082ba153cf4c40", + "url": "https://api.github.com/repos/phpdotenv/phpdotenv/zipball/96149103e62ac67e915f6d2ef59b72dee2e011e0", + "reference": "96149103e62ac67e915f6d2ef59b72dee2e011e0", "shasum": "" }, "require": { @@ -10147,7 +10322,7 @@ "forward-command": false }, "branch-alias": { - "dev-master": "5.6-dev" + "dev-master": "5.8-dev" } }, "autoload": { @@ -10178,8 +10353,8 @@ "environment" ], "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.7.0" + "issues": "https://github.com/phpdotenv/phpdotenv/issues", + "source": "https://github.com/phpdotenv/phpdotenv/tree/v5.8.0" }, "funding": [ { @@ -10191,7 +10366,7 @@ "type": "tidelift" } ], - "time": "2026-08-24T18:07:49+00:00" + "time": "2026-10-25T16:26:19+00:00" }, { "name": "voku/portable-ascii", @@ -10498,16 +10673,16 @@ "packages-dev": [ { "name": "austinmastlab/deployer-recipes", - "version": "v1.1.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/AustinMastLab/deployer-recipes", - "reference": "6b1d741b3911863b6562ff28c7e9354ae688aeba" + "reference": "1a3c56693f52f09d079c895f6d0ba338e961eccc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/AustinMastLab/deployer-recipes/zipball/6b1d741b3911863b6562ff28c7e9354ae688aeba", - "reference": "6b1d741b3911863b6562ff28c7e9354ae688aeba", + "url": "https://api.github.com/repos/AustinMastLab/deployer-recipes/zipball/1a3c56693f52f09d079c895f6d0ba338e961eccc", + "reference": "1a3c56693f52f09d079c895f6d0ba338e961eccc", "shasum": "" }, "require": { @@ -10524,48 +10699,58 @@ ], "type": "library", "description": "Shared Deployer recipes and AWS SSM environment tools for AustinMastLab sites", - "time": "2026-10-11T17:41:30+00:00" + "time": "2026-10-22T00:56:00+00:00" }, { "name": "barryvdh/laravel-debugbar", - "version": "v3.16.5", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/fruitcake/laravel-debugbar.git", - "reference": "e85c0a8464da67e5b4a53a42796d46a43fc06c9a" + "reference": "679c389306cd6255dbb3d2a9350d846c2e991dcc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/e85c0a8464da67e5b4a53a42796d46a43fc06c9a", - "reference": "e85c0a8464da67e5b4a53a42796d46a43fc06c9a", + "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/679c389306cd6255dbb3d2a9350d846c2e991dcc", + "reference": "679c389306cd6255dbb3d2a9350d846c2e991dcc", "shasum": "" }, "require": { - "illuminate/routing": "^10|^11|^12", - "illuminate/session": "^10|^11|^12", - "illuminate/support": "^10|^11|^12", - "php": "^8.1", - "php-debugbar/php-debugbar": "^2.2.4", - "symfony/finder": "^6|^7|^8" + "illuminate/routing": "^11|^12|^13.0", + "illuminate/session": "^11|^12|^13.0", + "illuminate/support": "^11|^12|^13.0", + "php": "^8.2", + "php-debugbar/php-debugbar": "^3.8.0", + "php-debugbar/symfony-bridge": "^1.1" }, "require-dev": { + "larastan/larastan": "^3", + "laravel/ai": "^0.8|^0.9|^0.10|^0.11|^1.0", + "laravel/octane": "^2", + "laravel/pennant": "^1", + "laravel/pint": "^1", + "laravel/telescope": "^5.16", + "livewire/livewire": "^3.7|^4", "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^7|^8|^9|^10", - "phpunit/phpunit": "^9.5.10|^10|^11", - "squizlabs/php_codesniffer": "^3.5" + "orchestra/testbench-dusk": "^9|^10|^11", + "php-debugbar/twig-bridge": "^2.0", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^11", + "shipmonk/phpstan-rules": "^4.3" }, "type": "library", "extra": { "laravel": { "aliases": { - "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" + "Debugbar": "Fruitcake\\LaravelDebugbar\\Facades\\Debugbar" }, "providers": [ - "Barryvdh\\Debugbar\\ServiceProvider" + "Fruitcake\\LaravelDebugbar\\ServiceProvider" ] }, "branch-alias": { - "dev-master": "3.16-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -10573,7 +10758,7 @@ "src/helpers.php" ], "psr-4": { - "Barryvdh\\Debugbar\\": "src/" + "Fruitcake\\LaravelDebugbar\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10581,6 +10766,10 @@ "MIT" ], "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, { "name": "Barry vd. Heuvel", "email": "barryvdh@gmail.com" @@ -10588,6 +10777,7 @@ ], "description": "PHP Debugbar integration for Laravel", "keywords": [ + "barryvdh", "debug", "debugbar", "dev", @@ -10597,7 +10787,7 @@ ], "support": { "issues": "https://github.com/fruitcake/laravel-debugbar/issues", - "source": "https://github.com/fruitcake/laravel-debugbar/tree/v3.16.5" + "source": "https://github.com/fruitcake/laravel-debugbar/tree/v4.4.5" }, "funding": [ { @@ -10609,7 +10799,7 @@ "type": "github" } ], - "time": "2026-01-23T15:03:22+00:00" + "time": "2026-10-28T13:25:29+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -10851,6 +11041,83 @@ ], "time": "2026-03-29T15:46:14+00:00" }, + { + "name": "composer/semver", + "version": "3.5.1", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "528948210cc46f967a4b98e83b19e76f2b504993" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/528948210cc46f967a4b98e83b19e76f2b504993", + "reference": "528948210cc46f967a4b98e83b19e76f2b504993", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Version comparison library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.5.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2026-10-05T13:12:12+00:00" + }, { "name": "composer/xdebug-handler", "version": "3.0.5", @@ -11373,33 +11640,34 @@ }, { "name": "laravel/boost", - "version": "v1.8.13", + "version": "v2.10.3", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "cdcb12114315491f72a2cecb5130d8b9dffa0103" + "reference": "75c269a8a53e931c7252e7cd562e1a209356a7c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/cdcb12114315491f72a2cecb5130d8b9dffa0103", - "reference": "cdcb12114315491f72a2cecb5130d8b9dffa0103", + "url": "https://api.github.com/repos/laravel/boost/zipball/75c269a8a53e931c7252e7cd562e1a209356a7c6", + "reference": "75c269a8a53e931c7252e7cd562e1a209356a7c6", "shasum": "" }, "require": { - "guzzlehttp/guzzle": "^7.9", - "illuminate/console": "^10.49.0|^11.45.3|^12.41.1", - "illuminate/contracts": "^10.49.0|^11.45.3|^12.41.1", - "illuminate/routing": "^10.49.0|^11.45.3|^12.41.1", - "illuminate/support": "^10.49.0|^11.45.3|^12.41.1", - "laravel/mcp": "^0.5.1", - "laravel/prompts": "0.1.25|^0.3.6", - "laravel/roster": "^0.2.9", - "php": "^8.1" + "guzzlehttp/guzzle": "^7.9|^8.0", + "illuminate/console": "^11.45.3|^12.41.1|^13.0", + "illuminate/contracts": "^11.45.3|^12.41.1|^13.0", + "illuminate/routing": "^11.45.3|^12.41.1|^13.0", + "illuminate/support": "^11.45.3|^12.41.1|^13.0", + "laravel/mcp": "^0.7.1|^0.8.0|^0.9.0|^1.0", + "laravel/prompts": "^0.3.10", + "laravel/roster": "^1.0.0", + "php": "^8.2" }, "require-dev": { - "laravel/pint": "^1.20.0", + "jasonmccreary/double": "^1.0", + "laravel/pint": "^1.27.0", "mockery/mockery": "^1.6.12", - "orchestra/testbench": "^8.36.0|^9.15.0|^10.6", + "orchestra/testbench": "^9.15.0|^10.6|^11.0", "pestphp/pest": "^2.36.0|^3.8.4|^4.1.5", "phpstan/phpstan": "^2.1.27", "rector/rector": "^2.1" @@ -11435,20 +11703,20 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-03-27T17:24:01+00:00" + "time": "2026-10-07T19:07:19+00:00" }, { "name": "laravel/mcp", - "version": "v0.5.9", + "version": "v1.0.2", "source": { "type": "git", "url": "https://github.com/laravel/mcp.git", - "reference": "39e8da60eb7bce4737c5d868d35a3fe78938c129" + "reference": "26c7803551028653beab49af0e672ae38607b772" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/mcp/zipball/39e8da60eb7bce4737c5d868d35a3fe78938c129", - "reference": "39e8da60eb7bce4737c5d868d35a3fe78938c129", + "url": "https://api.github.com/repos/laravel/mcp/zipball/26c7803551028653beab49af0e672ae38607b772", + "reference": "26c7803551028653beab49af0e672ae38607b772", "shasum": "" }, "require": { @@ -11462,9 +11730,11 @@ "illuminate/routing": "^11.45.3|^12.41.1|^13.0", "illuminate/support": "^11.45.3|^12.41.1|^13.0", "illuminate/validation": "^11.45.3|^12.41.1|^13.0", - "php": "^8.2" + "php": "^8.2", + "symfony/process": "^7.4.5|^8.0.5" }, "require-dev": { + "jasonmccreary/double": "^1.0", "laravel/pint": "^1.20", "orchestra/testbench": "^9.15|^10.8|^11.0", "pestphp/pest": "^3.8.5|^4.3.2", @@ -11475,7 +11745,7 @@ "extra": { "laravel": { "aliases": { - "Mcp": "Laravel\\Mcp\\Server\\Facades\\Mcp" + "Mcp": "Laravel\\Mcp\\Facades\\Mcp" }, "providers": [ "Laravel\\Mcp\\Server\\McpServiceProvider" @@ -11508,7 +11778,7 @@ "issues": "https://github.com/laravel/mcp/issues", "source": "https://github.com/laravel/mcp" }, - "time": "2026-02-17T19:05:53+00:00" + "time": "2026-10-11T20:52:46+00:00" }, { "name": "laravel/pail", @@ -11662,32 +11932,33 @@ }, { "name": "laravel/roster", - "version": "v0.2.9", + "version": "v1.0.0", "source": { "type": "git", "url": "https://github.com/laravel/roster.git", - "reference": "82bbd0e2de614906811aebdf16b4305956816fa6" + "reference": "89e518bd88ae98ff50f6082f6b517c8d8e8245fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/roster/zipball/82bbd0e2de614906811aebdf16b4305956816fa6", - "reference": "82bbd0e2de614906811aebdf16b4305956816fa6", + "url": "https://api.github.com/repos/laravel/roster/zipball/89e518bd88ae98ff50f6082f6b517c8d8e8245fa", + "reference": "89e518bd88ae98ff50f6082f6b517c8d8e8245fa", "shasum": "" }, "require": { - "illuminate/console": "^10.0|^11.0|^12.0", - "illuminate/contracts": "^10.0|^11.0|^12.0", - "illuminate/routing": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "php": "^8.1|^8.2", - "symfony/yaml": "^6.4|^7.2" + "composer/semver": "^3.0", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/contracts": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "php": "^8.2", + "symfony/yaml": "^7.2|^8.0" }, "require-dev": { - "laravel/pint": "^1.14", + "laravel/pint": "^1.29", "mockery/mockery": "^1.6", - "orchestra/testbench": "^8.22.0|^9.0|^10.0", - "pestphp/pest": "^2.0|^3.0", - "phpstan/phpstan": "^2.0" + "orchestra/testbench": "^9.0|^10.0|^11.0", + "pestphp/pest": "^3.0|^4.1", + "phpstan/phpstan": "^2.0", + "rector/rector": "^2.0" }, "type": "library", "extra": { @@ -11719,7 +11990,7 @@ "issues": "https://github.com/laravel/roster/issues", "source": "https://github.com/laravel/roster" }, - "time": "2025-10-20T09:56:46+00:00" + "time": "2026-07-18T17:53:15+00:00" }, { "name": "maml/maml", @@ -12597,47 +12868,63 @@ }, { "name": "php-debugbar/php-debugbar", - "version": "v2.2.6", + "version": "v3.8.0", "source": { "type": "git", "url": "https://github.com/php-debugbar/php-debugbar.git", - "reference": "abb9fa3c5c8dbe7efe03ddba56782917481de3e8" + "reference": "18ced90d4b882ed449b2278fea8692f8f7d1c13c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/abb9fa3c5c8dbe7efe03ddba56782917481de3e8", - "reference": "abb9fa3c5c8dbe7efe03ddba56782917481de3e8", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/18ced90d4b882ed449b2278fea8692f8f7d1c13c", + "reference": "18ced90d4b882ed449b2278fea8692f8f7d1c13c", "shasum": "" }, "require": { - "php": "^8.1", + "php": "^8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.4|^7.3|^8.0" + "symfony/var-dumper": "^5.4|^6|^7|^8" }, "replace": { "maximebf/debugbar": "self.version" }, "require-dev": { - "dbrekelmans/bdi": "^1", + "dbrekelmans/bdi": "^1.4", + "friendsofphp/php-cs-fixer": "^3.92", + "monolog/monolog": "^3.9", + "php-debugbar/doctrine-bridge": "^3@dev", + "php-debugbar/monolog-bridge": "^1@dev", + "php-debugbar/symfony-bridge": "^1@dev", + "php-debugbar/twig-bridge": "^2@dev", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^10", - "symfony/browser-kit": "^6.0|7.0", + "predis/predis": "^3.3", + "shipmonk/phpstan-rules": "^4.3", + "symfony/browser-kit": "^6.4|7.0", + "symfony/dom-crawler": "^6.4|^7", + "symfony/event-dispatcher": "^5.4|^6.4|^7.3|^8.0", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8.0", + "symfony/mailer": "^5.4|^6.4|^7.3|^8.0", "symfony/panther": "^1|^2.1", "twig/twig": "^3.11.2" }, "suggest": { - "kriswallsmith/assetic": "The best way to manage assets", - "monolog/monolog": "Log using Monolog", - "predis/predis": "Redis storage" + "php-debugbar/doctrine-bridge": "To integrate Doctrine with php-debugbar.", + "php-debugbar/monolog-bridge": "To integrate Monolog with php-debugbar.", + "php-debugbar/symfony-bridge": "To integrate Symfony with php-debugbar.", + "php-debugbar/twig-bridge": "To integrate Twig with php-debugbar." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-master": "3.8-dev" } }, "autoload": { "psr-4": { - "DebugBar\\": "src/DebugBar/" + "DebugBar\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -12661,13 +12948,91 @@ "debug", "debug bar", "debugbar", - "dev" + "dev", + "profiler", + "toolbar" ], "support": { "issues": "https://github.com/php-debugbar/php-debugbar/issues", - "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.2.6" + "source": "https://github.com/php-debugbar/php-debugbar/tree/v3.8.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2026-07-02T12:38:20+00:00" + }, + { + "name": "php-debugbar/symfony-bridge", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-debugbar/symfony-bridge.git", + "reference": "e37d2debe5d316408b00d0ab2688d9c2cf59b5ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-debugbar/symfony-bridge/zipball/e37d2debe5d316408b00d0ab2688d9c2cf59b5ad", + "reference": "e37d2debe5d316408b00d0ab2688d9c2cf59b5ad", + "shasum": "" + }, + "require": { + "php": "^8.2", + "php-debugbar/php-debugbar": "^3.1", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8.0" + }, + "require-dev": { + "dbrekelmans/bdi": "^1.4", + "phpunit/phpunit": "^10", + "symfony/browser-kit": "^6|^7", + "symfony/dom-crawler": "^6|^7", + "symfony/mailer": "^5.4|^6.4|^7.3|^8.0", + "symfony/panther": "^1|^2.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\Bridge\\Symfony\\": "src/" + } }, - "time": "2025-12-22T13:21:32+00:00" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Symfony bridge for PHP Debugbar", + "homepage": "https://github.com/php-debugbar/php-debugbar", + "keywords": [ + "debugbar", + "dev", + "symfony" + ], + "support": { + "issues": "https://github.com/php-debugbar/symfony-bridge/issues", + "source": "https://github.com/php-debugbar/symfony-bridge/tree/v1.1.0" + }, + "time": "2026-01-15T14:47:34+00:00" }, { "name": "phpunit/php-code-coverage", @@ -14344,16 +14709,16 @@ }, { "name": "spatie/laravel-ignition", - "version": "2.12.0", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "45b3b6e1e73fc161cba2149972698644b99594ee" + "reference": "0d49228686542bf718ad1a978ab3eb1d5a0dcd41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/45b3b6e1e73fc161cba2149972698644b99594ee", - "reference": "45b3b6e1e73fc161cba2149972698644b99594ee", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/0d49228686542bf718ad1a978ab3eb1d5a0dcd41", + "reference": "0d49228686542bf718ad1a978ab3eb1d5a0dcd41", "shasum": "" }, "require": { @@ -14432,7 +14797,7 @@ "type": "github" } ], - "time": "2026-03-17T12:20:04+00:00" + "time": "2026-10-19T16:31:25+00:00" }, { "name": "staabm/side-effects-detector", @@ -14488,28 +14853,28 @@ }, { "name": "symfony/yaml", - "version": "v7.4.20", + "version": "v8.1.9", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "0222bf4dfaa1e3ceb8fff579635d655f2950d5a7" + "reference": "6107ee26a25215c3df3af0a3315e56bb4fd0b7db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/0222bf4dfaa1e3ceb8fff579635d655f2950d5a7", - "reference": "0222bf4dfaa1e3ceb8fff579635d655f2950d5a7", + "url": "https://api.github.com/repos/symfony/yaml/zipball/6107ee26a25215c3df3af0a3315e56bb4fd0b7db", + "reference": "6107ee26a25215c3df3af0a3315e56bb4fd0b7db", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.4.1", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<7.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0" + "symfony/console": "^7.4|^8.0", + "yaml/yaml-test-suite": "*" }, "bin": [ "Resources/bin/yaml-lint" @@ -14540,7 +14905,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.20" + "source": "https://github.com/symfony/yaml/tree/v8.1.9" }, "funding": [ { @@ -14560,7 +14925,7 @@ "type": "tidelift" } ], - "time": "2026-09-26T06:31:10+00:00" + "time": "2026-10-12T12:37:13+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", diff --git a/config/debugbar.php b/config/debugbar.php index 8cbae69..f64cc24 100644 --- a/config/debugbar.php +++ b/config/debugbar.php @@ -1,4 +1,5 @@ . */ +declare(strict_types=1); + return [ /* @@ -31,32 +34,158 @@ | */ - 'enabled' => env('DEBUGBAR_ENABLED', null), + 'enabled' => env('DEBUGBAR_ENABLED'), + 'collect_jobs' => env('DEBUGBAR_COLLECT_JOBS', false), 'except' => [ 'telescope*', 'horizon*', + '_boost/browser-logs', + 'livewire-*/livewire.js', + ], + + /* + |-------------------------------------------------------------------------- + | DataCollectors + |-------------------------------------------------------------------------- + | + | Enable/disable DataCollectors + | + */ + + 'collectors' => [ + 'phpinfo' => env('DEBUGBAR_COLLECTORS_PHPINFO', false), // Php version + 'messages' => env('DEBUGBAR_COLLECTORS_MESSAGES', true), // Messages + 'time' => env('DEBUGBAR_COLLECTORS_TIME', true), // Time Datalogger + 'memory' => env('DEBUGBAR_COLLECTORS_MEMORY', true), // Memory usage + 'exceptions' => env('DEBUGBAR_COLLECTORS_EXCEPTIONS', true), // Exception displayer + 'log' => env('DEBUGBAR_COLLECTORS_LOG', true), // Logs from Monolog (merged in messages if enabled) + 'db' => env('DEBUGBAR_COLLECTORS_DB', true), // Show database (PDO) queries and bindings + 'views' => env('DEBUGBAR_COLLECTORS_VIEWS', true), // Views with their data + 'route' => env('DEBUGBAR_COLLECTORS_ROUTE', false), // Current route information + 'auth' => env('DEBUGBAR_COLLECTORS_AUTH', false), // Display Laravel authentication status + 'gate' => env('DEBUGBAR_COLLECTORS_GATE', true), // Display Laravel Gate checks + 'session' => env('DEBUGBAR_COLLECTORS_SESSION', false), // Display session data + 'symfony_request' => env('DEBUGBAR_COLLECTORS_SYMFONY_REQUEST', true), // Default Request Data + 'mail' => env('DEBUGBAR_COLLECTORS_MAIL', true), // Catch mail messages + 'laravel' => env('DEBUGBAR_COLLECTORS_LARAVEL', true), // Laravel version and environment + 'events' => env('DEBUGBAR_COLLECTORS_EVENTS', false), // All events fired + 'logs' => env('DEBUGBAR_COLLECTORS_LOGS', false), // Add the latest log messages + 'config' => env('DEBUGBAR_COLLECTORS_CONFIG', false), // Display config settings + 'cache' => env('DEBUGBAR_COLLECTORS_CACHE', true), // Display cache events + 'models' => env('DEBUGBAR_COLLECTORS_MODELS', true), // Display models + 'livewire' => env('DEBUGBAR_COLLECTORS_LIVEWIRE', true), // Display Livewire (when available) + 'inertia' => env('DEBUGBAR_COLLECTORS_INERTIA', true), // Display Inertia (when available) + 'jobs' => env('DEBUGBAR_COLLECTORS_JOBS', true), // Display dispatched jobs + 'pennant' => env('DEBUGBAR_COLLECTORS_PENNANT', true), // Display Pennant feature flags + 'ai' => env('DEBUGBAR_COLLECTORS_AI', true), // Display laravel/ai agent runs + 'http_client' => env('DEBUGBAR_COLLECTORS_HTTP_CLIENT', true), // Display HTTP Client requests ], /* |-------------------------------------------------------------------------- - | Storage settings + | Extra options |-------------------------------------------------------------------------- | - | DebugBar stores data for session/ajax requests. - | You can disable this, so the debugbar stores data in headers/session, - | but this can cause problems with large data collectors. - | By default, file storage (in the storage folder) is used. Redis and PDO - | can also be used. For PDO, run the package migrations first. + | Configure some DataCollectors | */ - 'storage' => [ - 'enabled' => true, - 'driver' => 'file', // redis, file, pdo, socket, custom - 'path' => storage_path('debugbar'), // For file driver - 'connection' => null, // Leave null for default connection (Redis/PDO) - 'provider' => '', // Instance of StorageInterface for custom driver - 'hostname' => '127.0.0.1', // Hostname to use with the "socket" driver - 'port' => 2304, // Port to use with the "socket" driver + + 'options' => [ + 'time' => [ + 'memory_usage' => env('DEBUGBAR_OPTIONS_TIME_MEMORY_USAGE', false), // Calculated by subtracting memory start and end, it may be inaccurate + ], + 'messages' => [ + 'trace' => env('DEBUGBAR_OPTIONS_MESSAGES_TRACE', true), // Trace the origin of the debug message + 'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults) + 'capture_dumps' => env('DEBUGBAR_OPTIONS_MESSAGES_CAPTURE_DUMPS', false), // Capture laravel `dump();` as message + 'timeline' => env('DEBUGBAR_OPTIONS_MESSAGES_TIMELINE', true), // Add messages to the timeline + ], + 'memory' => [ + 'reset_peak' => env('DEBUGBAR_OPTIONS_MEMORY_RESET_PEAK', false), // run memory_reset_peak_usage before collecting + 'with_baseline' => env('DEBUGBAR_OPTIONS_MEMORY_WITH_BASELINE', false), // Set boot memory usage as memory peak baseline + 'precision' => (int) env('DEBUGBAR_OPTIONS_MEMORY_PRECISION', 0), // Memory rounding precision + ], + 'auth' => [ + 'show_name' => env('DEBUGBAR_OPTIONS_AUTH_SHOW_NAME', true), // Also show the users name/email in the debugbar + 'show_guards' => env('DEBUGBAR_OPTIONS_AUTH_SHOW_GUARDS', true), // Show the guards that are used + ], + 'gate' => [ + 'trace' => false, // Trace the origin of the Gate checks + 'timeline' => env('DEBUGBAR_OPTIONS_GATE_TIMELINE', false), // Add mails to the timeline + ], + 'db' => [ + 'with_params' => env('DEBUGBAR_OPTIONS_WITH_PARAMS', true), // Render SQL with the parameters substituted + 'exclude_paths' => [ // Paths to exclude entirely from the collector + // 'vendor/laravel/framework/src/Illuminate/Session', // Exclude sessions queries + ], + 'backtrace' => env('DEBUGBAR_OPTIONS_DB_BACKTRACE', true), // Use a backtrace to find the origin of the query in your files. + 'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults) + 'backtrace_editor_links' => env('DEBUGBAR_OPTIONS_DB_BACKTRACE_EDITOR_LINKS', false), // Add editor links to backtrace entries (non-vendor files only) + 'timeline' => env('DEBUGBAR_OPTIONS_DB_TIMELINE', false), // Add the queries to the timeline + 'duration_background' => env('DEBUGBAR_OPTIONS_DB_DURATION_BACKGROUND', true), // Show shaded background on each query relative to how long it took to execute. + 'explain' => env('DEBUGBAR_OPTIONS_DB_EXPLAIN_ENABLED', true), // Show EXPLAIN output on queries + 'show_query_result' => env('DEBUGBAR_OPTIONS_DB_SHOW_QUERY_RESULT', false), // Show option to re-run SELECT queries and show the result + 'only_slow_queries' => env('DEBUGBAR_OPTIONS_DB_ONLY_SLOW_QUERIES', true), // Only track queries that last longer than `slow_threshold` + 'slow_threshold' => env('DEBUGBAR_OPTIONS_DB_SLOW_THRESHOLD', false), // Max query execution time (ms). Exceeding queries will be highlighted + 'memory_usage' => env('DEBUGBAR_OPTIONS_DB_MEMORY_USAGE', false), // Show queries memory usage + 'soft_limit' => (int) env('DEBUGBAR_OPTIONS_DB_SOFT_LIMIT', 100), // After the soft limit, no parameters/backtrace are captured + 'hard_limit' => (int) env('DEBUGBAR_OPTIONS_DB_HARD_LIMIT', 500), // After the hard limit, queries are ignored + ], + 'mail' => [ + 'timeline' => env('DEBUGBAR_OPTIONS_MAIL_TIMELINE', true), // Add mails to the timeline + 'show_body' => env('DEBUGBAR_OPTIONS_MAIL_SHOW_BODY', true), + ], + 'views' => [ + 'timeline' => env('DEBUGBAR_OPTIONS_VIEWS_TIMELINE', true), // Add the views to the timeline + 'timeline_duration' => env('DEBUGBAR_OPTIONS_VIEWS_TIMELINE_DURATION', false), // Add the views duration on timeline (Experimental) + 'data' => env('DEBUGBAR_OPTIONS_VIEWS_DATA', false), // True for all data, 'keys' for only names, false for no parameters. + 'group' => (int) env('DEBUGBAR_OPTIONS_VIEWS_GROUP', 50), // Group duplicate views. Pass value to auto-group, or true/false to force + 'exclude_paths' => [ // Add the paths which you don't want to appear in the views + 'vendor/filament', // Exclude Filament components by default + ], + ], + 'inertia' => [ + 'pages' => env('DEBUGBAR_OPTIONS_VIEWS_INERTIA_PAGES', 'js/Pages'), // Path for Inertia views + ], + 'route' => [ + 'label' => env('DEBUGBAR_OPTIONS_ROUTE_LABEL', true), // Show complete route on bar + ], + 'session' => [ + 'masked' => [], // List of keys that are masked + ], + 'symfony_request' => [ + 'label' => env('DEBUGBAR_OPTIONS_SYMFONY_REQUEST_LABEL', true), // Show route on bar + 'masked' => [], // List of keys that are masked + ], + 'events' => [ + 'data' => env('DEBUGBAR_OPTIONS_EVENTS_DATA', false), // Collect events data + 'listeners' => env('DEBUGBAR_OPTIONS_EVENTS_LISTENERS', false), // Add listeners to the events data + 'excluded' => [], // Example: ['eloquent.*', 'composing', Illuminate\Cache\Events\CacheHit::class] + ], + 'logs' => [ + 'file' => env('DEBUGBAR_OPTIONS_LOGS_FILE'), + ], + 'config' => [ + 'masked' => [], + ], + 'cache' => [ + 'values' => env('DEBUGBAR_OPTIONS_CACHE_VALUES', true), // Collect cache values + 'timeline' => env('DEBUGBAR_OPTIONS_CACHE_TIMELINE', false), // Add cache events to the timeline + ], + 'http_client' => [ + 'masked' => [], + 'timeline' => env('DEBUGBAR_OPTIONS_HTTP_CLIENT_TIMELINE', true), // Add requests to the timeline + ], + 'ai' => [ + 'values' => env('DEBUGBAR_OPTIONS_AI_VALUES', true), // Collect prompt/response/tool bodies + ], + ], + + /** + * Add any additional DataCollectors by adding the class name of a DataCollector or invokable class. + */ + 'custom_collectors' => [ + // MyCollector::class => env('DEBUGBAR_COLLECTORS_MYCOLLECTOR', true), ], /* @@ -66,14 +195,48 @@ | | Choose your preferred editor to use when clicking file name. | - | Supported: "phpstorm", "vscode", "vscode-insiders", "vscode-remote", - | "vscode-insiders-remote", "vscodium", "textmate", "emacs", - | "sublime", "atom", "nova", "macvim", "idea", "netbeans", - | "xdebug", "espresso" + | Supported: "sublime", "textmate", "emacs", "macvim", "codelite", + | "phpstorm", "phpstorm-remote", "idea", "idea-remote", + | "vscode", "vscode-insiders", "vscode-remote", "vscode-insiders-remote", + | "vscodium", "nova", "xdebug", "atom", "espresso", + | "netbeans", "cursor", "windsurf", "zed", "antigravity" | */ - 'editor' => env('DEBUGBAR_EDITOR', 'phpstorm'), + 'editor' => env('DEBUGBAR_EDITOR') ?: env('IGNITION_EDITOR', 'phpstorm'), + + /* + |-------------------------------------------------------------------------- + | Capture Ajax Requests + |-------------------------------------------------------------------------- + | + | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), + | you can use this option to disable sending the data through the headers. + | + | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools. + | + | Note for your request to be identified as ajax requests they must either send the header + | X-Requested-With with the value XMLHttpRequest (most JS libraries send this), or have application/json as a Accept header. + | + | By default `ajax_handler_auto_show` is set to true allowing ajax requests to be shown automatically in the Debugbar. + | Changing `ajax_handler_auto_show` to false will prevent the Debugbar from reloading. + | + | You can defer loading the dataset, so it will be loaded with ajax after the request is done. (Experimental) + | + | Streamed responses (SSE, StreamedResponse, Livewire streaming) lose the phpdebugbar-id response header. + | Enable `capture_streamed` to tag same-origin fetch/XHR requests with a phpdebugbar-request-id header and + | look the dataset up through the open handler afterwards (requires storage + the open handler enabled). + | `streamed_content_types` limits the fallback to these Content-Types; set it to an empty array or null to + | match any response missing the id header. Broaden it (e.g. text/html, application/json) for chunked responses. + */ + + 'capture_ajax' => env('DEBUGBAR_CAPTURE_AJAX', true), + 'add_ajax_timing' => env('DEBUGBAR_ADD_AJAX_TIMING', false), + 'ajax_handler_auto_show' => env('DEBUGBAR_AJAX_HANDLER_AUTO_SHOW', true), + 'ajax_handler_enable_tab' => env('DEBUGBAR_AJAX_HANDLER_ENABLE_TAB', true), + 'capture_streamed' => env('DEBUGBAR_CAPTURE_STREAMED', false), + 'streamed_content_types' => ['text/event-stream'], + 'defer_datasets' => env('DEBUGBAR_DEFER_DATASETS', false), /* |-------------------------------------------------------------------------- @@ -98,41 +261,65 @@ | */ - 'remote_sites_path' => env('DEBUGBAR_REMOTE_SITES_PATH', ''), - 'local_sites_path' => env('DEBUGBAR_LOCAL_SITES_PATH', ''), + 'remote_sites_path' => env('DEBUGBAR_REMOTE_SITES_PATH'), + 'local_sites_path' => env('DEBUGBAR_LOCAL_SITES_PATH', env('IGNITION_LOCAL_SITES_PATH')), + + /* + |-------------------------------------------------------------------------- + | Storage settings + |-------------------------------------------------------------------------- + | + | Debugbar stores data for session/ajax requests. + | You can disable this, so the debugbar stores data in headers/session, + | but this can cause problems with large data collectors. + | By default, file storage (in the storage folder) is used. Sqlite will + | create a database file in the storage folder. + | Redis and PDO can also be used. For PDO, run the package migrations first. + | + | Warning: Enabling storage.open will allow everyone to access previous + | request, do not enable open storage in publicly available environments! + | Specify a callback if you want to limit based on IP or authentication. + | Leaving it to null will allow localhost and private network IPs + | (eg. Docker/Sail or LAN) only. Set to false to disable it completely. + */ + 'storage' => [ + 'enabled' => env('DEBUGBAR_STORAGE_ENABLED', true), + 'open' => env('DEBUGBAR_OPEN_STORAGE'), // bool/callback. + 'driver' => env('DEBUGBAR_STORAGE_DRIVER', 'file'), // redis, file, sqlite, pdo, custom + 'path' => env('DEBUGBAR_STORAGE_PATH', storage_path('debugbar')), // For file driver + 'connection' => env('DEBUGBAR_STORAGE_CONNECTION'), // Leave null for default connection (Redis/PDO) + 'provider' => env('DEBUGBAR_STORAGE_PROVIDER', ''), // Instance of StorageInterface for custom driver + ], /* |-------------------------------------------------------------------------- - | Vendors + | Force Allow Debugbar to be Enabled during boot |-------------------------------------------------------------------------- | - | Vendor files are included by default, but can be set to false. - | This can also be set to 'js' or 'css', to only include javascript or css vendor files. - | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) - | and for js: jquery and and highlight.js - | So if you want syntax highlighting, set it to true. - | jQuery is set to not conflict with existing jQuery scripts. + | By default, debugbar can only be enabled when the app is in debug mode and not in production. + | For special cases, eg admin panels behind proper authentication, you can force debugbar to be enabled. + | Just this setting alone will not enable the Debugbar, but it will boot the Debugbar including routes and listeners, + | so you can enable it further in the requests using $debugbar->enable(). | - */ - - 'include_vendors' => true, + | Warning: Use with caution. Debugbar is a development tool and should never be exposed in non-trusted endpoints. + | + */ + 'force_allow_enable' => env('DEBUGBAR_FORCE_ALLOW_ENABLE', false), /* |-------------------------------------------------------------------------- - | Capture Ajax Requests + | Assets |-------------------------------------------------------------------------- | - | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), - | you can use this option to disable sending the data through the headers. - | - | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools. + | Vendor files are included by default, but can be set to false. + | This can also be set to 'js' or 'css', to only include javascript or css vendor files. + | Vendor files are for css: (none) + | and for js: highlight.js + | So if you want syntax highlighting, set it to true. | - | Note for your request to be identified as ajax requests they must either send the header - | X-Requested-With with the value XMLHttpRequest (most JS libraries send this), or have application/json as a Accept header. */ - - 'capture_ajax' => true, - 'add_ajax_timing' => false, + 'use_dist_files' => env('DEBUGBAR_USE_DIST_FILES', true), + 'include_vendors' => env('DEBUGBAR_INCLUDE_VENDORS', true), /* |-------------------------------------------------------------------------- @@ -142,98 +329,29 @@ | When enabled, the Debugbar shows deprecated warnings for Symfony components | in the Messages tab. | - */ - 'error_handler' => false, - - /* - |-------------------------------------------------------------------------- - | Clockwork integration - |-------------------------------------------------------------------------- - | - | The Debugbar can emulate the Clockwork headers, so you can use the Chrome - | Extension, without the server-side code. It uses Debugbar collectors instead. + | You can set a custom error reporting level to filter which errors are + | handled. For example, to exclude deprecation warnings: + | E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED | - */ - 'clockwork' => false, - - /* - |-------------------------------------------------------------------------- - | DataCollectors - |-------------------------------------------------------------------------- + | To exclude notices, strict warnings, and deprecations: + | E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_USER_DEPRECATED | - | Enable/disable DataCollectors + | Defaults to E_ALL (all errors). | */ - - 'collectors' => [ - 'phpinfo' => true, // Php version - 'messages' => true, // Messages - 'time' => true, // Time Datalogger - 'memory' => true, // Memory usage - 'exceptions' => true, // Exception displayer - 'log' => true, // Logs from Monolog (merged in messages if enabled) - 'db' => true, // Show database (PDO) queries and bindings - 'views' => true, // Views with their data - 'route' => true, // Current route information - 'auth' => false, // Display Laravel authentication status - 'gate' => true, // Display Laravel Gate checks - 'session' => true, // Display session data - 'symfony_request' => true, // Only one can be enabled.. - 'mail' => true, // Catch mail messages - 'laravel' => false, // Laravel version and environment - 'events' => false, // All events fired - 'default_request' => false, // Regular or special Symfony request logger - 'logs' => false, // Add the latest log messages - 'files' => false, // Show the included files - 'config' => false, // Display config settings - 'cache' => false, // Display cache events - 'models' => true, // Display models - 'livewire' => true, // Display Livewire (when available) - ], + 'error_handler' => env('DEBUGBAR_ERROR_HANDLER', false), + 'error_level' => env('DEBUGBAR_ERROR_LEVEL', E_ALL), /* |-------------------------------------------------------------------------- - | Extra options + | Clockwork integration |-------------------------------------------------------------------------- | - | Configure some DataCollectors + | The Debugbar can emulate the Clockwork headers, so you can use the Chrome + | Extension, without the server-side code. It uses Debugbar collectors instead. | */ - - 'options' => [ - 'auth' => [ - 'show_name' => true, // Also show the users name/email in the debugbar - ], - 'db' => [ - 'with_params' => true, // Render SQL with the parameters substituted - 'backtrace' => true, // Use a backtrace to find the origin of the query in your files. - 'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults) - 'timeline' => false, // Add the queries to the timeline - 'duration_background' => true, // Show shaded background on each query relative to how long it took to execute. - 'explain' => [ // Show EXPLAIN output on queries - 'enabled' => false, - 'types' => ['SELECT'], // Deprecated setting, is always only SELECT - ], - 'hints' => false, // Show hints for common mistakes - 'show_copy' => false, // Show copy button next to the query - ], - 'mail' => [ - 'full_log' => false, - ], - 'views' => [ - 'timeline' => false, // Add the views to the timeline (Experimental) - 'data' => false, //Note: Can slow down the application, because the data can be quite large.. - ], - 'route' => [ - 'label' => true, // show complete route on bar - ], - 'logs' => [ - 'file' => null, - ], - 'cache' => [ - 'values' => true, // collect cache values - ], - ], + 'clockwork' => env('DEBUGBAR_CLOCKWORK', false), /* |-------------------------------------------------------------------------- @@ -246,33 +364,42 @@ | */ - 'inject' => true, + 'inject' => env('DEBUGBAR_INJECT', true), /* |-------------------------------------------------------------------------- - | DebugBar route prefix + | Debugbar route prefix |-------------------------------------------------------------------------- | - | Sometimes you want to set route prefix to be used by DebugBar to load + | Sometimes you want to set route prefix to be used by Debugbar to load | its resources from. Usually the need comes from misconfigured web server or | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 | */ - 'route_prefix' => '_debugbar', + 'route_prefix' => env('DEBUGBAR_ROUTE_PREFIX', '_debugbar'), + + /* + |-------------------------------------------------------------------------- + | Debugbar route middleware + |-------------------------------------------------------------------------- + | + | Additional middleware to run on the Debugbar routes + */ + 'route_middleware' => [], /* |-------------------------------------------------------------------------- - | DebugBar route domain + | Debugbar route domain |-------------------------------------------------------------------------- | - | By default DebugBar route served from the same domain that request served. + | By default Debugbar route served from the same domain that request served. | To override default domain, specify it as a non-empty value. */ - 'route_domain' => null, + 'route_domain' => env('DEBUGBAR_ROUTE_DOMAIN'), /* |-------------------------------------------------------------------------- - | DebugBar theme + | Debugbar theme |-------------------------------------------------------------------------- | | Switches between light and dark theme. If set to auto it will respect system preferences @@ -285,8 +412,8 @@ | Backtrace stack limit |-------------------------------------------------------------------------- | - | By default, the DebugBar limits the number of frames returned by the 'debug_backtrace()' function. + | By default, the Debugbar limits the number of frames returned by the 'debug_backtrace()' function. | If you need larger stacktraces, you can increase this number. Setting it to 0 will result in no limit. */ - 'debug_backtrace_limit' => 50, + 'debug_backtrace_limit' => (int) env('DEBUGBAR_DEBUG_BACKTRACE_LIMIT', 50), ]; diff --git a/config/responsecache.php b/config/responsecache.php index 6b948aa..71a4151 100644 --- a/config/responsecache.php +++ b/config/responsecache.php @@ -1,5 +1,10 @@ env('RESPONSE_CACHE_ENABLED', true), - /* - * The given class will determinate if a request should be cached. The - * default class will cache all successful GET-requests. - * - * You can provide your own class given that it implements the - * CacheProfile interface. - */ - 'cache_profile' => Spatie\ResponseCache\CacheProfiles\CacheAllSuccessfulGetRequests::class, + 'cache' => [ + /* + * Here you may define the cache store that should be used + * to store requests. This can be the name of any store + * that is configured in app/config/cache.php + */ + 'store' => env('RESPONSE_CACHE_DRIVER', 'redis'), + + /* + * The default number of seconds responses will be cached + * when using the default CacheProfile settings. + */ + 'lifetime_in_seconds' => (int) env('RESPONSE_CACHE_LIFETIME', 86400), + + /* + * If the cache driver you configured supports tags, you may specify a tag name + * here. All responses will be tagged. When clearing the responsecache only + * items with that tag will be flushed. + * + * You may use a string or an array here. + */ + 'tag' => env('RESPONSE_CACHE_TAG', ''), + ], + + 'minimum_requests' => [ + /* + * The number of times a request must be seen before its + * response is stored. A higher number keeps pages that + * are requested only once, such as crawler traffic, + * out of the cache. + */ + 'count' => (int) env('RESPONSE_CACHE_MINIMUM_REQUESTS', 1), + + /* + * The number of seconds a request counts toward the minimum. + */ + 'lifetime_in_seconds' => (int) env('RESPONSE_CACHE_MINIMUM_REQUESTS_LIFETIME', 86400), + + /* + * The cache store that holds the request counters. Leave + * empty to use the response cache store above. + */ + 'store' => env('RESPONSE_CACHE_MINIMUM_REQUESTS_STORE'), + ], /* * Optionally, you can specify a header that will force a cache bypass. * This can be useful to monitor the performance of your application. */ - 'cache_bypass_header' => [ - 'name' => env('CACHE_BYPASS_HEADER_NAME', null), - 'value' => env('CACHE_BYPASS_HEADER_VALUE', null), + 'bypass' => [ + 'header_name' => env('CACHE_BYPASS_HEADER_NAME'), + 'header_value' => env('CACHE_BYPASS_HEADER_VALUE'), ], - /* - * When using the default CacheRequestFilter this setting controls the - * default number of seconds responses must be cached. - */ - 'cache_lifetime_in_seconds' => (int) env('RESPONSE_CACHE_LIFETIME', 86400), + 'debug' => [ + /* + * Determines if debug headers (cache time, status and age) are + * added to cached responses. This can be handy when debugging. + */ + 'enabled' => env('APP_DEBUG', false), - /* - * This setting determines if a http header named with the cache time - * should be added to a cached response. This can be handy when - * debugging. - */ - 'add_cache_time_header' => env('APP_DEBUG', false), + /* + * The name of the http header containing the time at which + * the response was cached. + */ + 'cache_time_header_name' => "{$tag}-responsecache", - /* - * This setting determines the name of the http header that contains - * the time at which the response was cached - */ - 'cache_time_header_name' => "{$tag}-responsecache", + /* + * The name of the http header that indicates whether a response + * was a HIT or a MISS. + */ + 'cache_status_header_name' => "{$tag}-responsecache-status", - /* - * This setting determines if a http header named with the cache age - * should be added to a cached response. This can be handy when - * debugging. - * ONLY works when "add_cache_time_header" is also active! - */ - 'add_cache_age_header' => env('RESPONSE_CACHE_AGE_HEADER', false), + /* + * The name of the http header containing the cache age in seconds. + */ + 'cache_age_header_name' => "{$tag}-responsecache-age", - /* - * This setting determines the name of the http header that contains - * the age of cache - */ - 'cache_age_header_name' => "{$tag}-responsecache-age", + /* + * The name of the http header containing the response cache key. + * This is only added when app.debug is enabled. + */ + 'cache_key_header_name' => "{$tag}-responsecache-key", + ], /* - * Here you may define the cache store that should be used to store - * requests. This can be the name of any store that is - * configured in app/config/cache.php + * These query parameters will be ignored when generating + * the cache key. This is useful for ignoring tracking + * parameters like UTM tags, gclid and also fbclid. */ - 'cache_store' => env('RESPONSE_CACHE_DRIVER', 'redis'), + 'ignored_query_parameters' => [ + 'utm_source', + 'utm_medium', + 'utm_campaign', + 'utm_term', + 'utm_content', + 'gclid', + 'fbclid', + ], /* - * Here you may define replacers that dynamically replace content from the response. - * Each replacer must implement the Replacer interface. + * Requests containing any of these headers will bypass cache reads + * and writes. This prevents full-page responses from being served + * to Livewire (Filament) requests. */ - 'replacers' => [ - \Spatie\ResponseCache\Replacers\CsrfTokenReplacer::class, + 'excluded_request_headers' => [ + 'X-Livewire', + 'X-Livewire-Navigate', + 'X-Inertia', ], /* - * If the cache driver you configured supports tags, you may specify a tag name - * here. All responses will be tagged. When clearing the responsecache only - * items with that tag will be flushed. + * The given class will determinate if a request should be cached. The + * default class will cache all successful GET-requests. * - * You may use a string or an array here. + * You can provide your own class given that it implements the + * CacheProfile interface. */ - 'cache_tag' => '', + 'cache_profile' => SkipCacheWhenSessionHasFlash::class, /* * This class is responsible for generating a hash for a request. This hash * is used to look up a cached response. */ - 'hasher' => \Spatie\ResponseCache\Hasher\DefaultHasher::class, + 'hasher' => DefaultHasher::class, /* * This class is responsible for serializing responses. */ - 'serializer' => \Spatie\ResponseCache\Serializers\DefaultSerializer::class, + 'serializer' => JsonSerializer::class, + + /* + * Here you may define replacers that dynamically replace content from the response. + * Each replacer must implement the Replacer interface. + */ + 'replacers' => [ + CsrfTokenReplacer::class, + ], ]; diff --git a/config/sweetalert.php b/config/sweetalert.php index 4385d09..9dc520f 100644 --- a/config/sweetalert.php +++ b/config/sweetalert.php @@ -4,209 +4,240 @@ /* |-------------------------------------------------------------------------- - | CDN LINK + | Default Alert Type |-------------------------------------------------------------------------- - | By default SweetAlert2 use its local sweetalert.all.js - | file. - | However, you can use its cdn if you want. + | + | This value determines the default alert type when none is specified. | */ - 'cdn' => env('SWEET_ALERT_CDN'), + 'default' => env('SWEET_ALERT_DEFAULT', 'alert'), /* |-------------------------------------------------------------------------- - | Always load the sweetalert.all.js + | CDN Link |-------------------------------------------------------------------------- - | There might be situations where you will always want the sweet alert - | js package to be there for you. (for eg. you might use it heavily to - | show notifications or you might want to use the native js) then this - | might be handy. + | + | By default, SweetAlert2 uses its local sweetalert2.min.js file. + | However, you can use a CDN if you prefer. | */ - 'alwaysLoadJS' => env('SWEET_ALERT_ALWAYS_LOAD_JS', false), + 'cdn' => env('SWEET_ALERT_CDN'), /* |-------------------------------------------------------------------------- - | Never load the sweetalert.all.js + | JavaScript Loading Control |-------------------------------------------------------------------------- - | If you want to handle the sweet alert js package by yourself - | (for eg. you might want to use laravel mix) then this can be - | handy. - | If you set always load js to true & never load js to false, - | it's going to prioritize the never load js. | - | alwaysLoadJs = true & neverLoadJs = true => js will not be loaded - | alwaysLoadJs = true & neverLoadJs = false => js will be loaded - | alwaysLoadJs = false & neverLoadJs = false => js will be loaded when - | you set alert/toast by using the facade/helper functions. + | always_load_js: Always include the SweetAlert2 JS on every page. + | never_load_js: Never include the JS (handle it yourself with Mix/Vite). + | + | alwaysLoadJs = true & neverLoadJs = true => JS will NOT be loaded + | alwaysLoadJs = true & neverLoadJs = false => JS will be loaded + | alwaysLoadJs = false & neverLoadJs = false => JS loaded only when alert is set + | */ - 'neverLoadJS' => env('SWEET_ALERT_NEVER_LOAD_JS', false), + 'always_load_js' => env('SWEET_ALERT_ALWAYS_LOAD_JS', false), + 'never_load_js' => env('SWEET_ALERT_NEVER_LOAD_JS', false), /* |-------------------------------------------------------------------------- - | AutoClose Timer + | Default Modal Settings |-------------------------------------------------------------------------- | - | This is for the all Modal windows. - | For specific modal just use the autoClose() helper method. + | These values are used as defaults for all modal windows. + | Override them per-alert using the fluent API methods. | */ 'timer' => env('SWEET_ALERT_TIMER', 5000), /* - |-------------------------------------------------------------------------- - | Width - |-------------------------------------------------------------------------- - | - | Modal window width, including paddings (box-sizing: border-box). - | Can be in px or %. - | The default width is 32rem. - | This is for the all Modal windows. - | for particular modal just use the width() helper method. + | Width, padding and background are sent to SweetAlert2 only when you set + | them. SweetAlert2 turns each one into an inline style on the popup, and an + | inline style beats every stylesheet — so a hard-coded background here + | would override the theme you picked and every alert would stay white. + | Leave them null and the active theme's own CSS decides. */ - - 'width' => env('SWEET_ALERT_WIDTH', '32rem'), + 'width' => env('SWEET_ALERT_WIDTH'), + 'padding' => env('SWEET_ALERT_PADDING'), + 'background' => env('SWEET_ALERT_BACKGROUND'), + 'show_confirm_button' => env('SWEET_ALERT_SHOW_CONFIRM_BUTTON', true), + 'show_close_button' => env('SWEET_ALERT_SHOW_CLOSE_BUTTON', false), /* |-------------------------------------------------------------------------- - | Height Auto + | Button Text |-------------------------------------------------------------------------- - | By default, SweetAlert2 sets html's and body's CSS height to auto !important. - | If this behavior isn't compatible with your project's layout, - | set heightAuto to false. + | + | Default text for the modal buttons. Translations will be handled + | by Laravel at runtime. | */ - 'height_auto' => env('SWEET_ALERT_HEIGHT_AUTO', true), + 'button_text' => [ + 'confirm' => env('SWEET_ALERT_CONFIRM_BUTTON_TEXT', 'OK'), + 'cancel' => env('SWEET_ALERT_CANCEL_BUTTON_TEXT', 'Cancel'), + 'deny' => env('SWEET_ALERT_DENY_BUTTON_TEXT', 'Deny'), + ], /* |-------------------------------------------------------------------------- - | Padding + | Toast Settings |-------------------------------------------------------------------------- | - | Modal window padding. - | Can be in px or %. - | The default padding is 1.25rem. - | This is for the all Modal windows. - | for particular modal just use the padding() helper method. + | Default configuration for toast notifications. + | */ - 'padding' => env('SWEET_ALERT_PADDING', '1.25rem'), + 'toast' => [ + 'position' => env('SWEET_ALERT_TOAST_POSITION', 'top-end'), + 'auto_close' => env('SWEET_ALERT_TOAST_AUTO_CLOSE', 5000), + 'show_close_button' => env('SWEET_ALERT_TOAST_CLOSE_BUTTON', true), + 'show_confirm_button' => false, + 'timer_progress_bar' => env('SWEET_ALERT_TOAST_PROGRESS_BAR', true), + ], /* |-------------------------------------------------------------------------- - | Animation + | Middleware Settings |-------------------------------------------------------------------------- - | Custom animation with [Animate.css](https://daneden.github.io/animate.css/) - | If set to false, modal CSS animation will be use default ones. - | For specific modal just use the animation() helper method. + | + | Configuration for the ToSweetAlert middleware behavior. | */ - 'animation' => [ - 'enable' => env('SWEET_ALERT_ANIMATION_ENABLE', false), + 'middleware' => [ + 'auto_display_errors' => env('SWEET_ALERT_AUTO_DISPLAY_ERRORS', true), + 'toast_position' => env('SWEET_ALERT_MIDDLEWARE_TOAST_POSITION', 'top'), + 'auto_close' => env('SWEET_ALERT_MIDDLEWARE_AUTO_CLOSE', true), + 'timer' => env('SWEET_ALERT_MIDDLEWARE_TIMER', 5000), + 'toast_close_button' => env('SWEET_ALERT_MIDDLEWARE_TOAST_CLOSE_BUTTON', true), ], - 'animatecss' => env('SWEET_ALERT_ANIMATECSS', 'https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css'), - /* |-------------------------------------------------------------------------- - | ShowConfirmButton + | Confirm Dialog Settings |-------------------------------------------------------------------------- - | If set to false, a "Confirm"-button will not be shown. - | It can be useful when you're using custom HTML description. - | This is for the all Modal windows. - | For specific modal just use the showConfirmButton() helper method. + | + | Default configuration for general confirm dialogs, and for the guarded + | links and forms marked with data-confirm. + | + | `auto` emits the small listener that makes data-confirm and + | data-confirm-delete work on every page. Turn it off if you would rather + | wire the confirmation up yourself. | */ - 'show_confirm_button' => env('SWEET_ALERT_CONFIRM_BUTTON', true), + 'confirm' => [ + 'auto' => env('SWEET_ALERT_AUTO_CONFIRM', true), + 'icon' => 'question', + 'title' => 'Are you sure?', + 'text' => '', + 'confirm_button_text' => 'Yes', + 'confirm_button_color' => '#3085d6', + 'cancel_button_text' => 'Cancel', + 'show_cancel_button' => true, + 'show_close_button' => false, + ], /* |-------------------------------------------------------------------------- - | ShowCloseButton + | Confirm Delete Settings |-------------------------------------------------------------------------- - | If set to true, a "Close"-button will be shown, - | which the user can click on to dismiss the modal. - | This is for the all Modal windows. - | For specific modal just use the showCloseButton() helper method. + | + | Default configuration for the confirmDelete() dialog. | */ - 'show_close_button' => env('SWEET_ALERT_CLOSE_BUTTON', false), + 'confirm_delete' => [ + 'icon' => 'warning', + 'title' => 'Are you sure?', + 'text' => 'This cannot be undone.', + 'confirm_button_text' => 'Yes, delete it!', + 'confirm_button_color' => '#d33', + 'cancel_button_text' => 'Cancel', + 'show_close_button' => false, + 'show_cancel_button' => true, + 'show_loader_on_confirm' => true, + ], /* |-------------------------------------------------------------------------- - | Toast position + | Animation Settings |-------------------------------------------------------------------------- - | Modal window or toast position, can be 'top', - | 'top-start', 'top-end', 'center', 'center-start', - | 'center-end', 'bottom', 'bottom-start', or 'bottom-end'. - | For specific modal just use the position() helper method. + | + | Custom animation using Animate.css. | */ - 'toast_position' => env('SWEET_ALERT_TOAST_POSITION', 'top-end'), + 'animation' => [ + 'enabled' => env('SWEET_ALERT_ANIMATION_ENABLE', false), + 'animatecss' => env('SWEET_ALERT_ANIMATECSS'), + ], /* |-------------------------------------------------------------------------- - | Progress Bar + | Theme |-------------------------------------------------------------------------- - | If set to true, a progress bar at the bottom of a popup will be shown. - | It can be useful with toasts. + | + | SweetAlert2 theme. Set to 'default' for the standard theme, + | or use any theme from @sweetalert2/theme-* package. | */ - 'timer_progress_bar' => env('SWEET_ALERT_TIMER_PROGRESS_BAR', false), + 'theme' => env('SWEET_ALERT_THEME', 'light'), /* |-------------------------------------------------------------------------- - | Middleware + | Presets |-------------------------------------------------------------------------- - | Modal window or toast, config for the Middleware + | + | Named presets that can be applied with ->preset('name'). + | Each preset is an array of SweetAlert2 config options that + | are merged onto the current builder configuration. + | + | Example: + | Alert::preset('danger')->title('Oops!')->flash(); | */ - 'middleware' => [ - - 'autoClose' => env('SWEET_ALERT_MIDDLEWARE_AUTO_CLOSE', true), - - 'toast_position' => env('SWEET_ALERT_MIDDLEWARE_TOAST_POSITION', 'top'), - - 'toast_close_button' => env('SWEET_ALERT_MIDDLEWARE_TOAST_CLOSE_BUTTON', true), - - 'timer' => env('SWEET_ALERT_MIDDLEWARE_ALERT_CLOSE_TIME', 5000), - - 'auto_display_error_messages' => env('SWEET_ALERT_AUTO_DISPLAY_ERROR_MESSAGES', true), + 'presets' => [ + // 'danger' => [ + // 'icon' => 'error', + // 'confirmButtonColor' => '#d33', + // 'showCancelButton' => true, + // ], + // 'success-toast' => [ + // 'toast' => true, + // 'position' => 'top-end', + // 'icon' => 'success', + // 'timer' => 3000, + // 'timerProgressBar' => true, + // 'showConfirmButton' => false, + // ], ], /* |-------------------------------------------------------------------------- - | Custom Class + | JavaScript Source Settings |-------------------------------------------------------------------------- - | A custom CSS class for the modal: + | + | source: 'cdn' (default), 'npm' (set never_load_js=true and manage Swal + | yourself via npm), 'manual' (full control, nothing injected). + | version: pinned SweetAlert2 version used when source='cdn'. + | cdn_provider: 'jsdelivr' (default), 'unpkg', 'cdnjs', 'custom'. + | custom_cdn_js: only used when cdn_provider='custom'. | */ - 'customClass' => [ - - 'container' => env('SWEET_ALERT_CONTAINER_CLASS'), - 'popup' => env('SWEET_ALERT_POPUP_CLASS'), - 'header' => env('SWEET_ALERT_HEADER_CLASS'), - 'title' => env('SWEET_ALERT_TITLE_CLASS'), - 'closeButton' => env('SWEET_ALERT_CLOSE_BUTTON_CLASS'), - 'icon' => env('SWEET_ALERT_ICON_CLASS'), - 'image' => env('SWEET_ALERT_IMAGE_CLASS'), - 'content' => env('SWEET_ALERT_CONTENT_CLASS'), - 'input' => env('SWEET_ALERT_INPUT_CLASS'), - 'actions' => env('SWEET_ALERT_ACTIONS_CLASS'), - 'confirmButton' => env('SWEET_ALERT_CONFIRM_BUTTON_CLASS'), - 'cancelButton' => env('SWEET_ALERT_CANCEL_BUTTON_CLASS'), - 'footer' => env('SWEET_ALERT_FOOTER_CLASS'), + 'js' => [ + 'source' => env('SWEET_ALERT_JS_SOURCE', 'cdn'), + 'version' => env('SWEET_ALERT_VERSION', '11'), + 'cdn_provider' => env('SWEET_ALERT_CDN_PROVIDER', 'jsdelivr'), + 'custom_cdn_js' => env('SWEET_ALERT_CDN_JS'), ], ]; diff --git a/deploy.php b/deploy.php index 535ea9a..c39a4a5 100644 --- a/deploy.php +++ b/deploy.php @@ -34,11 +34,15 @@ require 'recipe/laravel.php'; require __DIR__.'/vendor/austinmastlab/deployer-recipes/recipe/ssm-env.php'; +require __DIR__.'/vendor/austinmastlab/deployer-recipes/recipe/ci-artifacts.php'; require 'deploy/custom.php'; // .env is generated from SSM /digitizationacademy/{environment} by env:ssm (austinmastlab/deployer-recipes). set('ssm_app', 'digitizationacademy'); +// supervisor:reload (deployer-recipes) updates only this site's Supervisor group +set('supervisor_groups', ['da']); + // Deployment Configuration set('repository', 'https://github.com/AustinMastLab/DigitizationAcademy.git'); set('base_path', '/data/web'); @@ -125,7 +129,7 @@ 'artisan:storage:link', // Create symbolic link for storage directory 'artisan:package:discover', // Run package discovery 'artisan:horizon:publish', // Publish Laravel Horizon assets - 'artisan:sweetalert:publish', // Publish Sweet Alert assets + 'artisan:alert:publish', // Publish the Sweet Alert JavaScript the alert view loads 'artisan:filament:assets', 'artisan:app:deploy-files', // Custom app deployment files diff --git a/deploy/custom.php b/deploy/custom.php index e94ef28..734bf85 100644 --- a/deploy/custom.php +++ b/deploy/custom.php @@ -76,75 +76,13 @@ /** * Publish Sweet Alert 2 assets - * Executes the sweetalert:publish artisan command + * Publishes public/vendor/sweetalert/sweet-alert.js, which the Sweet Alert view loads (public/vendor isn't in git) */ -desc('Publish all Sweet Alert 2 assets'); -task('artisan:sweetalert:publish', artisan('sweetalert:publish')); +desc('Publish the Sweet Alert JavaScript'); +task('artisan:alert:publish', artisan('alert:publish --assets --force')); -/** - * Reload Supervisor configuration - * Executes reread and update commands for Supervisor - */ -desc('Reload Supervisor configuration (config-only update)'); -task('supervisor:reload', function () { - run('sudo supervisorctl reread'); - run('sudo supervisorctl update'); -}); - -/* - * ============================================================================= - * CI/CD ARTIFACT DEPLOYMENT - CORE FEATURE - * ============================================================================= - */ - -desc('Download and extract pre-built assets from GitHub Actions'); -task('deploy:ci-artifacts', function () { - // Environment variables automatically provided by GitHub Actions workflow - $githubToken = $_ENV['GITHUB_TOKEN'] ?? getenv('GITHUB_TOKEN') ?? ''; - $githubSha = $_ENV['GITHUB_SHA'] ?? getenv('GITHUB_SHA') ?? ''; - $githubRepo = $_ENV['GITHUB_REPO'] ?? getenv('GITHUB_REPO') ?? 'AustinMastLab/DigitizationAcademy'; - - // Validate required environment variables - if (empty($githubToken) || empty($githubSha)) { - throw new \Exception('GITHUB_TOKEN and GITHUB_SHA environment variables are required.'); - } - - // Artifact naming convention: digitizationacademy-{git-sha} - $artifactName = "digitizationacademy-{$githubSha}"; - writeln("Downloading CI artifact: {$artifactName}"); - - // Step 1: Get artifact download URL from GitHub API - $apiUrl = "https://api.github.com/repos/{$githubRepo}/actions/artifacts"; - $response = runLocally("curl -H 'Authorization: Bearer {$githubToken}' -H 'Accept: application/vnd.github.v3+json' '{$apiUrl}?name={$artifactName}&per_page=1'"); - $artifacts = json_decode($response, true); - - if (empty($artifacts['artifacts'])) { - throw new \Exception("No CI artifact found with name: {$artifactName}"); - } - - $downloadUrl = $artifacts['artifacts'][0]['archive_download_url']; - cd('{{release_or_current_path}}'); - - // Step 2: Download and extract - run("curl -L -H 'Authorization: Bearer {$githubToken}' -H 'Accept: application/vnd.github.v3+json' '{$downloadUrl}' -o artifact.zip"); - run('unzip -o -q artifact.zip'); - - // Step 3: Biospex-style Nesting Correction - $nestLevelCmd = run('find . -type d -name "deployment-package" -printf "%p\\n" | wc -l'); - $nests = (int) trim($nestLevelCmd); - - if ($nests > 0) { - $innermost = run('find . -type d -name "deployment-package" | sort -r | head -1'); - $innermost = trim($innermost); - if (! empty($innermost)) { - run("rsync -av '{$innermost}/' ./"); - run('find . -type d -name "deployment-package" -exec rm -rf {} +'); - } - } - - run('rm -f artifact.zip'); - writeln('✅ CI artifacts deployed successfully (Flat structure ensured)'); -}); +// deploy:ci-artifacts, deploy:verify-structure and supervisor:reload come from +// deployer-recipes/recipe/ci-artifacts.php (required in deploy.php). /* * ============================================================================= @@ -152,15 +90,6 @@ * ============================================================================= */ -desc('Verify flat deployment structure'); -task('deploy:verify-structure', function () { - $nestCheck = run('find {{release_path}} -type d -name "deployment-package" | wc -l'); - if ((int) trim($nestCheck) > 0) { - throw new \Exception("Nesting detected post-deploy: {$nestCheck} dirs. Check CI artifact."); - } - writeln('✅ Deployment structure verified: flat and clean'); -}); - /** * Clear package discovery cache before running composer operations * This prevents conflicts when packages are removed (like Nova) diff --git a/package.json b/package.json index dbd194d..f0c8501 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "jquery": "^4.0.0", "laravel-mix": "^6.0.49", "lodash": "^4.18.1", - "postcss": "^8.5.29" + "postcss": "^8.5.31" }, "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610" } diff --git a/resources/css/main.css b/resources/css/main.css index 9d12f90..8fa438c 100644 --- a/resources/css/main.css +++ b/resources/css/main.css @@ -1757,7 +1757,7 @@ ul.course-objectives li{ .mb--50 { margin-bottom: 50px !important; } -.mt--40 { +.mb--40 { margin-bottom: 40px !important; } .mb--30 { diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 2225d2f..8e05115 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -58,7 +58,7 @@ class="back-to-top" @auth @endauth -@include('sweetalert::alert') +@sweetAlert @stack('scripts') diff --git a/resources/views/vendor/sweetalert/alert.blade.php b/resources/views/vendor/sweetalert/alert.blade.php deleted file mode 100644 index 75c97f5..0000000 --- a/resources/views/vendor/sweetalert/alert.blade.php +++ /dev/null @@ -1,14 +0,0 @@ -@if (config('sweetalert.alwaysLoadJS') === true && config('sweetalert.neverLoadJS') === false ) - -@endif -@if (Session::has('alert.config')) - @if(config('sweetalert.animation.enable')) - - @endif - @if (config('sweetalert.alwaysLoadJS') === false && config('sweetalert.neverLoadJS') === false) - - @endif - -@endif diff --git a/tests/Feature/ContactFormTest.php b/tests/Feature/ContactFormTest.php index 6bbc7cd..6d90294 100644 --- a/tests/Feature/ContactFormTest.php +++ b/tests/Feature/ContactFormTest.php @@ -46,6 +46,21 @@ Mail::assertQueued(Contact::class); }); +it('shows the sent message as a Sweet Alert toast after redirecting', function () { + Mail::fake(); + $honeypotFields = getHoneypotFields('/contact'); + $this->travel(config('honeypot.amount_of_seconds') + 1)->seconds(); + + $response = $this->followingRedirects()->from('/contact')->post('/contact', array_merge([ + 'name' => 'John Doe', + 'email' => 'john@example.com', + 'message' => 'Hello, this is a test message.', + ], $honeypotFields)); + + $response->assertOk() + ->assertSee('vendor/sweetalert/sweet-alert.js', false) + ->assertSee('Contact message sent successfully.'); +}); it('cannot submit contact form if honeypot is tripped', function () { Mail::fake(); diff --git a/tests/Feature/ResponseCacheTest.php b/tests/Feature/ResponseCacheTest.php new file mode 100644 index 0000000..ab0d99c --- /dev/null +++ b/tests/Feature/ResponseCacheTest.php @@ -0,0 +1,71 @@ +. + */ + +use Illuminate\Support\Facades\Mail; +use Spatie\ResponseCache\Facades\ResponseCache; + +beforeEach(function () { + config([ + 'responsecache.enabled' => true, + 'responsecache.debug.enabled' => true, + ]); + + ResponseCache::clear(); +}); + +it('serves a public page from the response cache on the second request', function () { + $statusHeader = config('responsecache.debug.cache_status_header_name'); + + $this->get(route('home')) + ->assertOk() + ->assertHeader($statusHeader, 'MISS'); + + $this->get(route('home')) + ->assertOk() + ->assertHeader($statusHeader, 'HIT'); +}); + +it('does not serve cached pages to livewire requests', function () { + $statusHeader = config('responsecache.debug.cache_status_header_name'); + + $this->get(route('home')); + + $this->withHeader('X-Livewire', 'true') + ->get(route('home')) + ->assertOk() + ->assertHeaderMissing($statusHeader); +}); + +it('shows the contact toast after redirecting to a cached contact page', function () { + Mail::fake(); + $honeypotFields = getHoneypotFields('/contact'); + $this->get('/contact')->assertHeader(config('responsecache.debug.cache_status_header_name'), 'HIT'); + $this->travel(config('honeypot.amount_of_seconds') + 1)->seconds(); + + $this->followingRedirects()->from('/contact')->post('/contact', array_merge([ + 'name' => 'John Doe', + 'email' => 'john@example.com', + 'message' => 'Hello, this is a test message.', + ], $honeypotFields)) + ->assertOk() + ->assertSee('Contact message sent successfully.'); + + $this->get('/contact')->assertDontSee('Contact message sent successfully.'); +}); diff --git a/yarn.lock b/yarn.lock index d870845..038ae51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3624,7 +3624,7 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -nanoid@^3.3.19: +nanoid@^3.3.20: version "3.3.20" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.20.tgz#dfd4444d85aa10111ef66ba85ed72e08ba0855d8" integrity sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ== @@ -4212,12 +4212,12 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.2.15, postcss@^8.5.29: - version "8.5.29" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.29.tgz#086a0ded2c0257c71efb8c68776b477774714b4a" - integrity sha512-49cGhUbXj8Qenv0iTMxA1cFBzxXoctpC9Ujd77t1WcbJIr6nF/eI7g/8MgxrYldFRuAXvja7xQRwavoW7kgrxQ== +postcss@^8.2.15, postcss@^8.5.31: + version "8.5.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.31.tgz#d44731fa02f8ae8371629ec7220e2ae0dbdf23ec" + integrity sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg== dependencies: - nanoid "^3.3.19" + nanoid "^3.3.20" picocolors "^1.1.1" source-map-js "^1.2.2"