diff --git a/.env.ci b/.env.ci index cb382e7..858375c 100644 --- a/.env.ci +++ b/.env.ci @@ -12,7 +12,8 @@ LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug -FLARE_KEY= +NIGHTWATCH_ENABLED=false + DB_CONNECTION=pgsql DB_HOST=127.0.0.1 diff --git a/.env.example b/.env.example index 68c74d5..0955855 100644 --- a/.env.example +++ b/.env.example @@ -5,11 +5,14 @@ APP_DEBUG=true APP_URL=https://web.codebar.test LOG_CHANNEL=stack -LOG_STACK=single,flare +LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug -FLARE_KEY= +# Laravel Nightwatch. Disabled locally; set the token in staging/production. +# The agent ships with Laravel Cloud — elsewhere it has to be supervised. +NIGHTWATCH_ENABLED=false +NIGHTWATCH_TOKEN= DB_CONNECTION=pgsql DB_HOST=127.0.0.1 diff --git a/composer.json b/composer.json index de8ca5f..604e8dc 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "php": "^8.5", "codebar-ag/laravel-flysystem-cloudinary": "^13.0", "laravel/framework": "^13.0", + "laravel/nightwatch": "^1.28", "laravel/tinker": "^3.0", "league/flysystem-aws-s3-v3": "^3.28", "mazedlx/laravel-feature-policy": "^2.2", @@ -25,7 +26,8 @@ "spatie/laravel-translatable": "^6.14", "spatie/security-advisories-health-check": "^1.2", "symfony/http-client": "^8.1", - "symfony/postmark-mailer": "^8.1" + "symfony/postmark-mailer": "^8.1", + "symfony/yaml": "^8.1" }, "require-dev": { "fakerphp/faker": "^1.23", @@ -41,7 +43,6 @@ "pestphp/pest-plugin-type-coverage": "^4.0", "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan": "^2.2", - "spatie/laravel-ignition": "^2.7", "spatie/laravel-ray": "^1.39" }, "autoload": { diff --git a/composer.lock b/composer.lock index a2ed68a..70398f3 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": "7c0b66206ab1d7cd2168ac64c9f8ab35", + "content-hash": "9422b7f25d3ffd6944e507156ddfdc87", "packages": [ { "name": "aws/aws-crt-php", @@ -1711,6 +1711,100 @@ }, "time": "2026-07-27T14:48:58+00:00" }, + { + "name": "laravel/nightwatch", + "version": "v1.28.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/nightwatch.git", + "reference": "03b8676e383394a0abe195cc7b942da352553825" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/nightwatch/zipball/03b8676e383394a0abe195cc7b942da352553825", + "reference": "03b8676e383394a0abe195cc7b942da352553825", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "guzzlehttp/promises": "^2.0", + "laravel/framework": "^10.0|^11.0|^12.0|^13.0", + "monolog/monolog": "^3.6", + "nesbot/carbon": "^2.0|^3.0", + "php": "^8.2", + "psr/http-message": "^1.0|^2.0", + "psr/log": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.0", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/http-foundation": "^6.0|^7.0|^8.0", + "symfony/polyfill-php84": "^1.29" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.349", + "ext-pcntl": "*", + "ext-pdo": "*", + "guzzlehttp/guzzle": "^7.0", + "guzzlehttp/psr7": "^2.0", + "laravel/horizon": "^5.4", + "laravel/pint": "1.21.0", + "laravel/vapor-core": "^2.38.2", + "livewire/livewire": "^2.0|^3.0", + "mockery/mockery": "^1.0", + "mongodb/laravel-mongodb": "^4.0|^5.0", + "orchestra/testbench": "^8.0|^9.0|^10.0|^11.0", + "orchestra/testbench-core": "^8.0|^9.0|^10.0|^11.0", + "orchestra/workbench": "^8.0|^9.0|^10.0|^11.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^10.0|^11.0|^12.0", + "singlestoredb/singlestoredb-laravel": "^1.0|^2.0", + "spatie/laravel-ignition": "^2.0", + "symfony/mailer": "^6.0|^7.0|^8.0", + "symfony/mime": "^6.0|^7.0|^8.0", + "symfony/var-dumper": "^6.0|^7.0|^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Nightwatch": "Laravel\\Nightwatch\\Facades\\Nightwatch" + }, + "providers": [ + "Laravel\\Nightwatch\\NightwatchServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "agent/helpers.php" + ], + "psr-4": { + "Laravel\\Nightwatch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The official Laravel Nightwatch package.", + "homepage": "https://nightwatch.laravel.com", + "keywords": [ + "Insights", + "laravel", + "monitoring" + ], + "support": { + "docs": "https://nightwatch.laravel.com/docs", + "issues": "https://github.com/laravel/nightwatch/issues", + "source": "https://github.com/laravel/nightwatch" + }, + "time": "2026-07-28T00:33:11+00:00" + }, { "name": "laravel/prompts", "version": "v0.3.21", @@ -3986,70 +4080,6 @@ ], "time": "2026-03-25T22:41:46+00:00" }, - { - "name": "spatie/backtrace", - "version": "1.8.2", - "source": { - "type": "git", - "url": "https://github.com/spatie/backtrace.git", - "reference": "8ffe78be5ed355b5009e3dd989d183433e9a5adc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/8ffe78be5ed355b5009e3dd989d183433e9a5adc", - "reference": "8ffe78be5ed355b5009e3dd989d183433e9a5adc", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "ext-json": "*", - "laravel/serializable-closure": "^1.3 || ^2.0", - "phpunit/phpunit": "^9.3 || ^11.4.3", - "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1.6", - "symfony/var-dumper": "^5.1|^6.0|^7.0|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Backtrace\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van de Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "A better backtrace", - "homepage": "https://github.com/spatie/backtrace", - "keywords": [ - "Backtrace", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/backtrace/issues", - "source": "https://github.com/spatie/backtrace/tree/1.8.2" - }, - "funding": [ - { - "url": "https://github.com/sponsors/spatie", - "type": "github" - }, - { - "url": "https://spatie.be/open-source/support-us", - "type": "other" - } - ], - "time": "2026-03-11T13:48:28+00:00" - }, { "name": "spatie/crawler", "version": "9.4.1", @@ -4206,235 +4236,6 @@ ], "time": "2022-04-22T08:51:55+00:00" }, - { - "name": "spatie/error-solutions", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/spatie/error-solutions.git", - "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/error-solutions/zipball/e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", - "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "illuminate/broadcasting": "^10.0|^11.0|^12.0", - "illuminate/cache": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "livewire/livewire": "^2.11|^3.5.20", - "openai-php/client": "^0.10.1", - "orchestra/testbench": "8.22.3|^9.0|^10.0", - "pestphp/pest": "^2.20|^3.0", - "phpstan/phpstan": "^2.1", - "psr/simple-cache": "^3.0", - "psr/simple-cache-implementation": "^3.0", - "spatie/ray": "^1.28", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "simple-cache-implementation": "To cache solutions from OpenAI" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Ignition\\": "legacy/ignition", - "Spatie\\ErrorSolutions\\": "src", - "Spatie\\LaravelIgnition\\": "legacy/laravel-ignition" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ruben Van Assche", - "email": "ruben@spatie.be", - "role": "Developer" - } - ], - "description": "This is my package error-solutions", - "homepage": "https://github.com/spatie/error-solutions", - "keywords": [ - "error-solutions", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/error-solutions/issues", - "source": "https://github.com/spatie/error-solutions/tree/1.1.3" - }, - "funding": [ - { - "url": "https://github.com/Spatie", - "type": "github" - } - ], - "time": "2025-02-14T12:29:50+00:00" - }, - { - "name": "spatie/flare-client-php", - "version": "1.11.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/flare-client-php.git", - "reference": "53f41b08a27cc039e1a8ed2be9a202e924f31bad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/53f41b08a27cc039e1a8ed2be9a202e924f31bad", - "reference": "53f41b08a27cc039e1a8ed2be9a202e924f31bad", - "shasum": "" - }, - "require": { - "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", - "php": "^8.0", - "spatie/backtrace": "^1.6.1", - "symfony/http-foundation": "^5.2|^6.0|^7.0|^8.0", - "symfony/mime": "^5.2|^6.0|^7.0|^8.0", - "symfony/process": "^5.2|^6.0|^7.0|^8.0", - "symfony/var-dumper": "^5.2|^6.0|^7.0|^8.0" - }, - "require-dev": { - "dms/phpunit-arraysubset-asserts": "^0.5.0", - "pestphp/pest": "^1.20|^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "spatie/pest-plugin-snapshots": "^1.0|^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.3.x-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Spatie\\FlareClient\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Send PHP errors to Flare", - "homepage": "https://github.com/spatie/flare-client-php", - "keywords": [ - "exception", - "flare", - "reporting", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.11.1" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2026-05-15T09:31:32+00:00" - }, - { - "name": "spatie/ignition", - "version": "1.16.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/ignition.git", - "reference": "b59385bb7aa24dae81bcc15850ebecfda7b40838" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/b59385bb7aa24dae81bcc15850ebecfda7b40838", - "reference": "b59385bb7aa24dae81bcc15850ebecfda7b40838", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "php": "^8.0", - "spatie/backtrace": "^1.7.1", - "spatie/error-solutions": "^1.1.2", - "spatie/flare-client-php": "^1.9", - "symfony/console": "^5.4.42|^6.0|^7.0|^8.0", - "symfony/http-foundation": "^5.4.42|^6.0|^7.0|^8.0", - "symfony/mime": "^5.4.42|^6.0|^7.0|^8.0", - "symfony/var-dumper": "^5.4.42|^6.0|^7.0|^8.0" - }, - "require-dev": { - "illuminate/cache": "^9.52|^10.0|^11.0|^12.0|^13.0", - "mockery/mockery": "^1.4", - "pestphp/pest": "^1.20|^2.0|^3.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "psr/simple-cache-implementation": "*", - "symfony/cache": "^5.4.38|^6.0|^7.0|^8.0", - "symfony/process": "^5.4.35|^6.0|^7.0|^8.0", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "simple-cache-implementation": "To cache solutions from OpenAI" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.5.x-dev" - } - }, - "autoload": { - "psr-4": { - "Spatie\\Ignition\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Spatie", - "email": "info@spatie.be", - "role": "Developer" - } - ], - "description": "A beautiful error page for PHP applications.", - "homepage": "https://flareapp.io/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/spatie/ignition/issues", - "source": "https://github.com/spatie/ignition" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2026-03-17T10:51:08+00:00" - }, { "name": "spatie/laravel-csp", "version": "3.26.0", @@ -4691,122 +4492,34 @@ "require": { "illuminate/contracts": "^11.0|^12.0|^13.0", "illuminate/encryption": "^11.0|^12.0|^13.0", - "illuminate/http": "^11.0|^12.0|^13.0", - "illuminate/support": "^11.0|^12.0|^13.0", - "illuminate/validation": "^11.0|^12.0|^13.0", - "nesbot/carbon": "^2.0|^3.0", - "php": "^8.2", - "spatie/laravel-package-tools": "^1.9", - "symfony/http-foundation": "^7.0|^8.0" - }, - "require-dev": { - "livewire/livewire": "^3.0|^4.0", - "orchestra/testbench": "^9.0|^10.0|^11.0", - "pestphp/pest": "^2.0|^3.0|^4.0", - "pestphp/pest-plugin-livewire": "^1.0|^2.1|^3.0|^4.0", - "spatie/pest-plugin-snapshots": "^1.1|^2.1", - "spatie/phpunit-snapshot-assertions": "^4.2|^5.1", - "spatie/test-time": "^1.2.1" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\Honeypot\\HoneypotServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Spatie\\Honeypot\\": "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": "Preventing spam submitted through forms", - "homepage": "https://github.com/spatie/laravel-honeypot", - "keywords": [ - "laravel-honeypot", - "spatie" - ], - "support": { - "source": "https://github.com/spatie/laravel-honeypot/tree/4.7.2" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - } - ], - "time": "2026-06-25T15:09:40+00:00" - }, - { - "name": "spatie/laravel-ignition", - "version": "2.12.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "45b3b6e1e73fc161cba2149972698644b99594ee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/45b3b6e1e73fc161cba2149972698644b99594ee", - "reference": "45b3b6e1e73fc161cba2149972698644b99594ee", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", + "illuminate/http": "^11.0|^12.0|^13.0", "illuminate/support": "^11.0|^12.0|^13.0", - "nesbot/carbon": "^2.72|^3.0", + "illuminate/validation": "^11.0|^12.0|^13.0", + "nesbot/carbon": "^2.0|^3.0", "php": "^8.2", - "spatie/ignition": "^1.16", - "symfony/console": "^7.4|^8.0", - "symfony/var-dumper": "^7.4|^8.0" + "spatie/laravel-package-tools": "^1.9", + "symfony/http-foundation": "^7.0|^8.0" }, "require-dev": { - "livewire/livewire": "^3.7.0|^4.0|dev-josh/v3-laravel-13-support", - "mockery/mockery": "^1.6.12", - "openai-php/client": "^0.10.3|^0.19", - "orchestra/testbench": "^v9.16.0|^10.6|^11.0", - "pestphp/pest": "^3.7|^4.0", - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan-deprecation-rules": "^2.0.3", - "phpstan/phpstan-phpunit": "^2.0.8", - "vlucas/phpdotenv": "^5.6.2" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + "livewire/livewire": "^3.0|^4.0", + "orchestra/testbench": "^9.0|^10.0|^11.0", + "pestphp/pest": "^2.0|^3.0|^4.0", + "pestphp/pest-plugin-livewire": "^1.0|^2.1|^3.0|^4.0", + "spatie/pest-plugin-snapshots": "^1.1|^2.1", + "spatie/phpunit-snapshot-assertions": "^4.2|^5.1", + "spatie/test-time": "^1.2.1" }, "type": "library", "extra": { "laravel": { - "aliases": { - "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" - }, "providers": [ - "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + "Spatie\\Honeypot\\HoneypotServiceProvider" ] } }, "autoload": { - "files": [ - "src/helpers.php" - ], "psr-4": { - "Spatie\\LaravelIgnition\\": "src" + "Spatie\\Honeypot\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -4815,32 +4528,28 @@ ], "authors": [ { - "name": "Spatie", - "email": "info@spatie.be", + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", "role": "Developer" } ], - "description": "A beautiful error page for Laravel applications.", - "homepage": "https://flareapp.io/ignition", + "description": "Preventing spam submitted through forms", + "homepage": "https://github.com/spatie/laravel-honeypot", "keywords": [ - "error", - "flare", - "laravel", - "page" + "laravel-honeypot", + "spatie" ], "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/spatie/laravel-ignition/issues", - "source": "https://github.com/spatie/laravel-ignition" + "source": "https://github.com/spatie/laravel-honeypot/tree/4.7.2" }, "funding": [ { - "url": "https://github.com/spatie", - "type": "github" + "url": "https://spatie.be/open-source/support-us", + "type": "custom" } ], - "time": "2026-03-17T12:20:04+00:00" + "time": "2026-06-25T15:09:40+00:00" }, { "name": "spatie/laravel-package-tools", @@ -8423,6 +8132,82 @@ ], "time": "2026-06-09T10:54:51+00:00" }, + { + "name": "symfony/yaml", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "8e4cdd4311683516be06944f4b85244063cdb886" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/8e4cdd4311683516be06944f4b85244063cdb886", + "reference": "8e4cdd4311683516be06944f4b85244063cdb886", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<7.4" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "yaml/yaml-test-suite": "*" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v8.1.1" + }, + "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-06-09T11:06:24+00:00" + }, { "name": "tijsverkoyen/css-to-inline-styles", "version": "v2.4.0", @@ -12333,6 +12118,70 @@ ], "time": "2025-02-07T05:00:38+00:00" }, + { + "name": "spatie/backtrace", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "8ffe78be5ed355b5009e3dd989d183433e9a5adc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/8ffe78be5ed355b5009e3dd989d183433e9a5adc", + "reference": "8ffe78be5ed355b5009e3dd989d183433e9a5adc", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "ext-json": "*", + "laravel/serializable-closure": "^1.3 || ^2.0", + "phpunit/phpunit": "^9.3 || ^11.4.3", + "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1.6", + "symfony/var-dumper": "^5.1|^6.0|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/backtrace/issues", + "source": "https://github.com/spatie/backtrace/tree/1.8.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2026-03-11T13:48:28+00:00" + }, { "name": "spatie/laravel-ray", "version": "1.43.9", @@ -12760,82 +12609,6 @@ ], "time": "2026-05-29T05:06:50+00:00" }, - { - "name": "symfony/yaml", - "version": "v8.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "8e4cdd4311683516be06944f4b85244063cdb886" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/8e4cdd4311683516be06944f4b85244063cdb886", - "reference": "8e4cdd4311683516be06944f4b85244063cdb886", - "shasum": "" - }, - "require": { - "php": ">=8.4.1", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<7.4" - }, - "require-dev": { - "symfony/console": "^7.4|^8.0", - "yaml/yaml-test-suite": "*" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v8.1.1" - }, - "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-06-09T11:06:24+00:00" - }, { "name": "ta-tikoma/phpunit-architecture-test", "version": "0.8.7", diff --git a/config/flare.php b/config/flare.php deleted file mode 100644 index 7a2c45f..0000000 --- a/config/flare.php +++ /dev/null @@ -1,91 +0,0 @@ - env('FLARE_KEY'), - - /* - |-------------------------------------------------------------------------- - | Middleware - |-------------------------------------------------------------------------- - | - | These middleware will modify the contents of the report sent to Flare. - | - */ - - 'flare_middleware' => [ - RemoveRequestIp::class, - AddGitInformation::class, - AddNotifierName::class, - AddEnvironmentInformation::class, - AddExceptionInformation::class, - AddDumps::class, - AddLogs::class => [ - 'maximum_number_of_collected_logs' => 200, - ], - AddQueries::class => [ - 'maximum_number_of_collected_queries' => 200, - 'report_query_bindings' => true, - ], - AddJobs::class => [ - 'max_chained_job_reporting_depth' => 5, - ], - AddContext::class, - AddExceptionHandledStatus::class, - CensorRequestBodyFields::class => [ - 'censor_fields' => [ - 'password', - 'password_confirmation', - ], - ], - CensorRequestHeaders::class => [ - 'headers' => [ - 'API-KEY', - 'Authorization', - 'Cookie', - 'Set-Cookie', - 'X-CSRF-TOKEN', - 'X-XSRF-TOKEN', - ], - ], - ], - - /* - |-------------------------------------------------------------------------- - | Reporting log statements - |-------------------------------------------------------------------------- - | - | If this setting is `false` log statements won't be sent as events to Flare, - | no matter which error level you specified in the Flare log channel. - | - */ - - 'send_logs_as_events' => true, -]; diff --git a/config/logging.php b/config/logging.php index cb8efc9..a6bb75e 100644 --- a/config/logging.php +++ b/config/logging.php @@ -13,8 +13,11 @@ |-------------------------------------------------------------------------- | | Every channel not listed here falls back to Laravel's internal default - | config (vendor/laravel/framework/config/logging.php). "flare" is added - | for spatie/laravel-ignition, which isn't a Laravel default channel. + | config (vendor/laravel/framework/config/logging.php). + | + | Error reporting goes to Laravel Nightwatch, which hooks the exception + | handler directly rather than through a log channel — so there is no + | reporting channel to add to LOG_STACK. | */ @@ -31,10 +34,6 @@ 'processors' => [PsrLogMessageProcessor::class], ], - 'flare' => [ - 'driver' => 'flare', - ], - ], ]; diff --git a/routes/console.php b/routes/console.php index 421eacc..159bd89 100644 --- a/routes/console.php +++ b/routes/console.php @@ -4,10 +4,5 @@ use Illuminate\Support\Facades\Schedule; -// A full sync window is dispatched per run; without the guard a slow LiteLLM -// response lets the next hour's run pile a second set of jobs on top. Schedule::command('llm:fetch-analytics')->hourly()->withoutOverlapping(); - -// The opening-hours box renders "open now / closed" from the current time, so the -// rendered HTML goes stale on its own — no model change fires an observer for it. Schedule::command('responsecache:clear')->hourly(); diff --git a/routes/web.php b/routes/web.php index b78249f..64d8cf9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -58,7 +58,6 @@ Route::get('technologies', TechnologiesIndexController::class)->name('technologies.index'); Route::get('technologies/{locale}/{technology}', TechnologiesShowController::class)->name('technologies.show'); - // Not yet linked in navigation — built but inactive, same as Technologies above. Route::get('co-working', CoWorkingIndexController::class)->name('co-working.index'); Route::get('open-source-contributions', OpenSourceIndexController::class)->name('open-source.index'); @@ -101,10 +100,6 @@ Route::get('technologien', TechnologiesIndexController::class)->name('technologies.index'); Route::get('technologien/{locale}/{technology}', TechnologiesShowController::class)->name('technologies.show'); - // Not yet linked in navigation — built but inactive, same as Technologies above. - // The slug is German like every other route in this group: sharing "co-working" - // with the English group would let one registration shadow the other, and the - // locale is resolved from the matched route's name. Route::get('arbeitsplaetze', CoWorkingIndexController::class)->name('co-working.index'); Route::get('open-source-beitraege', OpenSourceIndexController::class)->name('open-source.index'); diff --git a/tests/Feature/News/ImportNewsCommandTest.php b/tests/Feature/News/ImportNewsCommandTest.php index 0f6a2c7..126ed5b 100644 --- a/tests/Feature/News/ImportNewsCommandTest.php +++ b/tests/Feature/News/ImportNewsCommandTest.php @@ -7,40 +7,14 @@ use App\Models\NewsSeries; use App\Models\NewsTag; use Illuminate\Support\Facades\File; - -/** - * Keeps track of the throwaway directories a test wrote to, so afterEach can - * remove them without leaning on undeclared $this properties. - */ -class ImportTempDirectories -{ - /** @var array */ - private static array $paths = []; - - public static function next(): string - { - $path = sys_get_temp_dir().'/news-import-'.bin2hex(random_bytes(4)); - self::$paths[] = $path; - - return $path; - } - - public static function cleanUp(): void - { - foreach (self::$paths as $path) { - File::deleteDirectory($path); - } - - self::$paths = []; - } -} +use Tests\Support\TempDirectories; /** * @param array $files locale => file contents */ function writeArticles(array $files): string { - $base = ImportTempDirectories::next(); + $base = TempDirectories::next('news-import'); foreach ($files as $locale => $contents) { File::ensureDirectoryExists($base.'/'.$locale); @@ -70,7 +44,7 @@ function articleFile(string $title, string $slug, string $extra = ''): string } afterEach(function () { - ImportTempDirectories::cleanUp(); + TempDirectories::cleanUp(); }); it('imports an article that exists in both languages', function () { diff --git a/tests/Feature/Services/ImportServicesCommandTest.php b/tests/Feature/Services/ImportServicesCommandTest.php index 6bef034..3b23edd 100644 --- a/tests/Feature/Services/ImportServicesCommandTest.php +++ b/tests/Feature/Services/ImportServicesCommandTest.php @@ -4,40 +4,14 @@ use App\Models\Service; use Illuminate\Support\Facades\File; - -/** - * Keeps track of the throwaway directories a test wrote to, so afterEach can - * remove them without leaning on undeclared $this properties. - */ -class ServiceTempDirectories -{ - /** @var array */ - private static array $paths = []; - - public static function next(): string - { - $path = sys_get_temp_dir().'/services-import-'.bin2hex(random_bytes(4)); - self::$paths[] = $path; - - return $path; - } - - public static function cleanUp(): void - { - foreach (self::$paths as $path) { - File::deleteDirectory($path); - } - - self::$paths = []; - } -} +use Tests\Support\TempDirectories; /** * @param array $files locale => file contents */ function writeServiceFiles(string $key, array $files): string { - $base = ServiceTempDirectories::next(); + $base = TempDirectories::next('services-import'); foreach ($files as $locale => $contents) { File::ensureDirectoryExists($base.'/'.$locale); @@ -64,7 +38,7 @@ function serviceFile(string $key, string $name, string $extra = ''): string } afterEach(function () { - ServiceTempDirectories::cleanUp(); + TempDirectories::cleanUp(); }); it('imports a service that exists in both languages', function () { diff --git a/tests/Feature/Team/ImportTeamCommandTest.php b/tests/Feature/Team/ImportTeamCommandTest.php index 488c7a0..7ecff50 100644 --- a/tests/Feature/Team/ImportTeamCommandTest.php +++ b/tests/Feature/Team/ImportTeamCommandTest.php @@ -4,42 +4,16 @@ use App\Models\Contact; use Illuminate\Support\Facades\File; +use Tests\Support\TempDirectories; use function Pest\Laravel\get; -/** - * Keeps track of the throwaway directories a test wrote to, so afterEach can - * remove them without leaning on undeclared $this properties. - */ -class TeamTempDirectories -{ - /** @var array */ - private static array $paths = []; - - public static function next(): string - { - $path = sys_get_temp_dir().'/team-import-'.bin2hex(random_bytes(4)); - self::$paths[] = $path; - - return $path; - } - - public static function cleanUp(): void - { - foreach (self::$paths as $path) { - File::deleteDirectory($path); - } - - self::$paths = []; - } -} - /** * @param array $files filename => yaml */ function writeTeamFiles(array $files): string { - $base = TeamTempDirectories::next(); + $base = TempDirectories::next('team-import'); File::ensureDirectoryExists($base); foreach ($files as $name => $contents) { @@ -71,7 +45,7 @@ function personYaml(string $key, string $name, bool $published = true, int $sort } afterEach(function () { - TeamTempDirectories::cleanUp(); + TempDirectories::cleanUp(); }); it('imports a person from a yaml file', function () { diff --git a/tests/Support/TempDirectories.php b/tests/Support/TempDirectories.php new file mode 100644 index 0000000..407d4e7 --- /dev/null +++ b/tests/Support/TempDirectories.php @@ -0,0 +1,38 @@ + */ + private static array $paths = []; + + public static function next(string $prefix): string + { + $path = sys_get_temp_dir().'/'.$prefix.'-'.bin2hex(random_bytes(4)); + self::$paths[] = $path; + + return $path; + } + + public static function cleanUp(): void + { + foreach (self::$paths as $path) { + File::deleteDirectory($path); + } + + self::$paths = []; + } +}