diff --git a/.github/workflows/maze-runner-tests.yml b/.github/workflows/maze-runner-tests.yml index 0ff399f1..cd664605 100644 --- a/.github/workflows/maze-runner-tests.yml +++ b/.github/workflows/maze-runner-tests.yml @@ -25,6 +25,8 @@ jobs: laravel-fixture: laravel8 - php-version: '8.1' laravel-fixture: laravel9 + - php-version: '8.2' + laravel-fixture: laravel10 - php-version: '8.0' laravel-fixture: lumen8 diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 051dcc81..f4f8aee1 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -106,6 +106,10 @@ jobs: laravel-version: '9.*' - php-version: '8.2' laravel-version: '9.*' + - php-version: '8.1' + laravel-version: '10.*' + - php-version: '8.2' + laravel-version: '10.*' steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/unstable-version-tests.yml b/.github/workflows/unstable-version-tests.yml index 48193be7..a76f9d25 100644 --- a/.github/workflows/unstable-version-tests.yml +++ b/.github/workflows/unstable-version-tests.yml @@ -11,7 +11,7 @@ jobs: fail-fast: false matrix: php-version: ['8.2'] - laravel-version: ['9.x-dev', 'dev-master as 9'] + laravel-version: ['10.x-dev as 10', 'dev-master as 10'] steps: - uses: actions/checkout@v2 @@ -39,7 +39,7 @@ jobs: matrix: php-version: ['8.2'] laravel-fixture: [laravel-latest] - laravel-version: ['9.x-dev'] #, 'dev-master as 9'] # disabled pending package updates in Laravel's skeleton app (PLAT-7040) + laravel-version: ['10.x-dev as 10', 'dev-master as 10'] steps: - uses: actions/checkout@v2 @@ -53,7 +53,7 @@ jobs: - name: install Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: '3.1' + ruby-version: '3.2' bundler-cache: true - name: install PHP @@ -62,7 +62,7 @@ jobs: php-version: ${{ matrix.php-version }} coverage: none - - run: ./.ci/setup-laravel-dev-fixture.sh ${{ matrix.laravel-version }} + - run: ./.ci/setup-laravel-dev-fixture.sh "${{ matrix.laravel-version }}" - run: bundle exec maze-runner --no-source env: diff --git a/CHANGELOG.md b/CHANGELOG.md index 809122ed..0c7d632d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Changelog ========= +## v2.26.0 (2023-02-16) + +### Enhancements + +* Allow installation on Laravel 10 projects + [rubenvanerk](https://github.com/rubenvanerk) + [#518](https://github.com/bugsnag/bugsnag-laravel/pull/518) + ## v2.25.1 (2023-01-17) ### Enhancements diff --git a/Gemfile b/Gemfile index 23e2e699..43ca22ec 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,3 @@ source 'https://rubygems.org' -gem 'bugsnag-maze-runner', git: 'https://github.com/bugsnag/maze-runner', tag: 'v7.9.0' +gem 'bugsnag-maze-runner', git: 'https://github.com/bugsnag/maze-runner', tag: 'v7.18.0' diff --git a/composer.json b/composer.json index dac20e38..af3f4f71 100644 --- a/composer.json +++ b/composer.json @@ -14,12 +14,12 @@ "php": ">=5.5", "bugsnag/bugsnag": "^3.29.0", "bugsnag/bugsnag-psr-logger": "^1.4|^2.0", - "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0", + "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", "monolog/monolog": "^1.12|^2.0|^3.0" }, "require-dev": { - "orchestra/testbench": "^3.1|^4.0|^5.0|^6.0|^7.0", + "orchestra/testbench": "^3.1|^4.0|^5.0|^6.0|^7.0|^8.0", "phpunit/phpunit": "^4.8.36|^6.3.1|^7.5.15|^8.3.5|^9.3.10" }, "autoload": { diff --git a/features/fixtures/docker-compose.yml b/features/fixtures/docker-compose.yml index 03a4acf9..1cf184ed 100644 --- a/features/fixtures/docker-compose.yml +++ b/features/fixtures/docker-compose.yml @@ -121,6 +121,26 @@ services: - target: 8000 published: 61290 + laravel10: + build: + context: laravel10 + args: + - PHP_VERSION + environment: + - BUGSNAG_API_KEY + - BUGSNAG_ENDPOINT + - BUGSNAG_SESSION_ENDPOINT + - BUGSNAG_CAPTURE_SESSIONS + - BUGSNAG_USE_CUSTOM_GUZZLE + - BUGSNAG_REGISTER_OOM_BOOTSTRAPPER + - BUGSNAG_DISCARD_CLASSES + - BUGSNAG_REDACTED_KEYS + - BUGSNAG_QUERY + restart: "no" + ports: + - target: 8000 + published: 61310 + laravel-latest: build: context: laravel-latest diff --git a/features/fixtures/laravel10/.env.example b/features/fixtures/laravel10/.env.example new file mode 100644 index 00000000..3c107d72 --- /dev/null +++ b/features/fixtures/laravel10/.env.example @@ -0,0 +1,53 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=sqlite + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailpit +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_HOST= +PUSHER_PORT=443 +PUSHER_SCHEME=https +PUSHER_APP_CLUSTER=mt1 + +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_HOST="${PUSHER_HOST}" +VITE_PUSHER_PORT="${PUSHER_PORT}" +VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/features/fixtures/laravel10/.gitignore b/features/fixtures/laravel10/.gitignore new file mode 100644 index 00000000..e6bbd7ae --- /dev/null +++ b/features/fixtures/laravel10/.gitignore @@ -0,0 +1,18 @@ +/.phpunit.cache +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/vendor +.env +.env.backup +.env.production +Homestead.json +Homestead.yaml +auth.json +npm-debug.log +yarn-error.log +/.fleet +/.idea +/.vscode diff --git a/features/fixtures/laravel10/Dockerfile b/features/fixtures/laravel10/Dockerfile new file mode 100644 index 00000000..8683592e --- /dev/null +++ b/features/fixtures/laravel10/Dockerfile @@ -0,0 +1,23 @@ +ARG PHP_VERSION +FROM php:$PHP_VERSION + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + git \ + unzip \ + wget \ + zip + +WORKDIR /app + +COPY . . +COPY --from=composer:2.2 /usr/bin/composer /usr/local/bin/composer + +RUN cp .env.example .env +RUN composer install --no-dev +RUN php artisan key:generate + +# create database & apply migrations +RUN touch database/database.sqlite && php artisan migrate --no-interaction + +CMD php -S 0.0.0.0:8000 -t public diff --git a/features/fixtures/laravel10/app/Console/Kernel.php b/features/fixtures/laravel10/app/Console/Kernel.php new file mode 100644 index 00000000..e6b9960e --- /dev/null +++ b/features/fixtures/laravel10/app/Console/Kernel.php @@ -0,0 +1,27 @@ +command('inspire')->hourly(); + } + + /** + * Register the commands for the application. + */ + protected function commands(): void + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/features/fixtures/laravel10/app/Exceptions/Handler.php b/features/fixtures/laravel10/app/Exceptions/Handler.php new file mode 100644 index 00000000..b1c262c6 --- /dev/null +++ b/features/fixtures/laravel10/app/Exceptions/Handler.php @@ -0,0 +1,48 @@ +, \Psr\Log\LogLevel::*> + */ + protected $levels = [ + // + ]; + + /** + * A list of the exception types that are not reported. + * + * @var array> + */ + protected $dontReport = [ + // + ]; + + /** + * A list of the inputs that are never flashed to the session on validation exceptions. + * + * @var array + */ + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + */ + public function register(): void + { + $this->reportable(function (Throwable $e) { + // + }); + } +} diff --git a/features/fixtures/laravel10/app/Http/Controllers/Controller.php b/features/fixtures/laravel10/app/Http/Controllers/Controller.php new file mode 100644 index 00000000..77ec359a --- /dev/null +++ b/features/fixtures/laravel10/app/Http/Controllers/Controller.php @@ -0,0 +1,12 @@ + + */ + protected $middleware = [ + // \App\Http\Middleware\TrustHosts::class, + \App\Http\Middleware\TrustProxies::class, + \Illuminate\Http\Middleware\HandleCors::class, + \App\Http\Middleware\PreventRequestsDuringMaintenance::class, + \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, + \App\Http\Middleware\TrimStrings::class, + \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + ]; + + /** + * The application's route middleware groups. + * + * @var array> + */ + protected $middlewareGroups = [ + 'web' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's middleware aliases. + * + * Aliases may be used to conveniently assign middleware to routes and groups. + * + * @var array + */ + protected $middlewareAliases = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'signed' => \App\Http\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'unMidEx' => \App\Http\Middleware\UnhandledMiddlewareEx::class, + 'unMidErr' => \App\Http\Middleware\UnhandledMiddlewareErr::class, + 'hanMidEx' => \App\Http\Middleware\HandledMiddlewareEx::class, + 'hanMidErr' => \App\Http\Middleware\HandledMiddlewareErr::class, + ]; + + protected function bootstrappers() + { + if (!getenv('BUGSNAG_REGISTER_OOM_BOOTSTRAPPER')) { + return parent::bootstrappers(); + } + + return array_merge( + [\Bugsnag\BugsnagLaravel\OomBootstrapper::class], + parent::bootstrappers(), + ); + } +} diff --git a/features/fixtures/laravel10/app/Http/Middleware/Authenticate.php b/features/fixtures/laravel10/app/Http/Middleware/Authenticate.php new file mode 100644 index 00000000..d4ef6447 --- /dev/null +++ b/features/fixtures/laravel10/app/Http/Middleware/Authenticate.php @@ -0,0 +1,17 @@ +expectsJson() ? null : route('login'); + } +} diff --git a/features/fixtures/laravel10/app/Http/Middleware/EncryptCookies.php b/features/fixtures/laravel10/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 00000000..867695bd --- /dev/null +++ b/features/fixtures/laravel10/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/features/fixtures/laravel10/app/Http/Middleware/HandledMiddlewareErr.php b/features/fixtures/laravel10/app/Http/Middleware/HandledMiddlewareErr.php new file mode 100644 index 00000000..f10e6d56 --- /dev/null +++ b/features/fixtures/laravel10/app/Http/Middleware/HandledMiddlewareErr.php @@ -0,0 +1,15 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/features/fixtures/laravel10/app/Http/Middleware/RedirectIfAuthenticated.php b/features/fixtures/laravel10/app/Http/Middleware/RedirectIfAuthenticated.php new file mode 100644 index 00000000..afc78c4e --- /dev/null +++ b/features/fixtures/laravel10/app/Http/Middleware/RedirectIfAuthenticated.php @@ -0,0 +1,30 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/features/fixtures/laravel10/app/Http/Middleware/TrimStrings.php b/features/fixtures/laravel10/app/Http/Middleware/TrimStrings.php new file mode 100644 index 00000000..88cadcaa --- /dev/null +++ b/features/fixtures/laravel10/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ + + */ + protected $except = [ + 'current_password', + 'password', + 'password_confirmation', + ]; +} diff --git a/features/fixtures/laravel10/app/Http/Middleware/TrustHosts.php b/features/fixtures/laravel10/app/Http/Middleware/TrustHosts.php new file mode 100644 index 00000000..c9c58bdd --- /dev/null +++ b/features/fixtures/laravel10/app/Http/Middleware/TrustHosts.php @@ -0,0 +1,20 @@ + + */ + public function hosts(): array + { + return [ + $this->allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/features/fixtures/laravel10/app/Http/Middleware/TrustProxies.php b/features/fixtures/laravel10/app/Http/Middleware/TrustProxies.php new file mode 100644 index 00000000..3391630e --- /dev/null +++ b/features/fixtures/laravel10/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,28 @@ +|string|null + */ + protected $proxies; + + /** + * The headers that should be used to detect proxies. + * + * @var int + */ + protected $headers = + Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB; +} diff --git a/features/fixtures/laravel10/app/Http/Middleware/UnhandledMiddlewareErr.php b/features/fixtures/laravel10/app/Http/Middleware/UnhandledMiddlewareErr.php new file mode 100644 index 00000000..f28d7e87 --- /dev/null +++ b/features/fixtures/laravel10/app/Http/Middleware/UnhandledMiddlewareErr.php @@ -0,0 +1,14 @@ + + */ + protected $except = [ + // 'fbclid', + // 'utm_campaign', + // 'utm_content', + // 'utm_medium', + // 'utm_source', + // 'utm_term', + ]; +} diff --git a/features/fixtures/laravel10/app/Http/Middleware/VerifyCsrfToken.php b/features/fixtures/laravel10/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 00000000..9e865217 --- /dev/null +++ b/features/fixtures/laravel10/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/features/fixtures/laravel10/app/Jobs/HandledJob.php b/features/fixtures/laravel10/app/Jobs/HandledJob.php new file mode 100644 index 00000000..0ba9744f --- /dev/null +++ b/features/fixtures/laravel10/app/Jobs/HandledJob.php @@ -0,0 +1,29 @@ + + */ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var array + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'email_verified_at' => 'datetime', + ]; +} diff --git a/features/fixtures/laravel10/app/Providers/AppServiceProvider.php b/features/fixtures/laravel10/app/Providers/AppServiceProvider.php new file mode 100644 index 00000000..e3c00706 --- /dev/null +++ b/features/fixtures/laravel10/app/Providers/AppServiceProvider.php @@ -0,0 +1,36 @@ +app->singleton('bugsnag.guzzle', function ($app) { + $handler = \GuzzleHttp\HandlerStack::create(); + $handler->push(\GuzzleHttp\Middleware::mapRequest(function ($request) { + return $request->withHeader('X-Custom-Guzzle', 'yes'); + })); + + return new \GuzzleHttp\Client(['handler' => $handler]); + }); + } + + /** + * Bootstrap any application services. + */ + public function boot(): void + { + Bugsnag::leaveBreadcrumb(__METHOD__); + } +} diff --git a/features/fixtures/laravel10/app/Providers/AuthServiceProvider.php b/features/fixtures/laravel10/app/Providers/AuthServiceProvider.php new file mode 100644 index 00000000..5522aa2f --- /dev/null +++ b/features/fixtures/laravel10/app/Providers/AuthServiceProvider.php @@ -0,0 +1,28 @@ + + */ + protected $policies = [ + // 'App\Models\Model' => 'App\Policies\ModelPolicy', + ]; + + /** + * Register any authentication / authorization services. + */ + public function boot(): void + { + $this->registerPolicies(); + + // + } +} diff --git a/features/fixtures/laravel10/app/Providers/BroadcastServiceProvider.php b/features/fixtures/laravel10/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 00000000..2be04f5d --- /dev/null +++ b/features/fixtures/laravel10/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,19 @@ +> + */ + protected $listen = [ + Registered::class => [ + SendEmailVerificationNotification::class, + ], + ]; + + /** + * Register any events for your application. + */ + public function boot(): void + { + Queue::before(function (JobProcessing $event) { + Bugsnag::leaveBreadcrumb('before'); + }); + + Queue::after(function (JobProcessed $event) { + Bugsnag::leaveBreadcrumb('after'); + }); + + Queue::exceptionOccurred(function (JobExceptionOccurred $event) { + Bugsnag::leaveBreadcrumb('exceptionOccurred'); + }); + } + + /** + * Determine if events and listeners should be automatically discovered. + */ + public function shouldDiscoverEvents(): bool + { + return false; + } +} diff --git a/features/fixtures/laravel10/app/Providers/RouteServiceProvider.php b/features/fixtures/laravel10/app/Providers/RouteServiceProvider.php new file mode 100644 index 00000000..bc491099 --- /dev/null +++ b/features/fixtures/laravel10/app/Providers/RouteServiceProvider.php @@ -0,0 +1,48 @@ +configureRateLimiting(); + + $this->routes(function () { + Route::middleware('api') + ->prefix('api') + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->group(base_path('routes/web.php')); + }); + } + + /** + * Configure the rate limiters for the application. + */ + protected function configureRateLimiting(): void + { + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); + }); + } +} diff --git a/features/fixtures/laravel10/artisan b/features/fixtures/laravel10/artisan new file mode 100755 index 00000000..67a3329b --- /dev/null +++ b/features/fixtures/laravel10/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/features/fixtures/laravel10/bootstrap/app.php b/features/fixtures/laravel10/bootstrap/app.php new file mode 100644 index 00000000..037e17df --- /dev/null +++ b/features/fixtures/laravel10/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/features/fixtures/laravel10/bootstrap/cache/.gitignore b/features/fixtures/laravel10/bootstrap/cache/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/features/fixtures/laravel10/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/features/fixtures/laravel10/composer.json b/features/fixtures/laravel10/composer.json new file mode 100644 index 00000000..d4f2fc2e --- /dev/null +++ b/features/fixtures/laravel10/composer.json @@ -0,0 +1,78 @@ +{ + "name": "laravel/laravel", + "type": "project", + "description": "The Laravel Framework.", + "keywords": ["framework", "laravel"], + "license": "MIT", + "repositories": [ + { + "type": "path", + "url": "bugsnag-laravel", + "options": { + "symlink": false + } + } + ], + "require": { + "php": "^8.1", + "bugsnag/bugsnag-laravel": "dev-main as 99.99.99", + "guzzlehttp/guzzle": "^7.2", + "laravel/framework": "^10.0", + "laravel/sanctum": "^3.2", + "laravel/tinker": "^2.8" + }, + "require-dev": { + "fakerphp/faker": "^1.9.1", + "laravel/pint": "^1.0", + "laravel/sail": "^1.18", + "mockery/mockery": "^1.4.4", + "nunomaduro/collision": "^7.0", + "phpunit/phpunit": "^10.0", + "spatie/laravel-ignition": "^2.0" + }, + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-update-cmd": [ + "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + }, + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true + } + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/features/fixtures/laravel10/config/app.php b/features/fixtures/laravel10/config/app.php new file mode 100644 index 00000000..c3b50fed --- /dev/null +++ b/features/fixtures/laravel10/config/app.php @@ -0,0 +1,216 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + 'asset_url' => env('ASSET_URL', '/'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => 'file', + // 'store' => 'redis', + ], + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => [ + + /* + * Laravel Framework Service Providers... + */ + Illuminate\Auth\AuthServiceProvider::class, + Illuminate\Broadcasting\BroadcastServiceProvider::class, + Illuminate\Bus\BusServiceProvider::class, + Illuminate\Cache\CacheServiceProvider::class, + Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, + Illuminate\Cookie\CookieServiceProvider::class, + Illuminate\Database\DatabaseServiceProvider::class, + Illuminate\Encryption\EncryptionServiceProvider::class, + Illuminate\Filesystem\FilesystemServiceProvider::class, + Illuminate\Foundation\Providers\FoundationServiceProvider::class, + Illuminate\Hashing\HashServiceProvider::class, + Illuminate\Mail\MailServiceProvider::class, + Illuminate\Notifications\NotificationServiceProvider::class, + Illuminate\Pagination\PaginationServiceProvider::class, + Illuminate\Pipeline\PipelineServiceProvider::class, + Illuminate\Queue\QueueServiceProvider::class, + Illuminate\Redis\RedisServiceProvider::class, + Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, + Illuminate\Session\SessionServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Validation\ValidationServiceProvider::class, + Illuminate\View\ViewServiceProvider::class, + + /* + * Package Service Providers... + */ + Bugsnag\BugsnagLaravel\BugsnagServiceProvider::class, + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + + ], + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => Facade::defaultAliases()->merge([ + 'Bugsnag' => Bugsnag\BugsnagLaravel\Facades\Bugsnag::class, + ])->toArray(), + +]; diff --git a/features/fixtures/laravel10/config/auth.php b/features/fixtures/laravel10/config/auth.php new file mode 100644 index 00000000..cae00280 --- /dev/null +++ b/features/fixtures/laravel10/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expire time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_reset_tokens', + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/features/fixtures/laravel10/config/broadcasting.php b/features/fixtures/laravel10/config/broadcasting.php new file mode 100644 index 00000000..9e4d4aa4 --- /dev/null +++ b/features/fixtures/laravel10/config/broadcasting.php @@ -0,0 +1,70 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', + 'port' => env('PUSHER_PORT', 443), + 'scheme' => env('PUSHER_SCHEME', 'https'), + 'encrypted' => true, + 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', + ], + 'client_options' => [ + // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/features/fixtures/laravel10/config/cache.php b/features/fixtures/laravel10/config/cache.php new file mode 100644 index 00000000..33bb2954 --- /dev/null +++ b/features/fixtures/laravel10/config/cache.php @@ -0,0 +1,110 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + 'lock_connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, or DynamoDB cache + | stores there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + +]; diff --git a/features/fixtures/laravel10/config/cors.php b/features/fixtures/laravel10/config/cors.php new file mode 100644 index 00000000..8a39e6da --- /dev/null +++ b/features/fixtures/laravel10/config/cors.php @@ -0,0 +1,34 @@ + ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/features/fixtures/laravel10/config/database.php b/features/fixtures/laravel10/config/database.php new file mode 100644 index 00000000..137ad18c --- /dev/null +++ b/features/fixtures/laravel10/config/database.php @@ -0,0 +1,151 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/features/fixtures/laravel10/config/filesystems.php b/features/fixtures/laravel10/config/filesystems.php new file mode 100644 index 00000000..e9d9dbdb --- /dev/null +++ b/features/fixtures/laravel10/config/filesystems.php @@ -0,0 +1,76 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been set up for each driver as an example of the required values. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + 'throw' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/features/fixtures/laravel10/config/hashing.php b/features/fixtures/laravel10/config/hashing.php new file mode 100644 index 00000000..bcd3be4c --- /dev/null +++ b/features/fixtures/laravel10/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 65536, + 'threads' => 1, + 'time' => 4, + ], + +]; diff --git a/features/fixtures/laravel10/config/logging.php b/features/fixtures/laravel10/config/logging.php new file mode 100644 index 00000000..8ed79887 --- /dev/null +++ b/features/fixtures/laravel10/config/logging.php @@ -0,0 +1,126 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single', 'bugsnag'], + 'ignore_exceptions' => false, + ], + + 'bugsnag' => [ + 'driver' => 'bugsnag', + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + ], + +]; diff --git a/features/fixtures/laravel10/config/mail.php b/features/fixtures/laravel10/config/mail.php new file mode 100644 index 00000000..049052ff --- /dev/null +++ b/features/fixtures/laravel10/config/mail.php @@ -0,0 +1,124 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", + | "postmark", "log", "array", "failover" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN'), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/features/fixtures/laravel10/config/queue.php b/features/fixtures/laravel10/config/queue.php new file mode 100644 index 00000000..25ea5a81 --- /dev/null +++ b/features/fixtures/laravel10/config/queue.php @@ -0,0 +1,93 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/features/fixtures/laravel10/config/sanctum.php b/features/fixtures/laravel10/config/sanctum.php new file mode 100644 index 00000000..529cfdc9 --- /dev/null +++ b/features/fixtures/laravel10/config/sanctum.php @@ -0,0 +1,67 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort() + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. If this value is null, personal access tokens do + | not expire. This won't tweak the lifetime of first-party sessions. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + ], + +]; diff --git a/features/fixtures/laravel10/config/services.php b/features/fixtures/laravel10/config/services.php new file mode 100644 index 00000000..0ace530e --- /dev/null +++ b/features/fixtures/laravel10/config/services.php @@ -0,0 +1,34 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + 'scheme' => 'https', + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + +]; diff --git a/features/fixtures/laravel10/config/session.php b/features/fixtures/laravel10/config/session.php new file mode 100644 index 00000000..8fed97c0 --- /dev/null +++ b/features/fixtures/laravel10/config/session.php @@ -0,0 +1,201 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', + +]; diff --git a/features/fixtures/laravel10/config/view.php b/features/fixtures/laravel10/config/view.php new file mode 100644 index 00000000..22b8a18d --- /dev/null +++ b/features/fixtures/laravel10/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/features/fixtures/laravel10/database/.gitignore b/features/fixtures/laravel10/database/.gitignore new file mode 100644 index 00000000..9b19b93c --- /dev/null +++ b/features/fixtures/laravel10/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/features/fixtures/laravel10/database/factories/UserFactory.php b/features/fixtures/laravel10/database/factories/UserFactory.php new file mode 100644 index 00000000..d4e88356 --- /dev/null +++ b/features/fixtures/laravel10/database/factories/UserFactory.php @@ -0,0 +1,40 @@ + + */ +class UserFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + * + * @return $this + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/features/fixtures/laravel10/database/migrations/2014_10_12_000000_create_users_table.php b/features/fixtures/laravel10/database/migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 00000000..444fafb7 --- /dev/null +++ b/features/fixtures/laravel10/database/migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + } +}; diff --git a/features/fixtures/laravel10/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php b/features/fixtures/laravel10/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php new file mode 100644 index 00000000..81a7229b --- /dev/null +++ b/features/fixtures/laravel10/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php @@ -0,0 +1,28 @@ +string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('password_reset_tokens'); + } +}; diff --git a/features/fixtures/laravel10/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/features/fixtures/laravel10/database/migrations/2019_08_19_000000_create_failed_jobs_table.php new file mode 100644 index 00000000..249da817 --- /dev/null +++ b/features/fixtures/laravel10/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/features/fixtures/laravel10/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/features/fixtures/laravel10/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php new file mode 100644 index 00000000..e828ad81 --- /dev/null +++ b/features/fixtures/laravel10/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/features/fixtures/laravel10/database/migrations/2022_11_29_094559_create_jobs_table.php b/features/fixtures/laravel10/database/migrations/2022_11_29_094559_create_jobs_table.php new file mode 100644 index 00000000..a786a891 --- /dev/null +++ b/features/fixtures/laravel10/database/migrations/2022_11_29_094559_create_jobs_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('jobs'); + } +}; diff --git a/features/fixtures/laravel10/database/seeders/DatabaseSeeder.php b/features/fixtures/laravel10/database/seeders/DatabaseSeeder.php new file mode 100644 index 00000000..a9f4519f --- /dev/null +++ b/features/fixtures/laravel10/database/seeders/DatabaseSeeder.php @@ -0,0 +1,22 @@ +create(); + + // \App\Models\User::factory()->create([ + // 'name' => 'Test User', + // 'email' => 'test@example.com', + // ]); + } +} diff --git a/features/fixtures/laravel10/public/favicon.ico b/features/fixtures/laravel10/public/favicon.ico new file mode 100644 index 00000000..e69de29b diff --git a/features/fixtures/laravel10/public/index.php b/features/fixtures/laravel10/public/index.php new file mode 100644 index 00000000..1d69f3a2 --- /dev/null +++ b/features/fixtures/laravel10/public/index.php @@ -0,0 +1,55 @@ +make(Kernel::class); + +$response = $kernel->handle( + $request = Request::capture() +)->send(); + +$kernel->terminate($request, $response); diff --git a/features/fixtures/laravel10/public/robots.txt b/features/fixtures/laravel10/public/robots.txt new file mode 100644 index 00000000..eb053628 --- /dev/null +++ b/features/fixtures/laravel10/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/features/fixtures/laravel10/resources/views/handlederror.blade.php b/features/fixtures/laravel10/resources/views/handlederror.blade.php new file mode 100644 index 00000000..093b53f6 --- /dev/null +++ b/features/fixtures/laravel10/resources/views/handlederror.blade.php @@ -0,0 +1,12 @@ + + + + + + + Laravel + + + notifyError("Handled error", "This is a handled error") ?> + + diff --git a/features/fixtures/laravel10/resources/views/handledexception.blade.php b/features/fixtures/laravel10/resources/views/handledexception.blade.php new file mode 100644 index 00000000..7de6e66a --- /dev/null +++ b/features/fixtures/laravel10/resources/views/handledexception.blade.php @@ -0,0 +1,12 @@ + + + + + + + Laravel + + + notifyException(new Exception("Handled view exception")) ?> + + diff --git a/features/fixtures/laravel10/resources/views/unhandlederror.blade.php b/features/fixtures/laravel10/resources/views/unhandlederror.blade.php new file mode 100644 index 00000000..91bf125a --- /dev/null +++ b/features/fixtures/laravel10/resources/views/unhandlederror.blade.php @@ -0,0 +1,12 @@ + + + + + + + Laravel + + + + + diff --git a/features/fixtures/laravel10/resources/views/unhandledexception.blade.php b/features/fixtures/laravel10/resources/views/unhandledexception.blade.php new file mode 100644 index 00000000..c0ee78fc --- /dev/null +++ b/features/fixtures/laravel10/resources/views/unhandledexception.blade.php @@ -0,0 +1,12 @@ + + + + + + + Laravel + + + + + diff --git a/features/fixtures/laravel10/resources/views/welcome.blade.php b/features/fixtures/laravel10/resources/views/welcome.blade.php new file mode 100644 index 00000000..0ac02754 --- /dev/null +++ b/features/fixtures/laravel10/resources/views/welcome.blade.php @@ -0,0 +1,136 @@ + + + + + + + Laravel + + + + + + + + diff --git a/features/fixtures/laravel10/routes/api.php b/features/fixtures/laravel10/routes/api.php new file mode 100644 index 00000000..889937e1 --- /dev/null +++ b/features/fixtures/laravel10/routes/api.php @@ -0,0 +1,19 @@ +get('/user', function (Request $request) { + return $request->user(); +}); diff --git a/features/fixtures/laravel10/routes/channels.php b/features/fixtures/laravel10/routes/channels.php new file mode 100644 index 00000000..5d451e1f --- /dev/null +++ b/features/fixtures/laravel10/routes/channels.php @@ -0,0 +1,18 @@ +id === (int) $id; +}); diff --git a/features/fixtures/laravel10/routes/console.php b/features/fixtures/laravel10/routes/console.php new file mode 100644 index 00000000..e05f4c9a --- /dev/null +++ b/features/fixtures/laravel10/routes/console.php @@ -0,0 +1,19 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/features/fixtures/laravel10/routes/web.php b/features/fixtures/laravel10/routes/web.php new file mode 100644 index 00000000..b4db52be --- /dev/null +++ b/features/fixtures/laravel10/routes/web.php @@ -0,0 +1,101 @@ +middleware('unMidEx'); +Route::get('/unhandled_middleware_error', function () { +})->middleware('unMidErr'); +Route::get('/handled_middleware_exception', function () { +})->middleware('hanMidEx'); +Route::get('/handled_middleware_error', function () { +})->middleware('hanMidErr'); + +Route::view('/unhandled_view_exception', 'unhandledexception'); +Route::view('/unhandled_view_error', 'unhandlederror'); +Route::view('/handled_view_exception', 'handledexception'); +Route::view('/handled_view_error', 'handlederror'); + +Route::get('/queue/unhandled', function () { + \App\Jobs\UnhandledJob::dispatch(); +}); + +Route::get('/queue/handled', function () { + \App\Jobs\HandledJob::dispatch(); +}); + +/** + * Return some diagnostics if an OOM did not happen when it should have. + * + * @return string + */ +function noOomResponse() { + $limit = ini_get('memory_limit'); + $memory = var_export(memory_get_usage(), true); + $peak = var_export(memory_get_peak_usage(), true); + + return <<b = $a; + } + + return noOomResponse(); +}); diff --git a/features/fixtures/laravel10/storage/app/.gitignore b/features/fixtures/laravel10/storage/app/.gitignore new file mode 100644 index 00000000..8f4803c0 --- /dev/null +++ b/features/fixtures/laravel10/storage/app/.gitignore @@ -0,0 +1,3 @@ +* +!public/ +!.gitignore diff --git a/features/fixtures/laravel10/storage/app/public/.gitignore b/features/fixtures/laravel10/storage/app/public/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/features/fixtures/laravel10/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/features/fixtures/laravel10/storage/framework/.gitignore b/features/fixtures/laravel10/storage/framework/.gitignore new file mode 100644 index 00000000..05c4471f --- /dev/null +++ b/features/fixtures/laravel10/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/features/fixtures/laravel10/storage/framework/cache/.gitignore b/features/fixtures/laravel10/storage/framework/cache/.gitignore new file mode 100644 index 00000000..01e4a6cd --- /dev/null +++ b/features/fixtures/laravel10/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/features/fixtures/laravel10/storage/framework/cache/data/.gitignore b/features/fixtures/laravel10/storage/framework/cache/data/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/features/fixtures/laravel10/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/features/fixtures/laravel10/storage/framework/sessions/.gitignore b/features/fixtures/laravel10/storage/framework/sessions/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/features/fixtures/laravel10/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/features/fixtures/laravel10/storage/framework/testing/.gitignore b/features/fixtures/laravel10/storage/framework/testing/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/features/fixtures/laravel10/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/features/fixtures/laravel10/storage/framework/views/.gitignore b/features/fixtures/laravel10/storage/framework/views/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/features/fixtures/laravel10/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/features/fixtures/laravel10/storage/logs/.gitignore b/features/fixtures/laravel10/storage/logs/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/features/fixtures/laravel10/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/features/fixtures/laravel56/Dockerfile b/features/fixtures/laravel56/Dockerfile index 614a57a4..b5551f8c 100644 --- a/features/fixtures/laravel56/Dockerfile +++ b/features/fixtures/laravel56/Dockerfile @@ -13,7 +13,7 @@ WORKDIR /app COPY . . COPY --from=composer:2.2 /usr/bin/composer /usr/local/bin/composer -RUN composer install +RUN composer install --no-dev RUN php artisan key:generate # create database & apply migrations diff --git a/features/fixtures/laravel58/Dockerfile b/features/fixtures/laravel58/Dockerfile index 614a57a4..b5551f8c 100644 --- a/features/fixtures/laravel58/Dockerfile +++ b/features/fixtures/laravel58/Dockerfile @@ -13,7 +13,7 @@ WORKDIR /app COPY . . COPY --from=composer:2.2 /usr/bin/composer /usr/local/bin/composer -RUN composer install +RUN composer install --no-dev RUN php artisan key:generate # create database & apply migrations diff --git a/features/fixtures/laravel66/Dockerfile b/features/fixtures/laravel66/Dockerfile index 614a57a4..b5551f8c 100644 --- a/features/fixtures/laravel66/Dockerfile +++ b/features/fixtures/laravel66/Dockerfile @@ -13,7 +13,7 @@ WORKDIR /app COPY . . COPY --from=composer:2.2 /usr/bin/composer /usr/local/bin/composer -RUN composer install +RUN composer install --no-dev RUN php artisan key:generate # create database & apply migrations diff --git a/features/fixtures/laravel8/Dockerfile b/features/fixtures/laravel8/Dockerfile index 74e70b99..8683592e 100644 --- a/features/fixtures/laravel8/Dockerfile +++ b/features/fixtures/laravel8/Dockerfile @@ -14,7 +14,7 @@ COPY . . COPY --from=composer:2.2 /usr/bin/composer /usr/local/bin/composer RUN cp .env.example .env -RUN composer install +RUN composer install --no-dev RUN php artisan key:generate # create database & apply migrations diff --git a/features/fixtures/laravel9/Dockerfile b/features/fixtures/laravel9/Dockerfile index 74e70b99..8683592e 100644 --- a/features/fixtures/laravel9/Dockerfile +++ b/features/fixtures/laravel9/Dockerfile @@ -14,7 +14,7 @@ COPY . . COPY --from=composer:2.2 /usr/bin/composer /usr/local/bin/composer RUN cp .env.example .env -RUN composer install +RUN composer install --no-dev RUN php artisan key:generate # create database & apply migrations diff --git a/features/fixtures/lumen8/Dockerfile b/features/fixtures/lumen8/Dockerfile index 9c664dd3..47f1f4e7 100644 --- a/features/fixtures/lumen8/Dockerfile +++ b/features/fixtures/lumen8/Dockerfile @@ -13,6 +13,6 @@ WORKDIR /app COPY . . COPY --from=composer:2.2 /usr/bin/composer /usr/local/bin/composer -RUN composer install +RUN composer install --no-dev CMD php -S 0.0.0.0:8000 -t public diff --git a/features/lib/laravel.rb b/features/lib/laravel.rb index a9066191..3a19b318 100644 --- a/features/lib/laravel.rb +++ b/features/lib/laravel.rb @@ -87,7 +87,7 @@ def load_version_from_fixture # get and parse the composer.lock file from the fixture composer_lock = Tempfile.create("#{fixture}-composer.lock") do |file| # copy the composer lock file out of the fixture so we can read it - Maze::Docker.cp(fixture, source: "/app/composer.lock", destination: file.path) + Maze::Docker.copy_from_container(fixture, from: "/app/composer.lock", to: file.path) # 'file.read' won't reflect the changes made by docker cp, so we use # JSON.load_file to reload the file & parse it diff --git a/features/steps/laravel_steps.rb b/features/steps/laravel_steps.rb index f7bddfc6..e4c17654 100644 --- a/features/steps/laravel_steps.rb +++ b/features/steps/laravel_steps.rb @@ -14,27 +14,6 @@ } end -module Maze - class Docker - class << self - # TODO: remove when https://github.com/bugsnag/maze-runner/pull/425 is merged - def exec(service, command, detach: false) - flags = detach ? "--detach" : "" - - run_docker_compose_command("exec #{flags} #{service} #{command}") - end - - # TODO: contribute this back to Maze Runner - # probably need a nicer API, capable of doing a copy in either - # direction (right now this can only copy from the service to the - # local machine) - def cp(service, source:, destination:) - run_docker_compose_command("cp #{service}:#{source} #{destination}") - end - end - end -end - When("I start the laravel queue worker") do step("I start the laravel queue worker with --tries=1") end @@ -80,7 +59,7 @@ def cp(service, source:, destination:) step("the event '#{path}' starts with '#{Laravel.major_version}'") end - step("the event '#{path}' matches '^((\\d+\\.){2}\\d+|\\d\\.x-dev)$'") + step("the event '#{path}' matches '^((\\d+\\.){2}\\d+|\\d+\\.x-dev)$'") end Then("the session payload field {string} matches the current major Laravel version") do |path| @@ -92,7 +71,7 @@ def cp(service, source:, destination:) step("the session payload field '#{path}' starts with '#{Laravel.major_version}'") end - step("the session payload field '#{path}' matches the regex '^((\\d+\\.){2}\\d+|\\d\\.x-dev)$'") + step("the session payload field '#{path}' matches the regex '^((\\d+\\.){2}\\d+|\\d+\\.x-dev)$'") end Then("the event {string} matches the current major Lumen version") do |path| @@ -104,7 +83,7 @@ def cp(service, source:, destination:) step("the event '#{path}' starts with '#{Laravel.major_version}'") end - step("the event '#{path}' matches '^((\\d+\\.){2}\\d+|\\d\\.x-dev)$'") + step("the event '#{path}' matches '^((\\d+\\.){2}\\d+|\\d+\\.x-dev)$'") end Then("the session payload field {string} matches the current major Lumen version") do |path| @@ -116,27 +95,7 @@ def cp(service, source:, destination:) step("the session payload field '#{path}' starts with '#{Laravel.major_version}'") end - step("the session payload field '#{path}' matches the regex '^((\\d+\\.){2}\\d+|\\d\\.x-dev)$'") -end - -# TODO: remove when https://github.com/bugsnag/maze-runner/pull/433 is released -Then("the event has {int} breadcrumb(s)") do |expected| - breadcrumbs = Maze::Server.errors.current[:body]['events'].first['breadcrumbs'] - - Maze.check.equal( - expected, - breadcrumbs.length, - "Expected event to have '#{expected}' breadcrumbs, but got: #{breadcrumbs}" - ) -end - -Then("the event has no breadcrumbs") do - breadcrumbs = Maze::Server.errors.current[:body]['events'].first['breadcrumbs'] - - Maze.check.true( - breadcrumbs.nil? || breadcrumbs.empty?, - "Expected event not to have breadcrumbs, but got: #{breadcrumbs}" - ) + step("the session payload field '#{path}' matches the regex '^((\\d+\\.){2}\\d+|\\d+\\.x-dev)$'") end # conditionally run a step if the laravel version matches a specified version diff --git a/src/BugsnagServiceProvider.php b/src/BugsnagServiceProvider.php index 146fc37d..6e90c280 100644 --- a/src/BugsnagServiceProvider.php +++ b/src/BugsnagServiceProvider.php @@ -37,7 +37,7 @@ class BugsnagServiceProvider extends ServiceProvider * * @var string */ - const VERSION = '2.25.1'; + const VERSION = '2.26.0'; /** * Boot the service provider.